1e78f53d1SNikolas Klauser// -*- C++ -*- 2e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 3e78f53d1SNikolas Klauser// 4e78f53d1SNikolas Klauser// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5e78f53d1SNikolas Klauser// See https://llvm.org/LICENSE.txt for license information. 6e78f53d1SNikolas Klauser// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7e78f53d1SNikolas Klauser// 8e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===// 9e78f53d1SNikolas Klauser 10*ce777190SNikolas Klauser#ifndef _LIBCPP___CXX03_FILESYSTEM 11*ce777190SNikolas Klauser#define _LIBCPP___CXX03_FILESYSTEM 12e78f53d1SNikolas Klauser 13e78f53d1SNikolas Klauser/* 14e78f53d1SNikolas Klauser filesystem synopsis 15e78f53d1SNikolas Klauser 16e78f53d1SNikolas Klauser namespace std::filesystem { 17e78f53d1SNikolas Klauser 18e78f53d1SNikolas Klauser // `class path` from http://eel.is/c++draft/fs.class.path.general#6 19e78f53d1SNikolas Klauser class path { 20e78f53d1SNikolas Klauser public: 21e78f53d1SNikolas Klauser using value_type = see below; 22e78f53d1SNikolas Klauser using string_type = basic_string<value_type>; 23e78f53d1SNikolas Klauser static constexpr value_type preferred_separator = see below; 24e78f53d1SNikolas Klauser 25e78f53d1SNikolas Klauser enum format; 26e78f53d1SNikolas Klauser 27e78f53d1SNikolas Klauser path() noexcept; 28e78f53d1SNikolas Klauser path(const path& p); 29e78f53d1SNikolas Klauser path(path&& p) noexcept; 30e78f53d1SNikolas Klauser path(string_type&& source, format fmt = auto_format); 31e78f53d1SNikolas Klauser template<class Source> 32e78f53d1SNikolas Klauser path(const Source& source, format fmt = auto_format); 33e78f53d1SNikolas Klauser template<class InputIterator> 34e78f53d1SNikolas Klauser path(InputIterator first, InputIterator last, format fmt = auto_format); 35e78f53d1SNikolas Klauser template<class Source> 36e78f53d1SNikolas Klauser path(const Source& source, const locale& loc, format fmt = auto_format); 37e78f53d1SNikolas Klauser template<class InputIterator> 38e78f53d1SNikolas Klauser path(InputIterator first, InputIterator last, const locale& loc, format fmt = auto_format); 39e78f53d1SNikolas Klauser ~path(); 40e78f53d1SNikolas Klauser 41e78f53d1SNikolas Klauser path& operator=(const path& p); 42e78f53d1SNikolas Klauser path& operator=(path&& p) noexcept; 43e78f53d1SNikolas Klauser path& operator=(string_type&& source); 44e78f53d1SNikolas Klauser path& assign(string_type&& source); 45e78f53d1SNikolas Klauser template<class Source> 46e78f53d1SNikolas Klauser path& operator=(const Source& source); 47e78f53d1SNikolas Klauser template<class Source> 48e78f53d1SNikolas Klauser path& assign(const Source& source); 49e78f53d1SNikolas Klauser template<class InputIterator> 50e78f53d1SNikolas Klauser path& assign(InputIterator first, InputIterator last); 51e78f53d1SNikolas Klauser 52e78f53d1SNikolas Klauser path& operator/=(const path& p); 53e78f53d1SNikolas Klauser template<class Source> 54e78f53d1SNikolas Klauser path& operator/=(const Source& source); 55e78f53d1SNikolas Klauser template<class Source> 56e78f53d1SNikolas Klauser path& append(const Source& source); 57e78f53d1SNikolas Klauser template<class InputIterator> 58e78f53d1SNikolas Klauser path& append(InputIterator first, InputIterator last); 59e78f53d1SNikolas Klauser 60e78f53d1SNikolas Klauser path& operator+=(const path& x); 61e78f53d1SNikolas Klauser path& operator+=(const string_type& x); 62e78f53d1SNikolas Klauser path& operator+=(basic_string_view<value_type> x); 63e78f53d1SNikolas Klauser path& operator+=(const value_type* x); 64e78f53d1SNikolas Klauser path& operator+=(value_type x); 65e78f53d1SNikolas Klauser template<class Source> 66e78f53d1SNikolas Klauser path& operator+=(const Source& x); 67e78f53d1SNikolas Klauser template<class EcharT> 68e78f53d1SNikolas Klauser path& operator+=(EcharT x); 69e78f53d1SNikolas Klauser template<class Source> 70e78f53d1SNikolas Klauser path& concat(const Source& x); 71e78f53d1SNikolas Klauser template<class InputIterator> 72e78f53d1SNikolas Klauser path& concat(InputIterator first, InputIterator last); 73e78f53d1SNikolas Klauser 74e78f53d1SNikolas Klauser void clear() noexcept; 75e78f53d1SNikolas Klauser path& make_preferred(); 76e78f53d1SNikolas Klauser path& remove_filename(); 77e78f53d1SNikolas Klauser path& replace_filename(const path& replacement); 78e78f53d1SNikolas Klauser path& replace_extension(const path& replacement = path()); 79e78f53d1SNikolas Klauser void swap(path& rhs) noexcept; 80e78f53d1SNikolas Klauser 81e78f53d1SNikolas Klauser friend bool operator==(const path& lhs, const path& rhs) noexcept; 82e78f53d1SNikolas Klauser friend bool operator!=(const path& lhs, const path& rhs) noexcept; // removed in C++20 83e78f53d1SNikolas Klauser friend bool operator< (const path& lhs, const path& rhs) noexcept; // removed in C++20 84e78f53d1SNikolas Klauser friend bool operator<=(const path& lhs, const path& rhs) noexcept; // removed in C++20 85e78f53d1SNikolas Klauser friend bool operator> (const path& lhs, const path& rhs) noexcept; // removed in C++20 86e78f53d1SNikolas Klauser friend bool operator>=(const path& lhs, const path& rhs) noexcept; // removed in C++20 87e78f53d1SNikolas Klauser friend strong_ordering operator<=>(const path& lhs, const path& rhs) noexcept; // C++20 88e78f53d1SNikolas Klauser 89e78f53d1SNikolas Klauser friend path operator/(const path& lhs, const path& rhs); 90e78f53d1SNikolas Klauser 91e78f53d1SNikolas Klauser const string_type& native() const noexcept; 92e78f53d1SNikolas Klauser const value_type* c_str() const noexcept; 93e78f53d1SNikolas Klauser operator string_type() const; 94e78f53d1SNikolas Klauser 95e78f53d1SNikolas Klauser template<class EcharT, class traits = char_traits<EcharT>, 96e78f53d1SNikolas Klauser class Allocator = allocator<EcharT>> 97e78f53d1SNikolas Klauser basic_string<EcharT, traits, Allocator> 98e78f53d1SNikolas Klauser string(const Allocator& a = Allocator()) const; 99e78f53d1SNikolas Klauser std::string string() const; 100e78f53d1SNikolas Klauser std::wstring wstring() const; 101e78f53d1SNikolas Klauser std::u8string u8string() const; 102e78f53d1SNikolas Klauser std::u16string u16string() const; 103e78f53d1SNikolas Klauser std::u32string u32string() const; 104e78f53d1SNikolas Klauser 105e78f53d1SNikolas Klauser template<class EcharT, class traits = char_traits<EcharT>, 106e78f53d1SNikolas Klauser class Allocator = allocator<EcharT>> 107e78f53d1SNikolas Klauser basic_string<EcharT, traits, Allocator> 108e78f53d1SNikolas Klauser generic_string(const Allocator& a = Allocator()) const; 109e78f53d1SNikolas Klauser std::string generic_string() const; 110e78f53d1SNikolas Klauser std::wstring generic_wstring() const; 111e78f53d1SNikolas Klauser std::u8string generic_u8string() const; 112e78f53d1SNikolas Klauser std::u16string generic_u16string() const; 113e78f53d1SNikolas Klauser std::u32string generic_u32string() const; 114e78f53d1SNikolas Klauser 115e78f53d1SNikolas Klauser int compare(const path& p) const noexcept; 116e78f53d1SNikolas Klauser int compare(const string_type& s) const; 117e78f53d1SNikolas Klauser int compare(basic_string_view<value_type> s) const; 118e78f53d1SNikolas Klauser int compare(const value_type* s) const; 119e78f53d1SNikolas Klauser 120e78f53d1SNikolas Klauser path root_name() const; 121e78f53d1SNikolas Klauser path root_directory() const; 122e78f53d1SNikolas Klauser path root_path() const; 123e78f53d1SNikolas Klauser path relative_path() const; 124e78f53d1SNikolas Klauser path parent_path() const; 125e78f53d1SNikolas Klauser path filename() const; 126e78f53d1SNikolas Klauser path stem() const; 127e78f53d1SNikolas Klauser path extension() const; 128e78f53d1SNikolas Klauser 129e78f53d1SNikolas Klauser [[nodiscard]] bool empty() const noexcept; 130e78f53d1SNikolas Klauser bool has_root_name() const; 131e78f53d1SNikolas Klauser bool has_root_directory() const; 132e78f53d1SNikolas Klauser bool has_root_path() const; 133e78f53d1SNikolas Klauser bool has_relative_path() const; 134e78f53d1SNikolas Klauser bool has_parent_path() const; 135e78f53d1SNikolas Klauser bool has_filename() const; 136e78f53d1SNikolas Klauser bool has_stem() const; 137e78f53d1SNikolas Klauser bool has_extension() const; 138e78f53d1SNikolas Klauser bool is_absolute() const; 139e78f53d1SNikolas Klauser bool is_relative() const; 140e78f53d1SNikolas Klauser 141e78f53d1SNikolas Klauser path lexically_normal() const; 142e78f53d1SNikolas Klauser path lexically_relative(const path& base) const; 143e78f53d1SNikolas Klauser path lexically_proximate(const path& base) const; 144e78f53d1SNikolas Klauser 145e78f53d1SNikolas Klauser class iterator; 146e78f53d1SNikolas Klauser using const_iterator = iterator; 147e78f53d1SNikolas Klauser 148e78f53d1SNikolas Klauser iterator begin() const; 149e78f53d1SNikolas Klauser iterator end() const; 150e78f53d1SNikolas Klauser 151e78f53d1SNikolas Klauser template<class charT, class traits> 152e78f53d1SNikolas Klauser friend basic_ostream<charT, traits>& 153e78f53d1SNikolas Klauser operator<<(basic_ostream<charT, traits>& os, const path& p); 154e78f53d1SNikolas Klauser template<class charT, class traits> 155e78f53d1SNikolas Klauser friend basic_istream<charT, traits>& 156e78f53d1SNikolas Klauser operator>>(basic_istream<charT, traits>& is, path& p); 157e78f53d1SNikolas Klauser }; 158e78f53d1SNikolas Klauser 159e78f53d1SNikolas Klauser void swap(path& lhs, path& rhs) noexcept; 160e78f53d1SNikolas Klauser size_t hash_value(const path& p) noexcept; 161e78f53d1SNikolas Klauser 162e78f53d1SNikolas Klauser // [fs.path.hash], hash support 163e78f53d1SNikolas Klauser template<> struct hash<filesystem::path>; 164e78f53d1SNikolas Klauser 165e78f53d1SNikolas Klauser template <class Source> 166e78f53d1SNikolas Klauser path u8path(const Source& source); 167e78f53d1SNikolas Klauser template <class InputIterator> 168e78f53d1SNikolas Klauser path u8path(InputIterator first, InputIterator last); 169e78f53d1SNikolas Klauser 170e78f53d1SNikolas Klauser class filesystem_error; 171e78f53d1SNikolas Klauser 172e78f53d1SNikolas Klauser class directory_entry { 173e78f53d1SNikolas Klauser public: 174e78f53d1SNikolas Klauser directory_entry() noexcept = default; 175e78f53d1SNikolas Klauser directory_entry(const directory_entry&) = default; 176e78f53d1SNikolas Klauser directory_entry(directory_entry&&) noexcept = default; 177e78f53d1SNikolas Klauser explicit directory_entry(const filesystem::path& p); 178e78f53d1SNikolas Klauser directory_entry(const filesystem::path& p, error_code& ec); 179e78f53d1SNikolas Klauser ~directory_entry(); 180e78f53d1SNikolas Klauser 181e78f53d1SNikolas Klauser directory_entry& operator=(const directory_entry&) = default; 182e78f53d1SNikolas Klauser directory_entry& operator=(directory_entry&&) noexcept = default; 183e78f53d1SNikolas Klauser 184e78f53d1SNikolas Klauser void assign(const filesystem::path& p); 185e78f53d1SNikolas Klauser void assign(const filesystem::path& p, error_code& ec); 186e78f53d1SNikolas Klauser void replace_filename(const filesystem::path& p); 187e78f53d1SNikolas Klauser void replace_filename(const filesystem::path& p, error_code& ec); 188e78f53d1SNikolas Klauser void refresh(); 189e78f53d1SNikolas Klauser void refresh(error_code& ec) noexcept; 190e78f53d1SNikolas Klauser 191e78f53d1SNikolas Klauser const filesystem::path& path() const noexcept; 192e78f53d1SNikolas Klauser operator const filesystem::path&() const noexcept; 193e78f53d1SNikolas Klauser bool exists() const; 194e78f53d1SNikolas Klauser bool exists(error_code& ec) const noexcept; 195e78f53d1SNikolas Klauser bool is_block_file() const; 196e78f53d1SNikolas Klauser bool is_block_file(error_code& ec) const noexcept; 197e78f53d1SNikolas Klauser bool is_character_file() const; 198e78f53d1SNikolas Klauser bool is_character_file(error_code& ec) const noexcept; 199e78f53d1SNikolas Klauser bool is_directory() const; 200e78f53d1SNikolas Klauser bool is_directory(error_code& ec) const noexcept; 201e78f53d1SNikolas Klauser bool is_fifo() const; 202e78f53d1SNikolas Klauser bool is_fifo(error_code& ec) const noexcept; 203e78f53d1SNikolas Klauser bool is_other() const; 204e78f53d1SNikolas Klauser bool is_other(error_code& ec) const noexcept; 205e78f53d1SNikolas Klauser bool is_regular_file() const; 206e78f53d1SNikolas Klauser bool is_regular_file(error_code& ec) const noexcept; 207e78f53d1SNikolas Klauser bool is_socket() const; 208e78f53d1SNikolas Klauser bool is_socket(error_code& ec) const noexcept; 209e78f53d1SNikolas Klauser bool is_symlink() const; 210e78f53d1SNikolas Klauser bool is_symlink(error_code& ec) const noexcept; 211e78f53d1SNikolas Klauser uintmax_t file_size() const; 212e78f53d1SNikolas Klauser uintmax_t file_size(error_code& ec) const noexcept; 213e78f53d1SNikolas Klauser uintmax_t hard_link_count() const; 214e78f53d1SNikolas Klauser uintmax_t hard_link_count(error_code& ec) const noexcept; 215e78f53d1SNikolas Klauser file_time_type last_write_time() const; 216e78f53d1SNikolas Klauser file_time_type last_write_time(error_code& ec) const noexcept; 217e78f53d1SNikolas Klauser file_status status() const; 218e78f53d1SNikolas Klauser file_status status(error_code& ec) const noexcept; 219e78f53d1SNikolas Klauser file_status symlink_status() const; 220e78f53d1SNikolas Klauser file_status symlink_status(error_code& ec) const noexcept; 221e78f53d1SNikolas Klauser 222e78f53d1SNikolas Klauser bool operator==(const directory_entry& rhs) const noexcept; 223e78f53d1SNikolas Klauser bool operator!=(const directory_entry& rhs) const noexcept; // removed in C++20 224e78f53d1SNikolas Klauser bool operator< (const directory_entry& rhs) const noexcept; // removed in C++20 225e78f53d1SNikolas Klauser bool operator<=(const directory_entry& rhs) const noexcept; // removed in C++20 226e78f53d1SNikolas Klauser bool operator> (const directory_entry& rhs) const noexcept; // removed in C++20 227e78f53d1SNikolas Klauser bool operator>=(const directory_entry& rhs) const noexcept; // removed in C++20 228e78f53d1SNikolas Klauser strong_ordering operator<=>(const directory_entry& rhs) const noexcept; // since C++20 229e78f53d1SNikolas Klauser 230e78f53d1SNikolas Klauser template<class charT, class traits> 231e78f53d1SNikolas Klauser friend basic_ostream<charT, traits>& 232e78f53d1SNikolas Klauser operator<<(basic_ostream<charT, traits>& os, const directory_entry& d); 233e78f53d1SNikolas Klauser 234e78f53d1SNikolas Klauser private: 235e78f53d1SNikolas Klauser filesystem::path pathobject; // exposition only 236e78f53d1SNikolas Klauser friend class directory_iterator; // exposition only 237e78f53d1SNikolas Klauser }; 238e78f53d1SNikolas Klauser 239e78f53d1SNikolas Klauser class directory_iterator { 240e78f53d1SNikolas Klauser public: 241e78f53d1SNikolas Klauser using iterator_category = input_iterator_tag; 242e78f53d1SNikolas Klauser using value_type = directory_entry; 243e78f53d1SNikolas Klauser using difference_type = ptrdiff_t; 244e78f53d1SNikolas Klauser using pointer = const directory_entry*; 245e78f53d1SNikolas Klauser using reference = const directory_entry&; 246e78f53d1SNikolas Klauser 247e78f53d1SNikolas Klauser // [fs.dir.itr.members], member functions 248e78f53d1SNikolas Klauser directory_iterator() noexcept; 249e78f53d1SNikolas Klauser explicit directory_iterator(const path& p); 250e78f53d1SNikolas Klauser directory_iterator(const path& p, directory_options options); 251e78f53d1SNikolas Klauser directory_iterator(const path& p, error_code& ec); 252e78f53d1SNikolas Klauser directory_iterator(const path& p, directory_options options, 253e78f53d1SNikolas Klauser error_code& ec); 254e78f53d1SNikolas Klauser directory_iterator(const directory_iterator& rhs); 255e78f53d1SNikolas Klauser directory_iterator(directory_iterator&& rhs) noexcept; 256e78f53d1SNikolas Klauser ~directory_iterator(); 257e78f53d1SNikolas Klauser 258e78f53d1SNikolas Klauser directory_iterator& operator=(const directory_iterator& rhs); 259e78f53d1SNikolas Klauser directory_iterator& operator=(directory_iterator&& rhs) noexcept; 260e78f53d1SNikolas Klauser 261e78f53d1SNikolas Klauser const directory_entry& operator*() const; 262e78f53d1SNikolas Klauser const directory_entry* operator->() const; 263e78f53d1SNikolas Klauser directory_iterator& operator++(); 264e78f53d1SNikolas Klauser directory_iterator& increment(error_code& ec); 265e78f53d1SNikolas Klauser 266e78f53d1SNikolas Klauser bool operator==(default_sentinel_t) const noexcept { // since C++20 267e78f53d1SNikolas Klauser return *this == directory_iterator(); 268e78f53d1SNikolas Klauser } 269e78f53d1SNikolas Klauser 270e78f53d1SNikolas Klauser // other members as required by [input.iterators], input iterators 271e78f53d1SNikolas Klauser }; 272e78f53d1SNikolas Klauser 273e78f53d1SNikolas Klauser // enable directory_iterator range-based for statements 274e78f53d1SNikolas Klauser directory_iterator begin(directory_iterator iter) noexcept; 275e78f53d1SNikolas Klauser directory_iterator end(directory_iterator) noexcept; 276e78f53d1SNikolas Klauser 277e78f53d1SNikolas Klauserclass recursive_directory_iterator { 278e78f53d1SNikolas Klauser public: 279e78f53d1SNikolas Klauser using iterator_category = input_iterator_tag; 280e78f53d1SNikolas Klauser using value_type = directory_entry; 281e78f53d1SNikolas Klauser using difference_type = ptrdiff_t; 282e78f53d1SNikolas Klauser using pointer = const directory_entry*; 283e78f53d1SNikolas Klauser using reference = const directory_entry&; 284e78f53d1SNikolas Klauser 285e78f53d1SNikolas Klauser // [fs.rec.dir.itr.members], constructors and destructor 286e78f53d1SNikolas Klauser recursive_directory_iterator() noexcept; 287e78f53d1SNikolas Klauser explicit recursive_directory_iterator(const path& p); 288e78f53d1SNikolas Klauser recursive_directory_iterator(const path& p, directory_options options); 289e78f53d1SNikolas Klauser recursive_directory_iterator(const path& p, directory_options options, 290e78f53d1SNikolas Klauser error_code& ec); 291e78f53d1SNikolas Klauser recursive_directory_iterator(const path& p, error_code& ec); 292e78f53d1SNikolas Klauser recursive_directory_iterator(const recursive_directory_iterator& rhs); 293e78f53d1SNikolas Klauser recursive_directory_iterator(recursive_directory_iterator&& rhs) noexcept; 294e78f53d1SNikolas Klauser ~recursive_directory_iterator(); 295e78f53d1SNikolas Klauser 296e78f53d1SNikolas Klauser // [fs.rec.dir.itr.members], observers 297e78f53d1SNikolas Klauser directory_options options() const; 298e78f53d1SNikolas Klauser int depth() const; 299e78f53d1SNikolas Klauser bool recursion_pending() const; 300e78f53d1SNikolas Klauser 301e78f53d1SNikolas Klauser const directory_entry& operator*() const; 302e78f53d1SNikolas Klauser const directory_entry* operator->() const; 303e78f53d1SNikolas Klauser 304e78f53d1SNikolas Klauser // [fs.rec.dir.itr.members], modifiers 305e78f53d1SNikolas Klauser recursive_directory_iterator& 306e78f53d1SNikolas Klauser operator=(const recursive_directory_iterator& rhs); 307e78f53d1SNikolas Klauser recursive_directory_iterator& 308e78f53d1SNikolas Klauser operator=(recursive_directory_iterator&& rhs) noexcept; 309e78f53d1SNikolas Klauser 310e78f53d1SNikolas Klauser recursive_directory_iterator& operator++(); 311e78f53d1SNikolas Klauser recursive_directory_iterator& increment(error_code& ec); 312e78f53d1SNikolas Klauser 313e78f53d1SNikolas Klauser void pop(); 314e78f53d1SNikolas Klauser void pop(error_code& ec); 315e78f53d1SNikolas Klauser void disable_recursion_pending(); 316e78f53d1SNikolas Klauser 317e78f53d1SNikolas Klauser bool operator==(default_sentinel_t) const noexcept { // since C++20 318e78f53d1SNikolas Klauser return *this == recursive_directory_iterator(); 319e78f53d1SNikolas Klauser } 320e78f53d1SNikolas Klauser 321e78f53d1SNikolas Klauser // other members as required by [input.iterators], input iterators 322e78f53d1SNikolas Klauser }; 323e78f53d1SNikolas Klauser 324e78f53d1SNikolas Klauser // enable recursive_directory_iterator range-based for statements 325e78f53d1SNikolas Klauser recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept; 326e78f53d1SNikolas Klauser recursive_directory_iterator end(recursive_directory_iterator) noexcept; 327e78f53d1SNikolas Klauser 328e78f53d1SNikolas Klauser class file_status { 329e78f53d1SNikolas Klauser public: 330e78f53d1SNikolas Klauser // [fs.file.status.cons], constructors and destructor 331e78f53d1SNikolas Klauser file_status() noexcept : file_status(file_type::none) {} 332e78f53d1SNikolas Klauser explicit file_status(file_type ft, 333e78f53d1SNikolas Klauser perms prms = perms::unknown) noexcept; 334e78f53d1SNikolas Klauser file_status(const file_status&) noexcept = default; 335e78f53d1SNikolas Klauser file_status(file_status&&) noexcept = default; 336e78f53d1SNikolas Klauser ~file_status(); 337e78f53d1SNikolas Klauser 338e78f53d1SNikolas Klauser // assignments 339e78f53d1SNikolas Klauser file_status& operator=(const file_status&) noexcept = default; 340e78f53d1SNikolas Klauser file_status& operator=(file_status&&) noexcept = default; 341e78f53d1SNikolas Klauser 342e78f53d1SNikolas Klauser // [fs.file.status.mods], modifiers 343e78f53d1SNikolas Klauser void type(file_type ft) noexcept; 344e78f53d1SNikolas Klauser void permissions(perms prms) noexcept; 345e78f53d1SNikolas Klauser 346e78f53d1SNikolas Klauser // [fs.file.status.obs], observers 347e78f53d1SNikolas Klauser file_type type() const noexcept; 348e78f53d1SNikolas Klauser perms permissions() const noexcept; 349e78f53d1SNikolas Klauser 350e78f53d1SNikolas Klauser friend bool operator==(const file_status& lhs, const file_status& rhs) noexcept 351e78f53d1SNikolas Klauser { return lhs.type() == rhs.type() && lhs.permissions() == rhs.permissions(); } // C++20 352e78f53d1SNikolas Klauser }; 353e78f53d1SNikolas Klauser 354e78f53d1SNikolas Klauser struct space_info 355e78f53d1SNikolas Klauser { 356e78f53d1SNikolas Klauser uintmax_t capacity; 357e78f53d1SNikolas Klauser uintmax_t free; 358e78f53d1SNikolas Klauser uintmax_t available; 359e78f53d1SNikolas Klauser 360e78f53d1SNikolas Klauser friend bool operator==(const space_info&, const space_info&) = default; // C++20 361e78f53d1SNikolas Klauser }; 362e78f53d1SNikolas Klauser 363e78f53d1SNikolas Klauser enum class file_type; 364e78f53d1SNikolas Klauser enum class perms; 365e78f53d1SNikolas Klauser enum class perm_options; 366e78f53d1SNikolas Klauser enum class copy_options; 367e78f53d1SNikolas Klauser enum class directory_options; 368e78f53d1SNikolas Klauser 369e78f53d1SNikolas Klauser typedef chrono::time_point<trivial-clock> file_time_type; 370e78f53d1SNikolas Klauser 371e78f53d1SNikolas Klauser // operational functions 372e78f53d1SNikolas Klauser 373e78f53d1SNikolas Klauser path absolute(const path& p); 374e78f53d1SNikolas Klauser path absolute(const path& p, error_code &ec); 375e78f53d1SNikolas Klauser 376e78f53d1SNikolas Klauser path canonical(const path& p); 377e78f53d1SNikolas Klauser path canonical(const path& p, error_code& ec); 378e78f53d1SNikolas Klauser 379e78f53d1SNikolas Klauser void copy(const path& from, const path& to); 380e78f53d1SNikolas Klauser void copy(const path& from, const path& to, error_code& ec); 381e78f53d1SNikolas Klauser void copy(const path& from, const path& to, copy_options options); 382e78f53d1SNikolas Klauser void copy(const path& from, const path& to, copy_options options, 383e78f53d1SNikolas Klauser error_code& ec); 384e78f53d1SNikolas Klauser 385e78f53d1SNikolas Klauser bool copy_file(const path& from, const path& to); 386e78f53d1SNikolas Klauser bool copy_file(const path& from, const path& to, error_code& ec); 387e78f53d1SNikolas Klauser bool copy_file(const path& from, const path& to, copy_options option); 388e78f53d1SNikolas Klauser bool copy_file(const path& from, const path& to, copy_options option, 389e78f53d1SNikolas Klauser error_code& ec); 390e78f53d1SNikolas Klauser 391e78f53d1SNikolas Klauser void copy_symlink(const path& existing_symlink, const path& new_symlink); 392e78f53d1SNikolas Klauser void copy_symlink(const path& existing_symlink, const path& new_symlink, 393e78f53d1SNikolas Klauser error_code& ec) noexcept; 394e78f53d1SNikolas Klauser 395e78f53d1SNikolas Klauser bool create_directories(const path& p); 396e78f53d1SNikolas Klauser bool create_directories(const path& p, error_code& ec); 397e78f53d1SNikolas Klauser 398e78f53d1SNikolas Klauser bool create_directory(const path& p); 399e78f53d1SNikolas Klauser bool create_directory(const path& p, error_code& ec) noexcept; 400e78f53d1SNikolas Klauser 401e78f53d1SNikolas Klauser bool create_directory(const path& p, const path& attributes); 402e78f53d1SNikolas Klauser bool create_directory(const path& p, const path& attributes, 403e78f53d1SNikolas Klauser error_code& ec) noexcept; 404e78f53d1SNikolas Klauser 405e78f53d1SNikolas Klauser void create_directory_symlink(const path& to, const path& new_symlink); 406e78f53d1SNikolas Klauser void create_directory_symlink(const path& to, const path& new_symlink, 407e78f53d1SNikolas Klauser error_code& ec) noexcept; 408e78f53d1SNikolas Klauser 409e78f53d1SNikolas Klauser void create_hard_link(const path& to, const path& new_hard_link); 410e78f53d1SNikolas Klauser void create_hard_link(const path& to, const path& new_hard_link, 411e78f53d1SNikolas Klauser error_code& ec) noexcept; 412e78f53d1SNikolas Klauser 413e78f53d1SNikolas Klauser void create_symlink(const path& to, const path& new_symlink); 414e78f53d1SNikolas Klauser void create_symlink(const path& to, const path& new_symlink, 415e78f53d1SNikolas Klauser error_code& ec) noexcept; 416e78f53d1SNikolas Klauser 417e78f53d1SNikolas Klauser path current_path(); 418e78f53d1SNikolas Klauser path current_path(error_code& ec); 419e78f53d1SNikolas Klauser void current_path(const path& p); 420e78f53d1SNikolas Klauser void current_path(const path& p, error_code& ec) noexcept; 421e78f53d1SNikolas Klauser 422e78f53d1SNikolas Klauser bool exists(file_status s) noexcept; 423e78f53d1SNikolas Klauser bool exists(const path& p); 424e78f53d1SNikolas Klauser bool exists(const path& p, error_code& ec) noexcept; 425e78f53d1SNikolas Klauser 426e78f53d1SNikolas Klauser bool equivalent(const path& p1, const path& p2); 427e78f53d1SNikolas Klauser bool equivalent(const path& p1, const path& p2, error_code& ec) noexcept; 428e78f53d1SNikolas Klauser 429e78f53d1SNikolas Klauser uintmax_t file_size(const path& p); 430e78f53d1SNikolas Klauser uintmax_t file_size(const path& p, error_code& ec) noexcept; 431e78f53d1SNikolas Klauser 432e78f53d1SNikolas Klauser uintmax_t hard_link_count(const path& p); 433e78f53d1SNikolas Klauser uintmax_t hard_link_count(const path& p, error_code& ec) noexcept; 434e78f53d1SNikolas Klauser 435e78f53d1SNikolas Klauser bool is_block_file(file_status s) noexcept; 436e78f53d1SNikolas Klauser bool is_block_file(const path& p); 437e78f53d1SNikolas Klauser bool is_block_file(const path& p, error_code& ec) noexcept; 438e78f53d1SNikolas Klauser 439e78f53d1SNikolas Klauser bool is_character_file(file_status s) noexcept; 440e78f53d1SNikolas Klauser bool is_character_file(const path& p); 441e78f53d1SNikolas Klauser bool is_character_file(const path& p, error_code& ec) noexcept; 442e78f53d1SNikolas Klauser 443e78f53d1SNikolas Klauser bool is_directory(file_status s) noexcept; 444e78f53d1SNikolas Klauser bool is_directory(const path& p); 445e78f53d1SNikolas Klauser bool is_directory(const path& p, error_code& ec) noexcept; 446e78f53d1SNikolas Klauser 447e78f53d1SNikolas Klauser bool is_empty(const path& p); 448e78f53d1SNikolas Klauser bool is_empty(const path& p, error_code& ec) noexcept; 449e78f53d1SNikolas Klauser 450e78f53d1SNikolas Klauser bool is_fifo(file_status s) noexcept; 451e78f53d1SNikolas Klauser bool is_fifo(const path& p); 452e78f53d1SNikolas Klauser bool is_fifo(const path& p, error_code& ec) noexcept; 453e78f53d1SNikolas Klauser 454e78f53d1SNikolas Klauser bool is_other(file_status s) noexcept; 455e78f53d1SNikolas Klauser bool is_other(const path& p); 456e78f53d1SNikolas Klauser bool is_other(const path& p, error_code& ec) noexcept; 457e78f53d1SNikolas Klauser 458e78f53d1SNikolas Klauser bool is_regular_file(file_status s) noexcept; 459e78f53d1SNikolas Klauser bool is_regular_file(const path& p); 460e78f53d1SNikolas Klauser bool is_regular_file(const path& p, error_code& ec) noexcept; 461e78f53d1SNikolas Klauser 462e78f53d1SNikolas Klauser bool is_socket(file_status s) noexcept; 463e78f53d1SNikolas Klauser bool is_socket(const path& p); 464e78f53d1SNikolas Klauser bool is_socket(const path& p, error_code& ec) noexcept; 465e78f53d1SNikolas Klauser 466e78f53d1SNikolas Klauser bool is_symlink(file_status s) noexcept; 467e78f53d1SNikolas Klauser bool is_symlink(const path& p); 468e78f53d1SNikolas Klauser bool is_symlink(const path& p, error_code& ec) noexcept; 469e78f53d1SNikolas Klauser 470e78f53d1SNikolas Klauser file_time_type last_write_time(const path& p); 471e78f53d1SNikolas Klauser file_time_type last_write_time(const path& p, error_code& ec) noexcept; 472e78f53d1SNikolas Klauser void last_write_time(const path& p, file_time_type new_time); 473e78f53d1SNikolas Klauser void last_write_time(const path& p, file_time_type new_time, 474e78f53d1SNikolas Klauser error_code& ec) noexcept; 475e78f53d1SNikolas Klauser 476e78f53d1SNikolas Klauser void permissions(const path& p, perms prms, 477e78f53d1SNikolas Klauser perm_options opts=perm_options::replace); 478e78f53d1SNikolas Klauser void permissions(const path& p, perms prms, error_code& ec) noexcept; 479e78f53d1SNikolas Klauser void permissions(const path& p, perms prms, perm_options opts, 480e78f53d1SNikolas Klauser error_code& ec); 481e78f53d1SNikolas Klauser 482e78f53d1SNikolas Klauser path proximate(const path& p, error_code& ec); 483e78f53d1SNikolas Klauser path proximate(const path& p, const path& base = current_path()); 484e78f53d1SNikolas Klauser path proximate(const path& p, const path& base, error_code &ec); 485e78f53d1SNikolas Klauser 486e78f53d1SNikolas Klauser path read_symlink(const path& p); 487e78f53d1SNikolas Klauser path read_symlink(const path& p, error_code& ec); 488e78f53d1SNikolas Klauser 489e78f53d1SNikolas Klauser path relative(const path& p, error_code& ec); 490e78f53d1SNikolas Klauser path relative(const path& p, const path& base=current_path()); 491e78f53d1SNikolas Klauser path relative(const path& p, const path& base, error_code& ec); 492e78f53d1SNikolas Klauser 493e78f53d1SNikolas Klauser bool remove(const path& p); 494e78f53d1SNikolas Klauser bool remove(const path& p, error_code& ec) noexcept; 495e78f53d1SNikolas Klauser 496e78f53d1SNikolas Klauser uintmax_t remove_all(const path& p); 497e78f53d1SNikolas Klauser uintmax_t remove_all(const path& p, error_code& ec); 498e78f53d1SNikolas Klauser 499e78f53d1SNikolas Klauser void rename(const path& from, const path& to); 500e78f53d1SNikolas Klauser void rename(const path& from, const path& to, error_code& ec) noexcept; 501e78f53d1SNikolas Klauser 502e78f53d1SNikolas Klauser void resize_file(const path& p, uintmax_t size); 503e78f53d1SNikolas Klauser void resize_file(const path& p, uintmax_t size, error_code& ec) noexcept; 504e78f53d1SNikolas Klauser 505e78f53d1SNikolas Klauser space_info space(const path& p); 506e78f53d1SNikolas Klauser space_info space(const path& p, error_code& ec) noexcept; 507e78f53d1SNikolas Klauser 508e78f53d1SNikolas Klauser file_status status(const path& p); 509e78f53d1SNikolas Klauser file_status status(const path& p, error_code& ec) noexcept; 510e78f53d1SNikolas Klauser 511e78f53d1SNikolas Klauser bool status_known(file_status s) noexcept; 512e78f53d1SNikolas Klauser 513e78f53d1SNikolas Klauser file_status symlink_status(const path& p); 514e78f53d1SNikolas Klauser file_status symlink_status(const path& p, error_code& ec) noexcept; 515e78f53d1SNikolas Klauser 516e78f53d1SNikolas Klauser path temp_directory_path(); 517e78f53d1SNikolas Klauser path temp_directory_path(error_code& ec); 518e78f53d1SNikolas Klauser 519e78f53d1SNikolas Klauser path weakly_canonical(path const& p); 520e78f53d1SNikolas Klauser path weakly_canonical(path const& p, error_code& ec); 521e78f53d1SNikolas Klauser 522e78f53d1SNikolas Klauser} // namespace std::filesystem 523e78f53d1SNikolas Klauser 524e78f53d1SNikolas Klausertemplate <> 525e78f53d1SNikolas Klauserinline constexpr bool std::ranges::enable_borrowed_range<std::filesystem::directory_iterator> = true; 526e78f53d1SNikolas Klausertemplate <> 527e78f53d1SNikolas Klauserinline constexpr bool std::ranges::enable_borrowed_range<std::filesystem::recursive_directory_iterator> = true; 528e78f53d1SNikolas Klauser 529e78f53d1SNikolas Klausertemplate <> 530e78f53d1SNikolas Klauserinline constexpr bool std::ranges::enable_view<std::filesystem::directory_iterator> = true; 531e78f53d1SNikolas Klausertemplate <> 532e78f53d1SNikolas Klauserinline constexpr bool std::ranges::enable_view<std::filesystem::recursive_directory_iterator> = true; 533e78f53d1SNikolas Klauser 534e78f53d1SNikolas Klauser*/ 535e78f53d1SNikolas Klauser 53673fbae83SNikolas Klauser#include <__cxx03/__config> 537e78f53d1SNikolas Klauser 538e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17 53973fbae83SNikolas Klauser# include <__cxx03/__filesystem/copy_options.h> 54073fbae83SNikolas Klauser# include <__cxx03/__filesystem/directory_entry.h> 54173fbae83SNikolas Klauser# include <__cxx03/__filesystem/directory_iterator.h> 54273fbae83SNikolas Klauser# include <__cxx03/__filesystem/directory_options.h> 54373fbae83SNikolas Klauser# include <__cxx03/__filesystem/file_status.h> 54473fbae83SNikolas Klauser# include <__cxx03/__filesystem/file_time_type.h> 54573fbae83SNikolas Klauser# include <__cxx03/__filesystem/file_type.h> 54673fbae83SNikolas Klauser# include <__cxx03/__filesystem/filesystem_error.h> 54773fbae83SNikolas Klauser# include <__cxx03/__filesystem/operations.h> 54873fbae83SNikolas Klauser# include <__cxx03/__filesystem/path.h> 54973fbae83SNikolas Klauser# include <__cxx03/__filesystem/path_iterator.h> 55073fbae83SNikolas Klauser# include <__cxx03/__filesystem/perm_options.h> 55173fbae83SNikolas Klauser# include <__cxx03/__filesystem/perms.h> 55273fbae83SNikolas Klauser# include <__cxx03/__filesystem/recursive_directory_iterator.h> 55373fbae83SNikolas Klauser# include <__cxx03/__filesystem/space_info.h> 55473fbae83SNikolas Klauser# include <__cxx03/__filesystem/u8path.h> 555e78f53d1SNikolas Klauser#endif 556e78f53d1SNikolas Klauser 55773fbae83SNikolas Klauser#include <__cxx03/version> 558e78f53d1SNikolas Klauser 559e78f53d1SNikolas Klauser// standard-mandated includes 560e78f53d1SNikolas Klauser 561e78f53d1SNikolas Klauser// [fs.filesystem.syn] 56273fbae83SNikolas Klauser#include <__cxx03/compare> 563e78f53d1SNikolas Klauser 564e78f53d1SNikolas Klauser#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 565e78f53d1SNikolas Klauser# pragma GCC system_header 566e78f53d1SNikolas Klauser#endif 567e78f53d1SNikolas Klauser 568e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 56973fbae83SNikolas Klauser# include <__cxx03/concepts> 57073fbae83SNikolas Klauser# include <__cxx03/cstdlib> 57173fbae83SNikolas Klauser# include <__cxx03/cstring> 57273fbae83SNikolas Klauser# include <__cxx03/iosfwd> 57373fbae83SNikolas Klauser# include <__cxx03/new> 57473fbae83SNikolas Klauser# include <__cxx03/system_error> 575e78f53d1SNikolas Klauser#endif 576e78f53d1SNikolas Klauser 577*ce777190SNikolas Klauser#endif // _LIBCPP___CXX03_FILESYSTEM 578