framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
value.hpp
Go to the documentation of this file.
1 // Copyright (C) 2012 iwg molw5
2 // For conditions of distribution and use, see copyright notice in COPYING
3 
13 #pragma once
14 
15 #include <tuple>
16 
22 
23 namespace framework
24 {
25  namespace serializable
26  {
34  template <
35  typename Name,
36  typename Specification,
37  template <typename> class Implementation>
39  {
45  template <typename Derived>
46  struct parameters
47  {
51  using value_name = Name;
52 
57 
61  using value_specification = Specification;
62 
66  using derived = Derived;
67 
71  using implementation = Implementation <parameters <Derived>>;
72  };
73 
79  template <typename Derived>
80  using type = Implementation <parameters <Derived>>;
81  };
82 
91  template <typename T>
93  {
94  private:
98  using value_type = typename T::value_type;
99 
100  public:
104  value_type const& get () const
105  {
106  return p_tValue;
107  }
108 
112  void set (value_type value)
113  {
114  p_tValue = std::move(value);
115  }
116 
117  protected:
121  ~default_value () = default;
122 
127  : p_tValue()
128  {
129  }
130 
134  default_value (value_type value)
135  : p_tValue(std::move(value))
136  {
137  }
138 
145  default_value (std::tuple <>)
146  : default_value ()
147  {
148  }
149 
162  template <typename... Args>
163  default_value (std::tuple <Args...>&& args)
164  : default_value (
165  std::forward <std::tuple <Args...>> (args),
166  static_cast <make_indices <sizeof... (Args)>*> (nullptr))
167  {
168  }
169 
170  private:
171  template <typename... Args, typename... Indices>
172  default_value (std::tuple <Args...> args, pack_container <Indices...>*)
173  : p_tValue{std::forward <Args> (std::get <Indices::value> (args))...}
174  {
175  }
176 
177  protected:
181  value_type p_tValue;
182  };
183 
194  template <
195  typename Name,
196  typename Specification,
197  template <typename> class Implementation = default_value>
198  struct value : public value_type <
199  Name,
200  Specification,
201  value_implementation_wrapper <
202  Name,
203  Specification,
204  Implementation
205  >::template type>
206  {
207  };
208  }
209 }