AwakeMUD-0.8.18B/
AwakeMUD-0.8.18B/doc/
AwakeMUD-0.8.18B/lib/
AwakeMUD-0.8.18B/lib/etc/
AwakeMUD-0.8.18B/lib/etc/pfiles/
AwakeMUD-0.8.18B/lib/misc/
AwakeMUD-0.8.18B/lib/text/
AwakeMUD-0.8.18B/lib/text/help/
AwakeMUD-0.8.18B/lib/text/wizhelp/
AwakeMUD-0.8.18B/lib/veh/
AwakeMUD-0.8.18B/lib/world/
AwakeMUD-0.8.18B/lib/world/mob/
AwakeMUD-0.8.18B/lib/world/mtx/
AwakeMUD-0.8.18B/lib/world/qst/
AwakeMUD-0.8.18B/lib/world/shp/
AwakeMUD-0.8.18B/lib/world/veh/
/* *********************************************************************
*  file: memory.cc  -  1/21/96 -- Christopher J. Dickey                *
*  This is a set of classes to handle memory for the mud.  There's     *
*  not a whole lot of fancy stuff behind them, but they do help in     *
*  efficiency.  Basically, we never really delete any memory unless    *
*  absolutely necessary, and we keep stacks of the most used           *
*  objects.                                                            *
*  (c) 1996-1997 Christopher J. Dickey, Andrew Hynek,                  *
*  (c) 2001 The AwakeMUD Consortium                                    *
********************************************************************* */

#include <assert.h>
#include <stdio.h>

#include "memory.h"
#include "structs.h"
#include "awake.h"
#include "db.h"
#include "utils.h"
#include "newmatrix.h"

memoryClass::memoryClass()
{
  Room = new stackClass<struct room_data>;
  Obj = new stackClass<struct obj_data>;
  Ch = new stackClass<struct char_data>;
  Veh = new stackClass<struct veh_data>;
  Host = new stackClass<struct host_data>;
  Icon = new stackClass<struct matrix_icon>;
}

memoryClass::memoryClass(const memoryClass & mClass)
{
  Obj = new stackClass<obj_data>;
  Obj = mClass.Obj;
  Ch = new stackClass<char_data>;
  Ch = mClass.Ch;
  Veh = new stackClass<veh_data>;
  Veh = mClass.Veh;
  Host = new stackClass<host_data>;
  Host = mClass.Host;
  Icon = new stackClass<matrix_icon>;
  Icon = mClass.Icon;
}

memoryClass::~memoryClass()
{}

struct obj_data *memoryClass::GetObject()
{
  if (Obj->StackIsEmpty())
  {
    struct obj_data *temp = new obj_data;
    clear_object(temp);
    return temp;
  } else
    return Obj->Pop();
}

struct veh_data *memoryClass::GetVehicle()
{
  if (Veh->StackIsEmpty())
  {
    struct veh_data *temp = new veh_data;
    clear_vehicle(temp);
    return temp;
  } else
    return Veh->Pop();
}

struct host_data *memoryClass::GetHost()
{
  if (Host->StackIsEmpty())
  {
    struct host_data *temp = new host_data;
    clear_host(temp);
    return temp;
  } else
    return Host->Pop();
}

struct matrix_icon *memoryClass::GetIcon()
{
  if (Icon->StackIsEmpty())
  {
    struct matrix_icon *temp = new matrix_icon;
    clear_icon(temp);
    return temp;
  } else
    return Icon->Pop();
}

struct char_data *memoryClass::GetCh()
{
  if (Ch->StackIsEmpty())
  {
    struct char_data *temp = new char_data;
    clear_char(temp);
    return temp;
  } else
    return Ch->Pop();
}

struct room_data *memoryClass::GetRoom()
{
  if (Room->StackIsEmpty())
  {
    struct room_data *temp = new room_data;
    // clear room just zeros the room structure, which is all we need to
    // do since it is fresh
    clear_room(temp);
    return temp;
  } else
    return Room->Pop();
}

void memoryClass::DeleteObject(struct obj_data *obj)
{
  // we want to do this so that when we pop em off, they are usable
  free_obj(obj);
  Obj->Push(obj);
}

void memoryClass::DeleteCh(struct char_data *ch)
{
  free_char(ch);
  Ch->Push(ch);
}

void memoryClass::DeleteRoom(struct room_data *room)
{
  free_room(room);
  Room->Push(room);
}

void memoryClass::DeleteHost(struct host_data *host)
{
  free_host(host);
  Host->Push(host);
}

void memoryClass::DeleteIcon(struct matrix_icon *icon)
{
  free_icon(icon);
  Icon->Push(icon);
}

void memoryClass::DeleteVehicle(struct veh_data *veh)
{
  free_veh(veh);
  Veh->Push(veh);
}

void memoryClass::ClearObject(struct obj_data *obj)
{
  clear_object(obj);
  Obj->Push(obj);
}

void memoryClass::ClearVehicle(struct veh_data *veh)
{
  clear_vehicle(veh);
  Veh->Push(veh);
}

void memoryClass::ClearHost(struct host_data *host)
{
  clear_host(host);
  Host->Push(host);
}

void memoryClass::ClearIcon(struct matrix_icon *icon)
{
  clear_icon(icon);
  Icon->Push(icon);
}

void memoryClass::ClearCh(struct char_data *ch)
{
  clear_char(ch);
  Ch->Push(ch);
}

void memoryClass::ClearRoom(struct room_data *room)
{
  clear_room(room);
  Room->Push(room);
}

bool memoryClass::ClearStacks()
{
  // if all the stacks are empty, return FALSE
  if (Obj->StackIsEmpty() && Ch->StackIsEmpty() && Room->StackIsEmpty())
    return FALSE;

  // and here we just clean up the stacks, hoping to free some memory
  while (!Obj->StackIsEmpty())
    Obj->PopDelete();

  while (!Ch->StackIsEmpty())
    Ch->PopDelete();

  while (!Room->StackIsEmpty())
    Room->PopDelete();

  return TRUE;
}