framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
wire_type.hpp
Go to the documentation of this file.
1 // Copyright (C) 2013 iwg molw5
2 // For conditions of distribution and use, see copyright notice in COPYING
3 
13 #pragma once
14 
18 
21 
22 namespace framework
23 {
24  namespace protocol_buffers
25  {
26  namespace detail
27  {
28  template <typename T, typename Enabler = void>
29  struct is_wire_type_impl;
30 
31  template <typename T, typename Enabler = void>
32  struct wire_type_impl;
33 
34  template <typename T>
35  struct is_integer_type_impl;
36 
37  template <typename T>
38  struct make_wire_type_impl;
39  }
40 
44  enum class e_wire_type : uint8_t
45  {
46  varint = 0,
47  fixed_64 = 1,
48  length_delimited = 2,
49  start_group = 3,
50  end_group = 4,
51  fixed_32 = 5
52  };
53 
57  template <e_wire_type Type>
59  {
60 // GCC bug workaround - www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#580
61 #if MAX_GNUC_VERSION(4, 8, 0)
62  public:
63 #else
64  template <typename T, typename Enabler>
65  friend struct detail::is_wire_type_impl;
66 
67  template <typename T, typename Enabler>
68  friend struct detail::wire_type_impl;
69 
70  private:
71 #endif
72  using protocol_buffers_wire_enabler = void;
73  using protocol_buffers_wire_type = std::integral_constant <e_wire_type, Type>;
74  };
75 
79  template <e_wire_type Type, typename Specification>
81  wire_type_base <Type>,
82  Specification
83  {
84  };
85 
97  template <typename Specification>
98  struct length_delimited :
99  serializable::mutator_type <Specification>,
100  wire_type_base <e_wire_type::length_delimited>
101  {
102  };
103 
107  template <typename T>
108  using is_wire_type = typename detail::is_wire_type_impl <T>::type;
109 
116  template <typename T>
117  using is_integer_type = typename detail::is_integer_type_impl <T>::type;
118 
122  template <typename T>
123  using wire_type = typename detail::wire_type_impl <T>::type;
124 
128  template <typename T>
129  using make_wire_type = typename detail::make_wire_type_impl <T>::type;
130 
135 
140 
145 
150 
154  using bytes = string_;
155 
160 
165 
170 
175 
180 
185 
190 
195 
200 
205  }
206 }
207 
208 #include <framework/protocol_buffers/wire_type.inl>