From 02c6e34f9859047efe702cf5b866702f7b02d878 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Sun, 18 Jan 2015 19:58:35 +0100 Subject: Implemented `Map` in terms of `Fold` * as its name implies this _function_ applies a given _function_ to each element of a _Cons_ structure * added appropriate test case --- src/list/operation/basic.h | 5 +++-- src/list/operation/higher/misc.h | 29 +++++++++++++++++++++++++++++ test.cc | 10 ++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 src/list/operation/higher/misc.h diff --git a/src/list/operation/basic.h b/src/list/operation/basic.h index ff0a4d7..364a542 100644 --- a/src/list/operation/basic.h +++ b/src/list/operation/basic.h @@ -11,14 +11,15 @@ class Length { private: template < typename, - typename Current + typename Previous > struct Count { - typedef Add, Current> type; + typedef Add, Previous> type; }; public: typedef typename Fold, Cons>::type type; + }; template < diff --git a/src/list/operation/higher/misc.h b/src/list/operation/higher/misc.h new file mode 100644 index 0000000..708265a --- /dev/null +++ b/src/list/operation/higher/misc.h @@ -0,0 +1,29 @@ +#ifndef TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_MISC_H_ +#define TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_MISC_H_ + +#include "fold.h" + +namespace tav { + +template < + template class Function, + typename List +> +class Map { + private: + template < + typename Current, + typename Previous + > + struct FunctionWrapper { + typedef Cons, Previous> type; + }; + + public: + typedef typename Fold::type type; + +}; + +} + +#endif // TYPEASVALUE_SRC_LIST_OPERATION_HIGHER_MISC_H_ diff --git a/test.cc b/test.cc index e642b3a..6b9dffb 100644 --- a/test.cc +++ b/test.cc @@ -3,12 +3,17 @@ #include "type.h" #include "operation/math.h" #include "conditional/if.h" + #include "list/cons.h" #include "list/list.h" #include "list/operation/higher/fold.h" +#include "list/operation/higher/misc.h" class TypeAsValueTest : public ::testing::Test { }; +template +using quadruple = tav::Multiply, Element>; + TEST_F(TypeAsValueTest, BasicMath) { // (+ 1 2) EXPECT_EQ(3, ( tav::Add, tav::Int<2>>::value )); @@ -89,6 +94,11 @@ TEST_F(TypeAsValueTest, ListFold) { EXPECT_EQ(6, ( tav::Fold, tav::List, tav::Int<2>, tav::Int<3>>::type>::type::value )); } +TEST_F(TypeAsValueTest, ListMap) { + // (map quadruple (list 1 2 3)) + EXPECT_TRUE(( std::is_same, tav::Int<8>, tav::Int<12>>::type, tav::Map, tav::Int<2>, tav::Int<3>>::type>::type>::value )); +} + int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); -- cgit v1.2.3