Thank you Melanie for implementing
llListSort() in linear and strided modes.0.6.0-stable
parent
b1632bd222
commit
7cb78d73eb
|
@ -2874,42 +2874,7 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
public LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending)
|
public LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending)
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
// SortedList<string, LSL_Types.list> sorted = new SortedList<string, LSL_Types.list>();
|
return src.Sort(stride, ascending);
|
||||||
// Add chunks to an array
|
|
||||||
//int s = stride;
|
|
||||||
//if (s < 1)
|
|
||||||
// s = 1;
|
|
||||||
//int c = 0;
|
|
||||||
//LSL_Types.list chunk = new LSL_Types.list();
|
|
||||||
//string chunkString = String.Empty;
|
|
||||||
//foreach (string element in src)
|
|
||||||
//{
|
|
||||||
// c++;
|
|
||||||
// if (c > s)
|
|
||||||
// {
|
|
||||||
// sorted.Add(chunkString, chunk);
|
|
||||||
// chunkString = String.Empty;
|
|
||||||
// chunk = new LSL_Types.list();
|
|
||||||
// c = 0;
|
|
||||||
// }
|
|
||||||
// chunk.Add(element);
|
|
||||||
// chunkString += element.ToString();
|
|
||||||
//}
|
|
||||||
//if (chunk.Count > 0)
|
|
||||||
// sorted.Add(chunkString, chunk);
|
|
||||||
|
|
||||||
//LSL_Types.list ret = new LSL_Types.list();
|
|
||||||
//foreach (LSL_Types.list ls in sorted.Values)
|
|
||||||
//{
|
|
||||||
// ret.AddRange(ls);
|
|
||||||
//}
|
|
||||||
|
|
||||||
//if (ascending == LSL_BaseClass.TRUE)
|
|
||||||
// return ret;
|
|
||||||
//ret.Reverse();
|
|
||||||
//return ret;
|
|
||||||
NotImplemented("llListSort");
|
|
||||||
return new LSL_Types.list();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int llGetListLength(LSL_Types.list src)
|
public int llGetListLength(LSL_Types.list src)
|
||||||
|
|
|
@ -560,6 +560,70 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public list Sort(int stride, int ascending)
|
||||||
|
{
|
||||||
|
if(Data.Length == 0)
|
||||||
|
return new list(); // Don't even bother
|
||||||
|
|
||||||
|
if(stride == 1) // The simple case
|
||||||
|
{
|
||||||
|
Object[] ret=new Object[Data.Length];
|
||||||
|
|
||||||
|
Array.Copy(Data, 0, ret, 0, Data.Length);
|
||||||
|
|
||||||
|
Array.Sort(ret);
|
||||||
|
|
||||||
|
if(ascending == 0)
|
||||||
|
Array.Reverse(ret);
|
||||||
|
return new list(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
int src=0;
|
||||||
|
|
||||||
|
int len=(Data.Length+stride-1)/stride;
|
||||||
|
|
||||||
|
string[] keys=new string[len];
|
||||||
|
Object[][] vals=new Object[len][];
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
while(src < Data.Length)
|
||||||
|
{
|
||||||
|
Object[] o=new Object[stride];
|
||||||
|
|
||||||
|
for(i=0;i<stride;i++)
|
||||||
|
{
|
||||||
|
if(src < Data.Length)
|
||||||
|
o[i]=Data[src++];
|
||||||
|
else
|
||||||
|
{
|
||||||
|
o[i]=new Object();
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int idx=src/stride-1;
|
||||||
|
keys[idx]=o[0].ToString();
|
||||||
|
vals[idx]=o;
|
||||||
|
}
|
||||||
|
|
||||||
|
Array.Sort(keys, vals);
|
||||||
|
if(ascending == 0)
|
||||||
|
{
|
||||||
|
Array.Reverse(vals);
|
||||||
|
}
|
||||||
|
|
||||||
|
Object[] sorted=new Object[stride*vals.Length];
|
||||||
|
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for(i=0;i<vals.Length;i++)
|
||||||
|
for(j=0;j<stride;j++)
|
||||||
|
sorted[i*stride+j]=vals[i][j];
|
||||||
|
|
||||||
|
return new list(sorted);
|
||||||
|
}
|
||||||
|
|
||||||
#region CSV Methods
|
#region CSV Methods
|
||||||
|
|
||||||
public static list FromCSV(string csv)
|
public static list FromCSV(string csv)
|
||||||
|
|
Loading…
Reference in New Issue