From cfae3b8d0da6cba4a949cf7d48cee063b13d7f0b Mon Sep 17 00:00:00 2001 From: Robert Collins Date: Tue, 9 Jul 2002 06:57:41 +0000 Subject: [PATCH] 2002-07-09 Robert Collins Change custom container code for packagedb::packages to STL containers throughout. * IniDBBuilderPackage.cc: Ditto. * PickView.cc: Ditto. * choose.cc: Ditto. * desktop.cc: Ditto. * download.cc: Ditto. * install.cc: Ditto. * package_db.cc: Ditto. * package_db.h: Ditto. * Makefile.am: Remove list.h references. * list.h: Remove. --- ChangeLog | 15 ++++ IniDBBuilderPackage.cc | 7 +- Makefile.am | 1 - Makefile.in | 1 - PickView.cc | 5 +- choose.cc | 65 ++++++++------- desktop.cc | 6 +- download.cc | 10 ++- install.cc | 20 +++-- list.h | 180 ----------------------------------------- package_db.cc | 19 +++-- package_db.h | 3 +- 12 files changed, 92 insertions(+), 240 deletions(-) delete mode 100644 list.h diff --git a/ChangeLog b/ChangeLog index d1291ef9..8c3a857d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2002-07-09 Robert Collins + + Change custom container code for packagedb::packages to STL containers + throughout. + * IniDBBuilderPackage.cc: Ditto. + * PickView.cc: Ditto. + * choose.cc: Ditto. + * desktop.cc: Ditto. + * download.cc: Ditto. + * install.cc: Ditto. + * package_db.cc: Ditto. + * package_db.h: Ditto. + * Makefile.am: Remove list.h references. + * list.h: Remove. + 2002-07-08 Max Bowsher * PickView.cc (PickView::PickView): Set font of package list header to diff --git a/IniDBBuilderPackage.cc b/IniDBBuilderPackage.cc index a99fb908..5949a75d 100644 --- a/IniDBBuilderPackage.cc +++ b/IniDBBuilderPackage.cc @@ -68,7 +68,12 @@ IniDBBuilderPackage::buildPackage (String const &name) } #endif packagedb db; - cp = &db.packages.registerbykey(name); + cp = db.findBinary (PackageSpecification(name)); + if (!cp) + { + cp = new packagemeta (name); + db.packages.push_back (cp); + } cbpv = cygpackage::createInstance (name); cspv = packageversion (); currentSpec = NULL; diff --git a/Makefile.am b/Makefile.am index ba7afb55..fe91ae51 100644 --- a/Makefile.am +++ b/Makefile.am @@ -183,7 +183,6 @@ setup_SOURCES = \ io_stream_memory.cc \ io_stream_memory.h \ IOStreamProvider.h \ - list.h \ localdir.cc \ localdir.h \ log.cc \ diff --git a/Makefile.in b/Makefile.in index e90d6c46..959d8cab 100644 --- a/Makefile.in +++ b/Makefile.in @@ -279,7 +279,6 @@ setup_SOURCES = \ io_stream_memory.cc \ io_stream_memory.h \ IOStreamProvider.h \ - list.h \ localdir.cc \ localdir.h \ log.cc \ diff --git a/PickView.cc b/PickView.cc index 0d253c03..da36e12c 100644 --- a/PickView.cc +++ b/PickView.cc @@ -322,9 +322,10 @@ PickView::init_headers (HDC dc) for (packagedb::categoriesType::iterator n = packagedb::categories.begin(); n != packagedb::categories.end(); ++n) note_width (headers, dc, String ("+ ")+n->first, HMARGIN, cat_col); - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator n = db.packages.begin (); + n != db.packages.end (); ++n) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **n; if (pkg.installed) note_width (headers, dc, pkg.installed.Canonical_version (), HMARGIN, current_col); diff --git a/choose.cc b/choose.cc index fc535ed5..17d0d371 100644 --- a/choose.cc +++ b/choose.cc @@ -271,18 +271,19 @@ set_existence () /* binary packages */ /* Remove packages that are in the db, not installed, and have no mirror info and are not cached for both binary and source packages. */ - size_t n = 1; - while (n <= db.packages.number ()) + vector ::iterator i = db.packages.begin (); + while (i != db.packages.end ()) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; if (!pkg.installed && !pkg.accessible() && !pkg.sourceAccessible() ) { - packagemeta *pkgm = db.packages.removebyindex (n); + packagemeta *pkgm = *i; delete pkgm; + i = db.packages.erase (i); } else - ++n; + ++i; } #if 0 /* remove any source packages which are not accessible */ @@ -306,9 +307,10 @@ static void fill_missing_category () { packagedb db; - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; if (!pkg.categories.size ()) pkg.add_category ("Misc"); pkg.add_category ("All"); @@ -320,9 +322,10 @@ default_trust (HWND h, trusts trust) { chooser->deftrust = trust; packagedb db; - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; if (pkg.installed || pkg.categories.find ("Base") != pkg.categories.end () || pkg.categories.find ("Misc") != pkg.categories.end ()) @@ -357,9 +360,10 @@ set_view_mode (HWND h, PickView::views mode) packagedb db; if (chooser->get_view_mode () == PickView::views::Package) { - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; if ((!pkg.desired && pkg.installed) || (pkg.desired && (pkg.desired.picked () || pkg.desired.sourcePackage().picked()))) @@ -368,11 +372,9 @@ set_view_mode (HWND h, PickView::views mode) } else if (chooser->get_view_mode () == PickView::views::PackageFull) { - for (size_t n = 1; n <= db.packages.number (); n++) - { - packagemeta & pkg = *db.packages[n]; - chooser->insert_pkg (pkg); - } + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) + chooser->insert_pkg (**i); } else if (chooser->get_view_mode () == PickView::views::Category) { @@ -426,9 +428,10 @@ create_listview (HWND dlg, RECT * r) if (!SetDlgItemText (dlg, IDC_CHOOSE_VIEWCAPTION, chooser->mode_caption ())) log (LOG_BABBLE) << "Failed to set View button caption %ld" << GetLastError () << endLog; - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; pkg.set_requirements (chooser->deftrust); } /* FIXME: do we need to init the desired fields ? */ @@ -473,9 +476,10 @@ scan_downloaded_files () * and fill in the Cached attribute if it exists. */ packagedb db; - for (size_t n = 1; n <= db.packages.number (); ++n) + for (vector ::iterator n = db.packages.begin (); + n != db.packages.end (); ++n) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **n; for (set::iterator i = pkg.versions.begin (); i != pkg.versions.end (); ++i) { @@ -553,10 +557,10 @@ ChooserPage::OnNext () log (LOG_BABBLE) << "Chooser results..." << endLog; packagedb db; - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; -// static const char *infos[] = { "nada", "prev", "curr", "test" }; + packagemeta & pkg = **i; const char *trust = ((pkg.desired == pkg.prev) ? "prev" : (pkg.desired == pkg.curr) ? "curr" : (pkg.desired == pkg.exp) ? "test" : "unknown"); @@ -638,9 +642,10 @@ ChooserPage::OnMessageCmd (int id, HWND hwndctl, UINT code) if (IsDlgButtonChecked (GetHWND (), id)) { default_trust (lv, TRUST_PREV); - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; pkg.set_requirements (TRUST_PREV); } set_view_mode (lv, chooser->get_view_mode ()); @@ -652,9 +657,10 @@ ChooserPage::OnMessageCmd (int id, HWND hwndctl, UINT code) if (IsDlgButtonChecked (GetHWND (), id)) { default_trust (lv, TRUST_CURR); - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; pkg.set_requirements (TRUST_CURR); } set_view_mode (lv, chooser->get_view_mode ()); @@ -666,9 +672,10 @@ ChooserPage::OnMessageCmd (int id, HWND hwndctl, UINT code) if (IsDlgButtonChecked (GetHWND (), id)) { default_trust (lv, TRUST_TEST); - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; pkg.set_requirements (TRUST_TEST); } set_view_mode (lv, chooser->get_view_mode ()); diff --git a/desktop.cc b/desktop.cc index 0617fc4a..f2523b5e 100644 --- a/desktop.cc +++ b/desktop.cc @@ -25,6 +25,7 @@ static const char *cvsid = #include "win32.h" #include +#include "desktop.h" #include #include @@ -49,9 +50,10 @@ static const char *cvsid = #include "String++.h" #include "io_stream.h" -#include "desktop.h" #include "getopt++/BoolOption.h" +#include "PackageSpecification.h" + static BoolOption NoShortcutsOption (false, 'n', "no-shortcuts", "Disable creation of desktop and start menu shortcuts"); static OSVERSIONINFO verinfo; @@ -288,7 +290,7 @@ make_passwd_group () if (verinfo.dwPlatformId != VER_PLATFORM_WIN32_NT) { packagedb db; - packagemeta *pkg = db.packages.getbykey ("cygwin"); + packagemeta *pkg = db.findBinary (PackageSpecification("cygwin")); if (pkg && pkg->installed) { /* mkpasswd and mkgroup are not working on 9x/ME up to 1.1.5-4 */ diff --git a/download.cc b/download.cc index 83d9b9ca..a4914ae1 100644 --- a/download.cc +++ b/download.cc @@ -225,9 +225,10 @@ do_download_thread (HINSTANCE h, HWND owner) packagedb db; /* calculate the amount needed */ - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; if (pkg.desired.changeRequested()) { packageversion version = pkg.desired; @@ -254,9 +255,10 @@ do_download_thread (HINSTANCE h, HWND owner) /* and do the download. FIXME: This here we assign a new name for the cached version * and check that above. */ - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; if (pkg.desired.changeRequested()) { int e = 0; diff --git a/install.cc b/install.cc index b12e41c8..a187764e 100644 --- a/install.cc +++ b/install.cc @@ -503,9 +503,10 @@ do_install_thread (HINSTANCE h, HWND owner) init_run_script (); packagedb db; - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; if (pkg.desired.changeRequested()) { @@ -517,9 +518,10 @@ do_install_thread (HINSTANCE h, HWND owner) } /* start with uninstalls - remove files that new packages may replace */ - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; if (pkg.installed && (!pkg.desired || pkg.desired != pkg.installed)) uninstall_one (pkg); } @@ -528,9 +530,10 @@ do_install_thread (HINSTANCE h, HWND owner) * that have been moved into new packages */ - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; if (pkg.installed && pkg.desired.picked()) { try { @@ -551,9 +554,10 @@ do_install_thread (HINSTANCE h, HWND owner) } } - for (size_t n = 1; n <= db.packages.number (); n++) + for (vector ::iterator i = db.packages.begin (); + i != db.packages.end (); ++i) { - packagemeta & pkg = *db.packages[n]; + packagemeta & pkg = **i; if (pkg.desired && pkg.desired.changeRequested()) { diff --git a/list.h b/list.h deleted file mode 100644 index c90c6251..00000000 --- a/list.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2001, Robert Collins. - * - * 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. - * - * A copy of the GNU General Public License can be found at - * http://www.gnu.org/ - * - * Written by Robert Collins - * - */ - -#ifndef _LIST_H_ -#define _LIST_H_ - -#include "stdlib.h" -#include "sys/types.h" - -#include "LogSingleton.h" - -/* Creates a list/array of type T (must have a field key of type U), - * with index type U and U comparison Ucmp. - */ -template < class T, class U, int -Ucmp (U, U) > -class list -{ - T **pointerblock; - size_t _number; - size_t _space; - -public: -list ():pointerblock (0), _number (0), _space (0) - { - }; - // ~list () ... - /* get an element if it exists */ - T *getbykey (const U); - /* add an element if it does not exist and return a reference */ - T & registerbykey (U); - /* add an element if one with the same key does not exist */ - T & registerbyobject (T &); - /* remove by index */ - T *removebyindex (size_t); - size_t number () const - { - return _number; - }; - /* get by offset - not thread safe - starts at 1 */ - T *operator [] (size_t n) const - { - return n && n <= _number ? pointerblock[n - 1] : 0; - }; - /* TODO: delete */ -private: - // ensure there is enough array space. - void checksize (void); - // perform an insertion. - void insert (size_t, T *); - // find the index for a given element. - // if the element is not present, return the index of an element beside - // where it should be inserted. This may be above or below the actual - // insertion point - size_t findindex (const U) const; -}; - -template < class T, class U, int -Ucmp (U, U) > -T * list < T, U, Ucmp >::getbykey (const U key) -{ - /* trivial corner case */ - if (_number == 0) - return 0; - size_t index = findindex (key); - if (index < _number && Ucmp (pointerblock[index]->key, key) == 0) - return pointerblock[index]; - return 0; -} - - -template < class T, class U, int -Ucmp (U, U) > -T & list < T, U, Ucmp >::registerbykey (U key) -{ - T *tempT = getbykey (key); - if (!tempT) - { - tempT = new T (key); - - size_t index = _number ? findindex (tempT->key) : 0; - insert (index, tempT); - } - return *tempT; -} - -/* TODO: factor both insertion routines into one */ -template < class T, class U, int -Ucmp (U, U) > -T & list < T, U, Ucmp >::registerbyobject (T & newobj) -{ - T *tempT = getbykey (newobj.key); - if (!tempT) - { - tempT = &newobj; - size_t index = _number ? findindex (tempT->key) : 0; - insert (index, tempT); - } - return *tempT; -} - -template < class T, class U, int -Ucmp (U, U) > -T * list < T, U, Ucmp >::removebyindex (size_t index) -{ - if (index && index <= _number) - { - T *rv = pointerblock[index - 1]; - /* remove from index - 1 */ - for (size_t i = index; i < _number; ++i) - pointerblock[i - 1] = pointerblock[i]; - --_number; - return rv; - } - return 0; -} - -template < class T, class U, int - Ucmp (U, U) > void - list < T, U, Ucmp >::checksize () -{ - if (_number == _space) - { - T **newptr = new (T *)[_space + 20]; - if (!newptr) - { - //die - todo enable exceptions - exit (100); - } - for (size_t i = 0; i < _number; ++i) - newptr[i] = pointerblock[i]; - delete[]pointerblock; - pointerblock = newptr; - /* TODO: Parameterise this too */ - _space += 20; - } -} -template < class T, class U, int - Ucmp (U, U) > void - list < T, U, Ucmp >::insert (size_t where, T * someT) -{ - // doesn't change where - checksize (); - /* insert at where */ - for (size_t i = _number; where < i; --i) - pointerblock[i] = pointerblock[i - 1]; - pointerblock[where] = someT; - ++_number; -} - - -/* Precondition: _number != 0 */ -template < class T, class U, int -Ucmp (U, U) > -size_t list < T, U, Ucmp >::findindex (const U key) const -{ - for (size_t n = _number - 1; n < _number; --n) - { - int direction = Ucmp (key, pointerblock[n]->key); - if (!direction) - return n; - else if (direction > 0) - return n+1; - } - return 0; -} - -#endif /* _LIST_H_ */ diff --git a/package_db.cc b/package_db.cc index a25e5bb4..040adf91 100644 --- a/package_db.cc +++ b/package_db.cc @@ -92,10 +92,11 @@ packagedb::packagedb () if (!parseable) continue; - packagemeta *pkg = packages.getbykey (pkgname); + packagemeta *pkg = findBinary (PackageSpecification(pkgname)); if (!pkg) { pkg = new packagemeta (pkgname, inst); + packages.push_back (pkg); /* we should install a new handler then not check this... */ //if (!pkg) @@ -110,8 +111,6 @@ packagedb::packagedb () pkg->add_version (binary); pkg->set_installed (binary); pkg->desired = pkg->installed; - packages.registerbyobject (*pkg); - } delete db; db = 0; @@ -140,9 +139,10 @@ packagedb::flush () return errno ? errno : 1; ndb->write ("INSTALLED.DB 2\n", strlen ("INSTALLED.DB 2\n")); - for (size_t n = 1; n <= packages.number (); n++) + for (vector ::iterator i = packages.begin (); + i != packages.end (); ++i) { - packagemeta & pkgm = *packages[n]; + packagemeta & pkgm = **i; if (pkgm.installed) { /* size here is irrelevant - as we can assume that this install source @@ -169,9 +169,10 @@ packagedb::flush () packagemeta * packagedb::findBinary (PackageSpecification const &spec) const { - for (size_t n = 1; n <= packages.number (); ++n) + for (vector ::iterator n = packages.begin (); + n != packages.end (); ++n) { - packagemeta & pkgm = *packages[n]; + packagemeta & pkgm = **n; for (set::iterator i=pkgm.versions.begin(); i != pkgm.versions.end(); ++i) if (spec.satisfies (*i)) @@ -197,9 +198,7 @@ packagedb::findSource (PackageSpecification const &spec) const int packagedb::installeddbread = 0; -list < packagemeta, String, - String::casecompare > - packagedb::packages; +vector < packagemeta * > packagedb::packages; packagedb::categoriesType packagedb::categories; vector packagedb::sourcePackages; diff --git a/package_db.h b/package_db.h index dc8af9c9..e44b13cf 100644 --- a/package_db.h +++ b/package_db.h @@ -20,7 +20,6 @@ #include #include #include -#include "list.h" #include "category.h" class packagemeta; class io_stream; @@ -41,7 +40,7 @@ public: packagemeta * findBinary (PackageSpecification const &) const; packagemeta * findSource (PackageSpecification const &) const; /* all seen binary packages */ - static list < packagemeta, String, String::casecompare > packages; + static vector < packagemeta *> packages; /* all seen source packages */ static vector sourcePackages; /* all seen categories */ -- 2.43.5