• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright Louis Dionne 2013-2017
2 // Distributed under the Boost Software License, Version 1.0.
3 // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
4 
5 #ifndef BOOST_HANA_TEST_STRUCT_MINIMAL_STRUCT_HPP
6 #define BOOST_HANA_TEST_STRUCT_MINIMAL_STRUCT_HPP
7 
8 #include <boost/hana/at.hpp>
9 #include <boost/hana/fwd/accessors.hpp>
10 #include <boost/hana/pair.hpp>
11 #include <boost/hana/range.hpp>
12 #include <boost/hana/tuple.hpp>
13 #include <boost/hana/unpack.hpp>
14 
15 
16 template <int N>
17 struct minimal_struct_tag;
18 
19 template <typename ...Members>
20 struct minimal_struct_t {
21     boost::hana::tuple<Members...> members;
22     using hana_tag = minimal_struct_tag<sizeof...(Members)>;
23 };
24 
25 struct obj_t {
26     template <typename ...Members>
operator ()obj_t27     constexpr minimal_struct_t<Members...> operator()(Members ...members) const {
28         return {{static_cast<Members&&>(members)...}};
29     }
30 };
31 constexpr obj_t obj{};
32 
33 namespace boost { namespace hana {
34     template <int N>
35     struct accessors_impl<minimal_struct_tag<N>> {
36         template <typename K>
37         struct get_member {
38             template <typename Struct>
operator ()boost::hana::accessors_impl::get_member39             constexpr decltype(auto) operator()(Struct&& s) const {
40                 return hana::at_c<K::value>(static_cast<Struct&&>(s).members);
41             }
42         };
43 
applyboost::hana::accessors_impl44         static auto apply() {
45             return hana::unpack(hana::range_c<int, 0, N>, [](auto ...k) {
46                 return hana::make_tuple(
47                     hana::make_pair(k, get_member<decltype(k)>{})...
48                 );
49             });
50         }
51     };
52 }}
53 
54 #endif // !BOOST_HANA_TEST_STRUCT_MINIMAL_STRUCT_HPP
55