/
mud++0.33/etc/
mud++0.33/etc/guilds/
mud++0.33/help/propert/
mud++0.33/mudC/
mud++0.33/player/
mud++0.33/src/
mud++0.33/src/bcppbuilder/
mud++0.33/src/unix/
mud++0.33/src/vm/
/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project.  All 
................................................ contributions are welcome. 
....Copyright(C).1995.Melvin.Smith.............. Enjoy. 
------------------------------------------------------------------------------
Melvin Smith (aka Fusion)         msmith@hom.net
MUD++ development mailing list    mudpp-list@mailhost.net
------------------------------------------------------------------------------
vmobject.h
*/

#ifndef _VMOBJECT_H
#define _VMOBJECT_H

#include "vmtypes.h"
#include "garbcoll.h"
#include "erratum.h"

#define IN_C_WORLD (1 << 30)

class VMObject
{
	private:
		int ref_count;

	public:
		VMObject() : 
			ref_count(0)
		{
			toCWorld();
			GC_register(this);
		}

		VMObject( VMObject &  ) :
			ref_count(0)
		{
			toCWorld();
			GC_register(this);
		}

		virtual ~VMObject()
		{
#ifdef GARBAGE_COLLECTOR_DEBUG
			if ( !gc_working_now )
				Error::dump("Object deleted outside of GC");
			if ( ref_count != 0 )
				Error::dump("Object collected with nonzero reference count");
#endif
		}
		virtual vmtype getVMType() { return VMT_VMOBJECT; }

		void fromCWorld()	{ ref_count &= ~IN_C_WORLD; }
		void toCWorld()		{ ref_count |= IN_C_WORLD; }
		void fordelete()	{ fromCWorld(); }
		bool inCWorld()		{ return (ref_count & IN_C_WORLD); }

		void getHandle() { ref_count++; return; }
		void freeHandle() { ref_count--; }
		int getRefCount() { return ref_count; }
		int getCleanRefCount() { return (ref_count & ~IN_C_WORLD); }
		const char * getVMTypeName() { return vmtype_table[getVMType()].name; }

};

#endif