// TODO : // // - Consider using vector instead of list's #include using namespace std; #ifndef __make_dep__ #include #endif #include "dirs_core.h" #ifndef _dirs_h_ #define _dirs_h_ class Dirc; //forward declaration class Filec; typedef list DirList; typedef list::iterator Diriter; typedef list::const_iterator CDiriter; typedef list FileList; typedef list::iterator Filiter; typedef list::const_iterator CFiliter; typedef list::iterator Siter; typedef list::const_iterator CSiter; class Filec { public: Filec(const string& fname, Dirc* dir) : name(fname), dirp(dir) { }; const string& fname() const { return name; } string full_path() const; private: string name; // filename Dirc* dirp; // directory this file belongs to }; class Dirc { public: Dirc(const string& fname, int lvl=0, Dirc* parentp=0) : name(fname), parent(parentp), depth(lvl) { read_dir(fname); } // Dirc(const string&, Dirc*, int); // Dirc(const string& fname) : parent(0), name(fname), depth(0) { // read_dir(fname); } const list& all_subdirs() const { return subdirs; } const list& all_loc_files() const { return files; } const list& all_loc_links() const { return links; } list all_files() const; //string full_path(const string& ) const; string full_path() const; private: void read_dir(const string&); string name; //dirname Dirc* parent; //parent directory int depth; list subdirs; list files; list links; }; class SearchBlock : public Dirc { public: SearchBlock(const string& fname, int depth=0) : Dirc(fname, depth) { allfiles = all_files(); } list find_file(const string&) const; list find_file(bool (*f)(const string&)) const; list fc_find_file(const string&) const; list fc_find_file(bool (*f)(const string&)) const; list ret_all_files() { return allfiles; } private: list allfiles; }; //maybe crappy performance (should be checked :) template list operator+(const list& ld1, const list& ld2) { list result=ld1; for(typename list::const_iterator i = ld2.begin(); i != ld2.end(); i++) result.push_back(*i); return result; } #endif