Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Required Concepts

Boost , Chapter 1. Boost.Icl , Interface

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Существуют единые требования к параметрам шаблонов в шаблонах классов icl. Параметры шаблона могут быть сгруппированы в соответствии с этими требованиями.

используемый в

Добрый

Параметр

Побуждение

Описание

Domain order

Intervals, Sets, Maps

имя

DomainT

For the type DomainT of key elements ...

template

Compare

Compare<DomainT>

... есть порядок Сравните

Interval type

interval_sets/maps

имя

IntervalT

... параметр IntervalT должен использовать тот же тип элемента и порядок.

Codomain aggregation

Карты

имя

CodomainT

Для типа CodomainT ассоциированных значений ...

template

Комбинат

Combine<CodomainT>

... есть двоичный функтор Комбинат<КодоменТ>() объединить их

Inverse<Combine<CodomainT>>

... and implicitly an Inverse functor to inversely combine them.

template

Раздел

Section<CodomainT>

Пересечение распространяется на значения CodomainT через функтор Раздел <CodomainT>()

Memory allocation

Sets, Maps

template

Alloc

Alloc<вариантный>

Для выделения памяти может быть выбран распределитель.

Requirements on DomainT

Следующая таблица дает обзор требований к параметру шаблона DomainT. Некоторые требования зависят от условий Колонка операторы показывает операторы и функции, которые ожидаются для DomainT, если используется порядок по умолчанию Сравните=std::less.

Параметр

Состояние

Операторы

Требование

DomainT

DomainT(), <<8

Regular<DomainT> && StrictWeakOrdering<DomainT,Compare>

++, unit_element<CodomainT>::value()

&& (IsIncrementable<DomainT>||HasUnitElement<DomainT>)

IsIntegral<DomainT>

++, -

IsIncrementable<DomainT> && IsDecrementable<>

Тип домена 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 является интегральным типом.

Requirements on IntervalT

Требования к параметру IntervalT тесно связаны с параметром DomainT. IntervalT имеет два связанных типа для типа элемента и порядок сравнения, который должен соответствовать параметрам элемента и порядка их интервальных контейнеров. IntervalT затем должен выполнить заказ под названием exclusive_less. Два интервала x, y являются эксклюзивными_less

icl::exclusive_less(x, y)

если все элементы DomainT x меньше элементов y в порядке Сравните.

Параметр

Операторы

Требование

IntervalT

exclusive_less

ИсключительноСравнимая<Интервал<ДоменТ,Сравните>>

Requirements on CodomainT

В следующей таблице приведены требования к параметру шаблона CodomainT соответствующих значений для Maps. Опять же, для некоторых требований существуют условия . Колонка операторы содержит операторы и функции, необходимые для CodomainT, если мы используем комбинатор по умолчанию Combine=icl::inplace_plus.

Параметр

Состояние

Операторы

Требование

CodomainT

add, subtract, intersect неиспользованный

CodomainT(), ==

Regular<CodomainT> which implies

DefaultConstructible<CodomainT> && EqualityComparable<CodomainT>

только добавить использовать

+=

&& Комбинируемый<КодоменТ,Комбинат>

... and also subtract used

-=

&& <CodomainT,Inverse<Combine> >

Используется раздел и CodomainT представляет собой набор

&=

&& Intersectable<CodomainT,Section>

Требования к типу 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 функтора.


PrevUpHomeNext

Статья Required Concepts раздела Chapter 1. Boost.Icl Interface может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Interface ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:34:28/0.009425163269043/1