Browse Source

More 64bit variant work, lua and angelscript bindings.

Rokas Kupstys 8 years ago
parent
commit
6a7a57eace

+ 20 - 0
Source/Urho3D/AngelScript/CoreAPI.cpp

@@ -183,6 +183,16 @@ static void ConstructVariantUInt(unsigned value, Variant* ptr)
     new(ptr) Variant(value);
 }
 
+static void ConstructVariantInt64(long long int value, Variant* ptr)
+{
+    new(ptr) Variant(value);
+}
+
+static void ConstructVariantUInt64(unsigned long long int value, Variant* ptr)
+{
+    new(ptr) Variant(value);
+}
+
 static void ConstructVariantStringHash(const StringHash& value, Variant* ptr)
 {
     new(ptr) Variant(value);
@@ -502,6 +512,8 @@ static void RegisterVariant(asIScriptEngine* engine)
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const Variant&in)", asFUNCTION(ConstructVariantCopy), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(int)", asFUNCTION(ConstructVariantInt), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(uint)", asFUNCTION(ConstructVariantUInt), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(int64)", asFUNCTION(ConstructVariantInt64), asCALL_CDECL_OBJLAST);
+    engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(uint64)", asFUNCTION(ConstructVariantUInt64), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(const StringHash&in)", asFUNCTION(ConstructVariantStringHash), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(bool)", asFUNCTION(ConstructVariantBool), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectBehaviour("Variant", asBEHAVE_CONSTRUCT, "void f(float)", asFUNCTION(ConstructVariantFloat), asCALL_CDECL_OBJLAST);
@@ -533,6 +545,8 @@ static void RegisterVariant(asIScriptEngine* engine)
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(const Variant&in)", asMETHODPR(Variant, operator =, (const Variant&), Variant&), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(int)", asMETHODPR(Variant, operator =, (int), Variant&), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(uint)", asMETHODPR(Variant, operator =, (unsigned), Variant&), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Variant", "Variant& opAssign(int64)", asMETHODPR(Variant, operator =, (long long int), Variant&), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Variant", "Variant& opAssign(uint64)", asMETHODPR(Variant, operator =, (unsigned long long int), Variant&), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(const StringHash&in)", asMETHODPR(Variant, operator =, (const StringHash&), Variant&), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(bool)", asMETHODPR(Variant, operator =, (bool), Variant&), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "Variant& opAssign(float)", asMETHODPR(Variant, operator =, (float), Variant&), asCALL_THISCALL);
@@ -560,6 +574,8 @@ static void RegisterVariant(asIScriptEngine* engine)
     engine->RegisterObjectMethod("Variant", "bool opEquals(const Variant&in) const", asMETHODPR(Variant, operator ==, (const Variant&) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool opEquals(int) const", asMETHODPR(Variant, operator ==, (int) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool opEquals(uint) const", asMETHODPR(Variant, operator ==, (unsigned) const, bool), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Variant", "bool opEquals(int64) const", asMETHODPR(Variant, operator ==, (long long int) const, bool), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Variant", "bool opEquals(uint64) const", asMETHODPR(Variant, operator ==, (unsigned long long int) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool opEquals(const StringHash&in) const", asMETHODPR(Variant, operator ==, (const StringHash&) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool opEquals(bool) const", asMETHODPR(Variant, operator ==, (bool) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool opEquals(float) const", asMETHODPR(Variant, operator ==, (float) const, bool), asCALL_THISCALL);
@@ -586,6 +602,8 @@ static void RegisterVariant(asIScriptEngine* engine)
     engine->RegisterObjectMethod("Variant", "bool opEquals(const Matrix4&in) const", asMETHODPR(Variant, operator ==, (const Matrix4&) const, bool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "int GetInt() const", asMETHOD(Variant, GetInt), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "uint GetUInt() const", asMETHOD(Variant, GetUInt), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Variant", "int GetInt64() const", asMETHOD(Variant, GetInt64), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Variant", "uint64 GetUInt64() const", asMETHOD(Variant, GetUInt64), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "StringHash GetStringHash() const", asMETHOD(Variant, GetStringHash), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "bool GetBool() const", asMETHOD(Variant, GetBool), asCALL_THISCALL);
     engine->RegisterObjectMethod("Variant", "float GetFloat() const", asMETHOD(Variant, GetFloat), asCALL_THISCALL);
@@ -730,6 +748,8 @@ static void RegisterStringUtils(asIScriptEngine* engine)
     engine->RegisterObjectMethod("String", "double ToDouble() const", asFUNCTIONPR(ToDouble, (const String&), double), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "int ToInt(int base = 10) const", asFUNCTIONPR(ToInt, (const String&, int), int), asCALL_CDECL_OBJFIRST);
     engine->RegisterObjectMethod("String", "uint ToUInt(int base = 10) const", asFUNCTIONPR(ToUInt, (const String&, int), unsigned), asCALL_CDECL_OBJFIRST);
+    engine->RegisterObjectMethod("String", "int64 ToInt64(int base = 10) const", asFUNCTIONPR(ToInt64, (const String&, int), long long int), asCALL_CDECL_OBJFIRST);
+    engine->RegisterObjectMethod("String", "uint64 ToUInt64(int base = 10) const", asFUNCTIONPR(ToUInt64, (const String&, int), unsigned long long int), asCALL_CDECL_OBJFIRST);
     engine->RegisterObjectMethod("String", "Color ToColor() const", asFUNCTIONPR(ToColor, (const String&), Color), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "IntRect ToIntRect() const", asFUNCTIONPR(ToIntRect, (const String&), IntRect), asCALL_CDECL_OBJLAST);
     engine->RegisterObjectMethod("String", "IntVector2 ToIntVector2() const", asFUNCTIONPR(ToIntVector2, (const String&), IntVector2), asCALL_CDECL_OBJLAST);

+ 2 - 0
Source/Urho3D/AngelScript/ResourceAPI.cpp

@@ -473,6 +473,8 @@ static void RegisterXMLElement(asIScriptEngine* engine)
     engine->RegisterObjectMethod("XMLElement", "bool SetDouble(const String&in, double)", asMETHOD(XMLElement, SetDouble), asCALL_THISCALL);
     engine->RegisterObjectMethod("XMLElement", "bool SetInt(const String&in, int)", asMETHOD(XMLElement, SetInt), asCALL_THISCALL);
     engine->RegisterObjectMethod("XMLElement", "bool SetUInt(const String&in, uint)", asMETHOD(XMLElement, SetUInt), asCALL_THISCALL);
+    engine->RegisterObjectMethod("XMLElement", "bool SetInt64(const String&in, int64)", asMETHOD(XMLElement, SetInt64), asCALL_THISCALL);
+    engine->RegisterObjectMethod("XMLElement", "bool SetUInt64(const String&in, uint64)", asMETHOD(XMLElement, SetUInt64), asCALL_THISCALL);
     engine->RegisterObjectMethod("XMLElement", "bool SetIntRect(const String&in, const IntRect&in)", asMETHOD(XMLElement, SetIntRect), asCALL_THISCALL);
     engine->RegisterObjectMethod("XMLElement", "bool SetIntVector2(const String&in, const IntVector2&in)", asMETHOD(XMLElement, SetIntVector2), asCALL_THISCALL);
     engine->RegisterObjectMethod("XMLElement", "bool SetIntVector3(const String&in, const IntVector3&in)", asMETHOD(XMLElement, SetIntVector3), asCALL_THISCALL);

+ 34 - 0
Source/Urho3D/Core/StringUtils.cpp

@@ -120,11 +120,45 @@ int ToInt(const char* source, int base)
     return (int)strtol(source, 0, base);
 }
 
+long long int ToInt64(const char* source, int base)
+{
+    if (!source)
+        return 0;
+
+    // Shield against runtime library assert by converting illegal base values to 0 (autodetect)
+    if (base < 2 || base > 36)
+        base = 0;
+
+    return strtoll(source, 0, base);
+}
+
+long long int ToInt64(const String& source, int base)
+{
+    return ToInt64(source.CString(), base);
+}
+
 unsigned ToUInt(const String& source, int base)
 {
     return ToUInt(source.CString(), base);
 }
 
+unsigned long long int ToUInt64(const char* source, int base)
+{
+    if (!source)
+        return 0;
+
+    // Shield against runtime library assert by converting illegal base values to 0 (autodetect)
+    if (base < 2 || base > 36)
+        base = 0;
+
+    return strtoull(source, 0, base);
+}
+
+unsigned long long int ToUInt64(const String& source, int base)
+{
+    return ToUInt64(source.CString(), base);
+}
+
 unsigned ToUInt(const char* source, int base)
 {
     if (!source)

+ 8 - 0
Source/Urho3D/Core/StringUtils.h

@@ -47,6 +47,14 @@ URHO3D_API int ToInt(const char* source, int base = 10);
 URHO3D_API unsigned ToUInt(const String& source, int base = 10);
 /// Parse an unsigned integer from a C string. Assumed to be decimal by default (base 10). Use base 0 to autodetect from string.
 URHO3D_API unsigned ToUInt(const char* source, int base = 10);
+/// Parse an 64 bit integer from a string. Assumed to be decimal by default (base 10). Use base 0 to autodetect from string.
+URHO3D_API long long int ToInt64(const String& source, int base = 10);
+/// Parse an 64 bit integer from a C string. Assumed to be decimal by default (base 10). Use base 0 to autodetect from string.
+URHO3D_API long long int ToInt64(const char* source, int base = 10);
+/// Parse an unsigned 64 bit integer from a string. Assumed to be decimal by default (base 10). Use base 0 to autodetect from string.
+URHO3D_API unsigned long long int ToUInt64(const String& source, int base = 10);
+/// Parse an unsigned 64 bit integer from a C string. Assumed to be decimal by default (base 10). Use base 0 to autodetect from string.
+URHO3D_API unsigned long long int ToUInt64(const char* source, int base = 10);
 /// Parse a Color from a string.
 URHO3D_API Color ToColor(const String& source);
 /// Parse a Color from a C string.

+ 25 - 1
Source/Urho3D/Core/Variant.cpp

@@ -66,7 +66,8 @@ static const char* typeNames[] =
     "StringVector",
     "Rect",
     "IntVector3",
-    0
+    "Int64",
+	0
 };
 
 Variant& Variant::operator =(const Variant& rhs)
@@ -146,6 +147,9 @@ bool Variant::operator ==(const Variant& rhs) const
     case VAR_INT:
         return value_.int_ == rhs.value_.int_;
 
+    case VAR_INT64:
+        return *reinterpret_cast<const long long int*>(&value_.int_) == *reinterpret_cast<const long long int*>(&rhs.value_.int_);
+
     case VAR_BOOL:
         return value_.bool_ == rhs.value_.bool_;
 
@@ -255,6 +259,10 @@ void Variant::FromString(VariantType type, const char* value)
         *this = ToInt(value);
         break;
 
+    case VAR_INT64:
+        *this = ToInt64(value);
+        break;
+
     case VAR_BOOL:
         *this = ToBool(value);
         break;
@@ -399,6 +407,9 @@ String Variant::ToString() const
     case VAR_INT:
         return String(value_.int_);
 
+    case VAR_INT64:
+        return String(*reinterpret_cast<const long long int*>(&value_.int_));
+
     case VAR_BOOL:
         return String(value_.bool_);
 
@@ -475,6 +486,9 @@ bool Variant::IsZero() const
     case VAR_INT:
         return value_.int_ == 0;
 
+    case VAR_INT64:
+        return *reinterpret_cast<const long long int*>(&value_.int_) == 0;
+
     case VAR_BOOL:
         return value_.bool_ == false;
 
@@ -679,6 +693,16 @@ template <> unsigned Variant::Get<unsigned>() const
     return GetUInt();
 }
 
+template <> long long int Variant::Get<long long int>() const
+{
+    return GetInt64();
+}
+
+template <> unsigned long long int Variant::Get<unsigned long long int>() const
+{
+    return GetUInt64();
+}
+
 template <> StringHash Variant::Get<StringHash>() const
 {
     return GetStringHash();

+ 28 - 1
Source/Urho3D/Core/Variant.h

@@ -229,6 +229,13 @@ public:
         *this = (int)value;
     }
 
+    /// Construct from unsigned integer.
+    Variant(unsigned long long int value) :
+        type_(VAR_NONE)
+    {
+        *this = (long long int)value;
+    }
+
     /// Construct from a string hash (convert to integer).
     Variant(const StringHash& value) :
         type_(VAR_NONE)
@@ -717,9 +724,15 @@ public:
     /// Test for equality with an integer. To return true, both the type and value must match.
     bool operator ==(int rhs) const { return type_ == VAR_INT ? value_.int_ == rhs : false; }
 
-    /// Test for equality with an unsigned integer. To return true, both the type and value must match.
+    /// Test for equality with an unsigned 64 bit integer. To return true, both the type and value must match.
     bool operator ==(unsigned rhs) const { return type_ == VAR_INT ? value_.int_ == (int)rhs : false; }
 
+    /// Test for equality with an 64 bit integer. To return true, both the type and value must match.
+    bool operator ==(long long int rhs) const { return type_ == VAR_INT64 ? *reinterpret_cast<const long long int*>(&value_.int_) == rhs : false; }
+
+    /// Test for equality with an unsigned integer. To return true, both the type and value must match.
+    bool operator ==(unsigned long long int rhs) const { return type_ == VAR_INT64 ? *reinterpret_cast<const unsigned long long int*>(&value_.int_) == (int)rhs : false; }
+
     /// Test for equality with a bool. To return true, both the type and value must match.
     bool operator ==(bool rhs) const { return type_ == VAR_BOOL ? value_.bool_ == rhs : false; }
 
@@ -876,6 +889,12 @@ public:
     /// Test for inequality with an unsigned integer.
     bool operator !=(unsigned rhs) const { return !(*this == rhs); }
 
+    /// Test for inequality with an 64 bit integer.
+    bool operator !=(long long int rhs) const { return !(*this == rhs); }
+
+    /// Test for inequality with an unsigned 64 bit integer.
+    bool operator !=(unsigned long long int rhs) const { return !(*this == rhs); }
+
     /// Test for inequality with a bool.
     bool operator !=(bool rhs) const { return !(*this == rhs); }
 
@@ -1234,6 +1253,10 @@ template <> inline VariantType GetVariantType<int>() { return VAR_INT; }
 
 template <> inline VariantType GetVariantType<unsigned>() { return VAR_INT; }
 
+template <> inline VariantType GetVariantType<long long int>() { return VAR_INT64; }
+
+template <> inline VariantType GetVariantType<unsigned long long int>() { return VAR_INT64; }
+
 template <> inline VariantType GetVariantType<bool>() { return VAR_BOOL; }
 
 template <> inline VariantType GetVariantType<float>() { return VAR_FLOAT; }
@@ -1285,6 +1308,10 @@ template <> URHO3D_API int Variant::Get<int>() const;
 
 template <> URHO3D_API unsigned Variant::Get<unsigned>() const;
 
+template <> URHO3D_API long long int Variant::Get<long long int>() const;
+
+template <> URHO3D_API unsigned long long int Variant::Get<unsigned long long int>() const;
+
 template <> URHO3D_API StringHash Variant::Get<StringHash>() const;
 
 template <> URHO3D_API bool Variant::Get<bool>() const;

+ 3 - 0
Source/Urho3D/IO/Deserializer.cpp

@@ -309,6 +309,9 @@ Variant Deserializer::ReadVariant(VariantType type)
     case VAR_INT:
         return Variant(ReadInt());
 
+    case VAR_INT64:
+        return Variant(ReadInt64());
+
     case VAR_BOOL:
         return Variant(ReadBool());
 

+ 3 - 0
Source/Urho3D/IO/Serializer.cpp

@@ -256,6 +256,9 @@ bool Serializer::WriteVariantData(const Variant& value)
     case VAR_INT:
         return WriteInt(value.GetInt());
 
+    case VAR_INT64:
+        return WriteInt64(value.GetInt64());
+
     case VAR_BOOL:
         return WriteBool(value.GetBool());
 

+ 11 - 0
Source/Urho3D/LuaScript/ToluaUtils.cpp

@@ -198,6 +198,10 @@ void ToluaToVariant(lua_State* L, int narg, void* def, Variant& variant)
                 variant = (int)value;
                 break;
 
+            case VAR_INT64:
+                variant = (long long int)value;
+                break;
+
             case VAR_BOOL:
                 variant = value != 0.0f;
                 break;
@@ -339,6 +343,13 @@ void ToluaPushVariant(lua_State* L, const Variant* variant, const char* type)
             tolua_pushnumber(L, (lua_Number)variant->GetInt());
         break;
 
+    case VAR_INT64:
+        if (typeName == "unsigned" || typeName == "unsigned int" || typeName == "UInt" || typeName == "uint")
+            tolua_pushnumber(L, (lua_Number)variant->GetUInt64());
+        else
+            tolua_pushnumber(L, (lua_Number)variant->GetInt64());
+        break;
+
     case VAR_BOOL:
         tolua_pushboolean(L, (int)variant->GetBool());
         break;

+ 2 - 0
Source/Urho3D/LuaScript/pkgs/Core/StringUtils.pkg

@@ -4,6 +4,8 @@ bool ToBool(const String source);
 float ToFloat(const String source);
 int ToInt(const String source, int base = 10);
 unsigned ToUInt(const String source, int base = 10);
+long long int ToInt64(const String source, int base = 10);
+unsigned long long int ToUInt64(const String source, int base = 10);
 
 Color ToColor(const String source);
 IntRect ToIntRect(const String source);

+ 3 - 0
Source/Urho3D/LuaScript/pkgs/Core/Variant.pkg

@@ -29,6 +29,7 @@ enum VariantType
     VAR_STRINGVECTOR,
     VAR_RECT,
     VAR_INTVECTOR3,
+    VAR_INT64,
     MAX_VAR_TYPES
 };
 
@@ -78,6 +79,8 @@ class Variant
     // All below getters are preserved for backward compatibility and for compatibility with C++ and AngelScript API
     int GetInt() const;
     unsigned GetUInt() const;
+    long long int GetInt64() const;
+    unsigned long long int GetUInt64() const;
     StringHash GetStringHash() const;
     bool GetBool() const;
     float GetFloat() const;

+ 3 - 1
Source/Urho3D/LuaScript/pkgs/Resource/XMLElement.pkg

@@ -19,6 +19,8 @@ class XMLElement
     bool SetDouble(const String name, double value);
     bool SetUInt(const String name, unsigned value);
     bool SetInt(const String name, int value);
+    bool SetUInt64(const String name, unsigned long long int value);
+    bool SetInt64(const String name, long long int value);
     bool SetIntRect(const String name, const IntRect& value);
     bool SetIntVector2(const String name, const IntVector2& value);
     bool SetIntVector3(const String name, const IntVector3& value);
@@ -90,4 +92,4 @@ class XMLElement
     tolua_readonly tolua_property__get_set String value;
     tolua_readonly tolua_property__get_set unsigned numAttributes;
     tolua_readonly tolua_property__get_set XMLFile* file;
-};
+};

+ 10 - 0
Source/Urho3D/Resource/XMLElement.cpp

@@ -349,6 +349,16 @@ bool XMLElement::SetInt(const String& name, int value)
     return SetAttribute(name, String(value));
 }
 
+bool XMLElement::SetUInt64(const String& name, unsigned long long int value)
+{
+    return SetAttribute(name, String(value));
+}
+
+bool XMLElement::SetInt64(const String& name, long long int value)
+{
+    return SetAttribute(name, String(value));
+}
+
 bool XMLElement::SetIntRect(const String& name, const IntRect& value)
 {
     return SetAttribute(name, value.ToString());

+ 4 - 0
Source/Urho3D/Resource/XMLElement.h

@@ -124,6 +124,10 @@ public:
     bool SetUInt(const String& name, unsigned value);
     /// Set an integer attribute.
     bool SetInt(const String& name, int value);
+    /// Set an unsigned integer attribute.
+    bool SetUInt64(const String& name, unsigned long long int value);
+    /// Set an integer attribute.
+    bool SetInt64(const String& name, long long int value);
     /// Set an IntRect attribute.
     bool SetIntRect(const String& name, const IntRect& value);
     /// Set an IntVector2 attribute.