add a piece table insertion test

This commit is contained in:
Josh Holtrop 2016-09-25 23:01:59 -04:00
parent bc4c5b5c98
commit c2c0d6f042
4 changed files with 86 additions and 0 deletions

View File

@ -10,6 +10,7 @@ PieceTable::PieceTable(const uint8_t * file_buffer, unsigned long file_buffer_si
end_piece->prev = start_piece; end_piece->prev = start_piece;
m_piece_index = 2u; m_piece_index = 2u;
tabstop = 4u; tabstop = 4u;
m_append_buffer_index = 0u;
} }
void PieceTable::append_initial_line_piece(uint8_t * start, uint32_t length, bool eol) void PieceTable::append_initial_line_piece(uint8_t * start, uint32_t length, bool eol)
@ -240,6 +241,14 @@ bool PieceTable::Cursor::go_right(int n)
return true; return true;
} }
void PieceTable::Cursor::warp_to_inserted_piece(Piece * piece)
{
iterator.piece = piece;
iterator.offset = 0u;
iterator.go_end_of_piece();
calculate_column();
}
bool PieceTable::Cursor::is_start_of_line() bool PieceTable::Cursor::is_start_of_line()
{ {
return iterator.valid() && return iterator.valid() &&
@ -323,3 +332,66 @@ void PieceTable::Cursor::forward_to_column(uint32_t c)
diff = new_diff; diff = new_diff;
} }
} }
void PieceTable::insertion_test(Cursor & c)
{
Piece * piece = add_piece();
piece->start = &m_append_buffer[m_append_buffer_index];
piece->length = 3u;
piece->flags = 0u;
m_append_buffer[m_append_buffer_index++] = 'x';
m_append_buffer[m_append_buffer_index++] = 'y';
m_append_buffer[m_append_buffer_index++] = 'z';
if (c.iterator.valid())
{
if (c.iterator.offset > 0u)
{
Piece * piece2 = add_piece();
piece2->start = c.iterator.piece->start;
piece2->length = c.iterator.offset;
piece2->flags = 0u;
Piece * piece3 = add_piece();
piece3->start = c.iterator.piece->start + c.iterator.offset;
piece3->length = c.iterator.piece->length - c.iterator.offset;
piece3->flags = c.iterator.piece->flags;
c.iterator.piece->prev->next = piece2;
piece2->prev = c.iterator.piece->prev;
piece2->next = piece;
piece->prev = piece2;
piece->next = piece3;
piece3->prev = piece;
piece3->next = c.iterator.piece->next;
piece3->next->prev = piece3;
}
else
{
if (c.iterator.piece->length == 0u)
{
piece->flags = c.iterator.piece->flags;
c.iterator.piece->prev->next = piece;
c.iterator.piece->next->prev = piece;
piece->prev = c.iterator.piece->prev;
piece->next = c.iterator.piece->next;
}
else
{
c.iterator.piece->prev->next = piece;
piece->prev = c.iterator.piece->prev;
c.iterator.piece->prev = piece;
piece->next = c.iterator.piece;
}
}
}
else
{
start_piece->next = piece;
piece->prev = start_piece;
end_piece->prev = piece;
piece->next = end_piece;
}
c.warp_to_inserted_piece(piece);
}

View File

@ -120,6 +120,7 @@ public:
{ {
return (c.line == line) && (c.column == column); return (c.line == line) && (c.column == column);
} }
void warp_to_inserted_piece(Piece * piece);
protected: protected:
bool is_start_of_line(); bool is_start_of_line();
@ -154,6 +155,8 @@ public:
std::shared_ptr<Cursor> add_cursor(); std::shared_ptr<Cursor> add_cursor();
void insertion_test(Cursor & c);
protected: protected:
const uint8_t * m_file_buffer; const uint8_t * m_file_buffer;
unsigned long m_file_buffer_size; unsigned long m_file_buffer_size;
@ -163,6 +166,7 @@ protected:
uint32_t m_piece_index; uint32_t m_piece_index;
PagedBuffer<uint8_t> m_append_buffer; PagedBuffer<uint8_t> m_append_buffer;
uint32_t m_append_buffer_index;
PagedBuffer<Piece> m_pieces; PagedBuffer<Piece> m_pieces;
std::list<std::shared_ptr<Cursor>> m_cursors; std::list<std::shared_ptr<Cursor>> m_cursors;

View File

@ -268,6 +268,9 @@ void Window::handle_key(uint32_t scancode, uint32_t mod)
case SDL_SCANCODE_L: case SDL_SCANCODE_L:
cursor_move(CURSOR_RIGHT); cursor_move(CURSOR_RIGHT);
break; break;
case SDL_SCANCODE_P:
insertion_test();
break;
} }
} }
@ -521,3 +524,9 @@ void Window::draw_status_bar()
x += m_font.get_advance(); x += m_font.get_advance();
} }
} }
void Window::insertion_test()
{
m_buffer->piece_table->insertion_test(*m_cursor);
redraw();
}

View File

@ -42,6 +42,7 @@ protected:
void update_cursor_row(int cursor_row); void update_cursor_row(int cursor_row);
void draw_rect(int x, int y, int width, int height, float r, float g, float b, float a); void draw_rect(int x, int y, int width, int height, float r, float g, float b, float a);
void draw_status_bar(); void draw_status_bar();
void insertion_test();
SDL_Window * m_window; SDL_Window * m_window;
bool m_exit_requested; bool m_exit_requested;