Mercurial > code
diff C++/modules/Directory/Directory.h @ 334:0b576ee64d45
* Create brand new hierarchy
* Rename DynLib to Dynlib
* Remove some warnings
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 08 Mar 2015 14:26:33 +0100 |
parents | C++/Directory.h@24085fae3162 |
children | 83ef77841ff1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/C++/modules/Directory/Directory.h Sun Mar 08 14:26:33 2015 +0100 @@ -0,0 +1,131 @@ +/* + * Directory.h -- open and read directories + * + * Copyright (c) 2013, 2014 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _DIRECTORY_H_ +#define _DIRECTORY_H_ + +#include <cstddef> +#include <string> +#include <vector> + +/** + * @class Directory + * @brief class to manipulate directories + * + * This class allow the user to iterate directories in a for range based + * loop using iterators. + */ +class Directory { +public: + /** + * @enum Flags + * @brief optional flags to read directories + */ + enum Flags { + NotDot = (1 << 0), + NotDotDot = (1 << 1) + }; + + /** + * @enum Type + * @brief Describe the type of an entry + */ + enum Type { + Unknown = 0, + File, + Dir, + Link + }; + + /** + * @struct Entry + * @brief entry in the directory list + */ + struct Entry { + std::string name; //! name of entry (base name) + Type type; //! type of file + + Entry(); + + friend bool operator==(const Entry &e1, const Entry &e2); + }; + + using List = std::vector<Entry>; + + // C++ Container compatibility + using value_type = List::value_type; + using iterator = List::iterator; + using const_iterator = List::const_iterator; + +private: + List m_list; + + void systemLoad(const std::string &path, int flags); + +public: + /** + * Default constructor, does nothing. + */ + Directory(); + + /** + * Open a directory and read all its content. + * @param path the path + * @param flags the optional flags + */ + Directory(const std::string &path, int flags = 0); + + /** + * Return an iterator the beginning. + * + * @return the iterator + */ + List::iterator begin(); + + /** + * Return a const iterator the beginning. + * + * @return the iterator + */ + List::const_iterator cbegin() const; + + /** + * Return an iterator to past the end. + * + * @return the iterator + */ + List::iterator end(); + + /** + * Return a const iterator to past the end. + * + * @return the iterator + */ + List::const_iterator cend() const; + + /** + * Get the number of entries in the directory. + * + * @return the number + */ + int count() const; + + friend bool operator==(const Directory &d1, const Directory &d2); +}; + +#endif // !_DIRECTORY_H_