range category tags + cleanup

master
Daniel Kolesa 2015-04-16 21:50:53 +01:00
parent b3a49b597c
commit 66f7bc90c2
2 changed files with 46 additions and 40 deletions

View File

@ -11,41 +11,46 @@
#include "octa/types.h"
namespace octa {
struct InputRange {};
struct OutputRange {};
struct BidirectionalRange {};
struct RandomAccessRange {};
template<typename T>
struct RangeTraits {
typedef typename T::type::difference difference;
typedef typename T::type::value value;
typedef typename T::type::pointer pointer;
typedef typename T::type::reference reference;
typedef typename T::type::category category;
typedef typename T::type::value value;
typedef typename T::type::pointer pointer;
typedef typename T::type::reference reference;
};
template<typename T>
struct RangeTraits<T *> {
typedef ptrdiff_t difference;
typedef T value;
typedef T *pointer;
typedef T &reference;
typedef RandomAccessRange category;
typedef T value;
typedef T *pointer;
typedef T &reference;
};
template<typename T>
struct RangeTraits<const T *> {
typedef ptrdiff_t difference;
typedef T value;
typedef const T *pointer;
typedef const T &reference;
typedef RandomAccessRange category;
typedef T value;
typedef const T *pointer;
typedef const T &reference;
};
template<>
struct RangeTraits<void *> {
typedef ptrdiff_t difference;
typedef uchar value;
typedef void *pointer;
typedef uchar &reference;
typedef RandomAccessRange category;
typedef uchar value;
typedef void *pointer;
typedef uchar &reference;
};
template<>
struct RangeTraits<const void *> {
typedef ptrdiff_t difference;
typedef RandomAccessRange category;
typedef uchar value;
typedef const void *pointer;
typedef const uchar &reference;
@ -57,10 +62,9 @@ namespace octa {
public:
struct type {
typedef typename RangeTraits<T>::difference difference;
typedef typename RangeTraits<T>::value value;
typedef typename RangeTraits<T>::pointer pointer;
typedef typename RangeTraits<T>::reference reference;
typedef typename RangeTraits<T>::value value;
typedef typename RangeTraits<T>::pointer pointer;
typedef typename RangeTraits<T>::reference reference;
};
RangeIterator(): p_range() {}
@ -85,23 +89,21 @@ namespace octa {
}
};
template<template<typename> class T, typename U>
struct Range {
RangeIterator<T<U>> begin() {
return RangeIterator<T<U>>((const T<U> &)*this);
}
RangeIterator<T<U>> end() {
return RangeIterator<T<U>>();
}
};
#define OCTA_RANGE_ITERATOR(T) \
octa::RangeIterator<T> begin() { \
return octa::RangeIterator<T>(*this); \
} \
octa::RangeIterator<T> end() { \
return octa::RangeIterator<T>(); \
}
template<typename T>
struct ReverseRange: Range<ReverseRange, T> {
struct ReverseRange {
struct type {
typedef typename RangeTraits<T>::difference difference;
typedef typename RangeTraits<T>::value value;
typedef typename RangeTraits<T>::pointer pointer;
typedef typename RangeTraits<T>::reference reference;
typedef typename RangeTraits<T>::category category;
typedef typename RangeTraits<T>::value value;
typedef typename RangeTraits<T>::pointer pointer;
typedef typename RangeTraits<T>::reference reference;
};
ReverseRange(): p_range() {}
@ -135,6 +137,8 @@ namespace octa {
return p_range[length() - i - 1];
}
OCTA_RANGE_ITERATOR(ReverseRange)
private:
T p_range;
};

View File

@ -20,12 +20,12 @@ namespace octa {
* See the range specification as documented on OctaForge wiki.
*/
template<typename T>
struct VectorRange: Range<VectorRange, T> {
struct VectorRange {
struct type {
typedef ptrdiff_t difference;
typedef T value;
typedef T *pointer;
typedef T &reference;
typedef RandomAccessRange category;
typedef T value;
typedef T *pointer;
typedef T &reference;
};
VectorRange(): p_beg(nullptr), p_end(nullptr) {}
@ -68,6 +68,8 @@ namespace octa {
T &operator[](size_t i) { return p_beg[i]; }
const T &operator[](size_t i) const { return p_beg[i]; }
OCTA_RANGE_ITERATOR(VectorRange)
private:
T *p_beg, *p_end;
};