minimal_struct.hpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. #ifndef BOOST_HANA_TEST_STRUCT_MINIMAL_STRUCT_HPP
  5. #define BOOST_HANA_TEST_STRUCT_MINIMAL_STRUCT_HPP
  6. #include <boost/hana/at.hpp>
  7. #include <boost/hana/fwd/accessors.hpp>
  8. #include <boost/hana/pair.hpp>
  9. #include <boost/hana/range.hpp>
  10. #include <boost/hana/tuple.hpp>
  11. #include <boost/hana/unpack.hpp>
  12. template <int N>
  13. struct minimal_struct_tag;
  14. template <typename ...Members>
  15. struct minimal_struct_t {
  16. boost::hana::tuple<Members...> members;
  17. using hana_tag = minimal_struct_tag<sizeof...(Members)>;
  18. };
  19. struct obj_t {
  20. template <typename ...Members>
  21. constexpr minimal_struct_t<Members...> operator()(Members ...members) const {
  22. return {{static_cast<Members&&>(members)...}};
  23. }
  24. };
  25. constexpr obj_t obj{};
  26. namespace boost { namespace hana {
  27. template <int N>
  28. struct accessors_impl<minimal_struct_tag<N>> {
  29. template <typename K>
  30. struct get_member {
  31. template <typename Struct>
  32. constexpr decltype(auto) operator()(Struct&& s) const {
  33. return hana::at_c<K::value>(static_cast<Struct&&>(s).members);
  34. }
  35. };
  36. static auto apply() {
  37. return hana::unpack(hana::range_c<int, 0, N>, [](auto ...k) {
  38. return hana::make_tuple(
  39. hana::make_pair(k, get_member<decltype(k)>{})...
  40. );
  41. });
  42. }
  43. };
  44. }}
  45. #endif // !BOOST_HANA_TEST_STRUCT_MINIMAL_STRUCT_HPP