| 
									
										
										
										
											2011-02-25 13:31:23 +00:00
										 |  |  | /** \file gameengine/Expressions/Value.cpp
 | 
					
						
							|  |  |  |  *  \ingroup expressions | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | // Value.cpp: implementation of the CValue class.
 | 
					
						
							|  |  |  | // developed at Eindhoven University of Technology, 1997
 | 
					
						
							|  |  |  | // by the OOPS team
 | 
					
						
							|  |  |  | //////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Permission to use, copy, modify, distribute and sell this software | 
					
						
							|  |  |  |  * and its documentation for any purpose is hereby granted without fee, | 
					
						
							|  |  |  |  * provided that the above copyright notice appear in all copies and | 
					
						
							|  |  |  |  * that both that copyright notice and this permission notice appear | 
					
						
							|  |  |  |  * in supporting documentation.  Erwin Coumans makes no | 
					
						
							|  |  |  |  * representations about the suitability of this software for any | 
					
						
							|  |  |  |  * purpose.  It is provided "as is" without express or implied warranty. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #include "Value.h"
 | 
					
						
							|  |  |  | #include "FloatValue.h"
 | 
					
						
							|  |  |  | #include "IntValue.h"
 | 
					
						
							|  |  |  | #include "VectorValue.h"
 | 
					
						
							|  |  |  | #include "VoidValue.h"
 | 
					
						
							|  |  |  | #include "StringValue.h"
 | 
					
						
							|  |  |  | #include "ErrorValue.h"
 | 
					
						
							|  |  |  | #include "ListValue.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Construction/Destruction
 | 
					
						
							|  |  |  | //////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | double CValue::m_sZeroVec[3] = {0.0,0.0,0.0}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-31 04:11:39 +00:00
										 |  |  | #ifdef WITH_PYTHON
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | PyTypeObject CValue::Type = { | 
					
						
							| 
									
										
										
										
											2009-04-29 16:54:45 +00:00
										 |  |  | 	PyVarObject_HEAD_INIT(NULL, 0) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	"CValue", | 
					
						
							| 
									
										
										
										
											2009-04-19 14:57:52 +00:00
										 |  |  | 	sizeof(PyObjectPlus_Proxy), | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-04-19 14:57:52 +00:00
										 |  |  | 	py_base_dealloc, | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 	0, | 
					
						
							|  |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-04-19 06:48:27 +00:00
										 |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 	py_base_repr, | 
					
						
							| 
									
										
										
										
											2009-04-19 06:48:27 +00:00
										 |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-04-03 14:51:06 +00:00
										 |  |  | 	0,0,0,0,0, | 
					
						
							| 
									
										
										
										
											2009-06-29 12:06:46 +00:00
										 |  |  | 	NULL, | 
					
						
							|  |  |  | 	NULL, | 
					
						
							| 
									
										
										
										
											2009-06-28 11:22:26 +00:00
										 |  |  | 	0, | 
					
						
							|  |  |  | 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, | 
					
						
							|  |  |  | 	0,0,0,0,0,0,0, | 
					
						
							|  |  |  | 	Methods, | 
					
						
							|  |  |  | 	0, | 
					
						
							|  |  |  | 	0, | 
					
						
							| 
									
										
										
										
											2009-06-29 12:06:46 +00:00
										 |  |  | 	&PyObjectPlus::Type, | 
					
						
							|  |  |  | 	0,0,0,0,0,0, | 
					
						
							|  |  |  | 	py_base_new | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyMethodDef CValue::Methods[] = { | 
					
						
							|  |  |  | 	{NULL,NULL} //Sentinel
 | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2010-10-31 04:11:39 +00:00
										 |  |  | #endif // WITH_PYTHON
 | 
					
						
							| 
									
										
										
										
											2009-09-29 21:42:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | /*#define CVALUE_DEBUG*/ | 
					
						
							|  |  |  | #ifdef CVALUE_DEBUG
 | 
					
						
							|  |  |  | int gRefCount; | 
					
						
							|  |  |  | struct SmartCValueRef  | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CValue *m_ref; | 
					
						
							|  |  |  | 	int m_count; | 
					
						
							|  |  |  | 	SmartCValueRef(CValue *ref) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		m_ref = ref; | 
					
						
							|  |  |  | 		m_count = gRefCount++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | #include <vector>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | std::vector<SmartCValueRef> gRefList; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _DEBUG
 | 
					
						
							|  |  |  | //int gRefCountValue;
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-28 11:22:26 +00:00
										 |  |  | CValue::CValue() | 
					
						
							|  |  |  | 		: PyObjectPlus(), | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2004-04-24 06:40:15 +00:00
										 |  |  | m_pNamedPropertyArray(NULL), | 
					
						
							|  |  |  | m_refcount(1) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  | pre: false | 
					
						
							|  |  |  | effect: constucts a CValue | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	//debug(gRefCountValue++)	// debugging
 | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | #ifdef _DEBUG
 | 
					
						
							|  |  |  | 	//gRefCountValue++;
 | 
					
						
							|  |  |  | #ifdef CVALUE_DEBUG
 | 
					
						
							|  |  |  | 	gRefList.push_back(SmartCValueRef(this)); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | CValue::~CValue() | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | pre: | 
					
						
							|  |  |  | effect: deletes the object | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	ClearProperties(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	assertd (m_refcount==0); | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | #ifdef CVALUE_DEBUG
 | 
					
						
							|  |  |  | 	std::vector<SmartCValueRef>::iterator it; | 
					
						
							|  |  |  | 	for (it=gRefList.begin(); it!=gRefList.end(); it++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (it->m_ref == this) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			*it = gRefList.back(); | 
					
						
							|  |  |  | 			gRefList.pop_back(); | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define VALUE_SUB(val1, val2) (val1)->Calc(VALUE_SUB_OPERATOR, val2)
 | 
					
						
							|  |  |  | #define VALUE_MUL(val1, val2) (val1)->Calc(VALUE_MUL_OPERATOR, val2)
 | 
					
						
							|  |  |  | #define VALUE_DIV(val1, val2) (val1)->Calc(VALUE_DIV_OPERATOR, val2)
 | 
					
						
							|  |  |  | #define VALUE_NEG(val1)       (val1)->Calc(VALUE_NEG_OPERATOR, val1)
 | 
					
						
							|  |  |  | #define VALUE_POS(val1)       (val1)->Calc(VALUE_POS_OPERATOR, val1)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STR_String CValue::op2str (VALUE_OPERATOR op) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	//pre:
 | 
					
						
							|  |  |  | 	//ret: the stringrepresentation of operator op
 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	STR_String opmsg; | 
					
						
							|  |  |  | 	switch (op) { | 
					
						
							| 
									
										
										
										
											2009-03-11 22:11:52 +00:00
										 |  |  | 	case VALUE_MOD_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " % "; | 
					
						
							|  |  |  | 		break; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	case VALUE_ADD_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " + "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_SUB_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " - "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_MUL_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " * "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_DIV_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " / "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_NEG_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " -"; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_POS_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " +"; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_AND_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " & "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_OR_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " | "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_EQL_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " = "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_NEQ_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " != "; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case VALUE_NOT_OPERATOR: | 
					
						
							|  |  |  | 		opmsg = " !"; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		opmsg="Error in Errorhandling routine."; | 
					
						
							|  |  |  | 		//		AfxMessageBox("Invalid operator");
 | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return opmsg; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //---------------------------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | //	Property Management
 | 
					
						
							|  |  |  | //---------------------------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Set property <ioProperty>, overwrites and releases a previous property with the same name if needed
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | void CValue::SetProperty(const STR_String & name,CValue* ioProperty) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (ioProperty==NULL) | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	{	// Check if somebody is setting an empty property
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		trace("Warning:trying to set empty property!"); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 	{	// Try to replace property (if so -> exit as soon as we replaced it)
 | 
					
						
							|  |  |  | 		CValue* oldval = (*m_pNamedPropertyArray)[name]; | 
					
						
							|  |  |  | 		if (oldval) | 
					
						
							|  |  |  | 			oldval->Release(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { // Make sure we have a property array
 | 
					
						
							| 
									
										
										
										
											2003-12-01 15:01:20 +00:00
										 |  |  | 		m_pNamedPropertyArray = new std::map<STR_String,CValue *>; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	// Add property at end of array
 | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | 	(*m_pNamedPropertyArray)[name] = ioProperty->AddRef();//->Add(ioProperty);
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | void CValue::SetProperty(const char* name,CValue* ioProperty) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (ioProperty==NULL) | 
					
						
							|  |  |  | 	{	// Check if somebody is setting an empty property
 | 
					
						
							|  |  |  | 		trace("Warning:trying to set empty property!"); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 	{	// Try to replace property (if so -> exit as soon as we replaced it)
 | 
					
						
							|  |  |  | 		CValue* oldval = (*m_pNamedPropertyArray)[name]; | 
					
						
							|  |  |  | 		if (oldval) | 
					
						
							|  |  |  | 			oldval->Release(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { // Make sure we have a property array
 | 
					
						
							|  |  |  | 		m_pNamedPropertyArray = new std::map<STR_String,CValue *>; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	// Add property at end of array
 | 
					
						
							|  |  |  | 	(*m_pNamedPropertyArray)[name] = ioProperty->AddRef();//->Add(ioProperty);
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Get pointer to a property with name <inName>, returns NULL if there is no property named <inName>
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | CValue* CValue::GetProperty(const STR_String & inName) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	if (m_pNamedPropertyArray) { | 
					
						
							|  |  |  | 		std::map<STR_String,CValue*>::iterator it = m_pNamedPropertyArray->find(inName); | 
					
						
							|  |  |  | 		if (it != m_pNamedPropertyArray->end()) | 
					
						
							|  |  |  | 			return (*it).second; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	return NULL; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | CValue* CValue::GetProperty(const char *inName) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (m_pNamedPropertyArray) { | 
					
						
							|  |  |  | 		std::map<STR_String,CValue*>::iterator it = m_pNamedPropertyArray->find(inName); | 
					
						
							|  |  |  | 		if (it != m_pNamedPropertyArray->end()) | 
					
						
							|  |  |  | 			return (*it).second; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Get text description of property with name <inName>, returns an empty string if there is no property named <inName>
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2009-05-26 10:44:14 +00:00
										 |  |  | const STR_String& CValue::GetPropertyText(const STR_String & inName) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-05-10 20:53:58 +00:00
										 |  |  | 	const static STR_String sEmpty(""); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	CValue *property = GetProperty(inName); | 
					
						
							|  |  |  | 	if (property) | 
					
						
							|  |  |  | 		return property->GetText(); | 
					
						
							|  |  |  | 	else | 
					
						
							| 
									
										
										
										
											2009-05-10 20:53:58 +00:00
										 |  |  | 		return sEmpty; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | float CValue::GetPropertyNumber(const STR_String& inName,float defnumber) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	CValue *property = GetProperty(inName); | 
					
						
							|  |  |  | 	if (property) | 
					
						
							| 
									
										
										
										
											2009-04-12 06:41:01 +00:00
										 |  |  | 		return property->GetNumber();  | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	else | 
					
						
							|  |  |  | 		return defnumber; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Remove the property named <inName>, returns true if the property was succesfully removed, false if property was not found or could not be removed
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | bool CValue::RemoveProperty(const char *inName) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	// Check if there are properties at all which can be removed
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		std::map<STR_String,CValue*>::iterator it = m_pNamedPropertyArray->find(inName); | 
					
						
							|  |  |  | 		if (it != m_pNamedPropertyArray->end()) | 
					
						
							| 
									
										
										
										
											2008-09-03 06:43:07 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 			((*it).second)->Release(); | 
					
						
							|  |  |  | 			m_pNamedPropertyArray->erase(it); | 
					
						
							| 
									
										
										
										
											2008-09-03 06:43:07 +00:00
										 |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-09-03 06:43:07 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-12 10:21:37 +00:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Get Property Names
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | vector<STR_String> CValue::GetPropertyNames() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	vector<STR_String> result; | 
					
						
							|  |  |  | 	if(!m_pNamedPropertyArray) return result; | 
					
						
							| 
									
										
										
										
											2009-04-09 09:50:17 +00:00
										 |  |  | 	result.reserve(m_pNamedPropertyArray->size()); | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 	for (it= m_pNamedPropertyArray->begin(); (it != m_pNamedPropertyArray->end()); it++) | 
					
						
							| 
									
										
										
										
											2008-07-12 10:21:37 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		result.push_back((*it).first); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Clear all properties
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | void CValue::ClearProperties() | 
					
						
							|  |  |  | {		 | 
					
						
							|  |  |  | 	// Check if we have any properties
 | 
					
						
							|  |  |  | 	if (m_pNamedPropertyArray == NULL) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Remove all properties
 | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 	for (it= m_pNamedPropertyArray->begin();(it != m_pNamedPropertyArray->end()); it++) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		CValue* tmpval = (*it).second; | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | 		//STR_String name = (*it).first;
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		tmpval->Release(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Delete property array
 | 
					
						
							|  |  |  | 	delete m_pNamedPropertyArray; | 
					
						
							|  |  |  | 	m_pNamedPropertyArray=NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Set all properties' modified flag to <inModified>
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | void CValue::SetPropertiesModified(bool inModified) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	if(!m_pNamedPropertyArray) return; | 
					
						
							|  |  |  | 	std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	for (it= m_pNamedPropertyArray->begin();(it != m_pNamedPropertyArray->end()); it++) | 
					
						
							|  |  |  | 		((*it).second)->SetModified(inModified); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Check if any of the properties in this value have been modified
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | bool CValue::IsAnyPropertyModified() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	if(!m_pNamedPropertyArray) return false; | 
					
						
							|  |  |  | 	std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	for (it= m_pNamedPropertyArray->begin();(it != m_pNamedPropertyArray->end()); it++) | 
					
						
							|  |  |  | 		if (((*it).second)->IsModified()) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 			return true; | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Get property number <inIndex>
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | CValue* CValue::GetProperty(int inIndex) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int count=0; | 
					
						
							|  |  |  | 	CValue* result = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 		std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 		for (it= m_pNamedPropertyArray->begin(); (it != m_pNamedPropertyArray->end()); it++) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			if (count++==inIndex) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				result = (*it).second; | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Get the amount of properties assiocated with this value
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | int CValue::GetPropertyCount() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 		return m_pNamedPropertyArray->size(); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | double*		CValue::GetVector3(bool bGetTransformedVec) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	assertd(false); // don;t get vector from me
 | 
					
						
							|  |  |  | 	return m_sZeroVec;//::sZero;
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*---------------------------------------------------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 	Reference Counting | 
					
						
							|  |  |  | ---------------------------------------------------------------------------------------------------------------------*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Release a reference to this value (when reference count reaches 0, the value is removed from the heap)
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Disable reference counting for this value
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | void CValue::DisableRefCount() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	assertd(m_refcount == 1); | 
					
						
							|  |  |  | 	m_refcount--; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//debug(gRefCountValue--);
 | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | #ifdef _DEBUG
 | 
					
						
							|  |  |  | 	//gRefCountValue--;
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	m_ValFlags.RefCountDisabled=true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-22 14:42:00 +00:00
										 |  |  | void CValue::ProcessReplica() /* was AddDataToReplica in 2.48 */ | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-04-22 14:42:00 +00:00
										 |  |  | 	m_refcount = 1; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | #ifdef _DEBUG
 | 
					
						
							|  |  |  | 	//gRefCountValue++;
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-04-22 14:42:00 +00:00
										 |  |  | 	PyObjectPlus::ProcessReplica(); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-22 14:42:00 +00:00
										 |  |  | 	m_ValFlags.RefCountDisabled = false; | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-22 14:42:00 +00:00
										 |  |  | 	/* copy all props */ | 
					
						
							|  |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		std::map<STR_String,CValue*> *pOldArray = m_pNamedPropertyArray; | 
					
						
							|  |  |  | 		m_pNamedPropertyArray=NULL; | 
					
						
							|  |  |  | 		std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 		for (it= pOldArray->begin(); (it != pOldArray->end()); it++) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			CValue *val = (*it).second->GetReplica(); | 
					
						
							|  |  |  | 			SetProperty((*it).first,val); | 
					
						
							|  |  |  | 			val->Release(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | CValue*	CValue::FindIdentifier(const STR_String& identifiername) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CValue* result = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int pos = 0; | 
					
						
							|  |  |  | 	// if a dot exists, explode the name into pieces to get the subcontext
 | 
					
						
							|  |  |  | 	if ((pos=identifiername.Find('.'))>=0) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		const STR_String rightstring = identifiername.Right(identifiername.Length() -1 - pos); | 
					
						
							|  |  |  | 		const STR_String leftstring = identifiername.Left(pos); | 
					
						
							|  |  |  | 		CValue* tempresult = GetProperty(leftstring); | 
					
						
							|  |  |  | 		if (tempresult) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			result=tempresult->FindIdentifier(rightstring); | 
					
						
							|  |  |  | 		}  | 
					
						
							|  |  |  | 	} else | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		result = GetProperty(identifiername); | 
					
						
							| 
									
										
										
										
											2008-03-01 19:46:50 +00:00
										 |  |  | 		if (result) | 
					
						
							|  |  |  | 			return result->AddRef(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (!result) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// warning here !!!
 | 
					
						
							|  |  |  | 		result = new CErrorValue(identifiername+" not found"); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-31 04:11:39 +00:00
										 |  |  | #ifdef WITH_PYTHON
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-26 09:04:06 +00:00
										 |  |  | PyAttributeDef CValue::Attributes[] = { | 
					
						
							| 
									
										
										
										
											2009-05-17 16:30:18 +00:00
										 |  |  | 	KX_PYATTRIBUTE_RO_FUNCTION("name",	CValue, pyattr_get_name), | 
					
						
							| 
									
										
										
										
											2009-02-26 09:04:06 +00:00
										 |  |  | 	{ NULL }	//Sentinel
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-17 16:30:18 +00:00
										 |  |  | PyObject * CValue::pyattr_get_name(void * self_v, const KX_PYATTRIBUTE_DEF * attrdef) { | 
					
						
							|  |  |  | 	CValue * self = static_cast<CValue *> (self_v); | 
					
						
							| 
									
										
										
										
											2009-06-29 02:25:54 +00:00
										 |  |  | 	return PyUnicode_FromString(self->GetName()); | 
					
						
							| 
									
										
										
										
											2009-05-17 16:30:18 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-23 00:32:33 +00:00
										 |  |  | CValue* CValue::ConvertPythonToValue(PyObject* pyobj, const char *error_prefix) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CValue* vallie = NULL; | 
					
						
							| 
									
										
										
										
											2009-04-12 14:22:51 +00:00
										 |  |  | 	/* refcounting is broking here! - this crashes anyway, just store a python list for KX_GameObject */ | 
					
						
							|  |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											2008-08-12 12:32:54 +00:00
										 |  |  | 	if (PyList_Check(pyobj)) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		CListValue* listval = new CListValue(); | 
					
						
							|  |  |  | 		bool error = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-06 23:46:20 +00:00
										 |  |  | 		Py_ssize_t i; | 
					
						
							|  |  |  | 		Py_ssize_t numitems = PyList_GET_SIZE(pyobj); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 		for (i=0;i<numitems;i++) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2004-05-21 09:18:42 +00:00
										 |  |  | 			PyObject* listitem = PyList_GetItem(pyobj,i); /* borrowed ref */ | 
					
						
							| 
									
										
										
										
											2009-04-23 00:32:33 +00:00
										 |  |  | 			CValue* listitemval = ConvertPythonToValue(listitem, error_prefix); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 			if (listitemval) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				listval->Add(listitemval); | 
					
						
							|  |  |  | 			} else | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				error = true; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (!error) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			// jippie! could be converted
 | 
					
						
							|  |  |  | 			vallie = listval; | 
					
						
							|  |  |  | 		} else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			// list could not be converted... bad luck
 | 
					
						
							|  |  |  | 			listval->Release(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} else | 
					
						
							| 
									
										
										
										
											2009-04-12 14:22:51 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-08-12 12:32:54 +00:00
										 |  |  | 	if (PyFloat_Check(pyobj)) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2008-08-12 12:32:54 +00:00
										 |  |  | 		vallie = new CFloatValue( (float)PyFloat_AsDouble(pyobj) ); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} else | 
					
						
							| 
									
										
										
										
											2009-04-12 06:41:01 +00:00
										 |  |  | 	if (PyLong_Check(pyobj)) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		vallie = new CIntValue( (cInt)PyLong_AsLongLong(pyobj) ); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} else | 
					
						
							| 
									
										
										
										
											2009-06-29 02:25:54 +00:00
										 |  |  | 	if (PyUnicode_Check(pyobj)) | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-06-29 02:25:54 +00:00
										 |  |  | 		vallie = new CStringValue(_PyUnicode_AsString(pyobj),""); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} else | 
					
						
							| 
									
										
										
										
											2009-06-29 12:06:46 +00:00
										 |  |  | 	if (PyObject_TypeCheck(pyobj, &CValue::Type)) /* Note, dont let these get assigned to GameObject props, must check elsewhere */ | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-06-29 12:06:46 +00:00
										 |  |  | 		vallie = (static_cast<CValue *>(BGE_PROXY_REF(pyobj)))->AddRef(); | 
					
						
							| 
									
										
										
										
											2008-08-12 12:32:54 +00:00
										 |  |  | 	} else | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		/* return an error value from the caller */ | 
					
						
							| 
									
										
										
										
											2009-04-23 00:32:33 +00:00
										 |  |  | 		PyErr_Format(PyExc_TypeError, "%scould convert python value to a game engine property", error_prefix); | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return vallie; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2004-11-22 10:19:19 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 12:39:06 +00:00
										 |  |  | PyObject*	CValue::ConvertKeysToPython( void ) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	PyObject *pylist = PyList_New( 0 ); | 
					
						
							|  |  |  | 	PyObject *pystr; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (m_pNamedPropertyArray) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2009-04-02 05:38:05 +00:00
										 |  |  | 		std::map<STR_String,CValue*>::iterator it; | 
					
						
							|  |  |  | 		for (it= m_pNamedPropertyArray->begin(); (it != m_pNamedPropertyArray->end()); it++) | 
					
						
							| 
									
										
										
										
											2008-06-26 12:39:06 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2009-06-29 02:25:54 +00:00
										 |  |  | 			pystr = PyUnicode_FromString( (*it).first ); | 
					
						
							| 
									
										
										
										
											2008-06-26 12:39:06 +00:00
										 |  |  | 			PyList_Append(pylist, pystr); | 
					
						
							|  |  |  | 			Py_DECREF( pystr ); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return pylist; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-31 04:11:39 +00:00
										 |  |  | #endif // WITH_PYTHON
 | 
					
						
							| 
									
										
										
										
											2009-09-29 21:42:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-10-12 11:37:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | /* These implementations were moved out of the header */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CValue::SetOwnerExpression(class CExpression* expr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* intentionally empty */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CValue::SetColorOperator(VALUE_OPERATOR op) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/* intentionally empty */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | void CValue::SetValue(CValue* newval) | 
					
						
							|  |  |  | {  | 
					
						
							|  |  |  | 	// no one should get here
 | 
					
						
							|  |  |  | 	assertd(newval->GetNumber() == 10121969);	 | 
					
						
							|  |  |  | } |