new range category: FiniteRandomAccessRange

master
Daniel Kolesa 2015-05-23 20:00:03 +01:00
parent 3883a0da33
commit 8908ac0506
2 changed files with 5 additions and 4 deletions

View File

@ -18,6 +18,7 @@ namespace octa {
struct ForwardRangeTag {};
struct BidirectionalRangeTag {};
struct RandomAccessRangeTag {};
struct FiniteRandomAccessRangeTag: RandomAccessRangeTag {};
template<typename T> using RangeCategory = typename T::Category;
template<typename T> using RangeSize = typename T::SizeType;
@ -318,7 +319,7 @@ namespace octa {
}
template<typename T>
struct PointerRange: InputRange<PointerRange<T>, RandomAccessRangeTag, T> {
struct PointerRange: InputRange<PointerRange<T>, 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) {

View File

@ -32,7 +32,7 @@ namespace octa {
template<typename R>
void ctor_from_range(R &range, EnableIf<IsSame<
RangeCategory<R>, RandomAccessRangeTag
RangeCategory<R>, FiniteRandomAccessRangeTag
>::value, bool> = true) {
RangeSize<R> len = range.length();
reserve(len);
@ -45,7 +45,7 @@ namespace octa {
template<typename R>
void ctor_from_range(R &range, EnableIf<!IsSame<
RangeCategory<R>, RandomAccessRangeTag
RangeCategory<R>, FiniteRandomAccessRangeTag
>::value, bool> = true) {
size_t i = 0;
for (; !range.empty(); range.pop_first()) {