aboutsummaryrefslogtreecommitdiff
path: root/src/list
diff options
context:
space:
mode:
authorAdrian Kummerlaender2015-02-15 14:07:50 +0100
committerAdrian Kummerlaender2015-02-15 14:07:50 +0100
commit46e174935b122c0da4b51532a7f683a512eeaf65 (patch)
tree88bed0d869ce40c460e6370b4954ff159fe3c575 /src/list
parente24f25ada7e8f48dc35cb235e045a4324bccb4f2 (diff)
downloadTypeAsValue-46e174935b122c0da4b51532a7f683a512eeaf65.tar
TypeAsValue-46e174935b122c0da4b51532a7f683a512eeaf65.tar.gz
TypeAsValue-46e174935b122c0da4b51532a7f683a512eeaf65.tar.bz2
TypeAsValue-46e174935b122c0da4b51532a7f683a512eeaf65.tar.lz
TypeAsValue-46e174935b122c0da4b51532a7f683a512eeaf65.tar.xz
TypeAsValue-46e174935b122c0da4b51532a7f683a512eeaf65.tar.zst
TypeAsValue-46e174935b122c0da4b51532a7f683a512eeaf65.zip
Moved class-based implementations into `detail` namespace
* while class templates enable e.g. hiding implementation details they also require evaluation via `Eval` ** this clutters up the actual logic and is now hidden behind aliae that perform the evaluation
Diffstat (limited to 'src/list')
-rw-r--r--src/list/cons.h26
-rw-r--r--src/list/generator/iota.h17
-rw-r--r--src/list/generator/make_list.h16
-rw-r--r--src/list/list.h11
-rw-r--r--src/list/operation/append.h14
-rw-r--r--src/list/operation/basic.h15
-rw-r--r--src/list/operation/delete_nth.h4
-rw-r--r--src/list/operation/drop.h9
-rw-r--r--src/list/operation/higher/drop_while.h14
-rw-r--r--src/list/operation/higher/filter.h18
-rw-r--r--src/list/operation/higher/find.h14
-rw-r--r--src/list/operation/higher/fold.h15
-rw-r--r--src/list/operation/higher/map.h12
-rw-r--r--src/list/operation/higher/partition.h5
-rw-r--r--src/list/operation/higher/query.h12
-rw-r--r--src/list/operation/higher/remove.h34
-rw-r--r--src/list/operation/higher/sort.h34
-rw-r--r--src/list/operation/higher/take_while.h18
-rw-r--r--src/list/operation/nth.h26
-rw-r--r--src/list/operation/reverse.h13
-rw-r--r--src/list/operation/take.h13
21 files changed, 257 insertions, 83 deletions
diff --git a/src/list/cons.h b/src/list/cons.h
index 8efca67..95783b2 100644
--- a/src/list/cons.h
+++ b/src/list/cons.h
@@ -5,18 +5,12 @@
namespace tav {
-template <
- typename CAR,
- typename CDR
->
-struct Cons {
- typedef Pair<CAR, CDR> type;
-};
+namespace detail {
template <typename Pair>
struct Car {
static_assert(
- Eval<IsPair<Pair>>::value,
+ IsPair<Pair>::value,
"Pair type required"
);
@@ -26,7 +20,7 @@ struct Car {
template <typename Pair>
struct Cdr {
static_assert(
- Eval<IsPair<Pair>>::value,
+ IsPair<Pair>::value,
"Pair type required"
);
@@ -35,4 +29,18 @@ struct Cdr {
}
+template <
+ typename CAR,
+ typename CDR
+>
+using Cons = Pair<CAR, CDR>;
+
+template <typename Pair>
+using Car = Eval<detail::Car<Pair>>;
+
+template <typename Pair>
+using Cdr = Eval<detail::Cdr<Pair>>;
+
+}
+
#endif // TYPEASVALUE_SRC_LIST_CONS_H_
diff --git a/src/list/generator/iota.h b/src/list/generator/iota.h
index 56ebeca..73b7cc8 100644
--- a/src/list/generator/iota.h
+++ b/src/list/generator/iota.h
@@ -5,20 +5,22 @@
namespace tav {
+namespace detail {
+
template <
typename Count,
typename Initial,
typename Step
>
struct Iota {
- typedef Eval<Cons<
+ typedef Cons<
Initial,
Eval<Iota<
Substract<Count, Size<1>>,
Add<Initial, Step>,
Step
>>
- >> type;
+ > type;
};
template <
@@ -26,9 +28,18 @@ template <
typename Step
>
struct Iota<Size<1>, Initial, Step> {
- typedef Eval<Cons<Initial, void>> type;
+ typedef Cons<Initial, void> type;
};
}
+template <
+ typename Count,
+ typename Initial,
+ typename Step
+>
+using Iota = Eval<detail::Iota<Count, Initial, Step>>;
+
+}
+
#endif // TYPEASVALUE_SRC_LIST_GENERATOR_IOTA_H_
diff --git a/src/list/generator/make_list.h b/src/list/generator/make_list.h
index d927905..863dce2 100644
--- a/src/list/generator/make_list.h
+++ b/src/list/generator/make_list.h
@@ -6,25 +6,35 @@
namespace tav {
+namespace detail {
+
template <
typename Count,
typename Element
>
struct MakeList {
- typedef Eval<Cons<
+ typedef Cons<
Element,
Eval<MakeList<
Substract<Count, Size<1>>,
Element
>>
- >> type;
+ > type;
};
template <typename Element>
struct MakeList<Size<1>, Element> {
- typedef Eval<Cons<Element, void>> type;
+ typedef Cons<Element, void> type;
};
}
+template <
+ typename Count,
+ typename Element
+>
+using MakeList = Eval<detail::MakeList<Count, Element>>;
+
+}
+
#endif // TYPEASVALUE_SRC_LIST_GENERATOR_MAKE_LIST_H_
diff --git a/src/list/list.h b/src/list/list.h
index e369739..c9e6a9e 100644
--- a/src/list/list.h
+++ b/src/list/list.h
@@ -5,6 +5,8 @@
namespace tav {
+namespace detail {
+
template <
typename Head,
typename... Tail
@@ -36,6 +38,11 @@ struct List<void, void> {
typedef void type;
};
+}
+
+template <typename... Elements>
+using List = Eval<detail::List<Elements...>>;
+
template <
typename Type,
Type... Values
@@ -45,10 +52,10 @@ using ListOfType = List<
>;
template <typename Cons>
-using Head = Eval<Car<Cons>>;
+using Head = Car<Cons>;
template <typename Cons>
-using Tail = Eval<Cdr<Cons>>;
+using Tail = Cdr<Cons>;
}
diff --git a/src/list/operation/append.h b/src/list/operation/append.h
index 28c9adf..2dcd184 100644
--- a/src/list/operation/append.h
+++ b/src/list/operation/append.h
@@ -3,18 +3,20 @@
namespace tav {
+namespace detail {
+
template <
typename Primary,
typename Secondary
>
struct Append {
- typedef Eval<Cons<
+ typedef Cons<
Head<Primary>,
Eval<Append<
Tail<Primary>,
Secondary
>>
- >> type;
+ > type;
};
template <typename Secondary>
@@ -24,4 +26,12 @@ struct Append<void, Secondary> {
}
+template <
+ typename Primary,
+ typename Secondary
+>
+using Append = Eval<detail::Append<Primary, Secondary>>;
+
+}
+
#endif // TYPEASVALUE_SRC_LIST_OPERATION_APPEND_H_
diff --git a/src/list/operation/basic.h b/src/list/operation/basic.h
index 5f9a3f9..a299938 100644
--- a/src/list/operation/basic.h
+++ b/src/list/operation/basic.h
@@ -6,21 +6,24 @@
namespace tav {
-template <typename Cons>
+namespace detail {
+
+template <typename List>
class Length {
private:
template <typename, typename Accumulated>
using accumulate = Add<Size<1>, Accumulated>;
public:
- typedef Eval<Fold<
- accumulate,
- Size<0>,
- Cons
- >> type;
+ typedef tav::Fold<accumulate, Size<0>, List> type;
};
}
+template <typename List>
+using Length = Eval<detail::Length<List>>;
+
+}
+
#endif // TYPEASVALUE_SRC_LIST_OPERATION_BASIC_H_
diff --git a/src/list/operation/delete_nth.h b/src/list/operation/delete_nth.h
index 6127ade..18e52bf 100644
--- a/src/list/operation/delete_nth.h
+++ b/src/list/operation/delete_nth.h
@@ -12,8 +12,8 @@ template <
typename List
>
using DeleteNth = Append<
- Eval<Take<Index, List>>,
- Eval<Drop<Add<Index, Size<1>>, List>>
+ Take<Index, List>,
+ Drop<Add<Index, Size<1>>, List>
>;
}
diff --git a/src/list/operation/drop.h b/src/list/operation/drop.h
index c61983b..c7745d7 100644
--- a/src/list/operation/drop.h
+++ b/src/list/operation/drop.h
@@ -5,6 +5,8 @@
namespace tav {
+namespace detail {
+
template <
typename Count,
typename Current
@@ -31,6 +33,13 @@ struct Drop<Size<0>, void> {
typedef void type;
};
+}
+
+template <
+ typename Count,
+ typename Current
+>
+using Drop = Eval<detail::Drop<Count, Current>>;
}
diff --git a/src/list/operation/higher/drop_while.h b/src/list/operation/higher/drop_while.h
index 8ba2664..021698f 100644
--- a/src/list/operation/higher/drop_while.h
+++ b/src/list/operation/higher/drop_while.h
@@ -5,16 +5,18 @@
namespace tav {
+namespace detail {
+
template <
template<typename> class Predicate,
typename Current
>
struct DropWhile {
- typedef Eval<If<
+ typedef If<
Eval<Predicate<Head<Current>>>,
Eval<DropWhile<Predicate, Tail<Current>>>,
Current
- >> type;
+ > type;
};
template <
@@ -26,4 +28,12 @@ struct DropWhile<Predicate, void> {
}
+template <
+ template<typename> class Predicate,
+ typename Current
+>
+using DropWhile = Eval<detail::DropWhile<Predicate, Current>>;
+
+}
+
#endif // TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_DROP_WHILE_H_
diff --git a/src/list/operation/higher/filter.h b/src/list/operation/higher/filter.h
index 3588400..17d49c2 100644
--- a/src/list/operation/higher/filter.h
+++ b/src/list/operation/higher/filter.h
@@ -6,6 +6,8 @@
namespace tav {
+namespace detail {
+
template <
template<typename> class Predicate,
typename List
@@ -18,28 +20,22 @@ class Filter {
>
using predicate_wrapper = If<
Eval<Predicate<Current>>,
- Eval<Cons<Current, Previous>>,
+ Cons<Current, Previous>,
Previous
>;
public:
- typedef Eval<Fold<predicate_wrapper, void, List>> type;
+ typedef tav::Fold<predicate_wrapper, void, List> type;
};
+}
+
template <
template<typename> class Predicate,
typename List
>
-class Remove {
- private:
- template <typename Element>
- using predicate_negator = Not<Predicate<Element>>;
-
- public:
- typedef Eval<Filter<predicate_negator, List>> type;
-
-};
+using Filter = Eval<detail::Filter<Predicate, List>>;
}
diff --git a/src/list/operation/higher/find.h b/src/list/operation/higher/find.h
index abc3199..48533b7 100644
--- a/src/list/operation/higher/find.h
+++ b/src/list/operation/higher/find.h
@@ -6,16 +6,18 @@
namespace tav {
+namespace detail {
+
template <
template<typename> class Predicate,
typename Current
>
struct Find {
- typedef Eval<If<
+ typedef If<
Eval<Predicate<Head<Current>>>,
Head<Current>,
Eval<Find<Predicate, Tail<Current>>>
- >> type;
+ > type;
};
template <
@@ -27,4 +29,12 @@ struct Find<Predicate, void> {
}
+template <
+ template<typename> class Predicate,
+ typename List
+>
+using Find = Eval<detail::Find<Predicate, List>>;
+
+}
+
#endif // TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_FIND_H_
diff --git a/src/list/operation/higher/fold.h b/src/list/operation/higher/fold.h
index 3ed0a42..7364fe5 100644
--- a/src/list/operation/higher/fold.h
+++ b/src/list/operation/higher/fold.h
@@ -3,16 +3,18 @@
namespace tav {
+namespace detail {
+
template <
template<typename, typename> class Function,
typename Initial,
typename Current
>
struct Fold {
- typedef Eval<Function<
+ typedef Function<
Head<Current>,
Eval<Fold<Function, Initial, Tail<Current>>>
- >> type;
+ > type;
};
template <
@@ -25,4 +27,13 @@ struct Fold<Function, Initial, void> {
}
+template <
+ template<typename, typename> class Function,
+ typename Initial,
+ typename Current
+>
+using Fold = Eval<detail::Fold<Function, Initial, Current>>;
+
+}
+
#endif // TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_FOLD_H_
diff --git a/src/list/operation/higher/map.h b/src/list/operation/higher/map.h
index ac214b7..cc30355 100644
--- a/src/list/operation/higher/map.h
+++ b/src/list/operation/higher/map.h
@@ -5,6 +5,8 @@
namespace tav {
+namespace detail {
+
template <
template<typename> class Function,
typename List
@@ -21,10 +23,18 @@ class Map {
>;
public:
- typedef Eval<Fold<function_wrapper, void, List>> type;
+ using type = tav::Fold<function_wrapper, void, List>;
};
}
+template <
+ template<typename> class Function,
+ typename List
+>
+using Map = Eval<detail::Map<Function, List>>;
+
+}
+
#endif // TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_MAP_H_
diff --git a/src/list/operation/higher/partition.h b/src/list/operation/higher/partition.h
index eedeb91..ee49fcc 100644
--- a/src/list/operation/higher/partition.h
+++ b/src/list/operation/higher/partition.h
@@ -2,6 +2,7 @@
#define TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_PARTITION_H_
#include "filter.h"
+#include "remove.h"
namespace tav {
@@ -10,8 +11,8 @@ template <
typename Elements
>
using Partition = Cons<
- Eval<Filter<Predicate, Elements>>,
- Eval<Remove<Predicate, Elements>>
+ Filter<Predicate, Elements>,
+ Remove<Predicate, Elements>
>;
}
diff --git a/src/list/operation/higher/query.h b/src/list/operation/higher/query.h
index 1d00267..c6c73f4 100644
--- a/src/list/operation/higher/query.h
+++ b/src/list/operation/higher/query.h
@@ -15,7 +15,7 @@ template <
using Any = Fold<
Or,
Boolean<false>,
- Eval<Map<Predicate, List>>
+ Map<Predicate, List>
>;
template <
@@ -25,16 +25,14 @@ template <
using All = Fold<
And,
Boolean<true>,
- Eval<Map<Predicate, List>>
+ Map<Predicate, List>
>;
template <
template<typename> class Predicate,
typename List
>
-using None = Not<
- Eval<Any<Predicate, List>>
->;
+using None = Not<Any<Predicate, List>>;
template <
template<typename> class Predicate,
@@ -42,8 +40,8 @@ template <
>
using Count = Fold<
Add,
- tav::Size<0>,
- Eval<Map<Predicate, List>>
+ Size<0>,
+ Map<Predicate, List>
>;
}
diff --git a/src/list/operation/higher/remove.h b/src/list/operation/higher/remove.h
new file mode 100644
index 0000000..e67e962
--- /dev/null
+++ b/src/list/operation/higher/remove.h
@@ -0,0 +1,34 @@
+#ifndef TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_REMOVE_H_
+#define TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_REMOVE_H_
+
+#include "filter.h"
+
+namespace tav {
+
+namespace detail {
+
+template <
+ template<typename> class Predicate,
+ typename List
+>
+class Remove {
+ private:
+ template <typename Element>
+ using predicate_negator = Not<Predicate<Element>>;
+
+ public:
+ typedef tav::Filter<predicate_negator, List> type;
+
+};
+
+}
+
+template <
+ template<typename> class Predicate,
+ typename List
+>
+using Remove = Eval<detail::Remove<Predicate, List>>;
+
+}
+
+#endif // TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_REMOVE_H_
diff --git a/src/list/operation/higher/sort.h b/src/list/operation/higher/sort.h
index cf86e9b..2976e06 100644
--- a/src/list/operation/higher/sort.h
+++ b/src/list/operation/higher/sort.h
@@ -8,31 +8,33 @@
namespace tav {
+namespace detail {
+
template <
template<typename, typename> class Comparator,
typename Sequence
>
class Sort {
private:
- using index = Divide<Eval<Length<Sequence>>, Size<2>>;
- using pivot = Eval<Nth<index, Sequence>>;
+ using index = Divide<tav::Length<Sequence>, Size<2>>;
+ using pivot = tav::Nth<index, Sequence>;
- using partitions = Eval<Partition<
+ using partitions = Partition<
Apply<Comparator, pivot, _0>::template function,
- Eval<DeleteNth<index, Sequence>>
- >>;
+ DeleteNth<index, Sequence>
+ >;
- using lhs = Eval<Car<partitions>>;
- using rhs = Eval<Cdr<partitions>>;
+ using lhs = tav::Car<partitions>;
+ using rhs = tav::Cdr<partitions>;
public:
- typedef Eval<Concatenate<
- Eval<List<
+ using type = Concatenate<
+ tav::List<
Eval<Sort<Comparator, lhs>>,
- Eval<List<pivot>>,
+ tav::List<pivot>,
Eval<Sort<Comparator, rhs>>
- >>
- >> type;
+ >
+ >;
};
template <template<typename, typename> class Comparator>
@@ -42,4 +44,12 @@ struct Sort<Comparator, void> {
}
+template <
+ template<typename, typename> class Comparator,
+ typename Sequence
+>
+using Sort = Eval<detail::Sort<Comparator, Sequence>>;
+
+}
+
#endif // TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_SORT_H_
diff --git a/src/list/operation/higher/take_while.h b/src/list/operation/higher/take_while.h
index 8e61c45..dec5551 100644
--- a/src/list/operation/higher/take_while.h
+++ b/src/list/operation/higher/take_while.h
@@ -5,19 +5,21 @@
namespace tav {
+namespace detail {
+
template <
template<typename> class Predicate,
typename Current
>
struct TakeWhile {
- typedef Eval<If<
+ typedef If<
Eval<Predicate<Head<Current>>>,
- Eval<Cons<
+ Cons<
Head<Current>,
Eval<TakeWhile<Predicate, Tail<Current>>>
- >>,
+ >,
void
- >> type;
+ > type;
};
template <
@@ -29,4 +31,12 @@ struct TakeWhile<Predicate, void> {
}
+template <
+ template<typename> class Predicate,
+ typename Current
+>
+using TakeWhile = Eval<detail::TakeWhile<Predicate, Current>>;
+
+}
+
#endif // TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_TAKE_WHILE_H_
diff --git a/src/list/operation/nth.h b/src/list/operation/nth.h
index 08e60cc..5a604f4 100644
--- a/src/list/operation/nth.h
+++ b/src/list/operation/nth.h
@@ -5,20 +5,22 @@
namespace tav {
+namespace detail {
+
template <
typename Index,
- typename Pair
+ typename List
>
struct Nth {
typedef Eval<Nth<
Substract<Index, Size<1>>,
- Tail<Pair>
+ Tail<List>
>> type;
};
-template <typename Pair>
-struct Nth<Size<0>, Pair> {
- typedef Head<Pair> type;
+template <typename List>
+struct Nth<Size<0>, List> {
+ typedef Head<List> type;
};
template <typename Index>
@@ -31,14 +33,22 @@ struct Nth<Size<0>, void> {
typedef void type;
};
+}
+
+template <
+ typename Index,
+ typename List
+>
+using Nth = Eval<detail::Nth<Index, List>>;
+
template <typename List>
-using First = Eval<Nth<Size<0>, List>>;
+using First = Nth<Size<0>, List>;
template <typename List>
-using Second = Eval<Nth<Size<1>, List>>;
+using Second = Nth<Size<1>, List>;
template <typename List>
-using Third = Eval<Nth<Size<2>, List>>;
+using Third = Nth<Size<2>, List>;
}
diff --git a/src/list/operation/reverse.h b/src/list/operation/reverse.h
index d4b2be9..aabba92 100644
--- a/src/list/operation/reverse.h
+++ b/src/list/operation/reverse.h
@@ -6,6 +6,8 @@
namespace tav {
+namespace detail {
+
template <typename Sequence>
class Reverse {
private:
@@ -13,16 +15,21 @@ class Reverse {
typename Current,
typename Previous
>
- using reversed_append = Append<
+ using reversed_append = tav::Append<
Previous,
- Eval<List<Current>>
+ tav::List<Current>
>;
public:
- typedef Eval<Fold<reversed_append, void, Sequence>> type;
+ typedef tav::Fold<reversed_append, void, Sequence> type;
};
}
+template <typename Sequence>
+using Reverse = Eval<detail::Reverse<Sequence>>;
+
+}
+
#endif // TYPEASVALUE_SRC_LIST_OPERATION_REVERSE_H_
diff --git a/src/list/operation/take.h b/src/list/operation/take.h
index fdff123..effba33 100644
--- a/src/list/operation/take.h
+++ b/src/list/operation/take.h
@@ -5,18 +5,20 @@
namespace tav {
+namespace detail {
+
template <
typename Count,
typename Current
>
struct Take {
- typedef Eval<Cons<
+ typedef Cons<
Head<Current>,
Eval<Take<
Substract<Count, Size<1>>,
Tail<Current>
>>
- >> type;
+ > type;
};
template <typename Current>
@@ -34,6 +36,13 @@ struct Take<Size<0>, void> {
typedef void type;
};
+}
+
+template <
+ typename Count,
+ typename Current
+>
+using Take = Eval<detail::Take<Count, Current>>;
}