Классы извлечения ключей используются индексами на основе ключей для получения ключей индексации из элементов multi_index_container. Класс CopyConstructible и CopyAssignableKeyFromValue считается ключевым экстрактором из типа Type, если
Ключевые экстракторы, предоставленные Boost. Мультииндексы шаблонизируются в соответствии с типом Type и служат для извлечения ключей не только из объектов типа Type, но и из эталонных оберток, предоставляемых Boost.Ref и от цепных указателей до Type (или для эталонных оберток Type): a цепной указатель - это любой тип P, такой, что для объекта p или boost::reference_wrapper, OR, , то есть, цепные указатели являются произвольными композициями указателей Type& или boost: или boost: <439>>"boost/multi_index/key_extractors.hpp"
Synopsis boostidentity>.boost>.boost50>mem_fun>.53>multi_index51> Этот заголовок включает в себя все ключевые экстракторы, предоставляемые Boost. MultiIndex.*pдает объект типаType&илиboost::reference_wrapper<Type>, ИЛИ
*pпривязывается кType,
that is, chained pointers are arbitrary compositions of pointer-like objects
ultimately dereferencing to values of Type& or
boost::reference_wrapper<Type>.
identity — это Key Extractor, который действует как функтор идентичности «ничего».
template<typenameType>structidentity{typedefTyperesult_type;// only provided if const ChainedPtr& is not convertible to const Type&template<typenameChainedPtr>Type&operator()(constChainedPtr&x)const;constType&operator()(constType&x)const;Type&operator()(Type&x)const;// only provided if Type is non-const
// only provided if Type is non-constconstType&operator()(constreference_wrapper<constType>&x)const;// only provided if Type is constType&operator()(constreference_wrapper<typenameremove_const<Type>::type>&x)const;Type&operator()(constreference_wrapper<Type>&x)const;};
member - это Key Extractor, предназначенный для доступа к данному члену класса.
template<classClass,typenameType,TypeClass::*PtrToMember>structmember{typedefTyperesult_type;// only provided if const ChainedPtr& is not convertible to const Class&template<typenameChainedPtr>Type&operator()(constChainedPtr&x)const;constType&operator()(constClass&x)const;Type&operator()(Class&x)const;// only provided if Type is non-constconstType&operator()(constreference_wrapper<constClass>&x)const;Type&operator()(constreference_wrapper<Class>&x)const;};
Аргумент шаблона PtrToMember определяет конкретный указатель Type Class::* для извлеченного члена. member является моделью:
member_offset был разработан для преодоления ограничений некоторых устаревших компиляторов. Для получения дополнительной информации обратитесь к бывшей версии Boost.MultiIndex.
Этот макрос был разработан как механизм переносимости для унаследованных компиляторов, где member не может поддерживаться. Таким образом, он больше не нужен в современных средах, хотя некоторые пользователи все еще могут предпочесть его простому member, потому что он обеспечивает немного более краткий синтаксис.
const_mem_fun - это Ключевой экстрактор, возвращающийся в качестве ключа в результате вызова данной постоянной функции члена класса.
template<classClass,typenameType,Type(Class::*PtrToMemberFunction)()const>structconst_mem_fun{typedeftypenameremove_reference<Type>::typeresult_type;// only provided if const ChainedPtr& is not convertible to const Class&template<typenameChainedPtr>Typeoperator()(constChainedPtr&x)const;Typeoperator()(constClass&x)const;Typeoperator()(constreference_wrapper<constClass>&x)const;Typeoperator()(constreference_wrapper<Class>&x)const;};
Аргумент шаблона PtrToMemberFunction определяет конкретный Type (класс:::*PtrToMemberFunction)()const указатель на функцию постоянного члена, используемую в извлечении. const_mem_fun является моделью:
mem_fun представляет собой Key Extractor возвращающийся в качестве ключа в результате вызова данной функции члена класса.
template<classClass,typenameType,Type(Class::*PtrToMemberFunction)()>structmem_fun{typedeftypenameremove_reference<Type>::typeresult_type;// only provided if ChainedPtr& is not convertible to Class&template<typenameChainedPtr>Typeoperator()(constChainedPtr&x)const;Typeoperator()(Class&x)const;Typeoperator()(constreference_wrapper<Class>&x)const;};
Аргумент шаблона PtrToMemberFunction определяет конкретный Type (класс:::*PtrToMemberFunction)() указатель на функцию члена, используемую в извлечении. mem_fun представляет собой модель:
Эти экстракторы были предоставлены в качестве обходного пути для MSVC++. 6.0, а теперь обесценились. Для получения дополнительной информации обратитесь к бывшей версии Boost.MultiIndex.
Переносимость макросов для использования const_mem_fun и mem_fun. Хотя в современных компиляторах больше нет необходимости, некоторые пользователи все же могут прибегнуть к ним, поскольку они обеспечивают немного более краткий синтаксис.
global_fun представляет собой Key Extractor, основанный на заданной глобальной или статической функции члена, принимающей базовый тип в качестве аргумента и возвращающей связанный ключ.
template<classValue,typenameType,Type(*PtrToFunction)(Value)>structglobal_fun{typedeftypenameremove_reference<Type>::typeresult_type;// Only provided under the following circumstances:
// - If Value is a reference to a constant type, only provided
// when const ChainedPtr& is not convertible to Value;
// - if Value is a reference to a non-const type, only provided
// when ChainedPtr& is not convertible to Value;
// - else, only provided when const ChainedPtr& is not
// convertible to const Value&.Typeoperator()(constChainedPtr&x)const;// only provided if Value is a reference typeTypeoperator()(Valuex)const;// only provided if Value is not a reference typeTypeoperator()(constValue&x)const;// only provided if Value is not a reference typeTypeoperator()(constreference_wrapper<constValue>&x)const;// only provided if Value is a reference typeTypeoperator()(constreference_wrapper<remove_reference<Value>::type>&x)const;// only provided if Value is not a reference type or is
// a reference to a constant typeTypeoperator()(constreference_wrapper<typenameremove_const<typenameremove_reference<Value>::type>::type>&x)const;};
PtrToFunction определяет конкретную функцию, используемую для извлечения ключа типа Type из некоторого BaseType. global_fun поддерживает следующие подписи функций:
Type f(BaseType)ValueявляетсяBaseType,
Type f(const BaseType&)Const BaseType&,
Type f(BaseType&)ValueявляетсяBaseType&.
global_fun< Type,Value,PtrToFunction> представляет собой модель:
namespaceboost{namespacemulti_index{template<typenameValue,typenameKeyFromValue0,...,typenameKeyFromValuen>structcomposite_key;template<typenameCompositeKey>structcomposite_key_result;// comparison operators for composite_key_result:// OP is any of ==,<,!=,>,>=,<=template<typenameCompositeKey1,typenameCompositeKey2>booloperatorOP(constcomposite_key_result<CompositeKey1>&x,constcomposite_key_result<CompositeKey2>&y);template<typenameCompositeKey,typename...Values>booloperatorOP(constcomposite_key_result<CompositeKey>&x,conststd::tuple<Values...>&y);template<typenameCompositeKey,typename...Values>booloperatorOP(conststd::tuple<Values...>&x,constcomposite_key_result<CompositeKey>&y);template<typenameCompositeKey,typenameValue0,...,typenameValuen>booloperatorOP(constcomposite_key_result<CompositeKey>&x,constboost::tuple<Value0,...,Valuen>&y);template<typenameValue0,...,typenameValuen,typenameCompositeKey>booloperatorOP(constboost::tuple<Value0,...,Valuen>&x,constcomposite_key_result<CompositeKey>&y);// equality functors:template<typenamePred0,...,typenamePredn>structcomposite_key_equal_to;template<typenameCompositeKeyResult>structcomposite_key_result_equal_to;// deprecated// comparison functors:template<typenameCompare0,...,typenameComparen>structcomposite_key_compare;template<typenameCompositeKeyResult>structcomposite_key_result_less;// deprecatedtemplate<typenameCompositeKeyResult>structcomposite_key_result_greater;// deprecated// hash functors:template<typenameHash0,...,typenameHashn>structcomposite_key_hash;template<typenameCompositeKeyResult>structcomposite_key_result_hash;// deprecated}// namespace boost::multi_index}// namespace boost// specializations of external functors for composite_key_result:namespacestd{template<typenameCompositeKey>structequal_to<boost::multi_index::composite_key_result<CompositeKey>>;template<typenameCompositeKey>structless<boost::multi_index::composite_key_result<CompositeKey>>;template<typenameCompositeKey>structgreater<boost::multi_index::composite_key_result<CompositeKey>>;}// namespace stdnamespaceboost{template<typenameCompositeKey>structhash<boost::multi_index::composite_key_result<CompositeKey>>;}// namespace boost
composite_key представляет собой Key Extractor возвращающий комбинированное значение нескольких ключевых экстракторов, тип которых указан во время компиляции. Возвращенный объект имеет тип composite_key_result.
template<typenameValue,typenameKeyFromValue0,...,typenameKeyFromValuen>structcomposite_key{typedefboost::tuple<KeyFromValue0,...,KeyFromValuen>key_extractor_tuple;typedefValuevalue_type;typedefcomposite_key_result<composite_key>result_type;composite_key(constKeyFromValue0&k0=KeyFromValue0(),...constKeyFromValuen&kn=KeyFromValuen());composite_key(constkey_extractor_tuple&x);constkey_extractor_tuple&key_extractors()const;key_extractor_tuple&key_extractors()// only provided if const ChainedPtr& is not convertible to const value_type&template<typenameChainedPtr>result_typeoperator()(constChainedPtr&x)const;result_typeoperator()(constvalue_type&x)const;result_typeoperator()(constreference_wrapper<constvalue_type>&x)const;result_typeoperator()(constreference_wrapper<value_type>&x)const;};
KeyFromValue0, ..., KeyFromValuen представляют собой типы ключевых экстракторов, объединенных в композитный ключ. Каждый из этих типов должен быть Ключевой Исследователь от Ценность. По крайней мере, должен быть обеспечен ключевой экстрактор. Определено максимальное количество ключевых экстракторов инстанциации composite_key. composite_key внутренне хранит объект каждого типа составного ключа. composite_key< Ценность,KeyFrom Value0, ... KeyFromValuen> представляет собой модель:
Requires:ChainedPtr is a chained pointer
type to result_type. Returns: a result_type object dependent on
*this and y, where y is the
object chained-pointed to by x.
result_type operator()(const value_type& x)const;
Returns: a result_type object dependent on
*this and x.
Это непрозрачный тип, возвращаемый инстанциациями composite_key в качестве извлеченного ключа.
template<typenameCompositeKey>structcomposite_key_result{no public interface available};// comparison:// OP is any of ==,<,!=,>,>=,<=template<typenameCompositeKey1,typenameCompositeKey2>booloperatorOP(constcomposite_key_result<CompositeKey1>&x,constcomposite_key_result<CompositeKey2>&y);template<typenameCompositeKey,typename...Values>booloperatorOP(constcomposite_key_result<CompositeKey>&x,conststd::tuple<Values...>&y);template<typenameCompositeKey,typename...Values>booloperatorOP(conststd::tuple<Values...>&x,constcomposite_key_result<CompositeKey>&y);template<typenameCompositeKey,typenameValue0,...,typenameValuen>booloperatorOP(constcomposite_key_result<CompositeKey>&x,constboost::tuple<Value0,...,Valuen>&y);template<typenameValue0,...,typenameValuen,typenameCompositeKey>booloperatorOP(constboost::tuple<Value0,...,Valuen>&x,constcomposite_key_result<CompositeKey>&y);
CompositeKey is the composite_key instantiation to
which the composite_key_result type is associated. Objects of type
composite_key_result returned by a composite key must be always treated
as temporary, i.e. they should not be stored or copied.
composite_key_result is not guaranteed to be
DefaultConstructible or CopyAssignable.
Every object of type composite_key_result<CompositeKey> is
internally associated to the CompositeKey from which it is returned
and the object of type CompositeKey::value_type to which the
composite key was applied.
Requires:length(x)==length(y). The expression
xi==yi is valid for all i
in [0,length(x)). Returns:true if and only if
xi==yi for all i
in [0,length(x)).
Complexity: No more key extraction operations and comparisons
are performed than those necessary for the evaluation of the expression above,
starting at i==0. The evaluation is short-circuited as soon as
the result is determined to be false.
Requires: The expressions
xi<yi and
yi<xi are valid for all i
in [0,min(length(x),length(y))). Returns:true if and only if there exists some
j in the range [0,min(length(x),length(y)))
such that
!(xi<yi) && !(yi<xi)
for all i in [0,j), xj<yj.
Complexity: No more key extraction operations and comparisons
are performed than those necessary for the evaluation of the expression above,
starting at i==0. The evaluation is short-circuited as soon as
the result is determined to be false.
composite_key_equal_to тесты на равенство между composite_key_result и между этими и наборами значений, используя внутренне сохраненный набор элементарных предикатов равенства.
Pred0, ..., Predn представляют собой типы двоичных предикатов равенства, сохраненных composite_key_equal_to. Каждый из этих предикатов должен быть CopyConstructible и CopyAssignable. По крайней мере, должен быть установлен принцип равенства. Определено максимальное число предикатов равенства для инстанциации composite_key_equal_to. composite_key_equal_to является CopyConstructible и CopyAssignable. Это также DefaultConstructible, если каждый Predi в свою очередь является DefaultConstructible.
Обратите внимание, что формально не требуется, чтобы типы Predi вели себя как предикаты равенства каким-либо определенным образом. Однако семантика composite_key_equal_to хорошо определена, если это так, как объясняется в разделе семантика composite_key_result.
Notation
В дальнейшем мы используем ту же нотацию , введенную для composite_key_result.
Требуется:длина(x)==длина(y). Выражения key_eqs(.get()(xi) и key_eqs(.get()()()()()(yi,xi) действительны для всех i в [0, длина(x)). Возврат:True если и только
key_eqs(.get()(xi,yi) для всех i в [0, длина(x)).
Комплексность: Не выполняется больше операций извлечения ключей и сравнений, чем те, которые необходимы для оценки выражения выше, начиная с i==0. Оценка выполняется с коротким замыканием, как только результат определен как ложный .
std::equal_to, с CompositeKeyResult инстанциацией composite_key_result, ведет себя как конкретизация composite_key_equal_to, где все предоставленные предикаты сравнения являются инстанциациями std::equal_to.
CompositeKeyResult должен представлять собой инстанциацию composite_key_result для некоторого типа composite_key. std::equal:to::operator() эквивалентен composite_key_equal_to::operator():, принимая
Predi = std::equal_to для всех i = 0,...,n
В дополнение к требованиям Predi, предъявляемым composite_key_equal_to, каждый из этих типов должен быть DefaultConstructible. std::equal_to - DefaultConstructible, CopyConstructible и CopyAssignable.
composite_key_compare сравнивает composite_key_result с наборами значений, используя внутренне сохраненный набор элементарных сравнительных предикатов.
Compare0, ..., Comparen представляют собой типы сравнительных бинарных предикатов, сохраненных composite_key_compare. Каждый из этих предикатов должен быть CopyConstructible и CopyAssignable. По крайней мере, должен быть приведен сравнительный предикат. Определено максимальное количество сравнительных предикатов инстанциации composite_key_compare. composite_key_compare является CopyConstructible и CopyAssignable. Это также DefaultConstructible, если каждый Comparei в свою очередь является DefaultConstructible.
Обратите внимание, что формально не требуется, чтобы типы Comparei вели себя как предикаты сравнения каким-либо определенным образом. Однако семантика composite_key_compare хорошо определена, если это так, как объясняется в разделе семантика composite_key_result.
Notation
В дальнейшем мы используем ту же самую нотацию , введенную для composite_key_result.
Требуется: Выражения key_comps().get()(xi) и key_comps().get()()()(yi,xi) действительны для всех ii,xj,y
Комплексность:[2>[0,min(length(x),length(y)), так что
!key_comps().get()(xi) &&!key_comps()&&!key_comps() для всех ii,xj.
Комплексность: Не выполняется больше операций извлечения ключей и сравнений, чем те, которые необходимы для оценки выражения выше, начиная с i==0. Оценка замыкается, как только результат определен как ложный .
std::less, с CompositeKeyResult инстанциацией composite_key_result, ведет себя как конкретизация composite_key_compare, где все поставляемые сравнительные предикаты представляют собой инстанциации std::less.
CompositeKeyResult должен представлять собой инстанциацию composite_key_result для некоторого типа composite_key. std::less::operator() эквивалентен composite_key_compare::operator(), принимая
Comparei = std::less для всех i = 0,...,n
В дополнение к требованиям Comparei, предъявляемым composite_key_compare, каждый из этих типов должен быть DefaultConstructible. std::less является CopyConstructible, CopyConstructible и CopyAssignable.
std:: greater, с CompositeKeyResult инстанциацией composite_key_result, ведет себя как конкретизация composite_key_compare, где все поставляемые сравнительные предикаты представляют собой инстанциации std:: greater.
CompositeKeyResult должен представлять собой инстанциацию composite_key_result для некоторого типа composite_key. std:: greater::operator() эквивалентен composite_key_compare::operator():, принимая
Comparei = std:: greater для всех i = 0,...,n.
В дополнение к требованиям Comparei, предъявляемым composite_key_compare, каждый из этих типов должен быть DefaultConstructible. std:: greater - CopyConstructible, CopyConstructible и CopyAssignable.
Hash0, ..., Hashn - это типы объектов хеш-унарных функций, хранящиеся в composite_key_hash. Каждый из этих объектов должен быть CopyConstructible и CopyAssignable и возвращать значение типа std::size_t в диапазоне [0, std::numeric_limits::max()). По крайней мере, должен быть предусмотрен хеш-функтор. Определено максимальное количество хеш-функторов инстанциации composite_key_hash. composite_key_hash является CopyConstructible и CopyAssignable. Это также DefaultConstructible, если каждый Hashi в свою очередь является DefaultConstructible.
Notation
В дальнейшем мы используем ту же самую нотацию , введенную для composite_key_result.
Требуется:length(x)==length(key_hash_functions()). Выражение key_hash_functions(.get()(xi) справедливо для всех i в [0, длина(x)]. Возврат: Значение в диапазоне [0, std::numeric_limits::max()), которое зависит исключительно от числового набора
(key_hash_functions().get()(x0), ..., key_hash_functions().get()(xN), с N=length(x)-1.
boost::hash, с CompositeKeyResult инстанциацией composite_key_result, ведет себя как специализация composite_key_hash где все поставляемые хеш-функторы представляют собой инстанциации boost::hash.
CompositeKeyResult должен представлять собой инстанциацию composite_key_result для некоторого типа composite_key. boost::hash::operator() эквивалентен composite_key_hash::operator():, принимая
Hashi = boost::hash для всех i = 0,...,n.
В дополнение к требованиям по Hashi, предъявляемым composite_key_hash, каждый из этих типов должен быть DefaultConstructible. boost::hash является DefaultConstructible, CopyConstructible и CopyAssignable.
Конструкция операций равенства, сравнения и хеширования для объектов composite_key_result основана на следующем обосновании: composite_key_result рассматривается как «виртуальный» кортеж, каждый из его элементов является результатом соответствующего элементарного извлечения ключа. Соответственно, любая данная операция решается комбинацией соответствующих элементных операций. Это отображение сохраняет фундаментальные свойства элементарных операций; например, оно определяет истинное отношение эквивалентности, если основные предикаты вызывают сами отношения эквивалентности. Мы можем официально изложить эти факты следующим образом.
Рассмотрим инстанциацию composite_key_equal_to с типами Pred0, ..., Predn таким образом, что каждый Predi вызывает отношение эквивалентности на определенном типе Ti, и пусть CompositeKey будет типом формы composite_key< ; Ценность,KeyFrom Value0, ...,KeyFromValuej>, с j <= n, таким образом, что
KeyFromValuei::result_type = Ti, для всех i = 0,...,j.
Затем composite_key_equal_to вызывает отношение эквивалентности на элементах типа composite_key_result; такие два объекта эквивалентны, если все его элементарные значения экстрактора ключа также эквивалентны. Дополнительно, учитывая инстанциацию composite_key_hash, следующие типы представляют собой Composite_key_hash, composite_key_equal_to по отношению к composite_key_result:
i = 0,...,min(j,k)-1,QiQi,TiQiСемантический ключTiиTi,Семантический ключ1+min(j,k)composite_key_compareс типамиCompare0, ...Comparenтаким образом, что каждыйCompareiвызывает строгий слабый порядок на типеTi. Затем дляCompositeKeyтипа, определенного таким же образом, как и выше,composite_key_compareвызывает строгий слабый порядок на элементах типаcomposite_key_result<CompositeKey>, и индуцированный порядок является лексикографическим. Кроме того, следующие типы являютсяCompatible Keyscomposite_key_compareв отношенииcomposite_key_result<CompositeKey>:
tuple<Q0,...,Qk>,k <= n composite_key_result<composite_key<K0,...,Kk>>, сKi::result_type = Qiдля всехi = 0,...,k.
при условии, что
дляi = 0,...,min(j,k)-1,Qiявляется либоTi, либоне более грубым, чемTiQiявляетсяCompatible KeyComparei, и нет двух отдельных элементовTi, эквивалентных одному элементуQi;
Qm(сm = min(j,k)) является либоTmилиCompatible KeyComparem.
In this case, the comparison is done
lexicographically only on the first 1+min(j,k) elements.
[ORIG_END] -->
Аналогичные свойства имеют для операторов равенства и сравнения composite_key_result. Обратите внимание, однако, что равенство определяется только для объектов одинаковой длины, в то время как сравнение принимает минимальную длину рассматриваемых операндов. Следовательно, классы эквивалентности, индуцированные x==y, являются подмножествами тех, которые связаны с !(x.
Статья Boost.MultiIndex Documentation - Key extraction reference раздела Boost.MultiIndex Documentation - Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.