/// /// Primitive Comparing Method bool Variant::Less(const Variant & rhs) const { if (this->IsNumber() && rhs.IsNumber()) { return ((this->GetFloat()) < (rhs.GetFloat())); } else if (this->IsString() && rhs.IsString()) { //If both are strings, compare them //Get copies of the strings. std::string str1 = this->GetString(); std::string str2 = rhs.GetString(); return str1 < str2; } else if (this->IsFunction() && rhs.IsFunction()) { //Get copies of the strings. std::string str1 = this->GetFunctionName(); std::string str2 = rhs.GetFunctionName(); return (str1 < str2); } //This should be handled more elegantly. return false; }
/// Primitive Compare Method /// bool Variant::Equal(const Variant & rhs) const { //std::cout << "variant equal: "<< *this << "==" << rhs << endl; //If they are both integers, make equality be exact. //If one is a float, make equality be with some tolerance. if(this->IsInteger() && rhs.IsInteger()) { return (this->GetInteger() == rhs.GetInteger()); } else if (this->IsNumber() && rhs.IsNumber()) { return (fabs(this->GetFloat() - rhs.GetFloat()) < .00000000001); } else if (this->IsString() && rhs.IsString()) { //If both are strings, compare them //Get copies of the strings. std::string str1 = this->GetString(); std::string str2 = rhs.GetString(); //strcmp returns 0 if they are identical, a number otherwise bool b = (str1 == str2); return b; } else if (this->IsStackSignal() && rhs.IsStackSignal()) { return (this->GetSignal() == rhs.GetSignal()); } return false; }
///This overloads the + operator for Variants. ///for strings, this concatenates them. Variant Variant::operator +(const Variant & rhs) const { pInt i; pDouble f; if(this->IsInteger() && rhs.IsInteger()) { i = this->GetInteger() + rhs.GetInteger(); return Variant(i); } else if (this->IsNumber() && rhs.IsNumber()) { f = this->GetFloat() + rhs.GetFloat(); return Variant(f); } else if (this->IsString() || rhs.IsString()) { std::string tmp1, tmp2; tmp1 = GetString(); tmp2 = rhs.GetString(); tmp1 += tmp2; return Variant(tmp1); } else //There should be an error emmitted here i=0; return Variant(i); }
/// /// Assignment Operator (overloaded) Variant Variant::operator = (const Variant & value) { //First, clean up 'this' if it contains data on free store // (e.g., a Variable or a string) free_mData(); mDataType=value.GetDataType(); switch(mDataType) { case P_DATA_NUMBER_INTEGER: // an integer mData.iNumber = value.GetInteger(); break; case P_DATA_NUMBER_FLOAT: // a float mData.fNumber = value.GetFloat(); break; case P_DATA_STRING: mData.String = strdup(value.GetString().c_str()); break; case P_DATA_LOCALVARIABLE: // a char* variable name case P_DATA_GLOBALVARIABLE: // a char* variable name mData.Variable = strdup(value.GetVariableName().c_str()); break; case P_DATA_FUNCTION: mData.Function = strdup(value.GetFunctionName().c_str()); break; case P_DATA_FUNCTION_POINTER: mData.pFunction = value.GetFunctionPointer(); break; case P_DATA_STACK_SIGNAL: mData.Signal = value.GetSignal(); break; case P_DATA_COMPLEXDATA: { PComplexData * tmp = value.GetComplexData(); //tmp is a pointer to complex data, which //is just a holder for the object. We want to make a //copy of tmp mComplexData = new PComplexData(*tmp); break; } case P_DATA_UNDEFINED: // undefined, error default: PError::SignalFatalError( "Undefined Variant type in Variant::operator = (Variant)."); break; } return (*this); }
void PushVariant(duk_context* ctx, const Variant& variant) { switch (variant.GetType()) { case Urho3D::VAR_BOOL: duk_push_boolean(ctx, variant.GetBool() ? 1 : 0); break; case Urho3D::VAR_INT: duk_push_number(ctx, (duk_double_t)variant.GetInt()); break; case Urho3D::VAR_FLOAT: duk_push_number(ctx, variant.GetFloat()); break; case Urho3D::VAR_DOUBLE: duk_push_number(ctx, variant.GetFloat()); break; case Urho3D::VAR_STRING: duk_push_string(ctx, variant.GetString().CString()); break; case Urho3D::VAR_VECTOR2: PushValueObjectCopy<float2>(ctx, float2(variant.GetVector2()), float2_ID, float2_Finalizer); break; case Urho3D::VAR_VECTOR3: PushValueObjectCopy<float3>(ctx, float3(variant.GetVector3()), float3_ID, float3_Finalizer); break; case Urho3D::VAR_VECTOR4: PushValueObjectCopy<float4>(ctx, float4(variant.GetVector4()), float4_ID, float4_Finalizer); break; case Urho3D::VAR_QUATERNION: PushValueObjectCopy<Quat>(ctx, Quat(variant.GetQuaternion()), Quat_ID, Quat_Finalizer); break; default: /// \todo More types duk_push_null(ctx); break; } }
void LuaScriptInstance::OnSetAttribute(const AttributeInfo& attr, const Variant& src) { if (attr.ptr_ != (void*)0xffffffff) { Serializable::OnSetAttribute(attr, src); return; } if (scriptObjectRef_ == LUA_REFNIL) return; String name = attr.name_; unsigned length = name.Length(); if (name.Back() == '_') length -= 1; int top = lua_gettop(luaState_); String functionName = String("Set") + name.Substring(0, 1).ToUpper() + name.Substring(1, length - 1); WeakPtr<LuaFunction> function = GetScriptObjectFunction(functionName); // If set function exist if (function) { if (function->BeginCall(this)) { function->PushVariant(src); function->EndCall(); } } else { lua_rawgeti(luaState_, LUA_REGISTRYINDEX, scriptObjectRef_); lua_pushstring(luaState_, name.CString()); switch (attr.type_) { case VAR_BOOL: lua_pushboolean(luaState_, src.GetBool()); break; case VAR_FLOAT: lua_pushnumber(luaState_, src.GetFloat()); break; case VAR_STRING: tolua_pushurho3dstring(luaState_, src.GetString()); break; case VAR_VECTOR2: { Vector2* value = new Vector2(src.GetVector2()); tolua_pushusertype(luaState_, value, "Vector2"); tolua_register_gc(luaState_, lua_gettop(luaState_)); } break; case VAR_VECTOR3: { Vector3* value = new Vector3(src.GetVector3()); tolua_pushusertype(luaState_, value, "Vector3"); tolua_register_gc(luaState_, lua_gettop(luaState_)); } break; case VAR_VECTOR4: { Vector4* value = new Vector4(src.GetVector4()); tolua_pushusertype(luaState_, value, "Vector4"); tolua_register_gc(luaState_, lua_gettop(luaState_)); } break; case VAR_QUATERNION: { Quaternion* value = new Quaternion(src.GetQuaternion()); tolua_pushusertype(luaState_, value, "Quaternion"); tolua_register_gc(luaState_, lua_gettop(luaState_)); } break; case VAR_COLOR: { Color* value = new Color(src.GetColor()); tolua_pushusertype(luaState_, value, "Color"); tolua_register_gc(luaState_, lua_gettop(luaState_)); } break; case VAR_INTRECT: { IntRect* value = new IntRect(src.GetIntRect()); tolua_pushusertype(luaState_, value, "IntRect"); tolua_register_gc(luaState_, lua_gettop(luaState_)); } break; case VAR_INTVECTOR2: { IntVector2* value = new IntVector2(src.GetIntVector2()); tolua_pushusertype(luaState_, value, "IntVector2"); tolua_register_gc(luaState_, lua_gettop(luaState_)); } break; default: LOGERROR("Unsupported data type"); lua_settop(luaState_, top); return; } lua_settable(luaState_, -3); } lua_settop(luaState_, top); }
bool Serializer::WriteVariantData(const Variant& value) { switch (value.GetType()) { case VAR_NONE: return true; case VAR_INT: return WriteInt(value.GetInt()); case VAR_BOOL: return WriteBool(value.GetBool()); case VAR_FLOAT: return WriteFloat(value.GetFloat()); case VAR_VECTOR2: return WriteVector2(value.GetVector2()); case VAR_VECTOR3: return WriteVector3(value.GetVector3()); case VAR_VECTOR4: return WriteVector4(value.GetVector4()); case VAR_QUATERNION: return WriteQuaternion(value.GetQuaternion()); case VAR_COLOR: return WriteColor(value.GetColor()); case VAR_STRING: return WriteString(value.GetString()); case VAR_BUFFER: return WriteBuffer(value.GetBuffer()); // Serializing pointers is not supported. Write null case VAR_VOIDPTR: case VAR_PTR: return WriteUInt(0); case VAR_RESOURCEREF: return WriteResourceRef(value.GetResourceRef()); case VAR_RESOURCEREFLIST: return WriteResourceRefList(value.GetResourceRefList()); case VAR_VARIANTVECTOR: return WriteVariantVector(value.GetVariantVector()); case VAR_VARIANTMAP: return WriteVariantMap(value.GetVariantMap()); case VAR_INTRECT: return WriteIntRect(value.GetIntRect()); case VAR_INTVECTOR2: return WriteIntVector2(value.GetIntVector2()); case VAR_MATRIX3: return WriteMatrix3(value.GetMatrix3()); case VAR_MATRIX3X4: return WriteMatrix3x4(value.GetMatrix3x4()); case VAR_MATRIX4: return WriteMatrix4(value.GetMatrix4()); default: return false; } }
///This function makes sure that a value has the proper ///underlying type. If it doesn't, it will cause a fatal error and ///report whereabouts the error happened. void PError::AssertType(Variant v, int type, const string & outsideMessage) { string message; switch(type) { case PEAT_STACK_SIGNAL: if( !v.IsStackSignal()) { message = outsideMessage; message += "Wanted stack signal but got a " + GetTypeName(v) + ": " + v.GetString(); SignalFatalError(message); } break; case PEAT_FUNCTION: if( !v.IsFunction()) { message = outsideMessage; message += "Wanted function but got a " + GetTypeName(v) + ": " + v.GetString(); SignalFatalError(message); } break; case PEAT_FUNCTION_POINTER: if( !v.IsFunction()) { message = outsideMessage; message += "Wanted function pointer but got " + GetTypeName(v) + ": " + v.GetString(); SignalFatalError(message); } break; case PEAT_NUMBER: if( !v.IsNumber()) { message = outsideMessage; message += "Wanted number but got " + GetTypeName(v) + ": " + v.GetString(); SignalFatalError(message); } break; case PEAT_INTEGER: if( !v.IsInteger()) { message = outsideMessage; message += "Wanted integer but got " + GetTypeName(v) + ": " + v.GetString(); SignalFatalError(message); } break; case PEAT_FLOAT: if( !v.IsNumber()) { message = outsideMessage; message +="Wanted floating-point number but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); } break; case PEAT_STRING: if( !v.IsString()) { message = outsideMessage; message +="Wanted string but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); } break; case PEAT_VARIABLE: if( v.IsGlobalVariable() || v.IsLocalVariable()) { return; } message = outsideMessage; message +="Wanted variable but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_AUDIOOUT: if(v.IsComplexData()) { if((v.GetComplexData())->IsAudioOut()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted AudioOut stream but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_COLOR: if(v.IsComplexData()) { if((v.GetComplexData())->IsColor()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted PEBL Color but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_ENVIRONMENT: if(v.IsComplexData()) { if((v.GetComplexData())->IsEnvironment()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted Environment but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_FILESTREAM: if(v.IsComplexData()) { if((v.GetComplexData())->IsFileStream()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted FileStream but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_FONT: if(v.IsComplexData()) { if((v.GetComplexData())->IsFont()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted font but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_IMAGEBOX: if(v.IsComplexData()) { if((v.GetComplexData())->IsImageBox()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted Image but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_JOYSTICK: if(v.IsComplexData()) { if((v.GetComplexData())->IsJoystick()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted Joystick but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_KEYBOARD: if(v.IsComplexData()) { if((v.GetComplexData())->IsKeyboard()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted Keyboard but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_LIST: if(v.IsComplexData()) { if((v.GetComplexData())->IsList()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted list but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_WIDGET: if(v.IsComplexData()) { if((v.GetComplexData())->IsWidget()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted Widget but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_OBJECT: if(v.IsComplexData()) { //Any complex data is a PEBLObject (except maybe a list?) return; } message = outsideMessage; message +="Wanted Object but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_WINDOW: if(v.IsComplexData()) { if((v.GetComplexData())->IsWindow()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted Window but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_TEXTOBJECT: if(v.IsComplexData()) { if((v.GetComplexData())->IsTextObject()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted TextObject but got " + GetTypeName(v) + ": " + v.GetString(); SignalFatalError(message); break; case PEAT_LABEL: if(v.IsComplexData()) { if((v.GetComplexData())->IsLabel()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted Label but got " + GetTypeName(v) + ": " + v.GetString(); SignalFatalError(message); break; case PEAT_TEXTBOX: if(v.IsComplexData()) { if((v.GetComplexData())->IsTextBox()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted Text Box but got " + GetTypeName(v) + ": " + v.GetString(); SignalFatalError(message); break; case PEAT_NETWORKCONNECTION: if(v.IsComplexData()) { if((v.GetComplexData())->IsNetworkConnection()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted network but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_PARALLELPORT: if(v.IsComplexData()) { if((v.GetComplexData())->IsParallelPort()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted parallelport but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_COMPORT: if(v.IsComplexData()) { if((v.GetComplexData())->IsComPort()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted ComPort but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_MOVIE: if(v.IsComplexData()) { if((v.GetComplexData())->IsMovie()) { //Everything is fine, return without error. return; } } message = outsideMessage; message +="Wanted Movie but got " + GetTypeName(v) + ": "+ v.GetString(); SignalFatalError(message); break; case PEAT_UNDEFINED: default: message = outsideMessage; message += string("Undefined type in PErrorAssert: ") + v.GetString(); SignalFatalError(message); break; } }
Variant::Variant(const Variant &v): mComplexData(NULL) { //This should behave differently depending on what type of variant v is mDataType = v.GetDataType(); switch(mDataType) { case P_DATA_NUMBER_INTEGER: // an integer mData.iNumber = v.GetInteger(); break; case P_DATA_NUMBER_FLOAT: // a float mData.fNumber = v.GetFloat(); break; case P_DATA_STRING: // cout << "testing case string:<" << v << ">"<<endl; mData.String = strdup(v.GetString().c_str()); break; case P_DATA_LOCALVARIABLE: // a variable name case P_DATA_GLOBALVARIABLE: // a variable name mData.Variable = strdup(v.GetVariableName().c_str()); break; case P_DATA_FUNCTION: //Memory problem here, diagnosed by efence: mData.Function = strdup(v.GetFunctionName().c_str()); break; case P_DATA_FUNCTION_POINTER: mData.pFunction = v.GetFunctionPointer(); break; case P_DATA_STACK_SIGNAL: mData.Signal = v.GetSignal(); break; //This needs to make a deep copy case P_DATA_COMPLEXDATA: { //cout<<"TYPE:" << v << endl; PComplexData * pcd = v.GetComplexData(); if(pcd) mComplexData = new PComplexData(*pcd); else mComplexData = NULL; } break; case P_DATA_UNDEFINED: // undefined, not an error break; default: cerr << "Undefined Data Type in Variant copy constructor. Type: " << mDataType << endl; cerr << v << endl; PError::SignalFatalError("Undefined Data Type."); break; } }
void JSONValue::SetVariantValue(const Variant& variant, Context* context) { if (!IsNull()) { LOGWARNING("JsonValue is not null"); } switch (variant.GetType()) { case VAR_BOOL: *this = variant.GetBool(); return; case VAR_INT: *this = variant.GetInt(); return; case VAR_FLOAT: *this = variant.GetFloat(); return; case VAR_DOUBLE: *this = variant.GetDouble(); return; case VAR_STRING: *this = variant.GetString(); return; case VAR_VARIANTVECTOR: SetVariantVector(variant.GetVariantVector(), context); return; case VAR_VARIANTMAP: SetVariantMap(variant.GetVariantMap(), context); return; case VAR_RESOURCEREF: { if (!context) { LOGERROR("Context must not null for ResourceRef"); return; } const ResourceRef& ref = variant.GetResourceRef(); *this = String(context->GetTypeName(ref.type_)) + ";" + ref.name_; } return; case VAR_RESOURCEREFLIST: { if (!context) { LOGERROR("Context must not null for ResourceRefList"); return; } const ResourceRefList& refList = variant.GetResourceRefList(); String str(context->GetTypeName(refList.type_)); for (unsigned i = 0; i < refList.names_.Size(); ++i) { str += ";"; str += refList.names_[i]; } *this = str; } return; case VAR_STRINGVECTOR: { const StringVector& vector = variant.GetStringVector(); Resize(vector.Size()); for (unsigned i = 0; i < vector.Size(); ++i) (*this)[i] = vector[i]; } return; default: *this = variant.ToString(); } }