macro.adapt_adt.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. #include <boost/hana/adapt_adt.hpp>
  5. #include <boost/hana/assert.hpp>
  6. #include <boost/hana/concept/struct.hpp>
  7. #include <boost/hana/contains.hpp>
  8. #include <boost/hana/string.hpp>
  9. #include <laws/base.hpp>
  10. namespace hana = boost::hana;
  11. using hana::test::ct_eq;
  12. namespace ns {
  13. struct Data0 { };
  14. struct Data1 {
  15. ct_eq<1> get_member1() const { return {}; }
  16. };
  17. struct Data2 {
  18. ct_eq<1> get_member1() const { return {}; }
  19. ct_eq<2> get_member2() const { return {}; }
  20. };
  21. struct Data3 {
  22. ct_eq<1> get_member1() const { return {}; }
  23. ct_eq<2> get_member2() const { return {}; }
  24. ct_eq<3> get_member3() const { return {}; }
  25. };
  26. }
  27. // Note: We use commas in the lambdas to make sure the macro can handle it.
  28. BOOST_HANA_ADAPT_ADT(ns::Data0);
  29. BOOST_HANA_ADAPT_ADT(ns::Data1,
  30. (member1, [](auto const& d) { return 0, d.get_member1(); })
  31. );
  32. BOOST_HANA_ADAPT_ADT(ns::Data2,
  33. (member1, [](auto const& d) { return 0, d.get_member1(); }),
  34. (member2, [](auto const& d) { return d.get_member2(); })
  35. );
  36. BOOST_HANA_ADAPT_ADT(ns::Data3,
  37. (member1, [](auto const& d) { return 0, d.get_member1(); }),
  38. (member2, [](auto const& d) { return d.get_member2(); }),
  39. (member3, [](auto const& d) { return d.get_member3(); })
  40. );
  41. static_assert(hana::Struct<ns::Data0>::value, "");
  42. static_assert(hana::Struct<ns::Data1>::value, "");
  43. static_assert(hana::Struct<ns::Data2>::value, "");
  44. static_assert(hana::Struct<ns::Data3>::value, "");
  45. int main() {
  46. BOOST_HANA_CONSTANT_CHECK(hana::contains(ns::Data1{}, BOOST_HANA_STRING("member1")));
  47. BOOST_HANA_CONSTANT_CHECK(hana::contains(ns::Data2{}, BOOST_HANA_STRING("member1")));
  48. BOOST_HANA_CONSTANT_CHECK(hana::contains(ns::Data2{}, BOOST_HANA_STRING("member2")));
  49. BOOST_HANA_CONSTANT_CHECK(hana::contains(ns::Data3{}, BOOST_HANA_STRING("member1")));
  50. BOOST_HANA_CONSTANT_CHECK(hana::contains(ns::Data3{}, BOOST_HANA_STRING("member2")));
  51. BOOST_HANA_CONSTANT_CHECK(hana::contains(ns::Data3{}, BOOST_HANA_STRING("member3")));
  52. }