define support for OutputRange

master
Daniel Kolesa 2015-04-17 21:33:01 +01:00
parent c9b7afc035
commit 32d925d298
2 changed files with 15 additions and 5 deletions

View File

@ -13,6 +13,7 @@
namespace octa { namespace octa {
struct InputRange {}; struct InputRange {};
struct OutputRange {};
struct ForwardRange {}; struct ForwardRange {};
struct BidirectionalRange {}; struct BidirectionalRange {};
struct RandomAccessRange {}; struct RandomAccessRange {};
@ -46,7 +47,7 @@ namespace octa {
} }
template<typename B, typename C, typename V, typename R = V &> template<typename B, typename C, typename V, typename R = V &>
struct Range { struct InputRangeBase {
struct type { struct type {
typedef C category; typedef C category;
typedef V value; typedef V value;
@ -61,8 +62,17 @@ namespace octa {
} }
}; };
template<typename V, typename R = V &>
struct OutputRangeBase {
struct type {
typedef OutputRange category;
typedef V value;
typedef R reference;
};
};
template<typename T> template<typename T>
struct ReverseRange: Range<ReverseRange<T>, struct ReverseRange: InputRangeBase<ReverseRange<T>,
typename RangeTraits<T>::category, typename RangeTraits<T>::category,
typename RangeTraits<T>::value, typename RangeTraits<T>::value,
typename RangeTraits<T>::reference typename RangeTraits<T>::reference
@ -108,7 +118,7 @@ namespace octa {
} }
template<typename T> template<typename T>
struct MoveRange: Range<MoveRange<T>, struct MoveRange: InputRangeBase<MoveRange<T>,
typename RangeTraits<T>::category, typename RangeTraits<T>::category,
typename RangeTraits<T>::value, typename RangeTraits<T>::value,
typename RangeTraits<T>::value && typename RangeTraits<T>::value &&
@ -148,7 +158,7 @@ namespace octa {
} }
template<typename T> template<typename T>
struct NumberRange: Range<NumberRange<T>, ForwardRange, T> { struct NumberRange: InputRangeBase<NumberRange<T>, ForwardRange, T> {
NumberRange(): p_a(0), p_b(0), p_step(0) {} NumberRange(): p_a(0), p_b(0), p_step(0) {}
NumberRange(const NumberRange &it): p_a(it.p_a), p_b(it.p_b), NumberRange(const NumberRange &it): p_a(it.p_a), p_b(it.p_b),
p_step(it.p_step) {} p_step(it.p_step) {}

View File

@ -20,7 +20,7 @@ namespace octa {
* See the range specification as documented on OctaForge wiki. * See the range specification as documented on OctaForge wiki.
*/ */
template<typename T> template<typename T>
struct VectorRange: Range<VectorRange<T>, RandomAccessRange, T> { struct VectorRange: InputRangeBase<VectorRange<T>, RandomAccessRange, T> {
VectorRange(): p_beg(nullptr), p_end(nullptr) {} VectorRange(): p_beg(nullptr), p_end(nullptr) {}
VectorRange(const VectorRange &v): p_beg(v.p_beg), p_end(v.p_end) {} VectorRange(const VectorRange &v): p_beg(v.p_beg), p_end(v.p_end) {}
VectorRange(VectorRange &&v): p_beg(v.p_beg), p_end(v.p_end) { VectorRange(VectorRange &&v): p_beg(v.p_beg), p_end(v.p_end) {