00001
00002
00003 namespace dynamic
00004 {
00005 namespace internal
00006 {
00008
00012 template<typename Base, std::size_t Bytes>
00013 class DYNAMIC_API variant
00014 {
00015 union { cg::max_aligned m_aligned; char m_data[Bytes]; };
00016
00017 public:
00019 Base *get()
00020 {
00021 return reinterpret_cast<Base*>(m_data);
00022 }
00023
00025 const Base * get() const
00026 {
00027 return reinterpret_cast<const Base*>(m_data);
00028 }
00029
00031 Base * operator->()
00032 {
00033 return get();
00034 }
00035
00037 const Base * operator->() const
00038 {
00039 return get();
00040 }
00041
00043 Base & operator*()
00044 {
00045 return *get();
00046 }
00047
00049 const Base & operator*() const
00050 {
00051 return *get();
00052 }
00053
00055
00060 template<typename T>
00061 variant(const T & t)
00062 {
00063 cg::static_assert<sizeof(T) <= Bytes>();
00064 static_cast<const Base&>(t);
00065 t.copy_to(m_data);
00066 }
00067
00069 ~variant()
00070 {
00071 get()->~Base();
00072 }
00073
00075 variant(const variant & other)
00076 {
00077 other.get()->copy_to(get());
00078 }
00079
00081 variant & operator=(const variant & other)
00082 {
00083 if(this != &other)
00084 {
00085 get()->~Base();
00086 other.get()->copy_to(get());
00087 }
00088 return *this;
00089 }
00090
00092 template<typename T>
00093 variant & operator=(const T & other)
00094 {
00095 cg::static_assert<sizeof(T) <= Bytes>();
00096 static_cast<const Base&>(other);
00097 get()->~Base();
00098 other.copy_to(get());
00099 return *this;
00100 }
00101 };
00102
00103
00105 class DYNAMIC_API variant_base
00106 {
00107 public:
00108 virtual ~variant_base() { }
00109
00111 virtual void copy_to(void*) const=0;
00112 };
00113 }
00114
00117 typedef dynamic::internal::variant<var_impl, 16> var_variant;
00118 }