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

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску

Итератор-адаптер, преобразующий интерфейс итератора с произвольным доступом так, чтобы переход на одну позицию соответствовал переходу адаптируемого итератора на заданное шагом число позиций.

template <class _BaseRandomIterator>
class IteratorAdapterForStep;
_BaseRandomIteratorТип преобразуемого адаптером итератора. Должен удовлетворять требованиям RandomAccessIterator.
Открытые типы
ТипОписание
iteratorТип _BaseRandomIterator.
iterator_categoryКатегория итератора. Тип эквивалентен std::random_access_iterator_tag.
value_typeТип typename std::iterator_traits<iterator>::value_type.
referenceТип typename std::iterator_traits<iterator>::reference.
pointerТип typename std::iterator_traits<iterator>::pointer.
difference_typeТип typename std::iterator_traits<iterator>::difference_type.
Открытые методы
МетодОписание
(конструкторы)Конструкторы класса IteratorAdapterForStep.
operator=Операторы присваивания.
operator*Оператор разыменовывания.
operator->Оператор косвенного доступа к элементам.
operator++Сдвиг позиции итератора на единицу от начала.
operator--Сдвиг позиции итератора на единицу к началу.
operator+=Изменение позиции итератора на заданное число элементов к концу.
operator-=Изменение позиции итератора на заданное число элементов к началу.
operator+Возвращает итератор, сдвинутый к концу относительно текущего на заданное число позиций.
operator-Возвращает итератор, сдвинутый к началу относительно текущего на заданное число позиций, либо расстояние между двумя итераторами.
operator==Проверка на эквивалентность итераторов.
operator!=Проверка на неэквивалентность итераторов.
operator<Проверка на то, чтобы текущий итератор находился ближе к первому элементу множества, на котором он определен, по сравнению с итератором, который указан параметром.
operator<=Проверка на то, чтобы текущий итератор находился ближе к первому элементу множества, на котором он определен, по сравнению с итератором, который указан параметром, либо совпадал с ним.
operator>Проверка на то, чтобы текущий итератор находился дальше от первого элемента множества, на котором он определен, по сравнению с итератором, который указан параметром.
operator>=Проверка на то, чтобы текущий итератор находился дальше от первого элемента множества, на котором он определен, по сравнению с итератором, который указан параметром, либо совпадал с ним.
baseВозвращает адаптируемый итератор в текущей позиции.
adaptation_baseВозвращает текущий корневой адаптированный, возможно цепочкой адаптеров, итератор.
Функции, не являющиеся частью определения класса
ФункцияОписание
operator+Создает копию указанного итератора IteratorAdapter2D, сдвинутую относительно него на заданное число позиций.

Любой итератор IteratorAdapterForStep, который соответствует позиции, соответствующей псевдоэлементу множества, на котором определен итератор, за последним элементом, считается эквивалентным итератору, возвращаемому методом end этого множества.

Класс IteratorAdapterForStep поддерживает изменение позиции любого итератора, в т.ч. соответствующего итераторам, позиции элементов которых больше либо равны итератору, возвращаемому методом end множества - независимо от такой поддержки адаптируемым итератором.

Пример
using namespace Chusov::Math;
Matrix<double> m = 
{
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};
std::vector<std::thread> vecThreads;
for (unsigned i = 0; i < std::thread::hardware_concurrency(); ++i)
    vecThreads.emplace_back([&vecThreads, i, &m]() 
    {
        for (auto it = make_iterator_adapter<IteratorAdapterForStep>(i, std::thread::hardware_concurrency(), adapt_iterator_range<IteratorAdapter2D>(m.begin(), m.end()));
            it.adaptation_base() != m.end(); ++it)
            *it *= 2;
    });
for (auto&& thr:vecThreads)
    thr.join();
std::cout << "\nSequentialized matrix elements multiplied by two: ";
for (auto&& elem:adapt_iterator_range<IteratorAdapter2D>(m.begin(), m.end()))
    std::cout << elem << " ";
vecThreads.clear();