1 // Filesystem declarations -*- C++ -*- 2 3 // Copyright (C) 2014-2020 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 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} 28 */ 29 30 #ifndef _GLIBCXX_EXPERIMENTAL_FS_FWD_H 31 #define _GLIBCXX_EXPERIMENTAL_FS_FWD_H 1 32 33 #if __cplusplus < 201103L 34 # include <bits/c++0x_warning.h> 35 #else 36 37 #include <system_error> 38 #include <cstdint> 39 #include <chrono> 40 41 namespace std _GLIBCXX_VISIBILITY(default) 42 { 43 _GLIBCXX_BEGIN_NAMESPACE_VERSION 44 45 namespace experimental 46 { 47 namespace filesystem 48 { 49 inline namespace v1 50 { 51 #if _GLIBCXX_USE_CXX11_ABI 52 inline namespace __cxx11 __attribute__((__abi_tag__ ("cxx11"))) { } 53 #endif 54 55 /** 56 * @defgroup filesystem-ts Filesystem TS 57 * @ingroup experimental 58 * 59 * Utilities for performing operations on file systems and their components, 60 * such as paths, regular files, and directories. 61 * 62 * ISO/IEC TS 18822:2015 C++ File System Technical Specification 63 * @{ 64 */ 65 66 class file_status; 67 _GLIBCXX_BEGIN_NAMESPACE_CXX11 68 class path; 69 class filesystem_error; 70 class directory_entry; 71 class directory_iterator; 72 class recursive_directory_iterator; 73 _GLIBCXX_END_NAMESPACE_CXX11 74 75 struct space_info 76 { 77 uintmax_t capacity; 78 uintmax_t free; 79 uintmax_t available; 80 }; 81 82 enum class file_type : signed char { 83 none = 0, not_found = -1, regular = 1, directory = 2, symlink = 3, 84 block = 4, character = 5, fifo = 6, socket = 7, unknown = 8 85 }; 86 87 /// Bitmask type 88 enum class copy_options : unsigned short { 89 none = 0, 90 skip_existing = 1, overwrite_existing = 2, update_existing = 4, 91 recursive = 8, 92 copy_symlinks = 16, skip_symlinks = 32, 93 directories_only = 64, create_symlinks = 128, create_hard_links = 256 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, copy_options __y) noexcept 114 { 115 using __utype = typename std::underlying_type<copy_options>::type; 116 return static_cast<copy_options>( 117 static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); 118 } 119 120 constexpr copy_options 121 operator~(copy_options __x) noexcept 122 { 123 using __utype = typename std::underlying_type<copy_options>::type; 124 return static_cast<copy_options>(~static_cast<__utype>(__x)); 125 } 126 127 inline copy_options& 128 operator&=(copy_options& __x, copy_options __y) noexcept 129 { return __x = __x & __y; } 130 131 inline copy_options& 132 operator|=(copy_options& __x, copy_options __y) noexcept 133 { return __x = __x | __y; } 134 135 inline copy_options& 136 operator^=(copy_options& __x, copy_options __y) noexcept 137 { return __x = __x ^ __y; } 138 139 140 /// Bitmask type 141 enum class perms : unsigned { 142 none = 0, 143 owner_read = 0400, 144 owner_write = 0200, 145 owner_exec = 0100, 146 owner_all = 0700, 147 group_read = 040, 148 group_write = 020, 149 group_exec = 010, 150 group_all = 070, 151 others_read = 04, 152 others_write = 02, 153 others_exec = 01, 154 others_all = 07, 155 all = 0777, 156 set_uid = 04000, 157 set_gid = 02000, 158 sticky_bit = 01000, 159 mask = 07777, 160 unknown = 0xFFFF, 161 add_perms = 0x10000, 162 remove_perms = 0x20000, 163 symlink_nofollow = 0x40000 164 }; 165 166 constexpr perms 167 operator&(perms __x, perms __y) noexcept 168 { 169 using __utype = typename std::underlying_type<perms>::type; 170 return static_cast<perms>( 171 static_cast<__utype>(__x) & static_cast<__utype>(__y)); 172 } 173 174 constexpr perms 175 operator|(perms __x, perms __y) noexcept 176 { 177 using __utype = typename std::underlying_type<perms>::type; 178 return static_cast<perms>( 179 static_cast<__utype>(__x) | static_cast<__utype>(__y)); 180 } 181 182 constexpr perms 183 operator^(perms __x, perms __y) noexcept 184 { 185 using __utype = typename std::underlying_type<perms>::type; 186 return static_cast<perms>( 187 static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); 188 } 189 190 constexpr perms 191 operator~(perms __x) noexcept 192 { 193 using __utype = typename std::underlying_type<perms>::type; 194 return static_cast<perms>(~static_cast<__utype>(__x)); 195 } 196 197 inline perms& 198 operator&=(perms& __x, perms __y) noexcept 199 { return __x = __x & __y; } 200 201 inline perms& 202 operator|=(perms& __x, perms __y) noexcept 203 { return __x = __x | __y; } 204 205 inline perms& 206 operator^=(perms& __x, perms __y) noexcept 207 { return __x = __x ^ __y; } 208 209 // Bitmask type 210 enum class directory_options : unsigned char { 211 none = 0, follow_directory_symlink = 1, skip_permission_denied = 2 212 }; 213 214 constexpr directory_options 215 operator&(directory_options __x, directory_options __y) noexcept 216 { 217 using __utype = typename std::underlying_type<directory_options>::type; 218 return static_cast<directory_options>( 219 static_cast<__utype>(__x) & static_cast<__utype>(__y)); 220 } 221 222 constexpr directory_options 223 operator|(directory_options __x, directory_options __y) noexcept 224 { 225 using __utype = typename std::underlying_type<directory_options>::type; 226 return static_cast<directory_options>( 227 static_cast<__utype>(__x) | static_cast<__utype>(__y)); 228 } 229 230 constexpr directory_options 231 operator^(directory_options __x, directory_options __y) noexcept 232 { 233 using __utype = typename std::underlying_type<directory_options>::type; 234 return static_cast<directory_options>( 235 static_cast<__utype>(__x) ^ static_cast<__utype>(__y)); 236 } 237 238 constexpr directory_options 239 operator~(directory_options __x) noexcept 240 { 241 using __utype = typename std::underlying_type<directory_options>::type; 242 return static_cast<directory_options>(~static_cast<__utype>(__x)); 243 } 244 245 inline directory_options& 246 operator&=(directory_options& __x, directory_options __y) noexcept 247 { return __x = __x & __y; } 248 249 inline directory_options& 250 operator|=(directory_options& __x, directory_options __y) noexcept 251 { return __x = __x | __y; } 252 253 inline directory_options& 254 operator^=(directory_options& __x, directory_options __y) noexcept 255 { return __x = __x ^ __y; } 256 257 using file_time_type = std::chrono::system_clock::time_point; 258 259 // operational functions 260 261 void copy(const path& __from, const path& __to, copy_options __options); 262 void copy(const path& __from, const path& __to, copy_options __options, 263 error_code&) noexcept; 264 265 bool copy_file(const path& __from, const path& __to, copy_options __option); 266 bool copy_file(const path& __from, const path& __to, copy_options __option, 267 error_code&); 268 269 path current_path(); 270 271 file_status status(const path&); 272 file_status status(const path&, error_code&) noexcept; 273 274 bool status_known(file_status) noexcept; 275 276 file_status symlink_status(const path&); 277 file_status symlink_status(const path&, error_code&) noexcept; 278 279 bool is_regular_file(file_status) noexcept; 280 bool is_symlink(file_status) noexcept; 281 282 /// @} group filesystem-ts 283 } // namespace v1 284 } // namespace filesystem 285 } // namespace experimental 286 287 _GLIBCXX_END_NAMESPACE_VERSION 288 } // namespace std 289 290 #endif // C++11 291 292 #endif // _GLIBCXX_EXPERIMENTAL_FS_FWD_H 293