mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-08-03 17:26:08 -04:00
205 lines
4.5 KiB
C++
205 lines
4.5 KiB
C++
//=======================================================================
|
|
// Copyright Baptiste Wicht 2013-2018.
|
|
// Distributed under the terms of the MIT License.
|
|
// (See accompanying file LICENSE or copy at
|
|
// http://www.opensource.org/licenses/MIT)
|
|
//=======================================================================
|
|
|
|
#ifndef VFS_PATH_H
|
|
#define VFS_PATH_H
|
|
|
|
#include <vector.hpp>
|
|
#include <string.hpp>
|
|
|
|
/*!
|
|
* \brief Structure to represent a path on the file system
|
|
*/
|
|
struct path {
|
|
typedef std::vector<std::string>::const_iterator iterator; ///< The type of iterator
|
|
|
|
/*!
|
|
* \brief Construct an empty path.
|
|
*
|
|
* Such path is invalid
|
|
*/
|
|
path();
|
|
|
|
/*!
|
|
* \brief Construct a path from a string
|
|
*/
|
|
path(const char* path);
|
|
|
|
/*!
|
|
* \brief Construct a path from a string
|
|
*/
|
|
path(const std::string& path);
|
|
|
|
/*!
|
|
* \brief Construct a path by concatenating a base path and a string path
|
|
*/
|
|
path(const path& base_path, const char* path);
|
|
|
|
/*!
|
|
* \brief Construct a path by concatenating a base path and a string path
|
|
*/
|
|
path(const path& base_path, const std::string& path);
|
|
|
|
/*!
|
|
* \brief Construct a path by concatenating a base path and a second path
|
|
*/
|
|
path(const path& base_path, const path& p);
|
|
|
|
path(const path&) = default;
|
|
path(path&&) = default;
|
|
|
|
path& operator=(const path&) = default;
|
|
path& operator=(path&&) = default;
|
|
|
|
// Conversion functions
|
|
|
|
/*!
|
|
* \brief Returns a string representation of the path
|
|
*/
|
|
std::string string() const;
|
|
|
|
/*!
|
|
* \brief Returns a reference to the internal representation of the path
|
|
*/
|
|
const std::vector<std::string>& vec() const;
|
|
|
|
// Modifiers
|
|
|
|
/*
|
|
* \brief Makes the path invalid
|
|
*/
|
|
void invalidate();
|
|
|
|
// Accessors
|
|
|
|
/*!
|
|
* \brief Returns true if the path is empty.
|
|
*
|
|
* Such a path will be invalid
|
|
*/
|
|
bool empty() const;
|
|
|
|
/*!
|
|
* \brief Returns true if the path points to the root directory, false
|
|
* otherwise
|
|
*/
|
|
bool is_root() const;
|
|
|
|
/*!
|
|
* \brief Returns true if the path is valid, false otherwise
|
|
*/
|
|
bool is_valid() const;
|
|
|
|
/*!
|
|
* \brief Returns true if the path is absolute and has only 2 components.
|
|
*/
|
|
bool is_sub_root() const;
|
|
|
|
/*!
|
|
* \brief Returns the number of elements of the path
|
|
*/
|
|
size_t size() const;
|
|
|
|
/*!
|
|
* \brief Returns the base name (the last part)
|
|
*/
|
|
std::string base_name() const;
|
|
|
|
/*!
|
|
* \brief Returns the root name (the first part)
|
|
*/
|
|
std::string root_name() const;
|
|
|
|
/*!
|
|
* \brief Returns the sub root name (the second part)
|
|
*/
|
|
std::string sub_root_name() const;
|
|
|
|
/*!
|
|
* \brief Returns true if the path is absoluate, false otherwise
|
|
*/
|
|
bool is_absolute() const;
|
|
|
|
/*!
|
|
* \brief Returns true if the path is relaative, false otherwise
|
|
*/
|
|
bool is_relative() const;
|
|
|
|
// Accessors to sub parts
|
|
|
|
/*!
|
|
* \brief Returns the ith part of the path
|
|
*/
|
|
const std::string& name(size_t i) const;
|
|
|
|
/*!
|
|
* \brief Returns the ith part of the path
|
|
*/
|
|
const std::string& operator[](size_t i) const;
|
|
|
|
// Decomposition functions
|
|
|
|
/*!
|
|
* \brief Returns the path minus the i first elements
|
|
*/
|
|
path sub_path(size_t i) const;
|
|
|
|
/*!
|
|
* \brief Returns the path minus the last element
|
|
*/
|
|
path branch_path() const;
|
|
|
|
// Iterators
|
|
|
|
/*!
|
|
* \brief Returns an iterator poiting to the first element.
|
|
*/
|
|
iterator begin() const ;
|
|
|
|
/*!
|
|
* \brief Returns an iterator poiting past the end element.
|
|
*/
|
|
iterator end() const ;
|
|
|
|
// relational operators
|
|
|
|
/*!
|
|
* \brief Returns true if the two paths are equivalent
|
|
*/
|
|
bool operator==(const path& p) const;
|
|
|
|
/*!
|
|
* \brief Returns true if the two paths are not equivalent
|
|
*/
|
|
bool operator!=(const path& p) const;
|
|
|
|
private:
|
|
std::vector<std::string> names;
|
|
};
|
|
|
|
/*!
|
|
* \brief Form a new path by concatenation of both paths
|
|
*/
|
|
path operator/(const path& lhs, const path& rhs);
|
|
|
|
/*!
|
|
* \brief Form a new path by concatenation of a path and a string.
|
|
*/
|
|
path operator/(const path& lhs, const std::string& rhs);
|
|
|
|
/*!
|
|
* \brief Form a new path by concatenation of a path and a string.
|
|
*/
|
|
path operator/(const path& lhs, const char* rhs);
|
|
|
|
/*!
|
|
* \brief Form a new path by concatenation of a string and a path.
|
|
*/
|
|
path operator/(const std::string& lhs, const path& rhs);
|
|
|
|
#endif
|