From e35a99be4c1f386ea9a38e8daead534eb760a36a Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 16 Jul 2011 23:11:25 +0200 Subject: [PATCH] Pull class BPackageInfoSet out of BRepositoryCache --- headers/build/os/package/PackageInfoSet.h | 2 + headers/os/package/PackageInfoSet.h | 66 ++++++ headers/os/package/RepositoryCache.h | 32 +-- src/build/libpackage/Jamfile | 1 + src/kits/package/Jamfile | 1 + src/kits/package/PackageInfoSet.cpp | 241 ++++++++++++++++++++++ src/kits/package/RepositoryCache.cpp | 187 ++--------------- 7 files changed, 326 insertions(+), 204 deletions(-) create mode 100644 headers/build/os/package/PackageInfoSet.h create mode 100644 headers/os/package/PackageInfoSet.h create mode 100644 src/kits/package/PackageInfoSet.cpp diff --git a/headers/build/os/package/PackageInfoSet.h b/headers/build/os/package/PackageInfoSet.h new file mode 100644 index 0000000000..c775831aab --- /dev/null +++ b/headers/build/os/package/PackageInfoSet.h @@ -0,0 +1,2 @@ +#include <../os/package/PackageInfoSet.h> + diff --git a/headers/os/package/PackageInfoSet.h b/headers/os/package/PackageInfoSet.h new file mode 100644 index 0000000000..f2545ff73e --- /dev/null +++ b/headers/os/package/PackageInfoSet.h @@ -0,0 +1,66 @@ +/* + * Copyright 2011, Haiku, Inc. + * Distributed under the terms of the MIT License. + */ +#ifndef _PACKAGE_PACKAGE_INFO_SET_H_ +#define _PACKAGE_PACKAGE_INFO_SET_H_ + + +#include + + +namespace BPackageKit { + + +class BPackageInfo; + + +class BPackageInfoSet { +public: + class Iterator; + +public: + BPackageInfoSet(); + virtual ~BPackageInfoSet(); + + status_t Init(); + + status_t AddInfo(const BPackageInfo& info); + void MakeEmpty(); + + uint32 CountInfos() const; + Iterator GetIterator() const; + +private: + struct PackageInfo; + struct PackageInfoHashDefinition; + struct PackageMap; + + friend class Iterator; + +private: + PackageMap* fPackageMap; +}; + + +class BPackageInfoSet::Iterator { +public: + Iterator(); + Iterator(const BPackageInfoSet* set); + + bool HasNext() const; + const BPackageInfo* Next(); + +private: + friend class BRepositoryCache; + +private: + const BPackageInfoSet* fSet; + PackageInfo* fNextInfo; +}; + + +} // namespace BPackageKit + + +#endif // _PACKAGE_PACKAGE_INFO_SET_H_ diff --git a/headers/os/package/RepositoryCache.h b/headers/os/package/RepositoryCache.h index cb49150b25..3a1ee37de0 100644 --- a/headers/os/package/RepositoryCache.h +++ b/headers/os/package/RepositoryCache.h @@ -9,18 +9,16 @@ #include #include +#include #include namespace BPackageKit { -class BPackageInfo; - - class BRepositoryCache { public: - class Iterator; + typedef BPackageInfoSet::Iterator Iterator; public: BRepositoryCache(); @@ -38,39 +36,15 @@ public: Iterator GetIterator() const; private: - struct PackageInfo; - struct PackageInfoHashDefinition; - struct PackageMap; struct RepositoryContentHandler; struct StandardErrorOutput; - friend class Iterator; - private: BEntry fEntry; BRepositoryInfo fInfo; bool fIsUserSpecific; - PackageMap* fPackageMap; -}; - - -class BRepositoryCache::Iterator { -public: - Iterator(); - - bool HasNext() const; - const BPackageInfo* Next(); - -private: - Iterator(const BRepositoryCache* cache); - -private: - friend class BRepositoryCache; - -private: - const BRepositoryCache* fCache; - PackageInfo* fNextInfo; + BPackageInfoSet fPackages; }; diff --git a/src/build/libpackage/Jamfile b/src/build/libpackage/Jamfile index 1e0a27919c..3bccce80ba 100644 --- a/src/build/libpackage/Jamfile +++ b/src/build/libpackage/Jamfile @@ -68,6 +68,7 @@ BuildPlatformSharedLibrary libpackage_build.so Job.cpp JobQueue.cpp PackageInfo.cpp + PackageInfoSet.cpp PackageResolvable.cpp PackageResolvableExpression.cpp PackageRoster.cpp diff --git a/src/kits/package/Jamfile b/src/kits/package/Jamfile index ab7a44ed93..309951fad7 100644 --- a/src/kits/package/Jamfile +++ b/src/kits/package/Jamfile @@ -55,6 +55,7 @@ SharedLibrary libpackage.so Job.cpp JobQueue.cpp PackageInfo.cpp + PackageInfoSet.cpp PackageResolvable.cpp PackageResolvableExpression.cpp PackageRoster.cpp diff --git a/src/kits/package/PackageInfoSet.cpp b/src/kits/package/PackageInfoSet.cpp new file mode 100644 index 0000000000..315cedcd92 --- /dev/null +++ b/src/kits/package/PackageInfoSet.cpp @@ -0,0 +1,241 @@ +/* + * Copyright 2011, Haiku, Inc. All Rights Reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Oliver Tappe + * Ingo Weinhold + */ + + +#include + +#include + +#include + +#include + + +namespace BPackageKit { + + +// #pragma mark - PackageInfo + + +struct BPackageInfoSet::PackageInfo : public BPackageInfo { + PackageInfo* hashNext; + PackageInfo* listNext; + + PackageInfo(const BPackageInfo& other) + : + BPackageInfo(other), + listNext(NULL) + { + } +}; + + +// #pragma mark - PackageInfoHashDefinition + + +struct BPackageInfoSet::PackageInfoHashDefinition { + typedef const char* KeyType; + typedef PackageInfo ValueType; + + size_t HashKey(const char* key) const + { + return BString::HashValue(key); + } + + size_t Hash(const PackageInfo* value) const + { + return value->Name().HashValue(); + } + + bool Compare(const char* key, const PackageInfo* value) const + { + return value->Name() == key; + } + + PackageInfo*& GetLink(PackageInfo* value) const + { + return value->hashNext; + } +}; + + +// #pragma mark - PackageMap + + +struct BPackageInfoSet::PackageMap + : public BOpenHashTable { + + PackageMap() + : + fCount(0) + { + } + + ~PackageMap() + { + PackageInfo* info = Clear(true); + while (info != NULL) { + PackageInfo* next = info->hashNext; + delete info; + info = next; + } + } + + void AddPackageInfo(PackageInfo* info) + { + if (PackageInfo* oldInfo = Lookup(info->Name())) { + info->listNext = oldInfo->listNext; + oldInfo->listNext = info; + } else + Insert(info); + + fCount++; + } + + uint32 CountPackageInfos() const + { + return fCount; + } + +private: + uint32 fCount; +}; + + +// #pragma mark - Iterator + + +BPackageInfoSet::Iterator::Iterator() + : + fSet(NULL), + fNextInfo(NULL) +{ +} + + +BPackageInfoSet::Iterator::Iterator(const BPackageInfoSet* set) + : + fSet(set), + fNextInfo(fSet->fPackageMap->GetIterator().Next()) +{ +} + +bool +BPackageInfoSet::Iterator::HasNext() const +{ + return fNextInfo != NULL; +} + + +const BPackageInfo* +BPackageInfoSet::Iterator::Next() +{ + BPackageInfo* result = fNextInfo; + + if (fNextInfo != NULL) { + if (fNextInfo->listNext != NULL) { + // get next in list + fNextInfo = fNextInfo->listNext; + } else { + // get next in hash table + PackageMap::Iterator iterator + = fSet->fPackageMap->GetIterator(fNextInfo->Name()); + iterator.Next(); + fNextInfo = iterator.Next(); + } + } + + return result; +} + + +// #pragma mark - BPackageInfoSet + + +BPackageInfoSet::BPackageInfoSet() + : + fPackageMap(new(std::nothrow) PackageMap) +{ +} + + +BPackageInfoSet::~BPackageInfoSet() +{ + MakeEmpty(); + delete fPackageMap; +} + + +status_t +BPackageInfoSet::Init() +{ + return fPackageMap->Init(); +} + + +status_t +BPackageInfoSet::AddInfo(const BPackageInfo& _info) +{ + if (fPackageMap == NULL) + return B_NO_INIT; + + PackageInfo* info = new(std::nothrow) PackageInfo(_info); + if (info == NULL) + return B_NO_MEMORY; + + status_t error = info->InitCheck(); + if (error != B_OK) { + delete info; + return error; + } + + if (PackageInfo* oldInfo = fPackageMap->Lookup(info->Name())) { + // TODO: Check duplicates? + info->listNext = oldInfo->listNext; + oldInfo->listNext = info; + } else + fPackageMap->Insert(info); + + return B_OK; +} + + +void +BPackageInfoSet::MakeEmpty() +{ + if (fPackageMap == NULL) + return; + + PackageInfo* info = fPackageMap->Clear(true); + while (info != NULL) { + PackageInfo* next = info->hashNext; + delete info; + info = next; + } +} + + +uint32 +BPackageInfoSet::CountInfos() const +{ + if (fPackageMap == NULL) + return 0; + + return fPackageMap->CountPackageInfos(); +} + + +BPackageInfoSet::Iterator +BPackageInfoSet::GetIterator() const +{ + return Iterator(this); +} + + +} // namespace BPackageKit diff --git a/src/kits/package/RepositoryCache.cpp b/src/kits/package/RepositoryCache.cpp index 811839c675..d6f5b2759b 100644 --- a/src/kits/package/RepositoryCache.cpp +++ b/src/kits/package/RepositoryCache.cpp @@ -18,13 +18,10 @@ #include #include -#include - #include #include #include #include -#include #include #include @@ -32,107 +29,18 @@ namespace BPackageKit { -using BPrivate::HashableString; using namespace BHPKG; -// #pragma mark - PackageInfo - - -struct BRepositoryCache::PackageInfo : public BPackageInfo { - PackageInfo* hashNext; - PackageInfo* listNext; - - PackageInfo(const BPackageInfo& other) - : - BPackageInfo(other), - listNext(NULL) - { - } -}; - - -// #pragma mark - PackageInfoHashDefinition - - -struct BRepositoryCache::PackageInfoHashDefinition { - typedef const char* KeyType; - typedef PackageInfo ValueType; - - size_t HashKey(const char* key) const - { - return BString::HashValue(key); - } - - size_t Hash(const PackageInfo* value) const - { - return value->Name().HashValue(); - } - - bool Compare(const char* key, const PackageInfo* value) const - { - return value->Name() == key; - } - - PackageInfo*& GetLink(PackageInfo* value) const - { - return value->hashNext; - } -}; - - -// #pragma mark - PackageMap - - -struct BRepositoryCache::PackageMap - : public BOpenHashTable { - - PackageMap() - : - fCount(0) - { - } - - ~PackageMap() - { - PackageInfo* info = Clear(true); - while (info != NULL) { - PackageInfo* next = info->hashNext; - delete info; - info = next; - } - } - - void AddPackageInfo(PackageInfo* info) - { - if (PackageInfo* oldInfo = Lookup(info->Name())) { - info->listNext = oldInfo->listNext; - oldInfo->listNext = info; - } else - Insert(info); - - fCount++; - } - - uint32 CountPackageInfos() const - { - return fCount; - } - -private: - uint32 fCount; -}; - - // #pragma mark - RepositoryContentHandler struct BRepositoryCache::RepositoryContentHandler : BRepositoryContentHandler { RepositoryContentHandler(BRepositoryInfo* repositoryInfo, - PackageMap* packageMap) + BPackageInfoSet& packages) : fRepositoryInfo(repositoryInfo), - fPackageMap(packageMap) + fPackages(packages) { } @@ -240,21 +148,9 @@ struct BRepositoryCache::RepositoryContentHandler : BRepositoryContentHandler { if (result != B_OK) return result; - PackageInfo* info = new(std::nothrow) PackageInfo(fPackageInfo); - if (info == NULL) - return B_NO_MEMORY; - - result = info->InitCheck(); - if (result != B_OK) { - delete info; + result = fPackages.AddInfo(fPackageInfo); + if (result != B_OK) return result; - } - - if (PackageInfo* oldInfo = fPackageMap->Lookup(info->Name())) { - info->listNext = oldInfo->listNext; - oldInfo->listNext = info; - } else - fPackageMap->Insert(info); fPackageInfo.Clear(); break; @@ -281,7 +177,7 @@ struct BRepositoryCache::RepositoryContentHandler : BRepositoryContentHandler { private: BRepositoryInfo* fRepositoryInfo; BPackageInfo fPackageInfo; - PackageMap* fPackageMap; + BPackageInfoSet& fPackages; }; @@ -296,67 +192,19 @@ class BRepositoryCache::StandardErrorOutput : public BErrorOutput { }; -// #pragma mark - Iterator - - -BRepositoryCache::Iterator::Iterator() - : - fCache(NULL), - fNextInfo(NULL) -{ -} - - -BRepositoryCache::Iterator::Iterator(const BRepositoryCache* cache) - : - fCache(cache), - fNextInfo(fCache->fPackageMap->GetIterator().Next()) -{ -} - -bool -BRepositoryCache::Iterator::HasNext() const -{ - return fNextInfo != NULL; -} - - -const BPackageInfo* -BRepositoryCache::Iterator::Next() -{ - BPackageInfo* result = fNextInfo; - - if (fNextInfo != NULL) { - if (fNextInfo->listNext != NULL) { - // get next in list - fNextInfo = fNextInfo->listNext; - } else { - // get next in hash table - PackageMap::Iterator iterator - = fCache->fPackageMap->GetIterator(fNextInfo->Name()); - iterator.Next(); - fNextInfo = iterator.Next(); - } - } - - return result; -} - - // #pragma mark - BRepositoryCache BRepositoryCache::BRepositoryCache() : fIsUserSpecific(false), - fPackageMap(NULL) + fPackages() { } BRepositoryCache::~BRepositoryCache() { - delete fPackageMap; } @@ -392,19 +240,11 @@ status_t BRepositoryCache::SetTo(const BEntry& entry) { // unset - if (fPackageMap != NULL) { - delete fPackageMap; - fPackageMap = NULL; - } - + fPackages.MakeEmpty(); fEntry.Unset(); - // create the package map - fPackageMap = new (std::nothrow) PackageMap; - if (fPackageMap == NULL) - return B_NO_MEMORY; - - status_t result = fPackageMap->Init(); + // init package info set + status_t result = fPackages.Init(); if (result != B_OK) return result; @@ -421,7 +261,7 @@ BRepositoryCache::SetTo(const BEntry& entry) if ((result = repositoryReader.Init(repositoryCachePath.Path())) != B_OK) return result; - RepositoryContentHandler handler(&fInfo, fPackageMap); + RepositoryContentHandler handler(&fInfo, fPackages); if ((result = repositoryReader.ParseContent(&handler)) != B_OK) return result; @@ -439,17 +279,14 @@ BRepositoryCache::SetTo(const BEntry& entry) uint32 BRepositoryCache::CountPackages() const { - if (fPackageMap == NULL) - return 0; - - return fPackageMap->CountPackageInfos(); + return fPackages.CountInfos(); } BRepositoryCache::Iterator BRepositoryCache::GetIterator() const { - return Iterator(this); + return fPackages.GetIterator(); }