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()  | 
