]> git.saurik.com Git - wxWidgets.git/blobdiff - src/stc/scintilla/src/Array.cpp
Apply patch (plus some additional changes) upgrading Scintilla to version 2.03. ...
[wxWidgets.git] / src / stc / scintilla / src / Array.cpp
diff --git a/src/stc/scintilla/src/Array.cpp b/src/stc/scintilla/src/Array.cpp
new file mode 100644 (file)
index 0000000..a2ec27b
--- /dev/null
@@ -0,0 +1,380 @@
+/** file Array.cpp
+* This file is defining a kind of tool for simulating std::vector
+* for using wx on OS which are not supporting the STL
+* @author foldink (foldink@gmail.com)
+* @date 26-February-2010
+*/
+
+#include <string.h>
+
+#include "Platform.h"
+#include "Scintilla.h"
+#include "Selection.h"
+#include "Array.h"
+
+SelectionRange& ArrayIterator::operator*()
+{
+       if ( m_idx >= m_parent->size() )
+               throw "Error access out of bounds";
+
+       return (*m_parent)[m_idx];
+}
+
+ArrayIterator ArrayIterator::operator++(int)
+{
+       ArrayIterator ret(*this);
+       ret.m_idx++;
+       return ret;
+}
+
+ArrayIterator& ArrayIterator::operator++()
+{
+       m_idx++;
+       return (*this);
+}
+
+ArrayIterator ArrayIterator::operator--(int)
+{
+       if ( m_idx == 0 )
+               throw "Error access out of bounds";
+
+       ArrayIterator ret(*this);
+       ret.m_idx--;
+       return ret;
+}
+
+ArrayIterator& ArrayIterator::operator--()
+{
+       if ( m_idx == 0 )
+
+
+               m_idx--;
+       return (*this);
+}
+
+ArrayIterator ArrayIterator::operator+(size_t idx)
+{
+       ArrayIterator ret(*this);
+       ret.m_idx += idx;
+       return ret;
+}
+
+ArrayIterator ArrayIterator::operator-(size_t idx)
+{
+       if ( idx > m_idx )
+               throw "Error access out of bounds";
+
+       ArrayIterator ret(*this);
+       ret.m_idx -= idx;
+       return ret;
+}
+
+ArrayIterator& ArrayIterator::operator+=(size_t idx)
+{
+       m_idx += idx;
+       return (*this);
+}
+
+ArrayIterator& ArrayIterator::operator-=(size_t idx)
+{
+       if ( idx > m_idx )
+               throw "Error access out of bounds";
+
+       m_idx -= idx;
+       return (*this);
+}
+
+bool ArrayIterator::operator!=(const ArrayIterator& rhs)
+{
+       if ( m_parent == rhs.m_parent && m_idx == rhs.m_idx )
+               return false;
+
+       return true;
+}
+
+bool ArrayIterator::operator==(const ArrayIterator& rhs)
+{
+       if ( m_parent == rhs.m_parent && m_idx == rhs.m_idx )
+               return true;
+
+       return false;
+}
+
+Array::Array( size_t len ):
+               m_data(0L),
+               m_size(0)
+{
+       if ( len == 0 )
+               return;
+
+       m_data = new SelectionRange[len];
+       m_size = len;
+}
+
+Array::Array( size_t len , const SelectionRange& val ):
+               m_data(0L),
+               m_size(0)
+{
+       if ( len == 0 )
+               return;
+
+       m_data = new SelectionRange[len];
+       m_size = len;
+
+       for ( size_t i = 0; i < len ; ++i )
+               *(m_data + i) = val;
+}
+
+Array::Array( const Array& rhs ):
+               m_data(0L),
+               m_size(0)
+{
+       if ( rhs.m_size == 0 )
+               return;
+
+       m_data = new SelectionRange[rhs.m_size];
+       m_size = rhs.m_size;
+       memcpy( m_data , rhs.m_data , m_size*sizeof(SelectionRange) );
+}
+
+Array::~Array()
+{
+       if ( m_data )
+               delete m_data;
+}
+
+Array& Array::operator=( const Array& rhs )
+{
+       if ( m_data )
+               delete m_data;
+
+       m_data = 0L;
+       m_size = 0;
+
+       if ( rhs.m_size == 0 )
+               return (*this);
+
+       m_data = new SelectionRange[rhs.m_size];
+       m_size = rhs.m_size;
+       memcpy( m_data , rhs.m_data , m_size*sizeof(SelectionRange) );
+
+       return (*this);
+}
+
+void Array::reserve( size_t len )
+{
+       if ( len <= m_size || len == 0 )
+               return;
+
+       SelectionRange* data = 0L;
+       data = new SelectionRange[len];
+
+       if ( m_data ) {
+               memcpy( data , m_data , m_size*sizeof(SelectionRange) );
+               delete m_data;
+               m_data = data;
+       } else
+               m_data = data;
+}
+
+void Array::push_back( const SelectionRange& val )
+{
+       if ( !m_data ) {
+               m_data = new SelectionRange[1];
+               *m_data = val;
+               m_size = 1;
+               return;
+       }
+
+       SelectionRange* data = 0L;
+       data = new SelectionRange[m_size+1];
+       memcpy( data , m_data , m_size*sizeof(SelectionRange) );
+       m_data = data;
+       *(m_data+m_size) = val;
+       m_size++;
+}
+
+void Array::pop_back( )
+{
+       if ( !m_data )
+               throw "Error access out of bounds";
+
+       m_size--;
+       SelectionRange* data = 0L;
+
+       if ( m_size > 0 ) {
+               data = new SelectionRange[m_size];
+               memcpy( data , m_data , m_size*sizeof(SelectionRange) );
+       }
+
+       delete m_data;
+       m_data = data;
+}
+
+void Array::insert( ArrayIterator it , SelectionRange& val )
+{
+       size_t idx = it.GetIdx();
+       SelectionRange* data = 0L;
+       if (!m_data) {
+               m_size = idx+1;
+               m_data = new SelectionRange[m_size];
+       } else if ( idx >= m_size ) {
+               data = new SelectionRange[idx+1];
+               memcpy( data , m_data , m_size*sizeof(SelectionRange) );
+               m_size = idx+1;
+               delete m_data;
+               m_data = data;
+       } else if ( idx == 0 ) {
+               data = new SelectionRange[m_size+1];
+               memcpy( data + 1 , m_data , m_size*sizeof(SelectionRange) );
+               delete m_data;
+               m_size++;
+               m_data = data;
+       } else {
+               data = new SelectionRange[m_size+1];
+               memcpy( data , m_data , idx*sizeof(SelectionRange) );
+               memcpy( data + idx + 1 , m_data + idx , (m_size-idx)*sizeof(SelectionRange) );
+               delete m_data;
+               m_size++;
+               m_data = data;
+       }
+
+       *(m_data + idx) = val;
+}
+
+void Array::erase( ArrayIterator it )
+{
+       size_t idx = it.GetIdx();
+       if (!m_data || idx >= m_size )
+               throw "Error access out of bounds";
+
+       SelectionRange* data = 0L;
+       if ( m_size == 1 ) {
+               delete m_data;
+               m_data = 0L;
+               return;
+       } else if ( idx == 0) {
+               data = new SelectionRange[m_size-1];
+               memcpy( data , m_data + 1 , (m_size-1)*sizeof(SelectionRange) );
+               delete m_data;
+               m_size--;
+               m_data = data;
+       } else {
+               data = new SelectionRange[m_size-1];
+               memcpy( data , m_data , (idx)*sizeof(SelectionRange) );
+               memcpy( data + idx , m_data + idx + 1 , (m_size-idx-1)*sizeof(SelectionRange) );
+               delete m_data;
+               m_size--;
+               m_data = data;
+       }
+}
+
+void Array::clear( )
+{
+       if ( !m_data )
+               return;
+
+       delete m_data;
+       m_data = 0L;
+       m_size = 0;
+}
+
+void Array::resize( size_t n , SelectionRange val )
+{
+       if ( (n == 0 && !m_data) || n <= m_size )
+               return;
+
+       if ( n == 0 ) {
+               delete m_data;
+               m_data = 0L;
+               m_size = 0;
+       }
+
+       SelectionRange* data = 0L;
+       data = new SelectionRange[n];
+       memcpy( data , m_data , m_size*sizeof(SelectionRange) );
+       delete m_data;
+       m_data = data;
+
+       for ( size_t i = m_size ; i < n ; ++i )
+               *( m_data + i ) = val;
+
+       m_size = n;
+}
+
+bool Array::operator==(const Array& rhs)
+{
+       if ( m_size != rhs.m_size )
+               return false;
+
+       if ( m_size == 0 && rhs.m_size == 0 )
+               return true;
+
+       for ( size_t i = 0 ; i < m_size ; ++i )
+               if ( ! ((*(m_data +i)) == (*(rhs.m_data+i))) )
+                       return false;
+
+       return true;
+}
+
+ArrayIterator Array::begin()
+{
+       ArrayIterator ret(this,0);
+       return ret;
+}
+
+ArrayIterator Array::end()
+{
+       ArrayIterator ret(this,m_size);
+       return ret;
+}
+
+
+int partition(Array &array, int top, int bottom)
+{
+       SelectionRange x = array[top];
+       int i = top - 1;
+       int j = bottom + 1;
+       SelectionRange temp;
+       do {
+               do {
+                       j--;
+               } while (x < array[j]);
+
+               do {
+                       i++;
+               } while (array[j] < x);
+
+               if (i < j) {
+                       temp = array[i];
+                       array[i] = array[j];
+                       array[j] = temp;
+               }
+       } while (i < j);
+       return j;           // returns middle subscript
+}
+
+void quicksort(Array &num, int top, int bottom)
+{
+       // top = subscript of beginning of array
+       // bottom = subscript of end of array
+
+       int middle;
+       if (top < bottom) {
+               middle = partition(num, top, bottom);
+               quicksort(num, top, middle);   // sort first section
+               quicksort(num, middle+1, bottom);    // sort second section
+       }
+       return;
+}
+
+void ArraySort( ArrayIterator start , ArrayIterator finish )
+{
+       if ( start.m_parent != finish.m_parent )
+               throw "Invalid iterators parent mismatch";
+       
+       if ( start.m_idx >= finish.m_idx-1 )
+               throw "Invalid iterators are refering to bad values";
+               
+       quicksort( *(start.m_parent) , start.m_idx , finish.m_idx-1 );
+}