]> mj.ucw.cz Git - libucw.git/blobdiff - lib/sorter/s-internal.h
Merge with git+ssh://git.ucw.cz/projects/sherlock/GIT/sherlock.git#dev-sorter
[libucw.git] / lib / sorter / s-internal.h
index e921921e95241901544d48e88de817ae2befa55b..e581cecb7443b886b3c6954f9510d194051f3764 100644 (file)
@@ -16,10 +16,14 @@ typedef struct {
 
 #define ASORT_PREFIX(x) SORT_PREFIX(array_##x)
 #define ASORT_KEY_TYPE P(internal_item_t)
 
 #define ASORT_PREFIX(x) SORT_PREFIX(array_##x)
 #define ASORT_KEY_TYPE P(internal_item_t)
-#define ASORT_ELT(i) ary[i]
 #define ASORT_LT(x,y) (P(compare)((x).key, (y).key) < 0)
 #define ASORT_LT(x,y) (P(compare)((x).key, (y).key) < 0)
-#define ASORT_EXTRA_ARGS , P(internal_item_t) *ary
-#include "lib/arraysort.h"
+#ifdef SORT_INTERNAL_RADIX
+#  define ASORT_HASH(x) P(hash)((x).key)
+#    ifdef SORT_LONG_HASH
+#      define ASORT_LONG_HASH
+#    endif
+#endif
+#include "lib/sorter/array.h"
 
 /*
  *  The big_buf has the following layout:
 
 /*
  *  The big_buf has the following layout:
@@ -66,8 +70,8 @@ static inline size_t P(internal_workspace)(P(key) *key UNUSED)
 #ifdef SORT_UNIFY_WORKSPACE
   ws += SORT_UNIFY_WORKSPACE(*key);
 #endif
 #ifdef SORT_UNIFY_WORKSPACE
   ws += SORT_UNIFY_WORKSPACE(*key);
 #endif
-#if 0                                          /* FIXME: Shadow copy if radix-sorting */
-  ws = MAX(ws, sizeof(P(key) *));
+#ifdef SORT_INTERNAL_RADIX
+  ws = MAX(ws, sizeof(P(internal_item_t)));
 #endif
   return ws;
 }
 #endif
   return ws;
 }
@@ -146,7 +150,13 @@ static int P(internal)(struct sort_context *ctx, struct sort_bucket *bin, struct
        stk_fsize((byte*)ctx->big_buf + bufsize - end));
   timestamp_t timer;
   init_timer(&timer);
        stk_fsize((byte*)ctx->big_buf + bufsize - end));
   timestamp_t timer;
   init_timer(&timer);
-  P(array_sort)(count, item_array);
+  item_array = P(array_sort)(item_array, count,
+#ifdef SORT_INTERNAL_RADIX
+    workspace, bin->hash_bits
+#else
+    NULL, 0
+#endif
+    );
   ctx->total_int_time += get_timer(&timer);
 
   SORT_XTRACE(4, "s-internal: Writing");
   ctx->total_int_time += get_timer(&timer);
 
   SORT_XTRACE(4, "s-internal: Writing");