Spec-Zone.ru › D

std.range.interfaces

Этот модуль является подмодулем std.range.

Основной модуль std.range предоставляет основанные на шаблонах инструменты для работы с диапазонами, но иногда необходим объектно-ориентированный интерфейс для диапазонов, например, когда требуется полиморфизм во время выполнения. Для этой цели этот подмодуль предоставляет ряд объектных и interface определений, которые могут быть использованы для обертывания объектов диапазонов, созданных шаблонами std.range.

InputRange Обёртка для входных диапазонов.
InputAssignable Обёртка для входных диапазонов с присваиваемыми элементами.
ForwardRange Обёртка для диапазонов вперёд.
ForwardAssignable Обёртка для диапазонов вперёд с присваиваемыми элементами.
BidirectionalRange Обёртка для двунаправленных диапазонов.
BidirectionalAssignable Обёртка для двунаправленных диапазонов с присваиваемыми элементами.
RandomAccessFinite Обёртка для конечных диапазонов с произвольным доступом.
RandomAccessAssignable Обёртка для конечных диапазонов с произвольным доступом и присваиваемыми элементами.
RandomAccessInfinite Обёртка для бесконечных диапазонов с произвольным доступом.
OutputRange Обёртка для выходных диапазонов.
OutputRangeObject Класс, реализующий интерфейс OutputRange и оборачивающий методы put в виртуальные функции.
outputRangeObject Функция для создания OutputRangeObject с базовым диапазоном типа R, принимающим типы E.
InputRangeObject Класс, реализующий интерфейс InputRange и оборачивающий методы входного диапазона в виртуальные функции.
inputRangeObject Функция для создания InputRangeObject нужного типа.
MostDerivedInputRange Возвращает тип интерфейса, наилучшим образом соответствующий диапазону.


Source
std/range/interfaces.d
License:
Boost License 1.0.
Authors:
Andrei Alexandrescu, David Simcha, and Jonathan M Davis. За заимствованные идеи в создании данного модуля спасибо Leonardo Maffi.
interface InputRange(E);

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

Ограничения
Эти интерфейсы не могут передавать ref доступ к элементам.
Бесконечность обернутого диапазона не передаётся. Длина не передаётся в случае диапазонов без произвольного доступа.
См. также:
inputRangeObject
Примеры:
import std.algorithm.iteration : map;
import std.range : iota;

void useRange(InputRange!int range) {
    // Function body.
}

// Create a range type.
auto squares = map!"a * a"(iota(10));

// Wrap it in an interface.
auto squaresWrapped = inputRangeObject(squares);

// Use it.
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, так как один вызов делегата за итерацию цикла быстрее, чем три вызова виртуальной функции.

interface ForwardRange(E): InputRange!E;

Интерфейс для диапазона вперёд типа E.

@property ForwardRange!E save();
interface BidirectionalRange(E): ForwardRange!E;

Интерфейс для двунаправленного диапазона типа E.

@property BidirectionalRange!E save();
@property E back();
E moveBack();
void popBack();
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);
interface RandomAccessInfinite(E): ForwardRange!E;

Интерфейс для бесконечного диапазона с произвольным доступом типа E.

E moveAt(size_t);
@property RandomAccessInfinite!E save();
E opIndex(size_t);
interface InputAssignable(E): InputRange!E;

Добавляет присваиваемые элементы к InputRange.

@property void front(E newVal);
interface ForwardAssignable(E): InputAssignable!E, ForwardRange!E;

Добавляет присваиваемые элементы к ForwardRange.

@property ForwardAssignable!E save();
interface BidirectionalAssignable(E): ForwardAssignable!E, BidirectionalRange!E;

Добавляет присваиваемые элементы к BidirectionalRange.

@property BidirectionalAssignable!E save();
@property void back(E newVal);
interface RandomFiniteAssignable(E): RandomAccessFinite!E, BidirectionalAssignable!E;

Добавляет присваиваемые элементы к RandomAccessFinite.

@property RandomFiniteAssignable!E save();
void opIndexAssign(E val, size_t index);
interface OutputRange(E);

Интерфейс для выходного диапазона типа E.

Использование аналогично интерфейсу InputRange и его потомкам.

void put(E);
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)
Constraints: 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);

© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_range_interfaces.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API