![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
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.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |