diff --git a/src/evaluator/context.cc b/src/evaluator/context.cc index 1d22635..746c9e2 100644 --- a/src/evaluator/context.cc +++ b/src/evaluator/context.cc @@ -17,7 +17,7 @@ auto EvaluationContext::prepare(const sourcemeta::jsontoolkit::JSON &instance) this->labels.clear(); this->property_as_instance = false; this->evaluated_.clear(); - this->annotation_blacklist.clear(); + this->evaluated_blacklist_.clear(); } auto EvaluationContext::push_without_traverse( @@ -92,12 +92,8 @@ auto EvaluationContext::pop(const bool dynamic) -> void { } } -// TODO: At least currently, we only need to mask if a schema -// makes use of `unevaluatedProperties` or `unevaluatedItems` -// Detect if a schema does need this so if not, we avoid -// an unnecessary copy auto EvaluationContext::mask() -> void { - this->annotation_blacklist.push_back(this->evaluate_path_); + this->evaluated_blacklist_.push_back(this->evaluate_path_); } auto EvaluationContext::enter( @@ -219,34 +215,11 @@ auto EvaluationContext::evaluate( } auto EvaluationContext::is_evaluated( - const sourcemeta::jsontoolkit::Pointer::Token::Property &property) const - -> bool { + sourcemeta::jsontoolkit::WeakPointer::Token &&token) const -> bool { auto expected_instance_location = this->instance_location_; - expected_instance_location.push_back(property); - - for (const auto &entry : this->evaluated_) { - if (entry.first == expected_instance_location && - // Its not possible to affect cousins - entry.second.starts_with(this->evaluate_path_.initial())) { - // Handle "not" - for (const auto &mask : this->annotation_blacklist) { - if (entry.second.starts_with(mask) && - !this->evaluate_path_.starts_with(mask)) { - return false; - } - } - - return true; - } - } - - return false; -} - -auto EvaluationContext::is_evaluated( - const sourcemeta::jsontoolkit::Pointer::Token::Index index) const -> bool { - auto expected_instance_location = this->instance_location_; - expected_instance_location.push_back(index); + // TODO: Allow directly pushing back a token + expected_instance_location.push_back( + sourcemeta::jsontoolkit::WeakPointer{std::move(token)}); for (const auto &entry : this->evaluated_) { if ((entry.first == expected_instance_location || @@ -254,7 +227,7 @@ auto EvaluationContext::is_evaluated( // Its not possible to affect cousins entry.second.starts_with(this->evaluate_path_.initial())) { // Handle "not" - for (const auto &mask : this->annotation_blacklist) { + for (const auto &mask : this->evaluated_blacklist_) { if (entry.second.starts_with(mask) && !this->evaluate_path_.starts_with(mask)) { return false; diff --git a/src/evaluator/evaluator.cc b/src/evaluator/evaluator.cc index 2f2d25a..07d23fd 100644 --- a/src/evaluator/evaluator.cc +++ b/src/evaluator/evaluator.cc @@ -722,7 +722,8 @@ auto evaluate_step(const sourcemeta::blaze::Template::value_type &step, result = true; for (const auto &entry : target.as_object()) { - if (context.is_evaluated(entry.first)) { + if (context.is_evaluated( + sourcemeta::jsontoolkit::WeakPointer::Token{entry.first})) { continue; } @@ -750,7 +751,8 @@ auto evaluate_step(const sourcemeta::blaze::Template::value_type &step, for (auto iterator = array.cbegin(); iterator != array.cend(); ++iterator) { const auto index{std::distance(array.cbegin(), iterator)}; - if (context.is_evaluated(static_cast(index))) { + if (context.is_evaluated( + static_cast(index))) { continue; } diff --git a/src/evaluator/include/sourcemeta/blaze/evaluator_context.h b/src/evaluator/include/sourcemeta/blaze/evaluator_context.h index a0d8cac..82975fe 100644 --- a/src/evaluator/include/sourcemeta/blaze/evaluator_context.h +++ b/src/evaluator/include/sourcemeta/blaze/evaluator_context.h @@ -98,15 +98,9 @@ class SOURCEMETA_BLAZE_EVALUATOR_EXPORT EvaluationContext { auto evaluate(const sourcemeta::jsontoolkit::Pointer &relative_instance_location) -> void; - auto mask() -> void; - - // TODO: Have a single is_evaluated() that operates on a Token? - auto is_evaluated( - const sourcemeta::jsontoolkit::Pointer::Token::Property &property) const - -> bool; - auto - is_evaluated(const sourcemeta::jsontoolkit::Pointer::Token::Index index) const + auto is_evaluated(sourcemeta::jsontoolkit::WeakPointer::Token &&token) const -> bool; + auto mask() -> void; public: // TODO: Remove this @@ -128,13 +122,12 @@ class SOURCEMETA_BLAZE_EVALUATOR_EXPORT EvaluationContext { std::vector resources_; std::map> labels; bool property_as_instance{false}; - // TODO: Turn this into a trie + + // TODO: Turn these into a trie std::vector> evaluated_; - - // TODO: Make this part of the trie above - std::vector annotation_blacklist; + std::vector evaluated_blacklist_; #if defined(_MSC_VER) #pragma warning(default : 4251 4275) #endif