[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/devtools/kdevelop-pg/include
From:       Roberto Raggi <roberto () kdevelop ! org>
Date:       2007-07-13 0:54:42
Message-ID: 1184288082.488928.611.nullmailer () svn ! kde ! org
[Download RAW message or body]

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 <algorithm>
 #include <cstdlib>
 
 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 <roberto@kdevelop.org>
+  Copyright 2005, 2006, 2007 Roberto Raggi <roberto@kdevelop.org>
 
   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 <deque>
 #include <string>
 
-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 <typename _String>
+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 _Tp, class _Tp1>
-class replacement_list
-{
-  typedef _Tp1 token_t;
+template <class _Replacement = default_replacement<std::string>,
+	  class _TokenStream = kdev_pg_token_stream>
+class replacement_list: public std::deque<_Replacement> {
+  typedef std::deque<_Replacement> _Base;
 
 public:
-  replacement_list(std::deque<token_t> 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 <class _Ast>
+  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 <class _Ast>
+  void insert_text_after(_Ast *node, string_type const &text);
 
-  void remove_text(_Tp *node);
+  template <class _Ast>
+  void replace_text(_Ast *node, string_type const &text);
 
-  inline const std::deque<replacement*> &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 <class _Ast>
+  void remove_text(_Ast *node);
 
+  template <typename _OutputIterator>
+  void operator()(string_type const &source, _OutputIterator out) const;
+
 private:
-  char const *_M_contents;
-  std::deque<token_t> const &_M_token_stream;
-  std::deque<replacement*> _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 <class _Tp, class _Tp1>
-replacement_list<_Tp, _Tp1>::replacement_list(std::deque<token_t> const \
                &token_stream)
-  : _M_contents(0), _M_token_stream(token_stream)
-{
-}
+template <class _Replacement, class _TokenStream>
+replacement_list<_Replacement, _TokenStream>::replacement_list():
+  _M_token_stream(0) {}
 
-template <class _Tp, class _Tp1>
-replacement_list<_Tp, _Tp1>::~replacement_list()
-{
-  clear();
+template <class _Replacement, class _TokenStream>
+replacement_list<_Replacement, _TokenStream>::~replacement_list() {}
+
+template <class _Replacement, class _TokenStream>
+_TokenStream *replacement_list<_Replacement, _TokenStream>::token_stream() const {
+  return _M_token_stream;
 }
 
-template <class _Tp, class _Tp1>
-void replacement_list<_Tp, _Tp1>::clear()
-{
-  for (std::deque<replacement*>::iterator it = _M_replacements.begin();
-       it != _M_replacements.end(); ++it)
-    {
-      delete *it;
-    }
-
-  _M_replacements.clear();
+template <class _Replacement, class _TokenStream>
+void replacement_list<_Replacement, _TokenStream>::set_token_stream(_TokenStream \
*token_stream) { +  _M_token_stream = token_stream; 
 }
 
-template <class _Tp, class _Tp1>
-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 <class _Replacement, class _TokenStream>
+template <class _Ast>
+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 <class _Tp, class _Tp1>
-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 <class _Replacement, class _TokenStream>
+template <class _Ast>
+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 <class _Tp, class _Tp1>
-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 <class _Replacement, class _TokenStream>
+template <class _Ast>
+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 <class _Tp, class _Tp1>
-void replacement_list<_Tp, _Tp1>::remove_text(_Tp *node)
-{
-  replace_text(node, "");
+template <class _Replacement, class _TokenStream>
+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 <class _Replacement, class _TokenStream>
+template <class _Ast>
+void replacement_list<_Replacement, _TokenStream>::remove_text(_Ast *node) {
+  replace_text(node, string_type());
 }
 
-template <class _Tp, class _Tp1>
-void replacement_list<_Tp, _Tp1>::replace_text(std::size_t position,
-                                               std::size_t length, char const *text)
-{
-  std::deque<replacement*>::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 <class _Tp, class _Tp1>
-std::string replacement_list<_Tp, _Tp1>::apply() const
-{
-  std::string source = _M_contents;
-  std::string result;
-
-  result.reserve(source.size() * 2);
-
+template <class _Replacement, class _TokenStream>
+template <typename _OutputIterator>
+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)
       {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic