ed
variant.h
Go to the documentation of this file.
1 #ifndef ED_VARIANT_H_
2 #define ED_VARIANT_H_
3 
4 // Directly taken from http://stackoverflow.com/questions/5319216/implementing-a-variant-class
5 
6 #include <boost/shared_ptr.hpp>
7 
8 #include <string>
9 
10 namespace ed
11 {
12 
13 template <typename T>
15 {
16  typedef T TYPE;
17  typedef const T CONSTTYPE;
18  typedef T& REFTYPE;
19  typedef const T& CONSTREFTYPE;
20 };
21 
22 template <typename T>
23 struct TypeWrapper<const T>
24 {
25  typedef T TYPE;
26  typedef const T CONSTTYPE;
27  typedef T& REFTYPE;
28  typedef const T& CONSTREFTYPE;
29 };
30 
31 template <typename T>
32 struct TypeWrapper<const T&>
33 {
34  typedef T TYPE;
35  typedef const T CONSTTYPE;
36  typedef T& REFTYPE;
37  typedef const T& CONSTREFTYPE;
38 };
39 
40 template <typename T>
41 struct TypeWrapper<T&>
42 {
43  typedef T TYPE;
44  typedef const T CONSTTYPE;
45  typedef T& REFTYPE;
46  typedef const T& CONSTREFTYPE;
47 };
48 
49 class Variant
50 {
51 public:
52  Variant() { }
53 
54  template<class T>
55  Variant(T inValue) :
56  mImpl(new VariantImpl<typename TypeWrapper<T>::TYPE>(inValue))
57  {
58  }
59 
60  template<class T>
62  {
63  return dynamic_cast<VariantImpl<typename TypeWrapper<T>::TYPE>&>(*mImpl.get()).mValue;
64  }
65 
66  template<class T>
68  {
69  return dynamic_cast<VariantImpl<typename TypeWrapper<T>::TYPE>&>(*mImpl.get()).mValue;
70  }
71 
72  template<class T>
73  void setValue(typename TypeWrapper<T>::CONSTREFTYPE inValue)
74  {
75  mImpl.reset(new VariantImpl<typename TypeWrapper<T>::TYPE>(inValue));
76  }
77 
78 private:
80  {
81  virtual ~AbstractVariantImpl() {}
82  };
83 
84  template<class T>
86  {
87  VariantImpl(T inValue) : mValue(inValue) { }
88 
90 
91  T mValue;
92  };
93 
94  boost::shared_ptr<AbstractVariantImpl> mImpl;
95 };
96 
97 } // end namespace
98 
99 #endif
std::string
ed::Variant::Variant
Variant(T inValue)
Definition: variant.h:55
ed::Variant::AbstractVariantImpl
Definition: variant.h:79
ed::Variant::setValue
void setValue(typename TypeWrapper< T >::CONSTREFTYPE inValue)
Definition: variant.h:73
ed::TypeWrapper< T & >::TYPE
T TYPE
Definition: variant.h:43
ed::Variant::AbstractVariantImpl::~AbstractVariantImpl
virtual ~AbstractVariantImpl()
Definition: variant.h:81
ed::TypeWrapper< T & >::CONSTTYPE
const typedef T CONSTTYPE
Definition: variant.h:44
ed::TypeWrapper::TYPE
T TYPE
Definition: variant.h:16
ed::Variant::getValue
TypeWrapper< T >::CONSTREFTYPE getValue() const
Definition: variant.h:67
ed::TypeWrapper< const T >::CONSTREFTYPE
const typedef T & CONSTREFTYPE
Definition: variant.h:28
ed::TypeWrapper< const T >::CONSTTYPE
const typedef T CONSTTYPE
Definition: variant.h:26
ed::Variant
Definition: variant.h:49
ed::TypeWrapper< T & >::CONSTREFTYPE
const typedef T & CONSTREFTYPE
Definition: variant.h:46
ed::Variant::VariantImpl::~VariantImpl
~VariantImpl()
Definition: variant.h:89
ed::TypeWrapper< const T >::REFTYPE
T & REFTYPE
Definition: variant.h:27
ed::TypeWrapper< const T & >::TYPE
T TYPE
Definition: variant.h:34
ed::TypeWrapper< T & >::REFTYPE
T & REFTYPE
Definition: variant.h:45
ed::TypeWrapper::CONSTREFTYPE
const typedef T & CONSTREFTYPE
Definition: variant.h:19
ed::TypeWrapper< const T & >::REFTYPE
T & REFTYPE
Definition: variant.h:36
ed::Variant::VariantImpl::VariantImpl
VariantImpl(T inValue)
Definition: variant.h:87
ed::TypeWrapper< const T & >::CONSTTYPE
const typedef T CONSTTYPE
Definition: variant.h:35
ed::Variant::getValue
TypeWrapper< T >::REFTYPE getValue()
Definition: variant.h:61
ed
Definition: convex_hull.h:8
ed::TypeWrapper::CONSTTYPE
const typedef T CONSTTYPE
Definition: variant.h:17
ed::TypeWrapper::REFTYPE
T & REFTYPE
Definition: variant.h:18
ed::TypeWrapper< const T >::TYPE
T TYPE
Definition: variant.h:25
ed::Variant::VariantImpl::mValue
T mValue
Definition: variant.h:91
ed::Variant::VariantImpl
Definition: variant.h:85
ed::TypeWrapper
Definition: variant.h:14
ed::Variant::mImpl
boost::shared_ptr< AbstractVariantImpl > mImpl
Definition: variant.h:94
ed::TypeWrapper< const T & >::CONSTREFTYPE
const typedef T & CONSTREFTYPE
Definition: variant.h:37
ed::Variant::Variant
Variant()
Definition: variant.h:52
string