38class HeaderMap
final {
45 using iterator = Iterator;
46 using const_iterator = ConstIterator;
48 using key_type = std::string;
49 using mapped_type = std::string;
52 class TooManyHeadersException
final :
public std::runtime_error {
53 using std::runtime_error::runtime_error;
60 HeaderMap(std::initializer_list<std::pair<std::string_view, std::string_view>> headers);
67 template <
typename InputIt>
80 HeaderMap&
operator=(HeaderMap&& other)
noexcept;
85 std::size_t
size()
const noexcept;
93 std::size_t
count(std::string_view key)
const noexcept;
95 std::size_t
count(
const PredefinedHeader& key)
const noexcept;
97 template <std::size_t Size>
98 [[noreturn]] std::size_t count(
const char (&)[Size])
const noexcept {
103 bool contains(std::string_view key)
const noexcept;
105 bool contains(
const PredefinedHeader& key)
const noexcept;
107 template <std::size_t Size>
108 [[noreturn]]
bool contains(
const char (&)[Size])
const noexcept {
109 ReportMisuse<Size>();
123 std::string&
operator[](
const PredefinedHeader& key);
125 template <std::size_t Size>
126 [[noreturn]] std::string& operator[](
const char (&)[Size]) {
127 ReportMisuse<Size>();
132 Iterator
find(std::string_view key)
noexcept;
134 ConstIterator
find(std::string_view key)
const noexcept;
138 Iterator
find(
const PredefinedHeader& key)
noexcept;
140 ConstIterator
find(
const PredefinedHeader& key)
const noexcept;
142 template <std::size_t Size>
143 [[noreturn]] Iterator find(
const char (&)[Size])
noexcept;
145 template <std::size_t Size>
146 [[noreturn]] ConstIterator find(
const char (&)[Size])
const noexcept;
150 template <
typename... Args>
151 void emplace(std::string_view key, Args&&... args) {
152 Emplace(std::move(key), std::forward<Args>(args)...);
157 template <
typename... Args>
158 void emplace(std::string key, Args&&... args) {
159 Emplace(std::move(key), std::forward<Args>(args)...);
164 template <
typename... Args>
166 Emplace(std::move(key), std::forward<Args>(args)...);
171 template <
typename InputIt>
172 void insert(InputIt first, InputIt last);
176 void insert(
const std::pair<std::string, std::string>& kvp);
179 void insert(std::pair<std::string, std::string>&& kvp);
204 Iterator
erase(std::string_view key);
206 Iterator
erase(
const PredefinedHeader& key);
208 template <std::size_t Size>
209 [[noreturn]] Iterator erase(
const char (&)[Size]);
213 std::string&
at(std::string_view key);
215 std::string&
at(
const PredefinedHeader& key);
218 const std::string&
at(std::string_view key)
const;
220 const std::string&
at(
const PredefinedHeader& key)
const;
222 template <std::size_t Size>
223 [[noreturn]] std::string& at(
const char (&)[Size]) {
224 ReportMisuse<Size>();
226 template <std::size_t Size>
227 [[noreturn]]
const std::string& at(
const char (&)[Size])
const {
228 ReportMisuse<Size>();
234 ConstIterator
begin()
const noexcept;
241 ConstIterator
end()
const noexcept;
243 ConstIterator
cend()
const noexcept;
247 bool operator==(
const HeaderMap& other)
const noexcept;
260 friend class TestsHelper;
262 template <
typename KeyType,
typename... Args>
263 void Emplace(KeyType&& key, Args&&... args);
265 template <std::size_t Size>
266 [[noreturn]]
static void ReportMisuse();
268 utils::FastPimpl<header_map::Map, 272, 8> impl_;
307class MapEntry
final {
312 MapEntry(std::string&& key, std::string&& value);
314 MapEntry(
const MapEntry& other);
315 MapEntry& operator=(
const MapEntry& other);
316 MapEntry(MapEntry&& other)
noexcept;
317 MapEntry& operator=(MapEntry&& other)
noexcept;
319 std::pair<
const std::string, std::string>& Get();
320 const std::pair<
const std::string, std::string>& Get()
const;
322 std::pair<std::string, std::string>& GetMutable();
324 bool operator==(
const MapEntry& other)
const;
338 std::pair<std::string, std::string> mutable_value;
339 std::pair<
const std::string, std::string> value;
347class HeaderMap::Iterator
final {
349 using iterator_category = std::forward_iterator_tag;
350 using difference_type = std::ptrdiff_t;
351 using value_type = std::pair<
const std::string, std::string>;
352 using reference = value_type&;
353 using const_reference =
const value_type&;
354 using pointer = value_type*;
355 using const_pointer =
const value_type*;
360 using UnderlyingIterator = std::vector<header_map::MapEntry>::reverse_iterator;
363 explicit Iterator(UnderlyingIterator it);
366 Iterator(
const Iterator& other);
367 Iterator(Iterator&& other)
noexcept;
368 Iterator& operator=(
const Iterator& other);
369 Iterator& operator=(Iterator&& other)
noexcept;
371 Iterator operator++(
int);
372 Iterator& operator++();
374 reference operator*();
375 const_reference operator*()
const;
376 pointer operator->();
377 const_pointer operator->()
const;
379 bool operator==(
const Iterator& other)
const;
380 bool operator!=(
const Iterator& other)
const;
382 bool operator==(
const ConstIterator& other)
const;
385 friend class HeaderMap::ConstIterator;
387 UnderlyingIterator it_{};
390class HeaderMap::ConstIterator
final {
392 using iterator_category = std::forward_iterator_tag;
393 using difference_type = std::ptrdiff_t;
394 using value_type = std::pair<
const std::string, std::string>;
395 using reference =
const value_type&;
396 using const_reference =
const value_type&;
397 using pointer =
const value_type*;
398 using const_pointer =
const value_type*;
403 using UnderlyingIterator = std::vector<header_map::MapEntry>::const_reverse_iterator;
406 explicit ConstIterator(UnderlyingIterator it);
409 ConstIterator(
const ConstIterator& other);
410 ConstIterator(ConstIterator&& other)
noexcept;
411 ConstIterator& operator=(
const ConstIterator& other);
412 ConstIterator& operator=(ConstIterator&& other)
noexcept;
414 ConstIterator operator++(
int);
415 ConstIterator& operator++();
417 reference operator*();
418 const_reference operator*()
const;
419 pointer operator->();
420 const_pointer operator->()
const;
422 bool operator==(
const ConstIterator& other)
const;
423 bool operator!=(
const ConstIterator& other)
const;
425 bool operator==(
const Iterator& other)
const;
428 friend class HeaderMap::Iterator;
430 UnderlyingIterator it_{};