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 #include <boost/hana/assert.hpp>
6 #include <boost/hana/config.hpp>
7 #include <boost/hana/core/to.hpp>
8 #include <boost/hana/equal.hpp>
9 #include <boost/hana/find.hpp>
10 #include <boost/hana/functional/id.hpp>
11 #include <boost/hana/fwd/accessors.hpp>
12 #include <boost/hana/integral_constant.hpp>
13 #include <boost/hana/not_equal.hpp>
14 #include <boost/hana/pair.hpp>
15 #include <boost/hana/string.hpp>
16 #include <boost/hana/tuple.hpp>
17
18 #include <string>
19 #include <utility>
20 namespace hana = boost::hana;
21
22
23 //! [main]
24 struct Person {
PersonPerson25 Person(std::string const& name, int age) : name_(name), age_(age) { }
26
get_namePerson27 std::string const& get_name() const { return name_; }
get_agePerson28 int get_age() const { return age_; }
29
30 private:
31 std::string name_;
32 int age_;
33 };
34
35 namespace boost { namespace hana {
36 template <>
37 struct accessors_impl<Person> {
applyboost::hana::accessors_impl38 static BOOST_HANA_CONSTEXPR_LAMBDA auto apply() {
39 return make_tuple(
40 make_pair(BOOST_HANA_STRING("name"), [](auto&& p) -> std::string const& {
41 return p.get_name();
42 }),
43 make_pair(BOOST_HANA_STRING("age"), [](auto&& p) {
44 return p.get_age();
45 })
46 );
47 }
48 };
49 }}
50 //! [main]
51
main()52 int main() {
53 auto name = BOOST_HANA_STRING("name");
54 auto age = BOOST_HANA_STRING("age");
55
56 Person john{"John", 30}, bob{"Bob", 40};
57 BOOST_HANA_RUNTIME_CHECK(hana::equal(john, john));
58 BOOST_HANA_RUNTIME_CHECK(hana::not_equal(john, bob));
59
60 BOOST_HANA_RUNTIME_CHECK(hana::find(john, name) == hana::just("John"));
61 BOOST_HANA_RUNTIME_CHECK(hana::find(john, age) == hana::just(30));
62 BOOST_HANA_CONSTANT_CHECK(hana::find(john, BOOST_HANA_STRING("foo")) == hana::nothing);
63
64 BOOST_HANA_RUNTIME_CHECK(hana::to_tuple(john) == hana::make_tuple(
65 hana::make_pair(name, "John"),
66 hana::make_pair(age, 30)
67 ));
68 }
69