diff options
author | 2011-06-19 18:06:02 +0100 | |
---|---|---|
committer | 2011-06-19 18:06:02 +0100 | |
commit | a3e36c8d731798e9ca930b9fdd4e99cda155dbd5 (patch) | |
tree | f076828e0704c95e7fd0b9394d4b3e47d0ef75d3 | |
parent | 726d87775ad381f4c38bf336e02437a9f3bed037 (diff) | |
download | paludis-a3e36c8d731798e9ca930b9fdd4e99cda155dbd5.tar.gz paludis-a3e36c8d731798e9ca930b9fdd4e99cda155dbd5.tar.xz |
Make some ChangeByResolvents into DependentPackageIDs
-rw-r--r-- | paludis/resolver/collect_depped_upon-fwd.hh | 7 | ||||
-rw-r--r-- | paludis/resolver/collect_depped_upon.cc | 72 | ||||
-rw-r--r-- | paludis/resolver/collect_depped_upon.hh | 34 | ||||
-rw-r--r-- | paludis/resolver/decider.cc | 8 | ||||
-rw-r--r-- | paludis/resolver/get_constraints_for_dependent_helper.cc | 2 | ||||
-rw-r--r-- | paludis/resolver/get_constraints_for_dependent_helper.hh | 6 | ||||
-rw-r--r-- | paludis/resolver/orderer.cc | 8 | ||||
-rw-r--r-- | paludis/resolver/reason.cc | 21 | ||||
-rw-r--r-- | paludis/resolver/reason.hh | 8 | ||||
-rw-r--r-- | paludis/resolver/resolver_functions.hh | 6 | ||||
-rwxr-xr-x | src/clients/cave/cmd_display_resolution.cc | 7 | ||||
-rw-r--r-- | src/clients/cave/cmd_resolve_dump.cc | 8 | ||||
-rw-r--r-- | src/clients/cave/resolve_common.cc | 2 |
13 files changed, 153 insertions, 36 deletions
diff --git a/paludis/resolver/collect_depped_upon-fwd.hh b/paludis/resolver/collect_depped_upon-fwd.hh index 250974476..0f49a22d2 100644 --- a/paludis/resolver/collect_depped_upon-fwd.hh +++ b/paludis/resolver/collect_depped_upon-fwd.hh @@ -21,6 +21,7 @@ #define PALUDIS_GUARD_PALUDIS_RESOLVER_COLLECT_DEPPED_UPON_FWD_HH 1 #include <paludis/util/attributes.hh> +#include <paludis/util/sequence-fwd.hh> #include <paludis/resolver/change_by_resolvent-fwd.hh> #include <paludis/package_id-fwd.hh> #include <paludis/environment-fwd.hh> @@ -30,7 +31,11 @@ namespace paludis { namespace resolver { - const std::shared_ptr<const ChangeByResolventSequence> dependent_upon( + struct DependentPackageID; + + typedef Sequence<DependentPackageID> DependentPackageIDSequence; + + const std::shared_ptr<const DependentPackageIDSequence> dependent_upon( const Environment * const, const std::shared_ptr<const PackageID> &, const std::shared_ptr<const ChangeByResolventSequence> &, diff --git a/paludis/resolver/collect_depped_upon.cc b/paludis/resolver/collect_depped_upon.cc index b577304a6..49dbd6ff5 100644 --- a/paludis/resolver/collect_depped_upon.cc +++ b/paludis/resolver/collect_depped_upon.cc @@ -19,11 +19,17 @@ #include <paludis/resolver/collect_depped_upon.hh> #include <paludis/resolver/change_by_resolvent.hh> + #include <paludis/util/visitor_cast.hh> #include <paludis/util/indirect_iterator-impl.hh> -#include <paludis/util/wrapped_output_iterator.hh> #include <paludis/util/accept_visitor.hh> #include <paludis/util/make_null_shared_ptr.hh> +#include <paludis/util/make_named_values.hh> +#include <paludis/util/sequence-impl.hh> +#include <paludis/util/set-impl.hh> +#include <paludis/util/wrapped_output_iterator-impl.hh> +#include <paludis/util/wrapped_forward_iterator-impl.hh> + #include <paludis/spec_tree.hh> #include <paludis/dep_spec.hh> #include <paludis/environment.hh> @@ -33,6 +39,8 @@ #include <paludis/metadata_key.hh> #include <paludis/match_package.hh> #include <paludis/version_spec.hh> +#include <paludis/serialise-impl.hh> + #include <algorithm> using namespace paludis; @@ -50,6 +58,30 @@ namespace return i.package_id(); } + template <typename R_> + struct ResultValueMaker; + + template <> + struct ResultValueMaker<std::shared_ptr<const PackageID> > + { + static const std::shared_ptr<const PackageID> create(const std::shared_ptr<const PackageID> & i) + { + return i; + } + }; + + template <> + struct ResultValueMaker<DependentPackageID> + { + static DependentPackageID create(const ChangeByResolvent & r) + { + return make_named_values<DependentPackageID>( + n::package_id() = r.package_id(), + n::resolvent() = r.resolvent() + ); + } + }; + template <typename S_> const std::shared_ptr<const PackageID> best_eventual( const Environment * const env, @@ -70,7 +102,7 @@ namespace return result; } - template <typename C_> + template <typename C_, typename R_> struct DependentChecker { const Environment * const env; @@ -78,7 +110,7 @@ namespace const std::shared_ptr<const C_> going_away; const std::shared_ptr<const C_> newly_available; const std::shared_ptr<const PackageIDSequence> not_changing_slots; - const std::shared_ptr<C_> result; + const std::shared_ptr<R_> result; DependentChecker( const Environment * const e, @@ -91,7 +123,7 @@ namespace going_away(g), newly_available(n), not_changing_slots(s), - result(std::make_shared<C_>()) + result(std::make_shared<R_>()) { } @@ -137,7 +169,7 @@ namespace } if (! any) - result->push_back(*g); + result->push_back(ResultValueMaker<typename R_::value_type>::create(*g)); } } @@ -170,7 +202,7 @@ namespace }; } -const std::shared_ptr<const ChangeByResolventSequence> +const std::shared_ptr<const DependentPackageIDSequence> paludis::resolver::dependent_upon( const Environment * const env, const std::shared_ptr<const PackageID> & id, @@ -178,7 +210,7 @@ paludis::resolver::dependent_upon( const std::shared_ptr<const ChangeByResolventSequence> & staying, const std::shared_ptr<const PackageIDSequence> & not_changing_slots) { - DependentChecker<ChangeByResolventSequence> c(env, id, going_away, staying, not_changing_slots); + DependentChecker<ChangeByResolventSequence, DependentPackageIDSequence> c(env, id, going_away, staying, not_changing_slots); if (id->dependencies_key()) id->dependencies_key()->parse_value()->top()->accept(c); else @@ -201,7 +233,7 @@ paludis::resolver::collect_depped_upon( const std::shared_ptr<const PackageIDSequence> & candidates, const std::shared_ptr<const PackageIDSequence> & not_changing_slots) { - DependentChecker<PackageIDSequence> c(env, id, candidates, std::make_shared<PackageIDSequence>(), not_changing_slots); + DependentChecker<PackageIDSequence, PackageIDSequence> c(env, id, candidates, std::make_shared<PackageIDSequence>(), not_changing_slots); if (id->dependencies_key()) id->dependencies_key()->parse_value()->top()->accept(c); else @@ -233,7 +265,7 @@ paludis::resolver::collect_dependents( for (auto i(installed_ids->begin()), i_end(installed_ids->end()) ; i != i_end ; ++i) { - DependentChecker<PackageIDSequence> c(env, *i, going_away_as_ids, + DependentChecker<PackageIDSequence, PackageIDSequence> c(env, *i, going_away_as_ids, std::make_shared<PackageIDSequence>(), std::make_shared<PackageIDSequence>()); if ((*i)->dependencies_key()) @@ -255,3 +287,25 @@ paludis::resolver::collect_dependents( return result; } +void +DependentPackageID::serialise(Serialiser & s) const +{ + s.object("DependentPackageID") + .member(SerialiserFlags<serialise::might_be_null>(), "package_id", package_id()) + .member(SerialiserFlags<>(), "resolvent", resolvent()) + ; +} + +const DependentPackageID +DependentPackageID::deserialise(Deserialisation & d) +{ + Deserialisator v(d, "DependentPackageID"); + return make_named_values<DependentPackageID>( + n::package_id() = v.member<std::shared_ptr<const PackageID> >("package_id"), + n::resolvent() = v.member<Resolvent>("resolvent") + ); +} + +template class Sequence<DependentPackageID>; +template class WrappedForwardIterator<Sequence<DependentPackageID>::ConstIteratorTag, const DependentPackageID>; + diff --git a/paludis/resolver/collect_depped_upon.hh b/paludis/resolver/collect_depped_upon.hh index 0fb8348d9..78dd500d2 100644 --- a/paludis/resolver/collect_depped_upon.hh +++ b/paludis/resolver/collect_depped_upon.hh @@ -1,7 +1,7 @@ /* vim: set sw=4 sts=4 et foldmethod=syntax : */ /* - * Copyright (c) 2010 Ciaran McCreesh + * Copyright (c) 2010, 2011 Ciaran McCreesh * * This file is part of the Paludis package manager. Paludis is free software; * you can redistribute it and/or modify it under the terms of the GNU General @@ -21,5 +21,37 @@ #define PALUDIS_GUARD_PALUDIS_RESOLVER_COLLECT_DEPPED_UPON_HH 1 #include <paludis/resolver/collect_depped_upon-fwd.hh> +#include <paludis/resolver/resolvent.hh> + +#include <paludis/util/sequence.hh> +#include <paludis/util/wrapped_forward_iterator.hh> +#include <paludis/util/named_value.hh> + +#include <paludis/package_id-fwd.hh> +#include <paludis/serialise-fwd.hh> + +namespace paludis +{ + namespace n + { + typedef Name<struct name_package_id> package_id; + typedef Name<struct name_resolvent> resolvent; + } + + namespace resolver + { + struct DependentPackageID + { + NamedValue<n::package_id, std::shared_ptr<const PackageID> > package_id; + NamedValue<n::resolvent, Resolvent> resolvent; + + void serialise(Serialiser &) const; + static const DependentPackageID deserialise(Deserialisation &) PALUDIS_ATTRIBUTE((warn_unused_result)); + }; + } + + extern template class Sequence<resolver::DependentPackageID>; + extern template class WrappedForwardIterator<Sequence<resolver::DependentPackageID>::ConstIteratorTag, const resolver::DependentPackageID>; +} #endif diff --git a/paludis/resolver/decider.cc b/paludis/resolver/decider.cc index c62995924..9b916dd29 100644 --- a/paludis/resolver/decider.cc +++ b/paludis/resolver/decider.cc @@ -231,8 +231,7 @@ Decider::_resolve_dependents() if (! (*s)->supports_action(SupportsActionTest<UninstallAction>())) continue; - const std::shared_ptr<const ChangeByResolventSequence> dependent_upon_ids(dependent_upon( - _imp->env, *s, changing.first, changing.second, staying)); + auto dependent_upon_ids(dependent_upon(_imp->env, *s, changing.first, changing.second, staying)); if (dependent_upon_ids->empty()) continue; @@ -245,9 +244,8 @@ Decider::_resolve_dependents() if (remove && _imp->resolutions_by_resolvent->end() == _imp->resolutions_by_resolvent->find(resolvent)) changed = true; - const std::shared_ptr<Resolution> resolution(_resolution_for_resolvent(resolvent, true)); - const std::shared_ptr<const ConstraintSequence> constraints(_imp->fns.get_constraints_for_dependent_fn()( - resolution, *s, dependent_upon_ids)); + auto resolution(_resolution_for_resolvent(resolvent, true)); + auto constraints(_imp->fns.get_constraints_for_dependent_fn()(resolution, *s, dependent_upon_ids)); for (ConstraintSequence::ConstIterator c(constraints->begin()), c_end(constraints->end()) ; c != c_end ; ++c) _apply_resolution_constraint(resolution, *c); diff --git a/paludis/resolver/get_constraints_for_dependent_helper.cc b/paludis/resolver/get_constraints_for_dependent_helper.cc index 7264eedc0..5a008a47a 100644 --- a/paludis/resolver/get_constraints_for_dependent_helper.cc +++ b/paludis/resolver/get_constraints_for_dependent_helper.cc @@ -73,7 +73,7 @@ const std::shared_ptr<ConstraintSequence> GetConstraintsForDependentHelper::operator() ( const std::shared_ptr<const Resolution> &, const std::shared_ptr<const PackageID> & id, - const std::shared_ptr<const ChangeByResolventSequence> & dependent_upon_ids) const + const std::shared_ptr<const DependentPackageIDSequence> & dependent_upon_ids) const { auto result(std::make_shared<ConstraintSequence>()); diff --git a/paludis/resolver/get_constraints_for_dependent_helper.hh b/paludis/resolver/get_constraints_for_dependent_helper.hh index a210d362f..66d663699 100644 --- a/paludis/resolver/get_constraints_for_dependent_helper.hh +++ b/paludis/resolver/get_constraints_for_dependent_helper.hh @@ -24,11 +24,15 @@ #include <paludis/resolver/resolution-fwd.hh> #include <paludis/resolver/change_by_resolvent-fwd.hh> #include <paludis/resolver/constraint-fwd.hh> +#include <paludis/resolver/collect_depped_upon-fwd.hh> + #include <paludis/util/pimp.hh> #include <paludis/util/attributes.hh> + #include <paludis/dep_spec-fwd.hh> #include <paludis/environment-fwd.hh> #include <paludis/package_id-fwd.hh> + #include <memory> namespace paludis @@ -49,7 +53,7 @@ namespace paludis const std::shared_ptr<ConstraintSequence> operator() ( const std::shared_ptr<const Resolution> &, const std::shared_ptr<const PackageID> &, - const std::shared_ptr<const ChangeByResolventSequence> &) const; + const std::shared_ptr<const DependentPackageIDSequence> &) const; }; } diff --git a/paludis/resolver/orderer.cc b/paludis/resolver/orderer.cc index 59ef7b834..1f7381abc 100644 --- a/paludis/resolver/orderer.cc +++ b/paludis/resolver/orderer.cc @@ -35,6 +35,8 @@ #include <paludis/resolver/orderer_notes.hh> #include <paludis/resolver/change_by_resolvent.hh> #include <paludis/resolver/labels_classifier.hh> +#include <paludis/resolver/collect_depped_upon.hh> + #include <paludis/util/pimp-impl.hh> #include <paludis/util/exception.hh> #include <paludis/util/stringify.hh> @@ -45,10 +47,12 @@ #include <paludis/util/visitor_cast.hh> #include <paludis/util/tribool.hh> #include <paludis/util/enum_iterator.hh> + #include <paludis/partially_made_package_dep_spec.hh> #include <paludis/environment.hh> #include <paludis/notifier_callback.hh> #include <paludis/package_id.hh> + #include <unordered_set> #include <unordered_map> #include <algorithm> @@ -363,11 +367,11 @@ namespace /* we may be constrained by a dep from a package that was changed * from a non error decision to an unable to make decision */ if (ignore_dependencies_from_resolvents.end() != ignore_dependencies_from_resolvents.find( - r.id_and_resolvent_being_removed().resolvent())) + r.dependent_upon().resolvent())) return; NAGIndex from(make_named_values<NAGIndex>( - n::resolvent() = r.id_and_resolvent_being_removed().resolvent(), + n::resolvent() = r.dependent_upon().resolvent(), n::role() = nir_done )); diff --git a/paludis/resolver/reason.cc b/paludis/resolver/reason.cc index 50977f458..c966b7496 100644 --- a/paludis/resolver/reason.cc +++ b/paludis/resolver/reason.cc @@ -21,10 +21,13 @@ #include <paludis/resolver/resolvent.hh> #include <paludis/resolver/sanitised_dependencies.hh> #include <paludis/resolver/change_by_resolvent.hh> +#include <paludis/resolver/collect_depped_upon.hh> + #include <paludis/util/stringify.hh> #include <paludis/util/pimp-impl.hh> #include <paludis/util/sequence-impl.hh> #include <paludis/util/wrapped_forward_iterator-impl.hh> + #include <paludis/serialise-impl.hh> #include <paludis/changed_choices.hh> @@ -156,16 +159,16 @@ namespace paludis template <> struct Imp<DependentReason> { - const ChangeByResolvent id_being_removed; + const DependentPackageID dependent_upon; - Imp(const ChangeByResolvent & i) : - id_being_removed(i) + Imp(const DependentPackageID & i) : + dependent_upon(i) { } }; } -DependentReason::DependentReason(const ChangeByResolvent & i) : +DependentReason::DependentReason(const DependentPackageID & i) : _imp(i) { } @@ -174,17 +177,17 @@ DependentReason::~DependentReason() { } -const ChangeByResolvent -DependentReason::id_and_resolvent_being_removed() const +const DependentPackageID +DependentReason::dependent_upon() const { - return _imp->id_being_removed; + return _imp->dependent_upon; } void DependentReason::serialise(Serialiser & s) const { s.object("DependentReason") - .member(SerialiserFlags<>(), "id_and_resolvent_being_removed", id_and_resolvent_being_removed()) + .member(SerialiserFlags<>(), "dependent_upon", dependent_upon()) ; } @@ -454,7 +457,7 @@ Reason::deserialise(Deserialisation & d) { Deserialisator v(d, "DependentReason"); return std::make_shared<DependentReason>( - v.member<ChangeByResolvent>("id_and_resolvent_being_removed") + v.member<DependentPackageID>("dependent_upon") ); } else if (d.class_name() == "WasUsedByReason") diff --git a/paludis/resolver/reason.hh b/paludis/resolver/reason.hh index 0c6745ba8..de9f08580 100644 --- a/paludis/resolver/reason.hh +++ b/paludis/resolver/reason.hh @@ -24,14 +24,18 @@ #include <paludis/resolver/resolvent-fwd.hh> #include <paludis/resolver/sanitised_dependencies-fwd.hh> #include <paludis/resolver/change_by_resolvent-fwd.hh> +#include <paludis/resolver/collect_depped_upon-fwd.hh> + #include <paludis/util/pimp.hh> #include <paludis/util/visitor.hh> #include <paludis/util/type_list.hh> #include <paludis/util/tribool.hh> + #include <paludis/name-fwd.hh> #include <paludis/package_id-fwd.hh> #include <paludis/serialise-fwd.hh> #include <paludis/changed_choices-fwd.hh> + #include <memory> namespace paludis @@ -102,10 +106,10 @@ namespace paludis Pimp<DependentReason> _imp; public: - DependentReason(const ChangeByResolvent &); + DependentReason(const DependentPackageID &); ~DependentReason(); - const ChangeByResolvent id_and_resolvent_being_removed() const; + const DependentPackageID dependent_upon() const; virtual void serialise(Serialiser &) const; }; diff --git a/paludis/resolver/resolver_functions.hh b/paludis/resolver/resolver_functions.hh index 75a61b725..cbe8b0a04 100644 --- a/paludis/resolver/resolver_functions.hh +++ b/paludis/resolver/resolver_functions.hh @@ -31,8 +31,11 @@ #include <paludis/resolver/constraint-fwd.hh> #include <paludis/resolver/required_confirmations-fwd.hh> #include <paludis/resolver/change_by_resolvent-fwd.hh> +#include <paludis/resolver/collect_depped_upon-fwd.hh> + #include <paludis/util/named_value.hh> #include <paludis/util/tribool-fwd.hh> + #include <paludis/filter-fwd.hh> #include <paludis/name-fwd.hh> #include <paludis/package_id-fwd.hh> @@ -40,6 +43,7 @@ #include <paludis/dep_spec-fwd.hh> #include <paludis/generator-fwd.hh> #include <paludis/filtered_generator-fwd.hh> + #include <functional> namespace paludis @@ -113,7 +117,7 @@ namespace paludis typedef std::function<std::shared_ptr<ConstraintSequence> ( const std::shared_ptr<const Resolution> &, const std::shared_ptr<const PackageID> &, - const std::shared_ptr<const ChangeByResolventSequence> & + const std::shared_ptr<const DependentPackageIDSequence> & )> GetConstraintsForDependentFunction; typedef std::function<std::shared_ptr<ConstraintSequence> ( diff --git a/src/clients/cave/cmd_display_resolution.cc b/src/clients/cave/cmd_display_resolution.cc index 31c074a8d..fa1019fc4 100755 --- a/src/clients/cave/cmd_display_resolution.cc +++ b/src/clients/cave/cmd_display_resolution.cc @@ -25,7 +25,9 @@ #include "colour_pretty_printer.hh" #include "format_user_config.hh" #include "parse_spec_with_nice_error.hh" + #include <paludis/args/do_help.hh> + #include <paludis/util/safe_ifstream.hh> #include <paludis/util/system.hh> #include <paludis/util/destringify.hh> @@ -42,6 +44,7 @@ #include <paludis/util/pretty_print.hh> #include <paludis/util/make_null_shared_ptr.hh> #include <paludis/util/enum_iterator.hh> + #include <paludis/resolver/resolutions_by_resolvent.hh> #include <paludis/resolver/reason.hh> #include <paludis/resolver/sanitised_dependencies.hh> @@ -58,6 +61,8 @@ #include <paludis/resolver/change_by_resolvent.hh> #include <paludis/resolver/match_qpns.hh> #include <paludis/resolver/why_changed_choices.hh> +#include <paludis/resolver/collect_depped_upon.hh> + #include <paludis/package_id.hh> #include <paludis/version_spec.hh> #include <paludis/metadata_key.hh> @@ -236,7 +241,7 @@ namespace std::pair<std::string, Tribool> visit(const DependentReason & r) const { - return std::make_pair("dependent upon " + stringify(*r.id_and_resolvent_being_removed().package_id()), true); + return std::make_pair("dependent upon " + stringify(*r.dependent_upon().package_id()), true); } std::pair<std::string, Tribool> visit(const WasUsedByReason & r) const diff --git a/src/clients/cave/cmd_resolve_dump.cc b/src/clients/cave/cmd_resolve_dump.cc index 469f182d5..d0becbd05 100644 --- a/src/clients/cave/cmd_resolve_dump.cc +++ b/src/clients/cave/cmd_resolve_dump.cc @@ -1,7 +1,7 @@ /* vim: set sw=4 sts=4 et foldmethod=syntax : */ /* - * Copyright (c) 2009, 2010 Ciaran McCreesh + * Copyright (c) 2009, 2010, 2011 Ciaran McCreesh * * This file is part of the Paludis package manager. Paludis is free software; * you can redistribute it and/or modify it under the terms of the GNU General @@ -18,6 +18,7 @@ */ #include "cmd_resolve_dump.hh" + #include <paludis/resolver/resolver.hh> #include <paludis/resolver/resolvent.hh> #include <paludis/resolver/sanitised_dependencies.hh> @@ -28,11 +29,14 @@ #include <paludis/resolver/destination.hh> #include <paludis/resolver/resolutions_by_resolvent.hh> #include <paludis/resolver/change_by_resolvent.hh> +#include <paludis/resolver/collect_depped_upon.hh> + #include <paludis/util/enum_iterator.hh> #include <paludis/util/indirect_iterator-impl.hh> #include <paludis/util/join.hh> #include <paludis/util/stringify.hh> #include <paludis/util/wrapped_forward_iterator.hh> + #include <iostream> #include <sstream> @@ -179,7 +183,7 @@ namespace void visit(const DependentReason & r) { - str = "Dependent(" + stringify(*r.id_and_resolvent_being_removed().package_id()) + ")"; + str = "Dependent(" + stringify(*r.dependent_upon().package_id()) + ")"; } void visit(const WasUsedByReason & r) diff --git a/src/clients/cave/resolve_common.cc b/src/clients/cave/resolve_common.cc index 63087b146..3ddbddb33 100644 --- a/src/clients/cave/resolve_common.cc +++ b/src/clients/cave/resolve_common.cc @@ -539,7 +539,7 @@ namespace const std::string visit(const DependentReason & r) const { - return "from dependent " + stringify(*r.id_and_resolvent_being_removed().package_id()); + return "from dependent " + stringify(*r.dependent_upon().package_id()); } const std::string visit(const TargetReason & r) const |