framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bit_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 
17 
18 namespace framework
19 {
20  namespace serializable
21  {
22  namespace detail
23  {
24  template <std::size_t N>
25  struct bit_value_default
26  {
27  using type =
28  typename std::conditional <
29  (N <= 8),
30  uint8_t,
31  typename std::conditional <
32  (N <= 16),
33  uint16_t,
34  typename std::conditional <
35  (N <= 32),
36  uint32_t,
37  typename std::enable_if <
38  (N <= 64),
39  uint64_t
40  >::type
41  >::type
42  >::type
43  >::type;
44  };
45  }
46 
59  template <std::size_t N, typename Value = typename detail::bit_value_default <N>::type>
60  struct bit_value : public mutator_type <Value>
61  {
62  };
63 
71  template <
72  std::size_t N,
73  typename Value,
74  typename Input,
75  typename Output>
78  Input& in, Output& out)
79  {
80  static_assert(std::is_same <type_extractor <Value>, Value>::value,
81  "bit_value does not support nested mutator types");
82 
83  Value result{0};
84  if (!in.template read_bits <N> (result))
85  return false;
86 
87  out = std::move(result);
88  return true;
89  }
90 
98  template <
99  std::size_t N,
100  typename Value,
101  typename Input,
102  typename Output>
105  Input const& in, Output& out)
106  {
107  static_assert(std::is_same <type_extractor <Value>, Value>::value,
108  "bit_value does not support nested mutator types");
109 
110  return out.template write_bits <N> (in);
111  }
112  }
113 }