Files
libreoffice/xml2cmp/source/support/list.hxx

260 lines
6.7 KiB
C++
Raw Normal View History

2001-03-12 16:16:35 +00:00
/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
2001-03-12 16:16:35 +00:00
*
* $RCSfile: list.hxx,v $
2001-03-12 16:16:35 +00:00
*
* $Revision: 1.10 $
2001-03-12 16:16:35 +00:00
*
* last change: $Author: obo $ $Date: 2007-07-18 15:03:29 $
2001-03-12 16:16:35 +00:00
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
2001-03-12 16:16:35 +00:00
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
2001-03-12 16:16:35 +00:00
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
2001-03-12 16:16:35 +00:00
*
* This library 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 for more details.
2001-03-12 16:16:35 +00:00
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
2001-03-12 16:16:35 +00:00
*
************************************************************************/
#ifndef __LISTEN_123456__
#define __LISTEN_123456__
#include <string.h>
2001-03-12 18:24:52 +00:00
#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
{
2001-03-12 18:24:52 +00:00
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