forked from OctaForge/libostd
new range category: FiniteRandomAccessRange
parent
3883a0da33
commit
8908ac0506
|
@ -18,6 +18,7 @@ namespace octa {
|
||||||
struct ForwardRangeTag {};
|
struct ForwardRangeTag {};
|
||||||
struct BidirectionalRangeTag {};
|
struct BidirectionalRangeTag {};
|
||||||
struct RandomAccessRangeTag {};
|
struct RandomAccessRangeTag {};
|
||||||
|
struct FiniteRandomAccessRangeTag: RandomAccessRangeTag {};
|
||||||
|
|
||||||
template<typename T> using RangeCategory = typename T::Category;
|
template<typename T> using RangeCategory = typename T::Category;
|
||||||
template<typename T> using RangeSize = typename T::SizeType;
|
template<typename T> using RangeSize = typename T::SizeType;
|
||||||
|
@ -318,7 +319,7 @@ namespace octa {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
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(): p_beg(nullptr), p_end(nullptr) {}
|
||||||
PointerRange(const PointerRange &v): p_beg(v.p_beg),
|
PointerRange(const PointerRange &v): p_beg(v.p_beg),
|
||||||
p_end(v.p_end) {}
|
p_end(v.p_end) {}
|
||||||
|
@ -380,7 +381,7 @@ namespace octa {
|
||||||
T &last() { return *(p_end - 1); }
|
T &last() { return *(p_end - 1); }
|
||||||
const T &last() const { 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; }
|
size_t length() const { return p_end - p_beg; }
|
||||||
|
|
||||||
PointerRange slice(size_t start, size_t end) {
|
PointerRange slice(size_t start, size_t end) {
|
||||||
|
|
|
@ -32,7 +32,7 @@ namespace octa {
|
||||||
|
|
||||||
template<typename R>
|
template<typename R>
|
||||||
void ctor_from_range(R &range, EnableIf<IsSame<
|
void ctor_from_range(R &range, EnableIf<IsSame<
|
||||||
RangeCategory<R>, RandomAccessRangeTag
|
RangeCategory<R>, FiniteRandomAccessRangeTag
|
||||||
>::value, bool> = true) {
|
>::value, bool> = true) {
|
||||||
RangeSize<R> len = range.length();
|
RangeSize<R> len = range.length();
|
||||||
reserve(len);
|
reserve(len);
|
||||||
|
@ -45,7 +45,7 @@ namespace octa {
|
||||||
|
|
||||||
template<typename R>
|
template<typename R>
|
||||||
void ctor_from_range(R &range, EnableIf<!IsSame<
|
void ctor_from_range(R &range, EnableIf<!IsSame<
|
||||||
RangeCategory<R>, RandomAccessRangeTag
|
RangeCategory<R>, FiniteRandomAccessRangeTag
|
||||||
>::value, bool> = true) {
|
>::value, bool> = true) {
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (; !range.empty(); range.pop_first()) {
|
for (; !range.empty(); range.pop_first()) {
|
||||||
|
|
Loading…
Reference in New Issue