summaryrefslogtreecommitdiff
path: root/src/buffer.hh
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2011-09-02 16:51:20 +0000
committerMaxime Coste <frrrwww@gmail.com>2011-09-02 16:51:20 +0000
commit535285d9e6008d0c635b85eb6dc9202a3aae11db (patch)
treec5838219a067cbee262a79045f0cb5a71813c1f2 /src/buffer.hh
Initial commit
Diffstat (limited to 'src/buffer.hh')
-rw-r--r--src/buffer.hh109
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