diff --git a/lib/modules/ADT.pmod/Table.pmod b/lib/modules/ADT.pmod/Table.pmod index 0ab894ed7a16d24f9bd9256d9724f6a2e1ada955..00735be2bdc5ef15ff0d3788204ed70480ab3896 100644 --- a/lib/modules/ADT.pmod/Table.pmod +++ b/lib/modules/ADT.pmod/Table.pmod @@ -1,5 +1,5 @@ // Table.pmod by Fredrik Noring, 1998 -// $Id: Table.pmod,v 1.11 1999/12/21 12:06:47 noring Exp $ +// $Id: Table.pmod,v 1.12 1999/12/21 20:12:43 noring Exp $ #define TABLE_ERR(msg) throw(({ "(Table) "+msg+"\n", backtrace() })) @@ -222,15 +222,17 @@ class table { return copy(t, fields, types); } - object sort(int|string ... cs) + static private object _sort(int is_reversed, int|string ... cs) { if(!sizeof(cs)) return this_object(); int c; array t = copy_value(table); - if(!catch(c = remap(cs[-1]))) { + if(!catch(c = remap(cs[-1]))) + { mapping m = ([]); - for(int r = 0; r < sizeof(t); r++) { + for(int r = 0; r < sizeof(t); r++) + { mixed d; if(!m[d = t[r][c]]) m[d] = ({ t[r] }); @@ -239,14 +241,21 @@ class table { } array i = indices(m), v = values(m); predef::sort(i, v); - t = v*({}); + t = (is_reversed ? predef::reverse(v) : v)*({}); } - return copy(t, fields, types)->sort(@cs[0..(sizeof(cs)-2)]); + return is_reversed ? + copy(t, fields, types)->rsort(@cs[0..(sizeof(cs)-2)]) : + copy(t, fields, types)->sort(@cs[0..(sizeof(cs)-2)]); } + object sort(int|string ... cs) + { + return _sort(0, @cs); + } + object rsort(int|string ... cs) { - return sort(@cs)->reverse(); + return _sort(1, @cs); } object limit(int n)