diff --git a/octa/range.h b/octa/range.h index 2f13bfe..b757596 100644 --- a/octa/range.h +++ b/octa/range.h @@ -18,6 +18,7 @@ namespace octa { struct ForwardRangeTag {}; struct BidirectionalRangeTag {}; struct RandomAccessRangeTag {}; + struct FiniteRandomAccessRangeTag: RandomAccessRangeTag {}; template using RangeCategory = typename T::Category; template using RangeSize = typename T::SizeType; @@ -318,7 +319,7 @@ namespace octa { } template - struct PointerRange: InputRange, RandomAccessRangeTag, T> { + struct PointerRange: InputRange, FiniteRandomAccessRangeTag, T> { PointerRange(): p_beg(nullptr), p_end(nullptr) {} PointerRange(const PointerRange &v): p_beg(v.p_beg), p_end(v.p_end) {} @@ -380,7 +381,7 @@ namespace octa { T &last() { return *(p_end - 1); } const T &last() const { return *(p_end - 1); } - /* satisfy RandomAccessRange */ + /* satisfy FiniteRandomAccessRange */ size_t length() const { return p_end - p_beg; } PointerRange slice(size_t start, size_t end) { diff --git a/octa/vector.h b/octa/vector.h index 2e85fde..b2ae390 100644 --- a/octa/vector.h +++ b/octa/vector.h @@ -32,7 +32,7 @@ namespace octa { template void ctor_from_range(R &range, EnableIf, RandomAccessRangeTag + RangeCategory, FiniteRandomAccessRangeTag >::value, bool> = true) { RangeSize len = range.length(); reserve(len); @@ -45,7 +45,7 @@ namespace octa { template void ctor_from_range(R &range, EnableIf, RandomAccessRangeTag + RangeCategory, FiniteRandomAccessRangeTag >::value, bool> = true) { size_t i = 0; for (; !range.empty(); range.pop_first()) {