add range difference type

master
Daniel Kolesa 2015-05-23 17:40:36 +01:00
parent 9c3486903d
commit 4adbeb4e1b
1 changed files with 16 additions and 10 deletions

View File

@ -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;