/xbmc/visualizations/Vortex/angelscript/add_on/scriptstring/scriptstring.cpp

https://github.com/MaDDoGo/xbmc · C++ · 705 lines · 521 code · 115 blank · 69 comment · 20 complexity · d2b04fa352a85c8c354e555c8aed1e40 MD5 · raw file

  1. #include <assert.h>
  2. #include <string.h> // strstr
  3. #include <stdio.h> // sprintf
  4. #include "scriptstring.h"
  5. using namespace std;
  6. BEGIN_AS_NAMESPACE
  7. //--------------
  8. // constructors
  9. //--------------
  10. CScriptString::CScriptString()
  11. {
  12. // Count the first reference
  13. refCount = 1;
  14. }
  15. CScriptString::CScriptString(const char *s, unsigned int len)
  16. {
  17. refCount = 1;
  18. buffer.assign(s, len);
  19. }
  20. CScriptString::CScriptString(const string &s)
  21. {
  22. refCount = 1;
  23. buffer = s;
  24. }
  25. CScriptString::CScriptString(const CScriptString &s)
  26. {
  27. refCount = 1;
  28. buffer = s.buffer;
  29. }
  30. CScriptString::~CScriptString()
  31. {
  32. assert( refCount == 0 );
  33. }
  34. //--------------------
  35. // reference counting
  36. //--------------------
  37. void CScriptString::AddRef()
  38. {
  39. refCount++;
  40. }
  41. static void StringAddRef_Generic(asIScriptGeneric *gen)
  42. {
  43. CScriptString *thisPointer = (CScriptString*)gen->GetObject();
  44. thisPointer->AddRef();
  45. }
  46. void CScriptString::Release()
  47. {
  48. if( --refCount == 0 )
  49. delete this;
  50. }
  51. static void StringRelease_Generic(asIScriptGeneric *gen)
  52. {
  53. CScriptString *thisPointer = (CScriptString*)gen->GetObject();
  54. thisPointer->Release();
  55. }
  56. //-----------------
  57. // string = string
  58. //-----------------
  59. CScriptString &CScriptString::operator=(const CScriptString &other)
  60. {
  61. // Copy only the buffer, not the reference counter
  62. buffer = other.buffer;
  63. // Return a reference to this object
  64. return *this;
  65. }
  66. static void AssignString_Generic(asIScriptGeneric *gen)
  67. {
  68. CScriptString *a = (CScriptString*)gen->GetArgAddress(0);
  69. CScriptString *thisPointer = (CScriptString*)gen->GetObject();
  70. *thisPointer = *a;
  71. gen->SetReturnAddress(thisPointer);
  72. }
  73. //------------------
  74. // string += string
  75. //------------------
  76. CScriptString &CScriptString::operator+=(const CScriptString &other)
  77. {
  78. buffer += other.buffer;
  79. return *this;
  80. }
  81. static void AddAssignString_Generic(asIScriptGeneric *gen)
  82. {
  83. CScriptString *a = (CScriptString*)gen->GetArgAddress(0);
  84. CScriptString *thisPointer = (CScriptString*)gen->GetObject();
  85. *thisPointer += *a;
  86. gen->SetReturnAddress(thisPointer);
  87. }
  88. //-----------------
  89. // string opCmp string
  90. //-----------------
  91. static int StringCmp(const string &a, const string &b)
  92. {
  93. int cmp = 0;
  94. if( a < b ) cmp = -1;
  95. else if( a > b ) cmp = 1;
  96. return cmp;
  97. }
  98. static void StringCmp_Generic(asIScriptGeneric * gen)
  99. {
  100. string * a = static_cast<string *>(gen->GetObject());
  101. string * b = static_cast<string *>(gen->GetArgAddress(0));
  102. int cmp = 0;
  103. if( *a < *b ) cmp = -1;
  104. else if( *a > *b ) cmp = 1;
  105. *(int*)gen->GetAddressOfReturnLocation() = cmp;
  106. }
  107. //-----------------
  108. // string + string
  109. //-----------------
  110. CScriptString *operator+(const CScriptString &a, const CScriptString &b)
  111. {
  112. // Return a new object as a script handle
  113. CScriptString *str = new CScriptString();
  114. // Avoid unnecessary memory copying by first reserving the full memory buffer, then concatenating
  115. str->buffer.reserve(a.buffer.length() + b.buffer.length());
  116. str->buffer += a.buffer;
  117. str->buffer += b.buffer;
  118. return str;
  119. }
  120. static void ConcatenateStrings_Generic(asIScriptGeneric *gen)
  121. {
  122. CScriptString *a = (CScriptString*)gen->GetObject();
  123. CScriptString *b = (CScriptString*)gen->GetArgAddress(0);
  124. CScriptString *out = *a + *b;
  125. gen->SetReturnAddress(out);
  126. }
  127. //----------------
  128. // string = value
  129. //----------------
  130. static CScriptString &AssignUIntToString(unsigned int i, CScriptString &dest)
  131. {
  132. char buf[100];
  133. sprintf(buf, "%u", i);
  134. dest.buffer = buf;
  135. return dest;
  136. }
  137. static void AssignUIntToString_Generic(asIScriptGeneric *gen)
  138. {
  139. unsigned int i = gen->GetArgDWord(0);
  140. CScriptString *thisPointer = (CScriptString*)gen->GetObject();
  141. AssignUIntToString(i, *thisPointer);
  142. gen->SetReturnAddress(thisPointer);
  143. }
  144. static CScriptString &AssignIntToString(int i, CScriptString &dest)
  145. {
  146. char buf[100];
  147. sprintf(buf, "%d", i);
  148. dest.buffer = buf;
  149. return dest;
  150. }
  151. static void AssignIntToString_Generic(asIScriptGeneric *gen)
  152. {
  153. int i = gen->GetArgDWord(0);
  154. CScriptString *thisPointer = (CScriptString*)gen->GetObject();
  155. AssignIntToString(i, *thisPointer);
  156. gen->SetReturnAddress(thisPointer);
  157. }
  158. static CScriptString &AssignFloatToString(float f, CScriptString &dest)
  159. {
  160. char buf[100];
  161. sprintf(buf, "%g", f);
  162. dest.buffer = buf;
  163. return dest;
  164. }
  165. static void AssignFloatToString_Generic(asIScriptGeneric *gen)
  166. {
  167. float f = gen->GetArgFloat(0);
  168. CScriptString *thisPointer = (CScriptString*)gen->GetObject();
  169. AssignFloatToString(f, *thisPointer);
  170. gen->SetReturnAddress(thisPointer);
  171. }
  172. static CScriptString &AssignDoubleToString(double f, CScriptString &dest)
  173. {
  174. char buf[100];
  175. sprintf(buf, "%g", f);
  176. dest.buffer = buf;
  177. return dest;
  178. }
  179. static void AssignDoubleToString_Generic(asIScriptGeneric *gen)
  180. {
  181. double f = gen->GetArgDouble(0);
  182. CScriptString *thisPointer = (CScriptString*)gen->GetObject();
  183. AssignDoubleToString(f, *thisPointer);
  184. gen->SetReturnAddress(thisPointer);
  185. }
  186. //-----------------
  187. // string += value
  188. //-----------------
  189. static CScriptString &AddAssignUIntToString(unsigned int i, CScriptString &dest)
  190. {
  191. char buf[100];
  192. sprintf(buf, "%u", i);
  193. dest.buffer += buf;
  194. return dest;
  195. }
  196. static void AddAssignUIntToString_Generic(asIScriptGeneric *gen)
  197. {
  198. unsigned int i = gen->GetArgDWord(0);
  199. CScriptString *thisPointer = (CScriptString*)gen->GetObject();
  200. AddAssignUIntToString(i, *thisPointer);
  201. gen->SetReturnAddress(thisPointer);
  202. }
  203. static CScriptString &AddAssignIntToString(int i, CScriptString &dest)
  204. {
  205. char buf[100];
  206. sprintf(buf, "%d", i);
  207. dest.buffer += buf;
  208. return dest;
  209. }
  210. static void AddAssignIntToString_Generic(asIScriptGeneric *gen)
  211. {
  212. int i = gen->GetArgDWord(0);
  213. CScriptString *thisPointer = (CScriptString*)gen->GetObject();
  214. AddAssignIntToString(i, *thisPointer);
  215. gen->SetReturnAddress(thisPointer);
  216. }
  217. static CScriptString &AddAssignFloatToString(float f, CScriptString &dest)
  218. {
  219. char buf[100];
  220. sprintf(buf, "%g", f);
  221. dest.buffer += buf;
  222. return dest;
  223. }
  224. static void AddAssignFloatToString_Generic(asIScriptGeneric *gen)
  225. {
  226. float f = gen->GetArgFloat(0);
  227. CScriptString *thisPointer = (CScriptString*)gen->GetObject();
  228. AddAssignFloatToString(f, *thisPointer);
  229. gen->SetReturnAddress(thisPointer);
  230. }
  231. static CScriptString &AddAssignDoubleToString(double f, CScriptString &dest)
  232. {
  233. char buf[100];
  234. sprintf(buf, "%g", f);
  235. dest.buffer += buf;
  236. return dest;
  237. }
  238. static void AddAssignDoubleToString_Generic(asIScriptGeneric *gen)
  239. {
  240. double f = gen->GetArgDouble(0);
  241. CScriptString *thisPointer = (CScriptString*)gen->GetObject();
  242. AddAssignDoubleToString(f, *thisPointer);
  243. gen->SetReturnAddress(thisPointer);
  244. }
  245. //----------------
  246. // string + value
  247. //----------------
  248. static CScriptString *AddStringUInt(const CScriptString &str, unsigned int i)
  249. {
  250. char buf[100];
  251. sprintf(buf, "%u", i);
  252. return new CScriptString(str.buffer + buf);
  253. }
  254. static void AddStringUInt_Generic(asIScriptGeneric *gen)
  255. {
  256. CScriptString *str = (CScriptString*)gen->GetObject();
  257. unsigned int i = gen->GetArgDWord(0);
  258. CScriptString *out = AddStringUInt(*str, i);
  259. gen->SetReturnAddress(out);
  260. }
  261. static CScriptString *AddStringInt(const CScriptString &str, int i)
  262. {
  263. char buf[100];
  264. sprintf(buf, "%d", i);
  265. return new CScriptString(str.buffer + buf);
  266. }
  267. static void AddStringInt_Generic(asIScriptGeneric *gen)
  268. {
  269. CScriptString *str = (CScriptString*)gen->GetObject();
  270. int i = gen->GetArgDWord(0);
  271. CScriptString *out = AddStringInt(*str, i);
  272. gen->SetReturnAddress(out);
  273. }
  274. static CScriptString *AddStringFloat(const CScriptString &str, float f)
  275. {
  276. char buf[100];
  277. sprintf(buf, "%g", f);
  278. return new CScriptString(str.buffer + buf);
  279. }
  280. static void AddStringFloat_Generic(asIScriptGeneric *gen)
  281. {
  282. CScriptString *str = (CScriptString*)gen->GetObject();
  283. float f = gen->GetArgFloat(0);
  284. CScriptString *out = AddStringFloat(*str, f);
  285. gen->SetReturnAddress(out);
  286. }
  287. static CScriptString *AddStringDouble(const CScriptString &str, double f)
  288. {
  289. char buf[100];
  290. sprintf(buf, "%g", f);
  291. return new CScriptString(str.buffer + buf);
  292. }
  293. static void AddStringDouble_Generic(asIScriptGeneric *gen)
  294. {
  295. CScriptString *str = (CScriptString*)gen->GetObject();
  296. double f = gen->GetArgDouble(0);
  297. CScriptString *out = AddStringDouble(*str, f);
  298. gen->SetReturnAddress(out);
  299. }
  300. //----------------
  301. // value + string
  302. //----------------
  303. static CScriptString *AddIntString(int i, const CScriptString &str)
  304. {
  305. char buf[100];
  306. sprintf(buf, "%d", i);
  307. return new CScriptString(buf + str.buffer);
  308. }
  309. static void AddIntString_Generic(asIScriptGeneric *gen)
  310. {
  311. int i = gen->GetArgDWord(0);
  312. CScriptString *str = (CScriptString*)gen->GetObject();
  313. CScriptString *out = AddIntString(i, *str);
  314. gen->SetReturnAddress(out);
  315. }
  316. static CScriptString *AddUIntString(unsigned int i, const CScriptString &str)
  317. {
  318. char buf[100];
  319. sprintf(buf, "%u", i);
  320. return new CScriptString(buf + str.buffer);
  321. }
  322. static void AddUIntString_Generic(asIScriptGeneric *gen)
  323. {
  324. unsigned int i = gen->GetArgDWord(0);
  325. CScriptString *str = (CScriptString*)gen->GetObject();
  326. CScriptString *out = AddUIntString(i, *str);
  327. gen->SetReturnAddress(out);
  328. }
  329. static CScriptString *AddFloatString(float f, const CScriptString &str)
  330. {
  331. char buf[100];
  332. sprintf(buf, "%g", f);
  333. return new CScriptString(buf + str.buffer);
  334. }
  335. static void AddFloatString_Generic(asIScriptGeneric *gen)
  336. {
  337. float f = gen->GetArgFloat(0);
  338. CScriptString *str = (CScriptString*)gen->GetObject();
  339. CScriptString *out = AddFloatString(f, *str);
  340. gen->SetReturnAddress(out);
  341. }
  342. static CScriptString *AddDoubleString(double f, const CScriptString &str)
  343. {
  344. char buf[100];
  345. sprintf(buf, "%g", f);
  346. return new CScriptString(buf + str.buffer);
  347. }
  348. static void AddDoubleString_Generic(asIScriptGeneric *gen)
  349. {
  350. double f = gen->GetArgDouble(0);
  351. CScriptString *str = (CScriptString*)gen->GetObject();
  352. CScriptString *out = AddDoubleString(f, *str);
  353. gen->SetReturnAddress(out);
  354. }
  355. //----------
  356. // string[]
  357. //----------
  358. static char *StringCharAt(unsigned int i, CScriptString &str)
  359. {
  360. if( i >= str.buffer.size() )
  361. {
  362. // Set a script exception
  363. asIScriptContext *ctx = asGetActiveContext();
  364. ctx->SetException("Out of range");
  365. // Return a null pointer
  366. return 0;
  367. }
  368. return &str.buffer[i];
  369. }
  370. static void StringCharAt_Generic(asIScriptGeneric *gen)
  371. {
  372. unsigned int i = gen->GetArgDWord(0);
  373. CScriptString *str = (CScriptString*)gen->GetObject();
  374. char *ch = StringCharAt(i, *str);
  375. gen->SetReturnAddress(ch);
  376. }
  377. //-----------------------
  378. // AngelScript functions
  379. //-----------------------
  380. // This is the string factory that creates new strings for the script based on string literals
  381. static CScriptString *StringFactory(asUINT length, const char *s)
  382. {
  383. return new CScriptString(s, length);
  384. }
  385. static void StringFactory_Generic(asIScriptGeneric *gen)
  386. {
  387. asUINT length = gen->GetArgDWord(0);
  388. const char *s = (const char*)gen->GetArgAddress(1);
  389. CScriptString *str = StringFactory(length, s);
  390. gen->SetReturnAddress(str);
  391. }
  392. // This is the default string factory, that is responsible for creating empty string objects, e.g. when a variable is declared
  393. static CScriptString *StringDefaultFactory()
  394. {
  395. // Allocate and initialize with the default constructor
  396. return new CScriptString();
  397. }
  398. static CScriptString *StringCopyFactory(const CScriptString &other)
  399. {
  400. // Allocate and initialize with the copy constructor
  401. return new CScriptString(other);
  402. }
  403. static void StringDefaultFactory_Generic(asIScriptGeneric *gen)
  404. {
  405. *(CScriptString**)gen->GetAddressOfReturnLocation() = StringDefaultFactory();
  406. }
  407. static void StringCopyFactory_Generic(asIScriptGeneric *gen)
  408. {
  409. CScriptString *other = (CScriptString *)gen->GetArgObject(0);
  410. *(CScriptString**)gen->GetAddressOfReturnLocation() = StringCopyFactory(*other);
  411. }
  412. static void StringEqual_Generic(asIScriptGeneric *gen)
  413. {
  414. string *a = (string*)gen->GetArgAddress(0);
  415. string *b = (string*)gen->GetArgAddress(1);
  416. bool r = *a == *b;
  417. *(bool*)gen->GetAddressOfReturnLocation() = r;
  418. }
  419. static void StringEquals_Generic(asIScriptGeneric * gen)
  420. {
  421. string * a = static_cast<string *>(gen->GetObject());
  422. string * b = static_cast<string *>(gen->GetArgAddress(0));
  423. *(bool*)gen->GetAddressOfReturnLocation() = (*a == *b);
  424. }
  425. static void StringNotEqual_Generic(asIScriptGeneric *gen)
  426. {
  427. string *a = (string*)gen->GetArgAddress(0);
  428. string *b = (string*)gen->GetArgAddress(1);
  429. bool r = *a != *b;
  430. *(bool*)gen->GetAddressOfReturnLocation() = r;
  431. }
  432. static void StringLesserOrEqual_Generic(asIScriptGeneric *gen)
  433. {
  434. string *a = (string*)gen->GetArgAddress(0);
  435. string *b = (string*)gen->GetArgAddress(1);
  436. bool r = *a <= *b;
  437. *(bool*)gen->GetAddressOfReturnLocation() = r;
  438. }
  439. static void StringGreaterOrEqual_Generic(asIScriptGeneric *gen)
  440. {
  441. string *a = (string*)gen->GetArgAddress(0);
  442. string *b = (string*)gen->GetArgAddress(1);
  443. bool r = *a >= *b;
  444. *(bool*)gen->GetAddressOfReturnLocation() = r;
  445. }
  446. static void StringLesser_Generic(asIScriptGeneric *gen)
  447. {
  448. string *a = (string*)gen->GetArgAddress(0);
  449. string *b = (string*)gen->GetArgAddress(1);
  450. bool r = *a < *b;
  451. *(bool*)gen->GetAddressOfReturnLocation() = r;
  452. }
  453. static void StringGreater_Generic(asIScriptGeneric *gen)
  454. {
  455. string *a = (string*)gen->GetArgAddress(0);
  456. string *b = (string*)gen->GetArgAddress(1);
  457. bool r = *a > *b;
  458. *(bool*)gen->GetAddressOfReturnLocation() = r;
  459. }
  460. static void StringLength_Generic(asIScriptGeneric *gen)
  461. {
  462. string *s = (string*)gen->GetObject();
  463. size_t l = s->size();
  464. if( sizeof(size_t) == 4 )
  465. gen->SetReturnDWord((asUINT)l);
  466. else
  467. gen->SetReturnQWord((asQWORD)l);
  468. }
  469. static void StringResize_Generic(asIScriptGeneric *gen)
  470. {
  471. string *s = (string*)gen->GetObject();
  472. size_t v = *(size_t*)gen->GetAddressOfArg(0);
  473. s->resize(v);
  474. }
  475. // This is where we register the string type
  476. void RegisterScriptString_Native(asIScriptEngine *engine)
  477. {
  478. int r;
  479. // Register the type
  480. r = engine->RegisterObjectType("string", 0, asOBJ_REF); assert( r >= 0 );
  481. // Register the object operator overloads
  482. // Note: We don't have to register the destructor, since the object uses reference counting
  483. r = engine->RegisterObjectBehaviour("string", asBEHAVE_FACTORY, "string @f()", asFUNCTION(StringDefaultFactory), asCALL_CDECL); assert( r >= 0 );
  484. r = engine->RegisterObjectBehaviour("string", asBEHAVE_FACTORY, "string @f(const string &in)", asFUNCTION(StringCopyFactory), asCALL_CDECL); assert( r >= 0 );
  485. r = engine->RegisterObjectBehaviour("string", asBEHAVE_ADDREF, "void f()", asMETHOD(CScriptString,AddRef), asCALL_THISCALL); assert( r >= 0 );
  486. r = engine->RegisterObjectBehaviour("string", asBEHAVE_RELEASE, "void f()", asMETHOD(CScriptString,Release), asCALL_THISCALL); assert( r >= 0 );
  487. r = engine->RegisterObjectMethod("string", "string &opAssign(const string &in)", asMETHODPR(CScriptString, operator =, (const CScriptString&), CScriptString&), asCALL_THISCALL); assert( r >= 0 );
  488. r = engine->RegisterObjectMethod("string", "string &opAddAssign(const string &in)", asMETHODPR(CScriptString, operator+=, (const CScriptString&), CScriptString&), asCALL_THISCALL); assert( r >= 0 );
  489. // Register the factory to return a handle to a new string
  490. // Note: We must register the string factory after the basic behaviours,
  491. // otherwise the library will not allow the use of object handles for this type
  492. r = engine->RegisterStringFactory("string@", asFUNCTION(StringFactory), asCALL_CDECL); assert( r >= 0 );
  493. r = engine->RegisterObjectMethod("string", "bool opEquals(const string &in) const", asFUNCTIONPR(operator ==, (const string &, const string &), bool), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
  494. r = engine->RegisterObjectMethod("string", "int opCmp(const string &in) const", asFUNCTION(StringCmp), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
  495. r = engine->RegisterObjectMethod("string", "string@ opAdd(const string &in) const", asFUNCTIONPR(operator +, (const CScriptString &, const CScriptString &), CScriptString*), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
  496. // Register the index operator, both as a mutator and as an inspector
  497. r = engine->RegisterObjectBehaviour("string", asBEHAVE_INDEX, "uint8 &f(uint)", asFUNCTION(StringCharAt), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  498. r = engine->RegisterObjectBehaviour("string", asBEHAVE_INDEX, "const uint8 &f(uint) const", asFUNCTION(StringCharAt), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  499. // Register the object methods
  500. if( sizeof(size_t) == 4 )
  501. {
  502. r = engine->RegisterObjectMethod("string", "uint length() const", asMETHOD(string,size), asCALL_THISCALL); assert( r >= 0 );
  503. r = engine->RegisterObjectMethod("string", "void resize(uint)", asMETHODPR(string,resize,(size_t),void), asCALL_THISCALL); assert( r >= 0 );
  504. }
  505. else
  506. {
  507. r = engine->RegisterObjectMethod("string", "uint64 length() const", asMETHOD(string,size), asCALL_THISCALL); assert( r >= 0 );
  508. r = engine->RegisterObjectMethod("string", "void resize(uint64)", asMETHODPR(string,resize,(size_t),void), asCALL_THISCALL); assert( r >= 0 );
  509. }
  510. // TODO: Add factory string(const string &in str, int repeatCount)
  511. // TODO: Add explicit type conversion via constructor and value cast
  512. // TODO: Add parseInt and parseDouble. Two versions, one without parameter, one with an outparm that returns the number of characters parsed.
  513. // Automatic conversion from values
  514. r = engine->RegisterObjectMethod("string", "string &opAssign(double)", asFUNCTION(AssignDoubleToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  515. r = engine->RegisterObjectMethod("string", "string &opAddAssign(double)", asFUNCTION(AddAssignDoubleToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  516. r = engine->RegisterObjectMethod("string", "string@ opAdd(double) const", asFUNCTION(AddStringDouble), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
  517. r = engine->RegisterObjectMethod("string", "string@ opAdd_r(double) const", asFUNCTION(AddDoubleString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  518. r = engine->RegisterObjectMethod("string", "string &opAssign(float)", asFUNCTION(AssignFloatToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  519. r = engine->RegisterObjectMethod("string", "string &opAddAssign(float)", asFUNCTION(AddAssignFloatToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  520. r = engine->RegisterObjectMethod("string", "string@ opAdd(float) const", asFUNCTION(AddStringFloat), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
  521. r = engine->RegisterObjectMethod("string", "string@ opAdd_r(float) const", asFUNCTION(AddFloatString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  522. r = engine->RegisterObjectMethod("string", "string &opAssign(int)", asFUNCTION(AssignIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  523. r = engine->RegisterObjectMethod("string", "string &opAddAssign(int)", asFUNCTION(AddAssignIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  524. r = engine->RegisterObjectMethod("string", "string@ opAdd(int) const", asFUNCTION(AddStringInt), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
  525. r = engine->RegisterObjectMethod("string", "string@ opAdd_r(int) const", asFUNCTION(AddIntString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  526. r = engine->RegisterObjectMethod("string", "string &opAssign(uint)", asFUNCTION(AssignUIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  527. r = engine->RegisterObjectMethod("string", "string &opAddAssign(uint)", asFUNCTION(AddAssignUIntToString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  528. r = engine->RegisterObjectMethod("string", "string@ opAdd(uint) const", asFUNCTION(AddStringUInt), asCALL_CDECL_OBJFIRST); assert( r >= 0 );
  529. r = engine->RegisterObjectMethod("string", "string@ opAdd_r(uint) const", asFUNCTION(AddUIntString), asCALL_CDECL_OBJLAST); assert( r >= 0 );
  530. }
  531. void RegisterScriptString_Generic(asIScriptEngine *engine)
  532. {
  533. int r;
  534. // Register the type
  535. r = engine->RegisterObjectType("string", 0, asOBJ_REF); assert( r >= 0 );
  536. // Register the object operator overloads
  537. // Note: We don't have to register the destructor, since the object uses reference counting
  538. r = engine->RegisterObjectBehaviour("string", asBEHAVE_FACTORY, "string @f()", asFUNCTION(StringDefaultFactory_Generic), asCALL_GENERIC); assert( r >= 0 );
  539. r = engine->RegisterObjectBehaviour("string", asBEHAVE_FACTORY, "string @f(const string &in)", asFUNCTION(StringCopyFactory_Generic), asCALL_GENERIC); assert( r >= 0 );
  540. r = engine->RegisterObjectBehaviour("string", asBEHAVE_ADDREF, "void f()", asFUNCTION(StringAddRef_Generic), asCALL_GENERIC); assert( r >= 0 );
  541. r = engine->RegisterObjectBehaviour("string", asBEHAVE_RELEASE, "void f()", asFUNCTION(StringRelease_Generic), asCALL_GENERIC); assert( r >= 0 );
  542. r = engine->RegisterObjectMethod("string", "string &opAssign(const string &in)", asFUNCTION(AssignString_Generic), asCALL_GENERIC); assert( r >= 0 );
  543. r = engine->RegisterObjectMethod("string", "string &opAddAssign(const string &in)", asFUNCTION(AddAssignString_Generic), asCALL_GENERIC); assert( r >= 0 );
  544. // Register the factory to return a handle to a new string
  545. // Note: We must register the string factory after the basic behaviours,
  546. // otherwise the library will not allow the use of object handles for this type
  547. r = engine->RegisterStringFactory("string@", asFUNCTION(StringFactory_Generic), asCALL_GENERIC); assert( r >= 0 );
  548. r = engine->RegisterObjectMethod("string", "bool opEquals(const string &in) const", asFUNCTION(StringEquals_Generic), asCALL_GENERIC); assert( r >= 0 );
  549. r = engine->RegisterObjectMethod("string", "int opCmp(const string &in) const", asFUNCTION(StringCmp_Generic), asCALL_GENERIC); assert( r >= 0 );
  550. r = engine->RegisterObjectMethod("string", "string@ opAdd(const string &in) const", asFUNCTION(ConcatenateStrings_Generic), asCALL_GENERIC); assert( r >= 0 );
  551. // Register the index operator, both as a mutator and as an inspector
  552. r = engine->RegisterObjectBehaviour("string", asBEHAVE_INDEX, "uint8 &f(uint)", asFUNCTION(StringCharAt_Generic), asCALL_GENERIC); assert( r >= 0 );
  553. r = engine->RegisterObjectBehaviour("string", asBEHAVE_INDEX, "const uint8 &f(uint) const", asFUNCTION(StringCharAt_Generic), asCALL_GENERIC); assert( r >= 0 );
  554. // Register the object methods
  555. if( sizeof(size_t) == 4 )
  556. {
  557. r = engine->RegisterObjectMethod("string", "uint length() const", asFUNCTION(StringLength_Generic), asCALL_GENERIC); assert( r >= 0 );
  558. r = engine->RegisterObjectMethod("string", "void resize(uint)", asFUNCTION(StringResize_Generic), asCALL_GENERIC); assert( r >= 0 );
  559. }
  560. else
  561. {
  562. r = engine->RegisterObjectMethod("string", "uint64 length() const", asFUNCTION(StringLength_Generic), asCALL_GENERIC); assert( r >= 0 );
  563. r = engine->RegisterObjectMethod("string", "void resize(uint64)", asFUNCTION(StringResize_Generic), asCALL_GENERIC); assert( r >= 0 );
  564. }
  565. // Automatic conversion from values
  566. r = engine->RegisterObjectMethod("string", "string &opAssign(double)", asFUNCTION(AssignDoubleToString_Generic), asCALL_GENERIC); assert( r >= 0 );
  567. r = engine->RegisterObjectMethod("string", "string &opAddAssign(double)", asFUNCTION(AddAssignDoubleToString_Generic), asCALL_GENERIC); assert( r >= 0 );
  568. r = engine->RegisterObjectMethod("string", "string@ opAdd(double) const", asFUNCTION(AddStringDouble_Generic), asCALL_GENERIC); assert( r >= 0 );
  569. r = engine->RegisterObjectMethod("string", "string@ opAdd_r(double) const", asFUNCTION(AddDoubleString_Generic), asCALL_GENERIC); assert( r >= 0 );
  570. r = engine->RegisterObjectMethod("string", "string &opAssign(float)", asFUNCTION(AssignFloatToString_Generic), asCALL_GENERIC); assert( r >= 0 );
  571. r = engine->RegisterObjectMethod("string", "string &opAddAssign(float)", asFUNCTION(AddAssignFloatToString_Generic), asCALL_GENERIC); assert( r >= 0 );
  572. r = engine->RegisterObjectMethod("string", "string@ opAdd(float) const", asFUNCTION(AddStringFloat_Generic), asCALL_GENERIC); assert( r >= 0 );
  573. r = engine->RegisterObjectMethod("string", "string@ opAdd_r(float) const", asFUNCTION(AddFloatString_Generic), asCALL_GENERIC); assert( r >= 0 );
  574. r = engine->RegisterObjectMethod("string", "string &opAssign(int)", asFUNCTION(AssignIntToString_Generic), asCALL_GENERIC); assert( r >= 0 );
  575. r = engine->RegisterObjectMethod("string", "string &opAddAssign(int)", asFUNCTION(AddAssignIntToString_Generic), asCALL_GENERIC); assert( r >= 0 );
  576. r = engine->RegisterObjectMethod("string", "string@ opAdd(int) const", asFUNCTION(AddStringInt_Generic), asCALL_GENERIC); assert( r >= 0 );
  577. r = engine->RegisterObjectMethod("string", "string@ opAdd_r(int) const", asFUNCTION(AddIntString_Generic), asCALL_GENERIC); assert( r >= 0 );
  578. r = engine->RegisterObjectMethod("string", "string &opAssign(uint)", asFUNCTION(AssignUIntToString_Generic), asCALL_GENERIC); assert( r >= 0 );
  579. r = engine->RegisterObjectMethod("string", "string &opAddAssign(uint)", asFUNCTION(AddAssignUIntToString_Generic), asCALL_GENERIC); assert( r >= 0 );
  580. r = engine->RegisterObjectMethod("string", "string@ opAdd(uint) const", asFUNCTION(AddStringUInt_Generic), asCALL_GENERIC); assert( r >= 0 );
  581. r = engine->RegisterObjectMethod("string", "string@ opAdd_r(uint) const", asFUNCTION(AddUIntString_Generic), asCALL_GENERIC); assert( r >= 0 );
  582. }
  583. void RegisterScriptString(asIScriptEngine *engine)
  584. {
  585. if( strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY") )
  586. RegisterScriptString_Generic(engine);
  587. else
  588. RegisterScriptString_Native(engine);
  589. }
  590. END_AS_NAMESPACE