10 #define APT_CACHESET_H
21 #include <apt-pkg/error.h>
24 #ifndef APT_8_CLEANER_HEADERS
25 #include <apt-pkg/cachefile.h>
32 class PackageContainerInterface;
33 class VersionContainerInterface;
47 ShowError(ShowError), ErrorType(ErrorType) {};
53 std::string
const &ver,
bool const verIsRel);
74 bool showErrors()
const {
return ShowError; };
75 bool showErrors(
bool const newValue) {
if (ShowError == newValue)
return ShowError;
else return ((ShowError = newValue) ==
false); };
79 if (ErrorType == newValue)
return ErrorType;
108 inline const char *Name()
const {
return getPkg().Name(); }
109 inline std::string FullName(
bool const Pretty)
const {
return getPkg().FullName(Pretty); }
110 inline std::string FullName()
const {
return getPkg().FullName(); }
111 inline const char *Section()
const {
return getPkg().Section(); }
112 inline bool Purge()
const {
return getPkg().Purge(); }
113 inline const char *Arch()
const {
return getPkg().Arch(); }
119 inline pkgCache::PkgIterator::OkState State()
const {
return getPkg().State(); }
120 inline const char *CandVersion()
const {
return getPkg().CandVersion(); }
121 inline const char *CurVersion()
const {
return getPkg().CurVersion(); }
122 inline pkgCache *Cache()
const {
return getPkg().Cache(); };
123 inline unsigned long Index()
const {
return getPkg().Index();};
125 inline bool end()
const {
return false; };
132 virtual bool empty()
const = 0;
133 virtual void clear() = 0;
135 enum Constructor { UNKNOWN, REGEX, TASK };
136 virtual void setConstructor(Constructor
const &con) = 0;
137 virtual Constructor getConstructor()
const = 0;
146 enum Position { NONE, PREFIX, POSTFIX };
148 const char *
const Alias;
150 Modifier (
unsigned short const &
id,
const char *
const alias, Position
const &pos) : ID(
id), Alias(alias), Pos(pos) {};
168 public std::iterator<std::forward_iterator_tag, typename Container::const_iterator> {
169 typename Container::const_iterator _iter;
171 const_iterator(
typename Container::const_iterator i) : _iter(i) {}
174 operator typename Container::const_iterator(
void)
const {
return _iter; }
177 inline bool operator!=(
const_iterator const &i)
const {
return _iter != i._iter; };
178 inline bool operator==(
const_iterator const &i)
const {
return _iter == i._iter; };
179 friend std::ostream& operator<<(std::ostream& out,
const_iterator i) {
return operator<<(out, *i); }
182 public std::iterator<std::forward_iterator_tag, typename Container::iterator> {
183 typename Container::iterator _iter;
185 iterator(
typename Container::iterator i) : _iter(i) {}
188 operator typename Container::iterator(
void)
const {
return _iter; }
190 inline iterator& operator++() { ++_iter;
return *
this; }
191 inline iterator operator++(
int) {
iterator tmp(*
this); operator++();
return tmp; }
192 inline bool operator!=(
iterator const &i)
const {
return _iter != i._iter; };
193 inline bool operator==(
iterator const &i)
const {
return _iter == i._iter; };
194 inline iterator& operator=(
iterator const &i) { _iter = i._iter;
return *
this; };
195 inline iterator& operator=(
typename Container::iterator
const &i) { _iter = i;
return *
this; };
196 friend std::ostream& operator<<(std::ostream& out,
iterator i) {
return operator<<(out, *i); }
200 bool insert(
pkgCache::PkgIterator const &P) {
if (P.end() ==
true)
return false; _cont.insert(P);
return true; };
201 template<
class Cont>
void insert(
PackageContainer<Cont> const &pkgcont) { _cont.insert((
typename Cont::const_iterator)pkgcont.begin(), (
typename Cont::const_iterator)pkgcont.end()); };
202 void insert(const_iterator begin, const_iterator end) { _cont.insert(begin, end); };
204 bool empty()
const {
return _cont.empty(); };
205 void clear() {
return _cont.clear(); };
207 void erase(
iterator position) { _cont.erase((
typename Container::iterator)position); };
208 iterator& erase(
iterator &position,
bool) {
return position = _cont.erase((
typename Container::iterator)position); };
211 size_t size()
const {
return _cont.size(); };
213 const_iterator begin()
const {
return const_iterator(_cont.begin()); };
214 const_iterator end()
const {
return const_iterator(_cont.end()); };
219 void setConstructor(Constructor
const &by) { ConstructedBy = by; };
220 Constructor getConstructor()
const {
return ConstructedBy; };
222 PackageContainer() : ConstructedBy(UNKNOWN) {};
223 PackageContainer(Constructor
const &by) : ConstructedBy(by) {};
240 return FromTask(Cache, pattern, helper);
259 return FromRegEx(Cache, pattern, helper);
320 const char **cmdline,
321 std::list<Modifier>
const &mods,
322 unsigned short const &fallback,
324 std::map<unsigned short, PackageContainer> pkgsets;
325 for (
const char **I = cmdline; *I != 0; ++I) {
326 unsigned short modID = fallback;
328 PackageContainerInterface::FromModifierCommandLine(modID, &pkgset, Cache, *I, mods, helper);
329 pkgsets[modID].insert(pkgset);
335 const char **cmdline,
336 std::list<Modifier>
const &mods,
337 unsigned short const &fallback) {
340 mods, fallback, helper);
344 Constructor ConstructedBy;
348 template<>
template<
class Cont>
void PackageContainer<std::list<pkgCache::PkgIterator> >::insert(PackageContainer<Cont>
const &pkgcont) {
349 for (
typename PackageContainer<Cont>::const_iterator p = pkgcont.begin(); p != pkgcont.end(); ++p)
354 template<>
inline bool PackageContainer<std::list<pkgCache::PkgIterator> >::insert(
pkgCache::PkgIterator const &P) {
360 template<>
inline void PackageContainer<std::list<pkgCache::PkgIterator> >::insert(const_iterator begin, const_iterator end) {
361 for (const_iterator p = begin; p != end; ++p)
364 typedef PackageContainer<std::set<pkgCache::PkgIterator> > PackageSet;
365 typedef PackageContainer<std::list<pkgCache::PkgIterator> > PackageList;
378 inline pkgCache *Cache()
const {
return getVer().Cache(); };
379 inline unsigned long Index()
const {
return getVer().Index();};
381 inline const char *VerStr()
const {
return getVer().VerStr(); };
382 inline const char *Section()
const {
return getVer().Section(); };
383 inline const char *Arch()
const {
return getVer().Arch(); };
390 inline bool Downloadable()
const {
return getVer().Downloadable(); };
391 inline const char *PriorityType()
const {
return getVer().PriorityType(); };
392 inline std::string RelStr()
const {
return getVer().RelStr(); };
393 inline bool Automatic()
const {
return getVer().Automatic(); };
396 inline bool end()
const {
return false; };
403 virtual bool empty()
const = 0;
404 virtual void clear() = 0;
425 enum Position { NONE, PREFIX, POSTFIX };
427 const char *
const Alias;
430 Modifier (
unsigned short const &
id,
const char *
const alias, Position
const &pos,
431 Version const &select) : ID(
id), Alias(alias), Pos(pos),
432 SelectVersion(select) {};
436 const char **cmdline,
Version const &fallback,
441 bool const onlyFromName =
false);
447 static bool FromModifierCommandLine(
unsigned short &modID,
450 std::list<Modifier>
const &mods,
488 public std::iterator<std::forward_iterator_tag, typename Container::const_iterator> {
489 typename Container::const_iterator _iter;
491 const_iterator(
typename Container::const_iterator i) : _iter(i) {}
494 operator typename Container::const_iterator(
void)
const {
return _iter; }
497 inline bool operator!=(
const_iterator const &i)
const {
return _iter != i._iter; };
498 inline bool operator==(
const_iterator const &i)
const {
return _iter == i._iter; };
499 friend std::ostream& operator<<(std::ostream& out,
const_iterator i) {
return operator<<(out, *i); }
502 public std::iterator<std::forward_iterator_tag, typename Container::iterator> {
503 typename Container::iterator _iter;
505 iterator(
typename Container::iterator i) : _iter(i) {}
508 operator typename Container::iterator(
void)
const {
return _iter; }
510 inline iterator& operator++() { ++_iter;
return *
this; }
511 inline iterator operator++(
int) {
iterator tmp(*
this); operator++();
return tmp; }
512 inline bool operator!=(
iterator const &i)
const {
return _iter != i._iter; };
513 inline bool operator==(
iterator const &i)
const {
return _iter == i._iter; };
514 inline iterator& operator=(
iterator const &i) { _iter = i._iter;
return *
this; };
515 inline iterator& operator=(
typename Container::iterator
const &i) { _iter = i;
return *
this; };
516 friend std::ostream& operator<<(std::ostream& out,
iterator i) {
return operator<<(out, *i); }
520 bool insert(
pkgCache::VerIterator const &V) {
if (V.end() ==
true)
return false; _cont.insert(V);
return true; };
521 template<
class Cont>
void insert(
VersionContainer<Cont> const &vercont) { _cont.insert((
typename Cont::const_iterator)vercont.begin(), (
typename Cont::const_iterator)vercont.end()); };
522 void insert(const_iterator begin, const_iterator end) { _cont.insert(begin, end); };
523 bool empty()
const {
return _cont.empty(); };
524 void clear() {
return _cont.clear(); };
526 void erase(
iterator position) { _cont.erase((
typename Container::iterator)position); };
527 iterator& erase(
iterator &position,
bool) {
return position = _cont.erase((
typename Container::iterator)position); };
530 size_t size()
const {
return _cont.size(); };
532 const_iterator begin()
const {
return const_iterator(_cont.begin()); };
533 const_iterator end()
const {
return const_iterator(_cont.end()); };
560 static VersionContainer FromString(
pkgCacheFile &Cache, std::string
const &pkg,
561 Version const &fallback, CacheSetHelper &helper,
562 bool const onlyFromName =
false) {
563 VersionContainer vercon;
564 VersionContainerInterface::FromString(&vercon, Cache, pkg, fallback, helper);
567 static VersionContainer FromString(
pkgCacheFile &Cache, std::string pkg,
569 CacheSetHelper helper;
570 return FromString(Cache, pkg, fallback, helper);
572 static VersionContainer FromString(
pkgCacheFile &Cache, std::string pkg) {
573 return FromString(Cache, pkg,
CANDINST);
597 static std::map<unsigned short, VersionContainer> GroupedFromCommandLine(
599 const char **cmdline,
600 std::list<Modifier>
const &mods,
601 unsigned short const fallback,
602 CacheSetHelper &helper) {
603 std::map<unsigned short, VersionContainer> versets;
604 for (
const char **I = cmdline; *I != 0; ++I) {
605 unsigned short modID = fallback;
606 VersionContainer verset;
607 VersionContainerInterface::FromModifierCommandLine(modID, &verset, Cache, *I, mods, helper);
608 versets[modID].insert(verset);
613 static std::map<unsigned short, VersionContainer> GroupedFromCommandLine(
615 std::list<Modifier>
const &mods,
616 unsigned short const fallback) {
617 CacheSetHelper helper;
618 return GroupedFromCommandLine(Cache, cmdline,
619 mods, fallback, helper);
623 Version const &selector, CacheSetHelper &helper) {
624 VersionContainer vercon;
625 VersionContainerInterface::FromDependency(&vercon, Cache, D, selector, helper);
630 CacheSetHelper helper;
639 template<>
template<
class Cont>
void VersionContainer<std::list<pkgCache::VerIterator> >::insert(VersionContainer<Cont>
const &vercont) {
640 for (
typename VersionContainer<Cont>::const_iterator v = vercont.begin(); v != vercont.end(); ++v)
645 template<>
inline bool VersionContainer<std::list<pkgCache::VerIterator> >::insert(
pkgCache::VerIterator const &V) {
651 template<>
inline void VersionContainer<std::list<pkgCache::VerIterator> >::insert(const_iterator begin, const_iterator end) {
652 for (const_iterator v = begin; v != end; ++v)
655 typedef VersionContainer<std::set<pkgCache::VerIterator> > VersionSet;
656 typedef VersionContainer<std::list<pkgCache::VerIterator> > VersionList;