libcvd
parameter.h
1 #ifndef CVD_INTERNAL_IO_PARAMETER_H
2 #define CVD_INTERNAL_IO_PARAMETER_H
3 
4 #include <map>
5 #include <memory>
6 #include <string>
7 #include <typeinfo>
8 
9 namespace CVD
10 {
11 
12 #ifndef DOXYGEN_IGNORE_INTERNAL
13 namespace Internal
14 {
15  class UntypedParameter;
16 }
17 template <class C = void>
18 class Parameter;
19 
20 template <>
21 class Parameter<Internal::UntypedParameter>
22 {
23  virtual const void* get_data_pointer() const = 0;
24 
25  public:
26  virtual ~Parameter() = default;
27  virtual Parameter* duplicate() const = 0;
28 };
29 #endif
30 
38 template <class C>
39 class Parameter : public Parameter<Internal::UntypedParameter>
40 {
41  private:
42  C parameter;
43 
44  public:
45  Parameter(const C& c)
46  : parameter(c)
47  {
48  }
49 
50  Parameter* duplicate() const
51  {
52  return new Parameter(*this);
53  }
54 
55  virtual const void* get_data_pointer() const
56  {
57  return &parameter;
58  }
59 };
60 
61 template <>
62 class Parameter<void>
63 {
64  private:
65  std::unique_ptr<Parameter<Internal::UntypedParameter>> param;
66 
67  public:
68  Parameter()
69  {
70  }
71 
72  Parameter(const Parameter& p)
73  {
74  if(p.param.get())
75  std::unique_ptr<Parameter<Internal::UntypedParameter>>(p.param->duplicate());
76  }
77 
78  template <class C>
79  Parameter(const Parameter<C>& p)
81  {
82  }
83 
84  template <class C>
85  Parameter& operator=(const Parameter<C>& p)
86  {
87  param = std::unique_ptr<Parameter<Internal::UntypedParameter>>(static_cast<Parameter<Internal::UntypedParameter>*>(new Parameter<C>(p)));
88  return *this;
89  }
90 
91  template <class C>
92  bool is() const
93  {
94  if(param.get() == 0)
95  return 0;
96 
97  const Parameter<C>* p = dynamic_cast<const Parameter<C>*>(param.get());
98  return p != 0;
99  }
100 
101  template <class C>
102  const C& get() const
103  {
104  if(param.get() == 0)
105  throw std::bad_cast();
106 
107  const Parameter<C>& p = dynamic_cast<const Parameter<C>&>(*param);
108  return *(const C*)p.get_data_pointer();
109  }
110 };
111 
112 }
113 #endif
All classes and functions are within the CVD namespace.
Definition: argb.h:6
Class for holding parameters for image savers, with type erasure.
Definition: parameter.h:18