framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
value_type.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 
17 
18 namespace framework
19 {
20  namespace serializable
21  {
22  namespace detail
23  {
24  template <typename T, typename Enabler = void>
25  struct is_value_type_impl;
26 
27  template <typename T>
28  struct is_value_default_serializable_impl;
29 
30  template <typename T>
31  struct value_name_impl;
32 
33  template <typename T>
34  struct value_specification_impl;
35 
36  template <typename T, typename Derived>
37  struct value_implementation_impl;
38  }
39 
59  template <
60  typename Name,
61  typename Specification,
62  template <typename> class Interface,
63  bool Default = true>
64  struct value_type
65  {
66 // GCC bug workaround - www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#580
67 #if MAX_GNUC_VERSION(4, 8, 0)
68  public:
69 #else
70  template <typename T, typename Enabler>
71  friend struct detail::is_value_type_impl;
72 
73  template <typename T>
74  friend struct detail::is_value_default_serializable_impl;
75 
76  template <typename T>
77  friend struct detail::value_name_impl;
78 
79  template <typename T>
80  friend struct detail::value_specification_impl;
81 
82  template <typename T, typename Derived>
83  friend struct detail::value_implementation_impl;
84 
85  private:
86 #endif
87  using serializable_value_enabler = void;
88  using serializable_value_name = Name;
89  using serializable_value_specification = Specification;
90  enum{ serializable_value_default = Default };
91 
92  template <typename T>
93  using serializable_value_implementation = Interface <T>;
94 
95  value_type () = delete;
96  ~value_type () = delete;
97  };
98 
105  template <typename T>
106  using is_value_type = typename detail::is_value_type_impl <T>::type;
107 
114  template <typename T>
115  using is_value_default_serializable = typename detail::is_value_type_impl <T>::type;
116 
124  template <typename T>
125  using value_name = typename detail::value_name_impl <T>::type;
126 
134  template <typename T>
135  using value_specification = typename detail::value_specification_impl <T>::type;
136 
145  template <typename T, typename Derived>
146  using value_implementation = typename detail::value_implementation_impl <T, Derived>::type;
147 
161  template <
162  typename Name,
163  typename Specification,
164  template <typename> class Interface,
165  typename Input,
166  typename Output>
167  bool read_dispatch (
169  Input&& in, Output&& out);
170 
179  template <
180  typename Name,
181  typename Specification,
182  template <typename> class Interface,
183  typename Input,
184  typename Output>
185  bool write_dispatch (
187  Input&& in, Output&& out);
188  }
189 }
190 
191 #include <framework/serializable/value_type.inl>