summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2021-09-05 02:45:49 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2021-12-17 15:36:04 +0000
commit38fce0ed44faf5757e195e4025b7bf22b6331aa2 (patch)
tree39acc1cae0136cfe6c32f3f8121b7084bbcc59de
parentAdd contains to flatmap (diff)
downloadicespider-38fce0ed44faf5757e195e4025b7bf22b6331aa2.tar.bz2
icespider-38fce0ed44faf5757e195e4025b7bf22b6331aa2.tar.xz
icespider-38fce0ed44faf5757e195e4025b7bf22b6331aa2.zip
Add at to flatmap
-rw-r--r--icespider/core/flatMap.h15
-rw-r--r--icespider/unittests/testFlatMap.cpp40
2 files changed, 55 insertions, 0 deletions
diff --git a/icespider/core/flatMap.h b/icespider/core/flatMap.h
index e23bd46..db07473 100644
--- a/icespider/core/flatMap.h
+++ b/icespider/core/flatMap.h
@@ -67,6 +67,21 @@ namespace IceSpider {
return lb;
}
+ template<typename Ex = std::out_of_range, typename N>
+ const auto &
+ at(const N & n) const
+ {
+ if (const auto i = find(n); i != end()) {
+ return i->second;
+ }
+ if constexpr (std::is_constructible_v<Ex, N>) {
+ throw Ex(n);
+ }
+ else {
+ throw Ex(std::to_string(n));
+ }
+ }
+
using S::begin;
using S::empty;
using S::end;
diff --git a/icespider/unittests/testFlatMap.cpp b/icespider/unittests/testFlatMap.cpp
index c2fcea4..06404ac 100644
--- a/icespider/unittests/testFlatMap.cpp
+++ b/icespider/unittests/testFlatMap.cpp
@@ -27,7 +27,9 @@ BOOST_AUTO_TEST_CASE(single)
BOOST_CHECK(!empty());
BOOST_CHECK(!contains(""));
BOOST_CHECK(contains("a"));
+ BOOST_CHECK_EQUAL(at("a"), 1);
BOOST_CHECK(!contains("b"));
+ BOOST_CHECK_THROW(at("b"), std::out_of_range);
BOOST_CHECK_EQUAL(begin()->first, "a");
BOOST_CHECK_EQUAL(begin()->second, 1);
BOOST_CHECK_EQUAL(find("a"), begin());
@@ -62,3 +64,41 @@ BOOST_AUTO_TEST_CASE(several)
}
BOOST_AUTO_TEST_SUITE_END()
+
+using TMI = IceSpider::flatmap<int, std::string_view>;
+
+BOOST_TEST_DONT_PRINT_LOG_VALUE(TMI::iterator)
+BOOST_TEST_DONT_PRINT_LOG_VALUE(TMI::const_iterator)
+
+BOOST_FIXTURE_TEST_SUITE(int2sv, TMI)
+
+BOOST_AUTO_TEST_CASE(several)
+{
+ insert({3, "c"});
+ BOOST_CHECK_EQUAL(lower_bound(1), begin());
+
+ insert({1, "a"});
+ BOOST_CHECK_EQUAL(begin()->first, 1);
+
+ insert({6, "f"});
+
+ BOOST_CHECK_EQUAL(size(), 3);
+ BOOST_CHECK(!empty());
+ BOOST_CHECK(!contains(0));
+ BOOST_CHECK(contains(1));
+ BOOST_CHECK_EQUAL(at(1), "a");
+ BOOST_CHECK(!contains(2));
+ BOOST_CHECK_THROW(at(2), std::out_of_range);
+ BOOST_CHECK(contains(3));
+ BOOST_CHECK(contains(6));
+ BOOST_CHECK_EQUAL(begin()->first, 1);
+ BOOST_CHECK_EQUAL(begin()->second, "a");
+ BOOST_CHECK_EQUAL(find(1), begin());
+ BOOST_CHECK_EQUAL(find(2), end());
+ BOOST_CHECK_NE(find(3), end());
+ BOOST_CHECK_EQUAL(find(3)->second, "c");
+ BOOST_CHECK_NE(find(6), end());
+ BOOST_CHECK_EQUAL(find(6)->second, "f");
+}
+
+BOOST_AUTO_TEST_SUITE_END()