1// Filesystem declarations -*- C++ -*- 
2 
3// Copyright (C) 2014-2019 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 
39namespace std _GLIBCXX_VISIBILITY(default
40
41_GLIBCXX_BEGIN_NAMESPACE_VERSION 
42 
43namespace filesystem 
44
45#if _GLIBCXX_USE_CXX11_ABI 
46inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } 
47#endif 
48 
49 /** 
50 * @defgroup filesystem Filesystem 
51 * 
52 * Utilities for performing operations on file systems and their components, 
53 * such as paths, regular files, and directories. 
54 * 
55 * @{ 
56 */ 
57 
58 class file_status
59_GLIBCXX_BEGIN_NAMESPACE_CXX11 
60 class path
61 class filesystem_error
62 class directory_entry
63 class directory_iterator
64 class recursive_directory_iterator
65_GLIBCXX_END_NAMESPACE_CXX11 
66 
67 struct space_info 
68
69 uintmax_t capacity
70 uintmax_t free
71 uintmax_t available
72 }; 
73 
74 enum class file_type : signed char
75 none = 0, not_found = -1, regular = 1, directory = 2, symlink = 3
76 block = 4, character = 5, fifo = 6, socket = 7, unknown = 8 
77 }; 
78 
79 /// Bitmask type 
80 enum class copy_options : unsigned short
81 none = 0
82 skip_existing = 1, overwrite_existing = 2, update_existing = 4
83 recursive = 8
84 copy_symlinks = 16, skip_symlinks = 32
85 directories_only = 64, create_symlinks = 128, create_hard_links = 256 
86 }; 
87 
88 constexpr copy_options 
89 operator&(copy_options __x, copy_options __y) noexcept 
90
91 using __utype = typename std::underlying_type<copy_options>::type
92 return static_cast<copy_options>( 
93 static_cast<__utype>(__x) & static_cast<__utype>(__y)); 
94
95 
96 constexpr copy_options 
97 operator|(copy_options __x, copy_options __y) noexcept 
98
99 using __utype = typename std::underlying_type<copy_options>::type
100 return static_cast<copy_options>( 
101 static_cast<__utype>(__x) | static_cast<__utype>(__y)); 
102
103 
104 constexpr copy_options 
105 operator^(copy_options __x, copy_options __y) noexcept 
106
107 using __utype = typename std::underlying_type<copy_options>::type
108 return static_cast<copy_options>( 
109 static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); 
110
111 
112 constexpr copy_options 
113 operator~(copy_options __x) noexcept 
114
115 using __utype = typename std::underlying_type<copy_options>::type
116 return static_cast<copy_options>(~static_cast<__utype>(__x)); 
117
118 
119 inline copy_options
120 operator&=(copy_options& __x, copy_options __y) noexcept 
121 { return __x = __x & __y; } 
122 
123 inline copy_options
124 operator|=(copy_options& __x, copy_options __y) noexcept 
125 { return __x = __x | __y; } 
126 
127 inline copy_options
128 operator^=(copy_options& __x, copy_options __y) noexcept 
129 { return __x = __x ^ __y; } 
130 
131 
132 /// Bitmask type 
133 enum class perms : unsigned
134 none = 0
135 owner_read = 0400
136 owner_write = 0200
137 owner_exec = 0100
138 owner_all = 0700
139 group_read = 040
140 group_write = 020
141 group_exec = 010
142 group_all = 070
143 others_read = 04
144 others_write = 02
145 others_exec = 01
146 others_all = 07
147 all = 0777
148 set_uid = 04000
149 set_gid = 02000
150 sticky_bit = 01000
151 mask = 07777
152 unknown = 0xFFFF
153 }; 
154 
155 constexpr perms 
156 operator&(perms __x, perms __y) noexcept 
157
158 using __utype = typename std::underlying_type<perms>::type
159 return static_cast<perms>( 
160 static_cast<__utype>(__x) & static_cast<__utype>(__y)); 
161
162 
163 constexpr perms 
164 operator|(perms __x, perms __y) noexcept 
165
166 using __utype = typename std::underlying_type<perms>::type
167 return static_cast<perms>( 
168 static_cast<__utype>(__x) | static_cast<__utype>(__y)); 
169
170 
171 constexpr perms 
172 operator^(perms __x, perms __y) noexcept 
173
174 using __utype = typename std::underlying_type<perms>::type
175 return static_cast<perms>( 
176 static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); 
177
178 
179 constexpr perms 
180 operator~(perms __x) noexcept 
181
182 using __utype = typename std::underlying_type<perms>::type
183 return static_cast<perms>(~static_cast<__utype>(__x)); 
184
185 
186 inline perms
187 operator&=(perms& __x, perms __y) noexcept 
188 { return __x = __x & __y; } 
189 
190 inline perms
191 operator|=(perms& __x, perms __y) noexcept 
192 { return __x = __x | __y; } 
193 
194 inline perms
195 operator^=(perms& __x, perms __y) noexcept 
196 { return __x = __x ^ __y; } 
197 
198 /// Bitmask type 
199 enum class perm_options : unsigned
200 replace = 0x1
201 add = 0x2
202 remove = 0x4
203 nofollow = 0x8 
204 }; 
205 
206 constexpr perm_options 
207 operator&(perm_options __x, perm_options __y) noexcept 
208
209 using __utype = typename std::underlying_type<perm_options>::type
210 return static_cast<perm_options>( 
211 static_cast<__utype>(__x) & static_cast<__utype>(__y)); 
212
213 
214 constexpr perm_options 
215 operator|(perm_options __x, perm_options __y) noexcept 
216
217 using __utype = typename std::underlying_type<perm_options>::type
218 return static_cast<perm_options>( 
219 static_cast<__utype>(__x) | static_cast<__utype>(__y)); 
220
221 
222 constexpr perm_options 
223 operator^(perm_options __x, perm_options __y) noexcept 
224
225 using __utype = typename std::underlying_type<perm_options>::type
226 return static_cast<perm_options>( 
227 static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); 
228
229 
230 constexpr perm_options 
231 operator~(perm_options __x) noexcept 
232
233 using __utype = typename std::underlying_type<perm_options>::type
234 return static_cast<perm_options>(~static_cast<__utype>(__x)); 
235
236 
237 inline perm_options
238 operator&=(perm_options& __x, perm_options __y) noexcept 
239 { return __x = __x & __y; } 
240 
241 inline perm_options
242 operator|=(perm_options& __x, perm_options __y) noexcept 
243 { return __x = __x | __y; } 
244 
245 inline perm_options
246 operator^=(perm_options& __x, perm_options __y) noexcept 
247 { return __x = __x ^ __y; } 
248 
249 // Bitmask type 
250 enum class directory_options : unsigned char
251 none = 0, follow_directory_symlink = 1, skip_permission_denied = 2 
252 }; 
253 
254 constexpr directory_options 
255 operator&(directory_options __x, directory_options __y) noexcept 
256
257 using __utype = typename std::underlying_type<directory_options>::type
258 return static_cast<directory_options>( 
259 static_cast<__utype>(__x) & static_cast<__utype>(__y)); 
260
261 
262 constexpr directory_options 
263 operator|(directory_options __x, directory_options __y) noexcept 
264
265 using __utype = typename std::underlying_type<directory_options>::type
266 return static_cast<directory_options>( 
267 static_cast<__utype>(__x) | static_cast<__utype>(__y)); 
268
269 
270 constexpr directory_options 
271 operator^(directory_options __x, directory_options __y) noexcept 
272
273 using __utype = typename std::underlying_type<directory_options>::type
274 return static_cast<directory_options>( 
275 static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); 
276
277 
278 constexpr directory_options 
279 operator~(directory_options __x) noexcept 
280
281 using __utype = typename std::underlying_type<directory_options>::type
282 return static_cast<directory_options>(~static_cast<__utype>(__x)); 
283
284 
285 inline directory_options
286 operator&=(directory_options& __x, directory_options __y) noexcept 
287 { return __x = __x & __y; } 
288 
289 inline directory_options
290 operator|=(directory_options& __x, directory_options __y) noexcept 
291 { return __x = __x | __y; } 
292 
293 inline directory_options
294 operator^=(directory_options& __x, directory_options __y) noexcept 
295 { return __x = __x ^ __y; } 
296 
297 struct __file_clock 
298
299 using duration = chrono::nanoseconds
300 using rep = duration::rep
301 using period = duration::period
302 using time_point = chrono::time_point<__file_clock>; 
303 static constexpr bool is_steady = false
304 
305 static time_point 
306 now() noexcept 
307 { return _S_from_sys(chrono::system_clock::now()); } 
308 
309 private
310 using __sys_clock = chrono::system_clock
311 
312 // This clock's (unspecified) epoch is 2174-01-01 00:00:00 UTC. 
313 // A signed 64-bit duration with nanosecond resolution gives roughly 
314 // +/- 292 years, which covers the 1901-2446 date range for ext4. 
315 static constexpr chrono::seconds _S_epoch_diff{6437664000}; 
316 
317 protected
318 // For internal use only 
319 template<typename _Dur> 
320 static 
321 chrono::time_point<__file_clock, _Dur> 
322 _S_from_sys(const chrono::time_point<__sys_clock, _Dur>& __t) noexcept 
323
324 using __file_time = chrono::time_point<__file_clock, _Dur>; 
325 return __file_time{__t.time_since_epoch()} - _S_epoch_diff
326
327 
328 // For internal use only 
329 template<typename _Dur> 
330 static 
331 chrono::time_point<__sys_clock, _Dur> 
332 _S_to_sys(const chrono::time_point<__file_clock, _Dur>& __t) noexcept 
333
334 using __sys_time = chrono::time_point<__sys_clock, _Dur>; 
335 return __sys_time{__t.time_since_epoch()} + _S_epoch_diff
336
337 }; 
338 
339 using file_time_type = __file_clock::time_point
340 
341 // operational functions 
342 
343 void copy(const path& __from, const path& __to, copy_options __options); 
344 void copy(const path& __from, const path& __to, copy_options __options
345 error_code&); 
346 
347 bool copy_file(const path& __from, const path& __to, copy_options __option); 
348 bool copy_file(const path& __from, const path& __to, copy_options __option
349 error_code&); 
350 
351 path current_path(); 
352 
353 bool exists(file_status) noexcept
354 
355 bool is_other(file_status) noexcept
356 
357 uintmax_t file_size(const path&); 
358 uintmax_t file_size(const path&, error_code&) noexcept
359 uintmax_t hard_link_count(const path&); 
360 uintmax_t hard_link_count(const path&, error_code&) noexcept
361 file_time_type last_write_time(const path&); 
362 file_time_type last_write_time(const path&, error_code&) noexcept
363 
364 void permissions(const path&, perms, perm_options, error_code&) noexcept
365 
366 path proximate(const path& __p, const path& __base, error_code& __ec); 
367 path proximate(const path& __p, const path& __base, error_code& __ec); 
368 
369 path relative(const path& __p, const path& __base, error_code& __ec); 
370 
371 file_status status(const path&); 
372 file_status status(const path&, error_code&) noexcept
373 
374 bool status_known(file_status) noexcept
375 
376 file_status symlink_status(const path&); 
377 file_status symlink_status(const path&, error_code&) noexcept
378 
379 bool is_regular_file(file_status) noexcept
380 bool is_symlink(file_status) noexcept
381 
382 // @} group filesystem 
383} // namespace filesystem 
384 
385_GLIBCXX_END_NAMESPACE_VERSION 
386} // namespace std 
387 
388#endif // C++17 
389 
390#endif // _GLIBCXX_FS_FWD_H 
391