From kde-commits Fri Jul 13 00:54:42 2007 From: Roberto Raggi Date: Fri, 13 Jul 2007 00:54:42 +0000 To: kde-commits Subject: playground/devtools/kdevelop-pg/include Message-Id: <1184288082.488928.611.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=118428809522582 SVN commit 687144 by raggi: new runtime M +9 -26 kdev-pg-location-table.h M +104 -128 kdev-pg-replacement.h M +2 -2 kdev-pg-token-stream.h --- trunk/playground/devtools/kdevelop-pg/include/kdev-pg-location-table.h #687143:687144 @@ -22,6 +22,7 @@ #ifndef KDEV_PG_LOCATION_TABLE_H #define KDEV_PG_LOCATION_TABLE_H +#include #include struct kdev_pg_location_table @@ -30,6 +31,7 @@ : lines(0), line_count(0), current_line(0) { resize(size); + lines[current_line++] = 0; } inline ~kdev_pg_location_table() @@ -50,35 +52,16 @@ /** * Returns the \a line and \a column of the given \a offset in this table. */ - void position_at(std::size_t offset, int *line, int *column) const + void position_at(std::size_t offset, size_t *line, size_t *column) const { - int first = 0; - // len is assigned the position 1 past the current set position - int len = current_line; - int half; - int middle; + size_t *it = std::lower_bound(lines, lines + current_line, offset); + assert(it != lines + current_line); - while (len > 0) - { - // Half of the way through the array - half = len >> 1; - // The starting point - middle = first; + if (*it != offset) + --it; - middle += half; - - if (lines[middle] < offset) - { - first = middle; - ++first; - len = len - half - 1; - } - else - len = half; - } - - *line = std::max(first, 1); - *column = offset - lines[*line - 1] - 1; + *line = it - lines; + *column = offset - (*it + (it != lines)); } /** --- trunk/playground/devtools/kdevelop-pg/include/kdev-pg-replacement.h #687143:687144 @@ -1,6 +1,6 @@ /* This file is part of kdev-pg - Copyright 2005, 2006 Roberto Raggi + Copyright 2005, 2006, 2007 Roberto Raggi Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that @@ -25,173 +25,149 @@ #include #include -class replacement -{ -public: - virtual ~replacement() {} +#include "kdev-pg-token-stream.h" - virtual std::size_t start_position() const = 0; - virtual std::size_t size() const = 0; - virtual char const *text() const = 0; -}; - -class text_replacement: public replacement -{ +template +class default_replacement { public: - inline text_replacement(std::size_t start_position, - std::size_t size, - char const *text) - : _M_start_position(start_position), - _M_size(size), - _M_text(text) {} + typedef _String string_type; + + inline default_replacement(): + _M_begin(0), _M_end(0) {} - virtual std::size_t start_position() const - { return _M_start_position; } + inline default_replacement(std::size_t begin, std::size_t end, string_type const &text): + _M_begin(begin), _M_end(end), _M_text(text) {} - virtual std::size_t size() const - { return _M_size; } + std::size_t begin() const { return _M_begin; } + std::size_t end() const { return _M_end; } + string_type const &text() const { return _M_text; } - virtual char const *text() const - { return _M_text; } - private: - std::size_t _M_start_position; - std::size_t _M_size; - char const *_M_text; + std::size_t _M_begin; + std::size_t _M_end; + string_type _M_text; }; -template -class replacement_list -{ - typedef _Tp1 token_t; +template , + class _TokenStream = kdev_pg_token_stream> +class replacement_list: public std::deque<_Replacement> { + typedef std::deque<_Replacement> _Base; public: - replacement_list(std::deque const &token_stream); + typedef _Replacement replacement_type; + typedef typename _Replacement::string_type string_type; + typedef typename _Base::iterator iterator; + typedef typename _Base::const_iterator const_iterator; + + using _Base::begin; + using _Base::end; + +public: + replacement_list(); ~replacement_list(); - void set_contents(char const *contents) - { _M_contents = contents; } + _TokenStream *token_stream() const; + void set_token_stream(_TokenStream *token_stream); - void insert_text_before(_Tp *node, char const *text); - void insert_text_after(_Tp *node, char const *text); + template + void insert_text_before(_Ast *node, string_type const &text); - void replace_text(_Tp *node, char const *text); - void replace_text(std::size_t position, std::size_t length, - char const *text); + template + void insert_text_after(_Ast *node, string_type const &text); - void remove_text(_Tp *node); + template + void replace_text(_Ast *node, string_type const &text); - inline const std::deque &replacements() const - { return _M_replacements; } + void replace_text(std::size_t begin, std::size_t end, string_type const &text); - void clear(); - std::string apply() const; + template + void remove_text(_Ast *node); + template + void operator()(string_type const &source, _OutputIterator out) const; + private: - char const *_M_contents; - std::deque const &_M_token_stream; - std::deque _M_replacements; + struct _Compare_replacement { + bool operator()(_Replacement const &a, std::size_t pos) const { + return a.begin() < pos; + } + }; + +private: + _TokenStream *_M_token_stream; }; -template -replacement_list<_Tp, _Tp1>::replacement_list(std::deque const &token_stream) - : _M_contents(0), _M_token_stream(token_stream) -{ -} +template +replacement_list<_Replacement, _TokenStream>::replacement_list(): + _M_token_stream(0) {} -template -replacement_list<_Tp, _Tp1>::~replacement_list() -{ - clear(); +template +replacement_list<_Replacement, _TokenStream>::~replacement_list() {} + +template +_TokenStream *replacement_list<_Replacement, _TokenStream>::token_stream() const { + return _M_token_stream; } -template -void replacement_list<_Tp, _Tp1>::clear() -{ - for (std::deque::iterator it = _M_replacements.begin(); - it != _M_replacements.end(); ++it) - { - delete *it; - } - - _M_replacements.clear(); +template +void replacement_list<_Replacement, _TokenStream>::set_token_stream(_TokenStream *token_stream) { + _M_token_stream = token_stream; } -template -void replacement_list<_Tp, _Tp1>::insert_text_before(_Tp *node, - char const *text) -{ - std::size_t start_position = _M_token_stream[node->start_token].start; - replace_text(start_position, 0, text); +template +template +void replacement_list<_Replacement, _TokenStream>::insert_text_before(_Ast *node, + string_type const &text) { + std::size_t start_position = _M_token_stream->token(node->start_token).begin; + replace_text(start_position, start_position, text); } -template -void replacement_list<_Tp, _Tp1>::insert_text_after(_Tp *node, - char const *text) -{ - std::size_t end_position = _M_token_stream[node->end_token].start; - replace_text(end_position, 0, text); +template +template +void replacement_list<_Replacement, _TokenStream>::insert_text_after(_Ast *node, + string_type const &text) { + std::size_t end_position = _M_token_stream->token(node->end_token).begin; + replace_text(end_position, end_position, text); } -template -void replacement_list<_Tp, _Tp1>::replace_text(_Tp *node, char const *text) -{ - std::size_t start_position = _M_token_stream[node->start_token].start; - std::size_t end_position = _M_token_stream[node->end_token].start; +template +template +void replacement_list<_Replacement, _TokenStream>::replace_text(_Ast *node, + string_type const &text) { + std::size_t start_position = _M_token_stream->token(node->start_token).begin; + std::size_t end_position = _M_token_stream->token(node->end_token).begin; - replace_text(start_position, end_position - start_position, text); + replace_text(start_position, end_position, text); } -template -void replacement_list<_Tp, _Tp1>::remove_text(_Tp *node) -{ - replace_text(node, ""); +template +void replacement_list<_Replacement, _TokenStream>::replace_text(std::size_t first, + std::size_t last, + string_type const &text) { + iterator __pos = std::lower_bound(begin(), end(), first, _Compare_replacement()); + insert(__pos, _Replacement(first, last, text)); } -namespace -{ - struct _Compare_replacement - { - bool operator()(replacement const *a, std::size_t start_position) const - { return a->start_position() < start_position; } - }; +template +template +void replacement_list<_Replacement, _TokenStream>::remove_text(_Ast *node) { + replace_text(node, string_type()); } -template -void replacement_list<_Tp, _Tp1>::replace_text(std::size_t position, - std::size_t length, char const *text) -{ - std::deque::iterator __pos = - std::lower_bound(_M_replacements.begin(), _M_replacements.end(), position, _Compare_replacement()); - - replacement *r = new text_replacement(position, length, text); - _M_replacements.insert(__pos, r); -} - -template -std::string replacement_list<_Tp, _Tp1>::apply() const -{ - std::string source = _M_contents; - std::string result; - - result.reserve(source.size() * 2); - +template +template +void replacement_list<_Replacement, _TokenStream>::operator()(string_type const &source, _OutputIterator out) const { std::size_t pos = 0; - for (int i=0; i<_M_replacements.size(); ++i) - { - replacement *repl = _M_replacements[i]; + for (const_iterator it = begin(); it != end(); ++it) { + _Replacement const &repl = *it; - result += std::string(source, pos, repl->start_position() - pos); - result += repl->text(); - pos = repl->start_position() + repl->size(); - } - - assert(pos != 0); - - result += std::string(source, pos); - - return result; + std::copy(source.begin() + pos, source.begin() + (repl.begin() - pos), out); + std::copy(repl.text().begin(), repl.text().end(), out); + pos = repl.end(); + } + + std::copy(source.begin() + pos, source.end(), out); } #endif // KDEV_PG_REPLACEMENT_H --- trunk/playground/devtools/kdevelop-pg/include/kdev-pg-token-stream.h #687143:687144 @@ -115,7 +115,7 @@ return _M_location_table; } - inline void start_position(std::size_t index, int *line, int *column) + inline void start_position(std::size_t index, size_t *line, size_t *column) { if (!_M_location_table) { @@ -125,7 +125,7 @@ _M_location_table->position_at(token(index).begin, line, column); } - inline void end_position(std::size_t index, int *line, int *column) + inline void end_position(std::size_t index, size_t *line, size_t *column) { if (!_M_location_table) {