/*ident "@(#)List.c 1.1.2.4" */ /****************************************************************************** * * C++ Standard Components, Release 3.0. * * Copyright (c) 1991, 1992 AT&T and Unix System Laboratories, Inc. * Copyright (c) 1988, 1989, 1990 AT&T. All Rights Reserved. * * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T and Unix System * Laboratories, Inc. The copyright notice above does not evidence * any actual or intended publication of such source code. * ******************************************************************************/ #ifdef __GNUG__ #pragma implementation "List.h" #endif #include #include #ifdef __GNUG__ template class List; template class Listiter; #endif #ifndef __GNUG__ #ifdef __GNUG__ Pool *lnnk_ATTLC::pool() { Pool *lcl_pool = 0; if (lcl_pool == 0) { lcl_pool = new Pool(sizeof(lnnk_ATTLC)); } return lcl_pool; } #else Pool* lnnk_ATTLC::pool = 0; #endif lnnk_ATTLC::~lnnk_ATTLC() { } lnk_ATTLC* lnnk_ATTLC::copy() { return new lnnk_ATTLC((TYPE&)val); } int lnnk_ATTLC::operator==(lnk_ATTLC& x) { return val == ((lnnk_ATTLC*)&x)->val; } void* lnnk_ATTLC::operator new(size_t) { #ifdef __GNUG__ return pool()->alloc(); #else return pool->alloc(); #endif } lnk_ATTLC* lnnk_ATTLC::getnewlnnk_ATTLC(const TYPE& x) { return (new lnnk_ATTLC((TYPE&)x)); } void lnnk_ATTLC::deletelnnk_ATTLC(TYPE& t, lnnk_ATTLC* ptr) { t = ptr->val; delete ptr; } List::List(const List& a0, const TYPE& _t) : Lizt_ATTLC((Lizt_ATTLC&)a0) { put(_t); } List::List() { #ifndef __GNUG__ lnnk_ATTLC::init_pool(); #endif } List::List(const TYPE& _t) { #ifndef __GNUG__ lnnk_ATTLC::init_pool(); #endif put(_t); } List::List(const TYPE& _t, const TYPE& u) { #ifndef __GNUG__ lnnk_ATTLC::init_pool(); #endif put(_t); put(u); } List::List(const TYPE& _t, const TYPE& u, const TYPE& v) { #ifndef __GNUG__ lnnk_ATTLC::init_pool(); #endif put(_t); put(u); put(v); } List::List(const TYPE& _t, const TYPE& u, const TYPE& v, const TYPE& w) { #ifndef __GNUG__ lnnk_ATTLC::init_pool(); #endif put(_t); put(u); put(v); put(w); } List::List(const List& a) : Lizt_ATTLC((const Lizt_ATTLC&)a) { #ifndef __GNUG__ lnnk_ATTLC::init_pool(); #endif } TYPE List::unput() { lnnk_ATTLC* ll = (lnnk_ATTLC*)Lizt_ATTLC::unput(); TYPE ans = ll->val; delete ll; return ans; } TYPE List::get() { lnnk_ATTLC* ll = (lnnk_ATTLC*)Lizt_ATTLC::get(); // if (ll == 0) // return 0; TYPE ans = ll->val; delete ll; return ans; } TYPE* List::getAt(int i) { lnnk_ATTLC* ll = (lnnk_ATTLC*)Lizt_ATTLC::getAt(i); if ( ll ) return &(ll->val); else return (TYPE*)0; } TYPE& List::operator[](unsigned ii) { return (TYPE&)*(getAt(ii)); } const TYPE& List::operator[](unsigned ii) const { return (const TYPE&)*(((List*)this)->getAt(ii)); } TYPE* List::head() const { lnnk_ATTLC* ll = (lnnk_ATTLC*)Lizt_ATTLC::head(); if (ll == 0) return 0; return &(ll->val); } TYPE* List::tail() const { lnnk_ATTLC* ll = (lnnk_ATTLC*)Lizt_ATTLC::tail(); if (ll == 0) return 0; return &(ll->val); } void List::sort(int (*cmp)(const TYPE&,const TYPE&)) { if ( length() < 2 ) return; voidP_List_sort_internal(*(List*)this, (int (*)(const voidP &, const voidP &))cmp); reset_all_iters(); } int List::unput(TYPE& _t) { lnnk_ATTLC* ll = (lnnk_ATTLC*)Lizt_ATTLC::unput(); if ( ll ) { lnnk_ATTLC::deletelnnk_ATTLC(_t, ll); return 1; } else return 0; } int List::get(TYPE& _t) { lnnk_ATTLC* ll = (lnnk_ATTLC*)Lizt_ATTLC::get(); if ( ll ) { lnnk_ATTLC::deletelnnk_ATTLC(_t, ll); return 1; } else return 0; } List& List::put(const TYPE& x) { return (List&) Lizt_ATTLC::put(lnnk_ATTLC::getnewlnnk_ATTLC(x)); } List& List::unget(const TYPE& x) { return (List&)Lizt_ATTLC::unget(lnnk_ATTLC::getnewlnnk_ATTLC(x)); } Const_listiter::Const_listiter(const List& a) : Liztiter_ATTLC((Lizt_ATTLC&)a) { } Const_listiter::Const_listiter(const Const_listiter& a) : Liztiter_ATTLC((const Liztiter_ATTLC&)a) { } int Const_listiter::next(TYPE& t) { if ( at_end() ) return 0; else return (t = ((lnnk_ATTLC*)Liztiter_ATTLC::next())->val, 1); } int Const_listiter::next(TYPE*& t) { if ( at_end() ) return 0; else return (t = &((lnnk_ATTLC*)Liztiter_ATTLC::next())->val, 1); } TYPE* Const_listiter::next() { if ( at_end() ) return 0; lnnk_ATTLC* ll = (lnnk_ATTLC*)Liztiter_ATTLC::next(); return &(ll->val); } int Const_listiter::prev(TYPE& t) { if ( at_head() ) return 0; else return (t=((lnnk_ATTLC*)Liztiter_ATTLC::prev())->val, 1); } int Const_listiter::prev(TYPE*& t) { if ( at_head() ) return 0; else return (t= &((lnnk_ATTLC*)Liztiter_ATTLC::prev())->val, 1); } TYPE* Const_listiter::prev() { if ( at_head() ) return 0; lnnk_ATTLC* ll = (lnnk_ATTLC*)Liztiter_ATTLC::prev(); return &(ll->val); } int Const_listiter::find_prev(const TYPE& x) { if ( at_head() || theLizt->length()==0 ) return 0; lnnk_ATTLC* iter = (lnnk_ATTLC*) pred->nxt; register int i = index; do { iter = (lnnk_ATTLC*) iter->prv; if (iter->val==x) { index = i; pred = iter; return 1; } i--; } while ( i > 0 ); return 0; } int Const_listiter::find_next(const TYPE& x) { if ( at_end() || theLizt->length()==0 ) return 0; lnnk_ATTLC* iter = (lnnk_ATTLC*) pred; register int i = index; do { iter = (lnnk_ATTLC*) iter->nxt; if (iter->val==x) { index = i; pred = iter->prv; return 1; } i++; } while ( i < theLizt->length() ); return 0; } TYPE* Const_listiter::peek_prev() const { if ( at_head() ) return 0; return &(((lnnk_ATTLC*)Liztiter_ATTLC::peek_prev())->val); } int Const_listiter::peek_prev(TYPE& t) const { if ( at_head() ) return 0; else return (t = ((lnnk_ATTLC*)Liztiter_ATTLC::peek_prev())->val, 1); } int Const_listiter::peek_prev(TYPE*& t) const { if ( at_head() ) return 0; else return (t = &((lnnk_ATTLC*)Liztiter_ATTLC::peek_prev())->val, 1); } TYPE* Const_listiter::peek_next() const { if ( at_end() ) return 0; return &(((lnnk_ATTLC*)Liztiter_ATTLC::peek_next())->val); } int Const_listiter::peek_next(TYPE& t) const { if ( at_end() ) return 0; else return (t = ((lnnk_ATTLC*)Liztiter_ATTLC::peek_next())->val, 1); } int Const_listiter::peek_next(TYPE*& t) const { if ( at_end() ) return 0; else return (t = &((lnnk_ATTLC*)Liztiter_ATTLC::peek_next())->val, 1); } TYPE* Const_listiter::getAt(int i) { lnnk_ATTLC* ll = ((lnnk_ATTLC*)Liztiter_ATTLC::getAt(i)); if ( ll ) return &(ll->val); else return (TYPE*)0; } Listiter::Listiter(List& a) : Const_listiter((const List&)a) { } Listiter::Listiter(const Listiter& a) : Const_listiter((Const_listiter)a) { } int Listiter::remove_prev() { lnnk_ATTLC *aLink = (lnnk_ATTLC *)Liztiter_ATTLC::remove_prev(); if ( aLink ) { delete aLink; return 1; } else return 0; } int Listiter::remove_prev(TYPE &x) { lnnk_ATTLC *aLink = (lnnk_ATTLC *)Liztiter_ATTLC::remove_prev(); if ( aLink ) { x = aLink->val; delete aLink; return 1; } else return 0; } int Listiter::remove_next() { lnnk_ATTLC *aLink = (lnnk_ATTLC *)Liztiter_ATTLC::remove_next(); if ( aLink ) { delete aLink; return 1; } else return 0; } int Listiter::remove_next(TYPE &x) { lnnk_ATTLC *aLink = (lnnk_ATTLC *)Liztiter_ATTLC::remove_next(); if ( aLink ) { x = aLink->val; delete aLink; return 1; } else return 0; } int Listiter::replace_prev(const TYPE& x) { if ( at_head() ) return 0; else return (((lnnk_ATTLC*)Liztiter_ATTLC::peek_prev())->val=x,1); } int Listiter::replace_next(const TYPE& x) { if ( at_end() ) return 0; else return (((lnnk_ATTLC*)Liztiter_ATTLC::peek_next())->val=x,1); } void Listiter::insert_prev(const TYPE& x) { Liztiter_ATTLC::insert_prev(lnnk_ATTLC::getnewlnnk_ATTLC(x)); } void Listiter::insert_next(const TYPE& x) { Liztiter_ATTLC::insert_next(lnnk_ATTLC::getnewlnnk_ATTLC(x)); } #endif