Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. #include <array>
  2. #include <stack>
  3.  
  4. struct Blargh {
  5.     int a;
  6.     int b;
  7.     int c;
  8. };
  9.  
  10. template <typename T>
  11. struct BizBizangType;
  12.  
  13. template <typename T>
  14. using biz_bizang_t = struct BizBizangType;
  15.  
  16. template <template <typename> class Derived, typename T>
  17. struct BizBizang
  18. {
  19.     virtual ~BizBizang() {}
  20.  
  21.     BizBizang(BizBizang&& other) noexcept
  22.     {
  23.         data_ptr_->~T();
  24.         data_ptr_ = other.data_ptr_;
  25.         other.data_ptr_->~T();
  26.         other.data_ptr_ = nullptr;
  27.     }
  28.  
  29.     BizBizang& operator=(BizBizang other)
  30.     {
  31.         swap(other);
  32.         return *this;
  33.     }
  34.    
  35.     operator T*() const
  36.     {
  37.         return data_ptr_;
  38.     }
  39.    
  40.     operator T*()
  41.     {
  42.         return data_ptr_;
  43.     }
  44.  
  45.     T& operator->() const
  46.     {
  47.         return data_ptr_;
  48.     }
  49.    
  50.     T& operator->()
  51.     {
  52.         return data_ptr_;
  53.     }
  54.  
  55. protected:
  56.     BizBizang() = default;
  57.  
  58.     BizBizang(const T& pod) :
  59.     data_ptr_(new (pod_buffer()) T(pod))
  60.     {}
  61.  
  62. private:
  63.      void swap(BizBizang& other)
  64.     {
  65.         std::swap(data_ptr_, other.data_ptr_);
  66.     }  
  67.  
  68.     static char* pod_buffer()
  69.     {
  70.         static auto buf = new char[sizeof(T)];  
  71.         return buf;
  72.     }
  73.  
  74.     T* data_ptr_ = nullptr;
  75. };
  76.  
  77. template <typename T>
  78. class BizBizangMaker
  79. {
  80. public:
  81.     BizBizangMaker() = delete;
  82.  
  83.     static biz_bizang_t<T>* MakeBizang(const T& pod,
  84.                                        std::stack<biz_bizang_t<T>*>&
  85.                                        event_ptr_stack)
  86.     {
  87.         static size_t index;
  88.         static std::array<biz_bizang_t<T>, 10> fart = init_from_f<10>();
  89.      
  90.         //fart[index] = biz_bizang_t<T>(pod);
  91.         //return &fart[index++];
  92.     }
  93.  
  94. private:
  95.     //std::stack<biz_bizang_t<T>*> stack;  
  96.  
  97.     template <size_t N>
  98.     static constexpr std::array<biz_bizang_t<T>, N> init_from_f() {
  99.     std::array<biz_bizang_t<T>, N> a;
  100.     for (size_t i = 0; i < N; ++i)
  101.         a[i] = BizBizangType<T>();
  102.     return a;
  103.     }
  104.  
  105. };
  106.  
  107. template <typename T>
  108. struct BizBizangType : public BizBizang<BizBizangMaker, T>
  109. {
  110.     BizBizangType() = default;
  111.     BizBizangType(const T& pod) : BizBizang<BizBizangMaker, T>(pod) {}
  112. };
  113.  
  114. int main()
  115. {
  116.     struct Blargh bar{1, 2, 3};
  117.     //auto shit = BizBizangMaker<Blargh>::MakeBizang(bar);
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement