From 3a5a02e0c48957c3a66130abdae0ff7b3d12905f Mon Sep 17 00:00:00 2001 From: Maksim Denisov Date: Tue, 11 Feb 2025 14:00:42 +0100 Subject: BackMap: make non-copyable and non-movable ...and use std::unique_ptr for construction instead of std::optional. --- src/utils/cpp/back_map.hpp | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) (limited to 'src/utils') diff --git a/src/utils/cpp/back_map.hpp b/src/utils/cpp/back_map.hpp index 5d68c887..8b4691fe 100644 --- a/src/utils/cpp/back_map.hpp +++ b/src/utils/cpp/back_map.hpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,13 @@ class BackMap final { IsKeyWithError::value) using Converter = std::function; + explicit BackMap() = default; + BackMap(BackMap const&) = delete; + BackMap(BackMap&&) = delete; + auto operator=(BackMap const&) -> BackMap& = delete; + auto operator=(BackMap&&) -> BackMap& = delete; + ~BackMap() = default; + /// \brief Create a BackMap by iterating over container and applying /// Converter. /// \param container Container to iterate over. begin() and end() methods @@ -60,41 +68,40 @@ class BackMap final { template [[nodiscard]] static auto Make(TContainer const* const container, Converter const& converter) noexcept - -> std::optional { + -> std::unique_ptr { if (container == nullptr or converter == nullptr) { - return std::nullopt; + return nullptr; } auto const hasher = std::hash{}; auto const size = std::distance(container->begin(), container->end()); - std::unordered_set keys; - std::unordered_map> mapping; try { - keys.reserve(size); - mapping.reserve(size); + auto back_map = std::make_unique(); + back_map->keys_.reserve(size); + back_map->mapping_.reserve(size); for (auto const& value : *container) { std::optional key = BackMap::Convert(converter, value); if (not key.has_value()) { - return std::nullopt; + return nullptr; } std::size_t const hash = std::invoke(hasher, *key); - if (not mapping.contains(hash)) { - keys.emplace(*std::move(key)); - mapping.insert_or_assign(hash, &value); + if (not back_map->mapping_.contains(hash)) { + back_map->keys_.emplace(*std::move(key)); + back_map->mapping_.insert_or_assign(hash, &value); } } + return back_map; } catch (...) { - return std::nullopt; + return nullptr; } - return BackMap(std::move(keys), std::move(mapping)); } template requires(std::is_invocable_v) [[nodiscard]] static auto Make(TContainer const* const container, TConverter const& converter) noexcept - -> std::optional { + -> std::unique_ptr { using TResult = std::invoke_result_t; return Make(container, converter); } @@ -156,12 +163,6 @@ class BackMap final { std::unordered_set keys_; std::unordered_map> mapping_; - explicit BackMap( - std::unordered_set keys, - std::unordered_map> - mapping) noexcept - : keys_{std::move(keys)}, mapping_{std::move(mapping)} {} - template [[nodiscard]] static auto Convert(Converter const& converter, TValue const& value) noexcept -- cgit v1.2.3