From 04b1a01bdabdd37570c46ece0c310959580c42db Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A1n=20Kupec?= Date: Mon, 29 Mar 2010 18:17:23 +0200 Subject: [PATCH] PackageArgs::empty() added, removing -/+ duplicates --- src/PackageArgs.cc | 26 ++++++++++++++++++++++---- src/PackageArgs.h | 5 +++++ tests/PackageArgs_test.cc | 15 +++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/PackageArgs.cc b/src/PackageArgs.cc index 5955e19..e33fe19 100644 --- a/src/PackageArgs.cc +++ b/src/PackageArgs.cc @@ -104,6 +104,21 @@ void PackageArgs::preprocess(const vector & args) // --------------------------------------------------------------------------- +static bool +remove_duplicate( + PackageArgs::CapRepoPairSet & set, const PackageArgs::CapRepoPair & obj) +{ + PackageArgs::CapRepoPairSet::iterator match = set.find(obj); + if (match != set.end()) + { + set.erase(match); + return true; + } + return false; +} + +// --------------------------------------------------------------------------- + void PackageArgs::argsToCaps(const zypp::ResKind & kind) { bool dont; @@ -219,11 +234,14 @@ void PackageArgs::argsToCaps(const zypp::ResKind & kind) MIL << "got " << (dont?"un":"") << "wanted '" << parsedcap << "'"; MIL << "; repo '" << repo << "'" << endl; - // store - // TODO remove equal +/- args here + // Store, but avoid duplicates in do and dont sets. if (dont) - _dont_caps.insert(CapRepoPair(parsedcap, repo)); - else + { + if (!remove_duplicate(_do_caps, CapRepoPair(parsedcap, repo))) + _dont_caps.insert(CapRepoPair(parsedcap, repo)); + } + else if (!remove_duplicate(_dont_caps, CapRepoPair(parsedcap, repo))) _do_caps.insert(CapRepoPair(parsedcap, repo)); } } + diff --git a/src/PackageArgs.h b/src/PackageArgs.h index 2470f63..4fed1e0 100644 --- a/src/PackageArgs.h +++ b/src/PackageArgs.h @@ -29,7 +29,9 @@ public: typedef std::set CapRepoPairSet; public: + /** Processes current Zypper::arguments() */ PackageArgs(const zypp::ResKind & kind = zypp::ResKind::package); + /** Takes arguments as a vector of strings */ PackageArgs( const std::vector & args, const zypp::ResKind & kind = zypp::ResKind::package); @@ -45,6 +47,9 @@ public: const CapRepoPairSet & dontCaps() const { return _dont_caps; } + bool empty() const + { return doCaps().empty() && dontCaps().empty(); } + protected: /** join arguments at comparison operators ('=', '>=', and the like) */ void preprocess(const std::vector & args); diff --git a/tests/PackageArgs_test.cc b/tests/PackageArgs_test.cc index bb62407..8040cc4 100644 --- a/tests/PackageArgs_test.cc +++ b/tests/PackageArgs_test.cc @@ -142,4 +142,19 @@ BOOST_AUTO_TEST_CASE(argToCaps_test) } } +BOOST_AUTO_TEST_CASE(dupes_test) +{ + { + vector rawargs; + rawargs.push_back("zypper>=1.4.0"); + rawargs.push_back("zypper"); + rawargs.push_back(">="); + rawargs.push_back("1.4.0"); + rawargs.push_back("-zypper>=1.4.0"); + + PackageArgs args(rawargs); + BOOST_CHECK(args.empty()); + } +} + // vim: set ts=2 sts=8 sw=2 ai et: -- 2.7.4