![]() |
![]() ![]() ![]() ![]() |
![]() |
Required ConceptsBoost , Chapter 1. Boost.Icl , Interface
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
используемый в |
Добрый |
Параметр |
Побуждение |
Описание |
|
|---|---|---|---|---|---|
|
Domain order |
|
|
|
For the type |
|
|
|
|
|
|
||
|
Interval type |
|
|
|
|
|
|
Codomain aggregation |
|
|
|
Для типа |
|
|
|
|
|
|
||
|
|
||||
|
|
|
|
Пересечение распространяется на значения CodomainT через функтор |
||
|
Memory allocation |
|
|
|
|
Для выделения памяти может быть выбран распределитель. |
Следующая таблица дает обзор требований к параметру шаблона DomainT. Некоторые требования зависят от условий Колонка операторы показывает операторы и функции, которые ожидаются для DomainT, если используется порядок по умолчанию Сравните=std::less.
|
Параметр |
Состояние |
Операторы |
Требование |
|---|---|---|---|
|
|
|
|
|
|
||
|
|
|
|
Тип домена DomainT для интервалов и интервальных контейнеров должен удовлетворять требованиям концепции Regular, которая подразумевает среди прочих свойств наличие копии и конструктора по умолчанию. Кроме того, IsIncrementable или HasUnitElement требуется для DomainT. В icl мы представляем пустой закрытый интервал в виде интервала [b,a, где a<b (здесь <Сравните<DomainT>()). Для построения одного из этих пустых интервалов в качестве конструктора по умолчанию для любого типа DomainT выбираем [,0], где 0 является нулевым значением или identity_element и 1 является однозначным значением или unit_element:
interval() := [unit_element<DomainT>::value(), identity_element<DomainT>::value()] //pseudocode
Элементы идентификации реализуются посредством вызова конструктора по умолчанию DomainT. unit_element<T>::value() реализуется по умолчанию как identity_element, то есть приращено один раз.
template <class Type> inline Type unit_element<Type>::value(){ return succ(identity_element<Type>::value()); };
Таким образом, тип DomainT, который является incrementable, также будет иметь unit_element. Если это не так, можно предоставить элемент unit_element. unit_element может представлять собой любое значение, которое больше, чем identity_element в заданном порядке Compare. Примером типа, который имеет элемент identity_element, но не имеет операции приращения, является string. Для std::string реализован модуль_элемент:
// Smallest 'visible' string that is greater than the empty string. template <> inline std::string unit_element<std::string>::value(){ return std::string(" "); };
Так же, как и для ключевого типа std::sets и карты, параметр шаблона Compare должен быть строгим слабым упорядочиванием на DomainT.
Наконец, если DomainT является интегральным типом, DomainT должен быть incrementable и decrementable. Эта 'bicrementability' должна быть реализована на наименьшей возможной единице интегрального типа. Это кажется тривиальным, но есть такие типы, как, например, boost::date_time::ptime, которые являются интегральными по своей природе, но не обеспечивают требуемую ин- и декрементацию на наименее инкрементируемой единице. Для icl::интервалы инцементация и децементация используются для вычислений между открытыми и закрытыми интервальными границами, такими как, например, [2, 43)[2]42. Такие вычисления всегда требуют только одного in- или decrementation, если DomainT является интегральным типом.
Требования к параметру IntervalT тесно связаны с параметром DomainT. IntervalT имеет два связанных типа для типа элемента и порядок сравнения, который должен соответствовать параметрам элемента и порядка их интервальных контейнеров. IntervalT затем должен выполнить заказ под названием exclusive_less. Два интервала x, y являются эксклюзивными_less
icl::exclusive_less(x, y)
если все элементы DomainT x меньше элементов y в порядке Сравните.
|
Параметр |
Операторы |
Требование |
|---|---|---|
|
|
|
В следующей таблице приведены требования к параметру шаблона CodomainT соответствующих значений для Maps. Опять же, для некоторых требований существуют условия . Колонка операторы содержит операторы и функции, необходимые для CodomainT, если мы используем комбинатор по умолчанию Combine=icl::inplace_plus.
|
Параметр |
Состояние |
Операторы |
Требование |
|---|---|---|---|
|
|
|
|
|
|||
только |
|
|
|
|
... and also |
|
|
|
|
|
|
Требования к типу CodomainT ассоциированных значений для icl::map или interval_map зависят от использования их функции агрегации. Если агрегация на перекрытии никогда не используется, то есть ни одна из операций сложения, вычитания и пересечения (+, +=, , -, -=, вычитание , &, &=, add_intersection) не используется на interval_map, то CodomainT должен быть только Regular.
РегулярнаяСемантика объектов подразумевает Конструируемый по умолчанию и Сравнимое по умолчанию, что означает, что он имеет ctor по умолчанию КодоменТ() и оператор==.
Используйте interval_maps без агрегации, если соответствующие значения не добавляются, но все еще прикреплены к интервалам, поэтому вы хотите использовать interval_maps для их обработки. До тех пор, пока эти значения добавляются с вставить и удаляются с erase interval_maps будет работать нормально с такими значениями.
Если только добавление используется через interval_map's+ или добавить, но без вычитания, то CodomainT должен быть Combinable для шаблона функтора Combine. Это означает, что в большинстве случаев, когда используется реализация по умолчанию inplace_plus для Combine, то CodomainT должен реализовать operator +=.
Для ассоциированных типов значений, которые являются добавляемыми, но не вычитаемыми, например, std::string, обычно имеет смысл использовать дополнение для комбинирования значений, но обратная комбинация нежелательна.
interval_map<int,std::string> cat_map; cat_map += make_pair(interval<int>::rightopen(1,5),std::string("Hello")); cat_map += make_pair(interval<int>::rightopen(3,7),std::string(" world")); cout << "cat_map: " << cat_map << endl; //cat_map: {([1,3)->Hello)([3,5)->Hello world)([5,7)-> world)}
Для полной функции агрегации необходим обратный функтор агрегации на Карта CodomainT. Для этой цели icl обеспечивает метафункцию inverse. Используя по умолчанию Combine =, который опирается на существование оператора по типу КодоменТ метафункция обратная выведет вместо_minus в качестве обратного функтора, что требует оператор по типу CodomainT.
В дизайне icl мы делаем предположение, в частности, для настройки параметров по умолчанию Combine=inplace_plus, что тип CodomainT имеет нейтральный элемент или identity_element по отношению к Combine функтора.
Статья Required Concepts раздела Chapter 1. Boost.Icl Interface может быть полезна для разработчиков на c++ и boost.
реклама |