PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ uint32_hilbert()

static uint64_t uint32_hilbert ( uint32_t  px,
uint32_t  py 
)
inlinestatic

Definition at line 815 of file gbox.c.

816{
817 uint64_t x = px;
818 uint64_t y = py;
819
820 uint64_t A, B, C, D;
821
822 // Initial prefix scan round, prime with x and y
823 {
824 uint64_t a = x ^ y;
825 uint64_t b = 0xFFFFFFFFULL ^ a;
826 uint64_t c = 0xFFFFFFFFULL ^ (x | y);
827 uint64_t d = x & (y ^ 0xFFFFFFFFULL);
828
829 A = a | (b >> 1);
830 B = (a >> 1) ^ a;
831 C = ((c >> 1) ^ (b & (d >> 1))) ^ c;
832 D = ((a & (c >> 1)) ^ (d >> 1)) ^ d;
833 }
834
835 {
836 uint64_t a = A;
837 uint64_t b = B;
838 uint64_t c = C;
839 uint64_t d = D;
840
841 A = ((a & (a >> 2)) ^ (b & (b >> 2)));
842 B = ((a & (b >> 2)) ^ (b & ((a ^ b) >> 2)));
843 C ^= ((a & (c >> 2)) ^ (b & (d >> 2)));
844 D ^= ((b & (c >> 2)) ^ ((a ^ b) & (d >> 2)));
845 }
846
847 {
848 uint64_t a = A;
849 uint64_t b = B;
850 uint64_t c = C;
851 uint64_t d = D;
852
853 A = ((a & (a >> 4)) ^ (b & (b >> 4)));
854 B = ((a & (b >> 4)) ^ (b & ((a ^ b) >> 4)));
855 C ^= ((a & (c >> 4)) ^ (b & (d >> 4)));
856 D ^= ((b & (c >> 4)) ^ ((a ^ b) & (d >> 4)));
857 }
858
859 {
860 uint64_t a = A;
861 uint64_t b = B;
862 uint64_t c = C;
863 uint64_t d = D;
864
865 A = ((a & (a >> 8)) ^ (b & (b >> 8)));
866 B = ((a & (b >> 8)) ^ (b & ((a ^ b) >> 8)));
867 C ^= ((a & (c >> 8)) ^ (b & (d >> 8)));
868 D ^= ((b & (c >> 8)) ^ ((a ^ b) & (d >> 8)));
869 }
870
871 {
872 uint64_t a = A;
873 uint64_t b = B;
874 uint64_t c = C;
875 uint64_t d = D;
876
877 C ^= ((a & (c >> 16)) ^ (b & (d >> 16)));
878 D ^= ((b & (c >> 16)) ^ ((a ^ b) & (d >> 16)));
879 }
880
881 // Undo transformation prefix scan
882 uint64_t a = C ^ (C >> 1);
883 uint64_t b = D ^ (D >> 1);
884
885 // Recover index bits
886 uint64_t i0 = x ^ y;
887 uint64_t i1 = b | (0xFFFFFFFFULL ^ (i0 | a));
888
889 return uint64_interleave_2(i0, i1);
890}
static uint64_t uint64_interleave_2(uint64_t x, uint64_t y)
Definition gbox.c:796

References uint64_interleave_2().

Referenced by gbox_get_sortable_hash().

Here is the call graph for this function:
Here is the caller graph for this function: