X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdirectorycollection.h;h=cbaffd65532d048735edabaef6610533ced96c01;hb=495920e971324d29bd4933b8a319fb5668ca5562;hp=93f93545b589708f312fce6d87c1330de8f79ac3;hpb=a4091f14dfbf4d5f822fa26740a7b3f305c449e6;p=libs%2Fdatafile.git diff --git a/source/directorycollection.h b/source/directorycollection.h index 93f9354..cbaffd6 100644 --- a/source/directorycollection.h +++ b/source/directorycollection.h @@ -13,6 +13,9 @@ A Collection that can automatically load items from files in a directory. class DirectoryCollection: public Collection { private: + template::value> + class ItemLoader; + std::list dirs; public: @@ -22,6 +25,10 @@ protected: void set_directory(const FS::Path &); void add_directory(const FS::Path &); + /** Examines the names of files in the designated directories and adds any + applicable ones as future objects. */ + void load_names(); + template CollectionItemType &add_type() { @@ -36,16 +43,38 @@ private: if(lookup_file(name, file)) { RefPtr item = new T; - load(*item, file.str()); + ItemLoader ldr(*item, *this); + IO::BufferedFile in(file.str()); + Parser parser(in, file.str()); + ldr.load(parser); return item.release(); } else return 0; } +protected: bool lookup_file(const std::string &, FS::Path &) const; }; +template +class DirectoryCollection::ItemLoader: public T::Loader +{ +public: + ItemLoader(T &o, Collection &): + T::Loader(o) + { } +}; + +template +class DirectoryCollection::ItemLoader: public T::Loader +{ +public: + ItemLoader(T &o, Collection &c): + T::Loader(o, dynamic_cast(c)) + { } +}; + } // namespace DataFile } // namespace Msp