summaryrefslogtreecommitdiffstats
path: root/api/logic/Usable.h
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2016-11-15 02:51:22 +0100
committerPetr Mrázek <peterix@gmail.com>2016-11-17 01:00:15 +0100
commit12f6534e77d28ba5dc5fd5f555d43e7cd9da9336 (patch)
tree677c82d8d1a50c7027610e9602e423a568ae7762 /api/logic/Usable.h
parent3769897be19308ada8b975ecf541a3b200b5eb14 (diff)
downloadMultiMC-12f6534e77d28ba5dc5fd5f555d43e7cd9da9336.tar
MultiMC-12f6534e77d28ba5dc5fd5f555d43e7cd9da9336.tar.gz
MultiMC-12f6534e77d28ba5dc5fd5f555d43e7cd9da9336.tar.lz
MultiMC-12f6534e77d28ba5dc5fd5f555d43e7cd9da9336.tar.xz
MultiMC-12f6534e77d28ba5dc5fd5f555d43e7cd9da9336.zip
NOISSUE mark used accounts/sessions in selection menus
Diffstat (limited to 'api/logic/Usable.h')
-rw-r--r--api/logic/Usable.h58
1 files changed, 58 insertions, 0 deletions
diff --git a/api/logic/Usable.h b/api/logic/Usable.h
new file mode 100644
index 00000000..1168be4d
--- /dev/null
+++ b/api/logic/Usable.h
@@ -0,0 +1,58 @@
+#pragma once
+
+#include <cstddef>
+#include <memory>
+
+class Usable;
+
+/**
+ * Base class for things that can be used by multiple other things and we want to track the use count.
+ *
+ * @see UseLock
+ */
+class Usable
+{
+ friend class UseLock;
+public:
+ std::size_t useCount()
+ {
+ return m_useCount;
+ }
+ bool isInUse()
+ {
+ return m_useCount > 0;
+ }
+protected:
+ virtual void decrementUses()
+ {
+ m_useCount--;
+ }
+ virtual void incrementUses()
+ {
+ m_useCount++;
+ }
+private:
+ std::size_t m_useCount = 0;
+};
+
+/**
+ * Lock class to use for keeping track of uses of other things derived from Usable
+ *
+ * @see Usable
+ */
+class UseLock
+{
+public:
+ UseLock(std::shared_ptr<Usable> usable)
+ : m_usable(usable)
+ {
+ // this doesn't use shared pointer use count, because that wouldn't be correct. this count is separate.
+ m_usable->incrementUses();
+ }
+ ~UseLock()
+ {
+ m_usable->decrementUses();
+ }
+private:
+ std::shared_ptr<Usable> m_usable;
+};