From 385c51950644121d7b6e04718374b1af63209ac7 Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Sat, 17 Jan 2015 17:28:02 +0100 Subject: Implemented `Length` function * as its name implies this function returns the length of a given _Cons_ structure * result type is `Size` which wraps `std::size_t` to match the `sizeof` operator --- src/conditional/if.h | 8 ++++---- src/list/list.h | 10 ++++++++++ src/type.h | 3 +++ test.cc | 14 ++++++++++++-- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/conditional/if.h b/src/conditional/if.h index 29aa6f0..b9568f6 100644 --- a/src/conditional/if.h +++ b/src/conditional/if.h @@ -7,13 +7,13 @@ namespace tav { template < bool Condition, - typename IfBranch, - typename ElseBranch + typename TrueBranch, + typename FalseBranch > using If = typename std::conditional< Condition, - IfBranch, - ElseBranch + TrueBranch, + FalseBranch >::type; } diff --git a/src/list/list.h b/src/list/list.h index edd46e8..f21d0fc 100644 --- a/src/list/list.h +++ b/src/list/list.h @@ -27,6 +27,16 @@ using Head = Car; template using Tail = Cdr; +template +struct Length { + typedef Add, typename Length>::type> type; +}; + +template <> +struct Length { + typedef Size<0> type; +}; + template < typename Primary, typename Secondary diff --git a/src/type.h b/src/type.h index 304bff4..74e0650 100644 --- a/src/type.h +++ b/src/type.h @@ -8,6 +8,9 @@ namespace tav { template using Int = typename std::integral_constant::type; +template +using Size = typename std::integral_constant::type; + template using Boolean = typename std::integral_constant::type; diff --git a/test.cc b/test.cc index 390804b..6ce3691 100644 --- a/test.cc +++ b/test.cc @@ -21,9 +21,9 @@ TEST_F(TypeAsValueTest, BasicMath) { TEST_F(TypeAsValueTest, Conditional) { // (if #t 1 2) - EXPECT_EQ(1, ( tav::If, tav::Int<2>>::value )); + EXPECT_EQ(1, ( tav::If, tav::Int<2>>::type::value )); // (if #f 1 2) - EXPECT_EQ(2, ( tav::If, tav::Int<2>>::value )); + EXPECT_EQ(2, ( tav::If, tav::Int<2>>::type::value )); } TEST_F(TypeAsValueTest, Cons) { @@ -38,6 +38,11 @@ TEST_F(TypeAsValueTest, Cons) { } TEST_F(TypeAsValueTest, List) { + // (length (list 1)) + EXPECT_EQ(1, ( tav::Length>::type>::type::value )); + // (length (list 1 2)) + EXPECT_EQ(2, ( tav::Length, tav::Int<2>>::type>::type::value )); + // (head (list 1)) EXPECT_EQ(1, ( tav::Head>::type>::value )); // (head (list 1 2)) @@ -49,6 +54,11 @@ TEST_F(TypeAsValueTest, List) { } TEST_F(TypeAsValueTest, ListConcatenate) { + // (length (concatenate (list 1) (list 2))) + EXPECT_EQ(2, ( tav::Length>::type, tav::List>::type>::type>::type::value )); + // (length (concatenate (list 1 2) (list 3 4))) + EXPECT_EQ(4, ( tav::Length, tav::Int<2>>::type, tav::List, tav::Int<4>>::type>::type>::type::value )); + // (head (concatenate (list 1) (list 2))) EXPECT_EQ(1, ( tav::Head>::type, tav::List>::type>::type>::value )); // (head (tail (concatenate (list 1) (list 2)))) -- cgit v1.2.3