From dc273f4ce89dc6e562c4a99fd394c92f56eeb63f Mon Sep 17 00:00:00 2001 From: Maksim Denisov Date: Fri, 24 May 2024 17:19:35 +0200 Subject: Convert BlobContainer to a template ...where the template parameter is the type of a digest. --- .../common/content_blob_container.hpp | 105 +++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 src/buildtool/execution_api/common/content_blob_container.hpp (limited to 'src/buildtool/execution_api/common/content_blob_container.hpp') 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 +#include +#include +#include //std::move +#include + +#include "src/utils/cpp/transformed_range.hpp" + +template +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 +class ContentBlobContainer final { + public: + using DigestType = TDigest; + using BlobType = ContentBlob; + + ContentBlobContainer() noexcept = default; + explicit ContentBlobContainer(std::vector 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 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 blobs_{}; +}; + +#endif // INCLUDED_SRC_BUILDTOOL_EXECUTION_API_COMMON_CONTENT_BLOB_CONTAINER_HPP -- cgit v1.2.3