diff options
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(); +} + + +} |
