test_composite_key.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 653 行 · 第 1/2 页

CPP
653
字号
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;};void test_composite_key(){  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#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)        ,composite_key_result_less<ckey_t1::result_type>#endif      >    >  > 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_CHECK(mc1.size()==8);  BOOST_CHECK(    std::distance(      mc1.find(mc1.key_extractor()(xyz(0,0,0))),      mc1.find(mc1.key_extractor()(xyz(1,0,0))))==4);  BOOST_CHECK(    std::distance(      mc1.find(make_tuple(0,0,0)),      mc1.find(make_tuple(1,0,0)))==4);  BOOST_CHECK(    std::distance(      mc1.lower_bound(make_tuple(0,0)),      mc1.upper_bound(make_tuple(1,0)))==6);#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)  BOOST_CHECK(    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()));  ck3=ck3; /* prevent unused var */  get<2>(ck4.key_extractors())=    get<2>(ck2.key_extractors());  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),ck2(xyz(0,0,0))));  BOOST_CHECK(is_less   (ck1(xyz(0,0,1)),ck2(xyz(0,1,0))));  BOOST_CHECK(is_greater(ck1(xyz(0,0,1)),ck2(xyz(0,0,0))));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(0)));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),make_tuple(1)));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),make_tuple(-1)));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(0,0)));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),make_tuple(0,1)));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),make_tuple(0,-1)));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(0,0,0)));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),make_tuple(0,0,1)));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),make_tuple(0,0,-1)));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(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_CHECK(is_equiv  (ck1(xyz(0,0,0)),ck2(xyz(0,0,0)),cp1,eq1));  BOOST_CHECK(is_less   (ck1(xyz(0,0,1)),ck2(xyz(0,1,0)),cp1,eq1));  BOOST_CHECK(is_greater(ck1(xyz(0,0,1)),ck2(xyz(0,0,0)),cp1,eq1));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(0),cp1));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),make_tuple(1),cp1));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),make_tuple(-1),cp1));#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),0,cp1));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),1,cp1));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),-1,cp1));#endif  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(0,0),cp1));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),make_tuple(0,1),cp1));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),make_tuple(0,-1),cp1));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(0,0,0),cp1,eq1));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),make_tuple(0,0,1),cp1,eq1));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),make_tuple(0,0,-1),cp1,eq1));  typedef composite_key_result_greater<ckey_t1::result_type> ckey_comp_t2;  ckey_comp_t2 cp2;  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),ck2(xyz(0,0,0)),cp2));  BOOST_CHECK(is_greater(ck1(xyz(0,0,1)),ck2(xyz(0,1,0)),cp2));  BOOST_CHECK(is_less   (ck1(xyz(0,0,1)),ck2(xyz(0,0,0)),cp2));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(0),cp2));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),make_tuple(1),cp2));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),make_tuple(-1),cp2));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(0,0),cp2));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),make_tuple(0,1),cp2));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),make_tuple(0,-1),cp2));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(0,0,0),cp2));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),make_tuple(0,0,1),cp2));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),make_tuple(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_CHECK( eq2(ck1(xyz(0,0,0)),ck1(xyz(0,0,0))));  BOOST_CHECK(!eq2(ck1(xyz(0,1,0)),ck1(xyz(0,0,0))));  BOOST_CHECK(!eq2(ck1(xyz(0,2,0)),ck1(xyz(0,0,0))));  BOOST_CHECK( eq2(ck1(xyz(0,3,0)),ck1(xyz(0,0,0))));  BOOST_CHECK(!eq2(ck1(xyz(1,0,0)),ck1(xyz(0,0,0))));  BOOST_CHECK(!eq2(ck1(xyz(1,1,0)),ck1(xyz(0,0,0))));  BOOST_CHECK(!eq2(ck1(xyz(1,2,0)),ck1(xyz(0,0,0))));  BOOST_CHECK(!eq2(ck1(xyz(1,3,0)),ck1(xyz(0,0,0))));  BOOST_CHECK( eq2(ck1(xyz(2,0,0)),ck1(xyz(0,0,0))));  BOOST_CHECK(!eq2(ck1(xyz(2,1,0)),ck1(xyz(0,0,0))));  BOOST_CHECK(!eq2(ck1(xyz(2,2,0)),ck1(xyz(0,0,0))));  BOOST_CHECK( eq2(ck1(xyz(2,3,0)),ck1(xyz(0,0,0))));  BOOST_CHECK( eq2(make_tuple(0,0,0),ck1(xyz(0,0,0))));  BOOST_CHECK(!eq2(ck1(xyz(0,1,0))  ,make_tuple(0,0,0)));  BOOST_CHECK(!eq2(make_tuple(0,2,0),ck1(xyz(0,0,0))));  BOOST_CHECK( eq2(ck1(xyz(0,3,0))  ,make_tuple(0,0,0)));  BOOST_CHECK(!eq2(make_tuple(1,0,0),ck1(xyz(0,0,0))));  BOOST_CHECK(!eq2(ck1(xyz(1,1,0))  ,make_tuple(0,0,0)));  BOOST_CHECK(!eq2(make_tuple(1,2,0),ck1(xyz(0,0,0))));  BOOST_CHECK(!eq2(ck1(xyz(1,3,0))  ,make_tuple(0,0,0)));  BOOST_CHECK( eq2(make_tuple(2,0,0),ck1(xyz(0,0,0))));  BOOST_CHECK(!eq2(ck1(xyz(2,1,0))  ,make_tuple(0,0,0)));  BOOST_CHECK(!eq2(make_tuple(2,2,0),ck1(xyz(0,0,0))));  BOOST_CHECK( eq2(ck1(xyz(2,3,0))  ,make_tuple(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_CHECK(is_equiv  (ck1(xyz(0,0,0)),ck2(xyz(0,0,0)),cp3));  BOOST_CHECK(is_greater(ck1(xyz(0,0,1)),ck2(xyz(0,1,0)),cp3));  BOOST_CHECK(is_greater(ck1(xyz(0,0,1)),ck2(xyz(0,0,0)),cp3));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(0),cp3));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),make_tuple(1),cp3));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),make_tuple(-1),cp3));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(0,0),cp3));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),make_tuple(0,-1),cp3));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),make_tuple(0,1),cp3));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,0)),make_tuple(0,0,0),cp3));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),make_tuple(0,0,1),cp3));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),make_tuple(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_CHECK(is_equiv  (ck1(xyz(0,0,1)),ck5(xyz(0,0,0))));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),ck5(xyz(-1,1,0))));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),ck5(xyz(1,-1,0))));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,1)),ck5(xyz(0,0,0)),cp1));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),ck5(xyz(-1,1,0)),cp1));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),ck5(xyz(1,-1,0)),cp1));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,1)),ck5(xyz(0,0,0)),cp2));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),ck5(xyz(-1,1,0)),cp2));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),ck5(xyz(1,-1,0)),cp2));  BOOST_CHECK(is_equiv  (ck1(xyz(0,0,1)),ck5(xyz(0,0,0)),cp3));  BOOST_CHECK(is_less   (ck1(xyz(0,0,0)),ck5(xyz(-1,1,0)),cp3));  BOOST_CHECK(is_greater(ck1(xyz(0,0,0)),ck5(xyz(1,-1,0)),cp3));  typedef multi_index_container<    xyz,    indexed_by<      hashed_unique<        ckey_t1#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)        ,composite_key_result_hash<ckey_t1::result_type>        ,composite_key_result_equal_to<ckey_t1::result_type>#endif      >    >  > 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_CHECK(mc2.size()==8);  BOOST_CHECK(mc2.find(make_tuple(0,0,1))->z==1);  BOOST_CHECK(ck1(*(mc2.find(make_tuple(1,0,1))))==make_tuple(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_CHECK(    ch1(ck6(xystr(0,0,"hello")))==ch1(make_tuple(std::string("hello"),0,0)));  BOOST_CHECK(    ch1(ck6(xystr(4,5,"world")))==ch1(make_tuple(std::string("world"),4,5)));  typedef boost::hash<composite_key_result<ckey_t3> > ckeyres_hash_t;  ckeyres_hash_t crh;  BOOST_CHECK(    ch1(ck6(xystr(0,0,"hello")))==crh(ck6(xystr(0,0,"hello"))));  BOOST_CHECK(    ch1(ck6(xystr(4,5,"world")))==crh(ck6(xystr(4,5,"world"))));}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?