aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Kummerlaender2015-02-15 14:07:50 +0100
committerAdrian Kummerlaender2015-02-15 14:07:50 +0100
commit46e174935b122c0da4b51532a7f683a512eeaf65 (patch)
tree88bed0d869ce40c460e6370b4954ff159fe3c575
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
-rw-r--r--example/prime/prime.cc12
-rw-r--r--src/conditional/cond.h19
-rw-r--r--src/conditional/if.h4
-rw-r--r--src/function/apply.h8
-rw-r--r--src/function/detail/apply.h8
-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
-rw-r--r--src/pair.h2
-rw-r--r--src/runtime/list/for_each.h2
-rw-r--r--test.cc355
29 files changed, 467 insertions, 283 deletions
diff --git a/example/prime/prime.cc b/example/prime/prime.cc
index b826a72..cd119d8 100644
--- a/example/prime/prime.cc
+++ b/example/prime/prime.cc
@@ -5,13 +5,13 @@
#include "function/apply.h"
#include "list/list.h"
-#include "list/operation/higher/filter.h"
#include "list/generator/iota.h"
+#include "list/operation/higher/remove.h"
#include "runtime/list/for_each.h"
// (define candidates (iota 1000 2 1))
-using candidates = tav::Eval<tav::Iota<tav::Size<1000>, tav::Int<2>, tav::Int<1>>>;
+using candidates = tav::Iota<tav::Size<1000>, tav::Int<2>, tav::Int<1>>;
// (define (isMultipleOf candidate base) (= (modulo candidate base) 0))
template <
@@ -42,15 +42,15 @@ using removeMultiplesOf = tav::Remove<
// (car candidates)))))))
template <typename Candidates>
struct Sieve {
- typedef tav::Eval<tav::Cons<
+ typedef tav::Cons<
tav::Head<Candidates>,
tav::Eval<Sieve<
- tav::Eval<removeMultiplesOf<
+ removeMultiplesOf<
tav::Tail<Candidates>,
tav::Head<Candidates>
- >>
+ >
>>
- >> type;
+ > type;
};
template <>
diff --git a/src/conditional/cond.h b/src/conditional/cond.h
index 2d6a415..f6b7965 100644
--- a/src/conditional/cond.h
+++ b/src/conditional/cond.h
@@ -8,22 +8,29 @@
namespace tav {
+namespace detail {
+
template <typename... Branches>
class Cond {
private:
template <typename Pair>
- using predicate = IsTrue<Eval<Eval<Car<Pair>>>>;
+ using predicate = IsTrue<tav::Car<Pair>>;
public:
- typedef Eval<Cdr<
- Eval<Find<
+ typedef tav::Cdr<
+ tav::Find<
predicate,
- Eval<List<Branches...>>
- >>
- >> type;
+ tav::List<Branches...>
+ >
+ > type;
};
}
+template <typename... Branches>
+using Cond = Eval<detail::Cond<Branches...>>;
+
+}
+
#endif // TYPEASVALUE_SRC_CONDITIONAL_COND_H_
diff --git a/src/conditional/if.h b/src/conditional/if.h
index b99f399..9be1a50 100644
--- a/src/conditional/if.h
+++ b/src/conditional/if.h
@@ -10,11 +10,11 @@ template <
typename TrueBranch,
typename FalseBranch
>
-using If = std::conditional<
+using If = Eval<std::conditional<
Condition::value,
TrueBranch,
FalseBranch
->;
+>>;
}
diff --git a/src/function/apply.h b/src/function/apply.h
index f4de292..591fa8a 100644
--- a/src/function/apply.h
+++ b/src/function/apply.h
@@ -19,22 +19,22 @@ template <
>
struct Apply : Cond<
Pair<
- GreaterThan<Eval<detail::count_placeholders<Arguments...>>, Size<2>>,
+ GreaterThan<detail::count_placeholders<Arguments...>, Size<2>>,
detail::apply_variadic<Function, Arguments...>
>,
Pair<
- IsEqualValue<Eval<detail::count_placeholders<Arguments...>>, Size<2>>,
+ IsEqualValue<detail::count_placeholders<Arguments...>, Size<2>>,
detail::apply_pair<Function, Arguments...>
>,
Pair<
- IsEqualValue<Eval<detail::count_placeholders<Arguments...>>, Size<1>>,
+ IsEqualValue<detail::count_placeholders<Arguments...>, Size<1>>,
detail::apply_single<Function, Arguments...>
>,
Pair<
Boolean<true>,
detail::apply_none<Function, Arguments...>
>
->::type { };
+> { };
}
diff --git a/src/function/detail/apply.h b/src/function/detail/apply.h
index da347f7..8d4ef6d 100644
--- a/src/function/detail/apply.h
+++ b/src/function/detail/apply.h
@@ -13,7 +13,7 @@ namespace detail {
struct placeholder_tag { };
template <typename Type>
-using is_placeholder = tav::Boolean<
+using is_placeholder = Boolean<
std::is_base_of<placeholder_tag, Type>::value
>;
@@ -33,13 +33,13 @@ template <
int Index
>
struct resolve_placeholder<Partials, placeholder<Index>> {
- typedef Eval<Nth<Size<Index>, Partials>> type;
+ typedef tav::Nth<Size<Index>, Partials> type;
};
template <typename... Arguments>
using count_placeholders = Count<
is_placeholder,
- Eval<List<Arguments...>>
+ tav::List<Arguments...>
>;
template <
@@ -58,7 +58,7 @@ struct apply_variadic {
template <typename... Partials>
using function = Function<
Eval<resolve_placeholder<
- Eval<List<Partials...>>,
+ tav::List<Partials...>,
Arguments
>>...
>;
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 {