From: Mikko Rasa Date: Fri, 4 Jan 2013 17:29:58 +0000 (+0200) Subject: Add a method to filter the files loaded from a pack X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=835fcd2f79e8848fa0d92be667c0e02952e23436;p=libs%2Fdatafile.git Add a method to filter the files loaded from a pack --- diff --git a/source/packsource.cpp b/source/packsource.cpp index c06b270..d054e1d 100644 --- a/source/packsource.cpp +++ b/source/packsource.cpp @@ -1,4 +1,5 @@ #include +#include #include "collection.h" #include "packsource.h" @@ -9,11 +10,26 @@ namespace DataFile { void PackSource::add_pack_file(const string &fn) { - packs.push_back(Pack(fn)); - Pack &pack = packs.back(); - DataFile::load(pack, fn); + add_pack_file(fn, string()); +} + +void PackSource::add_pack_file(const string &fn, const string &filter) +{ + Pack *pack = 0; + for(list::iterator i=packs.begin(); (!pack && i!=packs.end()); ++i) + if(i->get_filename()==fn) + pack = &*i; + if(!pack) + { + packs.push_back(Pack(fn)); + pack = &packs.back(); + DataFile::load(*pack, fn); + } - pack.collect_objects(objects); + FileMap pack_files; + pack->collect_files(pack_files, filter); + for(FileMap::const_iterator i=pack_files.begin(); i!=pack_files.end(); ++i) + i->second->collect_objects(objects); } bool PackSource::is_loadable(const CollectionItemTypeBase &type, const string &name) const @@ -76,10 +92,20 @@ PackSource::Pack::Pack(const string &fn): base_offset(0) { } -void PackSource::Pack::collect_objects(ObjectMap &objs) const +void PackSource::Pack::collect_files(FileMap &fm, const string &filter) const { - for(list::const_iterator i=files.begin(); i!=files.end(); ++i) - i->collect_objects(objs); + if(filter.empty()) + { + for(list::const_iterator i=files.begin(); i!=files.end(); ++i) + fm[i->get_filename()] = &*i; + } + else + { + Regex re(filter); + for(list::const_iterator i=files.begin(); i!=files.end(); ++i) + if(re.match(i->get_filename())) + fm[i->get_filename()] = &*i; + } } diff --git a/source/packsource.h b/source/packsource.h index e2c84a0..f552d2a 100644 --- a/source/packsource.h +++ b/source/packsource.h @@ -25,6 +25,7 @@ private: class File; struct Object; + typedef std::map FileMap; typedef std::map ObjectMap; class Pack @@ -49,7 +50,7 @@ private: const std::string &get_filename() const { return filename; } unsigned get_base_offset() const { return base_offset; } - void collect_objects(ObjectMap &) const; + void collect_files(FileMap &, const std::string &) const; }; class File @@ -109,6 +110,9 @@ public: /// Adds a pack file to load objects from. The index is read immediately. void add_pack_file(const std::string &); + /** Adds a pack file with a regex to filter logical files. The index is + read on the first call; subsequent calls will use cached data. */ + void add_pack_file(const std::string &, const std::string &); virtual bool is_loadable(const CollectionItemTypeBase &, const std::string &) const; virtual NameList get_names(const CollectionItemTypeBase &) const;