1// -*- C++ -*-
2//===--------------------------- filesystem -------------------------------===//
3//
4//                     The LLVM Compiler Infrastructure
5//
6// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10#ifndef _LIBCPP_EXPERIMENTAL_FILESYSTEM
11#define _LIBCPP_EXPERIMENTAL_FILESYSTEM
12/*
13    filesystem synopsis
14
15    namespace std { namespace experimental { namespace filesystem { inline namespace v1 {
16
17    class path;
18
19    void swap(path& lhs, path& rhs) noexcept;
20    size_t hash_value(const path& p) noexcept;
21
22    bool operator==(const path& lhs, const path& rhs) noexcept;
23    bool operator!=(const path& lhs, const path& rhs) noexcept;
24    bool operator< (const path& lhs, const path& rhs) noexcept;
25    bool operator<=(const path& lhs, const path& rhs) noexcept;
26    bool operator> (const path& lhs, const path& rhs) noexcept;
27    bool operator>=(const path& lhs, const path& rhs) noexcept;
28
29    path operator/ (const path& lhs, const path& rhs);
30
31    // fs.path.io operators are friends of path.
32    template <class charT, class traits>
33    friend basic_ostream<charT, traits>&
34    operator<<(basic_ostream<charT, traits>& os, const path& p);
35
36    template <class charT, class traits>
37    friend basic_istream<charT, traits>&
38    operator>>(basic_istream<charT, traits>& is, path& p);
39
40    template <class Source>
41      path u8path(const Source& source);
42    template <class InputIterator>
43      path u8path(InputIterator first, InputIterator last);
44
45    class filesystem_error;
46    class directory_entry;
47
48    class directory_iterator;
49
50    // enable directory_iterator range-based for statements
51    directory_iterator begin(directory_iterator iter) noexcept;
52    directory_iterator end(const directory_iterator&) noexcept;
53
54    class recursive_directory_iterator;
55
56    // enable recursive_directory_iterator range-based for statements
57    recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept;
58    recursive_directory_iterator end(const recursive_directory_iterator&) noexcept;
59
60    class file_status;
61
62    struct space_info
63    {
64      uintmax_t capacity;
65      uintmax_t free;
66      uintmax_t available;
67    };
68
69    enum class file_type;
70    enum class perms;
71    enum class perm_options;
72    enum class copy_options;
73    enum class directory_options;
74
75    typedef chrono::time_point<trivial-clock>  file_time_type;
76
77    // operational functions
78
79    path absolute(const path& p);
80    path absolute(const path& p, error_code &ec);
81
82    path canonical(const path& p);
83    path canonical(const path& p, error_code& ec);
84
85    void copy(const path& from, const path& to);
86    void copy(const path& from, const path& to, error_code& ec);
87    void copy(const path& from, const path& to, copy_options options);
88    void copy(const path& from, const path& to, copy_options options,
89                   error_code& ec);
90
91    bool copy_file(const path& from, const path& to);
92    bool copy_file(const path& from, const path& to, error_code& ec);
93    bool copy_file(const path& from, const path& to, copy_options option);
94    bool copy_file(const path& from, const path& to, copy_options option,
95                           error_code& ec);
96
97    void copy_symlink(const path& existing_symlink, const path& new_symlink);
98    void copy_symlink(const path& existing_symlink, const path& new_symlink,
99                              error_code& ec) noexcept;
100
101    bool create_directories(const path& p);
102    bool create_directories(const path& p, error_code& ec);
103
104    bool create_directory(const path& p);
105    bool create_directory(const path& p, error_code& ec) noexcept;
106
107    bool create_directory(const path& p, const path& attributes);
108    bool create_directory(const path& p, const path& attributes,
109                                  error_code& ec) noexcept;
110
111    void create_directory_symlink(const path& to, const path& new_symlink);
112    void create_directory_symlink(const path& to, const path& new_symlink,
113                                          error_code& ec) noexcept;
114
115    void create_hard_link(const path& to, const path& new_hard_link);
116    void create_hard_link(const path& to, const path& new_hard_link,
117                                  error_code& ec) noexcept;
118
119    void create_symlink(const path& to, const path& new_symlink);
120    void create_symlink(const path& to, const path& new_symlink,
121                                error_code& ec) noexcept;
122
123    path current_path();
124    path current_path(error_code& ec);
125    void current_path(const path& p);
126    void current_path(const path& p, error_code& ec) noexcept;
127
128    bool exists(file_status s) noexcept;
129    bool exists(const path& p);
130    bool exists(const path& p, error_code& ec) noexcept;
131
132    bool equivalent(const path& p1, const path& p2);
133    bool equivalent(const path& p1, const path& p2, error_code& ec) noexcept;
134
135    uintmax_t    file_size(const path& p);
136    uintmax_t    file_size(const path& p, error_code& ec) noexcept;
137
138    uintmax_t    hard_link_count(const path& p);
139    uintmax_t    hard_link_count(const path& p, error_code& ec) noexcept;
140
141    bool is_block_file(file_status s) noexcept;
142    bool is_block_file(const path& p);
143    bool is_block_file(const path& p, error_code& ec) noexcept;
144
145    bool is_character_file(file_status s) noexcept;
146    bool is_character_file(const path& p);
147    bool is_character_file(const path& p, error_code& ec) noexcept;
148
149    bool is_directory(file_status s) noexcept;
150    bool is_directory(const path& p);
151    bool is_directory(const path& p, error_code& ec) noexcept;
152
153    bool is_empty(const path& p);
154    bool is_empty(const path& p, error_code& ec) noexcept;
155
156    bool is_fifo(file_status s) noexcept;
157    bool is_fifo(const path& p);
158    bool is_fifo(const path& p, error_code& ec) noexcept;
159
160    bool is_other(file_status s) noexcept;
161    bool is_other(const path& p);
162    bool is_other(const path& p, error_code& ec) noexcept;
163
164    bool is_regular_file(file_status s) noexcept;
165    bool is_regular_file(const path& p);
166    bool is_regular_file(const path& p, error_code& ec) noexcept;
167
168    bool is_socket(file_status s) noexcept;
169    bool is_socket(const path& p);
170    bool is_socket(const path& p, error_code& ec) noexcept;
171
172    bool is_symlink(file_status s) noexcept;
173    bool is_symlink(const path& p);
174    bool is_symlink(const path& p, error_code& ec) noexcept;
175
176    file_time_type  last_write_time(const path& p);
177    file_time_type  last_write_time(const path& p, error_code& ec) noexcept;
178    void last_write_time(const path& p, file_time_type new_time);
179    void last_write_time(const path& p, file_time_type new_time,
180                                 error_code& ec) noexcept;
181
182    void permissions(const path& p, perms prms,
183                     perm_options opts=perm_options::replace);
184    void permissions(const path& p, perms prms, error_code& ec) noexcept;
185    void permissions(const path& p, perms prms, perm_options opts,
186                     error_code& ec);
187
188    path proximate(const path& p, error_code& ec);
189    path proximate(const path& p, const path& base = current_path());
190    path proximate(const path& p, const path& base, error_code &ec);
191
192    path read_symlink(const path& p);
193    path read_symlink(const path& p, error_code& ec);
194
195    path relative(const path& p, error_code& ec);
196    path relative(const path& p, const path& base=current_path());
197    path relative(const path& p, const path& base, error_code& ec);
198
199    bool remove(const path& p);
200    bool remove(const path& p, error_code& ec) noexcept;
201
202    uintmax_t    remove_all(const path& p);
203    uintmax_t    remove_all(const path& p, error_code& ec);
204
205    void rename(const path& from, const path& to);
206    void rename(const path& from, const path& to, error_code& ec) noexcept;
207
208    void resize_file(const path& p, uintmax_t size);
209    void resize_file(const path& p, uintmax_t size, error_code& ec) noexcept;
210
211    space_info   space(const path& p);
212    space_info   space(const path& p, error_code& ec) noexcept;
213
214    file_status  status(const path& p);
215    file_status  status(const path& p, error_code& ec) noexcept;
216
217    bool status_known(file_status s) noexcept;
218
219    file_status  symlink_status(const path& p);
220    file_status  symlink_status(const path& p, error_code& ec) noexcept;
221
222    path temp_directory_path();
223    path temp_directory_path(error_code& ec);
224
225    path weakly_canonical(path const& p);
226    path weakly_canonical(path const& p, error_code& ec);
227
228
229} } } }  // namespaces std::experimental::filesystem::v1
230
231*/
232
233#include <experimental/__config>
234#include <filesystem>
235
236#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
237#pragma GCC system_header
238#endif
239
240_LIBCPP_PUSH_MACROS
241#include <__undef_macros>
242
243#ifndef _LIBCPP_CXX03_LANG
244
245#define __cpp_lib_experimental_filesystem 201406
246
247_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_FILESYSTEM
248
249using namespace _VSTD_FS;
250
251_LIBCPP_END_NAMESPACE_EXPERIMENTAL_FILESYSTEM
252
253#endif // !_LIBCPP_CXX03_LANG
254
255_LIBCPP_POP_MACROS
256
257#endif // _LIBCPP_EXPERIMENTAL_FILESYSTEM
258