fsm
access_context.h
Go to the documentation of this file.
1 
12 #pragma once
13 
14 #include <tuple>
15 
16 #include "../base/type_traits.h"
17 
18 namespace escad
19 {
20 
21 template<class C, class... D>
22 struct access_context final {
23  using access_context_type = mpl::type_list<C, D...>;
24 
25  template<
26  class T,
27  class = std::enable_if_t<T::template has<C> && (T::template has<D> && ...)>
28  >
29  access_context(T& tuple_like) noexcept
30  : ctx_ {tuple_like.template get<C>(), tuple_like.template get<D>()...}
31  {
32  }
33 
34  template<class T>
35  T& get_context() noexcept {
36  return std::get<T &>(ctx_);
37  }
38 
39  template<class T>
40  T const& get_context() const noexcept {
41  return std::get<T &>(ctx_);
42  }
43 
44 private:
45  std::tuple<C &, D &...> ctx_;
46 };
47 
51 template<class C>
52 struct access_context<C> final {
53  using access_context_type = C;
54 
55  access_context(C& c) noexcept
56  : ctx_ {c}
57  {
58  }
59 
60  template<
61  class U,
62  class = std::enable_if_t<U::template has<C>>
63  >
64  access_context(U& tuple_like) noexcept
65  : ctx_ {tuple_like.template get<C>()}
66  {}
67 
74  C& get_context() noexcept {
75  return ctx_;
76  }
77 
78  C const& get_context() const noexcept {
79  return ctx_;
80  }
81 
82 private:
83  C& ctx_;
84 };
85 
86 } // namespace fsm
Definition: access_context.h:22
C & get_context() noexcept
Retrieve a context.
Definition: access_context.h:74
Definition: compressed_pair.h:10
Alias template to facilitate the creation of named values.
Definition: type_traits.h:142