ditch RangeTraits for alias definitions

master
Daniel Kolesa 2015-05-03 21:54:26 +01:00
parent da69a57015
commit 2d10cd9280
2 changed files with 40 additions and 52 deletions

View File

@ -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;

View File

@ -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;