NOW I do it right: #woxblox#
[divverent/netradiant.git] / libs / fs_path.h
1 /*
2 Copyright (C) 2001-2006, William Joseph.
3 All Rights Reserved.
4
5 This file is part of GtkRadiant.
6
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21
22 #if !defined(INCLUDED_FS_PATH_H)
23 #define INCLUDED_FS_PATH_H
24
25 #include "stream/stringstream.h"
26
27 /// \brief A unix-style path string which can be modified at runtime.
28 ///
29 /// - Maintains a path ending in a path-separator.
30 /// - Provides a limited STL-style interface to push and pop file or directory names at the end of the path.
31 class UnixPath
32 {
33   StringBuffer m_string;
34
35   void check_separator()
36   {
37     if(!empty() && m_string.back() != '/')
38     {
39       m_string.push_back('/');
40     }
41   }
42
43 public:
44   /// \brief Constructs with the directory \p root.
45   UnixPath(const char* root)
46     : m_string(root)
47   {
48     check_separator();
49   }
50
51   bool empty() const
52   {
53     return m_string.empty();
54   }
55
56   const char* c_str() const
57   {
58     return m_string.c_str();
59   }
60
61   /// \brief Appends the directory \p name.
62   void push(const char* name)
63   {
64     m_string.push_string(name);
65     check_separator();
66   }
67   /// \brief Appends the directory [\p first, \p last).
68   void push(const char* first, const char* last)
69   {
70     m_string.push_range(first, last);
71     check_separator();
72   }
73   /// \brief Appends the filename \p name.
74   void push_filename(const char* name)
75   {
76     m_string.push_string(name);
77   }
78   /// \brief Removes the last directory or filename appended.
79   void pop()
80   {
81     if(m_string.back() == '/')
82     {
83       m_string.pop_back();
84     }
85     while(!empty() && m_string.back() != '/')
86     {
87       m_string.pop_back();
88     }
89   }
90 };
91
92 #endif