From 61377c582e0f2675baa5f5e6e30a35d1a4164b33 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Mon, 1 May 2017 16:08:43 +0300 Subject: Add hxx extension for headers and lib prefix for library dir --- libbutl/filesystem.ixx | 144 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 libbutl/filesystem.ixx (limited to 'libbutl/filesystem.ixx') diff --git a/libbutl/filesystem.ixx b/libbutl/filesystem.ixx new file mode 100644 index 0000000..43fef20 --- /dev/null +++ b/libbutl/filesystem.ixx @@ -0,0 +1,144 @@ +// file : libbutl/filesystem.ixx -*- C++ -*- +// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +namespace butl +{ + inline bool + dir_empty (const dir_path& d) + { + return dir_iterator (d) == dir_iterator (); + } + + inline rmdir_status + try_rmdir_r (const dir_path& p, bool ignore_error) + { + bool e (dir_exists (p)); //@@ What if it exists but is not a directory? + + if (e) + rmdir_r (p, true, ignore_error); + + return e ? rmdir_status::success : rmdir_status::not_exist; + } + + // auto_rm + // + template + inline auto_rm

:: + auto_rm (auto_rm&& x) + : path_ (std::move (x.path_)) + { + x.cancel (); + } + + template + inline auto_rm

& auto_rm

:: + operator= (auto_rm&& x) + { + if (this != &x) + { + path_ = std::move (x.path_); + x.cancel (); + } + + return *this; + } + + template <> + inline auto_rm:: + ~auto_rm () {if (!path_.empty ()) try_rmfile (path_, true);} + + template <> + inline auto_rm:: + ~auto_rm () {if (!path_.empty ()) try_rmdir_r (path_, true);} + + // cpflags + // + inline cpflags operator& (cpflags x, cpflags y) {return x &= y;} + inline cpflags operator| (cpflags x, cpflags y) {return x |= y;} + inline cpflags operator&= (cpflags& x, cpflags y) + { + return x = static_cast ( + static_cast (x) & + static_cast (y)); + } + + inline cpflags operator|= (cpflags& x, cpflags y) + { + return x = static_cast ( + static_cast (x) | + static_cast (y)); + } + + // permissions + // + inline permissions operator& (permissions x, permissions y) {return x &= y;} + inline permissions operator| (permissions x, permissions y) {return x |= y;} + inline permissions operator&= (permissions& x, permissions y) + { + return x = static_cast ( + static_cast (x) & + static_cast (y)); + } + + inline permissions operator|= (permissions& x, permissions y) + { + return x = static_cast ( + static_cast (x) | + static_cast (y)); + } + + // dir_entry + // + inline entry_type dir_entry:: + ltype () const + { + return t_ != entry_type::unknown ? t_ : (t_ = type (false)); + } + + inline entry_type dir_entry:: + type () const + { + entry_type t (ltype ()); + return t != entry_type::symlink + ? t + : lt_ != entry_type::unknown ? lt_ : (lt_ = type (true)); + } + + // dir_iterator + // + inline dir_iterator:: + dir_iterator (dir_iterator&& x) + : e_ (std::move (x.e_)), h_ (x.h_) + { +#ifndef _WIN32 + x.h_ = nullptr; +#else + x.h_ = -1; +#endif + } + + inline bool + operator== (const dir_iterator& x, const dir_iterator& y) + { + return x.h_ == y.h_; + } + + inline bool + operator!= (const dir_iterator& x, const dir_iterator& y) + { + return !(x == y); + } + + inline dir_iterator + begin (dir_iterator& i) + { + return std::move (i); + } + + inline dir_iterator + end (const dir_iterator&) + { + return dir_iterator (); + } +} -- cgit v1.1