diff options
-rw-r--r-- | icespider/core/flatMap.h | 15 | ||||
-rw-r--r-- | icespider/unittests/testFlatMap.cpp | 40 |
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() |