/*ident "@(#)List_old.h 1.1.2.2" */ /****************************************************************************** * * 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. * ******************************************************************************/ #ifndef OLISTH #define OLISTH #include #include class lnk_old_ATTLC; class Lizt_old_ATTLC; class ostream; typedef void* voidP; // implements two-way pointers struct lnk_old_ATTLC { lnk_old_ATTLC* nxt; lnk_old_ATTLC* prv; lnk_old_ATTLC() {} virtual ~lnk_old_ATTLC(); void init(lnk_old_ATTLC* p, lnk_old_ATTLC* s) { prv = p; nxt = s; } virtual lnk_old_ATTLC* copy(); virtual int operator==(lnk_old_ATTLC&); }; /* base class for all [Const_]Listiter(T)'s */ class Liztiter_old_ATTLC { friend class Lizt_old_ATTLC; Liztiter_old_ATTLC(Lizt_old_ATTLC* lp) : theLizt(lp), cache(0), nextIt(0) {} protected: Lizt_old_ATTLC* theLizt; // associated List Liztiter_old_ATTLC* nextIt; // next on chain lnk_old_ATTLC* cache; // a recently retrieved link int cacheNo; // its index or garbage if cache == 0 int index; // current position lnk_old_ATTLC* pred; // current position lnk_old_ATTLC* getAt(int); lnk_old_ATTLC* next(); lnk_old_ATTLC* prev(); inline lnk_old_ATTLC* peek_next() const; inline lnk_old_ATTLC* peek_prev() const; void insert_prev(lnk_old_ATTLC*); void insert_next(lnk_old_ATTLC*); lnk_old_ATTLC* remove_prev(); lnk_old_ATTLC* remove_next(); void reset0(); public: Liztiter_old_ATTLC(Lizt_old_ATTLC&); Liztiter_old_ATTLC(const Liztiter_old_ATTLC&); ~Liztiter_old_ATTLC(); Liztiter_old_ATTLC& operator=(const Liztiter_old_ATTLC&); int operator==(const Liztiter_old_ATTLC& l) const { return theLizt == l.theLizt && index == l.index; } int operator!=(const Liztiter_old_ATTLC& l) const { return !(*this == l); } int position() const { return index; } void reset(unsigned = 0); void end_reset(unsigned = 0); int at_head() const { return index == 0; } int at_end() const; }; inline lnk_old_ATTLC* Liztiter_old_ATTLC::peek_next() const { return at_end() ? (lnk_old_ATTLC*)0 : pred->nxt; } inline lnk_old_ATTLC* Liztiter_old_ATTLC::peek_prev() const { return at_head() ? (lnk_old_ATTLC*)0 : pred; } /* base class for all List's */ class Lizt_old_ATTLC { friend class Liztiter_old_ATTLC; protected: lnk_old_ATTLC* t; // tail int sz; // number of elements Liztiter_old_ATTLC myit; // current position pointer Lizt_old_ATTLC(); Lizt_old_ATTLC(const Lizt_old_ATTLC& x) : myit(this) { init_all(x); } Lizt_old_ATTLC(const Lizt_old_ATTLC&, const Lizt_old_ATTLC&); ~Lizt_old_ATTLC(); void delete_all(); // used by dtor and operator=() void init_all(const Lizt_old_ATTLC&); // used by ctor and operator=() void init_all_to_empty(); // used by make_empty() void add_a_link(lnk_old_ATTLC*); // used by put() and unget() lnk_old_ATTLC* tail() const { return t; } lnk_old_ATTLC* head() const { return t ? t->nxt : 0; } operator void*() { return sz ? this : 0; } Lizt_old_ATTLC& unget(lnk_old_ATTLC*); Lizt_old_ATTLC& unget(const Lizt_old_ATTLC&); Lizt_old_ATTLC& put(lnk_old_ATTLC*); Lizt_old_ATTLC& put(const Lizt_old_ATTLC&); lnk_old_ATTLC* get(); lnk_old_ATTLC* unput(); lnk_old_ATTLC* getAt(int i) { return myit.getAt(i); } lnk_old_ATTLC* next() { return myit.next(); } lnk_old_ATTLC* prev() { return myit.prev(); } lnk_old_ATTLC* peek_next() const { return myit.peek_next(); } lnk_old_ATTLC* peek_prev() const { return myit.peek_prev(); } void insert_prev(lnk_old_ATTLC* l) { myit.insert_prev(l); } void insert_next(lnk_old_ATTLC* l) { myit.insert_next(l); } lnk_old_ATTLC* remove_prev() { return myit.remove_prev(); } lnk_old_ATTLC* remove_next() { return myit.remove_next(); } public: Lizt_old_ATTLC& operator=(const Lizt_old_ATTLC&); int operator==(const Lizt_old_ATTLC&) const; int operator!=(const Lizt_old_ATTLC& x) const { return !(*this == x); } void make_empty(); int length() const { return sz; } int position() const { return myit.index; } void reset(unsigned i = 0) { myit.reset(i); } void end_reset(unsigned i = 0) { myit.end_reset(i); } int at_end() const { return myit.at_end(); } int at_head() const { return myit.at_head(); } void reset_all_iters(); }; #ifdef __GNUG__ #pragma interface #endif template class List_old; template class Listiter_old; template class Const_listiter_old; template ostream& operator<<(ostream&, const List_old&); template class lnnk_old_ATTLC : public lnk_old_ATTLC { friend class List_old; friend class Const_listiter_old; friend class Listiter_old; friend void voidP_List_old_sort_internal(List_old&, int (*)(const voidP &, const voidP &)); #ifndef __GNUG__ static Pool* pool; #endif T val; lnnk_old_ATTLC(T& pp) : val(pp) {} ~lnnk_old_ATTLC(); lnk_old_ATTLC* copy(); int operator==(lnk_old_ATTLC&); public: void* operator new(size_t); #ifdef __GNUG__ void operator delete(void* l) { pool()->free(l); } static Pool *pool(); #else void operator delete(void* l) { pool->free(l); } static void init_pool() { // should be called by List constructors if (pool == 0) pool = new Pool(sizeof(lnnk_old_ATTLC)); } #endif static lnk_old_ATTLC* getnewlnnk_old_ATTLC(const T&); static void deletelnnk_old_ATTLC(T&, lnnk_old_ATTLC*); }; template class List_old : public Lizt_old_ATTLC { friend void voidP_List_old_sort_internal(List_old&, int(*)(const voidP &, const voidP &)); List_old(const List_old& a0, const List_old& a1) : Lizt_old_ATTLC((Lizt_old_ATTLC&)a0, (Lizt_old_ATTLC&)a1) {} List_old(const List_old&, const T&); protected: T* getAt(int i); public: List_old(); List_old(const List_old&); List_old(const T&); List_old(const T&, const T&); List_old(const T&, const T&, const T&); List_old(const T&, const T&, const T&, const T&); ~List_old() {} operator void*() { return Lizt_old_ATTLC::operator void*(); } int operator==(const List_old& l) const { return (Lizt_old_ATTLC&)*this == (Lizt_old_ATTLC&)l; } int operator!=(const List_old& l) const { return (Lizt_old_ATTLC&)*this != (Lizt_old_ATTLC&)l; } List_old operator+(const List_old& ll) { return List_old(*this, ll); } List_old operator+(const T& _t) { return List_old(*this, _t); } List_old& operator=(const List_old& a) { return (List_old&)(*(Lizt_old_ATTLC*)this = *(Lizt_old_ATTLC*)&a); } List_old& put(const T& x); List_old& put(const List_old& ll) { return (List_old&) Lizt_old_ATTLC::put((Lizt_old_ATTLC&) ll); } T unput(); int unput(T&); T get(); int get(T&); List_old& unget(const T& x); List_old& unget(const List_old& ll) { return (List_old&)Lizt_old_ATTLC::unget((Lizt_old_ATTLC&) ll); } T head() const; T tail() const; int find_next(const T&); int find_prev(const T&); int next(T&); int next(T*&); T next(); int prev(T&); int prev(T*&); T prev(); int step_next() { return Lizt_old_ATTLC::next() != 0; } int step_prev() { return Lizt_old_ATTLC::prev() != 0; } int peek_next(T&) const; int peek_next(T*&) const; T peek_next() const; int peek_prev(T&) const; int peek_prev(T*&) const; T peek_prev() const; int remove_prev(); int remove_next(); int remove_prev(T&); int remove_next(T&); void insert_prev(const T& x); void insert_next(const T& x); int replace_prev(const T&); int replace_next(const T&); T& operator[](int i) {return ((*this).operator[]((unsigned) i));} const T& operator[](int i) const {return ((*this).operator[]((unsigned) i));} T& operator[](unsigned); const T& operator[](unsigned) const; void sort(int (*)(const T&, const T&)); ostream& print(ostream&) const; }; template class Const_listiter_old : public Liztiter_old_ATTLC { protected: T* getAt(int i); public: Const_listiter_old(const List_old&); Const_listiter_old(const Const_listiter_old&); ~Const_listiter_old() {} Const_listiter_old& operator=(const Const_listiter_old& l) { return (Const_listiter_old&) ((Liztiter_old_ATTLC&)*this = (const Liztiter_old_ATTLC&)l); } int operator==(const Const_listiter_old& l) const { return (const Liztiter_old_ATTLC&)*this == (const Liztiter_old_ATTLC&)l; } int operator!=(const Const_listiter_old& l) const { return (const Liztiter_old_ATTLC&)*this != (const Liztiter_old_ATTLC&)l; } int find_next(const T&); int find_prev(const T&); int next(T& t); int next(T*& t); T next(); int prev(T& t); int prev(T*& t); T prev(); int step_next() { return Liztiter_old_ATTLC::next() != 0; } int step_prev() { return Liztiter_old_ATTLC::prev() != 0; } int peek_next(T&) const; int peek_next(T*&) const; T peek_next() const; int peek_prev(T&) const; int peek_prev(T*&) const; T peek_prev() const; const List_old* the_list() { return (const List_old*)theLizt; } }; template class Listiter_old : public Const_listiter_old { public: Listiter_old(List_old&); Listiter_old(const Listiter_old&); ~Listiter_old() {} Listiter_old& operator=(const Listiter_old& l) { return (Listiter_old&) ((Liztiter_old_ATTLC&)*this = (Liztiter_old_ATTLC&)l); } int operator==(const Listiter_old& l) const { return (Liztiter_old_ATTLC&)*this == (Liztiter_old_ATTLC&)l; } int operator!=(const Listiter_old& l) const { return (Liztiter_old_ATTLC&)*this != (Liztiter_old_ATTLC&)l; } List_old* the_list() { return (List_old*)theLizt; } // the following operations change the container int remove_prev(); int remove_next(); int remove_prev(T&); int remove_next(T&); void insert_prev(const T& x); void insert_next(const T& x); int replace_prev(const T&); int replace_next(const T&); }; template class List_of_p_old; template class List_of_piter_old; template ostream& operator<<(ostream&, const List_of_p_old&); template class List_of_p_old : public List_old { public: List_of_p_old() {} List_of_p_old(const T*); List_of_p_old(const T*, const T*); List_of_p_old(const T*, const T*, const T*); List_of_p_old(const T*, const T*, const T*, const T*); List_of_p_old(const List_of_p_old& ll) : List_old((const List_old&) ll) {} ~List_of_p_old() {} T*& operator[](int i) {return ((*this).operator[]((unsigned) i));} const T*& operator[](int i) const {return ((*this).operator[]((unsigned) i));} T*& operator[](unsigned); const T*& operator[](unsigned) const; operator void*() { return List_old::operator void*(); } int operator==(const List_of_p_old& ll) const { return (const List_old&)*this == (const List_old&)ll; } int operator!=(const List_of_p_old& l) const { return !(*this == l); } List_of_p_old& operator=(const List_of_p_old& ll) { return (List_of_p_old&) ((List_old&)*this = (const List_old&)ll); } List_of_p_old operator+(const List_of_p_old&); List_of_p_old operator+(const T*); List_of_p_old& put(const T* _t) { return (List_of_p_old&) List_old::put((voidP)_t); } List_of_p_old& put(const List_of_p_old& ll) { return (List_of_p_old&) List_old::put((const List_old&)ll); } T* unput() { return (T*)List_old::unput(); } int unput(T*& _t) { return List_old::unput((voidP&)_t); } T* get() { return (T*)List_old::get(); } int get(T*& _t) { return List_old::get((voidP&)_t); } List_of_p_old& unget(const T* x) { return (List_of_p_old&) List_old::unget((voidP)x); } List_of_p_old& unget(const List_of_p_old& ll) { return (List_of_p_old&) List_old::unget((const List_old&)ll); } T* head() const { return (T*)List_old::head(); } T* tail() const { return (T*)List_old::tail(); } int find_next(const T*const&_t) { return List_old::find_next((const voidP &)_t); } int find_prev(const T*const&_t) { return List_old::find_prev((const voidP &)_t); } T* next() { return (T*)List_old::next(); } int next(T*& _t) { return List_old::next((voidP&)_t); } int next(T**& _t) { return List_old::next((voidP*&)_t); } T* prev() { return (T*)List_old::prev(); } int prev(T*& _t) { return List_old::prev((voidP&)_t); } int prev(T**& _t) { return List_old::prev((voidP*&)_t); } T* peek_next() const { return (T*)List_old::peek_next(); } int peek_next(T*& _t) const { return List_old::peek_next((voidP&)_t); } int peek_next(T**& _t) const { return List_old::peek_next((voidP*&)_t); } T* peek_prev() const { return (T*)List_old::peek_prev(); } int peek_prev(T*& _t) const { return List_old::peek_prev((voidP&)_t); } int peek_prev(T**& _t) const { return List_old::peek_prev((voidP*&)_t); } int remove_prev() { return List_old::remove_prev(); } int remove_prev(T*& x) { return List_old::remove_prev((voidP&)x); } int remove_next() { return List_old::remove_next(); } int remove_next(T*& x) { return List_old::remove_next((voidP&)x); } void insert_prev(T*const&x) { List_old::insert_prev((voidP &)x); } void insert_next(T*const&x) { List_old::insert_next((voidP &)x); } int replace_prev(T*const&x) { return List_old::replace_prev((voidP &)x); } int replace_next(T*const&x) { return List_old::replace_next((voidP &)x); } void sort(int (*pf)(const T* &, const T* &)) { List_old::sort((int (*)(const voidP &, const voidP &))pf); } ostream& print(ostream&) const; }; template class Const_list_of_piter_old : public Listiter_old { public: Const_list_of_piter_old(const List_of_p_old&); Const_list_of_piter_old(const Const_list_of_piter_old&); ~Const_list_of_piter_old() {} int operator==(const Const_list_of_piter_old& l) const { return (const Listiter_old&)*this == ((const Listiter_old&)l); } int operator!=(const Const_list_of_piter_old& l) const { return !(*this == l); } Const_list_of_piter_old& operator=(const Const_list_of_piter_old& ll) { return (Const_list_of_piter_old&)((Listiter_old&)*this = (const Listiter_old&)ll); } const List_of_p_old* the_list() { return (const List_of_p_old*)Listiter_old::the_list(); } int find_next(const T*const& t) { return Listiter_old::find_next((voidP&)t); } int find_prev(const T*const& t) { return Listiter_old::find_prev((voidP&)t); } T* next() { return (T*)Listiter_old::next(); } int next(T* &t) { return Listiter_old::next((voidP&)t); } int next(T**& t) { return Listiter_old::next((voidP*&)t); } T* prev() { return (T*)Listiter_old::prev(); } int prev(T*& t) { return Listiter_old::prev((voidP&)t); } int prev(T**& t) { return Listiter_old::prev((voidP*&)t); } T* peek_next() const { return (T*)Listiter_old::peek_next(); } int peek_next(T*& t) const { return Listiter_old::peek_next((voidP&)t); } int peek_next(T**& t) const { return Listiter_old::peek_next((voidP*&)t); } T* peek_prev() const { return (T*)Listiter_old::peek_prev(); } int peek_prev(T*& t) const { return Listiter_old::peek_prev((voidP&)t); } int peek_prev(T**& t) const { return Listiter_old::peek_prev((voidP*&)t); } }; template class List_of_piter_old : public Const_list_of_piter_old { public: List_of_piter_old(List_of_p_old&); List_of_piter_old(const List_of_piter_old&); ~List_of_piter_old(); int operator==(const List_of_piter_old& l) const { return (const Const_list_of_piter_old&)*this == ((const Const_list_of_piter_old&)l); } int operator!=(const List_of_piter_old& l) const { return !(*this == l); } List_of_piter_old& operator=(const List_of_piter_old& ll) { return (List_of_piter_old&)((Listiter_old&)*this = (const Listiter_old&)ll); } List_of_p_old* the_list() { return (List_of_p_old*)Listiter_old::the_list(); } // the following operations change the container int remove_prev() { return Listiter_old::remove_prev(); } int remove_prev(T*& x) { return Listiter_old::remove_prev((voidP&)x); } int remove_next() { return Listiter_old::remove_next(); } int remove_next(T*& x) { return Listiter_old::remove_next((voidP&)x); } void insert_prev(T*const& x) { Listiter_old::insert_prev((voidP&)x); } void insert_next(T*const& x) { Listiter_old::insert_next((voidP&)x); } int replace_prev(T* x) { return Listiter_old::replace_prev((voidP)x); } int replace_next(T* x) { return Listiter_old::replace_next((voidP)x); } }; #define List List_old #define Listiter Listiter_old #define Const_listiter Const_listiter_old #define List_of_p List_of_p_old #define List_of_piter List_of_piter_old #define Const_list_of_piter Const_list_of_piter_old #if defined(__GNUG__) #include "List_old.c" #else #if (defined(__edg_att_40) || defined(__GNUG__)) && !defined(__IMPLICIT_INCLUDE) #include #endif #endif #endif