diff options
Diffstat (limited to 'src/buildtool/execution_api/common')
-rw-r--r-- | src/buildtool/execution_api/common/TARGETS | 7 | ||||
-rw-r--r-- | src/buildtool/execution_api/common/content_blob_container.hpp | 105 | ||||
-rw-r--r-- | src/buildtool/execution_api/common/execution_api.hpp | 2 |
3 files changed, 113 insertions, 1 deletions
diff --git a/src/buildtool/execution_api/common/TARGETS b/src/buildtool/execution_api/common/TARGETS index 825f612f..4cb4e4b2 100644 --- a/src/buildtool/execution_api/common/TARGETS +++ b/src/buildtool/execution_api/common/TARGETS @@ -71,4 +71,11 @@ , ["src/buildtool/logging", "log_level"] ] } +, "content_blob_container": + { "type": ["@", "rules", "CC", "library"] + , "name": ["content_blob_container"] + , "hdrs": ["content_blob_container.hpp"] + , "stage": ["src", "buildtool", "execution_api", "common"] + , "deps": [["src/utils/cpp", "transformed_range"]] + } } diff --git a/src/buildtool/execution_api/common/content_blob_container.hpp b/src/buildtool/execution_api/common/content_blob_container.hpp new file mode 100644 index 00000000..fcd10f09 --- /dev/null +++ b/src/buildtool/execution_api/common/content_blob_container.hpp @@ -0,0 +1,105 @@ +// Copyright 2024 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef INCLUDED_SRC_BUILDTOOL_EXECUTION_API_COMMON_CONTENT_BLOB_CONTAINER_HPP +#define INCLUDED_SRC_BUILDTOOL_EXECUTION_API_COMMON_CONTENT_BLOB_CONTAINER_HPP + +#include <cstddef> +#include <string> +#include <unordered_map> +#include <utility> //std::move +#include <vector> + +#include "src/utils/cpp/transformed_range.hpp" + +template <typename TDigest> +struct ContentBlob final { + ContentBlob(TDigest mydigest, std::string mydata, bool is_exec) noexcept + : digest{std::move(mydigest)}, + data{std::move(mydata)}, + is_exec{is_exec} {} + + TDigest digest{}; + std::string data{}; + bool is_exec{}; +}; + +template <typename TDigest> +class ContentBlobContainer final { + public: + using DigestType = TDigest; + using BlobType = ContentBlob<TDigest>; + + ContentBlobContainer() noexcept = default; + explicit ContentBlobContainer(std::vector<BlobType> blobs) { + blobs_.reserve(blobs.size()); + for (auto& blob : blobs) { + this->Emplace(std::move(blob)); + } + } + + /// \brief Emplace new BazelBlob to container. + void Emplace(BlobType&& blob) { + DigestType digest = blob.digest; + blobs_.emplace(std::move(digest), std::move(blob)); + } + + /// \brief Clear all BazelBlobs from container. + void Clear() noexcept { return blobs_.clear(); } + + /// \brief Number of BazelBlobs in container. + [[nodiscard]] auto Size() const noexcept -> std::size_t { + return blobs_.size(); + } + + /// \brief Is equivalent BazelBlob (with same Digest) in container. + /// \param[in] blob BazelBlob to search equivalent BazelBlob for + [[nodiscard]] auto Contains(BlobType const& blob) const noexcept -> bool { + return blobs_.contains(blob.digest); + } + + /// \brief Obtain iterable list of Blobs from container. + [[nodiscard]] auto Blobs() const noexcept { + auto converter = [](auto const& p) -> BlobType const& { + return p.second; + }; + return TransformedRange{ + blobs_.cbegin(), blobs_.cend(), std::move(converter)}; + } + + /// \brief Obtain iterable list of Digests from container. + [[nodiscard]] auto Digests() const noexcept { + auto converter = [](auto const& p) -> DigestType const& { + return p.first; + }; + return TransformedRange{ + blobs_.cbegin(), blobs_.cend(), std::move(converter)}; + } + + /// \brief Obtain iterable list of BazelBlobs related to Digests. + /// \param[in] related Related Digests + [[nodiscard]] auto RelatedBlobs( + std::vector<DigestType> const& related) const noexcept { + auto converter = [this](auto const& digest) -> BlobType const& { + return blobs_.at(digest); + }; + return TransformedRange{ + related.begin(), related.end(), std::move(converter)}; + }; + + private: + std::unordered_map<DigestType, BlobType> blobs_{}; +}; + +#endif // INCLUDED_SRC_BUILDTOOL_EXECUTION_API_COMMON_CONTENT_BLOB_CONTAINER_HPP diff --git a/src/buildtool/execution_api/common/execution_api.hpp b/src/buildtool/execution_api/common/execution_api.hpp index 7b0ad32a..4a40c64e 100644 --- a/src/buildtool/execution_api/common/execution_api.hpp +++ b/src/buildtool/execution_api/common/execution_api.hpp @@ -26,7 +26,7 @@ #include "gsl/gsl" #include "src/buildtool/common/artifact.hpp" // Artifact::ObjectInfo #include "src/buildtool/common/artifact_digest.hpp" -#include "src/buildtool/execution_api/bazel_msg/bazel_blob_container.hpp" +#include "src/buildtool/execution_api/bazel_msg/bazel_blob.hpp" #include "src/buildtool/execution_api/common/execution_action.hpp" #include "src/buildtool/execution_engine/dag/dag.hpp" #include "src/buildtool/file_system/object_type.hpp" |