2 #include "index_heap.h"
4 /* caller's responsibility to ensure hlen>=3 */
5 void heap_init(unsigned long long *h
, unsigned long long hlen
, sc25519
*scalars
)
8 unsigned long long i
=1;
10 heap_push(h
, &i
, i
, scalars
);
13 void heap_extend(unsigned long long *h
, unsigned long long oldlen
, unsigned long long newlen
, sc25519
*scalars
)
15 unsigned long long i
=oldlen
;
17 heap_push(h
, &i
, i
, scalars
);
21 void heap_push(unsigned long long *h
, unsigned long long *hlen
, unsigned long long elem
, sc25519
*scalars
)
23 /* Move up towards the root */
24 /* XXX: Check size of hlen, whether cast to signed value is ok */
25 signed long long pos
= *hlen
;
26 signed long long ppos
= (pos
-1)/2;
31 /* if(sc25519_lt_vartime(&scalars[h[ppos]], &scalars[h[pos]])) */
32 if(sc25519_lt(&scalars
[h
[ppos
]], &scalars
[h
[pos
]]))
45 /* Put the largest value in the heap in max1, the second largest in max2 */
46 void heap_get2max(unsigned long long *h
, unsigned long long *max1
, unsigned long long *max2
, sc25519
*scalars
)
50 if(sc25519_lt(&scalars
[h
[1]],&scalars
[h
[2]]))
54 /* After the root has been replaced, restore heap property */
55 /* extern void heap_rootreplaced(unsigned long long *h, unsigned long long hlen, sc25519 *scalars);
57 /* extern void heap_rootreplaced_shortscalars(unsigned long long *h, unsigned long long hlen, sc25519 *scalars);