1 // Filesystem declarations -*- C++ -*-
3 // Copyright (C) 2014-2016 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/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{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 #if _GLIBCXX_INLINE_VERSION
50 inline namespace __7
{ }
52 _GLIBCXX_BEGIN_NAMESPACE_VERSION
54 #if _GLIBCXX_USE_CXX11_ABI
55 inline namespace __cxx11
__attribute__((__abi_tag__ ("cxx11"))) { }
59 * @defgroup filesystem Filesystem
60 * @ingroup experimental
62 * Utilities for performing operations on file systems and their components,
63 * such as paths, regular files, and directories.
69 _GLIBCXX_BEGIN_NAMESPACE_CXX11
71 class filesystem_error
;
72 class directory_entry
;
73 class directory_iterator
;
74 class recursive_directory_iterator
;
75 _GLIBCXX_END_NAMESPACE_CXX11
84 enum class file_type
: signed char {
85 none
= 0, not_found
= -1, regular
= 1, directory
= 2, symlink
= 3,
86 block
= 4, character
= 5, fifo
= 6, socket
= 7, unknown
= 8
90 enum class copy_options
: unsigned short {
92 skip_existing
= 1, overwrite_existing
= 2, update_existing
= 4,
94 copy_symlinks
= 16, skip_symlinks
= 32,
95 directories_only
= 64, create_symlinks
= 128, create_hard_links
= 256
98 constexpr copy_options
99 operator&(copy_options __x
, copy_options __y
) noexcept
101 using __utype
= typename
std::underlying_type
<copy_options
>::type
;
102 return static_cast<copy_options
>(
103 static_cast<__utype
>(__x
) & static_cast<__utype
>(__y
));
106 constexpr copy_options
107 operator|(copy_options __x
, copy_options __y
) noexcept
109 using __utype
= typename
std::underlying_type
<copy_options
>::type
;
110 return static_cast<copy_options
>(
111 static_cast<__utype
>(__x
) | static_cast<__utype
>(__y
));
114 constexpr copy_options
115 operator^(copy_options __x
, copy_options __y
) noexcept
117 using __utype
= typename
std::underlying_type
<copy_options
>::type
;
118 return static_cast<copy_options
>(
119 static_cast<__utype
>(__x
) ^ static_cast<__utype
>(__y
));
122 constexpr copy_options
123 operator~(copy_options __x
) noexcept
125 using __utype
= typename
std::underlying_type
<copy_options
>::type
;
126 return static_cast<copy_options
>(~static_cast<__utype
>(__x
));
130 operator&=(copy_options
& __x
, copy_options __y
) noexcept
131 { return __x
= __x
& __y
; }
134 operator|=(copy_options
& __x
, copy_options __y
) noexcept
135 { return __x
= __x
| __y
; }
138 operator^=(copy_options
& __x
, copy_options __y
) noexcept
139 { return __x
= __x
^ __y
; }
143 enum class perms
: unsigned {
164 remove_perms
= 0x20000,
165 symlink_nofollow
= 0x40000
169 operator&(perms __x
, perms __y
) noexcept
171 using __utype
= typename
std::underlying_type
<perms
>::type
;
172 return static_cast<perms
>(
173 static_cast<__utype
>(__x
) & static_cast<__utype
>(__y
));
177 operator|(perms __x
, perms __y
) noexcept
179 using __utype
= typename
std::underlying_type
<perms
>::type
;
180 return static_cast<perms
>(
181 static_cast<__utype
>(__x
) | static_cast<__utype
>(__y
));
185 operator^(perms __x
, perms __y
) noexcept
187 using __utype
= typename
std::underlying_type
<perms
>::type
;
188 return static_cast<perms
>(
189 static_cast<__utype
>(__x
) ^ static_cast<__utype
>(__y
));
193 operator~(perms __x
) noexcept
195 using __utype
= typename
std::underlying_type
<perms
>::type
;
196 return static_cast<perms
>(~static_cast<__utype
>(__x
));
200 operator&=(perms
& __x
, perms __y
) noexcept
201 { return __x
= __x
& __y
; }
204 operator|=(perms
& __x
, perms __y
) noexcept
205 { return __x
= __x
| __y
; }
208 operator^=(perms
& __x
, perms __y
) noexcept
209 { return __x
= __x
^ __y
; }
212 enum class directory_options
: unsigned char {
213 none
= 0, follow_directory_symlink
= 1, skip_permission_denied
= 2
216 constexpr directory_options
217 operator&(directory_options __x
, directory_options __y
) noexcept
219 using __utype
= typename
std::underlying_type
<directory_options
>::type
;
220 return static_cast<directory_options
>(
221 static_cast<__utype
>(__x
) & static_cast<__utype
>(__y
));
224 constexpr directory_options
225 operator|(directory_options __x
, directory_options __y
) noexcept
227 using __utype
= typename
std::underlying_type
<directory_options
>::type
;
228 return static_cast<directory_options
>(
229 static_cast<__utype
>(__x
) | static_cast<__utype
>(__y
));
232 constexpr directory_options
233 operator^(directory_options __x
, directory_options __y
) noexcept
235 using __utype
= typename
std::underlying_type
<directory_options
>::type
;
236 return static_cast<directory_options
>(
237 static_cast<__utype
>(__x
) ^ static_cast<__utype
>(__y
));
240 constexpr directory_options
241 operator~(directory_options __x
) noexcept
243 using __utype
= typename
std::underlying_type
<directory_options
>::type
;
244 return static_cast<directory_options
>(~static_cast<__utype
>(__x
));
247 inline directory_options
&
248 operator&=(directory_options
& __x
, directory_options __y
) noexcept
249 { return __x
= __x
& __y
; }
251 inline directory_options
&
252 operator|=(directory_options
& __x
, directory_options __y
) noexcept
253 { return __x
= __x
| __y
; }
255 inline directory_options
&
256 operator^=(directory_options
& __x
, directory_options __y
) noexcept
257 { return __x
= __x
^ __y
; }
259 using file_time_type
= std::chrono::system_clock::time_point
;
261 // operational functions
263 void copy(const path
& __from
, const path
& __to
, copy_options __options
);
264 void copy(const path
& __from
, const path
& __to
, copy_options __options
,
265 error_code
&) noexcept
;
267 bool copy_file(const path
& __from
, const path
& __to
, copy_options __option
);
268 bool copy_file(const path
& __from
, const path
& __to
, copy_options __option
,
269 error_code
&) noexcept
;
273 file_status
status(const path
&);
274 file_status
status(const path
&, error_code
&) noexcept
;
276 bool status_known(file_status
) noexcept
;
278 file_status
symlink_status(const path
&);
279 file_status
symlink_status(const path
&, error_code
&) noexcept
;
281 bool is_regular_file(file_status
) noexcept
;
282 bool is_symlink(file_status
) noexcept
;
284 // @} group filesystem
285 _GLIBCXX_END_NAMESPACE_VERSION
287 } // namespace filesystem
288 } // namespace experimental
293 #endif // _GLIBCXX_EXPERIMENTAL_FS_FWD_H