From 619def44c1cca9f3cdf63544d5f24f2c7a7d9b77 Mon Sep 17 00:00:00 2001 From: Klaus Aehlig Date: Tue, 22 Feb 2022 17:03:21 +0100 Subject: Initial self-hosting commit This is the initial version of our tool that is able to build itself. In can be bootstrapped by ./bin/bootstrap.py Co-authored-by: Oliver Reiche Co-authored-by: Victor Moreno --- .../build_engine/expression/expression_ptr.hpp | 95 ++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/buildtool/build_engine/expression/expression_ptr.hpp (limited to 'src/buildtool/build_engine/expression/expression_ptr.hpp') diff --git a/src/buildtool/build_engine/expression/expression_ptr.hpp b/src/buildtool/build_engine/expression/expression_ptr.hpp new file mode 100644 index 00000000..8cc26c50 --- /dev/null +++ b/src/buildtool/build_engine/expression/expression_ptr.hpp @@ -0,0 +1,95 @@ +#ifndef INCLUDED_SRC_BUILDTOOL_BUILD_ENGINE_EXPRESSION_EXPRESSION_PTR_HPP +#define INCLUDED_SRC_BUILDTOOL_BUILD_ENGINE_EXPRESSION_EXPRESSION_PTR_HPP + +#include +#include +#include +#include + +#include "nlohmann/json.hpp" +#include "src/buildtool/build_engine/expression/function_map.hpp" +#include "src/buildtool/build_engine/expression/linked_map.hpp" +#include "src/buildtool/logging/logger.hpp" + +class Configuration; +class Expression; + +class ExpressionPtr { + public: + // Initialize to nullptr + explicit ExpressionPtr(std::nullptr_t /*ptr*/) noexcept : ptr_{nullptr} {} + + // Initialize from Expression's variant type or Expression + template + requires(not std::is_same_v, ExpressionPtr>) + // NOLINTNEXTLINE(bugprone-forwarding-reference-overload) + explicit ExpressionPtr(T&& data) noexcept + : ptr_{std::make_shared(std::forward(data))} {} + + ExpressionPtr() noexcept; + ExpressionPtr(ExpressionPtr const&) noexcept = default; + ExpressionPtr(ExpressionPtr&&) noexcept = default; + ~ExpressionPtr() noexcept = default; + auto operator=(ExpressionPtr const&) noexcept -> ExpressionPtr& = default; + auto operator=(ExpressionPtr&&) noexcept -> ExpressionPtr& = default; + + explicit operator bool() const { return static_cast(ptr_); } + [[nodiscard]] auto operator*() const& -> Expression const& { return *ptr_; } + [[nodiscard]] auto operator*() && -> Expression; + [[nodiscard]] auto operator->() const& -> Expression const* { + return ptr_.get(); + } + [[nodiscard]] auto operator->() && -> Expression const* = delete; + [[nodiscard]] auto operator[]( + std::string const& key) const& -> ExpressionPtr const&; + [[nodiscard]] auto operator[](std::string const& key) && -> ExpressionPtr; + [[nodiscard]] auto operator[]( + ExpressionPtr const& key) const& -> ExpressionPtr const&; + [[nodiscard]] auto operator[](ExpressionPtr const& key) && -> ExpressionPtr; + [[nodiscard]] auto operator[](size_t pos) const& -> ExpressionPtr const&; + [[nodiscard]] auto operator[](size_t pos) && -> ExpressionPtr; + [[nodiscard]] auto operator<(ExpressionPtr const& other) const -> bool; + [[nodiscard]] auto operator==(ExpressionPtr const& other) const -> bool; + template + [[nodiscard]] auto operator==(T const& other) const -> bool { + return ptr_ and *ptr_ == other; + } + template + [[nodiscard]] auto operator!=(T const& other) const -> bool { + return not(*this == other); + } + [[nodiscard]] auto Evaluate( + Configuration const& env, + FunctionMapPtr const& functions, + std::function const& logger = + [](std::string const& error) noexcept -> void { + Logger::Log(LogLevel::Error, error); + }, + std::function const& note_user_context = + []() noexcept -> void {}) const noexcept -> ExpressionPtr; + + [[nodiscard]] auto IsCacheable() const noexcept -> bool; + [[nodiscard]] auto ToIdentifier() const noexcept -> std::string; + [[nodiscard]] auto ToJson() const noexcept -> nlohmann::json; + + using linked_map_t = LinkedMap; + [[nodiscard]] auto IsNotNull() const noexcept -> bool; + [[nodiscard]] auto LinkedMap() const& -> linked_map_t const&; + [[nodiscard]] static auto Make(linked_map_t&& map) -> ExpressionPtr; + + private: + std::shared_ptr ptr_; +}; + +[[nodiscard]] auto operator+(ExpressionPtr const& lhs, ExpressionPtr const& rhs) + -> ExpressionPtr; + +namespace std { +template <> +struct hash { + [[nodiscard]] auto operator()(ExpressionPtr const& p) const noexcept + -> std::size_t; +}; +} // namespace std + +#endif // INCLUDED_SRC_BUILDTOOL_BUILD_ENGINE_EXPRESSION_EXPRESSION_PTR_HPP -- cgit v1.2.3