1 | // Filesystem declarations -*- C++ -*- |
2 | |
3 | // Copyright (C) 2014-2021 Free Software Foundation, Inc. |
4 | // |
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) |
9 | // any later version. |
10 | |
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. |
15 | |
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. |
19 | |
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/>. |
24 | |
25 | /** @file include/bits/fs_fwd.h |
26 | * This is an internal header file, included by other library headers. |
27 | * Do not attempt to use it directly. @headername{filesystem} |
28 | */ |
29 | |
30 | #ifndef _GLIBCXX_FS_FWD_H |
31 | #define _GLIBCXX_FS_FWD_H 1 |
32 | |
33 | #if __cplusplus >= 201703L |
34 | |
35 | #include <system_error> |
36 | #include <cstdint> |
37 | #include <chrono> |
38 | |
39 | namespace std _GLIBCXX_VISIBILITY(default) |
40 | { |
41 | _GLIBCXX_BEGIN_NAMESPACE_VERSION |
42 | |
43 | /// ISO C++ 2017 namespace for File System library |
44 | namespace filesystem |
45 | { |
46 | #if _GLIBCXX_USE_CXX11_ABI |
47 | /// @cond undocumented |
48 | inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11" ))) { } |
49 | /// @endcond |
50 | #endif |
51 | |
52 | /** @addtogroup filesystem |
53 | * @{ |
54 | */ |
55 | |
56 | class file_status; |
57 | _GLIBCXX_BEGIN_NAMESPACE_CXX11 |
58 | class path; |
59 | class filesystem_error; |
60 | class directory_entry; |
61 | class directory_iterator; |
62 | class recursive_directory_iterator; |
63 | _GLIBCXX_END_NAMESPACE_CXX11 |
64 | |
65 | /// Information about free space on a disk |
66 | struct space_info |
67 | { |
68 | uintmax_t capacity; |
69 | uintmax_t free; |
70 | uintmax_t available; |
71 | |
72 | #if __cpp_impl_three_way_comparison >= 201907L |
73 | friend bool operator==(const space_info&, const space_info&) = default; |
74 | #endif |
75 | }; |
76 | |
77 | /// Enumerated type representing the type of a file |
78 | enum class file_type : signed char { |
79 | none = 0, not_found = -1, regular = 1, directory = 2, symlink = 3, |
80 | block = 4, character = 5, fifo = 6, socket = 7, unknown = 8 |
81 | }; |
82 | |
83 | /// Bitmask type controlling effects of `filesystem::copy` |
84 | enum class copy_options : unsigned short { |
85 | none = 0, |
86 | skip_existing = 1, overwrite_existing = 2, update_existing = 4, |
87 | recursive = 8, |
88 | copy_symlinks = 16, skip_symlinks = 32, |
89 | directories_only = 64, create_symlinks = 128, create_hard_links = 256 |
90 | }; |
91 | |
92 | /// @{ |
93 | /// @relates copy_options |
94 | constexpr copy_options |
95 | operator&(copy_options __x, copy_options __y) noexcept |
96 | { |
97 | using __utype = typename std::underlying_type<copy_options>::type; |
98 | return static_cast<copy_options>( |
99 | static_cast<__utype>(__x) & static_cast<__utype>(__y)); |
100 | } |
101 | |
102 | constexpr copy_options |
103 | operator|(copy_options __x, copy_options __y) noexcept |
104 | { |
105 | using __utype = typename std::underlying_type<copy_options>::type; |
106 | return static_cast<copy_options>( |
107 | static_cast<__utype>(__x) | static_cast<__utype>(__y)); |
108 | } |
109 | |
110 | constexpr copy_options |
111 | operator^(copy_options __x, copy_options __y) noexcept |
112 | { |
113 | using __utype = typename std::underlying_type<copy_options>::type; |
114 | return static_cast<copy_options>( |
115 | static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); |
116 | } |
117 | |
118 | constexpr copy_options |
119 | operator~(copy_options __x) noexcept |
120 | { |
121 | using __utype = typename std::underlying_type<copy_options>::type; |
122 | return static_cast<copy_options>(~static_cast<__utype>(__x)); |
123 | } |
124 | |
125 | inline copy_options& |
126 | operator&=(copy_options& __x, copy_options __y) noexcept |
127 | { return __x = __x & __y; } |
128 | |
129 | inline copy_options& |
130 | operator|=(copy_options& __x, copy_options __y) noexcept |
131 | { return __x = __x | __y; } |
132 | |
133 | inline copy_options& |
134 | operator^=(copy_options& __x, copy_options __y) noexcept |
135 | { return __x = __x ^ __y; } |
136 | /// @} |
137 | |
138 | |
139 | /// Bitmask type representing file access permissions |
140 | enum class perms : unsigned { |
141 | none = 0, |
142 | owner_read = 0400, |
143 | owner_write = 0200, |
144 | owner_exec = 0100, |
145 | owner_all = 0700, |
146 | group_read = 040, |
147 | group_write = 020, |
148 | group_exec = 010, |
149 | group_all = 070, |
150 | others_read = 04, |
151 | others_write = 02, |
152 | others_exec = 01, |
153 | others_all = 07, |
154 | all = 0777, |
155 | set_uid = 04000, |
156 | set_gid = 02000, |
157 | sticky_bit = 01000, |
158 | mask = 07777, |
159 | unknown = 0xFFFF, |
160 | }; |
161 | |
162 | /// @{ |
163 | /// @relates perms |
164 | constexpr perms |
165 | operator&(perms __x, perms __y) noexcept |
166 | { |
167 | using __utype = typename std::underlying_type<perms>::type; |
168 | return static_cast<perms>( |
169 | static_cast<__utype>(__x) & static_cast<__utype>(__y)); |
170 | } |
171 | |
172 | constexpr perms |
173 | operator|(perms __x, perms __y) noexcept |
174 | { |
175 | using __utype = typename std::underlying_type<perms>::type; |
176 | return static_cast<perms>( |
177 | static_cast<__utype>(__x) | static_cast<__utype>(__y)); |
178 | } |
179 | |
180 | constexpr perms |
181 | operator^(perms __x, perms __y) noexcept |
182 | { |
183 | using __utype = typename std::underlying_type<perms>::type; |
184 | return static_cast<perms>( |
185 | static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); |
186 | } |
187 | |
188 | constexpr perms |
189 | operator~(perms __x) noexcept |
190 | { |
191 | using __utype = typename std::underlying_type<perms>::type; |
192 | return static_cast<perms>(~static_cast<__utype>(__x)); |
193 | } |
194 | |
195 | inline perms& |
196 | operator&=(perms& __x, perms __y) noexcept |
197 | { return __x = __x & __y; } |
198 | |
199 | inline perms& |
200 | operator|=(perms& __x, perms __y) noexcept |
201 | { return __x = __x | __y; } |
202 | |
203 | inline perms& |
204 | operator^=(perms& __x, perms __y) noexcept |
205 | { return __x = __x ^ __y; } |
206 | /// @} |
207 | |
208 | /// Bitmask type controlling changes to permissions |
209 | enum class perm_options : unsigned { |
210 | replace = 0x1, |
211 | add = 0x2, |
212 | remove = 0x4, |
213 | nofollow = 0x8 |
214 | }; |
215 | |
216 | /// @{ |
217 | /// @relates perm_options |
218 | constexpr perm_options |
219 | operator&(perm_options __x, perm_options __y) noexcept |
220 | { |
221 | using __utype = typename std::underlying_type<perm_options>::type; |
222 | return static_cast<perm_options>( |
223 | static_cast<__utype>(__x) & static_cast<__utype>(__y)); |
224 | } |
225 | |
226 | constexpr perm_options |
227 | operator|(perm_options __x, perm_options __y) noexcept |
228 | { |
229 | using __utype = typename std::underlying_type<perm_options>::type; |
230 | return static_cast<perm_options>( |
231 | static_cast<__utype>(__x) | static_cast<__utype>(__y)); |
232 | } |
233 | |
234 | constexpr perm_options |
235 | operator^(perm_options __x, perm_options __y) noexcept |
236 | { |
237 | using __utype = typename std::underlying_type<perm_options>::type; |
238 | return static_cast<perm_options>( |
239 | static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); |
240 | } |
241 | |
242 | constexpr perm_options |
243 | operator~(perm_options __x) noexcept |
244 | { |
245 | using __utype = typename std::underlying_type<perm_options>::type; |
246 | return static_cast<perm_options>(~static_cast<__utype>(__x)); |
247 | } |
248 | |
249 | inline perm_options& |
250 | operator&=(perm_options& __x, perm_options __y) noexcept |
251 | { return __x = __x & __y; } |
252 | |
253 | inline perm_options& |
254 | operator|=(perm_options& __x, perm_options __y) noexcept |
255 | { return __x = __x | __y; } |
256 | |
257 | inline perm_options& |
258 | operator^=(perm_options& __x, perm_options __y) noexcept |
259 | { return __x = __x ^ __y; } |
260 | /// @} |
261 | |
262 | /// Bitmask type controlling directory iteration |
263 | enum class directory_options : unsigned char { |
264 | none = 0, follow_directory_symlink = 1, skip_permission_denied = 2 |
265 | }; |
266 | |
267 | /// @{ |
268 | /// @relates directory_options |
269 | constexpr directory_options |
270 | operator&(directory_options __x, directory_options __y) noexcept |
271 | { |
272 | using __utype = typename std::underlying_type<directory_options>::type; |
273 | return static_cast<directory_options>( |
274 | static_cast<__utype>(__x) & static_cast<__utype>(__y)); |
275 | } |
276 | |
277 | constexpr directory_options |
278 | operator|(directory_options __x, directory_options __y) noexcept |
279 | { |
280 | using __utype = typename std::underlying_type<directory_options>::type; |
281 | return static_cast<directory_options>( |
282 | static_cast<__utype>(__x) | static_cast<__utype>(__y)); |
283 | } |
284 | |
285 | constexpr directory_options |
286 | operator^(directory_options __x, directory_options __y) noexcept |
287 | { |
288 | using __utype = typename std::underlying_type<directory_options>::type; |
289 | return static_cast<directory_options>( |
290 | static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); |
291 | } |
292 | |
293 | constexpr directory_options |
294 | operator~(directory_options __x) noexcept |
295 | { |
296 | using __utype = typename std::underlying_type<directory_options>::type; |
297 | return static_cast<directory_options>(~static_cast<__utype>(__x)); |
298 | } |
299 | |
300 | inline directory_options& |
301 | operator&=(directory_options& __x, directory_options __y) noexcept |
302 | { return __x = __x & __y; } |
303 | |
304 | inline directory_options& |
305 | operator|=(directory_options& __x, directory_options __y) noexcept |
306 | { return __x = __x | __y; } |
307 | |
308 | inline directory_options& |
309 | operator^=(directory_options& __x, directory_options __y) noexcept |
310 | { return __x = __x ^ __y; } |
311 | /// @} |
312 | |
313 | /// The type used for file timestamps |
314 | using file_time_type = __file_clock::time_point; |
315 | |
316 | // operational functions |
317 | |
318 | void copy(const path& __from, const path& __to, copy_options __options); |
319 | void copy(const path& __from, const path& __to, copy_options __options, |
320 | error_code&); |
321 | |
322 | bool copy_file(const path& __from, const path& __to, copy_options __option); |
323 | bool copy_file(const path& __from, const path& __to, copy_options __option, |
324 | error_code&); |
325 | |
326 | path current_path(); |
327 | |
328 | bool exists(file_status) noexcept; |
329 | |
330 | bool is_other(file_status) noexcept; |
331 | |
332 | uintmax_t file_size(const path&); |
333 | uintmax_t file_size(const path&, error_code&) noexcept; |
334 | uintmax_t hard_link_count(const path&); |
335 | uintmax_t hard_link_count(const path&, error_code&) noexcept; |
336 | file_time_type last_write_time(const path&); |
337 | file_time_type last_write_time(const path&, error_code&) noexcept; |
338 | |
339 | void permissions(const path&, perms, perm_options, error_code&) noexcept; |
340 | |
341 | path proximate(const path& __p, const path& __base, error_code& __ec); |
342 | path proximate(const path& __p, const path& __base, error_code& __ec); |
343 | |
344 | path relative(const path& __p, const path& __base, error_code& __ec); |
345 | |
346 | file_status status(const path&); |
347 | file_status status(const path&, error_code&) noexcept; |
348 | |
349 | bool status_known(file_status) noexcept; |
350 | |
351 | file_status symlink_status(const path&); |
352 | file_status symlink_status(const path&, error_code&) noexcept; |
353 | |
354 | bool is_regular_file(file_status) noexcept; |
355 | bool is_symlink(file_status) noexcept; |
356 | |
357 | /// @} |
358 | } // namespace filesystem |
359 | _GLIBCXX_END_NAMESPACE_VERSION |
360 | } // namespace std |
361 | #endif // C++17 |
362 | #endif // _GLIBCXX_FS_FWD_H |
363 | |