From 0d18bf226d035dacaacf65b396ed2e126157d600 Mon Sep 17 00:00:00 2001 From: Ciaran McCreesh Date: Thu, 14 Apr 2011 22:46:37 +0100 Subject: Defer choice checks --- paludis/match_package.cc | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/paludis/match_package.cc b/paludis/match_package.cc index 74d2dedd8..9fe5dad2b 100644 --- a/paludis/match_package.cc +++ b/paludis/match_package.cc @@ -44,6 +44,7 @@ #include #include #include +#include using namespace paludis; @@ -54,13 +55,22 @@ namespace struct RequirementChecker { const Environment & env; - const ChangedChoices * const maybe_changes_to_owner; const std::shared_ptr & id; - const std::shared_ptr & from_id; - const ChangedChoices * const maybe_changes_to_target; const MatchPackageOptions & options; bool version_requirements_ok; + std::list defer_choice_requirements; + + RequirementChecker( + const Environment & e, + const std::shared_ptr & i, + const MatchPackageOptions & o) : + env(e), + id(i), + options(o), + version_requirements_ok(true) + { + } bool visit(const NameRequirement & r) { @@ -179,11 +189,8 @@ namespace bool visit(const ChoiceRequirement & r) { - if (options[mpo_ignore_choice_requirements]) - return true; - - if (! r.requirement_met(&env, maybe_changes_to_owner, id, from_id, maybe_changes_to_target).first) - return false; + if (! options[mpo_ignore_choice_requirements]) + defer_choice_requirements.push_back(&r); return true; } @@ -208,14 +215,23 @@ paludis::match_package_with_maybe_changes( const ChangedChoices * const maybe_changes_to_target, const MatchPackageOptions & options) { - RequirementChecker c{env, maybe_changes_to_owner, id, from_id, maybe_changes_to_target, options, true}; + RequirementChecker c{env, id, options}; for (auto r(spec.requirements()->begin()), r_end(spec.requirements()->end()) ; r != r_end ; ++r) if (! (*r)->accept_returning(c)) return false; - return c.version_requirements_ok; + if (! c.version_requirements_ok) + return false; + + + for (auto r(c.defer_choice_requirements.begin()), r_end(c.defer_choice_requirements.end()) ; + r != r_end ; ++r) + if (! (*r)->requirement_met(&env, maybe_changes_to_owner, id, from_id, maybe_changes_to_target).first) + return false; + + return true; } bool -- cgit v1.2.3