ditch RangeTraits for alias definitions
parent
da69a57015
commit
2d10cd9280
|
@ -14,8 +14,6 @@
|
|||
#include "octa/initializer_list.h"
|
||||
|
||||
namespace octa {
|
||||
template<typename T>
|
||||
using __OctaRangeSize = typename RangeTraits<T>::size_type;
|
||||
|
||||
/* partitioning */
|
||||
|
||||
|
@ -43,9 +41,9 @@ namespace octa {
|
|||
|
||||
template<typename R, typename C>
|
||||
void insertion_sort(R range, C compare) {
|
||||
__OctaRangeSize<R> rlen = range.length();
|
||||
for (__OctaRangeSize<R> i = 1; i < rlen; ++i) {
|
||||
__OctaRangeSize<R> j = i, v = range[i];
|
||||
RangeSize<R> rlen = range.length();
|
||||
for (RangeSize<R> i = 1; i < rlen; ++i) {
|
||||
RangeSize<R> j = i, v = range[i];
|
||||
while (j > 0 && !compare(range[j - 1], v)) {
|
||||
range[j] = range[j - 1];
|
||||
--j;
|
||||
|
@ -56,7 +54,7 @@ namespace octa {
|
|||
|
||||
template<typename R>
|
||||
void insertion_sort(R range) {
|
||||
insertion_sort(range, Less<typename RangeTraits<R>::value_type>());
|
||||
insertion_sort(range, Less<RangeValue<R>>());
|
||||
}
|
||||
|
||||
/* sort (introsort) */
|
||||
|
@ -69,12 +67,12 @@ namespace octa {
|
|||
};
|
||||
|
||||
template<typename R, typename C>
|
||||
void __octa_hs_sift_down(R range, __OctaRangeSize<R> s,
|
||||
__OctaRangeSize<R> e, C compare) {
|
||||
__OctaRangeSize<R> r = s;
|
||||
void __octa_hs_sift_down(R range, RangeSize<R> s,
|
||||
RangeSize<R> e, C compare) {
|
||||
RangeSize<R> r = s;
|
||||
while ((r * 2 + 1) <= e) {
|
||||
__OctaRangeSize<R> ch = r * 2 + 1;
|
||||
__OctaRangeSize<R> sw = r;
|
||||
RangeSize<R> ch = r * 2 + 1;
|
||||
RangeSize<R> sw = r;
|
||||
if (compare(range[sw], range[ch]))
|
||||
sw = ch;
|
||||
if (((ch + 1) <= e) && compare(range[sw], range[ch + 1]))
|
||||
|
@ -88,13 +86,13 @@ namespace octa {
|
|||
|
||||
template<typename R, typename C>
|
||||
void __octa_heapsort(R range, C compare) {
|
||||
__OctaRangeSize<R> len = range.length();
|
||||
__OctaRangeSize<R> st = (len - 2) / 2;
|
||||
RangeSize<R> len = range.length();
|
||||
RangeSize<R> st = (len - 2) / 2;
|
||||
for (;;) {
|
||||
__octa_hs_sift_down(range, st, len - 1, compare);
|
||||
if (st-- == 0) break;
|
||||
}
|
||||
__OctaRangeSize<R> e = len - 1;
|
||||
RangeSize<R> e = len - 1;
|
||||
while (e > 0) {
|
||||
swap(range[e], range[0]);
|
||||
--e;
|
||||
|
@ -103,7 +101,7 @@ namespace octa {
|
|||
}
|
||||
|
||||
template<typename R, typename C>
|
||||
void __octa_introloop(R range, C compare, __OctaRangeSize<R> depth) {
|
||||
void __octa_introloop(R range, C compare, RangeSize<R> depth) {
|
||||
if (range.length() <= 10) {
|
||||
insertion_sort(range, compare);
|
||||
return;
|
||||
|
@ -112,7 +110,7 @@ namespace octa {
|
|||
__octa_heapsort(range, compare);
|
||||
return;
|
||||
}
|
||||
typename RangeTraits<R>::reference p = range[range.length() / 2];
|
||||
RangeReference<R> p = range[range.length() / 2];
|
||||
swap(p, range.last());
|
||||
R r = partition(range, __OctaUnaryCompare<decltype(p), C>{ p, compare });
|
||||
R l = range.slice(0, range.length() - r.length());
|
||||
|
@ -123,7 +121,7 @@ namespace octa {
|
|||
|
||||
template<typename R, typename C>
|
||||
void __octa_introsort(R range, C compare) {
|
||||
__octa_introloop(range, compare, __OctaRangeSize<R>(2
|
||||
__octa_introloop(range, compare, RangeSize<R>(2
|
||||
* (log(range.length()) / log(2))));
|
||||
}
|
||||
|
||||
|
@ -134,7 +132,7 @@ namespace octa {
|
|||
|
||||
template<typename R>
|
||||
void sort(R range) {
|
||||
sort(range, Less<typename RangeTraits<R>::value_type>());
|
||||
sort(range, Less<RangeValue<R>>());
|
||||
}
|
||||
|
||||
/* min/max(_element) */
|
||||
|
@ -277,8 +275,8 @@ namespace octa {
|
|||
}
|
||||
|
||||
template<typename R, typename T>
|
||||
__OctaRangeSize<R> count(R range, const T &v) {
|
||||
__OctaRangeSize<R> ret = 0;
|
||||
RangeSize<R> count(R range, const T &v) {
|
||||
RangeSize<R> ret = 0;
|
||||
for (; !range.empty(); range.pop_first())
|
||||
if (range.first() == v)
|
||||
++ret;
|
||||
|
@ -286,8 +284,8 @@ namespace octa {
|
|||
}
|
||||
|
||||
template<typename R, typename P>
|
||||
__OctaRangeSize<R> count_if(R range, P pred) {
|
||||
__OctaRangeSize<R> ret = 0;
|
||||
RangeSize<R> count_if(R range, P pred) {
|
||||
RangeSize<R> ret = 0;
|
||||
for (; !range.empty(); range.pop_first())
|
||||
if (pred(range.first()))
|
||||
++ret;
|
||||
|
@ -295,8 +293,8 @@ namespace octa {
|
|||
}
|
||||
|
||||
template<typename R, typename P>
|
||||
__OctaRangeSize<R> count_if_not(R range, P pred) {
|
||||
__OctaRangeSize<R> ret = 0;
|
||||
RangeSize<R> count_if_not(R range, P pred) {
|
||||
RangeSize<R> ret = 0;
|
||||
for (; !range.empty(); range.pop_first())
|
||||
if (!pred(range.first()))
|
||||
++ret;
|
||||
|
|
46
octa/range.h
46
octa/range.h
|
@ -19,13 +19,10 @@ namespace octa {
|
|||
struct BidirectionalRangeTag {};
|
||||
struct RandomAccessRangeTag {};
|
||||
|
||||
template<typename T>
|
||||
struct RangeTraits {
|
||||
typedef typename T::range_category range_category;
|
||||
typedef typename T::size_type size_type;
|
||||
typedef typename T::value_type value_type;
|
||||
typedef typename T::reference reference;
|
||||
};
|
||||
template<typename T> using RangeCategory = typename T::range_category;
|
||||
template<typename T> using RangeSize = typename T::size_type;
|
||||
template<typename T> using RangeValue = typename T::value_type;
|
||||
template<typename T> using RangeReference = typename T::reference;
|
||||
|
||||
template<typename T>
|
||||
struct __OctaRangeIterator {
|
||||
|
@ -36,10 +33,10 @@ namespace octa {
|
|||
p_range.pop_first();
|
||||
return *this;
|
||||
}
|
||||
typename RangeTraits<T>::reference operator*() {
|
||||
RangeReference<T> operator*() {
|
||||
return p_range.first();
|
||||
}
|
||||
typename RangeTraits<T>::reference operator*() const {
|
||||
RangeReference<T> operator*() const {
|
||||
return p_range.first();
|
||||
}
|
||||
bool operator!=(__OctaRangeIterator) const { return !p_range.empty(); }
|
||||
|
@ -77,14 +74,11 @@ namespace octa {
|
|||
|
||||
template<typename T>
|
||||
struct ReverseRange: InputRange<ReverseRange<T>,
|
||||
typename RangeTraits<T>::range_category,
|
||||
typename RangeTraits<T>::value_type,
|
||||
typename RangeTraits<T>::reference,
|
||||
typename RangeTraits<T>::size_type
|
||||
RangeCategory<T>, RangeValue<T>, RangeReference<T>, RangeSize<T>
|
||||
> {
|
||||
private:
|
||||
typedef typename RangeTraits<T>::reference r_ref;
|
||||
typedef typename RangeTraits<T>::size_type r_size;
|
||||
typedef RangeReference<T> r_ref;
|
||||
typedef RangeSize<T> r_size;
|
||||
|
||||
T p_range;
|
||||
|
||||
|
@ -194,15 +188,12 @@ namespace octa {
|
|||
|
||||
template<typename T>
|
||||
struct MoveRange: InputRange<MoveRange<T>,
|
||||
typename RangeTraits<T>::range_category,
|
||||
typename RangeTraits<T>::value_type,
|
||||
typename RangeTraits<T>::value_type &&,
|
||||
typename RangeTraits<T>::size_type
|
||||
RangeCategory<T>, RangeValue<T>, RangeValue<T> &&, RangeSize<T>
|
||||
> {
|
||||
private:
|
||||
typedef typename RangeTraits<T>::value_type r_val;
|
||||
typedef typename RangeTraits<T>::value_type &&r_ref;
|
||||
typedef typename RangeTraits<T>::size_type r_size;
|
||||
typedef RangeValue<T> r_val;
|
||||
typedef RangeValue<T> &&r_ref;
|
||||
typedef RangeSize<T> r_size;
|
||||
|
||||
T p_range;
|
||||
|
||||
|
@ -397,14 +388,13 @@ namespace octa {
|
|||
|
||||
template<typename T>
|
||||
struct EnumeratedRange: InputRange<EnumeratedRange<T>,
|
||||
InputRangeTag, typename RangeTraits<T>::value_type,
|
||||
EnumeratedValue<typename RangeTraits<T>::reference,
|
||||
typename RangeTraits<T>::size_type>,
|
||||
typename RangeTraits<T>::size_type
|
||||
InputRangeTag, RangeValue<T>,
|
||||
EnumeratedValue<RangeReference<T>, RangeSize<T>>,
|
||||
RangeSize<T>
|
||||
> {
|
||||
private:
|
||||
typedef typename RangeTraits<T>::reference r_ref;
|
||||
typedef typename RangeTraits<T>::size_type r_size;
|
||||
typedef RangeReference<T> r_ref;
|
||||
typedef RangeSize<T> r_size;
|
||||
|
||||
T p_range;
|
||||
r_size p_index;
|
||||
|
|
Loading…
Reference in New Issue