From 535e2005870ce6e0822418307bde22b09b8db3df Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Thu, 8 Sep 2011 00:11:48 +0000 Subject: Add a BufferManager singleton class, handling buffer lifetime it also provide access to buffers by name --- src/buffer_manager.cc | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/buffer_manager.cc (limited to 'src/buffer_manager.cc') 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 + +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); +} + +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(); +} + + +} -- cgit v1.2.3