Filesystem abstraction prototype - path declaration

This commit is contained in:
Emmanuel BENOîT 2017-12-25 23:30:02 +01:00
parent 3e838627dc
commit 0ae69daf05

121
p-filesystem.hh Normal file
View file

@ -0,0 +1,121 @@
/******************************************************************************/
/* FILESYSTEM ABSTRACTION *****************************************************/
/******************************************************************************/
#ifndef _H_EBCL_FILESYSTEM
#define _H_EBCL_FILESYSTEM
#include <ebcl/Strings.hh>
#include <ebcl/Utilities.hh>
namespace ebcl {
/*= FILESYSTEM PATH ==========================================================*/
class T_FSPath
{
public:
using T_Components = T_AutoArray< T_String , 16 >;
private:
// Root will be '/' on Unix, or a drive letter on Windows. Relative
// paths will have a blank root.
T_String root_;
T_Components components_;
bool valid_;
public:
//----------------------------------------------------------------------
// Helpers
static bool IsValidComponent( T_String const& string ) noexcept;
static bool IsValidRoot( T_String const& string ) noexcept;
//----------------------------------------------------------------------
// Basic constructors and assignment operators
T_FSPath( ) noexcept;
T_FSPath( T_FSPath const& other ) noexcept;
T_FSPath& operator =( T_FSPath const& other ) noexcept;
T_FSPath( T_FSPath&& other ) noexcept;
T_FSPath& operator =( T_FSPath&& other ) noexcept;
T_FSPath& swap( T_FSPath& other ) noexcept;
// Construct from a string
T_FSPath( T_String const& path ) noexcept;
//----------------------------------------------------------------------
bool isValid( ) const noexcept;
T_String const& root( ) const noexcept;
T_Components const& components( ) const noexcept;
// FIXME: provide iterators for the components
bool isRelative( ) const noexcept;
bool isAbsolute( ) const noexcept;
//----------------------------------------------------------------------
// Convert the path into a string
T_String toString( ) const noexcept;
// Compute a hash value for the path
uint32_t computeHash( ) const noexcept;
// Append to a string builder
void appendTo( T_StringBuilder& sb ) const noexcept;
// Equality operators. On Windows the comparison will be
// case-insensitive.
bool operator ==( T_FSPath const& other ) const noexcept;
bool operator !=( T_FSPath const& other ) const noexcept;
//----------------------------------------------------------------------
// Returns the parent's path
T_FSPath parent( ) const noexcept;
// Returns the child's path
T_FSPath child( T_String const& name ) const noexcept;
// Appends the specified (relative) path to the current path and return
// the result. If the path is absolute, the result will be invalid.
T_FSPath operator +( T_FSPath const& other ) const noexcept;
// Checks if the current path and the specified path have the same
// parent and are different.
bool inDirectoryOf( T_FSPath const& other ) const noexcept;
// Checks if the current path is the direct parent of the specified path
bool isParentOf( T_FSPath const& other ) const noexcept;
// Checks if the current path is the direct child of the specified path
bool isChildOf( T_FSPath const& other ) const noexcept;
// Checks if the current path is a parent of the specified path
bool isAbove( T_FSPath const& other ) const noexcept;
// Checks if the current path is a child of the specified path
bool isUnder( T_FSPath const& other ) const noexcept;
//----------------------------------------------------------------------
// Checks whether the specified path is canonical
bool isCanonical( ) const noexcept;
// Return a canonical path from the current path
T_FSPath canonical( ) const noexcept;
};
M_DECLARE_SWAP( T_FSPath );
M_DECLARE_HASH( T_FSPath );
M_LSHIFT_OP( T_StringBuilder , T_FSPath );
/*= T_FSPath =================================================================*/
// FIXME: inline stuff should be moved
} // namespace ebcl
#endif // _H_EBCL_FILESYSTEM