aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Kummerlaender2015-02-18 22:37:39 +0100
committerAdrian Kummerlaender2015-02-18 22:37:39 +0100
commit9bb66d9c1d8a7bf5bf02f5a7c400894e928d2a95 (patch)
tree04aea86c016401047d5ea134fdf878b83f2ad0d6
parenta3cfc224111c324324e29a9a7a61b511053ec14c (diff)
Changed `ListIndex` to return false if no index is found
* analogously to `list-index` and `find` in SRFI-1
-rw-r--r--src/list/operation/higher/drop_while.h2
-rw-r--r--src/list/operation/higher/list_index.h2
-rw-r--r--src/list/operation/higher/take_while.h2
-rw-r--r--src/type.h6
-rw-r--r--test.cc4
5 files changed, 11 insertions, 5 deletions
diff --git a/src/list/operation/higher/drop_while.h b/src/list/operation/higher/drop_while.h
index 1207020..8d013f9 100644
--- a/src/list/operation/higher/drop_while.h
+++ b/src/list/operation/higher/drop_while.h
@@ -13,7 +13,7 @@ template <
>
using DropWhile = Drop<
typename utility::predicate_assurance<
- utility::predicate_negator<std::is_void>::template function,
+ IsSize,
Length<List>
>::template assure<
ListIndex<
diff --git a/src/list/operation/higher/list_index.h b/src/list/operation/higher/list_index.h
index bbf43ee..d665b82 100644
--- a/src/list/operation/higher/list_index.h
+++ b/src/list/operation/higher/list_index.h
@@ -29,7 +29,7 @@ template <
typename Index
>
struct index_of_first<Predicate, void, Index> {
- typedef void type;
+ typedef Boolean<false> type;
};
}
diff --git a/src/list/operation/higher/take_while.h b/src/list/operation/higher/take_while.h
index f9fc3aa..105e83c 100644
--- a/src/list/operation/higher/take_while.h
+++ b/src/list/operation/higher/take_while.h
@@ -13,7 +13,7 @@ template <
>
using TakeWhile = Take<
typename utility::predicate_assurance<
- utility::predicate_negator<std::is_void>::template function,
+ IsSize,
Length<List>
>::template assure<
ListIndex<
diff --git a/src/type.h b/src/type.h
index 508e22f..c2ad2d8 100644
--- a/src/type.h
+++ b/src/type.h
@@ -38,6 +38,12 @@ using IsEqualValue = Boolean<X::value == Y::value>;
template <typename X>
using IsTrue = IsEqualValue<X, Boolean<true>>;
+template <typename X>
+using IsBoolean = Eval<std::is_same<typename X::value_type, bool>>;
+
+template <typename X>
+using IsSize = Eval<std::is_same<typename X::value_type, std::size_t>>;
+
}
#endif // TYPEASVALUE_SRC_TYPE_H_
diff --git a/test.cc b/test.cc
index 6a957b1..5742fb2 100644
--- a/test.cc
+++ b/test.cc
@@ -922,13 +922,13 @@ static_assert(
static_assert(
std::is_same<
- void,
+ tav::Boolean<false>,
tav::ListIndex<
tav::Even,
tav::List<tav::Int<1>, tav::Int<3>, tav::Int<5>>
>
>::value,
- "(list-index even? (list 1 3 5)) != void"
+ "(list-index even? (list 1 3 5)) != #f"
);
// list find