summaryrefslogtreecommitdiff
path: root/src/buffer_manager.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2011-09-08 00:11:48 +0000
committerMaxime Coste <frrrwww@gmail.com>2011-09-08 00:11:48 +0000
commit535e2005870ce6e0822418307bde22b09b8db3df (patch)
tree251446a697f0609e29b28b96484c0bf6bdc25d33 /src/buffer_manager.cc
parent511df5b6605b6dd6d350dac4643cd1255771d869 (diff)
Add a BufferManager singleton class, handling buffer lifetime
it also provide access to buffers by name
Diffstat (limited to 'src/buffer_manager.cc')
-rw-r--r--src/buffer_manager.cc60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/buffer_manager.cc b/src/buffer_manager.cc
new file mode 100644
index 00000000..9d4cd506
--- /dev/null
+++ b/src/buffer_manager.cc
@@ -0,0 +1,60 @@
+#include "buffer_manager.hh"
+
+#include "buffer.hh"
+#include "window.hh"
+#include <cassert>
+
+namespace Kakoune
+{
+
+struct name_not_unique {};
+
+
+BufferManager* BufferManager::ms_instance = nullptr;
+
+BufferManager& BufferManager::instance()
+{
+ if (not ms_instance)
+ ms_instance = new BufferManager();
+
+ return *ms_instance;
+}
+
+void BufferManager::delete_instance()
+{
+ delete ms_instance;
+ ms_instance = nullptr;
+}
+
+BufferManager::BufferManager()
+{
+}
+
+void BufferManager::register_buffer(Buffer* buffer)
+{
+ assert(buffer);
+ const std::string& name = buffer->name();
+ if (m_buffers.find(name) != m_buffers.end())
+ throw name_not_unique();
+
+ m_buffers[name] = std::unique_ptr<Buffer>(buffer);
+}
+
+void BufferManager::delete_buffer(Buffer* buffer)
+{
+ assert(buffer);
+ auto buffer_it = m_buffers.find(buffer->name());
+ assert(buffer_it->second.get() == buffer);
+ m_buffers.erase(buffer_it);
+}
+
+Buffer* BufferManager::get_buffer(const std::string& name)
+{
+ if (m_buffers.find(name) == m_buffers.end())
+ return nullptr;
+
+ return m_buffers[name].get();
+}
+
+
+}