composite_key.hpp
来自「support vector clustering for vc++」· HPP 代码 · 共 1,316 行 · 第 1/3 页
HPP
1,316 行
x.composite_key.key_extractors(),x.value,
y.composite_key.key_extractors(),y.value,
key_eqs());
}
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_eq_tuple>::value&&
tuples::length<key_extractor_tuple>::value==
tuples::length<key_tuple>::value);
return detail::equal_ckey_cval<
key_extractor_tuple,value_type,
key_tuple,key_eq_tuple
>::compare(x.composite_key.key_extractors(),x.value,y,key_eqs());
}
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_eq_tuple>::value&&
tuples::length<key_tuple>::value==
tuples::length<key_extractor_tuple>::value);
return detail::equal_ckey_cval<
key_extractor_tuple,value_type,
key_tuple,key_eq_tuple
>::compare(x,y.composite_key.key_extractors(),y.value,key_eqs());
}
};
/* 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());
}
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
template<typename CompositeKey,typename Value>
bool operator()(
const composite_key_result<CompositeKey>& x,
const Value& y)const
{
return operator()(x,make_tuple(cref(y)));
}
#endif
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());
}
#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING)
template<typename Value,typename CompositeKey>
bool operator()(
const Value& x,
const composite_key_result<CompositeKey>& y)const
{
return operator()(make_tuple(cref(x)),y);
}
#endif
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_hash */
template
<
BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_TEMPLATE_PARM,Hash)
>
struct composite_key_hash:
private tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Hash)>
{
private:
typedef tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Hash)> super;
public:
typedef super key_hasher_tuple;
composite_key_hash(
BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_CTOR_ARG,Hash)):
super(BOOST_MULTI_INDEX_CK_ENUM_PARAMS(k))
{}
composite_key_hash(const key_hasher_tuple& x):super(x){}
const key_hasher_tuple& key_hash_functions()const{return *this;}
key_hasher_tuple& key_hash_functions(){return *this;}
template<typename CompositeKey>
std::size_t operator()(const composite_key_result<CompositeKey> & x)const
{
typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple;
typedef typename CompositeKey::value_type value_type;
BOOST_STATIC_ASSERT(
tuples::length<key_extractor_tuple>::value==
tuples::length<key_hasher_tuple>::value);
return detail::hash_ckey<
key_extractor_tuple,value_type,
key_hasher_tuple
>::hash(x.composite_key.key_extractors(),x.value,key_hash_functions());
}
template<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value)>
std::size_t operator()(
const tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)>& x)const
{
typedef tuple<BOOST_MULTI_INDEX_CK_ENUM_PARAMS(Value)> key_tuple;
BOOST_STATIC_ASSERT(
tuples::length<key_tuple>::value==
tuples::length<key_hasher_tuple>::value);
return detail::hash_cval<
key_tuple,key_hasher_tuple
>::hash(x,key_hash_functions());
}
};
/* Instantiations of the former functors with "natural" basic components:
* composite_key_result_equal_to uses std::equal_to of the values.
* composite_key_result_less uses std::less.
* composite_key_result_greater uses std::greater.
* composite_key_result_hash uses boost::hash.
*/
#define BOOST_MULTI_INDEX_CK_RESULT_EQUAL_TO_SUPER \
composite_key_equal_to< \
BOOST_MULTI_INDEX_CK_ENUM( \
BOOST_MULTI_INDEX_CK_APPLY_METAFUNCTION_N, \
/* the argument is a PP list */ \
(detail::nth_composite_key_equal_to, \
(BOOST_DEDUCED_TYPENAME CompositeKeyResult::composite_key_type, \
BOOST_PP_NIL))) \
>
template<typename CompositeKeyResult>
struct composite_key_result_equal_to:
BOOST_MULTI_INDEX_PRIVATE_IF_USING_DECL_FOR_TEMPL_FUNCTIONS
BOOST_MULTI_INDEX_CK_RESULT_EQUAL_TO_SUPER
{
private:
typedef BOOST_MULTI_INDEX_CK_RESULT_EQUAL_TO_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_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_FUNCTIONS
BOOST_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_FUNCTIONS
BOOST_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();
};
#define BOOST_MULTI_INDEX_CK_RESULT_HASH_SUPER \
composite_key_hash< \
BOOST_MULTI_INDEX_CK_ENUM( \
BOOST_MULTI_INDEX_CK_APPLY_METAFUNCTION_N, \
/* the argument is a PP list */ \
(detail::nth_composite_key_hash, \
(BOOST_DEDUCED_TYPENAME CompositeKeyResult::composite_key_type, \
BOOST_PP_NIL))) \
>
template<typename CompositeKeyResult>
struct composite_key_result_hash:
BOOST_MULTI_INDEX_PRIVATE_IF_USING_DECL_FOR_TEMPL_FUNCTIONS
BOOST_MULTI_INDEX_CK_RESULT_HASH_SUPER
{
private:
typedef BOOST_MULTI_INDEX_CK_RESULT_HASH_SUPER super;
public:
typedef CompositeKeyResult argument_type;
typedef std::size_t result_type;
using super::operator();
};
} /* namespace multi_index */
} /* namespace boost */
/* Specializations of std::equal_to, std::less, std::greater and boost::hash
* for composite_key_results enabling interoperation with tuples of values.
*/
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
namespace std{
template<typename CompositeKey>
struct equal_to<boost::multi_index::composite_key_result<CompositeKey> >:
boost::multi_index::composite_key_result_equal_to<
boost::multi_index::composite_key_result<CompositeKey>
>
{
};
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 */
namespace boost{
template<typename CompositeKey>
struct hash<boost::multi_index::composite_key_result<CompositeKey> >:
boost::multi_index::composite_key_result_hash<
boost::multi_index::composite_key_result<CompositeKey>
>
{
};
} /* namespace boost */
#else
/* Lacking template partial specialization, std::equal_to, std::less and
* std::greater will still work for composite_key_results although without
* tuple interoperability. To achieve the same graceful degrading with
* boost::hash, we define the appropriate hash_value overload.
*/
namespace boost{
#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
namespace multi_index{
#endif
template<typename CompositeKey>
inline std::size_t hash_value(
const boost::multi_index::composite_key_result<CompositeKey>& x)
{
boost::multi_index::composite_key_result_hash<
boost::multi_index::composite_key_result<CompositeKey> > h;
return h(x);
}
#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
} /* namespace multi_index */
#endif
} /* namespace boost */
#endif
#undef BOOST_MULTI_INDEX_CK_RESULT_HASH_SUPER
#undef BOOST_MULTI_INDEX_CK_RESULT_GREATER_SUPER
#undef BOOST_MULTI_INDEX_CK_RESULT_LESS_SUPER
#undef BOOST_MULTI_INDEX_CK_RESULT_EQUAL_TO_SUPER
#undef BOOST_MULTI_INDEX_CK_COMPLETE_COMP_OPS
#undef BOOST_MULTI_INDEX_CK_IDENTITY_ENUM_MACRO
#undef BOOST_MULTI_INDEX_CK_NTH_COMPOSITE_KEY_FUNCTOR
#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 + =
减小字号Ctrl + -
显示快捷键?