about summary refs log tree commit diff
path: root/immer/transience/no_transience_policy.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'immer/transience/no_transience_policy.hpp')
-rw-r--r--immer/transience/no_transience_policy.hpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/immer/transience/no_transience_policy.hpp b/immer/transience/no_transience_policy.hpp
new file mode 100644
index 000000000000..2f87df7a39b0
--- /dev/null
+++ b/immer/transience/no_transience_policy.hpp
@@ -0,0 +1,48 @@
+//
+// immer: immutable data structures for C++
+// Copyright (C) 2016, 2017, 2018 Juan Pedro Bolivar Puente
+//
+// This software is distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE or copy at http://boost.org/LICENSE_1_0.txt
+//
+
+#pragma once
+
+namespace immer {
+
+/*!
+ * Disables any special *transience* tracking.  To be used when
+ * *reference counting* is available instead.
+ */
+struct no_transience_policy
+{
+    template <typename>
+    struct apply
+    {
+        struct type
+        {
+            struct edit
+            {};
+
+            struct owner
+            {
+                operator edit() const { return {}; }
+            };
+
+            struct ownee
+            {
+                ownee& operator=(edit) { return *this; };
+                bool can_mutate(edit) const { return false; }
+                bool owned() const { return false; }
+            };
+
+            static owner noone;
+        };
+    };
+};
+
+template <typename HP>
+typename no_transience_policy::apply<HP>::type::owner
+    no_transience_policy::apply<HP>::type::noone = {};
+
+} // namespace immer