summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/execution_api/common/TARGETS6
-rw-r--r--src/buildtool/execution_api/common/content_blob_container.hpp21
2 files changed, 26 insertions, 1 deletions
diff --git a/src/buildtool/execution_api/common/TARGETS b/src/buildtool/execution_api/common/TARGETS
index 41eb07b4..edb815b9 100644
--- a/src/buildtool/execution_api/common/TARGETS
+++ b/src/buildtool/execution_api/common/TARGETS
@@ -125,7 +125,11 @@
{ "type": ["@", "rules", "CC", "library"]
, "name": ["content_blob_container"]
, "hdrs": ["content_blob_container.hpp"]
- , "deps": [["@", "gsl", "", "gsl"], ["src/utils/cpp", "transformed_range"]]
+ , "deps":
+ [ ["@", "gsl", "", "gsl"]
+ , ["src/utils/cpp", "hash_combine"]
+ , ["src/utils/cpp", "transformed_range"]
+ ]
, "stage": ["src", "buildtool", "execution_api", "common"]
}
, "artifact_blob_container":
diff --git a/src/buildtool/execution_api/common/content_blob_container.hpp b/src/buildtool/execution_api/common/content_blob_container.hpp
index 1788d229..bc546ac4 100644
--- a/src/buildtool/execution_api/common/content_blob_container.hpp
+++ b/src/buildtool/execution_api/common/content_blob_container.hpp
@@ -16,6 +16,7 @@
#define INCLUDED_SRC_BUILDTOOL_EXECUTION_API_COMMON_CONTENT_BLOB_CONTAINER_HPP
#include <cstddef>
+#include <functional>
#include <memory>
#include <string>
#include <unordered_map>
@@ -23,6 +24,7 @@
#include <vector>
#include "gsl/gsl"
+#include "src/utils/cpp/hash_combine.hpp"
#include "src/utils/cpp/transformed_range.hpp"
template <typename TDigest>
@@ -37,11 +39,30 @@ struct ContentBlob final {
bool is_exec) noexcept
: digest{std::move(mydigest)}, data(mydata), is_exec{is_exec} {}
+ [[nodiscard]] auto operator==(ContentBlob const& other) const noexcept
+ -> bool {
+ return std::equal_to<TDigest>{}(digest, other.digest) and
+ is_exec == other.is_exec;
+ }
+
TDigest digest;
std::shared_ptr<std::string> data;
bool is_exec = false;
};
+namespace std {
+template <typename TDigest>
+struct hash<ContentBlob<TDigest>> {
+ [[nodiscard]] auto operator()(
+ ContentBlob<TDigest> const& blob) const noexcept -> std::size_t {
+ std::size_t seed{};
+ hash_combine(&seed, blob.digest);
+ hash_combine(&seed, blob.is_exec);
+ return seed;
+ }
+};
+} // namespace std
+
template <typename TDigest>
class ContentBlobContainer final {
public: