1303237Sdim// -*- C++ -*-
2303237Sdim//===--------------------------- filesystem -------------------------------===//
3303237Sdim//
4353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5353358Sdim// See https://llvm.org/LICENSE.txt for license information.
6353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7303237Sdim//
8303237Sdim//===----------------------------------------------------------------------===//
9303237Sdim#ifndef _LIBCPP_EXPERIMENTAL_FILESYSTEM
10303237Sdim#define _LIBCPP_EXPERIMENTAL_FILESYSTEM
11303237Sdim/*
12303237Sdim    filesystem synopsis
13303237Sdim
14303237Sdim    namespace std { namespace experimental { namespace filesystem { inline namespace v1 {
15303237Sdim
16303237Sdim    class path;
17303237Sdim
18341825Sdim    void swap(path& lhs, path& rhs) noexcept;
19341825Sdim    size_t hash_value(const path& p) noexcept;
20303237Sdim
21341825Sdim    bool operator==(const path& lhs, const path& rhs) noexcept;
22341825Sdim    bool operator!=(const path& lhs, const path& rhs) noexcept;
23341825Sdim    bool operator< (const path& lhs, const path& rhs) noexcept;
24341825Sdim    bool operator<=(const path& lhs, const path& rhs) noexcept;
25341825Sdim    bool operator> (const path& lhs, const path& rhs) noexcept;
26341825Sdim    bool operator>=(const path& lhs, const path& rhs) noexcept;
27303237Sdim
28303237Sdim    path operator/ (const path& lhs, const path& rhs);
29303237Sdim
30341825Sdim    // fs.path.io operators are friends of path.
31303237Sdim    template <class charT, class traits>
32341825Sdim    friend basic_ostream<charT, traits>&
33303237Sdim    operator<<(basic_ostream<charT, traits>& os, const path& p);
34303237Sdim
35303237Sdim    template <class charT, class traits>
36341825Sdim    friend basic_istream<charT, traits>&
37303237Sdim    operator>>(basic_istream<charT, traits>& is, path& p);
38303237Sdim
39303237Sdim    template <class Source>
40303237Sdim      path u8path(const Source& source);
41303237Sdim    template <class InputIterator>
42303237Sdim      path u8path(InputIterator first, InputIterator last);
43303237Sdim
44303237Sdim    class filesystem_error;
45303237Sdim    class directory_entry;
46303237Sdim
47303237Sdim    class directory_iterator;
48303237Sdim
49303237Sdim    // enable directory_iterator range-based for statements
50303237Sdim    directory_iterator begin(directory_iterator iter) noexcept;
51303237Sdim    directory_iterator end(const directory_iterator&) noexcept;
52303237Sdim
53303237Sdim    class recursive_directory_iterator;
54303237Sdim
55303237Sdim    // enable recursive_directory_iterator range-based for statements
56303237Sdim    recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept;
57303237Sdim    recursive_directory_iterator end(const recursive_directory_iterator&) noexcept;
58303237Sdim
59303237Sdim    class file_status;
60303237Sdim
61303237Sdim    struct space_info
62303237Sdim    {
63303237Sdim      uintmax_t capacity;
64303237Sdim      uintmax_t free;
65303237Sdim      uintmax_t available;
66303237Sdim    };
67303237Sdim
68303237Sdim    enum class file_type;
69303237Sdim    enum class perms;
70341825Sdim    enum class perm_options;
71303237Sdim    enum class copy_options;
72303237Sdim    enum class directory_options;
73303237Sdim
74303237Sdim    typedef chrono::time_point<trivial-clock>  file_time_type;
75303237Sdim
76303237Sdim    // operational functions
77303237Sdim
78341825Sdim    path absolute(const path& p);
79341825Sdim    path absolute(const path& p, error_code &ec);
80303237Sdim
81341825Sdim    path canonical(const path& p);
82303237Sdim    path canonical(const path& p, error_code& ec);
83303237Sdim
84303237Sdim    void copy(const path& from, const path& to);
85327952Sdim    void copy(const path& from, const path& to, error_code& ec);
86303237Sdim    void copy(const path& from, const path& to, copy_options options);
87303237Sdim    void copy(const path& from, const path& to, copy_options options,
88327952Sdim                   error_code& ec);
89303237Sdim
90303237Sdim    bool copy_file(const path& from, const path& to);
91341825Sdim    bool copy_file(const path& from, const path& to, error_code& ec);
92303237Sdim    bool copy_file(const path& from, const path& to, copy_options option);
93303237Sdim    bool copy_file(const path& from, const path& to, copy_options option,
94341825Sdim                           error_code& ec);
95303237Sdim
96303237Sdim    void copy_symlink(const path& existing_symlink, const path& new_symlink);
97303237Sdim    void copy_symlink(const path& existing_symlink, const path& new_symlink,
98341825Sdim                              error_code& ec) noexcept;
99303237Sdim
100303237Sdim    bool create_directories(const path& p);
101341825Sdim    bool create_directories(const path& p, error_code& ec);
102303237Sdim
103303237Sdim    bool create_directory(const path& p);
104341825Sdim    bool create_directory(const path& p, error_code& ec) noexcept;
105303237Sdim
106303237Sdim    bool create_directory(const path& p, const path& attributes);
107303237Sdim    bool create_directory(const path& p, const path& attributes,
108341825Sdim                                  error_code& ec) noexcept;
109303237Sdim
110303237Sdim    void create_directory_symlink(const path& to, const path& new_symlink);
111303237Sdim    void create_directory_symlink(const path& to, const path& new_symlink,
112341825Sdim                                          error_code& ec) noexcept;
113303237Sdim
114303237Sdim    void create_hard_link(const path& to, const path& new_hard_link);
115303237Sdim    void create_hard_link(const path& to, const path& new_hard_link,
116341825Sdim                                  error_code& ec) noexcept;
117303237Sdim
118303237Sdim    void create_symlink(const path& to, const path& new_symlink);
119303237Sdim    void create_symlink(const path& to, const path& new_symlink,
120341825Sdim                                error_code& ec) noexcept;
121303237Sdim
122303237Sdim    path current_path();
123303237Sdim    path current_path(error_code& ec);
124303237Sdim    void current_path(const path& p);
125341825Sdim    void current_path(const path& p, error_code& ec) noexcept;
126303237Sdim
127341825Sdim    bool exists(file_status s) noexcept;
128303237Sdim    bool exists(const path& p);
129341825Sdim    bool exists(const path& p, error_code& ec) noexcept;
130303237Sdim
131303237Sdim    bool equivalent(const path& p1, const path& p2);
132341825Sdim    bool equivalent(const path& p1, const path& p2, error_code& ec) noexcept;
133303237Sdim
134303237Sdim    uintmax_t    file_size(const path& p);
135341825Sdim    uintmax_t    file_size(const path& p, error_code& ec) noexcept;
136303237Sdim
137303237Sdim    uintmax_t    hard_link_count(const path& p);
138341825Sdim    uintmax_t    hard_link_count(const path& p, error_code& ec) noexcept;
139303237Sdim
140341825Sdim    bool is_block_file(file_status s) noexcept;
141303237Sdim    bool is_block_file(const path& p);
142341825Sdim    bool is_block_file(const path& p, error_code& ec) noexcept;
143303237Sdim
144341825Sdim    bool is_character_file(file_status s) noexcept;
145303237Sdim    bool is_character_file(const path& p);
146341825Sdim    bool is_character_file(const path& p, error_code& ec) noexcept;
147303237Sdim
148341825Sdim    bool is_directory(file_status s) noexcept;
149303237Sdim    bool is_directory(const path& p);
150341825Sdim    bool is_directory(const path& p, error_code& ec) noexcept;
151303237Sdim
152303237Sdim    bool is_empty(const path& p);
153341825Sdim    bool is_empty(const path& p, error_code& ec) noexcept;
154303237Sdim
155341825Sdim    bool is_fifo(file_status s) noexcept;
156303237Sdim    bool is_fifo(const path& p);
157341825Sdim    bool is_fifo(const path& p, error_code& ec) noexcept;
158303237Sdim
159341825Sdim    bool is_other(file_status s) noexcept;
160303237Sdim    bool is_other(const path& p);
161341825Sdim    bool is_other(const path& p, error_code& ec) noexcept;
162303237Sdim
163341825Sdim    bool is_regular_file(file_status s) noexcept;
164303237Sdim    bool is_regular_file(const path& p);
165341825Sdim    bool is_regular_file(const path& p, error_code& ec) noexcept;
166303237Sdim
167341825Sdim    bool is_socket(file_status s) noexcept;
168303237Sdim    bool is_socket(const path& p);
169341825Sdim    bool is_socket(const path& p, error_code& ec) noexcept;
170303237Sdim
171341825Sdim    bool is_symlink(file_status s) noexcept;
172303237Sdim    bool is_symlink(const path& p);
173341825Sdim    bool is_symlink(const path& p, error_code& ec) noexcept;
174303237Sdim
175303237Sdim    file_time_type  last_write_time(const path& p);
176341825Sdim    file_time_type  last_write_time(const path& p, error_code& ec) noexcept;
177303237Sdim    void last_write_time(const path& p, file_time_type new_time);
178303237Sdim    void last_write_time(const path& p, file_time_type new_time,
179341825Sdim                                 error_code& ec) noexcept;
180303237Sdim
181341825Sdim    void permissions(const path& p, perms prms,
182341825Sdim                     perm_options opts=perm_options::replace);
183341825Sdim    void permissions(const path& p, perms prms, error_code& ec) noexcept;
184341825Sdim    void permissions(const path& p, perms prms, perm_options opts,
185341825Sdim                     error_code& ec);
186303237Sdim
187341825Sdim    path proximate(const path& p, error_code& ec);
188341825Sdim    path proximate(const path& p, const path& base = current_path());
189341825Sdim    path proximate(const path& p, const path& base, error_code &ec);
190341825Sdim
191303237Sdim    path read_symlink(const path& p);
192303237Sdim    path read_symlink(const path& p, error_code& ec);
193303237Sdim
194341825Sdim    path relative(const path& p, error_code& ec);
195341825Sdim    path relative(const path& p, const path& base=current_path());
196341825Sdim    path relative(const path& p, const path& base, error_code& ec);
197341825Sdim
198303237Sdim    bool remove(const path& p);
199341825Sdim    bool remove(const path& p, error_code& ec) noexcept;
200303237Sdim
201303237Sdim    uintmax_t    remove_all(const path& p);
202341825Sdim    uintmax_t    remove_all(const path& p, error_code& ec);
203303237Sdim
204303237Sdim    void rename(const path& from, const path& to);
205341825Sdim    void rename(const path& from, const path& to, error_code& ec) noexcept;
206303237Sdim
207303237Sdim    void resize_file(const path& p, uintmax_t size);
208341825Sdim    void resize_file(const path& p, uintmax_t size, error_code& ec) noexcept;
209303237Sdim
210303237Sdim    space_info   space(const path& p);
211341825Sdim    space_info   space(const path& p, error_code& ec) noexcept;
212303237Sdim
213303237Sdim    file_status  status(const path& p);
214341825Sdim    file_status  status(const path& p, error_code& ec) noexcept;
215303237Sdim
216341825Sdim    bool status_known(file_status s) noexcept;
217303237Sdim
218303237Sdim    file_status  symlink_status(const path& p);
219341825Sdim    file_status  symlink_status(const path& p, error_code& ec) noexcept;
220303237Sdim
221303237Sdim    path temp_directory_path();
222303237Sdim    path temp_directory_path(error_code& ec);
223303237Sdim
224341825Sdim    path weakly_canonical(path const& p);
225341825Sdim    path weakly_canonical(path const& p, error_code& ec);
226341825Sdim
227341825Sdim
228303237Sdim} } } }  // namespaces std::experimental::filesystem::v1
229303237Sdim
230303237Sdim*/
231303237Sdim
232303237Sdim#include <experimental/__config>
233341825Sdim#include <filesystem>
234303237Sdim
235303237Sdim#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
236303237Sdim#pragma GCC system_header
237303237Sdim#endif
238303237Sdim
239341825Sdim_LIBCPP_PUSH_MACROS
240341825Sdim#include <__undef_macros>
241341825Sdim
242341825Sdim#ifndef _LIBCPP_CXX03_LANG
243341825Sdim
244303237Sdim#define __cpp_lib_experimental_filesystem 201406
245303237Sdim
246303237Sdim_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_FILESYSTEM
247303237Sdim
248341825Sdimusing namespace _VSTD_FS;
249303237Sdim
250341825Sdim_LIBCPP_END_NAMESPACE_EXPERIMENTAL_FILESYSTEM
251303237Sdim
252341825Sdim#endif // !_LIBCPP_CXX03_LANG
253303237Sdim
254341825Sdim_LIBCPP_POP_MACROS
255303237Sdim
256303237Sdim#endif // _LIBCPP_EXPERIMENTAL_FILESYSTEM
257