From 7d87de4bf1afeaa4c2680b681de5d3f6060fccba Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 2 Nov 2016 20:54:58 -0400 Subject: [PATCH] Begin adding GapBuffer::Iterator and GapBuffer::Cursor --- src/core/GapBuffer.cc | 7 +++++++ src/core/GapBuffer.h | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/core/GapBuffer.cc b/src/core/GapBuffer.cc index 77cda85..e987d02 100644 --- a/src/core/GapBuffer.cc +++ b/src/core/GapBuffer.cc @@ -23,3 +23,10 @@ GapBuffer::~GapBuffer() { System::free_pages(m_buffer, m_buffer_size >> System::page_size_log); } + +std::shared_ptr GapBuffer::add_cursor() +{ + std::shared_ptr cursor = std::make_shared(this); + m_cursors.push_back(cursor); + return cursor; +} diff --git a/src/core/GapBuffer.h b/src/core/GapBuffer.h index 486323d..0f22389 100644 --- a/src/core/GapBuffer.h +++ b/src/core/GapBuffer.h @@ -4,13 +4,52 @@ #include #include #include "Encoding.h" +#include +#include class GapBuffer { public: + class Iterator + { + public: + Iterator(GapBuffer * gap_buffer) + { + m_gap_buffer = gap_buffer; + m_offset = 0u; + } + bool valid() + { + return m_offset < m_gap_buffer->size(); + } + + protected: + GapBuffer * m_gap_buffer; + size_t m_offset; + }; + + class Cursor + { + public: + Cursor(GapBuffer * gap_buffer) + : m_iterator(gap_buffer) + { + m_line = 0u; + m_column = 0u; + } + + protected: + Iterator m_iterator; + size_t m_line; + size_t m_column; + }; + GapBuffer(Encoding::Type encoding); GapBuffer(uint8_t * buffer, size_t buffer_size, size_t size, Encoding::Type encoding); ~GapBuffer(); + size_t buffer_size() { return m_buffer_size; } + size_t size() { return m_size; } + std::shared_ptr add_cursor(); protected: uint8_t * m_buffer; @@ -18,6 +57,7 @@ protected: size_t m_size; size_t m_gap_position; Encoding::Type m_encoding; + std::list> m_cursors; }; #endif