/
ScryMUD/mud/
ScryMUD/mud/grrmud/Boards/
ScryMUD/mud/grrmud/Help/
ScryMUD/mud/grrmud/Pfiles/
ScryMUD/mud/grrmud/PlayerSacks/
ScryMUD/mud/grrmud/PlayerShops/
ScryMUD/mud/grrmud/help_filter/
ScryMUD/mud/hegemon/
ScryMUD/mud/hegemon/data/
ScryMUD/mud/hegemon/data/help/battle/
ScryMUD/mud/hegemon/data/help/client/
ScryMUD/mud/hegemon/data/help/communications/
ScryMUD/mud/hegemon/data/help/skills/
ScryMUD/mud/hegemon/data/help/spells/
ScryMUD/mud/include/
ScryMUD/mud/lib/
ScryMUD/mud/lib/bitfield/
ScryMUD/mud/lib/log/
ScryMUD/mud/lib/string2/
// $Id: ProtectedList.h,v 1.2 1999/06/05 23:29:16 greear Exp $
// $Revision: 1.2 $  $Author: greear $ $Date: 1999/06/05 23:29:16 $

//
//ScryMUD Server Code
//Copyright (C) 1998  Ben Greear
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program 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 General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
// To contact the Author, Ben Greear:  greear@cyberhighway.net, (preferred)
//                                     greearb@agcs.com
//

// PtrArray

#ifndef GRRMUD_PROTECTED_LIST_H
#define GRRMUD_PROTECTED_LIST_H

#include <list2.h>

extern int core_dump(const char* msg);

/**  Assumed to contain pointers to objects which implement
 * a method:  getIdNum(), which will return a (unique) integer
 * identifier for all objects of this type in the 'universe'.
 */
template <class T> class ProtectedList {
private:
   unsigned char locked;
   List<T> lst;

   void lock() {
      locked = 1;
   }

   int Assert(const int boolean_val) const {
      if (!boolean_val)
         ::core_dump("ProtectedList.h");
      return TRUE;
   }

public:
   ProtectedList() {
      locked = 0;
   }
   
   const List<T>& getLst() {
      return lst;
   }

   void append(const T& arg) {
      //Assert(!locked);
      lst.append(arg);
   }
   
   void prepend(const T& arg) {
      //Assert(!locked);
      lst.prepend(arg);
   }
   
   int size() const {
      return lst.size();
   }
   
   // does not delete objects in list
   void clear() {
      Assert(!locked);
      lst.clear();
   }

   int isEmpty() const {
      return lst.isEmpty();
   }
   
   T find(const T& val) const {
      //Assert(!locked);
      /*
       *list<T>::iterator it = lst.begin();
       *for(; it != lst.end(); ++it) {
       *  if (*it == val)
       *    return *it;
       *}
       */
      Cell<T> cell(lst);
      T ptr;
      while ((ptr = cell.next())) {
         if (ptr == val)
            return ptr;
      }
      return (T)(0);
   }

   int haveData(const T& val) {
      return (find(val) != (T)(0));
   }
      
   T lose(Cell<T>& cll) {
      return lst.lose(cll);
   }

   void head(Cell<T>& cll) {
      getBeginIterator(cll);
   }

   void getBeginIterator(Cell<T>& cll) {
      Assert(!locked);
      lock();
      lst.head(cll);
   }

   /*
    *iterator isEnd(iterator& i) {
    *  return (i == lst.end());
    *}
    */

   void unlock() {
      locked = 0;
   }

   int isLocked() const {
      return locked;
   }

   /*
    *void unique() {
    *  Assert(!locked);
    *  lst.unique();
    *}
    */

   void gainData(const T& val) {
      //Assert(!locked);
      lst.gainData(val);
   }

   void loseData(const T& val) {
      remove(val);
   }

   void remove(const T& val) {
      Assert(!locked);
      lst.loseData(val);
   }

   T peekFront() const {
      return lst.peekFront();
   }

   T peekRear() const {
      return lst.peekRear();
   }

   T popBack() {
      Assert(!locked);
      return lst.popBack();
   }

   T popFront() {
      Assert(!locked);
      return lst.popFront();
   }

   void clearPtrList() {
      Assert(!locked);
      clear_ptr_list(lst);
   }

};//ProtectedList<T>

#endif