Skip to content

Commit

Permalink
Pass enum values to the compiled library.
Browse files Browse the repository at this point in the history
Since we now require C++11 scoped enums and removed deprecated enums,
we can now pass copy_options and directory_options to the compiled
library without converting to the underlying type.
  • Loading branch information
Lastique committed Jan 14, 2024
1 parent 5df060e commit 4530e24
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 109 deletions.
63 changes: 31 additions & 32 deletions include/boost/filesystem/directory.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,27 @@
namespace boost {
namespace filesystem {

enum class directory_options : unsigned int
{
none = 0u,
skip_permission_denied = 1u, // if a directory cannot be opened because of insufficient permissions, pretend that the directory is empty
follow_directory_symlink = 1u << 1u, // recursive_directory_iterator: follow directory symlinks
skip_dangling_symlinks = 1u << 2u, // non-standard extension for recursive_directory_iterator: don't follow dangling directory symlinks,
pop_on_error = 1u << 3u, // non-standard extension for recursive_directory_iterator: instead of producing an end iterator on errors,
// repeatedly invoke pop() until it succeeds or the iterator becomes equal to end iterator
_detail_no_follow = 1u << 4u, // internal use only
_detail_no_push = 1u << 5u // internal use only
};

BOOST_BITMASK(directory_options)

class directory_iterator;

namespace detail {

struct directory_iterator_params;

BOOST_FILESYSTEM_DECL void directory_iterator_construct(directory_iterator& it, path const& p, unsigned int opts, directory_iterator_params* params, system::error_code* ec);
BOOST_FILESYSTEM_DECL void directory_iterator_construct(directory_iterator& it, path const& p, directory_options opts, directory_iterator_params* params, system::error_code* ec);
BOOST_FILESYSTEM_DECL void directory_iterator_increment(directory_iterator& it, system::error_code* ec);

} // namespace detail
Expand All @@ -63,7 +77,7 @@ BOOST_FILESYSTEM_DECL void directory_iterator_increment(directory_iterator& it,

class directory_entry
{
friend BOOST_FILESYSTEM_DECL void detail::directory_iterator_construct(directory_iterator& it, path const& p, unsigned int opts, detail::directory_iterator_params* params, system::error_code* ec);
friend BOOST_FILESYSTEM_DECL void detail::directory_iterator_construct(directory_iterator& it, path const& p, directory_options opts, detail::directory_iterator_params* params, system::error_code* ec);
friend BOOST_FILESYSTEM_DECL void detail::directory_iterator_increment(directory_iterator& it, system::error_code* ec);

public:
Expand Down Expand Up @@ -597,20 +611,6 @@ inline bool is_other(directory_entry const& e, system::error_code& ec) noexcept
// //
//--------------------------------------------------------------------------------------//

enum class directory_options : unsigned int
{
none = 0u,
skip_permission_denied = 1u, // if a directory cannot be opened because of insufficient permissions, pretend that the directory is empty
follow_directory_symlink = 1u << 1u, // recursive_directory_iterator: follow directory symlinks
skip_dangling_symlinks = 1u << 2u, // non-standard extension for recursive_directory_iterator: don't follow dangling directory symlinks,
pop_on_error = 1u << 3u, // non-standard extension for recursive_directory_iterator: instead of producing an end iterator on errors,
// repeatedly invoke pop() until it succeeds or the iterator becomes equal to end iterator
_detail_no_follow = 1u << 4u, // internal use only
_detail_no_push = 1u << 5u // internal use only
};

BOOST_BITMASK(directory_options)

namespace detail {

struct dir_itr_imp :
Expand Down Expand Up @@ -657,7 +657,7 @@ class directory_iterator :
{
friend class boost::iterator_core_access;

friend BOOST_FILESYSTEM_DECL void detail::directory_iterator_construct(directory_iterator& it, path const& p, unsigned int opts, detail::directory_iterator_params* params, system::error_code* ec);
friend BOOST_FILESYSTEM_DECL void detail::directory_iterator_construct(directory_iterator& it, path const& p, directory_options opts, detail::directory_iterator_params* params, system::error_code* ec);
friend BOOST_FILESYSTEM_DECL void detail::directory_iterator_increment(directory_iterator& it, system::error_code* ec);

public:
Expand All @@ -667,17 +667,17 @@ class directory_iterator :
// separate translation unit dll's, so forward to detail functions
explicit directory_iterator(path const& p, directory_options opts = directory_options::none)
{
detail::directory_iterator_construct(*this, p, static_cast< unsigned int >(opts), nullptr, nullptr);
detail::directory_iterator_construct(*this, p, opts, nullptr, nullptr);
}

directory_iterator(path const& p, system::error_code& ec) noexcept
{
detail::directory_iterator_construct(*this, p, static_cast< unsigned int >(directory_options::none), nullptr, &ec);
detail::directory_iterator_construct(*this, p, directory_options::none, nullptr, &ec);
}

directory_iterator(path const& p, directory_options opts, system::error_code& ec) noexcept
{
detail::directory_iterator_construct(*this, p, static_cast< unsigned int >(opts), nullptr, &ec);
detail::directory_iterator_construct(*this, p, opts, nullptr, &ec);
}

directory_iterator(directory_iterator const&) = default;
Expand Down Expand Up @@ -817,13 +817,12 @@ struct recur_dir_itr_imp :
{
typedef directory_iterator element_type;
std::vector< element_type > m_stack;
// directory_options values, declared as unsigned int for ABI compatibility
unsigned int m_options;
directory_options m_options;

explicit recur_dir_itr_imp(unsigned int opts) noexcept : m_options(opts) {}
explicit recur_dir_itr_imp(directory_options opts) noexcept : m_options(opts) {}
};

BOOST_FILESYSTEM_DECL void recursive_directory_iterator_construct(recursive_directory_iterator& it, path const& dir_path, unsigned int opts, system::error_code* ec);
BOOST_FILESYSTEM_DECL void recursive_directory_iterator_construct(recursive_directory_iterator& it, path const& dir_path, directory_options opts, system::error_code* ec);
BOOST_FILESYSTEM_DECL void recursive_directory_iterator_increment(recursive_directory_iterator& it, system::error_code* ec);
BOOST_FILESYSTEM_DECL void recursive_directory_iterator_pop(recursive_directory_iterator& it, system::error_code* ec);

Expand All @@ -844,7 +843,7 @@ class recursive_directory_iterator :
{
friend class boost::iterator_core_access;

friend BOOST_FILESYSTEM_DECL void detail::recursive_directory_iterator_construct(recursive_directory_iterator& it, path const& dir_path, unsigned int opts, system::error_code* ec);
friend BOOST_FILESYSTEM_DECL void detail::recursive_directory_iterator_construct(recursive_directory_iterator& it, path const& dir_path, directory_options opts, system::error_code* ec);
friend BOOST_FILESYSTEM_DECL void detail::recursive_directory_iterator_increment(recursive_directory_iterator& it, system::error_code* ec);
friend BOOST_FILESYSTEM_DECL void detail::recursive_directory_iterator_pop(recursive_directory_iterator& it, system::error_code* ec);

Expand All @@ -853,22 +852,22 @@ class recursive_directory_iterator :

explicit recursive_directory_iterator(path const& dir_path)
{
detail::recursive_directory_iterator_construct(*this, dir_path, static_cast< unsigned int >(directory_options::none), nullptr);
detail::recursive_directory_iterator_construct(*this, dir_path, directory_options::none, nullptr);
}

recursive_directory_iterator(path const& dir_path, system::error_code& ec)
{
detail::recursive_directory_iterator_construct(*this, dir_path, static_cast< unsigned int >(directory_options::none), &ec);
detail::recursive_directory_iterator_construct(*this, dir_path, directory_options::none, &ec);
}

recursive_directory_iterator(path const& dir_path, directory_options opts)
{
detail::recursive_directory_iterator_construct(*this, dir_path, static_cast< unsigned int >(opts), nullptr);
detail::recursive_directory_iterator_construct(*this, dir_path, opts, nullptr);
}

recursive_directory_iterator(path const& dir_path, directory_options opts, system::error_code& ec)
{
detail::recursive_directory_iterator_construct(*this, dir_path, static_cast< unsigned int >(opts), &ec);
detail::recursive_directory_iterator_construct(*this, dir_path, opts, &ec);
}

recursive_directory_iterator(recursive_directory_iterator const&) = default;
Expand Down Expand Up @@ -900,7 +899,7 @@ class recursive_directory_iterator :
bool recursion_pending() const noexcept
{
BOOST_ASSERT_MSG(!is_end(), "recursion_pending() on end recursive_directory_iterator");
return (m_imp->m_options & static_cast< unsigned int >(directory_options::_detail_no_push)) == 0u;
return (m_imp->m_options & directory_options::_detail_no_push) == directory_options::none;
}

void pop()
Expand All @@ -917,9 +916,9 @@ class recursive_directory_iterator :
{
BOOST_ASSERT_MSG(!is_end(), "disable_recursion_pending() on end recursive_directory_iterator");
if (value)
m_imp->m_options |= static_cast< unsigned int >(directory_options::_detail_no_push);
m_imp->m_options |= directory_options::_detail_no_push;
else
m_imp->m_options &= ~static_cast< unsigned int >(directory_options::_detail_no_push);
m_imp->m_options &= ~directory_options::_detail_no_push;
}

file_status status() const
Expand Down
22 changes: 10 additions & 12 deletions include/boost/filesystem/operations.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,9 @@ path canonical_v3(path const& p, path const& base, system::error_code* ec = null
BOOST_FILESYSTEM_DECL
path canonical_v4(path const& p, path const& base, system::error_code* ec = nullptr);
BOOST_FILESYSTEM_DECL
void copy(path const& from, path const& to, unsigned int options, system::error_code* ec = nullptr);
void copy(path const& from, path const& to, copy_options options, system::error_code* ec = nullptr);
BOOST_FILESYSTEM_DECL
bool copy_file(path const& from, path const& to, // See ticket #2925
unsigned int options, system::error_code* ec = nullptr); // see copy_options for options
bool copy_file(path const& from, path const& to, copy_options options, system::error_code* ec = nullptr);
BOOST_FILESYSTEM_DECL
void copy_symlink(path const& existing_symlink, path const& new_symlink, system::error_code* ec = nullptr);
BOOST_FILESYSTEM_DECL
Expand Down Expand Up @@ -336,43 +335,42 @@ inline void current_path(path const& p, system::error_code& ec) noexcept

inline void copy(path const& from, path const& to)
{
detail::copy(from, to, static_cast< unsigned int >(copy_options::none));
detail::copy(from, to, copy_options::none);
}

inline void copy(path const& from, path const& to, system::error_code& ec) noexcept
{
detail::copy(from, to, static_cast< unsigned int >(copy_options::none), &ec);
detail::copy(from, to, copy_options::none, &ec);
}

inline void copy(path const& from, path const& to, copy_options options)
{
detail::copy(from, to, static_cast< unsigned int >(options));
detail::copy(from, to, options);
}

inline void copy(path const& from, path const& to, copy_options options, system::error_code& ec) noexcept
{
detail::copy(from, to, static_cast< unsigned int >(options), &ec);
detail::copy(from, to, options, &ec);
}

inline bool copy_file(path const& from, path const& to)
{
return detail::copy_file(from, to, static_cast< unsigned int >(copy_options::none));
return detail::copy_file(from, to, copy_options::none);
}

inline bool copy_file(path const& from, path const& to, system::error_code& ec) noexcept
{
return detail::copy_file(from, to, static_cast< unsigned int >(copy_options::none), &ec);
return detail::copy_file(from, to, copy_options::none, &ec);
}

// See ticket #2925
inline bool copy_file(path const& from, path const& to, copy_options options)
{
return detail::copy_file(from, to, static_cast< unsigned int >(options));
return detail::copy_file(from, to, options);
}

inline bool copy_file(path const& from, path const& to, copy_options options, system::error_code& ec) noexcept
{
return detail::copy_file(from, to, static_cast< unsigned int >(options), &ec);
return detail::copy_file(from, to, options, &ec);
}

inline void copy_symlink(path const& existing_symlink, path const& new_symlink)
Expand Down
Loading

0 comments on commit 4530e24

Please sign in to comment.