--- /dev/null
+// ANNA - Anna is Not Nothingness Anymore //
+// //
+// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
+// //
+// See project site at http://redmine.teslayout.com/projects/anna-suite //
+// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
+
+
+#ifndef dbos_workdir_filesystem_Abstract_hpp
+#define dbos_workdir_filesystem_Abstract_hpp
+
+#include <vector>
+#include <string>
+
+#include <anna/core/util/ExclusiveHash.hpp>
+
+namespace workdir {
+
+namespace filesystem {
+
+using namespace anna;
+
+class Abstract {
+public:
+ struct ClassType { enum _v { Directory, File }; };
+
+ typedef std::vector <Abstract*> child_container;
+ typedef child_container::iterator child_iterator;
+ typedef child_container::const_iterator const_child_iterator;
+
+ virtual ~Abstract ();
+
+ Abstract* getParent () const throw () { return a_parent; }
+ ClassType::_v getClassType () const throw () { return a_classType; }
+ const std::string& getName () const throw () { return a_name; }
+ const std::string& getPath () const throw () { return a_path; }
+
+ int child_size () const throw () { return a_children.size (); }
+
+ child_iterator child_begin () throw () { return a_children.begin (); }
+ child_iterator child_end () throw () { return a_children.end (); }
+ static Abstract* child (child_iterator ii) throw () { return *ii; }
+
+ const_child_iterator child_begin () const throw () { return a_children.begin (); }
+ const_child_iterator child_end () const throw () { return a_children.end (); }
+ static const Abstract* child (const_child_iterator ii) throw () { return *ii; }
+
+ static std::string calculePath (const Abstract* parent, const std::string& shortPath) throw ();
+
+ virtual void print (const int level) const throw () = 0;
+
+protected:
+ Abstract (const ClassType::_v, const std::string& name);
+ Abstract (const ClassType::_v, Abstract* parent, const std::string& name);
+
+private:
+ const ClassType::_v a_classType;
+ Abstract* a_parent;
+ const std::string a_name;
+ std::string a_path;
+ child_container a_children;
+
+ Abstract (const Abstract&);
+};
+
+}
+}
+
+#endif