/* ** 2018-02-09 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ****************************************************************************** ** ** SQL functions for z-order (Morton code) transformations. ** ** zorder(X0,X0,..,xN) Generate an N+1 dimension Morton code ** ** unzorder(Z,N,I) Extract the I-th dimension from N-dimensional ** Morton code Z. */ #include "sqlite3ext.h" SQLITE_EXTENSION_INIT1 #include #include /* ** Functions: zorder(X0,X1,....) ** ** Convert integers X0, X1, ... into morton code. ** ** The output is a signed 64-bit integer. If any argument is too large, ** an error is thrown. */ static void zorderFunc( sqlite3_context *context, int argc, sqlite3_value **argv ){ sqlite3_int64 z, x[63]; int i, j; z = 0; for(i=0; i0 ){ for(i=0; i<63; i++){ j = i%argc; z |= (x[j]&1)<>= 1; } } sqlite3_result_int64(context, z); for(i=0; i>j)&1)<