diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2022-02-22 17:03:21 +0100 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2022-02-22 17:03:21 +0100 |
commit | 619def44c1cca9f3cdf63544d5f24f2c7a7d9b77 (patch) | |
tree | 01868de723cb82c86842f33743fa7b14e24c1fa3 /src/buildtool/build_engine/expression/expression_ptr.cpp | |
download | justbuild-619def44c1cca9f3cdf63544d5f24f2c7a7d9b77.tar.gz |
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 <oliver.reiche@huawei.com>
Co-authored-by: Victor Moreno <victor.moreno1@huawei.com>
Diffstat (limited to 'src/buildtool/build_engine/expression/expression_ptr.cpp')
-rw-r--r-- | src/buildtool/build_engine/expression/expression_ptr.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/buildtool/build_engine/expression/expression_ptr.cpp b/src/buildtool/build_engine/expression/expression_ptr.cpp new file mode 100644 index 00000000..97cdb138 --- /dev/null +++ b/src/buildtool/build_engine/expression/expression_ptr.cpp @@ -0,0 +1,89 @@ +#include <string> + +#include "src/buildtool/build_engine/expression/evaluator.hpp" +#include "src/buildtool/build_engine/expression/expression.hpp" + +ExpressionPtr::ExpressionPtr() noexcept : ptr_{Expression::kNone.ptr_} {} + +auto ExpressionPtr::operator*() && -> Expression { + return *ptr_; +} + +auto ExpressionPtr::operator[]( + std::string const& key) const& -> ExpressionPtr const& { + return (*ptr_)[key]; +} + +auto ExpressionPtr::operator[](std::string const& key) && -> ExpressionPtr { + return (*ptr_)[key]; +} + +auto ExpressionPtr::operator[]( + ExpressionPtr const& key) const& -> ExpressionPtr const& { + return (*ptr_)[key]; +} + +auto ExpressionPtr::operator[](ExpressionPtr const& key) && -> ExpressionPtr { + return (*ptr_)[key]; +} + +auto ExpressionPtr::operator[](size_t pos) const& -> ExpressionPtr const& { + return (*ptr_)[pos]; +} + +auto ExpressionPtr::operator[](size_t pos) && -> ExpressionPtr { + return (*ptr_)[pos]; +} + +auto ExpressionPtr::operator<(ExpressionPtr const& other) const -> bool { + return ptr_->ToHash() < other.ptr_->ToHash(); +} + +auto ExpressionPtr::operator==(ExpressionPtr const& other) const -> bool { + return ptr_ == other.ptr_ or (ptr_ and other.ptr_ and *ptr_ == *other.ptr_); +} + +auto ExpressionPtr::Evaluate( + Configuration const& env, + FunctionMapPtr const& functions, + std::function<void(std::string const&)> const& logger, + std::function<void(void)> const& note_user_context) const noexcept + -> ExpressionPtr { + return Evaluator::EvaluateExpression( + *this, env, functions, logger, note_user_context); +} + +auto ExpressionPtr::IsCacheable() const noexcept -> bool { + return ptr_ and ptr_->IsCacheable(); +} + +auto ExpressionPtr::ToIdentifier() const noexcept -> std::string { + return ptr_ ? ptr_->ToIdentifier() : std::string{}; +} + +auto ExpressionPtr::ToJson() const noexcept -> nlohmann::json { + return ptr_ ? ptr_->ToJson() : nlohmann::json::object(); +} + +auto ExpressionPtr::IsNotNull() const noexcept -> bool { + // ExpressionPtr is nullptr in error case and none_t default empty case. + return static_cast<bool>(ptr_) and not(ptr_->IsNone()); +} + +auto ExpressionPtr::LinkedMap() const& -> ExpressionPtr::linked_map_t const& { + return ptr_->Map(); +} + +auto ExpressionPtr::Make(linked_map_t&& map) -> ExpressionPtr { + return ExpressionPtr{std::move(map)}; +} + +auto operator+(ExpressionPtr const& lhs, ExpressionPtr const& rhs) + -> ExpressionPtr { + return ExpressionPtr{*lhs + *rhs}; +} + +auto std::hash<ExpressionPtr>::operator()(ExpressionPtr const& p) const noexcept + -> std::size_t { + return std::hash<Expression>{}(*p); +} |