#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