640 lines
24 KiB
C++
640 lines
24 KiB
C++
#include <assert.h>
|
|
#include <sstream>
|
|
#include "scriptstdstring.h"
|
|
#include <string.h> // strstr
|
|
|
|
using namespace std;
|
|
|
|
BEGIN_AS_NAMESPACE
|
|
|
|
static void StringFactoryGeneric(asIScriptGeneric *gen) {
|
|
asUINT length = gen->GetArgDWord(0);
|
|
const char *s = (const char*)gen->GetArgAddress(1);
|
|
string str(s, length);
|
|
gen->SetReturnObject(&str);
|
|
}
|
|
|
|
static void ConstructStringGeneric(asIScriptGeneric * gen) {
|
|
new (gen->GetObject()) string();
|
|
}
|
|
|
|
static void CopyConstructStringGeneric(asIScriptGeneric * gen) {
|
|
string * a = static_cast<string *>(gen->GetArgObject(0));
|
|
new (gen->GetObject()) string(*a);
|
|
}
|
|
|
|
static void DestructStringGeneric(asIScriptGeneric * gen) {
|
|
string * ptr = static_cast<string *>(gen->GetObject());
|
|
ptr->~string();
|
|
}
|
|
|
|
static void AssignStringGeneric(asIScriptGeneric *gen) {
|
|
string * a = static_cast<string *>(gen->GetArgObject(0));
|
|
string * self = static_cast<string *>(gen->GetObject());
|
|
*self = *a;
|
|
gen->SetReturnAddress(self);
|
|
}
|
|
|
|
static void AddAssignStringGeneric(asIScriptGeneric *gen) {
|
|
string * a = static_cast<string *>(gen->GetArgObject(0));
|
|
string * self = static_cast<string *>(gen->GetObject());
|
|
*self += *a;
|
|
gen->SetReturnAddress(self);
|
|
}
|
|
|
|
static void StringEqualsGeneric(asIScriptGeneric * gen) {
|
|
string * a = static_cast<string *>(gen->GetObject());
|
|
string * b = static_cast<string *>(gen->GetArgAddress(0));
|
|
*(bool*)gen->GetAddressOfReturnLocation() = (*a == *b);
|
|
}
|
|
|
|
static void StringCmpGeneric(asIScriptGeneric * gen) {
|
|
string * a = static_cast<string *>(gen->GetObject());
|
|
string * b = static_cast<string *>(gen->GetArgAddress(0));
|
|
|
|
int cmp = 0;
|
|
if( *a < *b ) cmp = -1;
|
|
else if( *a > *b ) cmp = 1;
|
|
|
|
*(int*)gen->GetAddressOfReturnLocation() = cmp;
|
|
}
|
|
|
|
static void StringAddGeneric(asIScriptGeneric * gen) {
|
|
string * a = static_cast<string *>(gen->GetObject());
|
|
string * b = static_cast<string *>(gen->GetArgAddress(0));
|
|
string ret_val = *a + *b;
|
|
gen->SetReturnObject(&ret_val);
|
|
}
|
|
|
|
static void StringLengthGeneric(asIScriptGeneric * gen) {
|
|
string * self = static_cast<string *>(gen->GetObject());
|
|
*static_cast<asUINT *>(gen->GetAddressOfReturnLocation()) = (asUINT)self->length();
|
|
}
|
|
|
|
static void StringResizeGeneric(asIScriptGeneric * gen) {
|
|
string * self = static_cast<string *>(gen->GetObject());
|
|
self->resize(*static_cast<asUINT *>(gen->GetAddressOfArg(0)));
|
|
}
|
|
|
|
static void StringCharAtGeneric(asIScriptGeneric * gen) {
|
|
unsigned int index = gen->GetArgDWord(0);
|
|
string * self = static_cast<string *>(gen->GetObject());
|
|
|
|
if (index >= self->size()) {
|
|
// Set a script exception
|
|
asIScriptContext *ctx = asGetActiveContext();
|
|
ctx->SetException("Out of range");
|
|
|
|
gen->SetReturnAddress(0);
|
|
} else {
|
|
gen->SetReturnAddress(&(self->operator [](index)));
|
|
}
|
|
}
|
|
|
|
static void AssignInt2StringGeneric(asIScriptGeneric *gen)
|
|
{
|
|
int *a = static_cast<int*>(gen->GetAddressOfArg(0));
|
|
string *self = static_cast<string*>(gen->GetObject());
|
|
std::stringstream sstr;
|
|
sstr << *a;
|
|
*self = sstr.str();
|
|
gen->SetReturnAddress(self);
|
|
}
|
|
|
|
static void AssignUInt2StringGeneric(asIScriptGeneric *gen)
|
|
{
|
|
unsigned int *a = static_cast<unsigned int*>(gen->GetAddressOfArg(0));
|
|
string *self = static_cast<string*>(gen->GetObject());
|
|
std::stringstream sstr;
|
|
sstr << *a;
|
|
*self = sstr.str();
|
|
gen->SetReturnAddress(self);
|
|
}
|
|
|
|
static void AssignDouble2StringGeneric(asIScriptGeneric *gen)
|
|
{
|
|
double *a = static_cast<double*>(gen->GetAddressOfArg(0));
|
|
string *self = static_cast<string*>(gen->GetObject());
|
|
std::stringstream sstr;
|
|
sstr << *a;
|
|
*self = sstr.str();
|
|
gen->SetReturnAddress(self);
|
|
}
|
|
|
|
static void AssignBool2StringGeneric(asIScriptGeneric *gen)
|
|
{
|
|
bool *a = static_cast<bool*>(gen->GetAddressOfArg(0));
|
|
string *self = static_cast<string*>(gen->GetObject());
|
|
std::stringstream sstr;
|
|
sstr << (*a ? "true" : "false");
|
|
*self = sstr.str();
|
|
gen->SetReturnAddress(self);
|
|
}
|
|
|
|
static void AddAssignDouble2StringGeneric(asIScriptGeneric * gen) {
|
|
double * a = static_cast<double *>(gen->GetAddressOfArg(0));
|
|
string * self = static_cast<string *>(gen->GetObject());
|
|
std::stringstream sstr;
|
|
sstr << *a;
|
|
*self += sstr.str();
|
|
gen->SetReturnAddress(self);
|
|
}
|
|
|
|
static void AddAssignInt2StringGeneric(asIScriptGeneric * gen) {
|
|
int * a = static_cast<int *>(gen->GetAddressOfArg(0));
|
|
string * self = static_cast<string *>(gen->GetObject());
|
|
std::stringstream sstr;
|
|
sstr << *a;
|
|
*self += sstr.str();
|
|
gen->SetReturnAddress(self);
|
|
}
|
|
|
|
static void AddAssignUInt2StringGeneric(asIScriptGeneric * gen) {
|
|
unsigned int * a = static_cast<unsigned int *>(gen->GetAddressOfArg(0));
|
|
string * self = static_cast<string *>(gen->GetObject());
|
|
std::stringstream sstr;
|
|
sstr << *a;
|
|
*self += sstr.str();
|
|
gen->SetReturnAddress(self);
|
|
}
|
|
|
|
static void AddAssignBool2StringGeneric(asIScriptGeneric * gen) {
|
|
bool * a = static_cast<bool *>(gen->GetAddressOfArg(0));
|
|
string * self = static_cast<string *>(gen->GetObject());
|
|
std::stringstream sstr;
|
|
sstr << (*a ? "true" : "false");
|
|
*self += sstr.str();
|
|
gen->SetReturnAddress(self);
|
|
}
|
|
|
|
static void AddString2DoubleGeneric(asIScriptGeneric * gen) {
|
|
string * a = static_cast<string *>(gen->GetObject());
|
|
double * b = static_cast<double *>(gen->GetAddressOfArg(0));
|
|
std::stringstream sstr;
|
|
sstr << *a << *b;
|
|
std::string ret_val = sstr.str();
|
|
gen->SetReturnObject(&ret_val);
|
|
}
|
|
|
|
static void AddString2IntGeneric(asIScriptGeneric * gen) {
|
|
string * a = static_cast<string *>(gen->GetObject());
|
|
int * b = static_cast<int *>(gen->GetAddressOfArg(0));
|
|
std::stringstream sstr;
|
|
sstr << *a << *b;
|
|
std::string ret_val = sstr.str();
|
|
gen->SetReturnObject(&ret_val);
|
|
}
|
|
|
|
static void AddString2UIntGeneric(asIScriptGeneric * gen) {
|
|
string * a = static_cast<string *>(gen->GetObject());
|
|
unsigned int * b = static_cast<unsigned int *>(gen->GetAddressOfArg(0));
|
|
std::stringstream sstr;
|
|
sstr << *a << *b;
|
|
std::string ret_val = sstr.str();
|
|
gen->SetReturnObject(&ret_val);
|
|
}
|
|
|
|
static void AddString2BoolGeneric(asIScriptGeneric * gen) {
|
|
string * a = static_cast<string *>(gen->GetObject());
|
|
bool * b = static_cast<bool *>(gen->GetAddressOfArg(0));
|
|
std::stringstream sstr;
|
|
sstr << *a << (*b ? "true" : "false");
|
|
std::string ret_val = sstr.str();
|
|
gen->SetReturnObject(&ret_val);
|
|
}
|
|
|
|
static void AddDouble2StringGeneric(asIScriptGeneric * gen) {
|
|
double* a = static_cast<double *>(gen->GetAddressOfArg(0));
|
|
string * b = static_cast<string *>(gen->GetObject());
|
|
std::stringstream sstr;
|
|
sstr << *a << *b;
|
|
std::string ret_val = sstr.str();
|
|
gen->SetReturnObject(&ret_val);
|
|
}
|
|
|
|
static void AddInt2StringGeneric(asIScriptGeneric * gen) {
|
|
int* a = static_cast<int *>(gen->GetAddressOfArg(0));
|
|
string * b = static_cast<string *>(gen->GetObject());
|
|
std::stringstream sstr;
|
|
sstr << *a << *b;
|
|
std::string ret_val = sstr.str();
|
|
gen->SetReturnObject(&ret_val);
|
|
}
|
|
|
|
static void AddUInt2StringGeneric(asIScriptGeneric * gen) {
|
|
unsigned int* a = static_cast<unsigned int *>(gen->GetAddressOfArg(0));
|
|
string * b = static_cast<string *>(gen->GetObject());
|
|
std::stringstream sstr;
|
|
sstr << *a << *b;
|
|
std::string ret_val = sstr.str();
|
|
gen->SetReturnObject(&ret_val);
|
|
}
|
|
|
|
static void AddBool2StringGeneric(asIScriptGeneric * gen) {
|
|
bool* a = static_cast<bool *>(gen->GetAddressOfArg(0));
|
|
string * b = static_cast<string *>(gen->GetObject());
|
|
std::stringstream sstr;
|
|
sstr << (*a ? "true" : "false") << *b;
|
|
std::string ret_val = sstr.str();
|
|
gen->SetReturnObject(&ret_val);
|
|
}
|
|
|
|
// This function returns a string containing the substring of the input string
|
|
// determined by the starting index and count of characters.
|
|
//
|
|
// AngelScript signature:
|
|
// string string::substr(uint start = 0, int count = -1) const
|
|
static void StringSubString_Generic(asIScriptGeneric *gen)
|
|
{
|
|
// Get the arguments
|
|
string *str = (string*)gen->GetObject();
|
|
asUINT start = *(int*)gen->GetAddressOfArg(0);
|
|
int count = *(int*)gen->GetAddressOfArg(1);
|
|
|
|
// Check for out-of-bounds
|
|
string ret;
|
|
if( start < str->length() && count != 0 )
|
|
ret = str->substr(start, count);
|
|
|
|
// Return the substring
|
|
new(gen->GetAddressOfReturnLocation()) string(ret);
|
|
}
|
|
|
|
void RegisterStdString_Generic(asIScriptEngine *engine)
|
|
{
|
|
int r;
|
|
|
|
// Register the string type
|
|
r = engine->RegisterObjectType("string", sizeof(string), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); assert( r >= 0 );
|
|
|
|
// Register the string factory
|
|
r = engine->RegisterStringFactory("string", asFUNCTION(StringFactoryGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
|
|
// Register the object operator overloads
|
|
r = engine->RegisterObjectBehaviour("string", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(ConstructStringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectBehaviour("string", asBEHAVE_CONSTRUCT, "void f(const string &in)", asFUNCTION(CopyConstructStringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectBehaviour("string", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(DestructStringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string &opAssign(const string &in)", asFUNCTION(AssignStringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string &opAddAssign(const string &in)", asFUNCTION(AddAssignStringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
|
|
r = engine->RegisterObjectMethod("string", "bool opEquals(const string &in) const", asFUNCTION(StringEqualsGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "int opCmp(const string &in) const", asFUNCTION(StringCmpGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd(const string &in) const", asFUNCTION(StringAddGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
|
|
// Register the object methods
|
|
r = engine->RegisterObjectMethod("string", "uint length() const", asFUNCTION(StringLengthGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "void resize(uint)", asFUNCTION(StringResizeGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
|
|
// Register the index operator, both as a mutator and as an inspector
|
|
r = engine->RegisterObjectMethod("string", "uint8 &opIndex(uint)", asFUNCTION(StringCharAtGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "const uint8 &opIndex(uint) const", asFUNCTION(StringCharAtGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
|
|
// Automatic conversion from values
|
|
r = engine->RegisterObjectMethod("string", "string &opAssign(double)", asFUNCTION(AssignDouble2StringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string &opAddAssign(double)", asFUNCTION(AddAssignDouble2StringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd(double) const", asFUNCTION(AddString2DoubleGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd_r(double) const", asFUNCTION(AddDouble2StringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
|
|
r = engine->RegisterObjectMethod("string", "string &opAssign(int)", asFUNCTION(AssignInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string &opAddAssign(int)", asFUNCTION(AddAssignInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd(int) const", asFUNCTION(AddString2IntGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd_r(int) const", asFUNCTION(AddInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
|
|
r = engine->RegisterObjectMethod("string", "string &opAssign(uint)", asFUNCTION(AssignUInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string &opAddAssign(uint)", asFUNCTION(AddAssignUInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd(uint) const", asFUNCTION(AddString2UIntGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd_r(uint) const", asFUNCTION(AddUInt2StringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
|
|
r = engine->RegisterObjectMethod("string", "string &opAssign(bool)", asFUNCTION(AssignBool2StringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string &opAddAssign(bool)", asFUNCTION(AddAssignBool2StringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd(bool) const", asFUNCTION(AddString2BoolGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd_r(bool) const", asFUNCTION(AddBool2StringGeneric), asCALL_GENERIC); assert( r >= 0 );
|
|
|
|
r = engine->RegisterObjectMethod("string", "string substr(uint start = 0, int count = -1) const", asFUNCTION(StringSubString_Generic), asCALL_GENERIC); assert( r >= 0 );
|
|
}
|
|
|
|
static string StringFactory(asUINT length, const char *s)
|
|
{
|
|
return string(s, length);
|
|
}
|
|
|
|
static void ConstructString(string *thisPointer)
|
|
{
|
|
new(thisPointer) string();
|
|
}
|
|
|
|
static void CopyConstructString(const string &other, string *thisPointer)
|
|
{
|
|
new(thisPointer) string(other);
|
|
}
|
|
|
|
static void DestructString(string *thisPointer)
|
|
{
|
|
thisPointer->~string();
|
|
}
|
|
|
|
static string &AssignUIntToString(unsigned int i, string &dest)
|
|
{
|
|
ostringstream stream;
|
|
stream << i;
|
|
dest = stream.str();
|
|
return dest;
|
|
}
|
|
|
|
static string &AddAssignUIntToString(unsigned int i, string &dest)
|
|
{
|
|
ostringstream stream;
|
|
stream << i;
|
|
dest += stream.str();
|
|
return dest;
|
|
}
|
|
|
|
static string AddStringUInt(const string &str, unsigned int i)
|
|
{
|
|
ostringstream stream;
|
|
stream << i;
|
|
return str + stream.str();
|
|
}
|
|
|
|
static string AddStringUInt64(const string &str, unsigned long long i)
|
|
{
|
|
ostringstream stream;
|
|
stream << i;
|
|
return str + stream.str();
|
|
}
|
|
|
|
static string AddIntString(int i, const string &str)
|
|
{
|
|
ostringstream stream;
|
|
stream << i;
|
|
return stream.str() + str;
|
|
}
|
|
|
|
static string AddInt64String(long long i, const string &str)
|
|
{
|
|
ostringstream stream;
|
|
stream << i;
|
|
return stream.str() + str;
|
|
}
|
|
|
|
static string &AssignIntToString(int i, string &dest)
|
|
{
|
|
ostringstream stream;
|
|
stream << i;
|
|
dest = stream.str();
|
|
return dest;
|
|
}
|
|
|
|
static string &AddAssignIntToString(int i, string &dest)
|
|
{
|
|
ostringstream stream;
|
|
stream << i;
|
|
dest += stream.str();
|
|
return dest;
|
|
}
|
|
|
|
static string AddStringInt(const string &str, int i)
|
|
{
|
|
ostringstream stream;
|
|
stream << i;
|
|
return str + stream.str();
|
|
}
|
|
|
|
static string AddStringInt64(const string &str, long long i)
|
|
{
|
|
ostringstream stream;
|
|
stream << i;
|
|
return str + stream.str();
|
|
}
|
|
|
|
static string AddUIntString(unsigned int i, const string &str)
|
|
{
|
|
ostringstream stream;
|
|
stream << i;
|
|
return stream.str() + str;
|
|
}
|
|
|
|
static string AddUInt64String(unsigned long long i, const string &str)
|
|
{
|
|
ostringstream stream;
|
|
stream << i;
|
|
return stream.str() + str;
|
|
}
|
|
|
|
static string &AssignDoubleToString(double f, string &dest)
|
|
{
|
|
ostringstream stream;
|
|
stream << f;
|
|
dest = stream.str();
|
|
return dest;
|
|
}
|
|
|
|
static string &AddAssignDoubleToString(double f, string &dest)
|
|
{
|
|
ostringstream stream;
|
|
stream << f;
|
|
dest += stream.str();
|
|
return dest;
|
|
}
|
|
|
|
static string &AssignBoolToString(bool b, string &dest)
|
|
{
|
|
ostringstream stream;
|
|
stream << (b ? "true" : "false");
|
|
dest = stream.str();
|
|
return dest;
|
|
}
|
|
|
|
static string &AddAssignBoolToString(bool b, string &dest)
|
|
{
|
|
ostringstream stream;
|
|
stream << (b ? "true" : "false");
|
|
dest += stream.str();
|
|
return dest;
|
|
}
|
|
|
|
static string AddStringDouble(const string &str, double f)
|
|
{
|
|
ostringstream stream;
|
|
stream << f;
|
|
return str + stream.str();
|
|
}
|
|
|
|
static string AddDoubleString(double f, const string &str)
|
|
{
|
|
ostringstream stream;
|
|
stream << f;
|
|
return stream.str() + str;
|
|
}
|
|
|
|
static string AddStringBool(const string &str, bool b)
|
|
{
|
|
ostringstream stream;
|
|
stream << (b ? "true" : "false");
|
|
return str + stream.str();
|
|
}
|
|
|
|
static string AddBoolString(bool b, const string &str)
|
|
{
|
|
ostringstream stream;
|
|
stream << (b ? "true" : "false");
|
|
return stream.str() + str;
|
|
}
|
|
|
|
static char *StringCharAt(unsigned int i, string &str)
|
|
{
|
|
if( i >= str.size() )
|
|
{
|
|
// Set a script exception
|
|
asIScriptContext *ctx = asGetActiveContext();
|
|
ctx->SetException("Out of range");
|
|
|
|
// Return a null pointer
|
|
return 0;
|
|
}
|
|
|
|
return &str[i];
|
|
}
|
|
|
|
|
|
// AngelScript signature:
|
|
// int string::opCmp(const string &in) const
|
|
static int StringCmp(const string &a, const string &b)
|
|
{
|
|
int cmp = 0;
|
|
if( a < b ) cmp = -1;
|
|
else if( a > b ) cmp = 1;
|
|
return cmp;
|
|
}
|
|
|
|
static bool StringEq(const string &a, const string &b) {
|
|
return a == b;
|
|
}
|
|
|
|
// This function returns the index of the first position where the substring
|
|
// exists in the input string. If the substring doesn't exist in the input
|
|
// string -1 is returned.
|
|
//
|
|
// AngelScript signature:
|
|
// int string::findFirst(const string &in sub, uint start = 0) const
|
|
static int StringFindFirst(const string &sub, asUINT start, const string &str)
|
|
{
|
|
// We don't register the method directly because the argument types change between 32bit and 64bit platforms
|
|
return (int)str.find(sub, start);
|
|
}
|
|
|
|
// This function returns the index of the last position where the substring
|
|
// exists in the input string. If the substring doesn't exist in the input
|
|
// string -1 is returned.
|
|
//
|
|
// AngelScript signature:
|
|
// int string::findLast(const string &in sub, int start = -1) const
|
|
static int StringFindLast(const string &sub, int start, const string &str)
|
|
{
|
|
// We don't register the method directly because the argument types change between 32bit and 64bit platforms
|
|
return (int)str.rfind(sub, (size_t)start);
|
|
}
|
|
|
|
// AngelScript signature:
|
|
// uint string::length() const
|
|
static asUINT StringLength(const string &str)
|
|
{
|
|
// We don't register the method directly because the return type changes between 32bit and 64bit platforms
|
|
return (asUINT)str.length();
|
|
}
|
|
|
|
|
|
// AngelScript signature:
|
|
// void string::resize(uint l)
|
|
static void StringResize(asUINT l, string &str)
|
|
{
|
|
// We don't register the method directly because the argument types change between 32bit and 64bit platforms
|
|
str.resize(l);
|
|
}
|
|
|
|
|
|
void RegisterStdString_Native(asIScriptEngine *engine)
|
|
{
|
|
int r;
|
|
|
|
// Register the string type
|
|
r = engine->RegisterObjectType("string", sizeof(string), asOBJ_VALUE | asOBJ_APP_CLASS_CDAK); assert( r >= 0 );
|
|
|
|
// Register the string factory
|
|
r = engine->RegisterStringFactory("string", asFUNCTION(StringFactory), asCALL_CDECL); assert( r >= 0 );
|
|
|
|
// Register the object operator overloads
|
|
r = engine->RegisterObjectBehaviour("string", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(ConstructString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectBehaviour("string", asBEHAVE_CONSTRUCT, "void f(const string &in)", asFUNCTION(CopyConstructString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectBehaviour("string", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(DestructString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string &opAssign(const string &in)", asMETHODPR(string, operator =, (const string&), string&), asCALL_THISCALL); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string &opAddAssign(const string &in)", asMETHODPR(string, operator+=, (const string&), string&), asCALL_THISCALL); assert( r >= 0 );
|
|
|
|
r = engine->RegisterObjectMethod("string", "bool opEquals(const string &in) const", asFUNCTION(StringEq), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "int opCmp(const string &in) const", asFUNCTION(StringCmp), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd(const string &in) const", asFUNCTIONPR(operator +, (const string &, const string &), string), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
|
|
|
|
// Register the object methods
|
|
r = engine->RegisterObjectMethod("string", "uint length() const", asFUNCTION(StringLength), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "uint get_length() const", asFUNCTION(StringLength), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "void resize(uint)", asFUNCTION(StringResize), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
|
|
// Register the index operator, both as a mutator and as an inspector
|
|
// Note that we don't register the operator[] directory, as it doesn't do bounds checking
|
|
r = engine->RegisterObjectMethod("string", "uint8 &opIndex(uint)", asFUNCTION(StringCharAt), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "const uint8 &opIndex(uint) const", asFUNCTION(StringCharAt), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
|
|
// Automatic conversion from values
|
|
r = engine->RegisterObjectMethod("string", "string &opAssign(double)", asFUNCTION(AssignDoubleToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string &opAddAssign(double)", asFUNCTION(AddAssignDoubleToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd(double) const", asFUNCTION(AddStringDouble), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd_r(double) const", asFUNCTION(AddDoubleString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
|
|
r = engine->RegisterObjectMethod("string", "string &opAssign(int)", asFUNCTION(AssignIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string &opAddAssign(int)", asFUNCTION(AddAssignIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd(int64) const", asFUNCTION(AddStringInt64), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd_r(int64) const", asFUNCTION(AddInt64String), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
|
|
r = engine->RegisterObjectMethod("string", "string &opAssign(uint)", asFUNCTION(AssignUIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string &opAddAssign(uint)", asFUNCTION(AddAssignUIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd(uint64) const", asFUNCTION(AddStringUInt64), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd_r(uint64) const", asFUNCTION(AddUInt64String), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
|
|
r = engine->RegisterObjectMethod("string", "string &opAssign(bool)", asFUNCTION(AssignBoolToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string &opAddAssign(bool)", asFUNCTION(AddAssignBoolToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd(bool) const", asFUNCTION(AddStringBool), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "string opAdd_r(bool) const", asFUNCTION(AddBoolString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
|
|
r = engine->RegisterObjectMethod("string", "string substr(uint start = 0, int count = -1) const", asFUNCTION(StringSubString_Generic), asCALL_GENERIC); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "int findFirst(const string &in, uint start = 0) const", asFUNCTION(StringFindFirst), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
r = engine->RegisterObjectMethod("string", "int findLast(const string &in, int start = -1) const", asFUNCTION(StringFindLast), asCALL_CDECL_OBJLAST); assert( r >= 0 );
|
|
|
|
// TODO: Implement the following
|
|
// findFirstOf
|
|
// findLastOf
|
|
// findFirstNotOf
|
|
// findLastNotOf
|
|
// parseInt
|
|
// parseFloat
|
|
// formatInt - maybe as string::string(int64 value, const string &in format)
|
|
// formatFloat
|
|
// replace - replaces a text found in the string
|
|
// replaceRange - replaces a range of bytes in the string
|
|
// trim
|
|
// multiply/times - takes the string and multiplies it n times, e.g. "-".multiply(5) returns "-----"
|
|
}
|
|
|
|
void RegisterStdString(asIScriptEngine * engine)
|
|
{
|
|
if (strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY"))
|
|
RegisterStdString_Generic(engine);
|
|
else
|
|
RegisterStdString_Native(engine);
|
|
}
|
|
|
|
END_AS_NAMESPACE
|
|
|
|
|
|
|
|
|