Архитектурная акустика/Реализация/adapt_iterator_range

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
template <template <class ...> class _Adapter, class _BeginIteratorPosType, class _EndIteratorPosType, class ... _AdaptationParametersToDistribute>
auto adapt_iterator_range(_BeginIteratorPosType&& itBegin, _EndIteratorPosType&& itEnd, _AdaptationParametersToDistribute&& ... generic_adapter_params) -> /*См. описание*/ //1

template <template <class ...> class _Adapter, class _BaseRange, class ... _AdaptationParametersToDistribute>
auto adapt_iterator_range(_BaseRange&& base_range, _AdaptationParametersToDistribute&& ... generic_adapter_params) -> /*См. описание*/ //2

Создает объект Chusov::Memory::iterator_range, который задает множество элементов с помощью пары итераторов, соответствующих границам множества.

Параметры шаблона
_AdapterШаблон, который задает используемый адаптер. Специализируется частью параметров _AdaptationParametersToDistribute..., в результате задавая тип создаваемого адаптера.
_BeginIteratorPosTypeТип адаптируемого итератора, задающего начальную позицию на множестве перечисляемых элементов.
_EndIteratorPosTypeТип адаптируемого итератора, задающего первый (псевдо-) элемент за последним элементом из множества перечисляемого итераторами.
_BaseRangeТип объекта, реализующего методы begin и end (без параметров), которые, соответственно, возвращают начальный и конечный итераторы, определяющие границы множества.
_AdaptationParametersToDistribute...Набор вычисляемых дедукцией типов аргументов, поданных в качестве generic_adapter_params... на вход функции. Используются для инициализации обоих итераторов.
Параметры
itBeginИтератор, задающий первый элемент множества.
itEndИтератор, задающий первый (псевдо-) элемент за последним элементом множества.
base_rangeОбъект, задающий аналогичную пару итераторов методами begin и end без параметров.
...generic_adapter_paramsНабор параметров в дополнение к итераторам для инициализации создаваемых итераторов-адаптеров, задающих возвращаемый диапазон элементов.
Возвращаемое значение:
Созданный объект Chusov::Memory::iterator_range, специализированный для итераторов-адаптеров.

Вызов

adapt_iterator_range<IteratorAdapter>(vector, param_1, param_2);

Эквивалентен вызову

Chusov::Memory::make_iterator_range(
    make_iterator_adapter(vector.begin(), param_1, param_2),
    make_iterator_adapter(vector.end(), param_1, param_2)
);
Пример
auto itChain = adapt_iterator_range<IteratorAdapterConditional>(
    adapt_iterator_range<IteratorAdapterForStep>(
        i,
        std::thread::hardware_concurrency(),
        adapt_iterator_range<IteratorAdapter2D>(container)
        ),
    [](IteratorAdapterForStep<IteratorAdapter2D<container::iterator>> _it) -> bool {return (*_it & 1) == 0; }, 
    [&cont](auto _it) -> bool {return _it.adaptation_base() != cont.crend(); }
);