📄 composite_key.hpp
字号:
} 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 + -