From a2b215601613178950a2ac50f4efbc2d38f48bb5 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 11 Dec 2016 15:32:05 -0500 Subject: [PATCH] Move encoding and tabstop out of Iterator/Cursor classes --- src/core/Buffer-Cursor.cc | 5 +++-- src/core/Buffer-Iterator.cc | 4 ++-- src/core/Buffer.cc | 10 +++++++++- src/core/Buffer.h | 19 ++++++++++--------- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/core/Buffer-Cursor.cc b/src/core/Buffer-Cursor.cc index d7220fe..4be2df1 100644 --- a/src/core/Buffer-Cursor.cc +++ b/src/core/Buffer-Cursor.cc @@ -98,7 +98,8 @@ bool Buffer::Cursor::go_right(bool allow_eol) uint32_t chr = *m_iterator; if (chr == '\t') { - m_column += m_tabstop - (m_column + 1u) % m_tabstop; + uint8_t tabstop = m_iterator.buffer()->tabstop(); + m_column += tabstop - (m_column + 1u) % tabstop; } else { @@ -146,7 +147,7 @@ void Buffer::Cursor::init_column() { if (*m_iterator == '\t') { - m_column = m_tabstop - 1u; + m_column = m_iterator.buffer()->tabstop() - 1u; } else { diff --git a/src/core/Buffer-Iterator.cc b/src/core/Buffer-Iterator.cc index 585bf6b..bbbe9d5 100644 --- a/src/core/Buffer-Iterator.cc +++ b/src/core/Buffer-Iterator.cc @@ -4,7 +4,7 @@ void Buffer::Iterator::go_forward() { if (valid()) { - m_offset += Encoding::num_bytes_in_code_point(m_encoding, address()); + m_offset += Encoding::num_bytes_in_code_point(m_buffer->encoding(), address()); } } @@ -34,7 +34,7 @@ void Buffer::Iterator::go_back() else { const uint8_t * a = m_buffer->address(m_offset - 1u); - const uint8_t * beginning_of_code_point = Encoding::beginning_of_code_point(m_encoding, a); + const uint8_t * beginning_of_code_point = Encoding::beginning_of_code_point(m_buffer->encoding(), a); m_offset -= ((a - beginning_of_code_point) + 1u); } } diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index 09d9a56..c587c04 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -8,11 +8,13 @@ Buffer::Buffer() { + common_initialization(); load_empty_buffer(); } Buffer::Buffer(const char * filename) { + common_initialization(); if (!load_from_file(filename)) { load_empty_buffer(); @@ -21,12 +23,18 @@ Buffer::Buffer(const char * filename) Buffer::Buffer(const uint8_t * data, size_t data_length) { + common_initialization(); if (!load_from_memory(data, data_length)) { load_empty_buffer(); } } +void Buffer::common_initialization() +{ + m_tabstop = 4u; +} + void Buffer::load_empty_buffer() { m_gap_buffer = std::make_shared(); @@ -104,7 +112,7 @@ bool Buffer::write_to_file(const char * filename) m_gap_buffer->compact(); - Cursor start_of_line(this, m_encoding, 4u); + Cursor start_of_line(this); size_t bytes_written = 0u; while (start_of_line.valid()) diff --git a/src/core/Buffer.h b/src/core/Buffer.h index e520223..572b11f 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -13,11 +13,10 @@ public: class Iterator { public: - Iterator(Buffer * buffer, Encoding::Type encoding) + Iterator(Buffer * buffer) { m_buffer = buffer; m_offset = 0u; - m_encoding = encoding; } bool valid() const { @@ -35,7 +34,7 @@ public: { if (valid()) { - return Encoding::decode(m_encoding, address()); + return Encoding::decode(m_buffer->encoding(), address()); } else { @@ -48,21 +47,20 @@ public: } size_t offset() { return m_offset; } void set_offset(size_t new_offset) { m_offset = new_offset; } + Buffer * buffer() const { return m_buffer; } protected: Buffer * m_buffer; size_t m_offset; - Encoding::Type m_encoding; }; class Cursor { public: - Cursor(Buffer * buffer, Encoding::Type encoding, uint8_t tabstop) - : m_iterator(buffer, encoding) + Cursor(Buffer * buffer) + : m_iterator(buffer) { m_line = 0u; - m_tabstop = tabstop; init_column(); } bool is_start_of_line(); @@ -88,7 +86,6 @@ public: Iterator m_iterator; size_t m_line; size_t m_column; - uint8_t m_tabstop; void init_column(); void forward_to_column(size_t target_column); @@ -101,18 +98,22 @@ public: std::shared_ptr add_cursor() { - return std::make_shared(this, m_encoding, 4u); + return std::make_shared(this); } auto get_string() { return m_gap_buffer->get_string(); } size_t size() const { return m_gap_buffer->size(); } uint8_t * address(size_t offset) const { return m_gap_buffer->address(offset); } + Encoding::Type encoding() const { return m_encoding; } + uint8_t tabstop() const { return m_tabstop; } protected: bool m_eol_at_eof; LineEndings::Type m_line_endings; std::shared_ptr m_gap_buffer; Encoding::Type m_encoding; + uint8_t m_tabstop; + void common_initialization(); bool load_from_file(const char * filename); void load_empty_buffer(); bool load_from_memory(const uint8_t * data, size_t data_length);