summaryrefslogtreecommitdiff
path: root/xml2cmp/source/support/list.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'xml2cmp/source/support/list.hxx')
-rw-r--r--xml2cmp/source/support/list.hxx251
1 files changed, 251 insertions, 0 deletions
diff --git a/xml2cmp/source/support/list.hxx b/xml2cmp/source/support/list.hxx
new file mode 100644
index 000000000000..163cd74ece83
--- /dev/null
+++ b/xml2cmp/source/support/list.hxx
@@ -0,0 +1,251 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef __LISTEN_123456__
+#define __LISTEN_123456__
+
+#include <string.h>
+#include <iostream>
+#include <stdlib.h>
+
+template <class XX>
+class List
+{
+ public :
+ typedef XX * iterator;
+ typedef const XX * const_iterator;
+
+ // LIFECYCLE
+ List();
+ virtual ~List() { delete [] inhalt; }
+
+ // OPERATORS
+ const XX & operator[](
+ unsigned n) const
+ { return elem(n); }
+ XX & operator[](
+ unsigned n)
+ { return elem(n); }
+ // OPERATIONS
+ void reserve(
+ unsigned i_nSize )
+ { alloc(i_nSize,true); }
+ virtual void insert(
+ unsigned pos,
+ const XX & elem );
+ void push_back(
+ const XX & elem_)
+ { insert(size(),elem_); }
+
+ virtual void remove(
+ unsigned pos );
+ void pop_back() { remove(size()-1); }
+ void erase_all() { while (size()) remove(size()-1); }
+
+ // INQUIRY
+ const XX & front() const { return elem(0); }
+ const XX & back() const { return elem(len-1); }
+
+ unsigned size() const { return len; }
+ unsigned space() const { return allocated; }
+ bool is_valid_index(
+ unsigned n) const
+ { return n < len; }
+ // ACCESS
+ XX & front() { return elem(0); }
+ XX & back() { return elem(len-1); }
+
+ protected:
+ void checkSize(
+ unsigned newLength);
+ void alloc(
+ unsigned newSpace,
+ bool re = false );
+
+ const XX & elem(
+ unsigned n ) const
+ { return inhalt[n]; }
+ XX & elem(
+ unsigned n )
+ { return inhalt[n]; }
+ // DATA
+ XX * inhalt;
+ unsigned len;
+ unsigned allocated;
+
+ private:
+ // forbidden functions
+ List(const List<XX> & L);
+ List<XX> & operator=(
+ const List<XX> & L);
+
+};
+
+template <class XY>
+class DynamicList : public List<XY*>
+{
+ public:
+ virtual ~DynamicList();
+
+ virtual void insert(
+ unsigned pos,
+ XY * const & elem );
+ virtual void remove(
+ unsigned pos );
+};
+
+
+
+template <class XX>
+List<XX>::List()
+ : inhalt(0),
+ len(0),
+ allocated(0)
+
+{
+ alloc(1);
+}
+
+
+template <class XX>
+void
+List<XX>::insert(unsigned pos, const XX & elem_)
+{
+ if ( pos > len )
+ return;
+
+ checkSize(len+2);
+ for ( unsigned p = len; p > pos; --p)
+ {
+ inhalt[p] = inhalt[p-1];
+ }
+ inhalt[pos] = elem_;
+ len++;
+}
+
+
+template <class XX>
+void
+List<XX>::remove(unsigned pos)
+{
+ if ( pos >= len )
+ return;
+ len--;
+ for ( unsigned p = pos; p < len; ++p)
+ {
+ inhalt[p] = inhalt[p+1];
+ }
+}
+
+
+// Protected:
+template <class XX>
+void
+List<XX>::checkSize(unsigned newLength)
+{
+ // neuen Platzbedarf pruefen:
+ unsigned newSpace = space();
+ if (newLength > newSpace)
+ {
+ if (!newSpace)
+ newSpace = 1;
+ const unsigned nBorder = 65536 / 2;
+ while(newLength > newSpace)
+ {
+ if (newSpace < nBorder)
+ newSpace <<= 1;
+ else
+ {
+ std::cerr << "List becomes too big" << std::endl;
+ exit(1);
+ }
+ }
+ }
+
+ // Veraenderung ?:
+ if (newSpace != space())
+ alloc(newSpace,true);
+}
+
+template <class XX>
+void
+List<XX>::alloc( unsigned newSpace,
+ bool re )
+{
+ XX * pNew = new XX[newSpace];
+
+ if (inhalt != 0)
+ {
+ if (re)
+ {
+ for (unsigned i = 0; i < len; ++i)
+ {
+ pNew[i] = inhalt[i];
+ } // end for
+ }
+ delete [] inhalt;
+ }
+
+ inhalt = pNew;
+ allocated = newSpace;
+}
+
+
+template <class XY>
+DynamicList<XY>::~DynamicList()
+{
+ this->erase_all();
+}
+
+template <class XY>
+void
+DynamicList<XY>::insert(unsigned pos, XY * const & elem_)
+{
+ if ( pos > this->len )
+ return;
+
+ checkSize(this->len+2);
+ memmove(this->inhalt[pos+1], this->inhalt[pos], (this->len-pos) * sizeof(XY*) );
+ this->inhalt[pos] = elem_;
+ this->len++;
+}
+
+template <class XY>
+void
+DynamicList<XY>::remove( unsigned pos )
+{
+ if (!this->is_valid_index(pos) )
+ return;
+ this->len--;
+ delete this->inhalt[pos];
+ memmove(this->inhalt[pos], this->inhalt[pos+1], (this->len-pos) * sizeof(XY*) );
+}
+
+
+
+#endif
+