Jump to content

  • Log In with Google      Sign In   
  • Create Account

- - - - -

Factory for const string


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
9 replies to this topic

#1 _Vicious_   Members   -  Reputation: 240

Like
0Likes
Like

Posted 16 December 2013 - 05:27 AM

Hello Andreas,

 

is it possible to register factory for a constant string handle? The reason I'm asking is that would allow to reduce the number of allocations in the app by storing the string struct and the string buffer in the same memory region, knowing that the string is immutable.



Sponsor:

#2 Andreas Jonsson   Moderators   -  Reputation: 3450

Like
0Likes
Like

Posted 16 December 2013 - 07:18 PM

The scriptstdstring add-on implements a stringpool to avoid allocating new strings for every string literal in the script.

I believe this is exactly what you're looking for.
AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

#3 _Vicious_   Members   -  Reputation: 240

Like
0Likes
Like

Posted 17 December 2013 - 08:28 AM

Not exactly, but close. Using hash tables or maps introduces quite a bit of an overhead.

 

We're also using ref-counting on strings, in this case, how does a const string type declaration look like? const String @& ? or simply const String @?



#4 Jason Goepel   Members   -  Reputation: 443

Like
1Likes
Like

Posted 17 December 2013 - 09:49 AM

It doesn't seem like AngelScript treats literal strings a constant strings, since I am able to call non-constant functions from a literal string.

 

"Hello World".clear();



#5 Andreas Jonsson   Moderators   -  Reputation: 3450

Like
0Likes
Like

Posted 17 December 2013 - 05:07 PM

@_Vicious_

 

Since you're using refcounted strings you'll want to implement/register your string factory to return 'const String @' and have it return the pointer to the same instance for each string literal. (remember to increment the ref counter for each call).

 

@Jason

 

It depends on how you've registered the string factory. If it is registered as returning a const string &/@ then the literal will not be modifiable. But if you've registered as returing a string by value or a non-const ref/handle than the string will be modifiable. 


AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

#6 _Vicious_   Members   -  Reputation: 240

Like
0Likes
Like

Posted 19 December 2013 - 12:42 AM

Thanks Andreas!



#7 _Vicious_   Members   -  Reputation: 240

Like
0Likes
Like

Posted 20 December 2013 - 12:18 PM

Quite can't figure out what's going on here, looks like an AS bug to me...

 

Consider the following code:

String response = "";
...
String manifest = gametype.manifest;
...
response += "Author: " + (true ? "1" + manifest : "0") + "\n";

Compilation fails with the following error:

 

bomb/main.as 257:36: Can't implicitly convert from 'const String@' to 'String@&'.
^1ERROR:
bomb/main.as 257:29: Both expressions must have the same type
^1ERROR:

 

However, the following code compiles just fine:

response += "Author: " + "1" + manifest + "\n";

It looks like the ? : operator somehow interferes with string types or something.. Here's full code of the string class: https://github.com/viciious/qfusion/blob/master/source/angelwrap/addon/addon_string.cpp



#8 Andreas Jonsson   Moderators   -  Reputation: 3450

Like
0Likes
Like

Posted 20 December 2013 - 03:06 PM

I believe the problem is that first result for the ?: operator gives a 'String@' after the + operator, and the second result gives a 'const String@' since it returns the literal directly.

 

It should be relatively easy to have the compiler cast the first result to 'const String @' too in this case. I'll make this change as soon as possible.

 

Until then you can work around this by avoiding the use of the ?: in this case, i.e. by using ordinary if/else. Or you can force a concatenation in the second result to, e.g:

 

response += "Author: " + (true ? "1" + manifest : "0" + "") + "\n";

 

Regards,

Andreas


AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

#9 Andreas Jonsson   Moderators   -  Reputation: 3450

Like
0Likes
Like

Posted 20 December 2013 - 08:07 PM

I've fixed this in revision 1802.

 

Thanks,

Andreas


AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

#10 _Vicious_   Members   -  Reputation: 240

Like
0Likes
Like

Posted 21 December 2013 - 05:04 AM

Thanks Andreas!






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS