summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp4
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_network.cpp2
-rw-r--r--src/buildtool/execution_api/remote/bazel/bazel_network_reader.cpp2
-rw-r--r--src/buildtool/execution_engine/executor/executor.hpp2
-rw-r--r--src/utils/cpp/back_map.hpp39
5 files changed, 25 insertions, 24 deletions
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp
index 566b9a29..8384cdac 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_cas_client.cpp
@@ -237,7 +237,7 @@ auto BazelCasClient::BatchReadBlobs(
auto const back_map = BackMap<bazel_re::Digest, ArtifactDigest>::Make(
&blobs, ArtifactDigestFactory::ToBazel);
- if (not back_map.has_value()) {
+ if (back_map == nullptr) {
return result;
}
@@ -494,7 +494,7 @@ auto BazelCasClient::FindMissingBlobs(
auto const back_map = BackMap<bazel_re::Digest, ArtifactDigest>::Make(
&digests, ArtifactDigestFactory::ToBazel);
- if (not back_map.has_value()) {
+ if (back_map == nullptr) {
return digests;
}
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_network.cpp b/src/buildtool/execution_api/remote/bazel/bazel_network.cpp
index f7aa3dcc..d2a84c04 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_network.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_network.cpp
@@ -122,7 +122,7 @@ auto BazelNetwork::UploadBlobs(std::unordered_set<ArtifactBlob>&& blobs,
if (not skip_find_missing) {
auto const back_map = BackMap<ArtifactDigest, ArtifactBlob>::Make(
&blobs, [](ArtifactBlob const& blob) { return blob.digest; });
- if (not back_map.has_value()) {
+ if (back_map == nullptr) {
return false;
}
diff --git a/src/buildtool/execution_api/remote/bazel/bazel_network_reader.cpp b/src/buildtool/execution_api/remote/bazel/bazel_network_reader.cpp
index 1464c134..46bb151b 100644
--- a/src/buildtool/execution_api/remote/bazel/bazel_network_reader.cpp
+++ b/src/buildtool/execution_api/remote/bazel/bazel_network_reader.cpp
@@ -195,7 +195,7 @@ auto BazelNetworkReader::BatchReadBlobs(
auto const back_map = BackMap<ArtifactDigest, ArtifactBlob>::Make(
&batched_blobs, [](ArtifactBlob const& blob) { return blob.digest; });
- if (not back_map.has_value()) {
+ if (back_map == nullptr) {
return {};
}
diff --git a/src/buildtool/execution_engine/executor/executor.hpp b/src/buildtool/execution_engine/executor/executor.hpp
index c32e2c3f..8519639f 100644
--- a/src/buildtool/execution_engine/executor/executor.hpp
+++ b/src/buildtool/execution_engine/executor/executor.hpp
@@ -304,7 +304,7 @@ class ExecutorImpl {
*entry.second->Size(),
entry.second->IsTree());
});
- if (not back_map.has_value()) {
+ if (back_map == nullptr) {
return false;
}
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 <cstddef>
#include <functional>
#include <iterator>
+#include <memory>
#include <optional>
#include <type_traits>
#include <unordered_map>
@@ -49,6 +50,13 @@ class BackMap final {
IsKeyWithError<TResult>::value)
using Converter = std::function<TResult(TValue const&)>;
+ 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 <typename TContainer, typename TResult>
[[nodiscard]] static auto Make(TContainer const* const container,
Converter<TResult> const& converter) noexcept
- -> std::optional<BackMap> {
+ -> std::unique_ptr<BackMap> {
if (container == nullptr or converter == nullptr) {
- return std::nullopt;
+ return nullptr;
}
auto const hasher = std::hash<TKey>{};
auto const size = std::distance(container->begin(), container->end());
- std::unordered_set<TKey> keys;
- std::unordered_map<std::size_t, gsl::not_null<TValue const*>> mapping;
try {
- keys.reserve(size);
- mapping.reserve(size);
+ auto back_map = std::make_unique<BackMap>();
+ back_map->keys_.reserve(size);
+ back_map->mapping_.reserve(size);
for (auto const& value : *container) {
std::optional<TKey> 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 <typename TContainer, typename TConverter>
requires(std::is_invocable_v<TConverter, TValue const&>)
[[nodiscard]] static auto Make(TContainer const* const container,
TConverter const& converter) noexcept
- -> std::optional<BackMap> {
+ -> std::unique_ptr<BackMap> {
using TResult = std::invoke_result_t<TConverter, TValue const&>;
return Make<TContainer, TResult>(container, converter);
}
@@ -156,12 +163,6 @@ class BackMap final {
std::unordered_set<TKey> keys_;
std::unordered_map<std::size_t, gsl::not_null<TValue const*>> mapping_;
- explicit BackMap(
- std::unordered_set<TKey> keys,
- std::unordered_map<std::size_t, gsl::not_null<TValue const*>>
- mapping) noexcept
- : keys_{std::move(keys)}, mapping_{std::move(mapping)} {}
-
template <typename TResult>
[[nodiscard]] static auto Convert(Converter<TResult> const& converter,
TValue const& value) noexcept