macro.define_struct.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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/assert.hpp>
  5. #include <boost/hana/concept/struct.hpp>
  6. #include <boost/hana/contains.hpp>
  7. #include <boost/hana/define_struct.hpp>
  8. #include <boost/hana/string.hpp>
  9. #include <laws/base.hpp>
  10. namespace hana = boost::hana;
  11. using hana::test::ct_eq;
  12. // This allows us to make sure we can enter template types
  13. // containing commas in the macro.
  14. template <typename T, typename ...>
  15. using commas = T;
  16. struct Data0 {
  17. BOOST_HANA_DEFINE_STRUCT(Data0);
  18. };
  19. struct Data1 {
  20. BOOST_HANA_DEFINE_STRUCT(Data1,
  21. (commas<ct_eq<1>, void>, member1)
  22. );
  23. };
  24. struct Data2 {
  25. BOOST_HANA_DEFINE_STRUCT(Data2,
  26. (commas<ct_eq<1>, void, void>, member1),
  27. (ct_eq<2>, member2)
  28. );
  29. };
  30. struct Data3 {
  31. BOOST_HANA_DEFINE_STRUCT(Data3,
  32. (ct_eq<1>, member1),
  33. (ct_eq<2>, member2),
  34. (commas<ct_eq<3>, void, void, void>, member3)
  35. );
  36. };
  37. static_assert(hana::Struct<Data0>::value, "");
  38. static_assert(hana::Struct<Data1>::value, "");
  39. static_assert(hana::Struct<Data2>::value, "");
  40. static_assert(hana::Struct<Data3>::value, "");
  41. int main() {
  42. BOOST_HANA_CONSTANT_CHECK(hana::contains(Data1{}, BOOST_HANA_STRING("member1")));
  43. BOOST_HANA_CONSTANT_CHECK(hana::contains(Data2{}, BOOST_HANA_STRING("member1")));
  44. BOOST_HANA_CONSTANT_CHECK(hana::contains(Data2{}, BOOST_HANA_STRING("member2")));
  45. BOOST_HANA_CONSTANT_CHECK(hana::contains(Data3{}, BOOST_HANA_STRING("member1")));
  46. BOOST_HANA_CONSTANT_CHECK(hana::contains(Data3{}, BOOST_HANA_STRING("member2")));
  47. BOOST_HANA_CONSTANT_CHECK(hana::contains(Data3{}, BOOST_HANA_STRING("member3")));
  48. }