User talk:ANSI Soderstrom/Simple LSL Array (Associative): Difference between revisions
Jump to navigation
Jump to search
→A quick implementation: new section |
m →A quick implementation: oops |
||
| Line 28: | Line 28: | ||
do { | do { | ||
list temp = []; | list temp = []; | ||
list | list Key = llList2List(KEY, len, len); | ||
while((position & 1) == !(position = llListFindList(ARRAY, | while((position & 1) == !(position = llListFindList(ARRAY, Key) + 1)) { | ||
temp = temp + llList2List(ARRAY, 0, position); | temp = temp + llList2List(ARRAY, 0, position); | ||
ARRAY = llDeleteSubList(ARRAY, 0, position); | ARRAY = llDeleteSubList(ARRAY, 0, position); | ||
| Line 36: | Line 36: | ||
ARRAY = temp + llListReplaceList(ARRAY, llList2List(VALUE, len, len), position, position); | ARRAY = temp + llListReplaceList(ARRAY, llList2List(VALUE, len, len), position, position); | ||
} else { | } else { | ||
ARRAY = temp + ARRAY + | ARRAY = temp + ARRAY + Key + llList2List(VALUE, len, len); | ||
} | } | ||
} while( ++len ); | } while( ++len ); | ||
| Line 49: | Line 49: | ||
list temp = []; | list temp = []; | ||
integer position; | integer position; | ||
list | list Key = llList2List(KEY, len, len); | ||
while((position & 1) == !(position = llListFindList(ARRAY, | while((position & 1) == !(position = llListFindList(ARRAY, Key) + 1)) { | ||
temp += llList2List(ARRAY, 0, position); | temp += llList2List(ARRAY, 0, position); | ||
ARRAY = llDeleteSubList(ARRAY, 0, position); | ARRAY = llDeleteSubList(ARRAY, 0, position); | ||
Revision as of 00:15, 22 April 2010
Thoughts
- Why are you supporting multiple values for a key? It looks like you only return the last one with GET. PUT updates all of them which sorta makes having them pointless.
- Where is the REMOVE function?
- This is not what I think of when i think of "array" nor a simple one at that, what you have here is an "
associative array".
-- Strife (talk|contribs) 06:24, 22 April 2010 (UTC)
A quick implementation
It's possible that it's not the best way to implement the loop condition. But it's clever. I've also added support for setting and removing multiple keys at a time. This is for convenience and there is little to no performance gain from doing this vs individual calls. I've checked the logic, it should work, I haven't tested it though. -- Strife (talk|contribs) 07:14, 22 April 2010 (UTC)
<lsl>list GET(list ARRAY, list KEY) {
if(llGetListLength(KEY) == 1) {
integer position = llListFindList(ARRAY, KEY) + 1;
if(position) {
return llList2List(ARRAY, position, position);
}
}
return [];
}
list PUT(list ARRAY, list KEY, list VALUE){
integer len = -llGetListLength(KEY);
if(len == -llGetListLength(VALUE) && len) {
integer position;
do {
list temp = [];
list Key = llList2List(KEY, len, len);
while((position & 1) == !(position = llListFindList(ARRAY, Key) + 1)) {
temp = temp + llList2List(ARRAY, 0, position);
ARRAY = llDeleteSubList(ARRAY, 0, position);
}
if(position) {
ARRAY = temp + llListReplaceList(ARRAY, llList2List(VALUE, len, len), position, position);
} else {
ARRAY = temp + ARRAY + Key + llList2List(VALUE, len, len);
}
} while( ++len );
}
return ARRAY;
}
list REMOVE(list ARRAY, list KEY){
integer len = -llGetListLength(KEY);
if(len) {
do {
list temp = [];
integer position;
list Key = llList2List(KEY, len, len);
while((position & 1) == !(position = llListFindList(ARRAY, Key) + 1)) {
temp += llList2List(ARRAY, 0, position);
ARRAY = llDeleteSubList(ARRAY, 0, position);
}
if(position) {
ARRAY = temp + llDeleteSubList(ARRAY, position - 1, position);
} else {
ARRAY = temp + ARRAY;
}
} while( ++len );
}
return ARRAY;
} </lsl> -- Strife (talk|contribs) 07:14, 22 April 2010 (UTC)