File: uobject.cpp

package info (click to toggle)
gcvs 1.0final-12
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 12,248 kB
  • ctags: 10,631
  • sloc: ansic: 71,709; cpp: 39,780; sh: 18,434; makefile: 1,915; yacc: 1,299; tcl: 1,283; perl: 910; lex: 249; csh: 185; lisp: 7
file content (127 lines) | stat: -rwxr-xr-x 2,912 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
** 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 1, 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

/*
 * Author : Alexandre Parenteau <aubonbeurre@hotmail.com> --- May 1999
 */

#include "stdafx.h"

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <string.h>

#include "uobject.h"

URuntimeClass *URuntimeClass::sAllURuntimeClass = 0L;

const URuntimeClass* UObject::_GetBaseClass()
	{ return 0L; }
const URuntimeClass UObject::classUObject(
	"UObject", sizeof(UObject), 0L, &UObject::_GetBaseClass);
const URuntimeClass *UObject::rtUObject()
	{ return &UObject::classUObject; }

UObject* UObject::CreateObject(const char *className)
{
	URuntimeClass *next = URuntimeClass::sAllURuntimeClass;
	while(next != 0L)
	{
		if(strcmp(next->m_lpszClassName, className) == 0)
			return next->CreateObject();
		
		next = next->m_pNextClass;
	}
	return 0L;
}

const URuntimeClass* UObject::GetRuntimeClass() const
{
	return URUNTIME_CLASS(UObject);
}

bool UObject::IsKindOf(const URuntimeClass* pClass) const
{
	// simple SI case
	const URuntimeClass* pClassThis = GetRuntimeClass();
	return pClassThis->IsDerivedFrom(pClass);
}

URuntimeClass::URuntimeClass(const char *lpszClassName, int nObjectSize,
		UObject* (*pfnCreateObject)(), const URuntimeClass* (*pfnGetBaseClass)())
{
	m_lpszClassName = lpszClassName;
	m_nObjectSize = nObjectSize;
	m_pfnCreateObject = pfnCreateObject;
	m_pfnGetBaseClass = pfnGetBaseClass;
	m_pNextClass = sAllURuntimeClass;
	
	sAllURuntimeClass = this;
}

URuntimeClass::~URuntimeClass()
{
	URuntimeClass *next = sAllURuntimeClass;
	URuntimeClass *prev = 0L;
	while(next != 0L)
	{
		if(next == this)
		{
			if(prev == 0L)
				sAllURuntimeClass = m_pNextClass;
			else
				prev->m_pNextClass = m_pNextClass;
			break;
		}
		
		prev = next;
		next = next->m_pNextClass;
	}
}

UObject* URuntimeClass::CreateObject()
{
	if (m_pfnCreateObject == 0L)
	{
		return 0L;
	}

	UObject* pObject = 0L;
	try
	{
		pObject = (*m_pfnCreateObject)();
	}
	catch(...)
	{
	}

	return pObject;
}

bool URuntimeClass::IsDerivedFrom(const URuntimeClass* pBaseClass) const
{
	// simple SI case
	const URuntimeClass* pClassThis = this;
	while (pClassThis != 0L)
	{
		if (pClassThis == pBaseClass)
			return true;
		pClassThis = (*pClassThis->m_pfnGetBaseClass)();
	}
	return false;       // walked to the top, no match
}