2001-03-12 16:16:35 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2005-09-09 10:57:10 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2001-03-12 16:16:35 +00:00
|
|
|
*
|
2005-09-09 10:57:10 +00:00
|
|
|
* $RCSfile: list.hxx,v $
|
2001-03-12 16:16:35 +00:00
|
|
|
*
|
2007-07-18 14:03:29 +00:00
|
|
|
* $Revision: 1.10 $
|
2001-03-12 16:16:35 +00:00
|
|
|
*
|
2007-07-18 14:03:29 +00:00
|
|
|
* last change: $Author: obo $ $Date: 2007-07-18 15:03:29 $
|
2001-03-12 16:16:35 +00:00
|
|
|
*
|
2005-09-09 10:57:10 +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
|
|
|
*
|
|
|
|
*
|
2005-09-09 10:57:10 +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
|
|
|
*
|
2005-09-09 10:57:10 +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
|
|
|
*
|
2005-09-09 10:57:10 +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
|
|
|
*
|
2005-09-09 10:57:10 +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
|
|
|
*
|
|
|
|
************************************************************************/
|
2001-03-09 14:23:00 +00:00
|
|
|
|
|
|
|
#ifndef __LISTEN_123456__
|
|
|
|
#define __LISTEN_123456__
|
|
|
|
|
|
|
|
#include <string.h>
|
2001-03-12 18:24:52 +00:00
|
|
|
#include <iostream>
|
2001-03-09 14:23:00 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
template <class XX>
|
|
|
|
class List
|
|
|
|
{
|
|
|
|
public :
|
|
|
|
typedef XX * iterator;
|
|
|
|
typedef const XX * const_iterator;
|
|
|
|
|
|
|
|
// LIFECYCLE
|
|
|
|
List();
|
2007-07-18 14:03:29 +00:00
|
|
|
virtual ~List() { delete [] inhalt; }
|
2001-03-09 14:23:00 +00:00
|
|
|
|
|
|
|
// 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(
|
2006-06-19 19:04:23 +00:00
|
|
|
const XX & elem_)
|
|
|
|
{ insert(size(),elem_); }
|
2001-03-09 14:23:00 +00:00
|
|
|
|
|
|
|
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()
|
2001-09-28 13:32:42 +00:00
|
|
|
: inhalt(0),
|
2002-08-08 15:08:20 +00:00
|
|
|
len(0),
|
|
|
|
allocated(0)
|
|
|
|
|
2001-03-09 14:23:00 +00:00
|
|
|
{
|
|
|
|
alloc(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
template <class XX>
|
|
|
|
void
|
2006-06-19 19:04:23 +00:00
|
|
|
List<XX>::insert(unsigned pos, const XX & elem_)
|
2001-03-09 14:23:00 +00:00
|
|
|
{
|
|
|
|
if ( pos > len )
|
|
|
|
return;
|
|
|
|
|
|
|
|
checkSize(len+2);
|
|
|
|
for ( unsigned p = len; p > pos; --p)
|
|
|
|
{
|
|
|
|
inhalt[p] = inhalt[p-1];
|
|
|
|
}
|
2006-06-19 19:04:23 +00:00
|
|
|
inhalt[pos] = elem_;
|
2001-03-09 14:23:00 +00:00
|
|
|
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;
|
2001-03-09 14:23:00 +00:00
|
|
|
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()
|
|
|
|
{
|
2004-07-30 14:15:34 +00:00
|
|
|
this->erase_all();
|
2001-03-09 14:23:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class XY>
|
|
|
|
void
|
2006-06-19 19:04:23 +00:00
|
|
|
DynamicList<XY>::insert(unsigned pos, XY * const & elem_)
|
2001-03-09 14:23:00 +00:00
|
|
|
{
|
2004-07-30 14:15:34 +00:00
|
|
|
if ( pos > this->len )
|
2001-03-09 14:23:00 +00:00
|
|
|
return;
|
|
|
|
|
2004-07-30 14:15:34 +00:00
|
|
|
checkSize(this->len+2);
|
|
|
|
memmove(this->inhalt[pos+1], this->inhalt[pos], (this->len-pos) * sizeof(XY*) );
|
2006-06-19 19:04:23 +00:00
|
|
|
this->inhalt[pos] = elem_;
|
2004-07-30 14:15:34 +00:00
|
|
|
this->len++;
|
2001-03-09 14:23:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
template <class XY>
|
|
|
|
void
|
|
|
|
DynamicList<XY>::remove( unsigned pos )
|
|
|
|
{
|
2004-07-30 14:15:34 +00:00
|
|
|
if (!this->is_valid_index(pos) )
|
2001-03-09 14:23:00 +00:00
|
|
|
return;
|
2004-07-30 14:15:34 +00:00
|
|
|
this->len--;
|
|
|
|
delete this->inhalt[pos];
|
|
|
|
memmove(this->inhalt[pos], this->inhalt[pos+1], (this->len-pos) * sizeof(XY*) );
|
2001-03-09 14:23:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|