17c82a1ecSDimitry Andric// -*- C++ -*-
27c82a1ecSDimitry Andric//===--------------------------- filesystem -------------------------------===//
37c82a1ecSDimitry Andric//
47c82a1ecSDimitry Andric//                     The LLVM Compiler Infrastructure
57c82a1ecSDimitry Andric//
67c82a1ecSDimitry Andric// This file is dual licensed under the MIT and the University of Illinois Open
77c82a1ecSDimitry Andric// Source Licenses. See LICENSE.TXT for details.
87c82a1ecSDimitry Andric//
97c82a1ecSDimitry Andric//===----------------------------------------------------------------------===//
107c82a1ecSDimitry Andric#ifndef _LIBCPP_EXPERIMENTAL_FILESYSTEM
117c82a1ecSDimitry Andric#define _LIBCPP_EXPERIMENTAL_FILESYSTEM
127c82a1ecSDimitry Andric/*
137c82a1ecSDimitry Andric    filesystem synopsis
147c82a1ecSDimitry Andric
157c82a1ecSDimitry Andric    namespace std { namespace experimental { namespace filesystem { inline namespace v1 {
167c82a1ecSDimitry Andric
177c82a1ecSDimitry Andric    class path;
187c82a1ecSDimitry Andric
19*4ba319b5SDimitry Andric    void swap(path& lhs, path& rhs) noexcept;
20*4ba319b5SDimitry Andric    size_t hash_value(const path& p) noexcept;
217c82a1ecSDimitry Andric
22*4ba319b5SDimitry Andric    bool operator==(const path& lhs, const path& rhs) noexcept;
23*4ba319b5SDimitry Andric    bool operator!=(const path& lhs, const path& rhs) noexcept;
24*4ba319b5SDimitry Andric    bool operator< (const path& lhs, const path& rhs) noexcept;
25*4ba319b5SDimitry Andric    bool operator<=(const path& lhs, const path& rhs) noexcept;
26*4ba319b5SDimitry Andric    bool operator> (const path& lhs, const path& rhs) noexcept;
27*4ba319b5SDimitry Andric    bool operator>=(const path& lhs, const path& rhs) noexcept;
287c82a1ecSDimitry Andric
297c82a1ecSDimitry Andric    path operator/ (const path& lhs, const path& rhs);
307c82a1ecSDimitry Andric
31*4ba319b5SDimitry Andric    // fs.path.io operators are friends of path.
327c82a1ecSDimitry Andric    template <class charT, class traits>
33*4ba319b5SDimitry Andric    friend basic_ostream<charT, traits>&
347c82a1ecSDimitry Andric    operator<<(basic_ostream<charT, traits>& os, const path& p);
357c82a1ecSDimitry Andric
367c82a1ecSDimitry Andric    template <class charT, class traits>
37*4ba319b5SDimitry Andric    friend basic_istream<charT, traits>&
387c82a1ecSDimitry Andric    operator>>(basic_istream<charT, traits>& is, path& p);
397c82a1ecSDimitry Andric
407c82a1ecSDimitry Andric    template <class Source>
417c82a1ecSDimitry Andric      path u8path(const Source& source);
427c82a1ecSDimitry Andric    template <class InputIterator>
437c82a1ecSDimitry Andric      path u8path(InputIterator first, InputIterator last);
447c82a1ecSDimitry Andric
457c82a1ecSDimitry Andric    class filesystem_error;
467c82a1ecSDimitry Andric    class directory_entry;
477c82a1ecSDimitry Andric
487c82a1ecSDimitry Andric    class directory_iterator;
497c82a1ecSDimitry Andric
507c82a1ecSDimitry Andric    // enable directory_iterator range-based for statements
517c82a1ecSDimitry Andric    directory_iterator begin(directory_iterator iter) noexcept;
527c82a1ecSDimitry Andric    directory_iterator end(const directory_iterator&) noexcept;
537c82a1ecSDimitry Andric
547c82a1ecSDimitry Andric    class recursive_directory_iterator;
557c82a1ecSDimitry Andric
567c82a1ecSDimitry Andric    // enable recursive_directory_iterator range-based for statements
577c82a1ecSDimitry Andric    recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept;
587c82a1ecSDimitry Andric    recursive_directory_iterator end(const recursive_directory_iterator&) noexcept;
597c82a1ecSDimitry Andric
607c82a1ecSDimitry Andric    class file_status;
617c82a1ecSDimitry Andric
627c82a1ecSDimitry Andric    struct space_info
637c82a1ecSDimitry Andric    {
647c82a1ecSDimitry Andric      uintmax_t capacity;
657c82a1ecSDimitry Andric      uintmax_t free;
667c82a1ecSDimitry Andric      uintmax_t available;
677c82a1ecSDimitry Andric    };
687c82a1ecSDimitry Andric
697c82a1ecSDimitry Andric    enum class file_type;
707c82a1ecSDimitry Andric    enum class perms;
71*4ba319b5SDimitry Andric    enum class perm_options;
727c82a1ecSDimitry Andric    enum class copy_options;
737c82a1ecSDimitry Andric    enum class directory_options;
747c82a1ecSDimitry Andric
757c82a1ecSDimitry Andric    typedef chrono::time_point<trivial-clock>  file_time_type;
767c82a1ecSDimitry Andric
777c82a1ecSDimitry Andric    // operational functions
787c82a1ecSDimitry Andric
79*4ba319b5SDimitry Andric    path absolute(const path& p);
80*4ba319b5SDimitry Andric    path absolute(const path& p, error_code &ec);
817c82a1ecSDimitry Andric
82*4ba319b5SDimitry Andric    path canonical(const path& p);
837c82a1ecSDimitry Andric    path canonical(const path& p, error_code& ec);
847c82a1ecSDimitry Andric
857c82a1ecSDimitry Andric    void copy(const path& from, const path& to);
86b2c7081bSDimitry Andric    void copy(const path& from, const path& to, error_code& ec);
877c82a1ecSDimitry Andric    void copy(const path& from, const path& to, copy_options options);
887c82a1ecSDimitry Andric    void copy(const path& from, const path& to, copy_options options,
89b2c7081bSDimitry Andric                   error_code& ec);
907c82a1ecSDimitry Andric
917c82a1ecSDimitry Andric    bool copy_file(const path& from, const path& to);
92*4ba319b5SDimitry Andric    bool copy_file(const path& from, const path& to, error_code& ec);
937c82a1ecSDimitry Andric    bool copy_file(const path& from, const path& to, copy_options option);
947c82a1ecSDimitry Andric    bool copy_file(const path& from, const path& to, copy_options option,
95*4ba319b5SDimitry Andric                           error_code& ec);
967c82a1ecSDimitry Andric
977c82a1ecSDimitry Andric    void copy_symlink(const path& existing_symlink, const path& new_symlink);
987c82a1ecSDimitry Andric    void copy_symlink(const path& existing_symlink, const path& new_symlink,
99*4ba319b5SDimitry Andric                              error_code& ec) noexcept;
1007c82a1ecSDimitry Andric
1017c82a1ecSDimitry Andric    bool create_directories(const path& p);
102*4ba319b5SDimitry Andric    bool create_directories(const path& p, error_code& ec);
1037c82a1ecSDimitry Andric
1047c82a1ecSDimitry Andric    bool create_directory(const path& p);
105*4ba319b5SDimitry Andric    bool create_directory(const path& p, error_code& ec) noexcept;
1067c82a1ecSDimitry Andric
1077c82a1ecSDimitry Andric    bool create_directory(const path& p, const path& attributes);
1087c82a1ecSDimitry Andric    bool create_directory(const path& p, const path& attributes,
109*4ba319b5SDimitry Andric                                  error_code& ec) noexcept;
1107c82a1ecSDimitry Andric
1117c82a1ecSDimitry Andric    void create_directory_symlink(const path& to, const path& new_symlink);
1127c82a1ecSDimitry Andric    void create_directory_symlink(const path& to, const path& new_symlink,
113*4ba319b5SDimitry Andric                                          error_code& ec) noexcept;
1147c82a1ecSDimitry Andric
1157c82a1ecSDimitry Andric    void create_hard_link(const path& to, const path& new_hard_link);
1167c82a1ecSDimitry Andric    void create_hard_link(const path& to, const path& new_hard_link,
117*4ba319b5SDimitry Andric                                  error_code& ec) noexcept;
1187c82a1ecSDimitry Andric
1197c82a1ecSDimitry Andric    void create_symlink(const path& to, const path& new_symlink);
1207c82a1ecSDimitry Andric    void create_symlink(const path& to, const path& new_symlink,
121*4ba319b5SDimitry Andric                                error_code& ec) noexcept;
1227c82a1ecSDimitry Andric
1237c82a1ecSDimitry Andric    path current_path();
1247c82a1ecSDimitry Andric    path current_path(error_code& ec);
1257c82a1ecSDimitry Andric    void current_path(const path& p);
126*4ba319b5SDimitry Andric    void current_path(const path& p, error_code& ec) noexcept;
1277c82a1ecSDimitry Andric
128*4ba319b5SDimitry Andric    bool exists(file_status s) noexcept;
1297c82a1ecSDimitry Andric    bool exists(const path& p);
130*4ba319b5SDimitry Andric    bool exists(const path& p, error_code& ec) noexcept;
1317c82a1ecSDimitry Andric
1327c82a1ecSDimitry Andric    bool equivalent(const path& p1, const path& p2);
133*4ba319b5SDimitry Andric    bool equivalent(const path& p1, const path& p2, error_code& ec) noexcept;
1347c82a1ecSDimitry Andric
1357c82a1ecSDimitry Andric    uintmax_t    file_size(const path& p);
136*4ba319b5SDimitry Andric    uintmax_t    file_size(const path& p, error_code& ec) noexcept;
1377c82a1ecSDimitry Andric
1387c82a1ecSDimitry Andric    uintmax_t    hard_link_count(const path& p);
139*4ba319b5SDimitry Andric    uintmax_t    hard_link_count(const path& p, error_code& ec) noexcept;
1407c82a1ecSDimitry Andric
141*4ba319b5SDimitry Andric    bool is_block_file(file_status s) noexcept;
1427c82a1ecSDimitry Andric    bool is_block_file(const path& p);
143*4ba319b5SDimitry Andric    bool is_block_file(const path& p, error_code& ec) noexcept;
1447c82a1ecSDimitry Andric
145*4ba319b5SDimitry Andric    bool is_character_file(file_status s) noexcept;
1467c82a1ecSDimitry Andric    bool is_character_file(const path& p);
147*4ba319b5SDimitry Andric    bool is_character_file(const path& p, error_code& ec) noexcept;
1487c82a1ecSDimitry Andric
149*4ba319b5SDimitry Andric    bool is_directory(file_status s) noexcept;
1507c82a1ecSDimitry Andric    bool is_directory(const path& p);
151*4ba319b5SDimitry Andric    bool is_directory(const path& p, error_code& ec) noexcept;
1527c82a1ecSDimitry Andric
1537c82a1ecSDimitry Andric    bool is_empty(const path& p);
154*4ba319b5SDimitry Andric    bool is_empty(const path& p, error_code& ec) noexcept;
1557c82a1ecSDimitry Andric
156*4ba319b5SDimitry Andric    bool is_fifo(file_status s) noexcept;
1577c82a1ecSDimitry Andric    bool is_fifo(const path& p);
158*4ba319b5SDimitry Andric    bool is_fifo(const path& p, error_code& ec) noexcept;
1597c82a1ecSDimitry Andric
160*4ba319b5SDimitry Andric    bool is_other(file_status s) noexcept;
1617c82a1ecSDimitry Andric    bool is_other(const path& p);
162*4ba319b5SDimitry Andric    bool is_other(const path& p, error_code& ec) noexcept;
1637c82a1ecSDimitry Andric
164*4ba319b5SDimitry Andric    bool is_regular_file(file_status s) noexcept;
1657c82a1ecSDimitry Andric    bool is_regular_file(const path& p);
166*4ba319b5SDimitry Andric    bool is_regular_file(const path& p, error_code& ec) noexcept;
1677c82a1ecSDimitry Andric
168*4ba319b5SDimitry Andric    bool is_socket(file_status s) noexcept;
1697c82a1ecSDimitry Andric    bool is_socket(const path& p);
170*4ba319b5SDimitry Andric    bool is_socket(const path& p, error_code& ec) noexcept;
1717c82a1ecSDimitry Andric
172*4ba319b5SDimitry Andric    bool is_symlink(file_status s) noexcept;
1737c82a1ecSDimitry Andric    bool is_symlink(const path& p);
174*4ba319b5SDimitry Andric    bool is_symlink(const path& p, error_code& ec) noexcept;
1757c82a1ecSDimitry Andric
1767c82a1ecSDimitry Andric    file_time_type  last_write_time(const path& p);
177*4ba319b5SDimitry Andric    file_time_type  last_write_time(const path& p, error_code& ec) noexcept;
1787c82a1ecSDimitry Andric    void last_write_time(const path& p, file_time_type new_time);
1797c82a1ecSDimitry Andric    void last_write_time(const path& p, file_time_type new_time,
180*4ba319b5SDimitry Andric                                 error_code& ec) noexcept;
1817c82a1ecSDimitry Andric
182*4ba319b5SDimitry Andric    void permissions(const path& p, perms prms,
183*4ba319b5SDimitry Andric                     perm_options opts=perm_options::replace);
184*4ba319b5SDimitry Andric    void permissions(const path& p, perms prms, error_code& ec) noexcept;
185*4ba319b5SDimitry Andric    void permissions(const path& p, perms prms, perm_options opts,
186*4ba319b5SDimitry Andric                     error_code& ec);
187*4ba319b5SDimitry Andric
188*4ba319b5SDimitry Andric    path proximate(const path& p, error_code& ec);
189*4ba319b5SDimitry Andric    path proximate(const path& p, const path& base = current_path());
190*4ba319b5SDimitry Andric    path proximate(const path& p, const path& base, error_code &ec);
1917c82a1ecSDimitry Andric
1927c82a1ecSDimitry Andric    path read_symlink(const path& p);
1937c82a1ecSDimitry Andric    path read_symlink(const path& p, error_code& ec);
1947c82a1ecSDimitry Andric
195*4ba319b5SDimitry Andric    path relative(const path& p, error_code& ec);
196*4ba319b5SDimitry Andric    path relative(const path& p, const path& base=current_path());
197*4ba319b5SDimitry Andric    path relative(const path& p, const path& base, error_code& ec);
198*4ba319b5SDimitry Andric
1997c82a1ecSDimitry Andric    bool remove(const path& p);
200*4ba319b5SDimitry Andric    bool remove(const path& p, error_code& ec) noexcept;
2017c82a1ecSDimitry Andric
2027c82a1ecSDimitry Andric    uintmax_t    remove_all(const path& p);
203*4ba319b5SDimitry Andric    uintmax_t    remove_all(const path& p, error_code& ec);
2047c82a1ecSDimitry Andric
2057c82a1ecSDimitry Andric    void rename(const path& from, const path& to);
206*4ba319b5SDimitry Andric    void rename(const path& from, const path& to, error_code& ec) noexcept;
2077c82a1ecSDimitry Andric
2087c82a1ecSDimitry Andric    void resize_file(const path& p, uintmax_t size);
209*4ba319b5SDimitry Andric    void resize_file(const path& p, uintmax_t size, error_code& ec) noexcept;
2107c82a1ecSDimitry Andric
2117c82a1ecSDimitry Andric    space_info   space(const path& p);
212*4ba319b5SDimitry Andric    space_info   space(const path& p, error_code& ec) noexcept;
2137c82a1ecSDimitry Andric
2147c82a1ecSDimitry Andric    file_status  status(const path& p);
215*4ba319b5SDimitry Andric    file_status  status(const path& p, error_code& ec) noexcept;
2167c82a1ecSDimitry Andric
217*4ba319b5SDimitry Andric    bool status_known(file_status s) noexcept;
2187c82a1ecSDimitry Andric
2197c82a1ecSDimitry Andric    file_status  symlink_status(const path& p);
220*4ba319b5SDimitry Andric    file_status  symlink_status(const path& p, error_code& ec) noexcept;
2217c82a1ecSDimitry Andric
2227c82a1ecSDimitry Andric    path temp_directory_path();
2237c82a1ecSDimitry Andric    path temp_directory_path(error_code& ec);
2247c82a1ecSDimitry Andric
225*4ba319b5SDimitry Andric    path weakly_canonical(path const& p);
226*4ba319b5SDimitry Andric    path weakly_canonical(path const& p, error_code& ec);
227*4ba319b5SDimitry Andric
228*4ba319b5SDimitry Andric
2297c82a1ecSDimitry Andric} } } }  // namespaces std::experimental::filesystem::v1
2307c82a1ecSDimitry Andric
2317c82a1ecSDimitry Andric*/
2327c82a1ecSDimitry Andric
2337c82a1ecSDimitry Andric#include <experimental/__config>
234*4ba319b5SDimitry Andric#include <filesystem>
2357c82a1ecSDimitry Andric
2367c82a1ecSDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2377c82a1ecSDimitry Andric#pragma GCC system_header
2387c82a1ecSDimitry Andric#endif
2397c82a1ecSDimitry Andric
240*4ba319b5SDimitry Andric_LIBCPP_PUSH_MACROS
241*4ba319b5SDimitry Andric#include <__undef_macros>
242*4ba319b5SDimitry Andric
243*4ba319b5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
244*4ba319b5SDimitry Andric
2457c82a1ecSDimitry Andric#define __cpp_lib_experimental_filesystem 201406
2467c82a1ecSDimitry Andric
2477c82a1ecSDimitry Andric_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL_FILESYSTEM
2487c82a1ecSDimitry Andric
249*4ba319b5SDimitry Andricusing namespace _VSTD_FS;
2507c82a1ecSDimitry Andric
2517c82a1ecSDimitry Andric_LIBCPP_END_NAMESPACE_EXPERIMENTAL_FILESYSTEM
2527c82a1ecSDimitry Andric
253*4ba319b5SDimitry Andric#endif // !_LIBCPP_CXX03_LANG
254*4ba319b5SDimitry Andric
255*4ba319b5SDimitry Andric_LIBCPP_POP_MACROS
256*4ba319b5SDimitry Andric
2577c82a1ecSDimitry Andric#endif // _LIBCPP_EXPERIMENTAL_FILESYSTEM
258