88
99#include < algorithm>
1010#include < initializer_list>
11+ #include < optional>
1112#include < stdexcept>
1213#include < utility>
1314#include < vector>
@@ -32,9 +33,9 @@ struct sorted_map_key
3233 const K& key;
3334};
3435
35- template <class Compare , class Iterator , class K = decltype (std::declval<Iterator>()->first) ,
36+ template <class Compare , class Iterator , class K ,
3637 class V = decltype (std::declval<Iterator>()->second)>
37- constexpr std::pair<Iterator, Iterator> find_sorted_map_key (
38+ constexpr std::pair<Iterator, Iterator> sorted_map_equal_range (
3839 Iterator itrBegin, Iterator itrEnd, const K& key) noexcept
3940{
4041 return std::equal_range (itrBegin,
@@ -45,6 +46,15 @@ constexpr std::pair<Iterator, Iterator> find_sorted_map_key(
4546 });
4647}
4748
49+ template <class Compare , class Container , class K >
50+ constexpr auto sorted_map_lookup (const Container& container, const K& key) noexcept
51+ {
52+ const auto [itr, itrEnd] =
53+ sorted_map_equal_range<Compare>(container.begin (), container.end (), key);
54+
55+ return itr == itrEnd ? std::nullopt : std::make_optional (itr->second );
56+ }
57+
4858template <class K , class V , class Compare = std::less<K>>
4959class sorted_map
5060{
@@ -124,7 +134,7 @@ class sorted_map
124134
125135 constexpr const_iterator find (const K& key) const noexcept
126136 {
127- const auto [itr, itrEnd] = find_sorted_map_key <Compare>(_data.begin (), _data.end (), key);
137+ const auto [itr, itrEnd] = sorted_map_equal_range <Compare>(_data.begin (), _data.end (), key);
128138
129139 return itr == itrEnd ? _data.cend () : itr;
130140 }
@@ -141,7 +151,7 @@ class sorted_map
141151 std::pair<const_iterator, bool > emplace (KeyArg&& keyArg, ValueArgs&&... args) noexcept
142152 {
143153 K key { std::forward<KeyArg>(keyArg) };
144- const auto [itr, itrEnd] = find_sorted_map_key <Compare>(_data.begin (), _data.end (), key);
154+ const auto [itr, itrEnd] = sorted_map_equal_range <Compare>(_data.begin (), _data.end (), key);
145155
146156 if (itr != itrEnd)
147157 {
@@ -154,7 +164,7 @@ class sorted_map
154164
155165 const_iterator erase (const K& key) noexcept
156166 {
157- const auto [itr, itrEnd] = find_sorted_map_key <Compare>(_data.begin (), _data.end (), key);
167+ const auto [itr, itrEnd] = sorted_map_equal_range <Compare>(_data.begin (), _data.end (), key);
158168
159169 if (itr == itrEnd)
160170 {
@@ -181,7 +191,7 @@ class sorted_map
181191 V& operator [](KeyArg&& keyArg) noexcept
182192 {
183193 K key { std::forward<KeyArg>(keyArg) };
184- const auto [itr, itrEnd] = find_sorted_map_key <Compare>(_data.begin (), _data.end (), key);
194+ const auto [itr, itrEnd] = sorted_map_equal_range <Compare>(_data.begin (), _data.end (), key);
185195
186196 if (itr != itrEnd)
187197 {
@@ -195,7 +205,7 @@ class sorted_map
195205 V& at (KeyArg&& keyArg)
196206 {
197207 const K key { std::forward<KeyArg>(keyArg) };
198- const auto [itr, itrEnd] = find_sorted_map_key <Compare>(_data.begin (), _data.end (), key);
208+ const auto [itr, itrEnd] = sorted_map_equal_range <Compare>(_data.begin (), _data.end (), key);
199209
200210 if (itr == itrEnd)
201211 {
0 commit comments