framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
inline_object.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 
18 
19 namespace framework
20 {
21  namespace serializable
22  {
57  template <typename... Types>
58  class inline_object :
59  public serializable <inline_object <Types...>, Types...>,
60  public comparable <inline_object <Types...>>
61  {
62  private:
63  DEFINE_BASE_TEMPLATE(inline_object <Types...>);
64 
65  public:
66  inline_object () = default;
67  inline_object (inline_object const&) = default;
68  inline_object (inline_object&&) = default;
69  inline_object& operator= (inline_object const&) = default;
70  inline_object& operator= (inline_object&&) = default;
71 
75  template <typename... Args>
76  inline_object (Args&&... args)
77  : serializable <inline_object <Types...>, Types...> (std::forward <Args> (args)...)
78  {
79  }
80 
84  inline_object (std::tuple <>)
85  : inline_object ()
86  {
87  }
88 
92  template <typename... Args>
93  inline_object (std::tuple <Args...>&& args)
94  : inline_object (
95  std::forward <std::tuple <Args...>> (args),
96  static_cast <make_indices <sizeof... (Args)>*> (nullptr))
97  {
98  }
99 
100  private:
101  template <typename... Args, typename... Indices>
102  inline_object (std::tuple <Args...> args, pack_container <Indices...>*)
103  : serializable <inline_object <Types...>, Types...> (std::forward <Args> (std::get <Indices::value> (args))...)
104  {
105  }
106 
107  public:
111  template <typename Name, typename... Args>
112  auto get (Args&&... args) const ->
113  decltype(std::declval <base <Name>> ().get(std::forward <Args> (args)...))
114  {
115  return base <Name>::get(std::forward <Args> (args)...);
116  }
117 
121  template <typename Name, typename... Args>
122  auto set (Args&&... args) ->
123  decltype(std::declval <base <Name>> ().set(std::forward <Args> (args)...))
124  {
125  return base <Name>::set(std::forward <Args> (args)...);
126  }
127 
131  template <typename Name, typename... Args>
132  auto check (Args&&... args) const ->
133  decltype(std::declval <base <Name>> ().check(std::forward <Args> (args)...))
134  {
135  return base <Name>::check(std::forward <Args> (args)...);
136  }
137 
141  template <typename Name, typename... Args>
142  auto clear (Args&&... args) ->
143  decltype(std::declval <base <Name>> ().clear(std::forward <Args> (args)...))
144  {
145  return base <Name>::clear(std::forward <Args> (args)...);
146  }
147  };
148  }
149 }