1 // -*- mode: cpp; mode: fold -*-
4 Wrappers around std::set to have set::iterators which behave
5 similar to the Iterators of the cache structures.
7 Provides also a few helper methods which work with these sets */
10 #define APT_CACHESET_H
11 // Include Files /*{{{*/
21 #include <apt-pkg/error.h>
22 #include <apt-pkg/pkgcache.h>
28 class PackageContainerInterface
;
29 class VersionContainerInterface
;
31 class CacheSetHelper
{ /*{{{*/
32 /** \class APT::CacheSetHelper
33 Simple base class with a lot of virtual methods which can be overridden
34 to alter the behavior or the output of the CacheSets.
36 This helper is passed around by the static methods in the CacheSets and
37 used every time they hit an error condition or something could be
41 CacheSetHelper(bool const ShowError
= true,
42 GlobalError::MsgType ErrorType
= GlobalError::ERROR
) :
43 ShowError(ShowError
), ErrorType(ErrorType
) {};
44 virtual ~CacheSetHelper() {};
46 virtual void showTaskSelection(pkgCache::PkgIterator
const &pkg
, std::string
const &pattern
);
47 virtual void showRegExSelection(pkgCache::PkgIterator
const &pkg
, std::string
const &pattern
);
48 virtual void showSelectedVersion(pkgCache::PkgIterator
const &Pkg
, pkgCache::VerIterator
const Ver
,
49 std::string
const &ver
, bool const verIsRel
);
51 virtual void canNotFindTask(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string pattern
);
52 virtual void canNotFindRegEx(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string pattern
);
53 virtual void canNotFindPackage(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string
const &str
);
55 virtual void canNotFindAllVer(VersionContainerInterface
* const vci
, pkgCacheFile
&Cache
, pkgCache::PkgIterator
const &Pkg
);
56 virtual void canNotFindInstCandVer(VersionContainerInterface
* const vci
, pkgCacheFile
&Cache
,
57 pkgCache::PkgIterator
const &Pkg
);
58 virtual void canNotFindCandInstVer(VersionContainerInterface
* const vci
,
60 pkgCache::PkgIterator
const &Pkg
);
62 virtual pkgCache::PkgIterator
canNotFindPkgName(pkgCacheFile
&Cache
, std::string
const &str
);
63 virtual pkgCache::VerIterator
canNotFindNewestVer(pkgCacheFile
&Cache
,
64 pkgCache::PkgIterator
const &Pkg
);
65 virtual pkgCache::VerIterator
canNotFindCandidateVer(pkgCacheFile
&Cache
,
66 pkgCache::PkgIterator
const &Pkg
);
67 virtual pkgCache::VerIterator
canNotFindInstalledVer(pkgCacheFile
&Cache
,
68 pkgCache::PkgIterator
const &Pkg
);
70 bool showErrors() const { return ShowError
; };
71 bool showErrors(bool const newValue
) { if (ShowError
== newValue
) return ShowError
; else return ((ShowError
= newValue
) == false); };
72 GlobalError::MsgType
errorType() const { return ErrorType
; };
73 GlobalError::MsgType
errorType(GlobalError::MsgType
const &newValue
)
75 if (ErrorType
== newValue
) return ErrorType
;
77 GlobalError::MsgType
const &oldValue
= ErrorType
;
86 GlobalError::MsgType ErrorType
;
88 class PackageContainerInterface
{ /*{{{*/
89 /** \class PackageContainerInterface
91 * Interface ensuring that all operations can be executed on the yet to
92 * define concrete PackageContainer - access to all methods is possible,
93 * but in general the wrappers provided by the PackageContainer template
96 * This class mostly protects use from the need to write all implementation
97 * of the methods working on containers in the template */
99 class const_iterator
{ /*{{{*/
101 virtual pkgCache::PkgIterator
getPkg() const = 0;
102 operator pkgCache::PkgIterator(void) const { return getPkg(); }
104 inline const char *Name() const {return getPkg().Name(); }
105 inline std::string
FullName(bool const Pretty
) const { return getPkg().FullName(Pretty
); }
106 inline std::string
FullName() const { return getPkg().FullName(); }
107 inline const char *Section() const {return getPkg().Section(); }
108 inline bool Purge() const {return getPkg().Purge(); }
109 inline const char *Arch() const {return getPkg().Arch(); }
110 inline pkgCache::GrpIterator
Group() const { return getPkg().Group(); }
111 inline pkgCache::VerIterator
VersionList() const { return getPkg().VersionList(); }
112 inline pkgCache::VerIterator
CurrentVer() const { return getPkg().CurrentVer(); }
113 inline pkgCache::DepIterator
RevDependsList() const { return getPkg().RevDependsList(); }
114 inline pkgCache::PrvIterator
ProvidesList() const { return getPkg().ProvidesList(); }
115 inline pkgCache::PkgIterator::OkState
State() const { return getPkg().State(); }
116 inline const char *CandVersion() const { return getPkg().CandVersion(); }
117 inline const char *CurVersion() const { return getPkg().CurVersion(); }
118 inline pkgCache
*Cache() const { return getPkg().Cache(); };
119 inline unsigned long Index() const {return getPkg().Index();};
120 // we have only valid iterators here
121 inline bool end() const { return false; };
123 inline pkgCache::Package
const * operator->() const {return &*getPkg();};
127 virtual bool insert(pkgCache::PkgIterator
const &P
) = 0;
128 virtual bool empty() const = 0;
129 virtual void clear() = 0;
131 enum Constructor
{ UNKNOWN
, REGEX
, TASK
};
132 virtual void setConstructor(Constructor
const &con
) = 0;
133 virtual Constructor
getConstructor() const = 0;
135 static bool FromTask(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string pattern
, CacheSetHelper
&helper
);
136 static bool FromRegEx(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string pattern
, CacheSetHelper
&helper
);
137 static pkgCache::PkgIterator
FromName(pkgCacheFile
&Cache
, std::string
const &pattern
, CacheSetHelper
&helper
);
138 static bool FromString(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, std::string
const &pattern
, CacheSetHelper
&helper
);
139 static bool FromCommandLine(PackageContainerInterface
* const pci
, pkgCacheFile
&Cache
, const char **cmdline
, CacheSetHelper
&helper
);
142 enum Position
{ NONE
, PREFIX
, POSTFIX
};
144 const char * const Alias
;
146 Modifier (unsigned short const &id
, const char * const alias
, Position
const &pos
) : ID(id
), Alias(alias
), Pos(pos
) {};
149 static bool FromModifierCommandLine(unsigned short &modID
, PackageContainerInterface
* const pci
,
150 pkgCacheFile
&Cache
, const char * cmdline
,
151 std::list
<Modifier
> const &mods
, CacheSetHelper
&helper
);
154 template<class Container
> class PackageContainer
: public PackageContainerInterface
{/*{{{*/
155 /** \class APT::PackageContainer
157 Simple wrapper around a container class like std::set to provide a similar
158 interface to a set of packages as to the complete set of all packages in the
162 /** \brief smell like a pkgCache::PkgIterator */
163 class const_iterator
: public PackageContainerInterface::const_iterator
,/*{{{*/
164 public std::iterator
<std::forward_iterator_tag
, typename
Container::const_iterator
> {
165 typename
Container::const_iterator _iter
;
167 const_iterator(typename
Container::const_iterator i
) : _iter(i
) {}
168 pkgCache::PkgIterator
getPkg(void) const { return *_iter
; }
169 inline pkgCache::PkgIterator
operator*(void) const { return *_iter
; };
170 operator typename
Container::const_iterator(void) const { return _iter
; }
171 inline const_iterator
& operator++() { ++_iter
; return *this; }
172 inline const_iterator
operator++(int) { const_iterator
tmp(*this); operator++(); return tmp
; }
173 inline bool operator!=(const_iterator
const &i
) const { return _iter
!= i
._iter
; };
174 inline bool operator==(const_iterator
const &i
) const { return _iter
== i
._iter
; };
175 friend std::ostream
& operator<<(std::ostream
& out
, const_iterator i
) { return operator<<(out
, *i
); }
177 class iterator
: public PackageContainerInterface::const_iterator
,
178 public std::iterator
<std::forward_iterator_tag
, typename
Container::iterator
> {
179 typename
Container::iterator _iter
;
181 iterator(typename
Container::iterator i
) : _iter(i
) {}
182 pkgCache::PkgIterator
getPkg(void) const { return *_iter
; }
183 inline pkgCache::PkgIterator
operator*(void) const { return *_iter
; };
184 operator typename
Container::iterator(void) const { return _iter
; }
185 operator typename PackageContainer
<Container
>::const_iterator() { return PackageContainer
<Container
>::const_iterator(_iter
); }
186 inline iterator
& operator++() { ++_iter
; return *this; }
187 inline iterator
operator++(int) { iterator
tmp(*this); operator++(); return tmp
; }
188 inline bool operator!=(iterator
const &i
) const { return _iter
!= i
._iter
; };
189 inline bool operator==(iterator
const &i
) const { return _iter
== i
._iter
; };
190 friend std::ostream
& operator<<(std::ostream
& out
, iterator i
) { return operator<<(out
, *i
); }
194 bool insert(pkgCache::PkgIterator
const &P
) { if (P
.end() == true) return false; _cont
.insert(P
); return true; };
195 template<class Cont
> void insert(PackageContainer
<Cont
> const &pkgcont
) { _cont
.insert((typename
Cont::const_iterator
)pkgcont
.begin(), (typename
Cont::const_iterator
)pkgcont
.end()); };
196 void insert(const_iterator begin
, const_iterator end
) { _cont
.insert(begin
, end
); };
198 bool empty() const { return _cont
.empty(); };
199 void clear() { return _cont
.clear(); };
200 void erase(iterator position
) { _cont
.erase((typename
Container::iterator
)position
); };
201 size_t erase(const pkgCache::PkgIterator x
) { return _cont
.erase(x
); };
202 void erase(iterator first
, iterator last
) { _cont
.erase(first
, last
); };
203 size_t size() const { return _cont
.size(); };
205 const_iterator
begin() const { return const_iterator(_cont
.begin()); };
206 const_iterator
end() const { return const_iterator(_cont
.end()); };
207 iterator
begin() { return iterator(_cont
.begin()); };
208 iterator
end() { return iterator(_cont
.end()); };
209 const_iterator
find(pkgCache::PkgIterator
const &P
) const { return const_iterator(_cont
.find(P
)); };
211 void setConstructor(Constructor
const &by
) { ConstructedBy
= by
; };
212 Constructor
getConstructor() const { return ConstructedBy
; };
214 PackageContainer() : ConstructedBy(UNKNOWN
) {};
215 PackageContainer(Constructor
const &by
) : ConstructedBy(by
) {};
217 /** \brief returns all packages in the cache who belong to the given task
219 A simple helper responsible for search for all members of a task
220 in the cache. Optional it prints a a notice about the
221 packages chosen cause of the given task.
222 \param Cache the packages are in
223 \param pattern name of the task
224 \param helper responsible for error and message handling */
225 static PackageContainer
FromTask(pkgCacheFile
&Cache
, std::string
const &pattern
, CacheSetHelper
&helper
) {
226 PackageContainer
cont(TASK
);
227 PackageContainerInterface::FromTask(&cont
, Cache
, pattern
, helper
);
230 static PackageContainer
FromTask(pkgCacheFile
&Cache
, std::string
const &pattern
) {
231 CacheSetHelper helper
;
232 return FromTask(Cache
, pattern
, helper
);
235 /** \brief returns all packages in the cache whose name matchs a given pattern
237 A simple helper responsible for executing a regular expression on all
238 package names in the cache. Optional it prints a a notice about the
239 packages chosen cause of the given package.
240 \param Cache the packages are in
241 \param pattern regular expression for package names
242 \param helper responsible for error and message handling */
243 static PackageContainer
FromRegEx(pkgCacheFile
&Cache
, std::string pattern
, CacheSetHelper
&helper
) {
244 PackageContainer
cont(REGEX
);
245 PackageContainerInterface::FromRegEx(&cont
, Cache
, pattern
, helper
);
249 static PackageContainer
FromRegEx(pkgCacheFile
&Cache
, std::string
const &pattern
) {
250 CacheSetHelper helper
;
251 return FromRegEx(Cache
, pattern
, helper
);
254 /** \brief returns a package specified by a string
256 \param Cache the package is in
257 \param pattern String the package name should be extracted from
258 \param helper responsible for error and message handling */
259 static pkgCache::PkgIterator
FromName(pkgCacheFile
&Cache
, std::string
const &pattern
, CacheSetHelper
&helper
) {
260 return PackageContainerInterface::FromName(Cache
, pattern
, helper
);
262 static pkgCache::PkgIterator
FromName(pkgCacheFile
&Cache
, std::string
const &pattern
) {
263 CacheSetHelper helper
;
264 return PackageContainerInterface::FromName(Cache
, pattern
, helper
);
267 /** \brief returns all packages specified by a string
269 \param Cache the packages are in
270 \param pattern String the package name(s) should be extracted from
271 \param helper responsible for error and message handling */
272 static PackageContainer
FromString(pkgCacheFile
&Cache
, std::string
const &pattern
, CacheSetHelper
&helper
) {
273 PackageContainer cont
;
274 PackageContainerInterface::FromString(&cont
, Cache
, pattern
, helper
);
277 static PackageContainer
FromString(pkgCacheFile
&Cache
, std::string
const &pattern
) {
278 CacheSetHelper helper
;
279 return FromString(Cache
, pattern
, helper
);
282 /** \brief returns all packages specified on the commandline
284 Get all package names from the commandline and executes regex's if needed.
285 No special package command is supported, just plain names.
286 \param Cache the packages are in
287 \param cmdline Command line the package names should be extracted from
288 \param helper responsible for error and message handling */
289 static PackageContainer
FromCommandLine(pkgCacheFile
&Cache
, const char **cmdline
, CacheSetHelper
&helper
) {
290 PackageContainer cont
;
291 PackageContainerInterface::FromCommandLine(&cont
, Cache
, cmdline
, helper
);
294 static PackageContainer
FromCommandLine(pkgCacheFile
&Cache
, const char **cmdline
) {
295 CacheSetHelper helper
;
296 return FromCommandLine(Cache
, cmdline
, helper
);
299 /** \brief group packages by a action modifiers
301 At some point it is needed to get from the same commandline
302 different package sets grouped by a modifier. Take
303 apt-get install apt awesome-
305 \param Cache the packages are in
306 \param cmdline Command line the package names should be extracted from
307 \param mods list of modifiers the method should accept
308 \param fallback the default modifier group for a package
309 \param helper responsible for error and message handling */
310 static std::map
<unsigned short, PackageContainer
> GroupedFromCommandLine(
312 const char **cmdline
,
313 std::list
<Modifier
> const &mods
,
314 unsigned short const &fallback
,
315 CacheSetHelper
&helper
) {
316 std::map
<unsigned short, PackageContainer
> pkgsets
;
317 for (const char **I
= cmdline
; *I
!= 0; ++I
) {
318 unsigned short modID
= fallback
;
319 PackageContainer pkgset
;
320 PackageContainerInterface::FromModifierCommandLine(modID
, &pkgset
, Cache
, *I
, mods
, helper
);
321 pkgsets
[modID
].insert(pkgset
);
325 static std::map
<unsigned short, PackageContainer
> GroupedFromCommandLine(
327 const char **cmdline
,
328 std::list
<Modifier
> const &mods
,
329 unsigned short const &fallback
) {
330 CacheSetHelper helper
;
331 return GroupedFromCommandLine(Cache
, cmdline
,
332 mods
, fallback
, helper
);
336 Constructor ConstructedBy
;
340 template<> template<class Cont
> void PackageContainer
<std::list
<pkgCache::PkgIterator
> >::insert(PackageContainer
<Cont
> const &pkgcont
) {
341 for (typename PackageContainer
<Cont
>::const_iterator p
= pkgcont
.begin(); p
!= pkgcont
.end(); ++p
)
344 // these two are 'inline' as otherwise the linker has problems with seeing these untemplated
345 // specializations again and again - but we need to see them, so that library users can use them
346 template<> inline bool PackageContainer
<std::list
<pkgCache::PkgIterator
> >::insert(pkgCache::PkgIterator
const &P
) {
352 template<> inline void PackageContainer
<std::list
<pkgCache::PkgIterator
> >::insert(const_iterator begin
, const_iterator end
) {
353 for (const_iterator p
= begin
; p
!= end
; ++p
)
356 typedef PackageContainer
<std::set
<pkgCache::PkgIterator
> > PackageSet
;
357 typedef PackageContainer
<std::list
<pkgCache::PkgIterator
> > PackageList
;
359 class VersionContainerInterface
{ /*{{{*/
360 /** \class APT::VersionContainerInterface
362 Same as APT::PackageContainerInterface, just for Versions */
364 /** \brief smell like a pkgCache::VerIterator */
365 class const_iterator
{ /*{{{*/
367 virtual pkgCache::VerIterator
getVer() const = 0;
368 operator pkgCache::VerIterator(void) { return getVer(); }
370 inline pkgCache
*Cache() const { return getVer().Cache(); };
371 inline unsigned long Index() const {return getVer().Index();};
372 inline int CompareVer(const pkgCache::VerIterator
&B
) const { return getVer().CompareVer(B
); };
373 inline const char *VerStr() const { return getVer().VerStr(); };
374 inline const char *Section() const { return getVer().Section(); };
375 inline const char *Arch() const { return getVer().Arch(); };
376 inline pkgCache::PkgIterator
ParentPkg() const { return getVer().ParentPkg(); };
377 inline pkgCache::DescIterator
DescriptionList() const { return getVer().DescriptionList(); };
378 inline pkgCache::DescIterator
TranslatedDescription() const { return getVer().TranslatedDescription(); };
379 inline pkgCache::DepIterator
DependsList() const { return getVer().DependsList(); };
380 inline pkgCache::PrvIterator
ProvidesList() const { return getVer().ProvidesList(); };
381 inline pkgCache::VerFileIterator
FileList() const { return getVer().FileList(); };
382 inline bool Downloadable() const { return getVer().Downloadable(); };
383 inline const char *PriorityType() const { return getVer().PriorityType(); };
384 inline std::string
RelStr() const { return getVer().RelStr(); };
385 inline bool Automatic() const { return getVer().Automatic(); };
386 inline pkgCache::VerFileIterator
NewestFile() const { return getVer().NewestFile(); };
387 // we have only valid iterators here
388 inline bool end() const { return false; };
390 inline pkgCache::Version
const * operator->() const { return &*getVer(); };
394 virtual bool insert(pkgCache::VerIterator
const &V
) = 0;
395 virtual bool empty() const = 0;
396 virtual void clear() = 0;
398 /** \brief specifies which version(s) will be returned if non is given */
402 /** Candidate and installed version */
404 /** Candidate version */
406 /** Installed version */
408 /** Candidate or if non installed version */
410 /** Installed or if non candidate version */
412 /** Newest version */
417 enum Position
{ NONE
, PREFIX
, POSTFIX
};
419 const char * const Alias
;
421 Version SelectVersion
;
422 Modifier (unsigned short const &id
, const char * const alias
, Position
const &pos
,
423 Version
const &select
) : ID(id
), Alias(alias
), Pos(pos
),
424 SelectVersion(select
) {};
427 static bool FromCommandLine(VersionContainerInterface
* const vci
, pkgCacheFile
&Cache
,
428 const char **cmdline
, Version
const &fallback
,
429 CacheSetHelper
&helper
);
431 static bool FromString(VersionContainerInterface
* const vci
, pkgCacheFile
&Cache
,
432 std::string pkg
, Version
const &fallback
, CacheSetHelper
&helper
,
433 bool const onlyFromName
= false);
435 static bool FromPackage(VersionContainerInterface
* const vci
, pkgCacheFile
&Cache
,
436 pkgCache::PkgIterator
const &P
, Version
const &fallback
,
437 CacheSetHelper
&helper
);
439 static bool FromModifierCommandLine(unsigned short &modID
,
440 VersionContainerInterface
* const vci
,
441 pkgCacheFile
&Cache
, const char * cmdline
,
442 std::list
<Modifier
> const &mods
,
443 CacheSetHelper
&helper
);
446 static bool FromDependency(VersionContainerInterface
* const vci
,
448 pkgCache::DepIterator
const &D
,
449 Version
const &selector
,
450 CacheSetHelper
&helper
);
454 /** \brief returns the candidate version of the package
456 \param Cache to be used to query for information
457 \param Pkg we want the candidate version from this package */
458 static pkgCache::VerIterator
getCandidateVer(pkgCacheFile
&Cache
,
459 pkgCache::PkgIterator
const &Pkg
, CacheSetHelper
&helper
);
461 /** \brief returns the installed version of the package
463 \param Cache to be used to query for information
464 \param Pkg we want the installed version from this package */
465 static pkgCache::VerIterator
getInstalledVer(pkgCacheFile
&Cache
,
466 pkgCache::PkgIterator
const &Pkg
, CacheSetHelper
&helper
);
470 template<class Container
> class VersionContainer
: public VersionContainerInterface
{/*{{{*/
471 /** \class APT::VersionContainer
473 Simple wrapper around a container class like std::set to provide a similar
474 interface to a set of versions as to the complete set of all versions in the
478 /** \brief smell like a pkgCache::VerIterator */
479 class const_iterator
: public VersionContainerInterface::const_iterator
,
480 public std::iterator
<std::forward_iterator_tag
, typename
Container::const_iterator
> {/*{{{*/
481 typename
Container::const_iterator _iter
;
483 const_iterator(typename
Container::const_iterator i
) : _iter(i
) {}
484 pkgCache::VerIterator
getVer(void) const { return *_iter
; }
485 inline pkgCache::VerIterator
operator*(void) const { return *_iter
; };
486 operator typename
Container::const_iterator(void) const { return _iter
; }
487 inline const_iterator
& operator++() { ++_iter
; return *this; }
488 inline const_iterator
operator++(int) { const_iterator
tmp(*this); operator++(); return tmp
; }
489 inline bool operator!=(const_iterator
const &i
) const { return _iter
!= i
._iter
; };
490 inline bool operator==(const_iterator
const &i
) const { return _iter
== i
._iter
; };
491 friend std::ostream
& operator<<(std::ostream
& out
, const_iterator i
) { return operator<<(out
, *i
); }
493 class iterator
: public VersionContainerInterface::const_iterator
,
494 public std::iterator
<std::forward_iterator_tag
, typename
Container::iterator
> {
495 typename
Container::iterator _iter
;
497 iterator(typename
Container::iterator i
) : _iter(i
) {}
498 pkgCache::VerIterator
getVer(void) const { return *_iter
; }
499 inline pkgCache::VerIterator
operator*(void) const { return *_iter
; };
500 operator typename
Container::iterator(void) const { return _iter
; }
501 operator typename VersionContainer
<Container
>::const_iterator() { return VersionContainer
<Container
>::const_iterator(_iter
); }
502 inline iterator
& operator++() { ++_iter
; return *this; }
503 inline iterator
operator++(int) { iterator
tmp(*this); operator++(); return tmp
; }
504 inline bool operator!=(iterator
const &i
) const { return _iter
!= i
._iter
; };
505 inline bool operator==(iterator
const &i
) const { return _iter
== i
._iter
; };
506 friend std::ostream
& operator<<(std::ostream
& out
, iterator i
) { return operator<<(out
, *i
); }
510 bool insert(pkgCache::VerIterator
const &V
) { if (V
.end() == true) return false; _cont
.insert(V
); return true; };
511 template<class Cont
> void insert(VersionContainer
<Cont
> const &vercont
) { _cont
.insert((typename
Cont::const_iterator
)vercont
.begin(), (typename
Cont::const_iterator
)vercont
.end()); };
512 void insert(const_iterator begin
, const_iterator end
) { _cont
.insert(begin
, end
); };
513 bool empty() const { return _cont
.empty(); };
514 void clear() { return _cont
.clear(); };
515 void erase(iterator position
) { _cont
.erase((typename
Container::iterator
)position
); };
516 size_t erase(const pkgCache::VerIterator x
) { return _cont
.erase(x
); };
517 void erase(iterator first
, iterator last
) { _cont
.erase(first
, last
); };
518 size_t size() const { return _cont
.size(); };
520 const_iterator
begin() const { return const_iterator(_cont
.begin()); };
521 const_iterator
end() const { return const_iterator(_cont
.end()); };
522 iterator
begin() { return iterator(_cont
.begin()); };
523 iterator
end() { return iterator(_cont
.end()); };
524 const_iterator
find(pkgCache::VerIterator
const &V
) const { return const_iterator(_cont
.find(V
)); };
526 /** \brief returns all versions specified on the commandline
528 Get all versions from the commandline, uses given default version if
529 non specifically requested and executes regex's if needed on names.
530 \param Cache the packages and versions are in
531 \param cmdline Command line the versions should be extracted from
532 \param helper responsible for error and message handling */
533 static VersionContainer
FromCommandLine(pkgCacheFile
&Cache
, const char **cmdline
,
534 Version
const &fallback
, CacheSetHelper
&helper
) {
535 VersionContainer vercon
;
536 VersionContainerInterface::FromCommandLine(&vercon
, Cache
, cmdline
, fallback
, helper
);
539 static VersionContainer
FromCommandLine(pkgCacheFile
&Cache
, const char **cmdline
,
540 Version
const &fallback
) {
541 CacheSetHelper helper
;
542 return FromCommandLine(Cache
, cmdline
, fallback
, helper
);
544 static VersionContainer
FromCommandLine(pkgCacheFile
&Cache
, const char **cmdline
) {
545 return FromCommandLine(Cache
, cmdline
, CANDINST
);
548 static VersionContainer
FromString(pkgCacheFile
&Cache
, std::string
const &pkg
,
549 Version
const &fallback
, CacheSetHelper
&helper
,
550 bool const onlyFromName
= false) {
551 VersionContainer vercon
;
552 VersionContainerInterface::FromString(&vercon
, Cache
, pkg
, fallback
, helper
);
555 static VersionContainer
FromString(pkgCacheFile
&Cache
, std::string pkg
,
556 Version
const &fallback
) {
557 CacheSetHelper helper
;
558 return FromString(Cache
, pkg
, fallback
, helper
);
560 static VersionContainer
FromString(pkgCacheFile
&Cache
, std::string pkg
) {
561 return FromString(Cache
, pkg
, CANDINST
);
564 /** \brief returns all versions specified for the package
566 \param Cache the package and versions are in
567 \param P the package in question
568 \param fallback the version(s) you want to get
569 \param helper the helper used for display and error handling */
570 static VersionContainer
FromPackage(pkgCacheFile
&Cache
, pkgCache::PkgIterator
const &P
,
571 Version
const &fallback
, CacheSetHelper
&helper
) {
572 VersionContainer vercon
;
573 VersionContainerInterface::FromPackage(&vercon
, Cache
, P
, fallback
, helper
);
576 static VersionContainer
FromPackage(pkgCacheFile
&Cache
, pkgCache::PkgIterator
const &P
,
577 Version
const &fallback
) {
578 CacheSetHelper helper
;
579 return FromPackage(Cache
, P
, fallback
, helper
);
581 static VersionContainer
FromPackage(pkgCacheFile
&Cache
, pkgCache::PkgIterator
const &P
) {
582 return FromPackage(Cache
, P
, CANDIDATE
);
585 static std::map
<unsigned short, VersionContainer
> GroupedFromCommandLine(
587 const char **cmdline
,
588 std::list
<Modifier
> const &mods
,
589 unsigned short const fallback
,
590 CacheSetHelper
&helper
) {
591 std::map
<unsigned short, VersionContainer
> versets
;
592 for (const char **I
= cmdline
; *I
!= 0; ++I
) {
593 unsigned short modID
= fallback
;
594 VersionContainer verset
;
595 VersionContainerInterface::FromModifierCommandLine(modID
, &verset
, Cache
, *I
, mods
, helper
);
596 versets
[modID
].insert(verset
);
601 static std::map
<unsigned short, VersionContainer
> GroupedFromCommandLine(
602 pkgCacheFile
&Cache
, const char **cmdline
,
603 std::list
<Modifier
> const &mods
,
604 unsigned short const fallback
) {
605 CacheSetHelper helper
;
606 return GroupedFromCommandLine(Cache
, cmdline
,
607 mods
, fallback
, helper
);
610 static VersionContainer
FromDependency(pkgCacheFile
&Cache
, pkgCache::DepIterator
const &D
,
611 Version
const &selector
, CacheSetHelper
&helper
) {
612 VersionContainer vercon
;
613 VersionContainerInterface::FromDependency(&vercon
, Cache
, D
, selector
, helper
);
616 static VersionContainer
FromDependency(pkgCacheFile
&Cache
, pkgCache::DepIterator
const &D
,
617 Version
const &selector
) {
618 CacheSetHelper helper
;
619 return FromPackage(Cache
, D
, selector
, helper
);
621 static VersionContainer
FromDependency(pkgCacheFile
&Cache
, pkgCache::DepIterator
const &D
) {
622 return FromPackage(Cache
, D
, CANDIDATE
);
627 template<> template<class Cont
> void VersionContainer
<std::list
<pkgCache::VerIterator
> >::insert(VersionContainer
<Cont
> const &vercont
) {
628 for (typename VersionContainer
<Cont
>::const_iterator v
= vercont
.begin(); v
!= vercont
.end(); ++v
)
631 // these two are 'inline' as otherwise the linker has problems with seeing these untemplated
632 // specializations again and again - but we need to see them, so that library users can use them
633 template<> inline bool VersionContainer
<std::list
<pkgCache::VerIterator
> >::insert(pkgCache::VerIterator
const &V
) {
639 template<> inline void VersionContainer
<std::list
<pkgCache::VerIterator
> >::insert(const_iterator begin
, const_iterator end
) {
640 for (const_iterator v
= begin
; v
!= end
; ++v
)
643 typedef VersionContainer
<std::set
<pkgCache::VerIterator
> > VersionSet
;
644 typedef VersionContainer
<std::list
<pkgCache::VerIterator
> > VersionList
;