X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Finclude%2Fgnunet_container_lib.h;h=c77d82fd37a6874c092dc4ae80e7fd27a789f7d6;hb=a67bd3630046d3a52195a13cbd4b4631c283d68d;hp=c99b911a104d9c51d9bbb11c315b9cf15e8bbe1c;hpb=5d52f126f510a223d371459f17d5aaa46e9dfe49;p=oweals%2Fgnunet.git diff --git a/src/include/gnunet_container_lib.h b/src/include/gnunet_container_lib.h index c99b911a1..c77d82fd3 100644 --- a/src/include/gnunet_container_lib.h +++ b/src/include/gnunet_container_lib.h @@ -1300,7 +1300,7 @@ GNUNET_CONTAINER_multipeermap_get_random (const struct GNUNET_CONTAINER_MultiPee */ typedef int (*GNUNET_CONTAINER_ShortmapIterator) (void *cls, - const struct GNUNET_PeerIdentity *key, + const struct GNUNET_ShortHashCode *key, void *value); @@ -1355,7 +1355,7 @@ GNUNET_CONTAINER_multishortmap_destroy (struct GNUNET_CONTAINER_MultiShortmap *m */ void * GNUNET_CONTAINER_multishortmap_get (const struct GNUNET_CONTAINER_MultiShortmap *map, - const struct GNUNET_PeerIdentity *key); + const struct GNUNET_ShortHashCode *key); /** @@ -1372,7 +1372,7 @@ GNUNET_CONTAINER_multishortmap_get (const struct GNUNET_CONTAINER_MultiShortmap */ int GNUNET_CONTAINER_multishortmap_remove (struct GNUNET_CONTAINER_MultiShortmap *map, - const struct GNUNET_PeerIdentity * key, + const struct GNUNET_ShortHashCode * key, const void *value); /** @@ -1386,7 +1386,7 @@ GNUNET_CONTAINER_multishortmap_remove (struct GNUNET_CONTAINER_MultiShortmap *ma */ int GNUNET_CONTAINER_multishortmap_remove_all (struct GNUNET_CONTAINER_MultiShortmap *map, - const struct GNUNET_PeerIdentity *key); + const struct GNUNET_ShortHashCode *key); /** @@ -1401,7 +1401,7 @@ GNUNET_CONTAINER_multishortmap_remove_all (struct GNUNET_CONTAINER_MultiShortmap */ int GNUNET_CONTAINER_multishortmap_contains (const struct GNUNET_CONTAINER_MultiShortmap *map, - const struct GNUNET_PeerIdentity *key); + const struct GNUNET_ShortHashCode *key); /** @@ -1417,7 +1417,7 @@ GNUNET_CONTAINER_multishortmap_contains (const struct GNUNET_CONTAINER_MultiShor */ int GNUNET_CONTAINER_multishortmap_contains_value (const struct GNUNET_CONTAINER_MultiShortmap *map, - const struct GNUNET_PeerIdentity * key, + const struct GNUNET_ShortHashCode * key, const void *value); @@ -1436,7 +1436,7 @@ GNUNET_CONTAINER_multishortmap_contains_value (const struct GNUNET_CONTAINER_Mul */ int GNUNET_CONTAINER_multishortmap_put (struct GNUNET_CONTAINER_MultiShortmap *map, - const struct GNUNET_PeerIdentity *key, + const struct GNUNET_ShortHashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt); @@ -1505,7 +1505,7 @@ GNUNET_CONTAINER_multishortmap_iterator_create (const struct GNUNET_CONTAINER_Mu */ int GNUNET_CONTAINER_multishortmap_iterator_next (struct GNUNET_CONTAINER_MultiShortmapIterator *iter, - struct GNUNET_PeerIdentity *key, + struct GNUNET_ShortHashCode *key, const void **value); @@ -1532,7 +1532,7 @@ GNUNET_CONTAINER_multishortmap_iterator_destroy (struct GNUNET_CONTAINER_MultiSh */ int GNUNET_CONTAINER_multishortmap_get_multiple (const struct GNUNET_CONTAINER_MultiShortmap *map, - const struct GNUNET_PeerIdentity *key, + const struct GNUNET_ShortHashCode *key, GNUNET_CONTAINER_ShortmapIterator it, void *it_cls); @@ -2073,6 +2073,59 @@ GNUNET_CONTAINER_multihashmap32_iterator_destroy (struct GNUNET_CONTAINER_MultiH +/** + * Insertion sort of @a element into DLL from @a head to @a tail + * sorted by @a comparator. + * + * @param TYPE element type of the elements, i.e. `struct ListElement` + * @param comparator function like memcmp() to compare elements; takes + * three arguments, the @a comparator_cls and two elements, + * returns an `int` (-1, 0 or 1) + * @param comparator_cls closure for @a comparator + * @param[in,out] head head of DLL + * @param[in,out] tail tail of DLL + * @param element element to insert + */ +#define GNUNET_CONTAINER_DLL_insert_sorted(TYPE,comparator,comparator_cls,head,tail,element) do { \ + if ( (NULL == head) || \ + (0 < comparator (comparator_cls, \ + element, \ + head)) ) \ + { \ + /* insert at head, element < head */ \ + GNUNET_CONTAINER_DLL_insert (head, \ + tail, \ + element); \ + } \ + else \ + { \ + TYPE *pos; \ + \ + for (pos = head; \ + NULL != pos; \ + pos = pos->next) \ + if (0 < \ + comparator (comparator_cls, \ + element, \ + pos)) \ + break; /* element < pos */ \ + if (NULL == pos) /* => element > tail */ \ + { \ + GNUNET_CONTAINER_DLL_insert_tail (head, \ + tail, \ + element); \ + } \ + else /* prev < element < pos */ \ + { \ + GNUNET_CONTAINER_DLL_insert_after (head, \ + tail, \ + pos->prev, \ + element); \ + } \ + } \ +} while (0) + + /* ******************** Heap *************** */