// pkg_sortpolicy.h (-*-c++-*-) // // Copyright (C) 2001, 2005 Daniel Burrows // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as // published by the Free Software Foundation; either version 2 of // the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; see the file COPYING. If not, write to // the Free Software Foundation, Inc., 59 Temple Place - Suite 330, // Boston, MA 02111-1307, USA. // // // Package sorting policies. Currently they just handle PkgIterator/VerIterator // pairs and a wrapper class integrates them with vs_tree. If this can handle // everything useful, I'd like to keep it as is, since it's simpler than the // alternatives. #ifndef PKG_SORTPOLICY_H #define PKG_SORTPOLICY_H #include #include class pkg_tree_node; class pkg_sortpolicy { pkg_sortpolicy *chain; bool reversed; protected: const pkg_sortpolicy *get_chain() const {return chain;} bool get_reversed() const {return reversed;} public: pkg_sortpolicy(pkg_sortpolicy *_chain, bool _reversed) :chain(_chain), reversed(_reversed) {} virtual ~pkg_sortpolicy() {delete chain;} virtual int compare(const pkgCache::PkgIterator &pkg1, const pkgCache::VerIterator &ver1, const pkgCache::PkgIterator &pkg2, const pkgCache::VerIterator &ver2) const=0; }; // This is an experiment..I'm using factories to avoid a massively oversized // header file. We'll see how it works.. // // Each of these instantiates a corresponding class and returns an instance of // it. pkg_sortpolicy *pkg_sortpolicy_name(pkg_sortpolicy *chain, bool reversed); pkg_sortpolicy *pkg_sortpolicy_ver(pkg_sortpolicy *chain, bool reversed); pkg_sortpolicy *pkg_sortpolicy_installed_size(pkg_sortpolicy *chain, bool reversed); pkg_sortpolicy *pkg_sortpolicy_priority(pkg_sortpolicy *chain, bool reversed); // ewwwwwwww. // // IMPORTANT: this does NOT, repeat NOT delete its "contents". It wouldn't // work if it did without all sorts of evil. You have been warned. // // Having the operator() be virtual is a bit of an ick.. class pkg_sortpolicy_wrapper:public sortpolicy { pkg_sortpolicy *chain; public: pkg_sortpolicy_wrapper(pkg_sortpolicy *_chain):chain(_chain) {} int compare(vs_treeitem *item1, vs_treeitem *item2) const; bool operator()(vs_treeitem *item1, vs_treeitem *item2) { return (compare(item1, item2)<0); } }; #endif