1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2025-04-25 21:57:12 +02:00

Update the LongInt type to use the new dynamic dispatching system for metamethods.

This commit is contained in:
Sandu Liviu Catalin 2016-08-25 00:19:53 +03:00
parent 16656362cc
commit d449247b5e
2 changed files with 691 additions and 55 deletions

View File

@ -2,6 +2,7 @@
#include "Library/Numeric/LongInt.hpp"
#include "Library/Numeric/Random.hpp"
#include "Base/Shared.hpp"
#include "Base/DynArg.hpp"
// ------------------------------------------------------------------------------------------------
#include <cstdio>
@ -20,20 +21,17 @@ SQInteger LongInt< Int64 >::Typename(HSQUIRRELVM vm)
}
// ------------------------------------------------------------------------------------------------
LongInt< Int64 >::LongInt(CSStr text) : m_Data(0), m_Text()
LongInt< Int64 >::LongInt(CSStr text)
: m_Data(0), m_Text()
{
m_Data = std::strtoll(text, nullptr, 10);
}
// ------------------------------------------------------------------------------------------------
LongInt< Int64 >::LongInt(CSStr text, SQInteger fall) : m_Data(0), m_Text()
LongInt< Int64 >::LongInt(CSStr text, Uint32 base)
: m_Data(0), m_Text()
{
m_Data = std::strtoll(text, nullptr, 10);
// Simple, check for conversion errors
if (errno == ERANGE)
{
m_Data = ConvTo< Type >::From(fall);
}
m_Data = std::strtoll(text, nullptr, base);
}
// ------------------------------------------------------------------------------------------------
@ -81,20 +79,17 @@ SQInteger LongInt< Uint64 >::Typename(HSQUIRRELVM vm)
}
// ------------------------------------------------------------------------------------------------
LongInt< Uint64 >::LongInt(CSStr text) : m_Data(0), m_Text()
LongInt< Uint64 >::LongInt(CSStr text)
: m_Data(0), m_Text()
{
m_Data = std::strtoll(text, nullptr, 10);
m_Data = std::strtoull(text, nullptr, 10);
}
// ------------------------------------------------------------------------------------------------
LongInt< Uint64 >::LongInt(CSStr text, SQInteger fall) : m_Data(0), m_Text()
LongInt< Uint64 >::LongInt(CSStr text, Uint32 base)
: m_Data(0), m_Text()
{
m_Data = std::strtoull(text, nullptr, 10);
// Simple, check for conversion errors
if (errno == ERANGE)
{
m_Data = ConvTo< Type >::From(fall);
}
m_Data = std::strtoull(text, nullptr, base);
}
// ------------------------------------------------------------------------------------------------
@ -147,7 +142,7 @@ void Register_LongInt(HSQUIRRELVM vm)
// Core Meta-methods
.Func(_SC("_tostring"), &SLongInt::ToString)
.SquirrelFunc(_SC("_typename"), &SLongInt::Typename)
.Func(_SC("_cmp"), &SLongInt::Cmp)
.SquirrelFunc(_SC("cmp"), &SqDynArgFwd< SqDynArgCmpFn< SLongInt >, SQInteger, SQFloat, bool, std::nullptr_t, CSStr, SLongInt, ULongInt >)
// Core Functions
.Func(_SC("tointeger"), &SLongInt::ToSqInteger)
.Func(_SC("tofloat"), &SLongInt::ToSqFloat)
@ -155,11 +150,11 @@ void Register_LongInt(HSQUIRRELVM vm)
.Func(_SC("tobool"), &SLongInt::ToSqBool)
.Func(_SC("tochar"), &SLongInt::ToSqChar)
// Meta-methods
.Func< SLongInt (SLongInt::*)(const SLongInt &) const >(_SC("_add"), &SLongInt::operator +)
.Func< SLongInt (SLongInt::*)(const SLongInt &) const >(_SC("_sub"), &SLongInt::operator -)
.Func< SLongInt (SLongInt::*)(const SLongInt &) const >(_SC("_mul"), &SLongInt::operator *)
.Func< SLongInt (SLongInt::*)(const SLongInt &) const >(_SC("_div"), &SLongInt::operator /)
.Func< SLongInt (SLongInt::*)(const SLongInt &) const >(_SC("_modulo"), &SLongInt::operator %)
.SquirrelFunc(_SC("_add"), &SqDynArgFwd< SqDynArgAddFn< SLongInt >, SQInteger, SQFloat, bool, std::nullptr_t, CSStr, SLongInt, ULongInt >)
.SquirrelFunc(_SC("_sub"), &SqDynArgFwd< SqDynArgSubFn< SLongInt >, SQInteger, SQFloat, bool, std::nullptr_t, CSStr, SLongInt, ULongInt >)
.SquirrelFunc(_SC("_mul"), &SqDynArgFwd< SqDynArgMulFn< SLongInt >, SQInteger, SQFloat, bool, std::nullptr_t, CSStr, SLongInt, ULongInt >)
.SquirrelFunc(_SC("_div"), &SqDynArgFwd< SqDynArgDivFn< SLongInt >, SQInteger, SQFloat, bool, std::nullptr_t, CSStr, SLongInt, ULongInt >)
.SquirrelFunc(_SC("_modulo"), &SqDynArgFwd< SqDynArgModFn< SLongInt >, SQInteger, SQFloat, bool, std::nullptr_t, CSStr, SLongInt, ULongInt >)
.Func< SLongInt (SLongInt::*)(void) const >(_SC("_unm"), &SLongInt::operator -)
// Functions
.Func(_SC("GetStr"), &SLongInt::GetCStr)
@ -183,7 +178,7 @@ void Register_LongInt(HSQUIRRELVM vm)
// Core Meta-methods
.Func(_SC("_tostring"), &ULongInt::ToString)
.SquirrelFunc(_SC("_typename"), &ULongInt::Typename)
.Func(_SC("_cmp"), &ULongInt::Cmp)
.SquirrelFunc(_SC("cmp"), &SqDynArgFwd< SqDynArgCmpFn< ULongInt >, SQInteger, SQFloat, bool, std::nullptr_t, CSStr, ULongInt, SLongInt >)
// Core Functions
.Func(_SC("tointeger"), &ULongInt::ToSqInteger)
.Func(_SC("tofloat"), &ULongInt::ToSqFloat)
@ -191,11 +186,11 @@ void Register_LongInt(HSQUIRRELVM vm)
.Func(_SC("tobool"), &ULongInt::ToSqBool)
.Func(_SC("tochar"), &ULongInt::ToSqChar)
// Meta-methods
.Func< ULongInt (ULongInt::*)(const ULongInt &) const >(_SC("_add"), &ULongInt::operator +)
.Func< ULongInt (ULongInt::*)(const ULongInt &) const >(_SC("_sub"), &ULongInt::operator -)
.Func< ULongInt (ULongInt::*)(const ULongInt &) const >(_SC("_mul"), &ULongInt::operator *)
.Func< ULongInt (ULongInt::*)(const ULongInt &) const >(_SC("_div"), &ULongInt::operator /)
.Func< ULongInt (ULongInt::*)(const ULongInt &) const >(_SC("_modulo"), &ULongInt::operator %)
.SquirrelFunc(_SC("_add"), &SqDynArgFwd< SqDynArgAddFn< ULongInt >, SQInteger, SQFloat, bool, std::nullptr_t, CSStr, ULongInt, SLongInt >)
.SquirrelFunc(_SC("_sub"), &SqDynArgFwd< SqDynArgSubFn< ULongInt >, SQInteger, SQFloat, bool, std::nullptr_t, CSStr, ULongInt, SLongInt >)
.SquirrelFunc(_SC("_mul"), &SqDynArgFwd< SqDynArgMulFn< ULongInt >, SQInteger, SQFloat, bool, std::nullptr_t, CSStr, ULongInt, SLongInt >)
.SquirrelFunc(_SC("_div"), &SqDynArgFwd< SqDynArgDivFn< ULongInt >, SQInteger, SQFloat, bool, std::nullptr_t, CSStr, ULongInt, SLongInt >)
.SquirrelFunc(_SC("_modulo"), &SqDynArgFwd< SqDynArgModFn< ULongInt >, SQInteger, SQFloat, bool, std::nullptr_t, CSStr, ULongInt, SLongInt >)
.Func< ULongInt (ULongInt::*)(void) const >(_SC("_unm"), &ULongInt::operator -)
// Functions
.Func(_SC("GetStr"), &ULongInt::GetCStr)

View File

@ -40,7 +40,7 @@ public:
/* --------------------------------------------------------------------------------------------
* Explicit value constructor.
*/
LongInt(Type n)
explicit LongInt(Type n)
: m_Data(n), m_Text()
{
/* ... */
@ -49,12 +49,12 @@ public:
/* --------------------------------------------------------------------------------------------
* String encoded constructor.
*/
LongInt(CSStr text);
explicit LongInt(CSStr text);
/* --------------------------------------------------------------------------------------------
* String encoded with fall back value constructor.
* String encoded with explicit base constructor.
*/
LongInt(CSStr text, SQInteger fall);
LongInt(CSStr text, Uint32 base);
/* --------------------------------------------------------------------------------------------
* Copy constructor.
@ -155,41 +155,241 @@ public:
/* --------------------------------------------------------------------------------------------
* Adition operator.
*/
LongInt< Type > operator + (const LongInt< Type > & o) const
template < typename U > LongInt< Type > operator + (const LongInt< U > & o) const
{
return LongInt< Type >(m_Data + o.m_Data);
return LongInt< Type >(m_Data + ConvTo< Type >::From(o.GetNum()));
}
/* --------------------------------------------------------------------------------------------
* Subtraction operator.
*/
LongInt< Type > operator - (const LongInt< Type > & o) const
template < typename U > LongInt< Type > operator - (const LongInt< U > & o) const
{
return LongInt< Type >(m_Data - o.m_Data);
return LongInt< Type >(m_Data - ConvTo< Type >::From(o.GetNum()));
}
/* --------------------------------------------------------------------------------------------
* Multiplication operator.
*/
LongInt< Type > operator * (const LongInt< Type > & o) const
template < typename U > LongInt< Type > operator * (const LongInt< U > & o) const
{
return LongInt< Type >(m_Data * o.m_Data);
return LongInt< Type >(m_Data * ConvTo< Type >::From(o.GetNum()));
}
/* --------------------------------------------------------------------------------------------
* Division operator.
*/
LongInt< Type > operator / (const LongInt< Type > & o) const
template < typename U > LongInt< Type > operator / (const LongInt< U > & o) const
{
return LongInt< Type >(m_Data / o.m_Data);
return LongInt< Type >(m_Data / ConvTo< Type >::From(o.GetNum()));
}
/* --------------------------------------------------------------------------------------------
* Modulus operator.
*/
LongInt< Type > operator % (const LongInt< Type > & o) const
template < typename U > LongInt< Type > operator % (const LongInt< U > & o) const
{
return LongInt< Type >(m_Data % o.m_Data);
return LongInt< Type >(m_Data % ConvTo< Type >::From(o.GetNum()));
}
/* --------------------------------------------------------------------------------------------
* Adition operator.
*/
LongInt< Type > operator + (SQInteger s) const
{
return LongInt< Type >(m_Data + ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Subtraction operator.
*/
LongInt< Type > operator - (SQInteger s) const
{
return LongInt< Type >(m_Data - ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Multiplication operator.
*/
LongInt< Type > operator * (SQInteger s) const
{
return LongInt< Type >(m_Data * ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Division operator.
*/
LongInt< Type > operator / (SQInteger s) const
{
return LongInt< Type >(m_Data / ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Modulus operator.
*/
LongInt< Type > operator % (SQInteger s) const
{
return LongInt< Type >(m_Data % ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Adition operator.
*/
LongInt< Type > operator + (SQFloat s) const
{
return LongInt< Type >(m_Data + ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Subtraction operator.
*/
LongInt< Type > operator - (SQFloat s) const
{
return LongInt< Type >(m_Data - ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Multiplication operator.
*/
LongInt< Type > operator * (SQFloat s) const
{
return LongInt< Type >(m_Data * ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Division operator.
*/
LongInt< Type > operator / (SQFloat s) const
{
return LongInt< Type >(m_Data / ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Modulus operator.
*/
LongInt< Type > operator % (SQFloat s) const
{
return LongInt< Type >(m_Data % ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Adition operator.
*/
LongInt< Type > operator + (bool s) const
{
return LongInt< Type >(m_Data + static_cast< Type >(s));
}
/* --------------------------------------------------------------------------------------------
* Subtraction operator.
*/
LongInt< Type > operator - (bool s) const
{
return LongInt< Type >(m_Data - static_cast< Type >(s));
}
/* --------------------------------------------------------------------------------------------
* Multiplication operator.
*/
LongInt< Type > operator * (bool s) const
{
return LongInt< Type >(m_Data * static_cast< Type >(s));
}
/* --------------------------------------------------------------------------------------------
* Division operator.
*/
LongInt< Type > operator / (bool s) const
{
return LongInt< Type >(m_Data / static_cast< Type >(s));
}
/* --------------------------------------------------------------------------------------------
* Modulus operator.
*/
LongInt< Type > operator % (bool s) const
{
return LongInt< Type >(m_Data % static_cast< Type >(s));
}
/* --------------------------------------------------------------------------------------------
* Adition operator.
*/
LongInt< Type > operator + (std::nullptr_t) const
{
return LongInt< Type >(m_Data + static_cast< Type >(0));
}
/* --------------------------------------------------------------------------------------------
* Subtraction operator.
*/
LongInt< Type > operator - (std::nullptr_t) const
{
return LongInt< Type >(m_Data - static_cast< Type >(0));
}
/* --------------------------------------------------------------------------------------------
* Multiplication operator.
*/
LongInt< Type > operator * (std::nullptr_t) const
{
return LongInt< Type >(m_Data * static_cast< Type >(0));
}
/* --------------------------------------------------------------------------------------------
* Division operator.
*/
LongInt< Type > operator / (std::nullptr_t) const
{
return LongInt< Type >(static_cast< Type >(0));
}
/* --------------------------------------------------------------------------------------------
* Modulus operator.
*/
LongInt< Type > operator % (std::nullptr_t) const
{
return LongInt< Type >(static_cast< Type >(0));
}
/* --------------------------------------------------------------------------------------------
* Adition operator.
*/
LongInt< Type > operator + (CSStr str) const
{
return LongInt< Type >(m_Data + ConvTo< Type >::From(str));
}
/* --------------------------------------------------------------------------------------------
* Subtraction operator.
*/
LongInt< Type > operator - (CSStr str) const
{
return LongInt< Type >(m_Data - ConvTo< Type >::From(str));
}
/* --------------------------------------------------------------------------------------------
* Multiplication operator.
*/
LongInt< Type > operator * (CSStr str) const
{
return LongInt< Type >(m_Data * ConvTo< Type >::From(str));
}
/* --------------------------------------------------------------------------------------------
* Division operator.
*/
LongInt< Type > operator / (CSStr str) const
{
return LongInt< Type >(m_Data / ConvTo< Type >::From(str));
}
/* --------------------------------------------------------------------------------------------
* Modulus operator.
*/
LongInt< Type > operator % (CSStr str) const
{
return LongInt< Type >(m_Data % ConvTo< Type >::From(str));
}
/* --------------------------------------------------------------------------------------------
@ -219,6 +419,109 @@ public:
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to compare an instance of this type with another one.
*/
Int32 Cmp(const LongInt< Uint64 > & o) const;
/* --------------------------------------------------------------------------------------------
* Used by the script engine to compare an instance of this type with a scalar value.
*/
Int32 Cmp(SQInteger s) const
{
if (m_Data == static_cast< Type >(s))
{
return 0;
}
else if (m_Data > static_cast< Type >(s))
{
return 1;
}
else
{
return -1;
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to compare an instance of this type with a scalar value.
*/
Int32 Cmp(SQFloat s) const
{
if (m_Data == static_cast< Type >(s))
{
return 0;
}
else if (m_Data > static_cast< Type >(s))
{
return 1;
}
else
{
return -1;
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to compare an instance of this type with a scalar value.
*/
Int32 Cmp(bool s) const
{
if (m_Data == static_cast< Type >(s))
{
return 0;
}
else if (m_Data > static_cast< Type >(s))
{
return 1;
}
else
{
return -1;
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to compare an instance of this type with a scalar value.
*/
Int32 Cmp(std::nullptr_t) const
{
if (m_Data == static_cast< Type >(0))
{
return 0;
}
else if (m_Data > static_cast< Type >(0))
{
return 1;
}
else
{
return -1;
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to compare an instance of this type with a scalar value.
*/
Int32 Cmp(CSStr str) const
{
const Type v = ConvTo< Type >::From(str);
if (m_Data == v)
{
return 0;
}
else if (m_Data > v)
{
return 1;
}
else
{
return -1;
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to convert an instance of this type to a string.
*/
@ -367,9 +670,9 @@ public:
LongInt(CSStr text);
/* --------------------------------------------------------------------------------------------
* String encoded with fall back value constructor.
* String encoded with explicit base constructor.
*/
LongInt(CSStr text, SQInteger fall);
LongInt(CSStr text, Uint32 base);
/* --------------------------------------------------------------------------------------------
* Copy constructor.
@ -470,41 +773,241 @@ public:
/* --------------------------------------------------------------------------------------------
* Adition operator.
*/
LongInt< Type > operator + (const LongInt< Type > & o) const
template < typename U > LongInt< Type > operator + (const LongInt< U > & o) const
{
return LongInt< Type >(m_Data + o.m_Data);
return LongInt< Type >(m_Data + ConvTo< Type >::From(o.GetNum()));
}
/* --------------------------------------------------------------------------------------------
* Subtraction operator.
*/
LongInt< Type > operator - (const LongInt< Type > & o) const
template < typename U > LongInt< Type > operator - (const LongInt< U > & o) const
{
return LongInt< Type >(m_Data - o.m_Data);
return LongInt< Type >(m_Data - ConvTo< Type >::From(o.GetNum()));
}
/* --------------------------------------------------------------------------------------------
* Multiplication operator.
*/
LongInt< Type > operator * (const LongInt< Type > & o) const
template < typename U > LongInt< Type > operator * (const LongInt< U > & o) const
{
return LongInt< Type >(m_Data * o.m_Data);
return LongInt< Type >(m_Data * ConvTo< Type >::From(o.GetNum()));
}
/* --------------------------------------------------------------------------------------------
* Division operator.
*/
LongInt< Type > operator / (const LongInt< Type > & o) const
template < typename U > LongInt< Type > operator / (const LongInt< U > & o) const
{
return LongInt< Type >(m_Data / o.m_Data);
return LongInt< Type >(m_Data / ConvTo< Type >::From(o.GetNum()));
}
/* --------------------------------------------------------------------------------------------
* Modulus operator.
*/
LongInt< Type > operator % (const LongInt< Type > & o) const
template < typename U > LongInt< Type > operator % (const LongInt< U > & o) const
{
return LongInt< Type >(m_Data % o.m_Data);
return LongInt< Type >(m_Data % ConvTo< Type >::From(o.GetNum()));
}
/* --------------------------------------------------------------------------------------------
* Adition operator.
*/
LongInt< Type > operator + (SQInteger s) const
{
return LongInt< Type >(m_Data + ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Subtraction operator.
*/
LongInt< Type > operator - (SQInteger s) const
{
return LongInt< Type >(m_Data - ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Multiplication operator.
*/
LongInt< Type > operator * (SQInteger s) const
{
return LongInt< Type >(m_Data * ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Division operator.
*/
LongInt< Type > operator / (SQInteger s) const
{
return LongInt< Type >(m_Data / ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Modulus operator.
*/
LongInt< Type > operator % (SQInteger s) const
{
return LongInt< Type >(m_Data % ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Adition operator.
*/
LongInt< Type > operator + (SQFloat s) const
{
return LongInt< Type >(m_Data + ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Subtraction operator.
*/
LongInt< Type > operator - (SQFloat s) const
{
return LongInt< Type >(m_Data - ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Multiplication operator.
*/
LongInt< Type > operator * (SQFloat s) const
{
return LongInt< Type >(m_Data * ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Division operator.
*/
LongInt< Type > operator / (SQFloat s) const
{
return LongInt< Type >(m_Data / ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Modulus operator.
*/
LongInt< Type > operator % (SQFloat s) const
{
return LongInt< Type >(m_Data % ConvTo< Type >::From(s));
}
/* --------------------------------------------------------------------------------------------
* Adition operator.
*/
LongInt< Type > operator + (bool s) const
{
return LongInt< Type >(m_Data + static_cast< Type >(s));
}
/* --------------------------------------------------------------------------------------------
* Subtraction operator.
*/
LongInt< Type > operator - (bool s) const
{
return LongInt< Type >(m_Data - static_cast< Type >(s));
}
/* --------------------------------------------------------------------------------------------
* Multiplication operator.
*/
LongInt< Type > operator * (bool s) const
{
return LongInt< Type >(m_Data * static_cast< Type >(s));
}
/* --------------------------------------------------------------------------------------------
* Division operator.
*/
LongInt< Type > operator / (bool s) const
{
return LongInt< Type >(m_Data / static_cast< Type >(s));
}
/* --------------------------------------------------------------------------------------------
* Modulus operator.
*/
LongInt< Type > operator % (bool s) const
{
return LongInt< Type >(m_Data % static_cast< Type >(s));
}
/* --------------------------------------------------------------------------------------------
* Adition operator.
*/
LongInt< Type > operator + (std::nullptr_t) const
{
return LongInt< Type >(m_Data + static_cast< Type >(0));
}
/* --------------------------------------------------------------------------------------------
* Subtraction operator.
*/
LongInt< Type > operator - (std::nullptr_t) const
{
return LongInt< Type >(m_Data - static_cast< Type >(0));
}
/* --------------------------------------------------------------------------------------------
* Multiplication operator.
*/
LongInt< Type > operator * (std::nullptr_t) const
{
return LongInt< Type >(m_Data * static_cast< Type >(0));
}
/* --------------------------------------------------------------------------------------------
* Division operator.
*/
LongInt< Type > operator / (std::nullptr_t) const
{
return LongInt< Type >(static_cast< Type >(0));
}
/* --------------------------------------------------------------------------------------------
* Modulus operator.
*/
LongInt< Type > operator % (std::nullptr_t) const
{
return LongInt< Type >(static_cast< Type >(0));
}
/* --------------------------------------------------------------------------------------------
* Adition operator.
*/
LongInt< Type > operator + (CSStr str) const
{
return LongInt< Type >(m_Data + ConvTo< Type >::From(str));
}
/* --------------------------------------------------------------------------------------------
* Subtraction operator.
*/
LongInt< Type > operator - (CSStr str) const
{
return LongInt< Type >(m_Data - ConvTo< Type >::From(str));
}
/* --------------------------------------------------------------------------------------------
* Multiplication operator.
*/
LongInt< Type > operator * (CSStr str) const
{
return LongInt< Type >(m_Data * ConvTo< Type >::From(str));
}
/* --------------------------------------------------------------------------------------------
* Division operator.
*/
LongInt< Type > operator / (CSStr str) const
{
return LongInt< Type >(m_Data / ConvTo< Type >::From(str));
}
/* --------------------------------------------------------------------------------------------
* Modulus operator.
*/
LongInt< Type > operator % (CSStr str) const
{
return LongInt< Type >(m_Data % ConvTo< Type >::From(str));
}
/* --------------------------------------------------------------------------------------------
@ -534,6 +1037,125 @@ public:
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to compare an instance of this type with another one.
*/
Int32 Cmp(const LongInt< Int64 > & o) const
{
const Type v = ConvTo< Type >::From(o.GetNum());
if (m_Data == v)
{
return 0;
}
else if (m_Data > v)
{
return 1;
}
else
{
return -1;
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to compare an instance of this type with a scalar value.
*/
Int32 Cmp(SQInteger s) const
{
if (m_Data == static_cast< Type >(s))
{
return 0;
}
else if (m_Data > static_cast< Type >(s))
{
return 1;
}
else
{
return -1;
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to compare an instance of this type with a scalar value.
*/
Int32 Cmp(SQFloat s) const
{
if (m_Data == static_cast< Type >(s))
{
return 0;
}
else if (m_Data > static_cast< Type >(s))
{
return 1;
}
else
{
return -1;
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to compare an instance of this type with a scalar value.
*/
Int32 Cmp(bool s) const
{
if (m_Data == static_cast< Type >(s))
{
return 0;
}
else if (m_Data > static_cast< Type >(s))
{
return 1;
}
else
{
return -1;
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to compare an instance of this type with a scalar value.
*/
Int32 Cmp(std::nullptr_t) const
{
if (m_Data == static_cast< Type >(0))
{
return 0;
}
else if (m_Data > static_cast< Type >(0))
{
return 1;
}
else
{
return -1;
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to compare an instance of this type with a scalar value.
*/
Int32 Cmp(CSStr str) const
{
const Type v = ConvTo< Type >::From(str);
if (m_Data == v)
{
return 0;
}
else if (m_Data > v)
{
return 1;
}
else
{
return -1;
}
}
/* --------------------------------------------------------------------------------------------
* Used by the script engine to convert an instance of this type to a string.
*/
@ -640,6 +1262,25 @@ public:
}
};
// ------------------------------------------------------------------------------------------------
inline Int32 LongInt< Int64 >::Cmp(const LongInt< Uint64 > & o) const
{
const Type v = ConvTo< Type >::From(o.GetNum());
if (m_Data == v)
{
return 0;
}
else if (m_Data > v)
{
return 1;
}
else
{
return -1;
}
}
// ------------------------------------------------------------------------------------------------
typedef LongInt< Int64 > SLongInt;
typedef LongInt< Uint64 > ULongInt;