diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2011-09-08 00:11:48 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2011-09-08 00:11:48 +0000 |
| commit | 535e2005870ce6e0822418307bde22b09b8db3df (patch) | |
| tree | 251446a697f0609e29b28b96484c0bf6bdc25d33 /src/buffer_manager.cc | |
| parent | 511df5b6605b6dd6d350dac4643cd1255771d869 (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.cc | 60 |
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(); +} + + +} |
