Difference between revisions of "User:Pedro Oval/Table of implicit type conversions for list extracting functions"
Pedro Oval (talk | contribs) m (Yet another formatting change) |
Pedro Oval (talk | contribs) m (<lsl> to <source>) |
||
(4 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
This table tells whether an implicit type cast is supported by <code>llList2*</code> depending on the item type in the list. Last tested with this server version: Second Life Server 11. | This table tells whether an implicit type cast is supported by <code>llList2*</code> depending on the item type in the list. Last tested with this server version: Second Life Server 11.10.18.243270 | ||
Updated 2011-10-30 with note on unsupported llList2Key conversions in LSO, which weren't tested before | |||
{| {{Prettytable}} | {| {{Prettytable}} | ||
Line 24: | Line 26: | ||
|} | |} | ||
The non-supported conversions for <code>llList2Key</code> return <code>(key)""</code>. | The non-supported conversions for <code>llList2Key</code> return <code>(key)""</code> in Mono, and <code>(key)NULL_KEY</code> in LSO. | ||
The non-supported conversions for <code>llList2Integer</code> return <code>0</code>. | The non-supported conversions for <code>llList2Integer</code> return <code>0</code>. | ||
Line 34: | Line 36: | ||
The non-supported conversions for <code>llList2Rot</code> return <code>ZERO_ROTATION</code>. | The non-supported conversions for <code>llList2Rot</code> return <code>ZERO_ROTATION</code>. | ||
In short: <code>llList2String</code> can be applied to all types. A string element can be extracted by all functions except <code>llList2Vector</code> and <code>llList2Rot</code>. <code> | In short: <code>llList2String</code> can be applied to all types. A string element can be extracted by all functions except <code>llList2Vector</code> and <code>llList2Rot</code>. <code>llList2Integer</code> can extract a float, and <code>llList2Float</code> can extract an integer. No other implicit conversions are supported. | ||
== Test code == | |||
Here's the program used to elaborate the above table: | |||
<source lang="lsl2"> | |||
string CheckResults(integer ExpectedYes, integer ExpectedNo) | |||
{ | |||
if (ExpectedYes && ExpectedNo) | |||
{ | |||
// Inconsistent check - revise code | |||
return "*INCONSISTENT*"; | |||
} | |||
if (!ExpectedYes && !ExpectedNo) | |||
{ | |||
// Neither of the checks is met | |||
return "*UNEXPECTED*"; | |||
} | |||
if (ExpectedYes) | |||
return " YES"; | |||
return " no "; | |||
} | |||
string v2s(vector v) | |||
{ | |||
return "<"+(string)v.x+", "+(string)v.y+", "+(string)v.z+">"; | |||
} | |||
string r2s(rotation r) | |||
{ | |||
return "<"+(string)r.x+", "+(string)r.y+", "+(string)r.z+", "+(string)r.s+">"; | |||
} | |||
default | |||
{ | |||
state_entry() | |||
{ | |||
string line; | |||
string s; | |||
key k; | |||
integer i; | |||
float f; | |||
vector v; | |||
rotation r; | |||
llOwnerSay("-------------- s k i f v r"); | |||
line = "llList2String "; | |||
s = "¡!¿?"; | |||
k = (key)"01234567-89ab-cdef-0123-456789abcdef"; | |||
i = -314159; | |||
f = -3.141592e33; | |||
v = <-1.22, 0.0, 9.9e9>; | |||
r = <0.33, 0.66, 0.33, 0.589>; | |||
line += CheckResults(llList2String([s], 0) == s, llList2String([s], 0) == ""); | |||
line += CheckResults(llList2String([k], 0) == (string)k, llList2String([k], 0) == ""); | |||
line += CheckResults(llList2String([i], 0) == (string)i, llList2String([i], 0) == ""); | |||
line += CheckResults(llList2String([f], 0) == (string)f, llList2String([f], 0) == ""); | |||
// we can't compare to (string)v because that returns 5 decimals in components instead of the usual 6 | |||
line += CheckResults(llList2String([v], 0) == v2s(v), llList2String([v], 0) == ""); | |||
// same caveat as above | |||
line += CheckResults(llList2String([r], 0) == r2s(r), llList2String([r], 0) == ""); | |||
llOwnerSay(line); | |||
line = "llList2Key "; | |||
key expectedNo = llList2Key([], 0); // different expected negative result for Mono and LSO | |||
line += CheckResults(llList2Key([s], 0) == (key)s, llList2Key([s], 0) == expectedNo); | |||
line += CheckResults(llList2Key([k], 0) == k, llList2Key([k], 0) == expectedNo); | |||
line += CheckResults(llList2Key([i], 0) == (key)((string)i), llList2Key([i], 0) == expectedNo); | |||
line += CheckResults(llList2Key([f], 0) == (key)((string)f), llList2Key([f], 0) == expectedNo); | |||
line += CheckResults(llList2Key([v], 0) == (key)v2s(v), llList2Key([v], 0) == expectedNo); | |||
line += CheckResults(llList2Key([r], 0) == (key)r2s(r), llList2Key([r], 0) == expectedNo); | |||
llOwnerSay(line); | |||
line = "llList2Integer "; | |||
s = "234"; | |||
k = (key)"234"; | |||
i = 234; | |||
f = 234.1; | |||
v = <234.0, 30.0, 20.0>; | |||
r = <1.0, 1.0, 1.0, 1.0>; | |||
line += CheckResults(llList2Integer([s], 0) == (integer)s, llList2Integer([s], 0) == 0); | |||
line += CheckResults(llList2Integer([k], 0) == (integer)((string)k), llList2Integer([k], 0) == 0); | |||
line += CheckResults(llList2Integer([i], 0) == i, llList2Integer([i], 0) == 0); | |||
line += CheckResults(llList2Integer([f], 0) == (integer)f, llList2Integer([f], 0) == 0); | |||
line += CheckResults(llList2Integer([v], 0) == (integer)v.x, llList2Integer([v], 0) == 0); | |||
line += CheckResults(llList2Integer([r], 0) == (integer)r.x, llList2Integer([r], 0) == 0); | |||
llOwnerSay(line); | |||
line = "llList2Float "; | |||
s = "234.1"; | |||
k = (key)"234.1"; | |||
i = 234; | |||
f = 234.1; | |||
v = <234.1, 30.0, 20.0>; | |||
r = <0.33, 0.66, 0.33, 0.589>; | |||
line += CheckResults(llList2Float([s], 0) == (float)s, llList2Float([s], 0) == 0.0); | |||
line += CheckResults(llList2Float([k], 0) == (float)((string)k), llList2Float([k], 0) == 0.0); | |||
line += CheckResults(llList2Float([i], 0) == (float)i, llList2Float([i], 0) == 0.0); | |||
line += CheckResults(llList2Float([f], 0) == f, llList2Float([f], 0) == 0.0); | |||
line += CheckResults(llList2Float([v], 0) == v.x, llList2Float([v], 0) == 0.0); | |||
line += CheckResults(llList2Float([r], 0) == r.x, llList2Float([r], 0) == 0.0); | |||
llOwnerSay(line); | |||
line = "llList2Vector "; | |||
s = "<1.3, 1.4, 1.5>"; | |||
k = (key)s; | |||
line += CheckResults(llList2Vector([s], 0) == (vector)s, llList2Vector([s], 0) == ZERO_VECTOR); | |||
line += CheckResults(llList2Vector([k], 0) == (vector)((string)k), llList2Vector([k], 0) == ZERO_VECTOR); | |||
line += CheckResults(llList2Vector([i], 0) == <i, 0, 0>, llList2Vector([i], 0) == ZERO_VECTOR); | |||
line += CheckResults(llList2Vector([f], 0) == <f, 0, 0>, llList2Vector([f], 0) == ZERO_VECTOR); | |||
line += CheckResults(llList2Vector([v], 0) == v, llList2Vector([v], 0) == ZERO_VECTOR); | |||
line += CheckResults(llList2Vector([r], 0) == <r.x,r.y,r.z>, llList2Vector([r], 0) == ZERO_VECTOR); | |||
llOwnerSay(line); | |||
line = "llList2Rot "; | |||
s = "<1.3, 1.4, 1.5, 1.6>"; | |||
k = (key)s; | |||
line += CheckResults(llList2Rot([s], 0) == (rotation)s, llList2Rot([s], 0) == ZERO_ROTATION); | |||
line += CheckResults(llList2Rot([k], 0) == (rotation)((string)k), llList2Rot([k], 0) == ZERO_ROTATION); | |||
line += CheckResults(llList2Rot([i], 0) == <i, 0, 0, 0>, llList2Rot([i], 0) == ZERO_ROTATION); | |||
line += CheckResults(llList2Rot([f], 0) == <f, 0, 0, 0>, llList2Rot([f], 0) == ZERO_ROTATION); | |||
line += CheckResults(llList2Rot([v], 0) == <v.x, v.y, v.z, 0>, llList2Rot([v], 0) == ZERO_ROTATION); | |||
line += CheckResults(llList2Rot([r], 0) == r, llList2Rot([r], 0) == ZERO_ROTATION); | |||
llOwnerSay(line); | |||
} | |||
} | |||
</source> |
Latest revision as of 21:45, 23 January 2015
This table tells whether an implicit type cast is supported by llList2*
depending on the item type in the list. Last tested with this server version: Second Life Server 11.10.18.243270
Updated 2011-10-30 with note on unsupported llList2Key conversions in LSO, which weren't tested before
List item type: Function: |
string | key | integer | float | vector | rotation |
---|---|---|---|---|---|---|
llList2String | YES | YES | YES | YES | YES | YES |
llList2Key | YES | YES | no | no | no | no |
llList2Integer | YES | no | YES | YES | no | no |
llList2Float | YES | no | YES | YES | no | no |
llList2Vector | no | no | no | no | YES | no |
llList2Rot | no | no | no | no | no | YES |
The non-supported conversions for llList2Key
return (key)""
in Mono, and (key)NULL_KEY
in LSO.
The non-supported conversions for llList2Integer
return 0
.
The non-supported conversions for llList2Float
return 0.0
.
The non-supported conversions for llList2Vector
return ZERO_VECTOR
.
The non-supported conversions for llList2Rot
return ZERO_ROTATION
.
In short: llList2String
can be applied to all types. A string element can be extracted by all functions except llList2Vector
and llList2Rot
. llList2Integer
can extract a float, and llList2Float
can extract an integer. No other implicit conversions are supported.
Test code
Here's the program used to elaborate the above table:
string CheckResults(integer ExpectedYes, integer ExpectedNo)
{
if (ExpectedYes && ExpectedNo)
{
// Inconsistent check - revise code
return "*INCONSISTENT*";
}
if (!ExpectedYes && !ExpectedNo)
{
// Neither of the checks is met
return "*UNEXPECTED*";
}
if (ExpectedYes)
return " YES";
return " no ";
}
string v2s(vector v)
{
return "<"+(string)v.x+", "+(string)v.y+", "+(string)v.z+">";
}
string r2s(rotation r)
{
return "<"+(string)r.x+", "+(string)r.y+", "+(string)r.z+", "+(string)r.s+">";
}
default
{
state_entry()
{
string line;
string s;
key k;
integer i;
float f;
vector v;
rotation r;
llOwnerSay("-------------- s k i f v r");
line = "llList2String ";
s = "¡!¿?";
k = (key)"01234567-89ab-cdef-0123-456789abcdef";
i = -314159;
f = -3.141592e33;
v = <-1.22, 0.0, 9.9e9>;
r = <0.33, 0.66, 0.33, 0.589>;
line += CheckResults(llList2String([s], 0) == s, llList2String([s], 0) == "");
line += CheckResults(llList2String([k], 0) == (string)k, llList2String([k], 0) == "");
line += CheckResults(llList2String([i], 0) == (string)i, llList2String([i], 0) == "");
line += CheckResults(llList2String([f], 0) == (string)f, llList2String([f], 0) == "");
// we can't compare to (string)v because that returns 5 decimals in components instead of the usual 6
line += CheckResults(llList2String([v], 0) == v2s(v), llList2String([v], 0) == "");
// same caveat as above
line += CheckResults(llList2String([r], 0) == r2s(r), llList2String([r], 0) == "");
llOwnerSay(line);
line = "llList2Key ";
key expectedNo = llList2Key([], 0); // different expected negative result for Mono and LSO
line += CheckResults(llList2Key([s], 0) == (key)s, llList2Key([s], 0) == expectedNo);
line += CheckResults(llList2Key([k], 0) == k, llList2Key([k], 0) == expectedNo);
line += CheckResults(llList2Key([i], 0) == (key)((string)i), llList2Key([i], 0) == expectedNo);
line += CheckResults(llList2Key([f], 0) == (key)((string)f), llList2Key([f], 0) == expectedNo);
line += CheckResults(llList2Key([v], 0) == (key)v2s(v), llList2Key([v], 0) == expectedNo);
line += CheckResults(llList2Key([r], 0) == (key)r2s(r), llList2Key([r], 0) == expectedNo);
llOwnerSay(line);
line = "llList2Integer ";
s = "234";
k = (key)"234";
i = 234;
f = 234.1;
v = <234.0, 30.0, 20.0>;
r = <1.0, 1.0, 1.0, 1.0>;
line += CheckResults(llList2Integer([s], 0) == (integer)s, llList2Integer([s], 0) == 0);
line += CheckResults(llList2Integer([k], 0) == (integer)((string)k), llList2Integer([k], 0) == 0);
line += CheckResults(llList2Integer([i], 0) == i, llList2Integer([i], 0) == 0);
line += CheckResults(llList2Integer([f], 0) == (integer)f, llList2Integer([f], 0) == 0);
line += CheckResults(llList2Integer([v], 0) == (integer)v.x, llList2Integer([v], 0) == 0);
line += CheckResults(llList2Integer([r], 0) == (integer)r.x, llList2Integer([r], 0) == 0);
llOwnerSay(line);
line = "llList2Float ";
s = "234.1";
k = (key)"234.1";
i = 234;
f = 234.1;
v = <234.1, 30.0, 20.0>;
r = <0.33, 0.66, 0.33, 0.589>;
line += CheckResults(llList2Float([s], 0) == (float)s, llList2Float([s], 0) == 0.0);
line += CheckResults(llList2Float([k], 0) == (float)((string)k), llList2Float([k], 0) == 0.0);
line += CheckResults(llList2Float([i], 0) == (float)i, llList2Float([i], 0) == 0.0);
line += CheckResults(llList2Float([f], 0) == f, llList2Float([f], 0) == 0.0);
line += CheckResults(llList2Float([v], 0) == v.x, llList2Float([v], 0) == 0.0);
line += CheckResults(llList2Float([r], 0) == r.x, llList2Float([r], 0) == 0.0);
llOwnerSay(line);
line = "llList2Vector ";
s = "<1.3, 1.4, 1.5>";
k = (key)s;
line += CheckResults(llList2Vector([s], 0) == (vector)s, llList2Vector([s], 0) == ZERO_VECTOR);
line += CheckResults(llList2Vector([k], 0) == (vector)((string)k), llList2Vector([k], 0) == ZERO_VECTOR);
line += CheckResults(llList2Vector([i], 0) == <i, 0, 0>, llList2Vector([i], 0) == ZERO_VECTOR);
line += CheckResults(llList2Vector([f], 0) == <f, 0, 0>, llList2Vector([f], 0) == ZERO_VECTOR);
line += CheckResults(llList2Vector([v], 0) == v, llList2Vector([v], 0) == ZERO_VECTOR);
line += CheckResults(llList2Vector([r], 0) == <r.x,r.y,r.z>, llList2Vector([r], 0) == ZERO_VECTOR);
llOwnerSay(line);
line = "llList2Rot ";
s = "<1.3, 1.4, 1.5, 1.6>";
k = (key)s;
line += CheckResults(llList2Rot([s], 0) == (rotation)s, llList2Rot([s], 0) == ZERO_ROTATION);
line += CheckResults(llList2Rot([k], 0) == (rotation)((string)k), llList2Rot([k], 0) == ZERO_ROTATION);
line += CheckResults(llList2Rot([i], 0) == <i, 0, 0, 0>, llList2Rot([i], 0) == ZERO_ROTATION);
line += CheckResults(llList2Rot([f], 0) == <f, 0, 0, 0>, llList2Rot([f], 0) == ZERO_ROTATION);
line += CheckResults(llList2Rot([v], 0) == <v.x, v.y, v.z, 0>, llList2Rot([v], 0) == ZERO_ROTATION);
line += CheckResults(llList2Rot([r], 0) == r, llList2Rot([r], 0) == ZERO_ROTATION);
llOwnerSay(line);
}
}