std.range.interfaces

Jump to: BidirectionalAssignable · BidirectionalRange · ForwardAssignable · ForwardRange · InputAssignable · InputRange · InputRangeObject · inputRangeObject · MostDerivedInputRange · OutputRange · OutputRangeObject · outputRangeObject · RandomAccessFinite · RandomAccessInfinite · RandomFiniteAssignable

Этот модуль является подмодулем std.range.
Основной модуль std.range предоставляет базирующиеся на шаблонах инструменты для работы с диапазонами, но иногда для диапазонов требуется объектно-ориентированный интерфейс, например, когда нужен полиморфизм времени выполнения. С этой целью, этот подмодуль предоставляет ряд объектов и определений интерфейсов, которые можно использовать для обёртывания диапазонных объектов, созданных шаблонами std.range.
InputRange Обёртка для входных диапазонов.
InputAssignable Обёртка для входных диапазонов с присваиваемыми элементами.
ForwardRange Обёртка для лидирующих диапазонов.
ForwardAssignable Обёртка для лидирующих диапазонов с присваиваемыми элементами.
BidirectionalRange Обёртка для двунаправленных диапазонов.
BidirectionalAssignable Обёртка для двунаправленных диапазонов с присваиваемыми элементами.
RandomAccessFinite Обёртка для конечных диапазонов с произвольным доступом.
RandomAccessAssignable Обёртка для конечных диапазонов с произвольным доступом с присваиваемыми элементами.
RandomAccessInfinite Обёртка для бесконечных диапазонов с произвольным доступом.
OutputRange Обёртка для выходных диапазонов.
OutputRangeObject Класс, который реализует интерфейс OutputRange и завёртывает методы put в виртуальные функции.
InputRangeObject Класс, который реализует интерфейс InputRange и завёртывает методы входного диапазона в виртуальные функции.
RefRange Обёртка вокруг лидирующего диапазона, который придает ему ссылочную семантику.
Что-то этот пункт не работает, и в файле модуля его нет... – недоумение переводчика.

Исходный код: std/range/interfaces.d

Лицензия:
Boost License 1.0.
Авторы:
Andrei Alexandrescu, David Simcha, and Jonathan M Davis. Credit for some of the ideas in building this module goes to Leonardo Maffi.

Jump to: empty · front · moveFront · opApply · popFront

interface InputRange(E);
Эти интерфейсы предназначены для обеспечения основанных на виртуальных функциях обёрток вокруг входных диапазонов с типом элемента E. Это полезно, когда требуется четко определенный двоичный интерфейса, как например, когда DLL-функции или виртуальной функции нужно принимать общий дипазон как параметр. Заметьте, что isInputRange и друзья проверяют на соответствие структурным интерфейсам, а не реализацию этих типов интерфейса.

Ограничения: Эти интерфейсы не способны пересылать ref-доступ к элементам.

Бесконечность обернутого диапазона не передается
Длина не передается в случае диапазонов без произвольного доступа.

Примеры:
import std.algorithm.iteration : map;
import std.range : iota;

void useRange(InputRange!int range) {
    // Тело функции.
}

// Создаём диапазонный тип.
auto squares = map!"a * a"(iota(10));

// Обёртываем его в интерфейс.
auto squaresWrapped = inputRangeObject(squares);

// Используем его.
useRange(squaresWrapped);
@property E front();
E moveFront();
void popFront();
@property bool empty();
int opApply(scope int delegate(E));

int opApply(scope int delegate(size_t, E));
Итерация foreach использует opApply, так как вызов одного делегата на итерации цикла быстрее, чем три вызова виртуальных функций.

Jump to: save

interface ForwardRange(E): InputRange!E;
Интерфейс для лидирующего диапазона типа E.
@property ForwardRange!E save();

Jump to: back · moveBack · popBack · save

interface BidirectionalRange(E): ForwardRange!E;
Интерфейс для двунаправленного диапазона типа E.
@property BidirectionalRange!E save();
@property E back();
E moveBack();
void popBack();

Jump to: length · moveAt · opDollar · opIndex · opSlice · save

interface RandomAccessFinite(E): BidirectionalRange!E;
Интерфейс для конечного диапазона с произвольным доступом типа E.
@property RandomAccessFinite!E save();
E opIndex(size_t);
E moveAt(size_t);
@property size_t length();
alias opDollar = length;
RandomAccessFinite!E opSlice(size_t, size_t);

Jump to: moveAt · opIndex · save

interface RandomAccessInfinite(E): ForwardRange!E;
Интерфейс для бесконечного диапазона с произвольным доступом типа E.
E moveAt(size_t);
@property RandomAccessInfinite!E save();
E opIndex(size_t);

Jump to: front

interface InputAssignable(E): InputRange!E;
Добавляет присваиваемые элементы к InputRange.
@property void front(E newVal);

Jump to: save

interface ForwardAssignable(E): InputAssignable!E, ForwardRange!E;
Добавляет присваиваемые элементы к ForwardRange.
@property ForwardAssignable!E save();

Jump to: back · save

interface BidirectionalAssignable(E): ForwardAssignable!E, BidirectionalRange!E;
Добавляет присваиваемые элементы к BidirectionalRange.
@property BidirectionalAssignable!E save();
@property void back(E newVal);

Jump to: opIndexAssign · save

interface RandomFiniteAssignable(E): RandomAccessFinite!E, BidirectionalAssignable!E;
Добавляет присваиваемые элементы к RandomAccessFinite.
@property RandomFiniteAssignable!E save();
void opIndexAssign(E val, size_t index);

Jump to: put

interface OutputRange(E);
Интерфейс для выходного диапазона типаE. Использование подобно интерфейсу InputRange и его потомкам.
void put(E);

Jump to: this

class OutputRangeObject(R, E...): staticMap!(OutputRange, E);
Реализует интерфейс OutputRange для всех типов E и завёртывает метод put для каждого типа E в виртуальную функцию.
this(R range);
template MostDerivedInputRange(R) if (isInputRange!(Unqual!R))
Возвращает тип интерфейса, который наилучшим образом соответствует R.
template InputRangeObject(R) if (isInputRange!(Unqual!R))
Реализует наиболее производный интерфейс, который работает с R , и завёртывает все важные примитивы диапазона в виртуальные функции. Если R уже является производным от интерфейса InputRange, наружу выводится псевдоним его самого.
InputRangeObject!R inputRangeObject(R)(R range)
if (isInputRange!R);
Удобная функция для создания InputRangeObject соответствующего типа. Смотрите пример в InputRange.
template outputRangeObject(E...)
Удобная функция для создания OutputRangeObject с базовым диапазоном типа R, которая принимает типы E.
Примеры:
import std.array;
auto app = appender!(uint[])();
auto appWrapped = outputRangeObject!(uint, uint[])(app);
static assert(is(typeof(appWrapped) : OutputRange!(uint[])));
static assert(is(typeof(appWrapped) : OutputRange!(uint)));
OutputRangeObject!(R, E) outputRangeObject(R)(R range);