framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
required.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 
17 
18 namespace framework
19 {
20  namespace protocol_buffers
21  {
29  template <typename T>
31  {
32  private:
33  using value_type = typename T::value_type;
34  using reference_type =
35  typename std::conditional <
36  std::is_scalar <value_type>::value,
37  value_type,
38  value_type const&
39  >::type;
40 
41  public:
42  default_required_value () = default;
43 
44  default_required_value (value_type value)
45  : p_tValue {std::move(value)}
46  {
47  }
48 
49  default_required_value (std::tuple <>)
51  {
52  }
53 
54  template <typename... Args>
55  default_required_value (std::tuple <Args...>&& args)
56  : default_required_value (
57  std::forward <std::tuple <Args...>> (args),
58  static_cast <make_indices <sizeof... (Args)>*> (nullptr))
59  {
60  }
61 
62  private:
63  template <typename... Args, typename... Indices>
64  default_required_value (std::tuple <Args...> args, pack_container <Indices...>*)
65  : p_tValue{std::forward <Args> (std::get <Indices::value> (args))...}
66  {
67  }
68 
69  public:
71  reference_type get () const
72  {
73  return p_tValue;
74  }
75 
77  void set (value_type value)
78  {
79  p_tValue = std::move(value);
80  }
81 
83  value_type& mutate ()
84  {
85  return p_tValue;
86  }
87 
88  protected:
89  ~default_required_value () = default;
90 
91  protected:
92  value_type p_tValue {};
93  };
94 
98  template <
99  typename Name,
100  uint32_t Number,
101  typename Specification,
102  template <typename> class Implementation = default_required_value>
103  struct required :
104  public field_base <
105  std::integral_constant <e_field_type, e_field_type::required>,
106  std::integral_constant <uint32_t, Number>>,
107  public serializable::value_type <Name, Specification,
108  protocol_buffer_implementation_wrapper <
109  Name,
110  std::integral_constant <uint32_t, Number>,
111  Specification,
112  Implementation
113  >::template type,
114  false>
115  {
116  };
117  }
118 }
119 
120 #include <framework/protocol_buffers/required.inl>