123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670 |
- /* Boost.MultiIndex test for composite_key.
- *
- * Copyright 2003-2018 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_composite_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_container.hpp>
- #include <boost/multi_index/composite_key.hpp>
- #include <boost/multi_index/hashed_index.hpp>
- #include <boost/multi_index/member.hpp>
- #include <boost/multi_index/ordered_index.hpp>
- #include <boost/preprocessor/repetition/enum_binary_params.hpp>
- #include <boost/preprocessor/repetition/enum_params.hpp>
- #include <boost/preprocessor/repetition/repeat_from_to.hpp>
- using namespace boost::multi_index;
- using namespace boost::tuples;
- struct is_composite_key_result_helper
- {
- typedef char yes;
- struct no{char m[2];};
- static no test(void*);
- template<typename CompositeKey>
- static yes test(composite_key_result<CompositeKey>*);
- };
- template<typename T>
- struct is_composite_key_result
- {
- typedef is_composite_key_result_helper helper;
- BOOST_STATIC_CONSTANT(bool,
- value=(
- sizeof(helper::test((T*)0))==
- sizeof(typename helper::yes)));
- };
- template<typename CompositeKeyResult>
- struct composite_key_result_length
- {
- BOOST_STATIC_CONSTANT(int,
- value=boost::tuples::length<
- BOOST_DEDUCED_TYPENAME
- CompositeKeyResult::composite_key_type::key_extractor_tuple
- >::value);
- };
- #if !defined(BOOST_NO_CXX11_HDR_TUPLE)&&\
- !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- struct is_boost_tuple_helper
- {
- typedef char yes;
- struct no{char m[2];};
- static no test(void*);
- template<BOOST_PP_ENUM_PARAMS(10,typename T)>
- static yes test(boost::tuple<BOOST_PP_ENUM_PARAMS(10,T)>*);
- };
- template<typename T>
- struct is_boost_tuple
- {
- typedef is_boost_tuple_helper helper;
- BOOST_STATIC_CONSTANT(bool,
- value=(
- sizeof(helper::test((T*)0))==
- sizeof(typename helper::yes)));
- };
- template<typename T>
- struct composite_object_length
- {
- typedef typename boost::mpl::if_c<
- is_composite_key_result<T>::value,
- composite_key_result_length<T>,
- typename boost::mpl::if_c<
- is_boost_tuple<T>::value,
- boost::tuples::length<T>,
- std::tuple_size<T>
- >::type
- >::type type;
- BOOST_STATIC_CONSTANT(int,value=type::value);
- };
- #else
- template<typename T>
- struct composite_object_length
- {
- typedef typename boost::mpl::if_c<
- is_composite_key_result<T>::value,
- composite_key_result_length<T>,
- boost::tuples::length<T>
- >::type type;
- BOOST_STATIC_CONSTANT(int,value=type::value);
- };
- #endif
- template<typename CompositeKeyResult,typename T2>
- struct comparison_equal_length
- {
- static bool is_less(const CompositeKeyResult& x,const T2& y)
- {
- composite_key_result_equal_to<CompositeKeyResult> eq;
- composite_key_result_less<CompositeKeyResult> lt;
- composite_key_result_greater<CompositeKeyResult> gt;
- std::equal_to<CompositeKeyResult> std_eq;
- std::less<CompositeKeyResult> std_lt;
- std::greater<CompositeKeyResult> std_gt;
- return (x< y) && !(y< x)&&
- !(x==y) && !(y==x)&&
- (x!=y) && (y!=x)&&
- !(x> y) && (y> x)&&
- !(x>=y) && (y>=x)&&
- (x<=y) && !(y<=x)&&
- !eq(x,y) && !eq(y,x)&&
- lt(x,y) && !lt(y,x)&&
- !gt(x,y) && gt(y,x)&&
- !std_eq(x,y) && !std_eq(y,x)&&
- std_lt(x,y) && !std_lt(y,x)&&
- !std_gt(x,y) && std_gt(y,x);
- }
- static bool is_greater(const CompositeKeyResult& x,const T2& y)
- {
- composite_key_result_equal_to<CompositeKeyResult> eq;
- composite_key_result_less<CompositeKeyResult> lt;
- composite_key_result_greater<CompositeKeyResult> gt;
- std::equal_to<CompositeKeyResult> std_eq;
- std::less<CompositeKeyResult> std_lt;
- std::greater<CompositeKeyResult> std_gt;
- return !(x< y) && (y< x)&&
- !(x==y) && !(y==x)&&
- (x!=y) && (y!=x)&&
- (x> y) && !(y> x)&&
- (x>=y) && !(y>=x)&&
- !(x<=y) && (y<=x)&&
- !eq(x,y) && !eq(y,x)&&
- !lt(x,y) && lt(y,x)&&
- gt(x,y) && !gt(y,x)&&
- !std_eq(x,y) && !std_eq(y,x)&&
- !std_lt(x,y) && std_lt(y,x)&&
- std_gt(x,y) && !std_gt(y,x);
- }
- static bool is_equiv(const CompositeKeyResult& x,const T2& y)
- {
- composite_key_result_equal_to<CompositeKeyResult> eq;
- composite_key_result_less<CompositeKeyResult> lt;
- composite_key_result_greater<CompositeKeyResult> gt;
- std::equal_to<CompositeKeyResult> std_eq;
- std::less<CompositeKeyResult> std_lt;
- std::greater<CompositeKeyResult> std_gt;
- return !(x< y) && !(y< x)&&
- (x==y) && (y==x)&&
- !(x!=y) && !(y!=x)&&
- !(x> y) && !(y> x)&&
- (x>=y) && (y>=x)&&
- (x<=y) && (y<=x)&&
- eq(x,y) && eq(y,x)&&
- !lt(x,y) && !lt(y,x)&&
- !gt(x,y) && !gt(y,x)&&
- std_eq(x,y) && std_eq(y,x)&&
- !std_lt(x,y) && !std_lt(y,x)&&
- !std_gt(x,y) && !std_gt(y,x);
- }
- };
- template<typename CompositeKeyResult,typename T2>
- struct comparison_different_length
- {
- static bool is_less(const CompositeKeyResult& x,const T2& y)
- {
- composite_key_result_less<CompositeKeyResult> lt;
- composite_key_result_greater<CompositeKeyResult> gt;
- std::less<CompositeKeyResult> std_lt;
- std::greater<CompositeKeyResult> std_gt;
- return (x< y) && !(y< x)&&
- !(x> y) && (y> x)&&
- !(x>=y) && (y>=x)&&
- (x<=y) && !(y<=x)&&
- lt(x,y) && !lt(y,x)&&
- !gt(x,y) && gt(y,x)&&
- std_lt(x,y) && !std_lt(y,x)&&
- !std_gt(x,y) && std_gt(y,x);
- }
- static bool is_greater(const CompositeKeyResult& x,const T2& y)
- {
- composite_key_result_less<CompositeKeyResult> lt;
- composite_key_result_greater<CompositeKeyResult> gt;
- std::less<CompositeKeyResult> std_lt;
- std::greater<CompositeKeyResult> std_gt;
- return !(x< y) && (y< x)&&
- (x> y) && !(y> x)&&
- (x>=y) && !(y>=x)&&
- !(x<=y) && (y<=x)&&
- !lt(x,y) && lt(y,x)&&
- gt(x,y) && !gt(y,x)&&
- !std_lt(x,y) && std_lt(y,x)&&
- std_gt(x,y) && !std_gt(y,x);
- }
- static bool is_equiv(const CompositeKeyResult& x,const T2& y)
- {
- composite_key_result_less<CompositeKeyResult> lt;
- composite_key_result_greater<CompositeKeyResult> gt;
- std::less<CompositeKeyResult> std_lt;
- std::greater<CompositeKeyResult> std_gt;
- return !(x< y) && !(y< x)&&
- !(x> y) && !(y> x)&&
- (x>=y) && (y>=x)&&
- (x<=y) && (y<=x)&&
- !lt(x,y) && !lt(y,x)&&
- !gt(x,y) && !gt(y,x)&&
- !std_lt(x,y) && !std_lt(y,x)&&
- !std_gt(x,y) && !std_gt(y,x);
- }
- };
- template<typename CompositeKeyResult,typename T2>
- struct comparison_helper:
- boost::mpl::if_c<
- composite_key_result_length<CompositeKeyResult>::value==
- composite_object_length<T2>::value,
- comparison_equal_length<CompositeKeyResult,T2>,
- comparison_different_length<CompositeKeyResult,T2>
- >::type
- {
- };
- template<typename CompositeKeyResult,typename T2>
- static bool is_less(const CompositeKeyResult& x,const T2& y)
- {
- return comparison_helper<CompositeKeyResult,T2>::is_less(x,y);
- }
- template<typename CompositeKeyResult,typename T2>
- static bool is_greater(const CompositeKeyResult& x,const T2& y)
- {
- return comparison_helper<CompositeKeyResult,T2>::is_greater(x,y);
- }
- template<typename CompositeKeyResult,typename T2>
- static bool is_equiv(const CompositeKeyResult& x,const T2& y)
- {
- return comparison_helper<CompositeKeyResult,T2>::is_equiv(x,y);
- }
- template<typename T1,typename T2,typename Compare>
- static bool is_less(const T1& x,const T2& y,const Compare& c)
- {
- return c(x,y)&&!c(y,x);
- }
- template<typename T1,typename T2,typename Compare>
- static bool is_greater(const T1& x,const T2& y,const Compare& c)
- {
- return c(y,x)&&!c(x,y);
- }
- template<typename T1,typename T2,typename Compare>
- static bool is_equiv(const T1& x,const T2& y,const Compare& c)
- {
- return !c(x,y)&&!c(y,x);
- }
- template<typename T1,typename T2,typename Compare,typename Equiv>
- static bool is_less(
- const T1& x,const T2& y,const Compare& c,const Equiv& eq)
- {
- return c(x,y)&&!c(y,x)&&!eq(x,y)&&!eq(y,x);
- }
- template<typename T1,typename T2,typename Compare,typename Equiv>
- static bool is_greater(
- const T1& x,const T2& y,const Compare& c,const Equiv& eq)
- {
- return c(y,x)&&!c(x,y)&&!eq(x,y)&&!eq(y,x);
- }
- template<typename T1,typename T2,typename Compare,typename Equiv>
- static bool is_equiv(
- const T1& x,const T2& y,const Compare& c,const Equiv& eq)
- {
- return !c(x,y)&&!c(y,x)&&eq(x,y)&&eq(y,x);
- }
- struct xyz
- {
- xyz(int x_=0,int y_=0,int z_=0):x(x_),y(y_),z(z_){}
- int x;
- int y;
- int z;
- };
- struct modulo_equal
- {
- modulo_equal(int i):i_(i){}
- bool operator ()(int x,int y)const{return (x%i_)==(y%i_);}
- private:
- int i_;
- };
- struct xystr
- {
- xystr(int x_=0,int y_=0,std::string str_=0):x(x_),y(y_),str(str_){}
- int x;
- int y;
- std::string str;
- };
- #define TUPLE_MAKER_CREATE(z,n,tuple) \
- template<BOOST_PP_ENUM_PARAMS(n,typename T)> \
- static tuple<BOOST_PP_ENUM_PARAMS(n,T)> \
- create(BOOST_PP_ENUM_BINARY_PARAMS(n,const T,& t)){ \
- return tuple<BOOST_PP_ENUM_PARAMS(n,T)>( \
- BOOST_PP_ENUM_PARAMS(n,t)); \
- }
- #define DEFINE_TUPLE_MAKER(name,tuple) \
- struct name \
- { \
- static tuple<> create(){return tuple<>();} \
- BOOST_PP_REPEAT_FROM_TO(1,5,TUPLE_MAKER_CREATE,tuple) \
- };
- DEFINE_TUPLE_MAKER(boost_tuple_maker,boost::tuple)
- #if !defined(BOOST_NO_CXX11_HDR_TUPLE)&&\
- !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- DEFINE_TUPLE_MAKER(std_tuple_maker,std::tuple)
- #endif
- #undef DEFINE_TUPLE_MAKER
- #undef TUPLE_MAKER_CREATE
- template<typename TupleMaker>
- void test_composite_key_template()
- {
- typedef composite_key<
- xyz,
- BOOST_MULTI_INDEX_MEMBER(xyz,int,x),
- BOOST_MULTI_INDEX_MEMBER(xyz,int,y),
- BOOST_MULTI_INDEX_MEMBER(xyz,int,z)
- > ckey_t1;
- typedef multi_index_container<
- xyz,
- indexed_by<
- ordered_unique<ckey_t1>
- >
- > indexed_t1;
- indexed_t1 mc1;
- mc1.insert(xyz(0,0,0));
- mc1.insert(xyz(0,0,1));
- mc1.insert(xyz(0,1,0));
- mc1.insert(xyz(0,1,1));
- mc1.insert(xyz(1,0,0));
- mc1.insert(xyz(1,0,1));
- mc1.insert(xyz(1,1,0));
- mc1.insert(xyz(1,1,1));
- BOOST_TEST(mc1.size()==8);
- BOOST_TEST(
- std::distance(
- mc1.find(mc1.key_extractor()(xyz(0,0,0))),
- mc1.find(mc1.key_extractor()(xyz(1,0,0))))==4);
- BOOST_TEST(
- std::distance(
- mc1.find(TupleMaker::create(0,0,0)),
- mc1.find(TupleMaker::create(1,0,0)))==4);
- BOOST_TEST(
- std::distance(
- mc1.lower_bound(TupleMaker::create(0,0)),
- mc1.upper_bound(TupleMaker::create(1,0)))==6);
- #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
- BOOST_TEST(
- std::distance(
- mc1.lower_bound(1),
- mc1.upper_bound(1))==4);
- #endif
- ckey_t1 ck1;
- ckey_t1 ck2(ck1);
- ckey_t1 ck3(
- boost::make_tuple(
- BOOST_MULTI_INDEX_MEMBER(xyz,int,x)(),
- BOOST_MULTI_INDEX_MEMBER(xyz,int,y)(),
- BOOST_MULTI_INDEX_MEMBER(xyz,int,z)()));
- ckey_t1 ck4(get<0>(ck1.key_extractors()));
- (void)ck3; /* prevent unused var */
- get<2>(ck4.key_extractors())=
- get<2>(ck2.key_extractors());
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),ck2(xyz(0,0,0))));
- BOOST_TEST(is_less (ck1(xyz(0,0,1)),ck2(xyz(0,1,0))));
- BOOST_TEST(is_greater(ck1(xyz(0,0,1)),ck2(xyz(0,0,0))));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0)));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),TupleMaker::create(1)));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),TupleMaker::create(-1)));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0,0)));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),TupleMaker::create(0,1)));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),TupleMaker::create(0,-1)));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0,0,0)));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),TupleMaker::create(0,0,1)));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),TupleMaker::create(0,0,-1)));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0,0,0,1)));
- typedef composite_key_result_less<ckey_t1::result_type> ckey_comp_t1;
- typedef composite_key_result_equal_to<ckey_t1::result_type> ckey_eq_t1;
- ckey_comp_t1 cp1;
- ckey_eq_t1 eq1;
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),ck2(xyz(0,0,0)),cp1,eq1));
- BOOST_TEST(is_less (ck1(xyz(0,0,1)),ck2(xyz(0,1,0)),cp1,eq1));
- BOOST_TEST(is_greater(ck1(xyz(0,0,1)),ck2(xyz(0,0,0)),cp1,eq1));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0),cp1));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),TupleMaker::create(1),cp1));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),TupleMaker::create(-1),cp1));
- #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),0,cp1));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),1,cp1));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),-1,cp1));
- #endif
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0,0),cp1));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),TupleMaker::create(0,1),cp1));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),TupleMaker::create(0,-1),cp1));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0,0,0),cp1,eq1));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),TupleMaker::create(0,0,1),cp1,eq1));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),TupleMaker::create(0,0,-1),cp1,eq1));
- typedef composite_key_result_greater<ckey_t1::result_type> ckey_comp_t2;
- ckey_comp_t2 cp2;
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),ck2(xyz(0,0,0)),cp2));
- BOOST_TEST(is_greater(ck1(xyz(0,0,1)),ck2(xyz(0,1,0)),cp2));
- BOOST_TEST(is_less (ck1(xyz(0,0,1)),ck2(xyz(0,0,0)),cp2));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0),cp2));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),TupleMaker::create(1),cp2));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),TupleMaker::create(-1),cp2));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0,0),cp2));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),TupleMaker::create(0,1),cp2));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),TupleMaker::create(0,-1),cp2));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0,0,0),cp2));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),TupleMaker::create(0,0,1),cp2));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),TupleMaker::create(0,0,-1),cp2));
- typedef composite_key_equal_to<
- modulo_equal,
- modulo_equal,
- std::equal_to<int>,
- std::equal_to<int>
- > ckey_eq_t2;
- ckey_eq_t2 eq2(
- boost::make_tuple(
- modulo_equal(2),
- modulo_equal(3),
- std::equal_to<int>(),
- std::equal_to<int>()));
- ckey_eq_t2 eq3(eq2);
- ckey_eq_t2 eq4(
- get<0>(eq3.key_eqs()),
- get<1>(eq3.key_eqs()));
- eq3=eq4; /* prevent unused var */
- eq4=eq3; /* prevent unused var */
- BOOST_TEST( eq2(ck1(xyz(0,0,0)),ck1(xyz(0,0,0))));
- BOOST_TEST(!eq2(ck1(xyz(0,1,0)),ck1(xyz(0,0,0))));
- BOOST_TEST(!eq2(ck1(xyz(0,2,0)),ck1(xyz(0,0,0))));
- BOOST_TEST( eq2(ck1(xyz(0,3,0)),ck1(xyz(0,0,0))));
- BOOST_TEST(!eq2(ck1(xyz(1,0,0)),ck1(xyz(0,0,0))));
- BOOST_TEST(!eq2(ck1(xyz(1,1,0)),ck1(xyz(0,0,0))));
- BOOST_TEST(!eq2(ck1(xyz(1,2,0)),ck1(xyz(0,0,0))));
- BOOST_TEST(!eq2(ck1(xyz(1,3,0)),ck1(xyz(0,0,0))));
- BOOST_TEST( eq2(ck1(xyz(2,0,0)),ck1(xyz(0,0,0))));
- BOOST_TEST(!eq2(ck1(xyz(2,1,0)),ck1(xyz(0,0,0))));
- BOOST_TEST(!eq2(ck1(xyz(2,2,0)),ck1(xyz(0,0,0))));
- BOOST_TEST( eq2(ck1(xyz(2,3,0)),ck1(xyz(0,0,0))));
- BOOST_TEST( eq2(TupleMaker::create(0,0,0),ck1(xyz(0,0,0))));
- BOOST_TEST(!eq2(ck1(xyz(0,1,0)) ,TupleMaker::create(0,0,0)));
- BOOST_TEST(!eq2(TupleMaker::create(0,2,0),ck1(xyz(0,0,0))));
- BOOST_TEST( eq2(ck1(xyz(0,3,0)) ,TupleMaker::create(0,0,0)));
- BOOST_TEST(!eq2(TupleMaker::create(1,0,0),ck1(xyz(0,0,0))));
- BOOST_TEST(!eq2(ck1(xyz(1,1,0)) ,TupleMaker::create(0,0,0)));
- BOOST_TEST(!eq2(TupleMaker::create(1,2,0),ck1(xyz(0,0,0))));
- BOOST_TEST(!eq2(ck1(xyz(1,3,0)) ,TupleMaker::create(0,0,0)));
- BOOST_TEST( eq2(TupleMaker::create(2,0,0),ck1(xyz(0,0,0))));
- BOOST_TEST(!eq2(ck1(xyz(2,1,0)) ,TupleMaker::create(0,0,0)));
- BOOST_TEST(!eq2(TupleMaker::create(2,2,0),ck1(xyz(0,0,0))));
- BOOST_TEST( eq2(ck1(xyz(2,3,0)) ,TupleMaker::create(0,0,0)));
- typedef composite_key_compare<
- std::less<int>,
- std::greater<int>, /* order reversed */
- std::less<int>
- > ckey_comp_t3;
- ckey_comp_t3 cp3;
- ckey_comp_t3 cp4(cp3);
- ckey_comp_t3 cp5(
- boost::make_tuple(
- std::less<int>(),
- std::greater<int>(),
- std::less<int>()));
- ckey_comp_t3 cp6(get<0>(cp3.key_comps()));
- cp4=cp5; /* prevent unused var */
- cp5=cp6; /* prevent unused var */
- cp6=cp4; /* prevent unused var */
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),ck2(xyz(0,0,0)),cp3));
- BOOST_TEST(is_greater(ck1(xyz(0,0,1)),ck2(xyz(0,1,0)),cp3));
- BOOST_TEST(is_greater(ck1(xyz(0,0,1)),ck2(xyz(0,0,0)),cp3));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0),cp3));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),TupleMaker::create(1),cp3));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),TupleMaker::create(-1),cp3));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0,0),cp3));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),TupleMaker::create(0,-1),cp3));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),TupleMaker::create(0,1),cp3));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,0)),TupleMaker::create(0,0,0),cp3));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),TupleMaker::create(0,0,1),cp3));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),TupleMaker::create(0,0,-1),cp3));
- typedef composite_key<
- xyz,
- BOOST_MULTI_INDEX_MEMBER(xyz,int,y), /* members reversed */
- BOOST_MULTI_INDEX_MEMBER(xyz,int,x)
- > ckey_t2;
- ckey_t2 ck5;
- BOOST_TEST(is_equiv (ck1(xyz(0,0,1)),ck5(xyz(0,0,0))));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),ck5(xyz(-1,1,0))));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),ck5(xyz(1,-1,0))));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,1)),ck5(xyz(0,0,0)),cp1));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),ck5(xyz(-1,1,0)),cp1));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),ck5(xyz(1,-1,0)),cp1));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,1)),ck5(xyz(0,0,0)),cp2));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),ck5(xyz(-1,1,0)),cp2));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),ck5(xyz(1,-1,0)),cp2));
- BOOST_TEST(is_equiv (ck1(xyz(0,0,1)),ck5(xyz(0,0,0)),cp3));
- BOOST_TEST(is_less (ck1(xyz(0,0,0)),ck5(xyz(-1,1,0)),cp3));
- BOOST_TEST(is_greater(ck1(xyz(0,0,0)),ck5(xyz(1,-1,0)),cp3));
- typedef multi_index_container<
- xyz,
- indexed_by<
- hashed_unique<ckey_t1>
- >
- > indexed_t2;
- indexed_t2 mc2;
- mc2.insert(xyz(0,0,0));
- mc2.insert(xyz(0,0,1));
- mc2.insert(xyz(0,1,0));
- mc2.insert(xyz(0,1,1));
- mc2.insert(xyz(1,0,0));
- mc2.insert(xyz(1,0,1));
- mc2.insert(xyz(1,1,0));
- mc2.insert(xyz(1,1,1));
- mc2.insert(xyz(0,0,0));
- mc2.insert(xyz(0,0,1));
- mc2.insert(xyz(0,1,0));
- mc2.insert(xyz(0,1,1));
- mc2.insert(xyz(1,0,0));
- mc2.insert(xyz(1,0,1));
- mc2.insert(xyz(1,1,0));
- mc2.insert(xyz(1,1,1));
- BOOST_TEST(mc2.size()==8);
- BOOST_TEST(mc2.find(TupleMaker::create(0,0,1))->z==1);
- BOOST_TEST(ck1(*(mc2.find(TupleMaker::create(1,0,1))))==
- TupleMaker::create(1,0,1));
- typedef composite_key<
- xystr,
- BOOST_MULTI_INDEX_MEMBER(xystr,std::string,str),
- BOOST_MULTI_INDEX_MEMBER(xystr,int,x),
- BOOST_MULTI_INDEX_MEMBER(xystr,int,y)
- > ckey_t3;
- ckey_t3 ck6;
- typedef composite_key_hash<
- boost::hash<std::string>,
- boost::hash<int>,
- boost::hash<int>
- > ckey_hash_t;
- ckey_hash_t ch1;
- ckey_hash_t ch2(ch1);
- ckey_hash_t ch3(
- boost::make_tuple(
- boost::hash<std::string>(),
- boost::hash<int>(),
- boost::hash<int>()));
- ckey_hash_t ch4(get<0>(ch1.key_hash_functions()));
- ch2=ch3; /* prevent unused var */
- ch3=ch4; /* prevent unused var */
- ch4=ch2; /* prevent unused var */
- BOOST_TEST(
- ch1(ck6(xystr(0,0,"hello")))==
- ch1(TupleMaker::create(std::string("hello"),0,0)));
- BOOST_TEST(
- ch1(ck6(xystr(4,5,"world")))==
- ch1(TupleMaker::create(std::string("world"),4,5)));
- typedef boost::hash<composite_key_result<ckey_t3> > ckeyres_hash_t;
- ckeyres_hash_t crh;
- BOOST_TEST(
- ch1(ck6(xystr(0,0,"hello")))==crh(ck6(xystr(0,0,"hello"))));
- BOOST_TEST(
- ch1(ck6(xystr(4,5,"world")))==crh(ck6(xystr(4,5,"world"))));
- }
- void test_composite_key()
- {
- test_composite_key_template<boost_tuple_maker>();
- #if !defined(BOOST_NO_CXX11_HDR_TUPLE)&&\
- !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
- test_composite_key_template<std_tuple_maker>();
- #endif
- }
|