/************************************************************************* * * $RCSfile: list.hxx,v $ * * $Revision: 1.7 $ * * last change: $Author: kz $ $Date: 2004-07-30 15:15:34 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * 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. * * 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. * * 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 * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (the "License"); You may not use this file * except in compliance with the License. You may obtain a copy of the * License at http://www.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ #ifndef __LISTEN_123456__ #define __LISTEN_123456__ #include #include #include template class List { public : typedef XX * iterator; typedef const XX * const_iterator; // LIFECYCLE List(); virtual ~List() { } // 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 & L); List & operator=( const List & L); }; template class DynamicList : public List { public: virtual ~DynamicList(); virtual void insert( unsigned pos, XY * const & elem ); virtual void remove( unsigned pos ); }; template List::List() : inhalt(0), len(0), allocated(0) { alloc(1); } template void List::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 void List::remove(unsigned pos) { if ( pos >= len ) return; len--; for ( unsigned p = pos; p < len; ++p) { inhalt[p] = inhalt[p+1]; } } // Protected: template void List::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 void List::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 DynamicList::~DynamicList() { this->erase_all(); } template void DynamicList::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 void DynamicList::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