diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2011-09-02 16:51:20 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2011-09-02 16:51:20 +0000 |
| commit | 535285d9e6008d0c635b85eb6dc9202a3aae11db (patch) | |
| tree | c5838219a067cbee262a79045f0cb5a71813c1f2 /src/buffer.hh | |
Initial commit
Diffstat (limited to 'src/buffer.hh')
| -rw-r--r-- | src/buffer.hh | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/buffer.hh b/src/buffer.hh new file mode 100644 index 00000000..7564e444 --- /dev/null +++ b/src/buffer.hh @@ -0,0 +1,109 @@ +#ifndef buffer_hh_INCLUDED +#define buffer_hh_INCLUDED + +#include <string> +#include <vector> + +namespace Kakoune +{ + +class Buffer; +typedef int BufferPos; +typedef int BufferSize; +typedef char BufferChar; +typedef std::basic_string<BufferChar> BufferString; + +struct LineAndColumn +{ + BufferPos line; + BufferPos column; + + LineAndColumn(BufferPos line = 0, BufferPos column = 0) + : line(line), column(column) {} +}; + +class BufferIterator +{ +public: + typedef BufferChar value_type; + typedef BufferSize difference_type; + typedef const value_type* pointer; + typedef const value_type& reference; + typedef std::bidirectional_iterator_tag iterator_category; + + BufferIterator() : m_buffer(NULL), m_position(0) {} + BufferIterator(const Buffer& buffer, BufferPos position); + BufferIterator& operator=(const BufferIterator& iterator); + + bool operator== (const BufferIterator& iterator) const; + bool operator!= (const BufferIterator& iterator) const; + bool operator< (const BufferIterator& iterator) const; + bool operator<= (const BufferIterator& iterator) const; + + BufferChar operator* () const; + BufferSize operator- (const BufferIterator& iterator) const; + + BufferIterator operator+ (BufferSize size) const; + BufferIterator operator- (BufferSize size) const; + + BufferIterator& operator+= (BufferSize size); + BufferIterator& operator-= (BufferSize size); + + BufferIterator& operator++ (); + BufferIterator& operator-- (); + + bool is_begin() const; + bool is_end() const; + +private: + const Buffer* m_buffer; + BufferPos m_position; + friend class Buffer; +}; + +class Buffer +{ +public: + Buffer(const std::string& name); + + void erase(const BufferIterator& begin, + const BufferIterator& end); + + void insert(const BufferIterator& position, + const BufferString& string); + + BufferString string(const BufferIterator& begin, + const BufferIterator& end) const; + + BufferIterator begin() const; + BufferIterator end() const; + + BufferSize length() const; + + BufferIterator iterator_at(const LineAndColumn& line_and_column) const; + LineAndColumn line_and_column_at(const BufferIterator& iterator) const; + + LineAndColumn clamp(const LineAndColumn& line_and_column) const; + + const std::string& name() const { return m_name; } + + const BufferString& content() const { return m_content; } + +private: + BufferChar at(BufferPos position) const; + friend class BufferIterator; + + std::vector<BufferPos> m_lines; + + void compute_lines(); + BufferPos line_at(const BufferIterator& iterator) const; + BufferSize line_length(BufferPos line) const; + + BufferString m_content; + + std::string m_name; +}; + +} + +#endif // buffer_hh_INCLUDED |
