Blender V2.61 - r43446
|
00001 00005 // BoolValue.cpp: implementation of the CBoolValue class. 00006 /* 00007 * Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org> 00008 * 00009 * Permission to use, copy, modify, distribute and sell this software 00010 * and its documentation for any purpose is hereby granted without fee, 00011 * provided that the above copyright notice appear in all copies and 00012 * that both that copyright notice and this permission notice appear 00013 * in supporting documentation. Erwin Coumans makes no 00014 * representations about the suitability of this software for any 00015 * purpose. It is provided "as is" without express or implied warranty. 00016 * 00017 */ 00018 00019 #include "BoolValue.h" 00020 #include "StringValue.h" 00021 #include "ErrorValue.h" 00022 #include "VoidValue.h" 00023 00025 // Construction/Destruction 00027 00028 const STR_String CBoolValue::sTrueString = "TRUE"; 00029 const STR_String CBoolValue::sFalseString = "FALSE"; 00030 00031 CBoolValue::CBoolValue() 00032 /* 00033 pre: false 00034 effect: constructs a new CBoolValue 00035 */ 00036 { 00037 trace("Bool constructor error"); 00038 } 00039 00040 00041 00042 CBoolValue::CBoolValue(bool inBool) 00043 : m_bool(inBool) 00044 { 00045 } // Constructs a new CBoolValue containing <inBool> 00046 00047 00048 00049 CBoolValue::CBoolValue(bool innie,const char *name,AllocationTYPE alloctype) 00050 { 00051 m_bool = innie; 00052 SetName(name); 00053 00054 if (alloctype == CValue::STACKVALUE) 00055 CValue::DisableRefCount(); 00056 } 00057 00058 00059 00060 void CBoolValue::SetValue(CValue* newval) 00061 { 00062 m_bool = (newval->GetNumber() != 0); 00063 SetModified(true); 00064 } 00065 00066 00067 00068 CValue* CBoolValue::Calc(VALUE_OPERATOR op, CValue *val) 00069 /* 00070 pre: 00071 ret: a new object containing the result of applying operator op to this 00072 object and val 00073 */ 00074 { 00075 switch (op) 00076 { 00077 case VALUE_POS_OPERATOR: 00078 case VALUE_NEG_OPERATOR: 00079 { 00080 return new CErrorValue (op2str(op) + GetText()); 00081 break; 00082 } 00083 case VALUE_NOT_OPERATOR: 00084 { 00085 return new CBoolValue (!m_bool); 00086 break; 00087 } 00088 default: 00089 { 00090 return val->CalcFinal(VALUE_BOOL_TYPE, op, this); 00091 break; 00092 } 00093 } 00094 } 00095 00096 00097 00098 CValue* CBoolValue::CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val) 00099 /* 00100 pre: the type of val is dtype 00101 ret: a new object containing the result of applying operator op to val and 00102 this object 00103 */ 00104 { 00105 CValue *ret; 00106 00107 switch(dtype) 00108 { 00109 case VALUE_EMPTY_TYPE: 00110 case VALUE_BOOL_TYPE: 00111 { 00112 switch(op) 00113 { 00114 case VALUE_AND_OPERATOR: 00115 { 00116 ret = new CBoolValue (((CBoolValue *) val)->GetBool() && m_bool); 00117 break; 00118 } 00119 case VALUE_OR_OPERATOR: 00120 { 00121 ret = new CBoolValue (((CBoolValue *) val)->GetBool() || m_bool); 00122 break; 00123 } 00124 case VALUE_EQL_OPERATOR: 00125 { 00126 ret = new CBoolValue (((CBoolValue *) val)->GetBool() == m_bool); 00127 break; 00128 } 00129 case VALUE_NEQ_OPERATOR: 00130 { 00131 ret = new CBoolValue (((CBoolValue *) val)->GetBool() != m_bool); 00132 break; 00133 } 00134 case VALUE_NOT_OPERATOR: 00135 { 00136 return new CBoolValue (!m_bool); 00137 break; 00138 } 00139 default: 00140 { 00141 ret = new CErrorValue(val->GetText() + op2str(op) + 00142 "[operator not allowed on booleans]"); 00143 break; 00144 } 00145 } 00146 break; 00147 } 00148 case VALUE_STRING_TYPE: 00149 { 00150 switch(op) 00151 { 00152 case VALUE_ADD_OPERATOR: 00153 { 00154 ret = new CStringValue(val->GetText() + GetText(),""); 00155 break; 00156 } 00157 default: 00158 { 00159 ret = new CErrorValue(val->GetText() + op2str(op) + "[Only + allowed on boolean and string]"); 00160 break; 00161 } 00162 } 00163 break; 00164 } 00165 default: 00166 ret = new CErrorValue("[type mismatch]" + op2str(op) + GetText()); 00167 } 00168 00169 return ret; 00170 } 00171 00172 00173 00174 bool CBoolValue::GetBool() 00175 /* 00176 pre: 00177 ret: the bool stored in the object 00178 */ 00179 { 00180 return m_bool; 00181 } 00182 00183 00184 00185 double CBoolValue::GetNumber() 00186 { 00187 return (double)m_bool; 00188 } 00189 00190 00191 00192 const STR_String& CBoolValue::GetText() 00193 { 00194 return m_bool ? sTrueString : sFalseString; 00195 } 00196 00197 00198 00199 CValue* CBoolValue::GetReplica() 00200 { 00201 CBoolValue* replica = new CBoolValue(*this); 00202 replica->ProcessReplica(); 00203 00204 return replica; 00205 } 00206 00207 #ifdef WITH_PYTHON 00208 PyObject* CBoolValue::ConvertValueToPython() 00209 { 00210 return PyBool_FromLong(m_bool != 0); 00211 } 00212 #endif // WITH_PYTHON