123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- /* Boost.MultiIndex test for terse key specification syntax.
- *
- * Copyright 2003-2019 Joaquin M Lopez Munoz.
- * Distributed under the Boost Software License, Version 1.0.
- * (See accompanying file LICENSE_1_0.txt or copy at
- * http://www.boost.org/LICENSE_1_0.txt)
- *
- * See http://www.boost.org/libs/multi_index for library home page.
- */
- #include "test_key.hpp"
- #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
- #include <boost/detail/lightweight_test.hpp>
- #include "pre_multi_index.hpp"
- #include <boost/multi_index/key.hpp>
- #if !defined(BOOST_MULTI_INDEX_KEY_SUPPORTED)
- #include <boost/config/pragma_message.hpp>
- BOOST_PRAGMA_MESSAGE("boost::multi_index::key not supported, skipping test")
- void test_key()
- {
- }
- #else
- #include <functional>
- #include <type_traits>
- using namespace boost::multi_index;
- namespace {
- struct base
- {
- int x;
- const int cx;
- int f(){return x;};
- int cf()const{return x;};
- int vf()volatile{return x;};
- int cvf()const volatile{return x;};
- int rf()&{return x;};
- int crf()const&{return x;};
- int vrf()volatile&{return x;};
- int cvrf()const volatile&{return x;};
- int nef()noexcept{return x;};
- int cnef()const noexcept{return x;};
- int vnef()volatile noexcept{return x;};
- int cvnef()const volatile noexcept{return x;};
- int rnef()& noexcept{return x;};
- int crnef()const& noexcept{return x;};
- int vrnef()volatile& noexcept{return x;};
- int cvrnef()const volatile& noexcept{return x;};
- };
- int gf(const base& b){return b.x;}
- int negf(const base& b)noexcept{return b.x;}
- struct derived:base
- {
- int y;
- };
- int gh(derived& d){return d.y;}
- int grh(std::reference_wrapper<derived>& d){return d.get().y;}
- } /* namespace */
- void test_key()
- {
- BOOST_TEST((std::is_same<
- key<&base::x>,member<base,int,&base::x>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::cx>,member<base,const int,&base::cx>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::f>,mem_fun<base,int,&base::f>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::cf>,const_mem_fun<base,int,&base::cf>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::vf>,volatile_mem_fun<base,int,&base::vf>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::cvf>,cv_mem_fun<base,int,&base::cvf>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::rf>,ref_mem_fun<base,int,&base::rf>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::crf>,cref_mem_fun<base,int,&base::crf>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::vrf>,vref_mem_fun<base,int,&base::vrf>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::cvrf>,cvref_mem_fun<base,int,&base::cvrf>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::nef>,mem_fun<base,int,&base::nef>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::cnef>,const_mem_fun<base,int,&base::cnef>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::vnef>,volatile_mem_fun<base,int,&base::vnef>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::cvnef>,cv_mem_fun<base,int,&base::cvnef>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::rnef>,ref_mem_fun<base,int,&base::rnef>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::crnef>,cref_mem_fun<base,int,&base::crnef>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::vrnef>,vref_mem_fun<base,int,&base::vrnef>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::cvrnef>,cvref_mem_fun<base,int,&base::cvrnef>
- >::value));
- BOOST_TEST((std::is_same<
- key<gf>,global_fun<const base&,int,gf>
- >::value));
- BOOST_TEST((std::is_same<
- key<negf>,global_fun<const base&,int,negf>
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::x,&base::cx,&base::f,&base::cf,gf>,
- composite_key<
- base,
- member<base,int,&base::x>,
- member<base,const int,&base::cx>,
- mem_fun<base,int,&base::f>,
- const_mem_fun<base,int,&base::cf>,
- global_fun<const base&,int,gf>
- >
- >::value));
- BOOST_TEST((std::is_same<
- key<&base::x,&derived::y>,
- composite_key<
- derived,
- member<base,int,&base::x>,
- member<derived,int,&derived::y>
- >
- >::value));
- BOOST_TEST((std::is_same<
- key<gf,gh>,
- composite_key<
- derived,
- global_fun<const base&,int,gf>,
- global_fun<derived&,int,gh>
- >
- >::value));
- BOOST_TEST((std::is_same<
- key<gf,gh,grh>,
- composite_key<
- std::reference_wrapper<derived>,
- global_fun<const base&,int,gf>,
- global_fun<derived&,int,gh>,
- global_fun<std::reference_wrapper<derived>&,int,grh>
- >
- >::value));
- }
- #endif
|