diff --git a/octa/range.h b/octa/range.h index 575a094..d004740 100644 --- a/octa/range.h +++ b/octa/range.h @@ -13,6 +13,7 @@ namespace octa { struct InputRange {}; + struct OutputRange {}; struct ForwardRange {}; struct BidirectionalRange {}; struct RandomAccessRange {}; @@ -46,7 +47,7 @@ namespace octa { } template - struct Range { + struct InputRangeBase { struct type { typedef C category; typedef V value; @@ -61,8 +62,17 @@ namespace octa { } }; + template + struct OutputRangeBase { + struct type { + typedef OutputRange category; + typedef V value; + typedef R reference; + }; + }; + template - struct ReverseRange: Range, + struct ReverseRange: InputRangeBase, typename RangeTraits::category, typename RangeTraits::value, typename RangeTraits::reference @@ -108,7 +118,7 @@ namespace octa { } template - struct MoveRange: Range, + struct MoveRange: InputRangeBase, typename RangeTraits::category, typename RangeTraits::value, typename RangeTraits::value && @@ -148,7 +158,7 @@ namespace octa { } template - struct NumberRange: Range, ForwardRange, T> { + struct NumberRange: InputRangeBase, ForwardRange, T> { NumberRange(): p_a(0), p_b(0), p_step(0) {} NumberRange(const NumberRange &it): p_a(it.p_a), p_b(it.p_b), p_step(it.p_step) {} diff --git a/octa/vector.h b/octa/vector.h index 1d54c18..a194c48 100644 --- a/octa/vector.h +++ b/octa/vector.h @@ -20,7 +20,7 @@ namespace octa { * See the range specification as documented on OctaForge wiki. */ template - struct VectorRange: Range, RandomAccessRange, T> { + struct VectorRange: InputRangeBase, RandomAccessRange, T> { VectorRange(): p_beg(nullptr), p_end(nullptr) {} 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) {