summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/hana/test/map/at_key.ref.cpp
blob: c845bc1347cf5151f98eb8ae497e2f0f65e564f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright Louis Dionne 2013-2017
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)

#include <boost/hana/assert.hpp>
#include <boost/hana/at_key.hpp>
#include <boost/hana/integral_constant.hpp>
#include <boost/hana/map.hpp>
#include <boost/hana/pair.hpp>

#include <utility>
namespace hana = boost::hana;


template <typename T>
T const& cref(T& t) { return t; }

int main() {
    // using at_key
    {
        auto xs = hana::make_map(
            hana::make_pair(hana::int_c<0>, 0),
            hana::make_pair(hana::int_c<1>, '1'),
            hana::make_pair(hana::int_c<2>, 2.2)
        );

        // Make sure we return lvalue-references
        BOOST_HANA_RUNTIME_CHECK(hana::at_key(xs, hana::int_c<0>) == 0);
        BOOST_HANA_RUNTIME_CHECK(hana::at_key(xs, hana::int_c<1>) == '1');
        BOOST_HANA_RUNTIME_CHECK(hana::at_key(xs, hana::int_c<2>) == 2.2);

        int& a = hana::at_key(xs, hana::int_c<0>);
        char& b = hana::at_key(xs, hana::int_c<1>);
        double& c = hana::at_key(xs, hana::int_c<2>);
        a = 9;
        b = '9';
        c = 9.9;

        // Make sure we return lvalue-references to const on a const map
        int const& ca = hana::at_key(cref(xs), hana::int_c<0>);
        char const& cb = hana::at_key(cref(xs), hana::int_c<1>);
        double const& cc = hana::at_key(cref(xs), hana::int_c<2>);

        BOOST_HANA_RUNTIME_CHECK(ca == 9);
        BOOST_HANA_RUNTIME_CHECK(cb == '9');
        BOOST_HANA_RUNTIME_CHECK(cc == 9.9);
    }

    // using operator[]
    {
        auto xs = hana::make_map(
            hana::make_pair(hana::int_c<0>, 0),
            hana::make_pair(hana::int_c<1>, '1'),
            hana::make_pair(hana::int_c<2>, 2.2)
        );

        BOOST_HANA_RUNTIME_CHECK(xs[hana::int_c<0>] == 0);
        BOOST_HANA_RUNTIME_CHECK(xs[hana::int_c<1>] == '1');
        BOOST_HANA_RUNTIME_CHECK(xs[hana::int_c<2>] == 2.2);

        xs[hana::int_c<0>] = 9;
        xs[hana::int_c<1>] = '9';
        xs[hana::int_c<2>] = 9.9;

        BOOST_HANA_RUNTIME_CHECK(xs[hana::int_c<0>] == 9);
        BOOST_HANA_RUNTIME_CHECK(xs[hana::int_c<1>] == '9');
        BOOST_HANA_RUNTIME_CHECK(xs[hana::int_c<2>] == 9.9);
    }

    // Make sure we return a rvalue-reference from a temporary map
    // (https://github.com/boostorg/hana/issues/90)
    {
        auto xs = hana::make_map(
            hana::make_pair(hana::int_c<0>, 0),
            hana::make_pair(hana::int_c<1>, '1'),
            hana::make_pair(hana::int_c<2>, 2.2)
        );

        char&& c = hana::at_key(std::move(xs), hana::int_c<1>);
        BOOST_HANA_RUNTIME_CHECK(hana::at_key(xs, hana::int_c<1>) == '1');
        c = '9';
        BOOST_HANA_RUNTIME_CHECK(hana::at_key(xs, hana::int_c<1>) == '9');
    }
}