30#ifndef _GLIBCXX_EXPERIMENTAL_FS_DIR_H 
   31#define _GLIBCXX_EXPERIMENTAL_FS_DIR_H 1 
   33#if __cplusplus < 201103L 
   39# include <bits/shared_ptr.h> 
   41namespace std _GLIBCXX_VISIBILITY(default)
 
   43_GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   61    file_status(
file_type __ft = file_type::none,
 
   62                perms __prms = perms::unknown) noexcept
 
   63    : _M_type(__ft), _M_perms(__prms) { }
 
   65    file_status(
const file_status&) 
noexcept = 
default;
 
   66    file_status(file_status&&) noexcept = default;
 
   67    ~file_status() = default;
 
   69    file_status& operator=(const file_status&) noexcept = default;
 
   70    file_status& operator=(file_status&&) noexcept = default;
 
   73    file_type  type() const noexcept { 
return _M_type; }
 
   74    perms      permissions() const noexcept { 
return _M_perms; }
 
   77    void       type(
file_type __ft) 
noexcept { _M_type = __ft; }
 
   78    void       permissions(
perms __prms) 
noexcept { _M_perms = __prms; }
 
   85_GLIBCXX_BEGIN_NAMESPACE_CXX11
 
   91    directory_entry() noexcept = default;
 
   92    directory_entry(const directory_entry&) = default;
 
   93    directory_entry(directory_entry&&) noexcept = default;
 
   94    explicit directory_entry(const filesystem::path& __p) : _M_path(__p) { }
 
   95    ~directory_entry() = 
default;
 
   98    directory_entry& operator=(
const directory_entry&) = 
default;
 
   99    directory_entry& operator=(directory_entry&&) noexcept = default;
 
  101    void assign(const filesystem::path& __p) { _M_path = __p; }
 
  104    replace_filename(
const filesystem::path& __p)
 
  105    { _M_path = _M_path.parent_path() / __p; }
 
  108    const filesystem::path&  path() const noexcept { 
return _M_path; }
 
  109    operator const filesystem::path&() 
const noexcept { 
return _M_path; }
 
  113    { 
return filesystem::status(_M_path); }
 
  116    status(error_code& __ec) 
const noexcept 
  117    { 
return filesystem::status(_M_path, __ec); }
 
  120    symlink_status()
 const 
  121    { 
return filesystem::symlink_status(_M_path); }
 
  124    symlink_status(error_code& __ec) 
const noexcept 
  125    { 
return filesystem::symlink_status(_M_path, __ec); }
 
  128    operator< (
const directory_entry& __rhs) 
const noexcept 
  129    { 
return _M_path < __rhs._M_path; }
 
  132    operator==(
const directory_entry& __rhs) 
const noexcept 
  133    { 
return _M_path == __rhs._M_path; }
 
  136    operator!=(
const directory_entry& __rhs) 
const noexcept 
  137    { 
return _M_path != __rhs._M_path; }
 
  140    operator<=(
const directory_entry& __rhs) 
const noexcept 
  141    { 
return _M_path <= __rhs._M_path; }
 
  144    operator> (
const directory_entry& __rhs) 
const noexcept 
  145    { 
return _M_path > __rhs._M_path; }
 
  148    operator>=(
const directory_entry& __rhs) 
const noexcept 
  149    { 
return _M_path >= __rhs._M_path; }
 
  152    filesystem::path    _M_path;
 
  156  class directory_iterator;
 
  157  class recursive_directory_iterator;
 
  159  struct __directory_iterator_proxy
 
  161    const directory_entry& 
operator*() const& noexcept { 
return _M_entry; }
 
  166    friend class directory_iterator;
 
  167    friend class recursive_directory_iterator;
 
  170    __directory_iterator_proxy(
const directory_entry& __e) : _M_entry(__e) { }
 
  172    directory_entry _M_entry;
 
  175  class directory_iterator
 
  178    typedef directory_entry        value_type;
 
  179    typedef ptrdiff_t              difference_type;
 
  180    typedef const directory_entry* pointer;
 
  181    typedef const directory_entry& reference;
 
  182    typedef input_iterator_tag     iterator_category;
 
  184    directory_iterator() = 
default;
 
  187    directory_iterator(
const path& __p)
 
  191    : directory_iterator(__p, __options, nullptr) { }
 
  193    directory_iterator(
const path& __p, error_code& __ec) noexcept
 
  194    : directory_iterator(__p, directory_options::none, __ec) { }
 
  196    directory_iterator(
const path& __p,
 
  198                       error_code& __ec) noexcept
 
  199    : directory_iterator(__p, __options, &__ec) { }
 
  201    directory_iterator(
const directory_iterator& __rhs) = 
default;
 
  203    directory_iterator(directory_iterator&& __rhs) 
noexcept = 
default;
 
  205    ~directory_iterator() = 
default;
 
  208    operator=(
const directory_iterator& __rhs) = 
default;
 
  211    operator=(directory_iterator&& __rhs) 
noexcept = 
default;
 
  213    const directory_entry& 
operator*() 
const;
 
  214    const directory_entry* operator->()
 const { 
return &**
this; }
 
  215    directory_iterator&    operator++();
 
  216    directory_iterator&    increment(error_code& __ec) 
noexcept;
 
  218    __directory_iterator_proxy operator++(
int)
 
  220      __directory_iterator_proxy __pr{**
this};
 
  229    operator==(
const directory_iterator& __lhs,
 
  230               const directory_iterator& __rhs);
 
  232    friend class recursive_directory_iterator;
 
  237  inline directory_iterator
 
  238  begin(directory_iterator __iter) 
noexcept 
  241  inline directory_iterator
 
  242  end(directory_iterator) 
noexcept 
  243  { 
return directory_iterator(); }
 
  246  operator==(
const directory_iterator& __lhs, 
const directory_iterator& __rhs)
 
  248    return !__rhs._M_dir.owner_before(__lhs._M_dir)
 
  249      && !__lhs._M_dir.owner_before(__rhs._M_dir);
 
  253  operator!=(
const directory_iterator& __lhs, 
const directory_iterator& __rhs)
 
  254  { 
return !(__lhs == __rhs); }
 
  256  class recursive_directory_iterator
 
  259    typedef directory_entry        value_type;
 
  260    typedef ptrdiff_t              difference_type;
 
  261    typedef const directory_entry* pointer;
 
  262    typedef const directory_entry& reference;
 
  263    typedef input_iterator_tag     iterator_category;
 
  265    recursive_directory_iterator() = 
default;
 
  268    recursive_directory_iterator(
const path& __p)
 
  272    : recursive_directory_iterator(__p, __options, nullptr) { }
 
  274    recursive_directory_iterator(
const path& __p,
 
  276                                 error_code& __ec) noexcept
 
  277    : recursive_directory_iterator(__p, __options, &__ec) { }
 
  279    recursive_directory_iterator(
const path& __p, error_code& __ec) noexcept
 
  280    : recursive_directory_iterator(__p, directory_options::none, &__ec) { }
 
  282    recursive_directory_iterator(
 
  283        const recursive_directory_iterator&) = 
default;
 
  285    recursive_directory_iterator(recursive_directory_iterator&&) = 
default;
 
  287    ~recursive_directory_iterator();
 
  292    bool               recursion_pending()
 const { 
return _M_pending; }
 
  294    const directory_entry& 
operator*() 
const;
 
  295    const directory_entry* operator->()
 const { 
return &**
this; }
 
  298    recursive_directory_iterator&
 
  299    operator=(
const recursive_directory_iterator& __rhs) 
noexcept;
 
  300    recursive_directory_iterator&
 
  301    operator=(recursive_directory_iterator&& __rhs) 
noexcept;
 
  303    recursive_directory_iterator& operator++();
 
  304    recursive_directory_iterator& increment(error_code& __ec) 
noexcept;
 
  306    __directory_iterator_proxy operator++(
int)
 
  308      __directory_iterator_proxy __pr{**
this};
 
  314    void pop(error_code&);
 
  316    void disable_recursion_pending() { _M_pending = 
false; }
 
  322    operator==(
const recursive_directory_iterator& __lhs,
 
  323               const recursive_directory_iterator& __rhs);
 
  328    bool _M_pending = 
false;
 
  331  inline recursive_directory_iterator
 
  332  begin(recursive_directory_iterator __iter) 
noexcept 
  335  inline recursive_directory_iterator
 
  336  end(recursive_directory_iterator) 
noexcept 
  337  { 
return recursive_directory_iterator(); }
 
  340  operator==(
const recursive_directory_iterator& __lhs,
 
  341             const recursive_directory_iterator& __rhs)
 
  343    return !__rhs._M_dirs.owner_before(__lhs._M_dirs)
 
  344      && !__lhs._M_dirs.owner_before(__rhs._M_dirs);
 
  348  operator!=(
const recursive_directory_iterator& __lhs,
 
  349             const recursive_directory_iterator& __rhs)
 
  350  { 
return !(__lhs == __rhs); }
 
  352_GLIBCXX_END_NAMESPACE_CXX11
 
  359_GLIBCXX_END_NAMESPACE_VERSION
 
constexpr complex< _Tp > operator*(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x times y.
 
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
 
perms
Bitmask type representing file access permissions.
 
file_type
Enumerated type representing the type of a file.
 
directory_options
Bitmask type controlling directory iteration.
 
ISO C++ entities toplevel namespace is std.
 
A smart pointer with reference-counted copy semantics.