1#ifndef _DEFILEPATH_HPP
2#define _DEFILEPATH_HPP
3/*-------------------------------------------------------------------------
4 * drawElements C++ Base Library
5 * -----------------------------
6 *
7 * Copyright 2014 The Android Open Source Project
8 *
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
12 *
13 *      http://www.apache.org/licenses/LICENSE-2.0
14 *
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 *
21 *//*!
22 * \file
23 * \brief Filesystem path class.
24 *//*--------------------------------------------------------------------*/
25
26#include "deDefs.hpp"
27
28#include <string>
29#include <vector>
30
31namespace de
32{
33
34void FilePath_selfTest (void);
35
36class FilePath
37{
38public:
39	enum Type
40	{
41		TYPE_UNKNOWN	= 0,	/*!< Non-existent or unknown object.	*/
42		TYPE_FILE,				/*!< File.								*/
43		TYPE_DIRECTORY,			/*!< Directory.							*/
44
45		TYPE_LAST
46	};
47
48	static const std::string	separator;	/*!< Path separator.		*/
49
50						FilePath			(void);
51						FilePath			(const std::string& path);
52						FilePath			(const char* path);
53						FilePath			(const std::vector<std::string>& components);
54						~FilePath			(void);
55
56	bool				exists				(void) const;
57	Type				getType				(void) const;
58
59	const char*			getPath				(void) const;
60	std::string			getBaseName			(void) const;
61	std::string			getDirName			(void) const;
62	std::string			getFileExtension	(void) const;
63
64	static FilePath		join				(const FilePath& a, const FilePath& b);
65	FilePath&			join				(const FilePath& b);
66
67	static FilePath		normalize			(const FilePath& path);
68	FilePath&			normalize			(void);
69
70	void				split				(std::vector<std::string>& components) const;
71
72	bool				isAbsolutePath		(void) const;
73
74	static bool			isSeparator			(char c);
75
76private:
77	bool				isRootPath			(void) const;
78	bool				isWinNetPath		(void) const;
79	bool				beginsWithDrive		(void) const;
80
81	std::string			m_path;
82};
83
84// \todo [2012-09-05 pyry] Move to delibs?
85void	createDirectory				(const char* path);
86void	createDirectoryAndParents	(const char* path);
87
88inline FilePath::FilePath (void)
89{
90}
91
92inline FilePath::FilePath (const std::string& path)
93	: m_path(path)
94{
95}
96
97inline FilePath::FilePath (const char* path)
98	: m_path(path)
99{
100}
101
102inline FilePath::~FilePath ()
103{
104}
105
106inline FilePath& FilePath::join (const FilePath& b)
107{
108	if (m_path == "")
109		m_path = b.m_path;
110	else
111		m_path += separator + b.m_path;
112	return *this;
113}
114
115inline FilePath FilePath::join (const FilePath& a, const FilePath& b)
116{
117	return FilePath(a).join(b);
118}
119
120inline const char* FilePath::getPath (void) const
121{
122	return m_path.c_str();
123}
124
125inline bool FilePath::isSeparator (char c)
126{
127	return c == '/' || c == '\\';
128}
129
130inline bool FilePath::isRootPath (void) const
131{
132	return m_path.length() >= 1 && isSeparator(m_path[0]);
133}
134
135inline bool FilePath::isWinNetPath (void) const
136{
137	return m_path.length() >= 2 && isSeparator(m_path[0]) && isSeparator(m_path[1]);
138}
139
140} // de
141
142#endif // _DEFILEPATH_HPP
143