⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 composite_key.hpp

📁 CGAL is a collaborative effort of several sites in Europe and Israel. The goal is to make the most i
💻 HPP
📖 第 1 页 / 共 2 页
字号:
  }  static bool compare(    const ValCons& vc,const KeyCons& c,const Value& v,    const CompareCons& comp)  {    if(comp.get_head()(vc.get_head(),c.get_head()(v)))return true;    if(comp.get_head()(c.get_head()(v),vc.get_head()))return false;    return compare_ckey_cval<      BOOST_DEDUCED_TYPENAME KeyCons::tail_type,Value,      BOOST_DEDUCED_TYPENAME ValCons::tail_type,      BOOST_DEDUCED_TYPENAME CompareCons::tail_type    >::compare(vc.get_tail(),c.get_tail(),v,comp.get_tail());  }};template<  typename KeyCons,typename Value,  typename ValCons,typename CompareCons>struct compare_ckey_cval:  mpl::if_<    mpl::or_<      is_same<KeyCons,tuples::null_type>,      is_same<ValCons,tuples::null_type>    >,    compare_ckey_cval_terminal<KeyCons,Value,ValCons,CompareCons>,    compare_ckey_cval_normal<KeyCons,Value,ValCons,CompareCons>  >::type{};} /* namespace multi_index::detail *//* composite_key_result */template<typename CompositeKey>struct composite_key_result{  typedef CompositeKey                            composite_key_type;  typedef typename composite_key_type::value_type value_type;  composite_key_result(    const composite_key_type& composite_key_,const value_type& value_):    composite_key(composite_key_),value(value_)  {}  const composite_key_type& composite_key;  const value_type&         value;};/* composite_key *//* NB. Some overloads of operator() have an extra dummy parameter int=0. * This disambiguator serves several purposes: *  - Without it, MSVC++ 6.0 incorrectly regards some overloads as *    specializations of a previous member function template. *  - MSVC++ 6.0/7.0 seem to incorrectly treat some different memfuns *    as if they have the same signature. *  - If remove_const is broken due to lack of PTS, int=0 avoids the *    declaration of memfuns with identical signature. */template<  typename Value,  BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_TEMPLATE_PARM,KeyFromValue)>struct composite_key:  private tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(KeyFromValue)>{private:  typedef tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(KeyFromValue)> super;public:  typedef super                               key_extractor_tuple;  typedef Value                               value_type;  typedef composite_key_result<composite_key> result_type;  composite_key(    BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_CTOR_ARG,KeyFromValue)):    super(BOOST_MULTI_INDEX_CK_ENUM_PARAMS(k))  {}  composite_key(const key_extractor_tuple& x):super(x){}  const key_extractor_tuple& key_extractors()const{return *this;}  key_extractor_tuple&       key_extractors(){return *this;}  template<typename ChainedPtr>  result_type operator()(const ChainedPtr& x)const  {    return operator()(*x);  }  result_type operator()(const value_type& x)const  {    return result_type(*this,x);  }  result_type operator()(const reference_wrapper<const value_type>& x)const  {    return result_type(*this,x.get());  }  result_type operator()(const reference_wrapper<value_type>& x,int=0)const  {    return result_type(*this,x.get());  }};/* comparison operators *//* == */template<typename CompositeKey1,typename CompositeKey2>inline bool operator==(  const composite_key_result<CompositeKey1>& x,  const composite_key_result<CompositeKey2>& y){  typedef typename CompositeKey1::key_extractor_tuple key_extractor_tuple1;  typedef typename CompositeKey1::value_type          value_type1;  typedef typename CompositeKey2::key_extractor_tuple key_extractor_tuple2;  typedef typename CompositeKey2::value_type          value_type2;  BOOST_STATIC_ASSERT(    tuples::length<key_extractor_tuple1>::value==    tuples::length<key_extractor_tuple2>::value);  return detail::equals_ckey_ckey<    key_extractor_tuple1,value_type1,    key_extractor_tuple2,value_type2  >::compare(    x.composite_key.key_extractors(),x.value,    y.composite_key.key_extractors(),y.value);}template<  typename CompositeKey,  BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value)>inline bool operator==(  const composite_key_result<CompositeKey>& x,  const tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)>& y){  typedef typename CompositeKey::key_extractor_tuple     key_extractor_tuple;  typedef typename CompositeKey::value_type              value_type;  typedef tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)> key_tuple;    BOOST_STATIC_ASSERT(    tuples::length<key_extractor_tuple>::value==    tuples::length<key_tuple>::value);  return detail::equals_ckey_cval<key_extractor_tuple,value_type,key_tuple>::    compare(x.composite_key.key_extractors(),x.value,y);}template<  BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value),  typename CompositeKey>inline bool operator==(  const tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)>& x,  const composite_key_result<CompositeKey>& y){  typedef typename CompositeKey::key_extractor_tuple     key_extractor_tuple;  typedef typename CompositeKey::value_type              value_type;  typedef tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)> key_tuple;    BOOST_STATIC_ASSERT(    tuples::length<key_extractor_tuple>::value==    tuples::length<key_tuple>::value);  return detail::equals_ckey_cval<key_extractor_tuple,value_type,key_tuple>::    compare(x,y.composite_key.key_extractors(),y.value);}/* < */template<typename CompositeKey1,typename CompositeKey2>inline bool operator<(  const composite_key_result<CompositeKey1>& x,  const composite_key_result<CompositeKey2>& y){  typedef typename CompositeKey1::key_extractor_tuple key_extractor_tuple1;  typedef typename CompositeKey1::value_type          value_type1;  typedef typename CompositeKey2::key_extractor_tuple key_extractor_tuple2;  typedef typename CompositeKey2::value_type          value_type2;  return detail::less_ckey_ckey<   key_extractor_tuple1,value_type1,   key_extractor_tuple2,value_type2  >::compare(    x.composite_key.key_extractors(),x.value,    y.composite_key.key_extractors(),y.value);}template<  typename CompositeKey,  BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value)>inline bool operator<(  const composite_key_result<CompositeKey>& x,  const tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)>& y){  typedef typename CompositeKey::key_extractor_tuple     key_extractor_tuple;  typedef typename CompositeKey::value_type              value_type;  typedef tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)> key_tuple;    return detail::less_ckey_cval<key_extractor_tuple,value_type,key_tuple>::    compare(x.composite_key.key_extractors(),x.value,y);}template<  BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value),  typename CompositeKey>inline bool operator<(  const tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)>& x,  const composite_key_result<CompositeKey>& y){  typedef typename CompositeKey::key_extractor_tuple     key_extractor_tuple;  typedef typename CompositeKey::value_type              value_type;  typedef tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)> key_tuple;    return detail::less_ckey_cval<key_extractor_tuple,value_type,key_tuple>::    compare(x,y.composite_key.key_extractors(),y.value);}/* rest of comparison operators */#define BOOST_MULTI_INDEX_CK_COMPLETE_COMP_OPS(t1,t2,a1,a2)                  \template<t1,t2> inline bool operator!=(const a1& x,const a2& y)              \{                                                                            \  return !(x==y);                                                            \}                                                                            \                                                                             \template<t1,t2> inline bool operator>(const a1& x,const a2& y)               \{                                                                            \  return y<x;                                                                \}                                                                            \                                                                             \template<t1,t2> inline bool operator>=(const a1& x,const a2& y)              \{                                                                            \  return !(x<y);                                                             \}                                                                            \                                                                             \template<t1,t2> inline bool operator<=(const a1& x,const a2& y)              \{                                                                            \  return !(y<x);                                                             \}BOOST_MULTI_INDEX_CK_COMPLETE_COMP_OPS(  typename CompositeKey1,  typename CompositeKey2,  composite_key_result<CompositeKey1>,  composite_key_result<CompositeKey2>)BOOST_MULTI_INDEX_CK_COMPLETE_COMP_OPS(  typename CompositeKey,  BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value),  composite_key_result<CompositeKey>,  tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)>)BOOST_MULTI_INDEX_CK_COMPLETE_COMP_OPS(  BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value),  typename CompositeKey,  tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)>,  composite_key_result<CompositeKey>)/* composite_key_compare */template<  BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_TEMPLATE_PARM,Compare)>struct composite_key_compare:  private tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Compare)>{private:  typedef tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Compare)> super;public:  typedef super key_comp_tuple;  composite_key_compare(    BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_CTOR_ARG,Compare)):    super(BOOST_MULTI_INDEX_CK_ENUM_PARAMS(k))  {}  composite_key_compare(const key_comp_tuple& x):super(x){}  const key_comp_tuple& key_comps()const{return *this;}  key_comp_tuple&       key_comps(){return *this;}  template<typename CompositeKey1,typename CompositeKey2>  bool operator()(    const composite_key_result<CompositeKey1> & x,    const composite_key_result<CompositeKey2> & y)const  {    typedef typename CompositeKey1::key_extractor_tuple key_extractor_tuple1;    typedef typename CompositeKey1::value_type          value_type1;    typedef typename CompositeKey2::key_extractor_tuple key_extractor_tuple2;    typedef typename CompositeKey2::value_type          value_type2;    BOOST_STATIC_ASSERT(      tuples::length<key_extractor_tuple1>::value<=      tuples::length<key_comp_tuple>::value||      tuples::length<key_extractor_tuple2>::value<=      tuples::length<key_comp_tuple>::value);    return detail::compare_ckey_ckey<      key_extractor_tuple1,value_type1,      key_extractor_tuple2,value_type2,      key_comp_tuple    >::compare(      x.composite_key.key_extractors(),x.value,      y.composite_key.key_extractors(),y.value,      key_comps());  }    template  <    typename CompositeKey,    BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value)  >  bool operator()(    const composite_key_result<CompositeKey>& x,    const tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)>& y)const  {    typedef typename CompositeKey::key_extractor_tuple     key_extractor_tuple;    typedef typename CompositeKey::value_type              value_type;    typedef tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)> key_tuple;    BOOST_STATIC_ASSERT(      tuples::length<key_extractor_tuple>::value<=      tuples::length<key_comp_tuple>::value||      tuples::length<key_tuple>::value<=      tuples::length<key_comp_tuple>::value);    return detail::compare_ckey_cval<      key_extractor_tuple,value_type,      key_tuple,key_comp_tuple    >::compare(x.composite_key.key_extractors(),x.value,y,key_comps());  }  template  <    BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value),    typename CompositeKey  >  bool operator()(    const tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)>& x,    const composite_key_result<CompositeKey>& y)const  {    typedef typename CompositeKey::key_extractor_tuple     key_extractor_tuple;    typedef typename CompositeKey::value_type              value_type;    typedef tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)> key_tuple;    BOOST_STATIC_ASSERT(      tuples::length<key_tuple>::value<=      tuples::length<key_comp_tuple>::value||      tuples::length<key_extractor_tuple>::value<=      tuples::length<key_comp_tuple>::value);    return detail::compare_ckey_cval<      key_extractor_tuple,value_type,      key_tuple,key_comp_tuple    >::compare(x,y.composite_key.key_extractors(),y.value,key_comps());  }};/* composite_key_compare_less is merely a composite_key_compare * instantiation with the corresponding std::less<> comparison * predicates for each key extractor. Useful as a substitute for * std::less<CompositeKey::result_type> when the compiler does not * support partial specialization. * Same with composite_key_compare_greater. */#define BOOST_MULTI_INDEX_CK_RESULT_LESS_SUPER                               \composite_key_compare<                                                       \    BOOST_MULTI_INDEX_CK_ENUM(                                               \      BOOST_MULTI_INDEX_CK_APPLY_METAFUNCTION_N,                             \      /* the argument is a PP list */                                        \      (detail::nth_composite_key_less,                                       \        (BOOST_DEDUCED_TYPENAME CompositeKeyResult::composite_key_type,      \          BOOST_PP_NIL)))                                                    \  >template<typename CompositeKeyResult>struct composite_key_result_less:BOOST_MULTI_INDEX_PRIVATE_IF_USING_DECL_FOR_TEMPL_FUNCTIONSBOOST_MULTI_INDEX_CK_RESULT_LESS_SUPER{private:  typedef BOOST_MULTI_INDEX_CK_RESULT_LESS_SUPER super;public:  typedef CompositeKeyResult  first_argument_type;  typedef first_argument_type second_argument_type;  typedef bool                result_type;  using super::operator();};#define BOOST_MULTI_INDEX_CK_RESULT_GREATER_SUPER                            \composite_key_compare<                                                       \    BOOST_MULTI_INDEX_CK_ENUM(                                               \      BOOST_MULTI_INDEX_CK_APPLY_METAFUNCTION_N,                             \      /* the argument is a PP list */                                        \      (detail::nth_composite_key_greater,                                    \        (BOOST_DEDUCED_TYPENAME CompositeKeyResult::composite_key_type,      \          BOOST_PP_NIL)))                                                    \  >template<typename CompositeKeyResult>struct composite_key_result_greater:BOOST_MULTI_INDEX_PRIVATE_IF_USING_DECL_FOR_TEMPL_FUNCTIONSBOOST_MULTI_INDEX_CK_RESULT_GREATER_SUPER{private:  typedef BOOST_MULTI_INDEX_CK_RESULT_GREATER_SUPER super;public:  typedef CompositeKeyResult  first_argument_type;  typedef first_argument_type second_argument_type;  typedef bool                result_type;  using super::operator();};} /* namespace multi_index */} /* namespace boost *//* Specialization of std::less and std::greater for composite_key_results * enabling comparison with tuples of values. */#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)namespace std{template<typename CompositeKey>struct less<boost::multi_index::composite_key_result<CompositeKey> >:  boost::multi_index::composite_key_result_less<    boost::multi_index::composite_key_result<CompositeKey>  >{};template<typename CompositeKey>struct greater<boost::multi_index::composite_key_result<CompositeKey> >:  boost::multi_index::composite_key_result_greater<    boost::multi_index::composite_key_result<CompositeKey>  >{};} /* namespace std */#endif#undef BOOST_MULTI_INDEX_CK_RESULT_LESS_SUPER#undef BOOST_MULTI_INDEX_CK_RESULT_GREATER_SUPER#undef BOOST_MULTI_INDEX_CK_COMPLETE_COMP_OPS#undef BOOST_MULTI_INDEX_CK_APPLY_METAFUNCTION_N#undef BOOST_MULTI_INDEX_CK_CTOR_ARG#undef BOOST_MULTI_INDEX_CK_TEMPLATE_PARM#undef BOOST_MULTI_INDEX_CK_ENUM_PARAMS#undef BOOST_MULTI_INDEX_CK_ENUM#undef BOOST_MULTI_INDEX_COMPOSITE_KEY_SIZE#endif

⌨️ 快捷键说明

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