亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? class.cpp

?? this keik game source
?? CPP
字號:
//-----------------------------------------------------------------------------
//
//  $Logfile:: /Quake 2 Engine/Sin/code/game/class.cpp                        $
// $Revision:: 20                                                             $
//   $Author:: Jimdose                                                        $
//     $Date:: 10/19/98 12:07a                                                $
//
// Copyright (C) 1997 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source is may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// $Log:: /Quake 2 Engine/Sin/code/game/class.cpp                             $
// 
// 20    10/19/98 12:07a Jimdose
// made all code use fast checks for inheritance (no text lookups when
// possible)
// isSubclassOf no longer requires ::_classinfo()
// 
// 19    10/07/98 11:42p Jimdose
// Got savegames working
// 
// 18    9/24/98 1:49a Jimdose
// Added DisplayMemoryUsage
// 
// 17    9/21/98 2:15a Jimdose
// Moved non-type specific code in SafePtr to SafePtrBase to help with save
// games
// 
// 16    8/27/98 9:04p Jimdose
// NumEventCommands is now a member of Event
// 
// 15    6/27/98 9:18p Jimdose
// Made lookup for event responses for faster processing
// 
// 14    6/15/98 9:09p Aldie
// Fixed checkInheritance printfs
// 
// 13    5/24/98 4:48p Jimdose
// Made char *'s const
// 
// 12    5/11/98 8:06p Jimdose
// Added SafePtr
// 
// 11    5/08/98 2:51p Jimdose
// Added archiving functions
// 
// 10    3/27/98 6:35p Jimdose
// made checking of classnames case independant
// 
// 9     3/23/98 1:31p Jimdose
// Revamped event and command system
// 
// 8     3/04/98 1:49p Jimdose
// Changed overloaded delete so that it used delete[] instead of delete, since
// we allocate with new[];
// 
// 7     3/02/98 8:49p Jimdose
// Changed the classid parameter of CLASS_DECLARATION to a quoted string so
// that you could have a NULL classid.
// 
// 6     2/03/98 10:53a Jimdose
// Updated to work with Quake 2 engine
// Made class registration automatic
// 
// 5     1/22/98 6:50p Jimdose
// Made Q2 compatible
// 
// 3     10/27/97 3:40p Jimdose
// Included stdarg.h
// 
// 2     9/26/97 6:13p Jimdose
// Added standard Ritual headers
//
// DESCRIPTION:
// Base class that all classes that are used in conjunction with Sin should
// be based off of.  Class gives run-time type information about any class
// derived from it.  This is really handy when you have a pointer to an object 
// that you need to know if it supports certain behaviour.
// 

#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include "g_local.h"
#include "class.h"
#include "linklist.h"

int totalmemallocated = 0;
int numclassesallocated = 0;

static ClassDef *classlist = NULL;

ClassDef::ClassDef()
	{
	this->classname		= NULL;
	this->classID			= NULL;
	this->superclass		= NULL;
	this->responses		= NULL, 
	this->numEvents		= 0;
	this->responseLookup = NULL;
	this->newInstance		= NULL;
	this->classSize		= 0;
	this->super				= NULL;
	this->prev				= this;
	this->next				= this;
	}

ClassDef::ClassDef
	(
	const char *classname,
	const char *classID,
	const char *superclass,
	ResponseDef *responses, 
	void *( *newInstance )( void ),
	int classSize
	)

	{
	ClassDef *node;

	if ( classlist == NULL )
		{
		classlist = new ClassDef;
		}

	this->classname			= classname;
	this->classID				= classID;
	this->superclass			= superclass;
	this->responses			= responses;
	this->numEvents			= 0;
	this->responseLookup		= NULL;
	this->newInstance			= newInstance;
	this->classSize			= classSize;
	this->super					= getClass( superclass );

	// It's not uncommon for classes to not have a class id, so just set it 
	// to an empty string so that we're not checking for it all the time.
	if ( !classID )
		{
		this->classID = "";
		}

	// Check if any subclasses were initialized before their superclass
	for( node = classlist->next; node != classlist; node = node->next )
		{
		if ( ( node->super == NULL ) && ( !Q_stricmp( node->superclass, this->classname ) ) &&
			( Q_stricmp( node->classname, "Class" ) ) )
			{
			node->super	= this;
			}
		}

	// Add to front of list
	LL_Add( classlist, this, prev, next );
	}

ClassDef::~ClassDef()
	{
	ClassDef *node;

	if ( classlist != this )
		{
		LL_Remove( this, prev, next );

		// Check if any subclasses were initialized before their superclass
		for( node = classlist->next; node != classlist; node = node->next )
			{
			if ( node->super == this )
				{
				node->super	= NULL;
				}
			}
		}
	else
		{
		// If the head of the list is deleted before the list is cleared, then we may have problems
		assert( this->next == this->prev );
		}

	if ( responseLookup )
		{
		delete[] responseLookup;
		responseLookup = NULL;
		}
	}

EXPORT_FROM_DLL void ClassDef::BuildResponseList
	(
	void
	)

	{
	ClassDef		*c;
	ResponseDef *r;
	int			ev;
	int			i;
	qboolean		*set;
	int			num;

	if ( responseLookup )
		{
		delete[] responseLookup;
		responseLookup = NULL;
		}

	num = Event::NumEventCommands();
	responseLookup = ( Response ** )new char[ sizeof( Response * ) * num ];
	memset( responseLookup, 0, sizeof( Response * ) * num );

	set = new qboolean[ num ];
	memset( set, 0, sizeof( qboolean ) * num );

	this->numEvents = num;

	for( c = this; c != NULL; c = c->super )
		{
		r = c->responses;
		if ( r )
			{
			for( i = 0; r[ i ].event != NULL; i++ )
				{
				ev = ( int )*r[ i ].event;
				if ( !set[ ev ] )
					{
					set[ ev ] = true;
					if ( r[ i ].response )
						{
						responseLookup[ ev ] = &r[ i ].response;
						}
					else
						{
						responseLookup[ ev ] = NULL;
						}
					}
				}
			}
		}

	delete[] set;
	}

EXPORT_FROM_DLL void BuildEventResponses
	(
	void
	)

	{
	ClassDef *c;
	int amount;
	int numclasses;

	amount = 0;
	numclasses = 0;
	for( c = classlist->next; c != classlist; c = c->next )
		{
		c->BuildResponseList();

		amount += c->numEvents * sizeof( Response * );
		numclasses++;
		}

	gi.dprintf( "\n------------------\nEvent system initialized:\n"
		"%d classes\n%d events\n%d total memory in response list\n\n", 
		numclasses, Event::NumEventCommands(), amount );
	}

EXPORT_FROM_DLL ClassDef *getClassForID
	(
	const char *name
	)

	{
	ClassDef *c;

	for( c = classlist->next; c != classlist; c = c->next )
		{
		if ( c->classID && !Q_stricmp( c->classID, name ) )
			{
			return c;
			}
		}

	return NULL;
	}

EXPORT_FROM_DLL ClassDef *getClass
	(
	const char *name
	)

	{
	ClassDef *c;

	for( c = classlist->next; c != classlist; c = c->next )
		{
		if ( !Q_stricmp( c->classname, name ) )
			{
			return c;
			}
		}

	return NULL;
	}

EXPORT_FROM_DLL ClassDef *getClassList
	(
	void
	)

	{
	return classlist;
	}

EXPORT_FROM_DLL void listAllClasses
	(
	void
	)

	{
	ClassDef *c;

	for( c = classlist->next; c != classlist; c = c->next )
		{
		gi.dprintf( "%s\n", c->classname );
		}
	}

EXPORT_FROM_DLL void listInheritanceOrder
	(
	const char *classname
	)

	{
	ClassDef *cls;
	ClassDef *c;

	cls = getClass( classname );
	if ( !cls )
		{
		gi.dprintf( "Unknown class: %s\n", classname );
		return;
		}
	for( c = cls; c != NULL; c = c->super )
		{
		gi.dprintf( "%s\n", c->classname );
		}
	}

EXPORT_FROM_DLL qboolean checkInheritance
	(
	ClassDef *superclass,
	ClassDef *subclass
	)

	{
	ClassDef *c;

	for( c = subclass; c != NULL; c = c->super )
		{
		if ( c == superclass )
			{
			return true;
			}
		}
	return false;
	}

EXPORT_FROM_DLL qboolean checkInheritance
	(
	ClassDef *superclass,
	const char *subclass
	)

	{
	ClassDef *c;

	c = getClass( subclass );
	if ( c == NULL )
		{
		gi.dprintf( "Unknown class: %s\n", subclass );
		return false;
		}
	return checkInheritance( superclass, c );
	}

EXPORT_FROM_DLL qboolean checkInheritance
	(
	const char *superclass,
	const char *subclass
	)

	{
	ClassDef *c1;
	ClassDef *c2;

	c1 = getClass( superclass );
	c2 = getClass( subclass );
	if ( c1 == NULL )
		{
		gi.dprintf( "Unknown class: %s\n", superclass );
		return false;
		}
	if ( c2 == NULL )
		{
		gi.dprintf( "Unknown class: %s\n", subclass );
		return false;
		}
	return checkInheritance( c1, c2 );
	}
	
CLASS_DECLARATION( NULL, Class, NULL );

ResponseDef Class::Responses[] =
	{
		{ NULL, NULL }
	};

#ifdef NDEBUG

EXPORT_FROM_DLL void * Class::operator new( size_t s )
	{
	int *p;

	s += sizeof( int );
	p = ( int * )::new char[ s ];
	*p = s;
	totalmemallocated += s;
	numclassesallocated++;
	return p + 1;
	}

EXPORT_FROM_DLL void Class::operator delete( void *ptr )
	{
	int *p;

	p = ( ( int * )ptr ) - 1;
	totalmemallocated -= *p;
	numclassesallocated--;
	::delete[]( p );
	}

#else

EXPORT_FROM_DLL void * Class::operator new( size_t s )
	{
	int *p;

	s += sizeof( int ) * 3;
	p = ( int * )::new char[ s ];
	p[ 0 ] = 0x12348765;
	*( int * )( ((byte *)p) + s - sizeof( int ) ) = 0x56784321;
	p[ 1 ] = s;
	totalmemallocated += s;
	numclassesallocated++;
	return p + 2;
	}

EXPORT_FROM_DLL void Class::operator delete( void *ptr )
	{
	int *p;

	p = ( ( int * )ptr ) - 2;

	assert( p[ 0 ] == 0x12348765 );
	assert( *( int * )( ((byte *)p) + p[ 1 ] - sizeof( int ) ) == 0x56784321 );

	totalmemallocated -= p[ 1 ];
	numclassesallocated--;
	::delete[]( p );
	}

#endif

EXPORT_FROM_DLL void DisplayMemoryUsage
	(
   void
	)

	{
	gi.printf( "Classes %-5d Class memory used: %d\n", numclassesallocated, totalmemallocated );
   }
	Class::Class()
	{
	SafePtrList = NULL;
	}

Class::~Class()
	{
	while( SafePtrList != NULL )
		{
		SafePtrList->Clear();
		}
	}

EXPORT_FROM_DLL void Class::Archive
	(
	Archiver &arc
	)

	{
	}

EXPORT_FROM_DLL void Class::Unarchive
	(
	Archiver &arc
	)

	{
	}

EXPORT_FROM_DLL void Class::warning
	(
	const char *function,
	const char *fmt,
	...
	)

	{
	va_list	argptr;
	char		text[ 1024 ];

	va_start( argptr, fmt );
	vsprintf( text, fmt, argptr );
	va_end( argptr );

	if ( getClassID() )
		{
		gi.dprintf( "%s::%s : %s\n", getClassID(), function, text );
		}
	else
		{
		gi.dprintf( "%s::%s : %s\n", getClassname(), function, text );
		}
	}

EXPORT_FROM_DLL void Class::error
	(
	const char *function,
	const char *fmt,
	...
	)

	{
	va_list	argptr;
	char		text[ 1024 ];

	va_start( argptr, fmt );
	vsprintf( text, fmt, argptr );
	va_end( argptr );

	if ( getClassID() )
		{
		gi.error( "%s::%s : %s\n", getClassID(), function, text );
		}
	else
		{
		gi.error( "%s::%s : %s\n", getClassname(), function, text );
		}
	}

EXPORT_FROM_DLL qboolean Class::inheritsFrom
	(
	const char *name 
	)

	{
	ClassDef *c;

	c = getClass( name );
	if ( c == NULL )
		{
		gi.dprintf( "Unknown class: %s\n", name );
		return false;
		}
	return checkInheritance( c, classinfo() );
	}

EXPORT_FROM_DLL qboolean Class::isInheritedBy
	(
	const char *name 
	)

	{
	ClassDef *c;

	c = getClass( name );
	if ( c == NULL )
		{
		gi.dprintf( "Unknown class: %s\n", name );
		return false;
		}
	return checkInheritance( classinfo(), c );
	}

EXPORT_FROM_DLL const char *Class::getClassname
	( 
	void 
	)

	{
	ClassDef *cls;

	cls = classinfo();
	return cls->classname;
	}

EXPORT_FROM_DLL const char *Class::getClassID
	(
	void 
	)

	{
	ClassDef *cls;

	cls = classinfo();
	return cls->classID;
	}

EXPORT_FROM_DLL const char *Class::getSuperclass
	( 
	void 
	)

	{
	ClassDef *cls;

	cls = classinfo();
	return cls->superclass;
	}

EXPORT_FROM_DLL void *Class::newInstance
	( 
	void 
	)

	{
	ClassDef *cls;

	cls = classinfo();
	return cls->newInstance();
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜欧美大尺度福利影院在线看| 中文字幕中文字幕中文字幕亚洲无线| 国产不卡在线一区| 国产**成人网毛片九色| 成人免费av资源| 色激情天天射综合网| 欧美日韩另类国产亚洲欧美一级| 欧美三级中文字幕| 国产肉丝袜一区二区| 国产精品无人区| 亚洲一二三四在线| 美美哒免费高清在线观看视频一区二区 | 高清不卡一区二区在线| 91色porny在线视频| 日韩欧美www| 亚洲少妇30p| 国产精品2024| 4hu四虎永久在线影院成人| 亚洲国产成人一区二区三区| 午夜精品福利一区二区三区蜜桃| 国产一区二区看久久| 51精品秘密在线观看| 亚洲va欧美va人人爽| 99精品欧美一区二区三区小说| 日韩午夜激情电影| 日韩电影在线一区二区| 色视频成人在线观看免| 椎名由奈av一区二区三区| 国产在线精品视频| 精品国产电影一区二区| 免费在线观看视频一区| 欧美久久婷婷综合色| 午夜精品福利在线| 欧美久久久久免费| 亚洲综合久久久| 在线观看av一区| 午夜激情久久久| 日韩一区二区三区高清免费看看| 婷婷综合在线观看| 日韩一区二区视频| 国产成a人亚洲精品| 亚洲欧美一区二区三区极速播放 | 91麻豆精品国产91久久久久久久久| 伊人色综合久久天天| 在线亚洲高清视频| 麻豆中文一区二区| 国产欧美日韩亚州综合 | 日韩精品一区二区三区在线观看| 欧美aaa在线| 日本一区二区三区高清不卡| 日本伦理一区二区| 精品在线一区二区三区| 国产精品理论片在线观看| 欧美亚洲综合在线| 国产在线国偷精品免费看| 日本一区二区三区国色天香| 欧美视频第二页| 成人小视频在线| 日韩在线a电影| 亚洲免费毛片网站| 久久这里只有精品首页| 欧美三区在线观看| 99精品久久久久久| 国产麻豆成人传媒免费观看| 亚洲午夜羞羞片| 成人免费小视频| 久久久精品日韩欧美| 4438x亚洲最大成人网| 91丝袜美腿高跟国产极品老师| 天堂va蜜桃一区二区三区漫画版| 欧美国产精品专区| 精品久久久久香蕉网| 欧美日韩一区在线观看| 91国产精品成人| 一本大道av伊人久久综合| 懂色av一区二区三区蜜臀| 美女视频黄 久久| 久色婷婷小香蕉久久| 蜜桃久久av一区| 韩国视频一区二区| 激情成人综合网| 极品销魂美女一区二区三区| 久久国产夜色精品鲁鲁99| 久久不见久久见免费视频1| 麻豆91精品91久久久的内涵| 老司机精品视频线观看86| 老色鬼精品视频在线观看播放| 激情综合色丁香一区二区| 国内精品第一页| 成人黄色小视频在线观看| 粉嫩绯色av一区二区在线观看| 成人教育av在线| 精品视频一区 二区 三区| 日韩一区二区三区免费观看| 国产午夜精品久久久久久免费视| 日本一区二区在线不卡| 亚洲激情中文1区| 美日韩一区二区三区| av欧美精品.com| 欧美一级黄色录像| 国产精品久久久久影视| 亚洲一区在线视频| 激情小说欧美图片| 欧美在线小视频| 久久精品一区二区三区不卡| 国产福利精品一区二区| 欧美精品日韩一区| 国产日产欧美一区| 美女在线视频一区| 欧美这里有精品| 国产精品第13页| 国产精一区二区三区| 7799精品视频| 亚瑟在线精品视频| 色嗨嗨av一区二区三区| 国产精品美女久久久久av爽李琼| 日本欧美在线看| 欧美日本乱大交xxxxx| 亚洲欧美一区二区久久| 日韩欧美成人午夜| 琪琪一区二区三区| 这里是久久伊人| 午夜欧美一区二区三区在线播放| 在线视频综合导航| 亚洲国产日产av| 欧美性大战久久久| 亚洲小说欧美激情另类| 欧美三级韩国三级日本三斤| 亚洲乱码中文字幕综合| 99久久免费精品高清特色大片| 中文字幕一区二区三区四区| 成人污视频在线观看| 午夜不卡av在线| 亚洲精品在线免费观看视频| 国产一区二区在线观看免费| 精品国产凹凸成av人网站| 国产ts人妖一区二区| 综合分类小说区另类春色亚洲小说欧美| 91免费精品国自产拍在线不卡| 亚洲人成网站色在线观看| 欧美日韩国产综合一区二区 | 欧美又粗又大又爽| 久久精品99国产国产精| 亚洲自拍另类综合| 色综合久久综合网97色综合 | 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 一区二区三区四区亚洲| 欧美成人一区二区| 色综合久久天天| 精品一区二区三区在线播放| 亚洲婷婷在线视频| 日韩欧美国产午夜精品| 色综合天天狠狠| 精品无人区卡一卡二卡三乱码免费卡| 欧美经典三级视频一区二区三区| 欧美四级电影在线观看| 成人自拍视频在线| 久久99久久精品欧美| 亚洲一区二区三区爽爽爽爽爽 | 乱一区二区av| 伊人婷婷欧美激情| 一区在线中文字幕| 国产精品欧美一区喷水| 日韩欧美精品在线视频| 欧美三电影在线| 91美女视频网站| 欧洲视频一区二区| 欧美日韩日日摸| 欧美美女视频在线观看| 欧美色视频在线观看| 欧美天堂一区二区三区| 精品视频999| 91麻豆精品国产91久久久久久久久| 欧美色图第一页| 欧美一区二区二区| 日韩午夜三级在线| 日韩女优制服丝袜电影| 亚洲精品一线二线三线| 国产三级精品在线| 亚洲人成精品久久久久久| 一区二区三区产品免费精品久久75| 亚洲黄色在线视频| 九色综合国产一区二区三区| 国产美女视频91| 91麻豆国产福利在线观看| 91精彩视频在线| 日韩欧美成人一区| 中文字幕欧美三区| 亚洲成人动漫一区| 美女一区二区在线观看| 成人动漫视频在线| 51精品久久久久久久蜜臀| 亚洲国产精品v| 日本 国产 欧美色综合| www.66久久| 欧美午夜片在线观看| 国产亚洲婷婷免费| 亚洲成人你懂的| 成人一二三区视频| 欧美一区二区三区免费在线看|