diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/execution_api/common/TARGETS | 6 | ||||
-rw-r--r-- | src/buildtool/execution_api/common/content_blob_container.hpp | 21 |
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: |