xref: /llvm-project/libcxx/include/__cxx03/filesystem (revision ce7771902dc50d900de639d499a60486b83f70e0)
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