ソースを参照

add cacheset push_back wrapping for std::back_inserter

As usual by now, not all containers wrapped by the cacheset containers
support all methods, like push_back now, but they fail on use of these
unusable methods only.

Would be nice to not expose these methods for unsupporting containers at
all, but that means either a lot of classes or a lot of std::enable_if
magic, which seems like too big work for this small wrapper for now.

Git-Dch: Ignore
David Kalnischkies 10 年 前
コミット
2fc9d1ebca
共有2 個のファイルを変更した34 個の追加12 個の削除を含む
  1. 27 1
      apt-pkg/cacheset.h
  2. 7 11
      cmdline/apt-mark.cc

+ 27 - 1
apt-pkg/cacheset.h

@@ -15,6 +15,7 @@
 #if __cplusplus >= 201103L
 #if __cplusplus >= 201103L
 #include <unordered_set>
 #include <unordered_set>
 #include <forward_list>
 #include <forward_list>
+#include <initializer_list>
 #endif
 #endif
 #include <list>
 #include <list>
 #include <deque>
 #include <deque>
@@ -228,6 +229,7 @@ public:
 	inline iterator_type& operator--() { --_iter;; return static_cast<iterator_type&>(*this); }
 	inline iterator_type& operator--() { --_iter;; return static_cast<iterator_type&>(*this); }
 	inline iterator_type operator--(int) { iterator_type tmp(*this); operator--(); return tmp; }
 	inline iterator_type operator--(int) { iterator_type tmp(*this); operator--(); return tmp; }
 	inline iterator_type operator-(typename container_iterator::difference_type const &n) { return iterator_type(_iter - n); }
 	inline iterator_type operator-(typename container_iterator::difference_type const &n) { return iterator_type(_iter - n); }
+	inline typename container_iterator::difference_type operator-(iterator_type const &b) { return (_iter - b._iter); }
 	inline iterator_type operator-=(typename container_iterator::difference_type const &n) { _iter -= n; return static_cast<iterator_type&>(*this); }
 	inline iterator_type operator-=(typename container_iterator::difference_type const &n) { _iter -= n; return static_cast<iterator_type&>(*this); }
 	inline bool operator!=(iterator_type const &i) const { return _iter != i._iter; }
 	inline bool operator!=(iterator_type const &i) const { return _iter != i._iter; }
 	inline bool operator==(iterator_type const &i) const { return _iter == i._iter; }
 	inline bool operator==(iterator_type const &i) const { return _iter == i._iter; }
@@ -402,10 +404,13 @@ public:									/*{{{*/
 	typedef Container_const_reverse_iterator<PackageContainerInterface, Container, PackageContainer> const_reverse_iterator;
 	typedef Container_const_reverse_iterator<PackageContainerInterface, Container, PackageContainer> const_reverse_iterator;
 	typedef Container_reverse_iterator<PackageContainerInterface, Container, PackageContainer> reverse_iterator;
 	typedef Container_reverse_iterator<PackageContainerInterface, Container, PackageContainer> reverse_iterator;
 	typedef typename Container::value_type value_type;
 	typedef typename Container::value_type value_type;
+	typedef typename Container::pointer pointer;
+	typedef typename Container::const_pointer const_pointer;
 	typedef typename Container::reference reference;
 	typedef typename Container::reference reference;
 	typedef typename Container::const_reference const_reference;
 	typedef typename Container::const_reference const_reference;
 	typedef typename Container::difference_type difference_type;
 	typedef typename Container::difference_type difference_type;
 	typedef typename Container::size_type size_type;
 	typedef typename Container::size_type size_type;
+	typedef typename Container::allocator_type allocator_type;
 
 
 	bool insert(pkgCache::PkgIterator const &P) APT_OVERRIDE { if (P.end() == true) return false; _cont.insert(P); return true; }
 	bool insert(pkgCache::PkgIterator const &P) APT_OVERRIDE { if (P.end() == true) return false; _cont.insert(P); return true; }
 	template<class Cont> void insert(PackageContainer<Cont> const &pkgcont) { _cont.insert((typename Cont::const_iterator)pkgcont.begin(), (typename Cont::const_iterator)pkgcont.end()); }
 	template<class Cont> void insert(PackageContainer<Cont> const &pkgcont) { _cont.insert((typename Cont::const_iterator)pkgcont.begin(), (typename Cont::const_iterator)pkgcont.end()); }
@@ -440,8 +445,15 @@ public:									/*{{{*/
 	PackageContainer() : PackageContainerInterface(CacheSetHelper::UNKNOWN) {}
 	PackageContainer() : PackageContainerInterface(CacheSetHelper::UNKNOWN) {}
 	explicit PackageContainer(CacheSetHelper::PkgSelector const &by) : PackageContainerInterface(by) {}
 	explicit PackageContainer(CacheSetHelper::PkgSelector const &by) : PackageContainerInterface(by) {}
 APT_IGNORE_DEPRECATED_PUSH
 APT_IGNORE_DEPRECATED_PUSH
-	APT_DEPRECATED PackageContainer(Constructor const &by) : PackageContainerInterface((CacheSetHelper::PkgSelector)by) {}
+	APT_DEPRECATED explicit PackageContainer(Constructor const &by) : PackageContainerInterface((CacheSetHelper::PkgSelector)by) {}
 APT_IGNORE_DEPRECATED_POP
 APT_IGNORE_DEPRECATED_POP
+	template<typename Itr> PackageContainer(Itr first, Itr last) : PackageContainerInterface(CacheSetHelper::UNKNOWN), _cont(first, last) {}
+#if __cplusplus >= 201103L
+	PackageContainer(std::initializer_list<value_type> list) : PackageContainerInterface(CacheSetHelper::UNKNOWN), _cont(list) {}
+	void push_back(value_type&& P) { _cont.emplace_back(std::move(P)); }
+	template<typename... Args> void emplace_back(Args&&... args) { _cont.emplace_back(std::forward<Args>(args)...); }
+#endif
+	void push_back(const value_type& P) { _cont.push_back(P); }
 
 
 	/** \brief sort all included versions with given comparer
 	/** \brief sort all included versions with given comparer
 
 
@@ -703,6 +715,8 @@ public:
 	};
 	};
 	typedef const_iterator iterator;
 	typedef const_iterator iterator;
 	typedef pkgCache::PkgIterator value_type;
 	typedef pkgCache::PkgIterator value_type;
+	typedef typename pkgCache::PkgIterator* pointer;
+	typedef typename pkgCache::PkgIterator const* const_pointer;
 	typedef const pkgCache::PkgIterator& const_reference;
 	typedef const pkgCache::PkgIterator& const_reference;
 	typedef const_reference reference;
 	typedef const_reference reference;
 	typedef const_iterator::difference_type difference_type;
 	typedef const_iterator::difference_type difference_type;
@@ -905,10 +919,13 @@ public:									/*{{{*/
 	typedef Container_const_reverse_iterator<VersionContainerInterface, Container, VersionContainer> const_reverse_iterator;
 	typedef Container_const_reverse_iterator<VersionContainerInterface, Container, VersionContainer> const_reverse_iterator;
 	typedef Container_reverse_iterator<VersionContainerInterface, Container, VersionContainer> reverse_iterator;
 	typedef Container_reverse_iterator<VersionContainerInterface, Container, VersionContainer> reverse_iterator;
 	typedef typename Container::value_type value_type;
 	typedef typename Container::value_type value_type;
+	typedef typename Container::pointer pointer;
+	typedef typename Container::const_pointer const_pointer;
 	typedef typename Container::reference reference;
 	typedef typename Container::reference reference;
 	typedef typename Container::const_reference const_reference;
 	typedef typename Container::const_reference const_reference;
 	typedef typename Container::difference_type difference_type;
 	typedef typename Container::difference_type difference_type;
 	typedef typename Container::size_type size_type;
 	typedef typename Container::size_type size_type;
+	typedef typename Container::allocator_type allocator_type;
 
 
 	bool insert(pkgCache::VerIterator const &V) APT_OVERRIDE { if (V.end() == true) return false; _cont.insert(V); return true; }
 	bool insert(pkgCache::VerIterator const &V) APT_OVERRIDE { if (V.end() == true) return false; _cont.insert(V); return true; }
 	template<class Cont> void insert(VersionContainer<Cont> const &vercont) { _cont.insert((typename Cont::const_iterator)vercont.begin(), (typename Cont::const_iterator)vercont.end()); }
 	template<class Cont> void insert(VersionContainer<Cont> const &vercont) { _cont.insert((typename Cont::const_iterator)vercont.begin(), (typename Cont::const_iterator)vercont.end()); }
@@ -939,6 +956,15 @@ public:									/*{{{*/
 	reverse_iterator rend() { return reverse_iterator(_cont.rend()); }
 	reverse_iterator rend() { return reverse_iterator(_cont.rend()); }
 	const_iterator find(pkgCache::VerIterator const &V) const { return const_iterator(_cont.find(V)); }
 	const_iterator find(pkgCache::VerIterator const &V) const { return const_iterator(_cont.find(V)); }
 
 
+	VersionContainer() : VersionContainerInterface() {}
+	template<typename Itr> VersionContainer(Itr first, Itr last) : VersionContainerInterface(), _cont(first, last) {}
+#if __cplusplus >= 201103L
+	VersionContainer(std::initializer_list<value_type> list) : VersionContainerInterface(), _cont(list) {}
+	void push_back(value_type&& P) { _cont.emplace_back(std::move(P)); }
+	template<typename... Args> void emplace_back(Args&&... args) { _cont.emplace_back(std::forward<Args>(args)...); }
+#endif
+	void push_back(const value_type& P) { _cont.push_back(P); }
+
 	/** \brief sort all included versions with given comparer
 	/** \brief sort all included versions with given comparer
 
 
 	    Some containers are sorted by default, some are not and can't be,
 	    Some containers are sorted by default, some are not and can't be,

+ 7 - 11
cmdline/apt-mark.cc

@@ -180,13 +180,13 @@ static bool DoHold(CommandLine &CmdL)
 
 
    bool const MarkHold = strcasecmp(CmdL.FileList[0],"hold") == 0;
    bool const MarkHold = strcasecmp(CmdL.FileList[0],"hold") == 0;
 
 
-   auto part = std::stable_partition(pkgset.begin(), pkgset.end(),
+   auto const part = std::stable_partition(pkgset.begin(), pkgset.end(),
         [](pkgCache::PkgIterator const &P) { return P->SelectedState == pkgCache::State::Hold; });
         [](pkgCache::PkgIterator const &P) { return P->SelectedState == pkgCache::State::Hold; });
 
 
-   auto doneBegin = MarkHold ? pkgset.begin() : part;
-   auto doneEnd = MarkHold ? part : pkgset.end();
-   auto changeBegin = MarkHold ? part : pkgset.begin();
-   auto changeEnd = MarkHold ? pkgset.end() : part;
+   auto const doneBegin = MarkHold ? pkgset.begin() : part;
+   auto const doneEnd = MarkHold ? part : pkgset.end();
+   auto const changeBegin = MarkHold ? part : pkgset.begin();
+   auto const changeEnd = MarkHold ? pkgset.end() : part;
 
 
    std::for_each(doneBegin, doneEnd, [&MarkHold](pkgCache::PkgIterator const &P) {
    std::for_each(doneBegin, doneEnd, [&MarkHold](pkgCache::PkgIterator const &P) {
       if (MarkHold == true)
       if (MarkHold == true)
@@ -238,12 +238,8 @@ static bool DoHold(CommandLine &CmdL)
    }
    }
 
 
    APT::PackageList keepoffset;
    APT::PackageList keepoffset;
-   for (APT::PackageList::iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
-   {
-      if (Pkg->CurrentVer != 0)
-	 continue;
-      keepoffset.insert(*Pkg);
-   }
+   std::copy_if(changeBegin, changeEnd, std::back_inserter(keepoffset),
+	 [](pkgCache::PkgIterator const &P) { return P->CurrentVer == 0; });
 
 
    if (keepoffset.empty() == false)
    if (keepoffset.empty() == false)
    {
    {