// 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 #include #include #include #include #include namespace hana = boost::hana; template 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'); } }