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;
147 enum Position { NONE, PREFIX, POSTFIX };
149 const char *
const Alias;
151 Modifier (
unsigned short const &
id,
const char *
const alias, Position
const &pos) : ID(
id), Alias(alias), Pos(pos) {};
169 public std::iterator<std::forward_iterator_tag, typename Container::const_iterator> {
170 typename Container::const_iterator _iter;
172 const_iterator(
typename Container::const_iterator i) : _iter(i) {}
175 operator typename Container::const_iterator(
void)
const {
return _iter; }
178 inline bool operator!=(
const_iterator const &i)
const {
return _iter != i._iter; };
179 inline bool operator==(
const_iterator const &i)
const {
return _iter == i._iter; };
180 friend std::ostream& operator<<(std::ostream& out,
const_iterator i) {
return operator<<(out, *i); }
183 public std::iterator<std::forward_iterator_tag, typename Container::iterator> {
184 typename Container::iterator _iter;
186 iterator(
typename Container::iterator i) : _iter(i) {}
189 operator typename Container::iterator(
void)
const {
return _iter; }
191 inline iterator& operator++() { ++_iter;
return *
this; }
192 inline iterator operator++(
int) {
iterator tmp(*
this); operator++();
return tmp; }
193 inline bool operator!=(
iterator const &i)
const {
return _iter != i._iter; };
194 inline bool operator==(
iterator const &i)
const {
return _iter == i._iter; };
195 inline iterator& operator=(
iterator const &i) { _iter = i._iter;
return *
this; };
196 inline iterator& operator=(
typename Container::iterator
const &i) { _iter = i;
return *
this; };
197 friend std::ostream& operator<<(std::ostream& out,
iterator i) {
return operator<<(out, *i); }
201 bool insert(
pkgCache::PkgIterator const &P) {
if (P.end() ==
true)
return false; _cont.insert(P);
return true; };
202 template<
class Cont>
void insert(
PackageContainer<Cont> const &pkgcont) { _cont.insert((
typename Cont::const_iterator)pkgcont.begin(), (
typename Cont::const_iterator)pkgcont.end()); };
203 void insert(const_iterator begin, const_iterator end) { _cont.insert(begin, end); };
205 bool empty()
const {
return _cont.empty(); };
206 void clear() {
return _cont.clear(); };
208 void erase(
iterator position) { _cont.erase((
typename Container::iterator)position); };
209 iterator& erase(
iterator &position,
bool) {
return position = _cont.erase((
typename Container::iterator)position); };
212 size_t size()
const {
return _cont.size(); };
214 const_iterator begin()
const {
return const_iterator(_cont.begin()); };
215 const_iterator end()
const {
return const_iterator(_cont.end()); };
220 void setConstructor(Constructor
const &by) { ConstructedBy = by; };
221 Constructor getConstructor()
const {
return ConstructedBy; };
223 PackageContainer() : ConstructedBy(UNKNOWN) {};
224 PackageContainer(Constructor
const &by) : ConstructedBy(by) {};
241 return FromTask(Cache, pattern, helper);
260 return FromRegEx(Cache, pattern, helper);
321 const char **cmdline,
322 std::list<Modifier>
const &mods,
323 unsigned short const &fallback,
325 std::map<unsigned short, PackageContainer> pkgsets;
326 for (
const char **I = cmdline; *I != 0; ++I) {
327 unsigned short modID = fallback;
329 PackageContainerInterface::FromModifierCommandLine(modID, &pkgset, Cache, *I, mods, helper);
330 pkgsets[modID].insert(pkgset);
336 const char **cmdline,
337 std::list<Modifier>
const &mods,
338 unsigned short const &fallback) {
341 mods, fallback, helper);
345 Constructor ConstructedBy;
349 template<>
template<
class Cont>
void PackageContainer<std::list<pkgCache::PkgIterator> >::insert(PackageContainer<Cont>
const &pkgcont) {
350 for (
typename PackageContainer<Cont>::const_iterator p = pkgcont.begin(); p != pkgcont.end(); ++p)
355 template<>
inline bool PackageContainer<std::list<pkgCache::PkgIterator> >::insert(
pkgCache::PkgIterator const &P) {
361 template<>
inline void PackageContainer<std::list<pkgCache::PkgIterator> >::insert(const_iterator begin, const_iterator end) {
362 for (const_iterator p = begin; p != end; ++p)
365 typedef PackageContainer<std::set<pkgCache::PkgIterator> > PackageSet;
366 typedef PackageContainer<std::list<pkgCache::PkgIterator> > PackageList;
379 inline pkgCache *Cache()
const {
return getVer().Cache(); };
380 inline unsigned long Index()
const {
return getVer().Index();};
382 inline const char *VerStr()
const {
return getVer().VerStr(); };
383 inline const char *Section()
const {
return getVer().Section(); };
384 inline const char *Arch()
const {
return getVer().Arch(); };
391 inline bool Downloadable()
const {
return getVer().Downloadable(); };
392 inline const char *PriorityType()
const {
return getVer().PriorityType(); };
393 inline std::string RelStr()
const {
return getVer().RelStr(); };
394 inline bool Automatic()
const {
return getVer().Automatic(); };
397 inline bool end()
const {
return false; };
404 virtual bool empty()
const = 0;
405 virtual void clear() = 0;
426 enum Position { NONE, PREFIX, POSTFIX };
428 const char *
const Alias;
431 Modifier (
unsigned short const &
id,
const char *
const alias, Position
const &pos,
432 Version const &select) : ID(
id), Alias(alias), Pos(pos),
433 SelectVersion(select) {};
437 const char **cmdline,
Version const &fallback,
442 bool const onlyFromName =
false);
448 static bool FromModifierCommandLine(
unsigned short &modID,
451 std::list<Modifier>
const &mods,
489 public std::iterator<std::forward_iterator_tag, typename Container::const_iterator> {
490 typename Container::const_iterator _iter;
492 const_iterator(
typename Container::const_iterator i) : _iter(i) {}
495 operator typename Container::const_iterator(
void)
const {
return _iter; }
498 inline bool operator!=(
const_iterator const &i)
const {
return _iter != i._iter; };
499 inline bool operator==(
const_iterator const &i)
const {
return _iter == i._iter; };
500 friend std::ostream& operator<<(std::ostream& out,
const_iterator i) {
return operator<<(out, *i); }
503 public std::iterator<std::forward_iterator_tag, typename Container::iterator> {
504 typename Container::iterator _iter;
506 iterator(
typename Container::iterator i) : _iter(i) {}
509 operator typename Container::iterator(
void)
const {
return _iter; }
511 inline iterator& operator++() { ++_iter;
return *
this; }
512 inline iterator operator++(
int) {
iterator tmp(*
this); operator++();
return tmp; }
513 inline bool operator!=(
iterator const &i)
const {
return _iter != i._iter; };
514 inline bool operator==(
iterator const &i)
const {
return _iter == i._iter; };
515 inline iterator& operator=(
iterator const &i) { _iter = i._iter;
return *
this; };
516 inline iterator& operator=(
typename Container::iterator
const &i) { _iter = i;
return *
this; };
517 friend std::ostream& operator<<(std::ostream& out,
iterator i) {
return operator<<(out, *i); }
521 bool insert(
pkgCache::VerIterator const &V) {
if (V.end() ==
true)
return false; _cont.insert(V);
return true; };
522 template<
class Cont>
void insert(
VersionContainer<Cont> const &vercont) { _cont.insert((
typename Cont::const_iterator)vercont.begin(), (
typename Cont::const_iterator)vercont.end()); };
523 void insert(const_iterator begin, const_iterator end) { _cont.insert(begin, end); };
524 bool empty()
const {
return _cont.empty(); };
525 void clear() {
return _cont.clear(); };
527 void erase(
iterator position) { _cont.erase((
typename Container::iterator)position); };
528 iterator& erase(
iterator &position,
bool) {
return position = _cont.erase((
typename Container::iterator)position); };
531 size_t size()
const {
return _cont.size(); };
533 const_iterator begin()
const {
return const_iterator(_cont.begin()); };
534 const_iterator end()
const {
return const_iterator(_cont.end()); };
561 static VersionContainer FromString(
pkgCacheFile &Cache, std::string
const &pkg,
562 Version const &fallback, CacheSetHelper &helper,
563 bool const onlyFromName =
false) {
564 VersionContainer vercon;
565 VersionContainerInterface::FromString(&vercon, Cache, pkg, fallback, helper);
568 static VersionContainer FromString(
pkgCacheFile &Cache, std::string pkg,
570 CacheSetHelper helper;
571 return FromString(Cache, pkg, fallback, helper);
573 static VersionContainer FromString(
pkgCacheFile &Cache, std::string pkg) {
574 return FromString(Cache, pkg,
CANDINST);
598 static std::map<unsigned short, VersionContainer> GroupedFromCommandLine(
600 const char **cmdline,
601 std::list<Modifier>
const &mods,
602 unsigned short const fallback,
603 CacheSetHelper &helper) {
604 std::map<unsigned short, VersionContainer> versets;
605 for (
const char **I = cmdline; *I != 0; ++I) {
606 unsigned short modID = fallback;
607 VersionContainer verset;
608 VersionContainerInterface::FromModifierCommandLine(modID, &verset, Cache, *I, mods, helper);
609 versets[modID].insert(verset);
614 static std::map<unsigned short, VersionContainer> GroupedFromCommandLine(
616 std::list<Modifier>
const &mods,
617 unsigned short const fallback) {
618 CacheSetHelper helper;
619 return GroupedFromCommandLine(Cache, cmdline,
620 mods, fallback, helper);
624 Version const &selector, CacheSetHelper &helper) {
625 VersionContainer vercon;
626 VersionContainerInterface::FromDependency(&vercon, Cache, D, selector, helper);
631 CacheSetHelper helper;
640 template<>
template<
class Cont>
void VersionContainer<std::list<pkgCache::VerIterator> >::insert(VersionContainer<Cont>
const &vercont) {
641 for (
typename VersionContainer<Cont>::const_iterator v = vercont.begin(); v != vercont.end(); ++v)
646 template<>
inline bool VersionContainer<std::list<pkgCache::VerIterator> >::insert(
pkgCache::VerIterator const &V) {
652 template<>
inline void VersionContainer<std::list<pkgCache::VerIterator> >::insert(const_iterator begin, const_iterator end) {
653 for (const_iterator v = begin; v != end; ++v)
656 typedef VersionContainer<std::set<pkgCache::VerIterator> > VersionSet;
657 typedef VersionContainer<std::list<pkgCache::VerIterator> > VersionList;