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