#if !defined( INCLUDED_FS_PATH_H ) #define INCLUDED_FS_PATH_H #include "stream/stringstream.h" /// \brief A unix-style path string which can be modified at runtime. /// /// - Maintains a path ending in a path-separator. /// - Provides a limited STL-style interface to push and pop file or directory names at the end of the path. class UnixPath { StringBuffer m_string; void check_separator(){ if ( !empty() && m_string.back() != '/' ) { m_string.push_back( '/' ); } } public: /// \brief Constructs with the directory \p root. UnixPath( const char* root ) : m_string( root ){ check_separator(); } bool empty() const { return m_string.empty(); } const char* c_str() const { return m_string.c_str(); } /// \brief Appends the directory \p name. void push( const char* name ){ m_string.push_string( name ); check_separator(); } /// \brief Appends the directory [\p first, \p last). void push( const char* first, const char* last ){ m_string.push_range( first, last ); check_separator(); } /// \brief Appends the filename \p name. void push_filename( const char* name ){ m_string.push_string( name ); } /// \brief Removes the last directory or filename appended. void pop(){ if ( m_string.back() == '/' ) { m_string.pop_back(); } while ( !empty() && m_string.back() != '/' ) { m_string.pop_back(); } } }; #endif