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 void operator++(void) { ++_iter
; };
172 inline bool operator!=(const_iterator
const &i
) const { return _iter
!= i
._iter
; };
173 inline bool operator==(const_iterator
const &i
) const { return _iter
== i
._iter
; };
174 friend std::ostream
& operator<<(std::ostream
& out
, const_iterator i
) { return operator<<(out
, *i
); }
176 class iterator
: public PackageContainerInterface::const_iterator
,
177 public std::iterator
<std::forward_iterator_tag
, typename
Container::iterator
> {
178 typename
Container::iterator _iter
;
180 iterator(typename
Container::iterator i
) : _iter(i
) {}
181 pkgCache::PkgIterator
getPkg(void) const { return *_iter
; }
182 inline pkgCache::PkgIterator
operator*(void) const { return *_iter
; };
183 operator typename
Container::iterator(void) const { return _iter
; }
184 operator typename PackageContainer
<Container
>::const_iterator() { return PackageContainer
<Container
>::const_iterator(_iter
); }
185 inline void operator++(void) { ++_iter
; };
186 inline bool operator!=(iterator
const &i
) const { return _iter
!= i
._iter
; };
187 inline bool operator==(iterator
const &i
) const { return _iter
== i
._iter
; };
188 friend std::ostream
& operator<<(std::ostream
& out
, iterator i
) { return operator<<(out
, *i
); }
192 bool insert(pkgCache::PkgIterator
const &P
) { if (P
.end() == true) return false; _cont
.insert(P
); return true; };
193 template<class Cont
> void insert(PackageContainer
<Cont
> const &pkgcont
) { _cont
.insert((typename
Cont::const_iterator
)pkgcont
.begin(), (typename
Cont::const_iterator
)pkgcont
.end()); };
194 void insert(const_iterator begin
, const_iterator end
) { _cont
.insert(begin
, end
); };
196 bool empty() const { return _cont
.empty(); };
197 void clear() { return _cont
.clear(); };
198 void erase(iterator position
) { _cont
.erase((typename
Container::iterator
)position
); };
199 size_t erase(const pkgCache::PkgIterator x
) { return _cont
.erase(x
); };
200 void erase(iterator first
, iterator last
) { _cont
.erase(first
, last
); };
201 size_t size() const { return _cont
.size(); };
203 const_iterator
begin() const { return const_iterator(_cont
.begin()); };
204 const_iterator
end() const { return const_iterator(_cont
.end()); };
205 iterator
begin() { return iterator(_cont
.begin()); };
206 iterator
end() { return iterator(_cont
.end()); };
207 const_iterator
find(pkgCache::PkgIterator
const &P
) const { return const_iterator(_cont
.find(P
)); };
209 void setConstructor(Constructor
const &by
) { ConstructedBy
= by
; };
210 Constructor
getConstructor() const { return ConstructedBy
; };
212 PackageContainer() : ConstructedBy(UNKNOWN
) {};
213 PackageContainer(Constructor
const &by
) : ConstructedBy(by
) {};
215 /** \brief returns all packages in the cache who belong to the given task
217 A simple helper responsible for search for all members of a task
218 in the cache. Optional it prints a a notice about the
219 packages chosen cause of the given task.
220 \param Cache the packages are in
221 \param pattern name of the task
222 \param helper responsible for error and message handling */
223 static PackageContainer
FromTask(pkgCacheFile
&Cache
, std::string
const &pattern
, CacheSetHelper
&helper
) {
224 PackageContainer
cont(TASK
);
225 PackageContainerInterface::FromTask(&cont
, Cache
, pattern
, helper
);
228 static PackageContainer
FromTask(pkgCacheFile
&Cache
, std::string
const &pattern
) {
229 CacheSetHelper helper
;
230 return FromTask(Cache
, pattern
, helper
);
233 /** \brief returns all packages in the cache whose name matchs a given pattern
235 A simple helper responsible for executing a regular expression on all
236 package names in the cache. Optional it prints a a notice about the
237 packages chosen cause of the given package.
238 \param Cache the packages are in
239 \param pattern regular expression for package names
240 \param helper responsible for error and message handling */
241 static PackageContainer
FromRegEx(pkgCacheFile
&Cache
, std::string pattern
, CacheSetHelper
&helper
) {
242 PackageContainer
cont(REGEX
);
243 PackageContainerInterface::FromRegEx(&cont
, Cache
, pattern
, helper
);
247 static PackageContainer
FromRegEx(pkgCacheFile
&Cache
, std::string
const &pattern
) {
248 CacheSetHelper helper
;
249 return FromRegEx(Cache
, pattern
, helper
);
252 /** \brief returns a package specified by a string
254 \param Cache the package is in
255 \param pattern String the package name should be extracted from
256 \param helper responsible for error and message handling */
257 static pkgCache::PkgIterator
FromName(pkgCacheFile
&Cache
, std::string
const &pattern
, CacheSetHelper
&helper
) {
258 return PackageContainerInterface::FromName(Cache
, pattern
, helper
);
260 static pkgCache::PkgIterator
FromName(pkgCacheFile
&Cache
, std::string
const &pattern
) {
261 CacheSetHelper helper
;
262 return PackageContainerInterface::FromName(Cache
, pattern
, helper
);
265 /** \brief returns all packages specified by a string
267 \param Cache the packages are in
268 \param pattern String the package name(s) should be extracted from
269 \param helper responsible for error and message handling */
270 static PackageContainer
FromString(pkgCacheFile
&Cache
, std::string
const &pattern
, CacheSetHelper
&helper
) {
271 PackageContainer cont
;
272 PackageContainerInterface::FromString(&cont
, Cache
, pattern
, helper
);
275 static PackageContainer
FromString(pkgCacheFile
&Cache
, std::string
const &pattern
) {
276 CacheSetHelper helper
;
277 return FromString(Cache
, pattern
, helper
);
280 /** \brief returns all packages specified on the commandline
282 Get all package names from the commandline and executes regex's if needed.
283 No special package command is supported, just plain names.
284 \param Cache the packages are in
285 \param cmdline Command line the package names should be extracted from
286 \param helper responsible for error and message handling */
287 static PackageContainer
FromCommandLine(pkgCacheFile
&Cache
, const char **cmdline
, CacheSetHelper
&helper
) {
288 PackageContainer cont
;
289 PackageContainerInterface::FromCommandLine(&cont
, Cache
, cmdline
, helper
);
292 static PackageContainer
FromCommandLine(pkgCacheFile
&Cache
, const char **cmdline
) {
293 CacheSetHelper helper
;
294 return FromCommandLine(Cache
, cmdline
, helper
);
297 /** \brief group packages by a action modifiers
299 At some point it is needed to get from the same commandline
300 different package sets grouped by a modifier. Take
301 apt-get install apt awesome-
303 \param Cache the packages are in
304 \param cmdline Command line the package names should be extracted from
305 \param mods list of modifiers the method should accept
306 \param fallback the default modifier group for a package
307 \param helper responsible for error and message handling */
308 static std::map
<unsigned short, PackageContainer
> GroupedFromCommandLine(
310 const char **cmdline
,
311 std::list
<Modifier
> const &mods
,
312 unsigned short const &fallback
,
313 CacheSetHelper
&helper
) {
314 std::map
<unsigned short, PackageContainer
> pkgsets
;
315 for (const char **I
= cmdline
; *I
!= 0; ++I
) {
316 unsigned short modID
= fallback
;
317 PackageContainer pkgset
;
318 PackageContainerInterface::FromModifierCommandLine(modID
, &pkgset
, Cache
, *I
, mods
, helper
);
319 pkgsets
[modID
].insert(pkgset
);
323 static std::map
<unsigned short, PackageContainer
> GroupedFromCommandLine(
325 const char **cmdline
,
326 std::list
<Modifier
> const &mods
,
327 unsigned short const &fallback
) {
328 CacheSetHelper helper
;
329 return GroupedFromCommandLine(Cache
, cmdline
,
330 mods
, fallback
, helper
);
334 Constructor ConstructedBy
;
338 template<> template<class Cont
> void PackageContainer
<std::list
<pkgCache::PkgIterator
> >::insert(PackageContainer
<Cont
> const &pkgcont
) {
339 for (typename PackageContainer
<Cont
>::const_iterator p
= pkgcont
.begin(); p
!= pkgcont
.end(); ++p
)
342 // these two are 'inline' as otherwise the linker has problems with seeing these untemplated
343 // specializations again and again - but we need to see them, so that library users can use them
344 template<> inline bool PackageContainer
<std::list
<pkgCache::PkgIterator
> >::insert(pkgCache::PkgIterator
const &P
) {
350 template<> inline void PackageContainer
<std::list
<pkgCache::PkgIterator
> >::insert(const_iterator begin
, const_iterator end
) {
351 for (const_iterator p
= begin
; p
!= end
; ++p
)
354 typedef PackageContainer
<std::set
<pkgCache::PkgIterator
> > PackageSet
;
355 typedef PackageContainer
<std::list
<pkgCache::PkgIterator
> > PackageList
;
357 class VersionContainerInterface
{ /*{{{*/
358 /** \class APT::VersionContainerInterface
360 Same as APT::PackageContainerInterface, just for Versions */
362 /** \brief smell like a pkgCache::VerIterator */
363 class const_iterator
{ /*{{{*/
365 virtual pkgCache::VerIterator
getVer() const = 0;
366 operator pkgCache::VerIterator(void) { return getVer(); }
368 inline pkgCache
*Cache() const { return getVer().Cache(); };
369 inline unsigned long Index() const {return getVer().Index();};
370 inline int CompareVer(const pkgCache::VerIterator
&B
) const { return getVer().CompareVer(B
); };
371 inline const char *VerStr() const { return getVer().VerStr(); };
372 inline const char *Section() const { return getVer().Section(); };
373 inline const char *Arch() const { return getVer().Arch(); };
374 inline pkgCache::PkgIterator
ParentPkg() const { return getVer().ParentPkg(); };
375 inline pkgCache::DescIterator
DescriptionList() const { return getVer().DescriptionList(); };
376 inline pkgCache::DescIterator
TranslatedDescription() const { return getVer().TranslatedDescription(); };
377 inline pkgCache::DepIterator
DependsList() const { return getVer().DependsList(); };
378 inline pkgCache::PrvIterator
ProvidesList() const { return getVer().ProvidesList(); };
379 inline pkgCache::VerFileIterator
FileList() const { return getVer().FileList(); };
380 inline bool Downloadable() const { return getVer().Downloadable(); };
381 inline const char *PriorityType() const { return getVer().PriorityType(); };
382 inline std::string
RelStr() const { return getVer().RelStr(); };
383 inline bool Automatic() const { return getVer().Automatic(); };
384 inline pkgCache::VerFileIterator
NewestFile() const { return getVer().NewestFile(); };
385 // we have only valid iterators here
386 inline bool end() const { return false; };
388 inline pkgCache::Version
const * operator->() const { return &*getVer(); };
392 virtual bool insert(pkgCache::VerIterator
const &V
) = 0;
393 virtual bool empty() const = 0;
394 virtual void clear() = 0;
396 /** \brief specifies which version(s) will be returned if non is given */
400 /** Candidate and installed version */
402 /** Candidate version */
404 /** Installed version */
406 /** Candidate or if non installed version */
408 /** Installed or if non candidate version */
410 /** Newest version */
415 enum Position
{ NONE
, PREFIX
, POSTFIX
};
417 const char * const Alias
;
419 Version SelectVersion
;
420 Modifier (unsigned short const &id
, const char * const alias
, Position
const &pos
,
421 Version
const &select
) : ID(id
), Alias(alias
), Pos(pos
),
422 SelectVersion(select
) {};
425 static bool FromCommandLine(VersionContainerInterface
* const vci
, pkgCacheFile
&Cache
,
426 const char **cmdline
, Version
const &fallback
,
427 CacheSetHelper
&helper
);
429 static bool FromString(VersionContainerInterface
* const vci
, pkgCacheFile
&Cache
,
430 std::string pkg
, Version
const &fallback
, CacheSetHelper
&helper
,
431 bool const onlyFromName
= false);
433 static bool FromPackage(VersionContainerInterface
* const vci
, pkgCacheFile
&Cache
,
434 pkgCache::PkgIterator
const &P
, Version
const &fallback
,
435 CacheSetHelper
&helper
);
437 static bool FromModifierCommandLine(unsigned short &modID
,
438 VersionContainerInterface
* const vci
,
439 pkgCacheFile
&Cache
, const char * cmdline
,
440 std::list
<Modifier
> const &mods
,
441 CacheSetHelper
&helper
);
444 static bool FromDependency(VersionContainerInterface
* const vci
,
446 pkgCache::DepIterator
const &D
,
447 Version
const &selector
,
448 CacheSetHelper
&helper
);
452 /** \brief returns the candidate version of the package
454 \param Cache to be used to query for information
455 \param Pkg we want the candidate version from this package */
456 static pkgCache::VerIterator
getCandidateVer(pkgCacheFile
&Cache
,
457 pkgCache::PkgIterator
const &Pkg
, CacheSetHelper
&helper
);
459 /** \brief returns the installed version of the package
461 \param Cache to be used to query for information
462 \param Pkg we want the installed version from this package */
463 static pkgCache::VerIterator
getInstalledVer(pkgCacheFile
&Cache
,
464 pkgCache::PkgIterator
const &Pkg
, CacheSetHelper
&helper
);
468 template<class Container
> class VersionContainer
: public VersionContainerInterface
{/*{{{*/
469 /** \class APT::VersionContainer
471 Simple wrapper around a container class like std::set to provide a similar
472 interface to a set of versions as to the complete set of all versions in the
476 /** \brief smell like a pkgCache::VerIterator */
477 class const_iterator
: public VersionContainerInterface::const_iterator
,
478 public std::iterator
<std::forward_iterator_tag
, typename
Container::const_iterator
> {/*{{{*/
479 typename
Container::const_iterator _iter
;
481 const_iterator(typename
Container::const_iterator i
) : _iter(i
) {}
482 pkgCache::VerIterator
getVer(void) const { return *_iter
; }
483 inline pkgCache::VerIterator
operator*(void) const { return *_iter
; };
484 operator typename
Container::const_iterator(void) const { return _iter
; }
485 inline void operator++(void) { ++_iter
; };
486 inline bool operator!=(const_iterator
const &i
) const { return _iter
!= i
._iter
; };
487 inline bool operator==(const_iterator
const &i
) const { return _iter
== i
._iter
; };
488 friend std::ostream
& operator<<(std::ostream
& out
, const_iterator i
) { return operator<<(out
, *i
); }
490 class iterator
: public VersionContainerInterface::const_iterator
,
491 public std::iterator
<std::forward_iterator_tag
, typename
Container::iterator
> {
492 typename
Container::iterator _iter
;
494 iterator(typename
Container::iterator i
) : _iter(i
) {}
495 pkgCache::VerIterator
getVer(void) const { return *_iter
; }
496 inline pkgCache::VerIterator
operator*(void) const { return *_iter
; };
497 operator typename
Container::iterator(void) const { return _iter
; }
498 operator typename VersionContainer
<Container
>::const_iterator() { return VersionContainer
<Container
>::const_iterator(_iter
); }
499 inline void operator++(void) { ++_iter
; };
500 inline bool operator!=(iterator
const &i
) const { return _iter
!= i
._iter
; };
501 inline bool operator==(iterator
const &i
) const { return _iter
== i
._iter
; };
502 friend std::ostream
& operator<<(std::ostream
& out
, iterator i
) { return operator<<(out
, *i
); }
506 bool insert(pkgCache::VerIterator
const &V
) { if (V
.end() == true) return false; _cont
.insert(V
); return true; };
507 template<class Cont
> void insert(VersionContainer
<Cont
> const &vercont
) { _cont
.insert((typename
Cont::const_iterator
)vercont
.begin(), (typename
Cont::const_iterator
)vercont
.end()); };
508 void insert(const_iterator begin
, const_iterator end
) { _cont
.insert(begin
, end
); };
509 bool empty() const { return _cont
.empty(); };
510 void clear() { return _cont
.clear(); };
511 void erase(iterator position
) { _cont
.erase((typename
Container::iterator
)position
); };
512 size_t erase(const pkgCache::VerIterator x
) { return _cont
.erase(x
); };
513 void erase(iterator first
, iterator last
) { _cont
.erase(first
, last
); };
514 size_t size() const { return _cont
.size(); };
516 const_iterator
begin() const { return const_iterator(_cont
.begin()); };
517 const_iterator
end() const { return const_iterator(_cont
.end()); };
518 iterator
begin() { return iterator(_cont
.begin()); };
519 iterator
end() { return iterator(_cont
.end()); };
520 const_iterator
find(pkgCache::VerIterator
const &V
) const { return const_iterator(_cont
.find(V
)); };
522 /** \brief returns all versions specified on the commandline
524 Get all versions from the commandline, uses given default version if
525 non specifically requested and executes regex's if needed on names.
526 \param Cache the packages and versions are in
527 \param cmdline Command line the versions should be extracted from
528 \param helper responsible for error and message handling */
529 static VersionContainer
FromCommandLine(pkgCacheFile
&Cache
, const char **cmdline
,
530 Version
const &fallback
, CacheSetHelper
&helper
) {
531 VersionContainer vercon
;
532 VersionContainerInterface::FromCommandLine(&vercon
, Cache
, cmdline
, fallback
, helper
);
535 static VersionContainer
FromCommandLine(pkgCacheFile
&Cache
, const char **cmdline
,
536 Version
const &fallback
) {
537 CacheSetHelper helper
;
538 return FromCommandLine(Cache
, cmdline
, fallback
, helper
);
540 static VersionContainer
FromCommandLine(pkgCacheFile
&Cache
, const char **cmdline
) {
541 return FromCommandLine(Cache
, cmdline
, CANDINST
);
544 static VersionContainer
FromString(pkgCacheFile
&Cache
, std::string
const &pkg
,
545 Version
const &fallback
, CacheSetHelper
&helper
,
546 bool const onlyFromName
= false) {
547 VersionContainer vercon
;
548 VersionContainerInterface::FromString(&vercon
, Cache
, pkg
, fallback
, helper
);
551 static VersionContainer
FromString(pkgCacheFile
&Cache
, std::string pkg
,
552 Version
const &fallback
) {
553 CacheSetHelper helper
;
554 return FromString(Cache
, pkg
, fallback
, helper
);
556 static VersionContainer
FromString(pkgCacheFile
&Cache
, std::string pkg
) {
557 return FromString(Cache
, pkg
, CANDINST
);
560 /** \brief returns all versions specified for the package
562 \param Cache the package and versions are in
563 \param P the package in question
564 \param fallback the version(s) you want to get
565 \param helper the helper used for display and error handling */
566 static VersionContainer
FromPackage(pkgCacheFile
&Cache
, pkgCache::PkgIterator
const &P
,
567 Version
const &fallback
, CacheSetHelper
&helper
) {
568 VersionContainer vercon
;
569 VersionContainerInterface::FromPackage(&vercon
, Cache
, P
, fallback
, helper
);
572 static VersionContainer
FromPackage(pkgCacheFile
&Cache
, pkgCache::PkgIterator
const &P
,
573 Version
const &fallback
) {
574 CacheSetHelper helper
;
575 return FromPackage(Cache
, P
, fallback
, helper
);
577 static VersionContainer
FromPackage(pkgCacheFile
&Cache
, pkgCache::PkgIterator
const &P
) {
578 return FromPackage(Cache
, P
, CANDIDATE
);
581 static std::map
<unsigned short, VersionContainer
> GroupedFromCommandLine(
583 const char **cmdline
,
584 std::list
<Modifier
> const &mods
,
585 unsigned short const fallback
,
586 CacheSetHelper
&helper
) {
587 std::map
<unsigned short, VersionContainer
> versets
;
588 for (const char **I
= cmdline
; *I
!= 0; ++I
) {
589 unsigned short modID
= fallback
;
590 VersionContainer verset
;
591 VersionContainerInterface::FromModifierCommandLine(modID
, &verset
, Cache
, *I
, mods
, helper
);
592 versets
[modID
].insert(verset
);
597 static std::map
<unsigned short, VersionContainer
> GroupedFromCommandLine(
598 pkgCacheFile
&Cache
, const char **cmdline
,
599 std::list
<Modifier
> const &mods
,
600 unsigned short const fallback
) {
601 CacheSetHelper helper
;
602 return GroupedFromCommandLine(Cache
, cmdline
,
603 mods
, fallback
, helper
);
606 static VersionContainer
FromDependency(pkgCacheFile
&Cache
, pkgCache::DepIterator
const &D
,
607 Version
const &selector
, CacheSetHelper
&helper
) {
608 VersionContainer vercon
;
609 VersionContainerInterface::FromDependency(&vercon
, Cache
, D
, selector
, helper
);
612 static VersionContainer
FromDependency(pkgCacheFile
&Cache
, pkgCache::DepIterator
const &D
,
613 Version
const &selector
) {
614 CacheSetHelper helper
;
615 return FromPackage(Cache
, D
, selector
, helper
);
617 static VersionContainer
FromDependency(pkgCacheFile
&Cache
, pkgCache::DepIterator
const &D
) {
618 return FromPackage(Cache
, D
, CANDIDATE
);
623 template<> template<class Cont
> void VersionContainer
<std::list
<pkgCache::VerIterator
> >::insert(VersionContainer
<Cont
> const &vercont
) {
624 for (typename VersionContainer
<Cont
>::const_iterator v
= vercont
.begin(); v
!= vercont
.end(); ++v
)
627 // these two are 'inline' as otherwise the linker has problems with seeing these untemplated
628 // specializations again and again - but we need to see them, so that library users can use them
629 template<> inline bool VersionContainer
<std::list
<pkgCache::VerIterator
> >::insert(pkgCache::VerIterator
const &V
) {
635 template<> inline void VersionContainer
<std::list
<pkgCache::VerIterator
> >::insert(const_iterator begin
, const_iterator end
) {
636 for (const_iterator v
= begin
; v
!= end
; ++v
)
639 typedef VersionContainer
<std::set
<pkgCache::VerIterator
> > VersionSet
;
640 typedef VersionContainer
<std::list
<pkgCache::VerIterator
> > VersionList
;