new range category: ContiguousRange (guaranteed to be backed by contiguous memory)

master
Daniel Kolesa 2015-07-23 01:28:25 +01:00
parent 0e0ba19ead
commit 7fc4ce0a3a
2 changed files with 21 additions and 2 deletions

View File

@ -22,6 +22,7 @@ struct ForwardRangeTag: InputRangeTag {};
struct BidirectionalRangeTag: ForwardRangeTag {};
struct RandomAccessRangeTag: BidirectionalRangeTag {};
struct FiniteRandomAccessRangeTag: RandomAccessRangeTag {};
struct ContiguousRangeTag: FiniteRandomAccessRangeTag {};
template<typename T> struct RangeHalf;
@ -162,6 +163,24 @@ struct IsInfiniteRandomAccessRange: IntegralConstant<bool,
(IsRandomAccessRange<T>::value && !IsFiniteRandomAccessRange<T>::value)
> {};
// is contiguous range
namespace detail {
template<typename T, bool = IsConvertible<
RangeCategory<T>, ContiguousRangeTag
>::value> struct IsContiguousRangeBase: False {};
template<typename T>
struct IsContiguousRangeBase<T, true>: True {};
}
template<typename T, bool = detail::IsRangeTest<T>::value>
struct IsContiguousRange: False {};
template<typename T>
struct IsContiguousRange<T, true>:
detail::IsContiguousRangeBase<T>::Type {};
// is output range
namespace detail {
@ -789,7 +808,7 @@ NumberRange<T> range(T v) {
}
template<typename T>
struct PointerRange: InputRange<PointerRange<T>, FiniteRandomAccessRangeTag, T> {
struct PointerRange: InputRange<PointerRange<T>, ContiguousRangeTag, T> {
PointerRange() = delete;
PointerRange(T *beg, T *end): p_beg(beg), p_end(end) {}
PointerRange(T *beg, Size n): p_beg(beg), p_end(beg + n) {}

View File

@ -22,7 +22,7 @@ template<typename T, typename A = Allocator<T>> class StringBase;
template<typename T>
struct CharRangeBase: InputRange<
CharRangeBase<T>, FiniteRandomAccessRangeTag, T
CharRangeBase<T>, ContiguousRangeTag, T
> {
private:
struct Nat {};