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/target_node.hpp | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/buildtool/build_engine/expression/target_node.hpp (limited to 'src/buildtool/build_engine/expression/target_node.hpp') diff --git a/src/buildtool/build_engine/expression/target_node.hpp b/src/buildtool/build_engine/expression/target_node.hpp new file mode 100644 index 00000000..a2ab9c83 --- /dev/null +++ b/src/buildtool/build_engine/expression/target_node.hpp @@ -0,0 +1,83 @@ +#ifndef INCLUDED_SRC_BUILDTOOL_BUILDENGINE_EXPRESSION_TARGET_NODE_HPP +#define INCLUDED_SRC_BUILDTOOL_BUILDENGINE_EXPRESSION_TARGET_NODE_HPP + +#include +#include + +#include "src/buildtool/build_engine/expression/expression_ptr.hpp" +#include "src/buildtool/build_engine/expression/target_result.hpp" + +class TargetNode { + using Value = ExpressionPtr; // store result type + + public: + struct Abstract { + std::string node_type; // arbitrary string that maps to rule + ExpressionPtr string_fields; // map to list of strings + ExpressionPtr target_fields; // map to list of targets + [[nodiscard]] auto IsCacheable() const noexcept -> bool; + }; + + template + requires( + std::is_same_v or + std::is_same_v) explicit TargetNode(NodeType node) + : data_{std::move(node)}, + is_cacheable_{std::get(data_).IsCacheable()} {} + + [[nodiscard]] auto IsCacheable() const noexcept -> bool { + return is_cacheable_; + } + + [[nodiscard]] auto IsValue() const noexcept { + return std::holds_alternative(data_); + } + + [[nodiscard]] auto IsAbstract() const noexcept { + return std::holds_alternative(data_); + } + + [[nodiscard]] auto GetValue() const -> Value const& { + return std::get(data_); + } + + [[nodiscard]] auto GetAbstract() const -> Abstract const& { + return std::get(data_); + } + + [[nodiscard]] auto operator==(TargetNode const& other) const noexcept + -> bool { + if (data_.index() == other.data_.index()) { + try { + if (IsValue()) { + return GetValue() == other.GetValue(); + } + auto const& abs_l = GetAbstract(); + auto const& abs_r = other.GetAbstract(); + return abs_l.node_type == abs_r.node_type and + abs_l.string_fields == abs_r.string_fields and + abs_l.target_fields == abs_r.string_fields; + } catch (...) { + // should never happen + } + } + return false; + } + + [[nodiscard]] auto ToString() const noexcept -> std::string { + try { + return ToJson().dump(); + } catch (...) { + // should never happen + } + return {}; + } + + [[nodiscard]] auto ToJson() const -> nlohmann::json; + + private: + std::variant data_; + bool is_cacheable_; +}; + +#endif // INCLUDED_SRC_BUILDTOOL_BUILDENGINE_EXPRESSION_TARGET_NODE_HPP -- cgit v1.2.3