aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/file-cache.ixx
diff options
context:
space:
mode:
Diffstat (limited to 'libbuild2/file-cache.ixx')
-rw-r--r--libbuild2/file-cache.ixx191
1 files changed, 191 insertions, 0 deletions
diff --git a/libbuild2/file-cache.ixx b/libbuild2/file-cache.ixx
new file mode 100644
index 0000000..99be5ad
--- /dev/null
+++ b/libbuild2/file-cache.ixx
@@ -0,0 +1,191 @@
+// file : libbuild2/file-cache.ixx -*- C++ -*-
+// license : MIT; see accompanying LICENSE file
+
+namespace build2
+{
+ // file_cache::entry
+ //
+ inline const path& file_cache::entry::
+ path () const
+ {
+ return path_;
+ }
+
+ inline void file_cache::entry::
+ pin ()
+ {
+ ++pin_;
+ }
+
+ inline void file_cache::entry::
+ unpin ()
+ {
+ if (--pin_ == 0 &&
+ !comp_path_.empty () &&
+ (state_ == uncomp || state_ == decomp))
+ preempt ();
+ }
+
+ inline file_cache::read file_cache::entry::
+ open ()
+ {
+ assert (state_ != null && state_ != uninit);
+
+ if (state_ == comp)
+ {
+ decompress ();
+ state_ = decomp;
+ }
+
+ pin ();
+ return read (*this);
+ }
+
+ inline file_cache::entry::
+ operator bool () const
+ {
+ return state_ != null;
+ }
+
+ inline file_cache::entry::
+ entry (path_type p, bool t, bool c)
+ : temporary (t),
+ state_ (uninit),
+ path_ (move (p)),
+ comp_path_ (c ? path_ + ".lz4" : path_type ()),
+ pin_ (1)
+ {
+ }
+
+ inline file_cache::entry::
+ ~entry ()
+ {
+ if (state_ != null && temporary)
+ remove ();
+ }
+
+ inline file_cache::entry::
+ entry (entry&& e) noexcept
+ : temporary (e.temporary),
+ state_ (e.state_),
+ path_ (move (e.path_)),
+ comp_path_ (move (e.comp_path_)),
+ pin_ (e.pin_)
+ {
+ e.state_ = null;
+ }
+
+ inline file_cache::entry& file_cache::entry::
+ operator= (entry&& e) noexcept
+ {
+ if (this != &e)
+ {
+ assert (state_ == null);
+
+ temporary = e.temporary;
+ state_ = e.state_;
+ path_ = move (e.path_);
+ comp_path_ = move (e.comp_path_);
+ pin_ = e.pin_;
+
+ e.state_ = null;
+ }
+ return *this;
+ }
+
+ // file_cache::write
+ //
+ inline void file_cache::write::
+ close ()
+ {
+ entry_->state_ = entry::uncomp;
+ }
+
+ inline file_cache::write::
+ ~write ()
+ {
+ if (entry_ != nullptr)
+ entry_->unpin ();
+ }
+
+ inline file_cache::write::
+ write (write&& e) noexcept
+ : entry_ (e.entry_)
+ {
+ e.entry_ = nullptr;
+ }
+
+ inline file_cache::write& file_cache::write::
+ operator= (write&& e) noexcept
+ {
+ if (this != &e)
+ {
+ assert (entry_ == nullptr);
+ swap (entry_, e.entry_);
+ }
+ return *this;
+ }
+
+ // file_cache::read
+ //
+ inline file_cache::read::
+ ~read ()
+ {
+ if (entry_ != nullptr)
+ entry_->unpin ();
+ }
+
+ inline file_cache::read::
+ read (read&& e) noexcept
+ : entry_ (e.entry_)
+ {
+ e.entry_ = nullptr;
+ }
+
+ inline file_cache::read& file_cache::read::
+ operator= (read&& e) noexcept
+ {
+ if (this != &e)
+ {
+ assert (entry_ == nullptr);
+ swap (entry_, e.entry_);
+ }
+ return *this;
+ }
+
+ // file_cache
+ //
+ inline file_cache::entry file_cache::
+ create (path f, optional<bool>)
+ {
+ return entry (move (f), true /* temporary */, compress_);
+ }
+
+ inline file_cache::entry file_cache::
+ create_existing (path f)
+ {
+ entry e (move (f), false /* temporary */, compress_);
+ e.init_existing ();
+ return e;
+ }
+
+ inline string file_cache::
+ compressed_extension (const char* e)
+ {
+ return compress_
+ ? (e != nullptr ? string (e) : string ()) + ".lz4"
+ : string ();
+ }
+
+ inline void file_cache::
+ init (bool compress)
+ {
+ compress_ = compress;
+ }
+
+ inline file_cache::
+ file_cache (bool compress)
+ {
+ init (compress);
+ }
+}