forked from OctaForge/libostd
add range difference type
parent
9c3486903d
commit
4adbeb4e1b
26
octa/range.h
26
octa/range.h
|
@ -19,10 +19,11 @@ namespace octa {
|
||||||
struct BidirectionalRangeTag {};
|
struct BidirectionalRangeTag {};
|
||||||
struct RandomAccessRangeTag {};
|
struct RandomAccessRangeTag {};
|
||||||
|
|
||||||
template<typename T> using RangeCategory = typename T::Category;
|
template<typename T> using RangeCategory = typename T::Category;
|
||||||
template<typename T> using RangeSize = typename T::SizeType;
|
template<typename T> using RangeSize = typename T::SizeType;
|
||||||
template<typename T> using RangeValue = typename T::ValType;
|
template<typename T> using RangeDifference = typename T::DiffType;
|
||||||
template<typename T> using RangeReference = typename T::RefType;
|
template<typename T> using RangeValue = typename T::ValType;
|
||||||
|
template<typename T> using RangeReference = typename T::RefType;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct __OctaRangeIterator {
|
struct __OctaRangeIterator {
|
||||||
|
@ -62,10 +63,11 @@ namespace octa {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename B, typename C, typename V, typename R = V &,
|
template<typename B, typename C, typename V, typename R = V &,
|
||||||
typename S = size_t
|
typename S = size_t, typename D = ptrdiff_t
|
||||||
> struct InputRange {
|
> struct InputRange {
|
||||||
typedef C Category;
|
typedef C Category;
|
||||||
typedef S SizeType;
|
typedef S SizeType;
|
||||||
|
typedef D DiffType;
|
||||||
typedef V ValType;
|
typedef V ValType;
|
||||||
typedef R RefType;
|
typedef R RefType;
|
||||||
|
|
||||||
|
@ -85,17 +87,20 @@ namespace octa {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename V, typename R = V &, typename S = size_t>
|
template<typename V, typename R = V &, typename S = size_t,
|
||||||
struct OutputRange {
|
typename D = ptrdiff_t
|
||||||
|
> struct OutputRange {
|
||||||
typedef OutputRangeTag Category;
|
typedef OutputRangeTag Category;
|
||||||
typedef S SizeType;
|
typedef S SizeType;
|
||||||
|
typedef D DiffType;
|
||||||
typedef V ValType;
|
typedef V ValType;
|
||||||
typedef R RefType;
|
typedef R RefType;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct ReverseRange: InputRange<ReverseRange<T>,
|
struct ReverseRange: InputRange<ReverseRange<T>,
|
||||||
RangeCategory<T>, RangeValue<T>, RangeReference<T>, RangeSize<T>
|
RangeCategory<T>, RangeValue<T>, RangeReference<T>, RangeSize<T>,
|
||||||
|
RangeDifference<T>
|
||||||
> {
|
> {
|
||||||
private:
|
private:
|
||||||
typedef RangeReference<T> r_ref;
|
typedef RangeReference<T> r_ref;
|
||||||
|
@ -192,7 +197,8 @@ namespace octa {
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct MoveRange: InputRange<MoveRange<T>,
|
struct MoveRange: InputRange<MoveRange<T>,
|
||||||
RangeCategory<T>, RangeValue<T>, RangeValue<T> &&, RangeSize<T>
|
RangeCategory<T>, RangeValue<T>, RangeValue<T> &&, RangeSize<T>,
|
||||||
|
RangeDifference<T>
|
||||||
> {
|
> {
|
||||||
private:
|
private:
|
||||||
typedef RangeValue<T> r_val;
|
typedef RangeValue<T> r_val;
|
||||||
|
@ -412,7 +418,7 @@ namespace octa {
|
||||||
struct EnumeratedRange: InputRange<EnumeratedRange<T>,
|
struct EnumeratedRange: InputRange<EnumeratedRange<T>,
|
||||||
InputRangeTag, RangeValue<T>,
|
InputRangeTag, RangeValue<T>,
|
||||||
EnumeratedValue<RangeReference<T>, RangeSize<T>>,
|
EnumeratedValue<RangeReference<T>, RangeSize<T>>,
|
||||||
RangeSize<T>
|
RangeSize<T>, RangeDifference<T>
|
||||||
> {
|
> {
|
||||||
private:
|
private:
|
||||||
typedef RangeReference<T> r_ref;
|
typedef RangeReference<T> r_ref;
|
||||||
|
|
Loading…
Reference in New Issue