// This may look like C code, but it is really -*- C++ -*- /* Copyright (C) 1988 Free Software Foundation written by Dirk Grunwald (grunwald@cs.uiuc.edu) adapted for libg++ by Doug Lea (dl@rocky.oswego.edu) This file is part of the GNU C++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef PHPQ_h #ifdef __GNUG__ #pragma interface #endif #define PHPQ_h 1 #include ".PQ.h" #ifndef PHPQIndex #define PHPQIndex unsigned short #endif struct PHPQNode { PHPQIndex sibling; PHPQIndex children; item; char valid; }; class PHPQ : public PQ { PHPQNode* storage; // table -- freelist in storage[0].sibling int root; int size; void prealloc(int); int check_sibling_list(int); public: PHPQ(int sz = DEFAULT_INITIAL_CAPACITY); PHPQ(PHPQ&); ~PHPQ(); Pix enq( item); deq(); & front(); void del_front(); int contains( item); void clear(); Pix first(); void next(Pix& i); & operator () (Pix i); void del(Pix i); Pix seek( item); int OK(); // rep invariant }; inline PHPQ::~PHPQ() { delete [] storage; } inline PHPQ::deq() { if (count == 0) error("deq of empty PQ"); x = storage[root].item; del_front(); return x; } inline & PHPQ::front() { if (count == 0) error("front of empty PQ"); return storage[root].item; } inline int PHPQ::contains( item) { return seek(item) != 0; } inline & PHPQ::operator() (Pix p) { if (p == 0) error("null Pix"); return storage[int(p)].item; } #endif