summaryrefslogtreecommitdiff
path: root/src/buildtool/build_engine/expression/expression_ptr.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/build_engine/expression/expression_ptr.hpp')
-rw-r--r--src/buildtool/build_engine/expression/expression_ptr.hpp95
1 files changed, 95 insertions, 0 deletions
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 <functional>
+#include <memory>
+#include <string>
+#include <type_traits>
+
+#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 <class T>
+ requires(not std::is_same_v<std::remove_cvref_t<T>, ExpressionPtr>)
+ // NOLINTNEXTLINE(bugprone-forwarding-reference-overload)
+ explicit ExpressionPtr(T&& data) noexcept
+ : ptr_{std::make_shared<Expression>(std::forward<T>(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<bool>(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 <class T>
+ [[nodiscard]] auto operator==(T const& other) const -> bool {
+ return ptr_ and *ptr_ == other;
+ }
+ template <class T>
+ [[nodiscard]] auto operator!=(T const& other) const -> bool {
+ return not(*this == other);
+ }
+ [[nodiscard]] auto Evaluate(
+ Configuration const& env,
+ FunctionMapPtr const& functions,
+ std::function<void(std::string const&)> const& logger =
+ [](std::string const& error) noexcept -> void {
+ Logger::Log(LogLevel::Error, error);
+ },
+ std::function<void(void)> 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<std::string, ExpressionPtr, ExpressionPtr>;
+ [[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<Expression> ptr_;
+};
+
+[[nodiscard]] auto operator+(ExpressionPtr const& lhs, ExpressionPtr const& rhs)
+ -> ExpressionPtr;
+
+namespace std {
+template <>
+struct hash<ExpressionPtr> {
+ [[nodiscard]] auto operator()(ExpressionPtr const& p) const noexcept
+ -> std::size_t;
+};
+} // namespace std
+
+#endif // INCLUDED_SRC_BUILDTOOL_BUILD_ENGINE_EXPRESSION_EXPRESSION_PTR_HPP