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

View File

@ -20,7 +20,7 @@ namespace octa {
* See the range specification as documented on OctaForge wiki.
*/
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(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) {