diff options
author | Adrian Kummerlaender | 2015-01-26 19:19:45 +0100 |
---|---|---|
committer | Adrian Kummerlaender | 2015-01-26 19:19:45 +0100 |
commit | 27b991ea23f71093b274b3ff1692c47274eb4d1d (patch) | |
tree | 10c4d4243087441484d57dddd3cefcd3888152f9 | |
parent | 7ce93ff513a993b8b46fbb401b232d6f557b948b (diff) | |
download | TypeAsValue-27b991ea23f71093b274b3ff1692c47274eb4d1d.tar TypeAsValue-27b991ea23f71093b274b3ff1692c47274eb4d1d.tar.gz TypeAsValue-27b991ea23f71093b274b3ff1692c47274eb4d1d.tar.bz2 TypeAsValue-27b991ea23f71093b274b3ff1692c47274eb4d1d.tar.lz TypeAsValue-27b991ea23f71093b274b3ff1692c47274eb4d1d.tar.xz TypeAsValue-27b991ea23f71093b274b3ff1692c47274eb4d1d.tar.zst TypeAsValue-27b991ea23f71093b274b3ff1692c47274eb4d1d.zip |
Redefined `Length` in terms of `Apply` and `Fold`
* this function illustrates the use case `Apply` is currently intended for
* moved `Take` and `Nth` into separate files to resolve header resolution conflicts
-rw-r--r-- | src/function/apply.h | 5 | ||||
-rw-r--r-- | src/list/list.h | 2 | ||||
-rw-r--r-- | src/list/operation/basic.h | 72 | ||||
-rw-r--r-- | src/list/operation/nth.h | 31 | ||||
-rw-r--r-- | src/list/operation/take.h | 40 | ||||
-rw-r--r-- | test.cc | 1 |
6 files changed, 83 insertions, 68 deletions
diff --git a/src/function/apply.h b/src/function/apply.h index 6012a01..8e780e0 100644 --- a/src/function/apply.h +++ b/src/function/apply.h @@ -3,6 +3,9 @@ #include <type_traits> +#include "list/list.h" +#include "list/operation/nth.h" + namespace tav { namespace detail { @@ -45,8 +48,6 @@ template < typename... Arguments > struct Apply { - typedef typename tav::List<Arguments...>::type argument_list; - template <typename... Partials> using variadic_type = Function< typename detail::resolve_placeholder< diff --git a/src/list/list.h b/src/list/list.h index 5c67872..c03a0ef 100644 --- a/src/list/list.h +++ b/src/list/list.h @@ -30,6 +30,8 @@ using Tail = Cdr<Cons>; } #include "operation/basic.h" +#include "operation/nth.h" +#include "operation/take.h" #include "operation/append.h" #include "operation/concatenate.h" diff --git a/src/list/operation/basic.h b/src/list/operation/basic.h index d80b347..1f4b043 100644 --- a/src/list/operation/basic.h +++ b/src/list/operation/basic.h @@ -1,76 +1,18 @@ #ifndef TYPEASVALUE_SRC_LIST_OPERATION_BASIC_H_ #define TYPEASVALUE_SRC_LIST_OPERATION_BASIC_H_ -#include "operation/math.h" #include "higher/fold.h" +#include "function/apply.h" +#include "operation/math.h" namespace tav { template <typename Cons> -class Length { - private: - template < - typename, - typename Previous - > - struct count { - typedef Add<Size<1>, Previous> type; - }; - - public: - typedef typename Fold<count, Size<0>, Cons>::type type; - -}; - -template < - typename Index, - typename Cons -> -struct Nth { - typedef typename Nth< - Substract<Index, Size<1>>, - Tail<Cons> - >::type type; -}; - -template <typename Index> -struct Nth<Index, void> { - typedef void type; -}; - -template <typename Cons> -struct Nth<Size<0>, Cons> { - typedef Head<Cons> type; -}; - -template < - typename Count, - typename Current -> -struct Take { - typedef Cons< - Head<Current>, - typename Take< - Substract<Count, Size<1>>, - Tail<Current> - >::type - > type; -}; - -template <typename Current> -struct Take<Size<0>, Current> { - typedef void type; -}; - -template <typename Count> -struct Take<Count, void> { - typedef void type; -}; - -template <> -struct Take<Size<0>, void> { - typedef void type; -}; +using Length = Fold< + Apply<Add, Size<1>, _1>::pair_type, + Size<0>, + Cons +>; } diff --git a/src/list/operation/nth.h b/src/list/operation/nth.h new file mode 100644 index 0000000..8eb88ba --- /dev/null +++ b/src/list/operation/nth.h @@ -0,0 +1,31 @@ +#ifndef TYPEASVALUE_SRC_LIST_OPERATION_NTH_H_ +#define TYPEASVALUE_SRC_LIST_OPERATION_NTH_H_ + +#include "operation/math.h" + +namespace tav { + +template < + typename Index, + typename Cons +> +struct Nth { + typedef typename Nth< + Substract<Index, Size<1>>, + Tail<Cons> + >::type type; +}; + +template <typename Cons> +struct Nth<Size<0>, Cons> { + typedef Head<Cons> type; +}; + +template <typename Index> +struct Nth<Index, void> { + typedef void type; +}; + +} + +#endif // TYPEASVALUE_SRC_LIST_OPERATION_NTH_H_ diff --git a/src/list/operation/take.h b/src/list/operation/take.h new file mode 100644 index 0000000..db25640 --- /dev/null +++ b/src/list/operation/take.h @@ -0,0 +1,40 @@ +#ifndef TYPEASVALUE_SRC_LIST_OPERATION_TAKE_H_ +#define TYPEASVALUE_SRC_LIST_OPERATION_TAKE_H_ + +#include "operation/math.h" + +namespace tav { + +template < + typename Count, + typename Current +> +struct Take { + typedef Cons< + Head<Current>, + typename Take< + Substract<Count, Size<1>>, + Tail<Current> + >::type + > type; +}; + +template <typename Current> +struct Take<Size<0>, Current> { + typedef void type; +}; + +template <typename Count> +struct Take<Count, void> { + typedef void type; +}; + +template <> +struct Take<Size<0>, void> { + typedef void type; +}; + + +} + +#endif // TYPEASVALUE_SRC_LIST_OPERATION_TAKE_H_ @@ -7,7 +7,6 @@ #include "list/list.h" #include "list/operation/reverse.h" #include "list/operation/contains.h" -#include "list/operation/higher/fold.h" #include "list/operation/higher/misc.h" #include "list/operation/higher/query.h" #include "list/generator/iota.h" |