1 // Filesystem declarations -*- C++ -*-
3 // Copyright (C) 2014-2015 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
25 /** @file experimental/fs_fwd.h
26 * This is an internal header file, included by other library headers.
27 * Do not attempt to use it directly. @headername{experimental/filesystem}
30 #ifndef _GLIBCXX_EXPERIMENTAL_FS_FWD_H
31 #define _GLIBCXX_EXPERIMENTAL_FS_FWD_H 1
33 #if __cplusplus < 201103L
34 # include <bits/c++0x_warning.h>
37 #include <system_error>
41 namespace std _GLIBCXX_VISIBILITY(default)
43 namespace experimental
49 _GLIBCXX_BEGIN_NAMESPACE_VERSION
51 #if _GLIBCXX_USE_CXX11_ABI
52 inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { }
56 * @defgroup filesystem Filesystem
57 * @ingroup experimental
59 * Utilities for performing operations on file systems and their components,
60 * such as paths, regular files, and directories.
66 _GLIBCXX_BEGIN_NAMESPACE_CXX11
68 class filesystem_error;
69 class directory_entry;
70 class directory_iterator;
71 class recursive_directory_iterator;
72 _GLIBCXX_END_NAMESPACE_CXX11
81 enum class file_type : signed char {
82 none = 0, not_found = -1, regular = 1, directory = 2, symlink = 3,
83 block = 4, character = 5, fifo = 6, socket = 7, unknown = 8
87 enum class copy_options : unsigned short {
89 skip_existing = 1, overwrite_existing = 2, update_existing = 4,
91 copy_symlinks = 16, skip_symlinks = 32,
92 directories_only = 64, create_symlinks = 128, create_hard_links = 256
95 constexpr copy_options
96 operator&(copy_options __x, copy_options __y) noexcept
98 using __utype = typename std::underlying_type<copy_options>::type;
99 return static_cast<copy_options>(
100 static_cast<__utype>(__x) & static_cast<__utype>(__y));
103 constexpr copy_options
104 operator|(copy_options __x, copy_options __y) noexcept
106 using __utype = typename std::underlying_type<copy_options>::type;
107 return static_cast<copy_options>(
108 static_cast<__utype>(__x) | static_cast<__utype>(__y));
111 constexpr copy_options
112 operator^(copy_options __x, copy_options __y) noexcept
114 using __utype = typename std::underlying_type<copy_options>::type;
115 return static_cast<copy_options>(
116 static_cast<__utype>(__x) ^ static_cast<__utype>(__y));
119 constexpr copy_options
120 operator~(copy_options __x) noexcept
122 using __utype = typename std::underlying_type<copy_options>::type;
123 return static_cast<copy_options>(~static_cast<__utype>(__x));
127 operator&=(copy_options& __x, copy_options __y) noexcept
128 { return __x = __x & __y; }
131 operator|=(copy_options& __x, copy_options __y) noexcept
132 { return __x = __x | __y; }
135 operator^=(copy_options& __x, copy_options __y) noexcept
136 { return __x = __x ^ __y; }
140 enum class perms : unsigned {
161 remove_perms = 0x20000,
162 resolve_symlinks = 0x40000
166 operator&(perms __x, perms __y) noexcept
168 using __utype = typename std::underlying_type<perms>::type;
169 return static_cast<perms>(
170 static_cast<__utype>(__x) & static_cast<__utype>(__y));
174 operator|(perms __x, perms __y) noexcept
176 using __utype = typename std::underlying_type<perms>::type;
177 return static_cast<perms>(
178 static_cast<__utype>(__x) | static_cast<__utype>(__y));
182 operator^(perms __x, perms __y) noexcept
184 using __utype = typename std::underlying_type<perms>::type;
185 return static_cast<perms>(
186 static_cast<__utype>(__x) ^ static_cast<__utype>(__y));
190 operator~(perms __x) noexcept
192 using __utype = typename std::underlying_type<perms>::type;
193 return static_cast<perms>(~static_cast<__utype>(__x));
197 operator&=(perms& __x, perms __y) noexcept
198 { return __x = __x & __y; }
201 operator|=(perms& __x, perms __y) noexcept
202 { return __x = __x | __y; }
205 operator^=(perms& __x, perms __y) noexcept
206 { return __x = __x ^ __y; }
209 enum class directory_options : unsigned char {
210 none = 0, follow_directory_symlink = 1, skip_permission_denied = 2
213 constexpr directory_options
214 operator&(directory_options __x, directory_options __y) noexcept
216 using __utype = typename std::underlying_type<directory_options>::type;
217 return static_cast<directory_options>(
218 static_cast<__utype>(__x) & static_cast<__utype>(__y));
221 constexpr directory_options
222 operator|(directory_options __x, directory_options __y) noexcept
224 using __utype = typename std::underlying_type<directory_options>::type;
225 return static_cast<directory_options>(
226 static_cast<__utype>(__x) | static_cast<__utype>(__y));
229 constexpr directory_options
230 operator^(directory_options __x, directory_options __y) noexcept
232 using __utype = typename std::underlying_type<directory_options>::type;
233 return static_cast<directory_options>(
234 static_cast<__utype>(__x) ^ static_cast<__utype>(__y));
237 constexpr directory_options
238 operator~(directory_options __x) noexcept
240 using __utype = typename std::underlying_type<directory_options>::type;
241 return static_cast<directory_options>(~static_cast<__utype>(__x));
244 inline directory_options&
245 operator&=(directory_options& __x, directory_options __y) noexcept
246 { return __x = __x & __y; }
248 inline directory_options&
249 operator|=(directory_options& __x, directory_options __y) noexcept
250 { return __x = __x | __y; }
252 inline directory_options&
253 operator^=(directory_options& __x, directory_options __y) noexcept
254 { return __x = __x ^ __y; }
256 typedef chrono::time_point<chrono::system_clock> file_time_type;
258 // operational functions
260 void copy(const path& __from, const path& __to, copy_options __options);
261 void copy(const path& __from, const path& __to, copy_options __options,
262 error_code&) noexcept;
264 bool copy_file(const path& __from, const path& __to, copy_options __option);
265 bool copy_file(const path& __from, const path& __to, copy_options __option,
266 error_code&) noexcept;
270 file_status status(const path&);
271 file_status status(const path&, error_code&) noexcept;
273 bool status_known(file_status) noexcept;
275 file_status symlink_status(const path&);
276 file_status symlink_status(const path&, error_code&) noexcept;
278 bool is_regular_file(file_status) noexcept;
279 bool is_symlink(file_status) noexcept;
281 // @} group filesystem
282 _GLIBCXX_END_NAMESPACE_VERSION
284 } // namespace filesystem
285 } // namespace experimental
290 #endif // _GLIBCXX_EXPERIMENTAL_FS_FWD_H