aboutsummaryrefslogtreecommitdiff
path: root/libbutl/filesystem.ixx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2017-05-01 16:08:43 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2017-05-01 16:59:24 +0300
commit61377c582e0f2675baa5f5e6e30a35d1a4164b33 (patch)
tree11cdca992834d7f7f197f72856712fbcb3020e3d /libbutl/filesystem.ixx
parent442c1a6790e52baa0c081f310d4d9e9b6f1ff638 (diff)
Add hxx extension for headers and lib prefix for library dir
Diffstat (limited to 'libbutl/filesystem.ixx')
-rw-r--r--libbutl/filesystem.ixx144
1 files changed, 144 insertions, 0 deletions
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 <typename P>
+ inline auto_rm<P>::
+ auto_rm (auto_rm&& x)
+ : path_ (std::move (x.path_))
+ {
+ x.cancel ();
+ }
+
+ template <typename P>
+ inline auto_rm<P>& auto_rm<P>::
+ operator= (auto_rm&& x)
+ {
+ if (this != &x)
+ {
+ path_ = std::move (x.path_);
+ x.cancel ();
+ }
+
+ return *this;
+ }
+
+ template <>
+ inline auto_rm<path>::
+ ~auto_rm () {if (!path_.empty ()) try_rmfile (path_, true);}
+
+ template <>
+ inline auto_rm<dir_path>::
+ ~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<cpflags> (
+ static_cast<std::uint16_t> (x) &
+ static_cast<std::uint16_t> (y));
+ }
+
+ inline cpflags operator|= (cpflags& x, cpflags y)
+ {
+ return x = static_cast<cpflags> (
+ static_cast<std::uint16_t> (x) |
+ static_cast<std::uint16_t> (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<permissions> (
+ static_cast<std::uint16_t> (x) &
+ static_cast<std::uint16_t> (y));
+ }
+
+ inline permissions operator|= (permissions& x, permissions y)
+ {
+ return x = static_cast<permissions> (
+ static_cast<std::uint16_t> (x) |
+ static_cast<std::uint16_t> (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 ();
+ }
+}