X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fintmap%2Ftest%2Frun-order.c;h=d945a4a86f5a6e35e5a6e5ad3c29956a9935b3fa;hb=7aac849abf06ef469c2aad9a0dd6e3bb82ef1f96;hp=1b2fdffdfadcb68eeadebe547ae5c9510bebcc11;hpb=b796c0318151ce34b56d2973f567335fbf20aae7;p=ccan diff --git a/ccan/intmap/test/run-order.c b/ccan/intmap/test/run-order.c index 1b2fdffd..d945a4a8 100644 --- a/ccan/intmap/test/run-order.c +++ b/ccan/intmap/test/run-order.c @@ -7,12 +7,23 @@ typedef UINTMAP(unsigned int *) umap; typedef SINTMAP(int *) smap; +static bool uint_iterate_check(intmap_index_t i, unsigned int *v, int64_t *prev) +{ + if ((int64_t)i <= *prev) + return false; + if (*v != i) + return false; + *prev = i; + return true; +} + static bool check_umap(const umap *map) { /* This is a larger type than unsigned, and allows negative */ int64_t prev; - uint64_t i; + uint64_t i, last_idx; unsigned int *v; + bool last = true; /* Must be in order, must contain value. */ prev = -1; @@ -22,15 +33,45 @@ static bool check_umap(const umap *map) if (*v != i) return false; prev = i; + last = (uintmap_last(map, &last_idx) == v); + } + + if (!last) + return false; + + prev = INT_MAX; + for (v = uintmap_last(map, &i); v; v = uintmap_before(map, &i)) { + if ((int64_t)i >= prev) + return false; + if (*v != i) + return false; + prev = i; + last = (uintmap_first(map, &last_idx) == v); } + + if (!last) + return false; + + prev = -1; + return uintmap_iterate(map, uint_iterate_check, &prev); +} + +static bool sint_iterate_check(sintmap_index_t i, int *v, int64_t *prev) +{ + if (i <= *prev) + return false; + if (*v != i) + return false; + *prev = i; return true; } static bool check_smap(const smap *map) { /* This is a larger type than int, and allows negative */ - int64_t prev, i; + int64_t prev, i, last_idx; int *v; + bool last = true; /* Must be in order, must contain value. */ prev = -0x80000001ULL; @@ -39,9 +80,27 @@ static bool check_smap(const smap *map) return false; if (*v != i) return false; + last = (sintmap_last(map, &last_idx) == v); prev = i; } - return true; + + if (!last) + return false; + + prev = 0x80000001ULL; + for (v = sintmap_last(map, &i); v; v = sintmap_before(map, &i)) { + if (i >= prev) + return false; + if (*v != i) + return false; + prev = i; + last = (sintmap_first(map, &last_idx) == v); + } + if (!last) + return false; + + prev = -1; + return sintmap_iterate(map, sint_iterate_check, &prev); } int main(void)