test/test_list.cpp

changeset 653
e081643aae2a
parent 652
bf817b825ed2
child 654
c9d008861178
     1.1 --- a/test/test_list.cpp	Tue Feb 07 21:53:06 2023 +0100
     1.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.3 @@ -1,1077 +0,0 @@
     1.4 -/*
     1.5 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     1.6 - *
     1.7 - * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
     1.8 - *
     1.9 - * Redistribution and use in source and binary forms, with or without
    1.10 - * modification, are permitted provided that the following conditions are met:
    1.11 - *
    1.12 - *   1. Redistributions of source code must retain the above copyright
    1.13 - *      notice, this list of conditions and the following disclaimer.
    1.14 - *
    1.15 - *   2. Redistributions in binary form must reproduce the above copyright
    1.16 - *      notice, this list of conditions and the following disclaimer in the
    1.17 - *      documentation and/or other materials provided with the distribution.
    1.18 - *
    1.19 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    1.20 - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    1.21 - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    1.22 - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
    1.23 - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    1.24 - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    1.25 - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    1.26 - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    1.27 - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    1.28 - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    1.29 - * POSSIBILITY OF SUCH DAMAGE.
    1.30 - */
    1.31 -
    1.32 -#include "cx/linked_list.h"
    1.33 -#include "cx/array_list.h"
    1.34 -#include "cx/utils.h"
    1.35 -#include "cx/compare.h"
    1.36 -#include "util_allocator.h"
    1.37 -
    1.38 -#include <gtest/gtest.h>
    1.39 -#include <array>
    1.40 -#include <vector>
    1.41 -#include <unordered_set>
    1.42 -#include <algorithm>
    1.43 -
    1.44 -struct node {
    1.45 -    node *next = nullptr;
    1.46 -    node *prev = nullptr;
    1.47 -    int data = 0;
    1.48 -};
    1.49 -
    1.50 -const ptrdiff_t loc_prev = offsetof(struct node, prev);
    1.51 -const ptrdiff_t loc_next = offsetof(struct node, next);
    1.52 -const ptrdiff_t loc_data = offsetof(struct node, data);
    1.53 -
    1.54 -struct node_test_data {
    1.55 -    node *begin = nullptr;
    1.56 -
    1.57 -    explicit node_test_data(node *begin) : begin(begin) {
    1.58 -        auto n = begin;
    1.59 -        while (n != nullptr) {
    1.60 -            nodes.push_back(n);
    1.61 -            n = n->next;
    1.62 -        }
    1.63 -    }
    1.64 -
    1.65 -    node_test_data(node_test_data &) = delete;
    1.66 -
    1.67 -    node_test_data(node_test_data &&) = default;
    1.68 -
    1.69 -    ~node_test_data() {
    1.70 -        for (auto &&n: nodes) delete n;
    1.71 -    }
    1.72 -
    1.73 -private:
    1.74 -    std::vector<node *> nodes;
    1.75 -};
    1.76 -
    1.77 -static node_test_data create_nodes_test_data(size_t len) {
    1.78 -    if (len == 0) return node_test_data{nullptr};
    1.79 -    auto begin = new node;
    1.80 -    auto prev = begin;
    1.81 -    for (size_t i = 1; i < len; i++) {
    1.82 -        auto n = new node;
    1.83 -        cx_linked_list_link(prev, n, loc_prev, loc_next);
    1.84 -        prev = n;
    1.85 -    }
    1.86 -    return node_test_data{begin};
    1.87 -}
    1.88 -
    1.89 -template<typename InputIter>
    1.90 -static node_test_data create_nodes_test_data(
    1.91 -        InputIter begin,
    1.92 -        InputIter end
    1.93 -) {
    1.94 -    if (begin == end) return node_test_data{nullptr};
    1.95 -    node *first = new node;
    1.96 -    first->data = *begin;
    1.97 -    node *prev = first;
    1.98 -    begin++;
    1.99 -    for (; begin != end; begin++) {
   1.100 -        auto n = new node;
   1.101 -        n->data = *begin;
   1.102 -        cx_linked_list_link(prev, n, loc_prev, loc_next);
   1.103 -        prev = n;
   1.104 -    }
   1.105 -    return node_test_data{first};
   1.106 -}
   1.107 -
   1.108 -static node_test_data create_nodes_test_data(std::initializer_list<int> data) {
   1.109 -    return create_nodes_test_data(data.begin(), data.end());
   1.110 -}
   1.111 -
   1.112 -template<size_t N>
   1.113 -struct int_test_data {
   1.114 -    std::array<int, N> data;
   1.115 -
   1.116 -    int_test_data() {
   1.117 -        cx_for_n (i, N) data[i] = ::rand(); // NOLINT(cert-msc50-cpp)
   1.118 -    }
   1.119 -};
   1.120 -
   1.121 -TEST(LinkedList_LowLevel, link_unlink) {
   1.122 -    node a, b, c;
   1.123 -
   1.124 -    cx_linked_list_link(&a, &b, loc_prev, loc_next);
   1.125 -    EXPECT_EQ(a.prev, nullptr);
   1.126 -    EXPECT_EQ(a.next, &b);
   1.127 -    EXPECT_EQ(b.prev, &a);
   1.128 -    EXPECT_EQ(b.next, nullptr);
   1.129 -
   1.130 -    cx_linked_list_unlink(&a, &b, loc_prev, loc_next);
   1.131 -    EXPECT_EQ(a.prev, nullptr);
   1.132 -    EXPECT_EQ(a.next, nullptr);
   1.133 -    EXPECT_EQ(b.prev, nullptr);
   1.134 -    EXPECT_EQ(b.next, nullptr);
   1.135 -
   1.136 -    cx_linked_list_link(&b, &c, loc_prev, loc_next);
   1.137 -    cx_linked_list_link(&a, &b, loc_prev, loc_next);
   1.138 -    cx_linked_list_unlink(&b, &c, loc_prev, loc_next);
   1.139 -    EXPECT_EQ(a.prev, nullptr);
   1.140 -    EXPECT_EQ(a.next, &b);
   1.141 -    EXPECT_EQ(b.prev, &a);
   1.142 -    EXPECT_EQ(b.next, nullptr);
   1.143 -    EXPECT_EQ(c.prev, nullptr);
   1.144 -    EXPECT_EQ(c.next, nullptr);
   1.145 -}
   1.146 -
   1.147 -TEST(LinkedList_LowLevel, cx_linked_list_at) {
   1.148 -    node a, b, c, d;
   1.149 -    cx_linked_list_link(&a, &b, loc_prev, loc_next);
   1.150 -    cx_linked_list_link(&b, &c, loc_prev, loc_next);
   1.151 -    cx_linked_list_link(&c, &d, loc_prev, loc_next);
   1.152 -
   1.153 -    EXPECT_EQ(cx_linked_list_at(&a, 0, loc_next, 0), &a);
   1.154 -    EXPECT_EQ(cx_linked_list_at(&a, 0, loc_next, 1), &b);
   1.155 -    EXPECT_EQ(cx_linked_list_at(&a, 0, loc_next, 2), &c);
   1.156 -    EXPECT_EQ(cx_linked_list_at(&a, 0, loc_next, 3), &d);
   1.157 -    EXPECT_EQ(cx_linked_list_at(&a, 0, loc_next, 4), nullptr);
   1.158 -
   1.159 -    EXPECT_EQ(cx_linked_list_at(&b, 1, loc_prev, 0), &a);
   1.160 -    EXPECT_EQ(cx_linked_list_at(&b, 1, loc_next, 1), &b);
   1.161 -    EXPECT_EQ(cx_linked_list_at(&b, 1, loc_next, 2), &c);
   1.162 -    EXPECT_EQ(cx_linked_list_at(&b, 1, loc_next, 3), &d);
   1.163 -    EXPECT_EQ(cx_linked_list_at(&b, 1, loc_next, 4), nullptr);
   1.164 -
   1.165 -    EXPECT_EQ(cx_linked_list_at(&d, 3, loc_prev, 0), &a);
   1.166 -    EXPECT_EQ(cx_linked_list_at(&d, 3, loc_prev, 1), &b);
   1.167 -}
   1.168 -
   1.169 -TEST(LinkedList_LowLevel, cx_linked_list_find) {
   1.170 -    auto testdata = create_nodes_test_data({2, 4, 6, 8});
   1.171 -    auto list = testdata.begin;
   1.172 -    int s;
   1.173 -
   1.174 -    s = 2;
   1.175 -    EXPECT_EQ(cx_linked_list_find(list, loc_next, loc_data, cx_cmp_int, &s), 0);
   1.176 -    s = 4;
   1.177 -    EXPECT_EQ(cx_linked_list_find(list, loc_next, loc_data, cx_cmp_int, &s), 1);
   1.178 -    s = 6;
   1.179 -    EXPECT_EQ(cx_linked_list_find(list, loc_next, loc_data, cx_cmp_int, &s), 2);
   1.180 -    s = 8;
   1.181 -    EXPECT_EQ(cx_linked_list_find(list, loc_next, loc_data, cx_cmp_int, &s), 3);
   1.182 -    s = 10;
   1.183 -    EXPECT_EQ(cx_linked_list_find(list, loc_next, loc_data, cx_cmp_int, &s), 4);
   1.184 -    s = -2;
   1.185 -    EXPECT_EQ(cx_linked_list_find(list, loc_next, loc_data, cx_cmp_int, &s), 4);
   1.186 -}
   1.187 -
   1.188 -TEST(LinkedList_LowLevel, cx_linked_list_compare) {
   1.189 -    auto ta = create_nodes_test_data({2, 4, 6, 8});
   1.190 -    auto tb = create_nodes_test_data({2, 4, 6});
   1.191 -    auto tc = create_nodes_test_data({2, 4, 6, 9});
   1.192 -    auto la = ta.begin, lb = tb.begin, lc = tc.begin;
   1.193 -
   1.194 -    EXPECT_GT(cx_linked_list_compare(la, lb, loc_next, loc_data, cx_cmp_int), 0);
   1.195 -    EXPECT_LT(cx_linked_list_compare(lb, la, loc_next, loc_data, cx_cmp_int), 0);
   1.196 -    EXPECT_GT(cx_linked_list_compare(lc, la, loc_next, loc_data, cx_cmp_int), 0);
   1.197 -    EXPECT_LT(cx_linked_list_compare(la, lc, loc_next, loc_data, cx_cmp_int), 0);
   1.198 -    EXPECT_EQ(cx_linked_list_compare(la, la, loc_next, loc_data, cx_cmp_int), 0);
   1.199 -}
   1.200 -
   1.201 -TEST(LinkedList_LowLevel, cx_linked_list_add) {
   1.202 -    // test with begin, end / prev, next
   1.203 -    {
   1.204 -        node nodes[4];
   1.205 -        void *begin = nullptr, *end = nullptr;
   1.206 -
   1.207 -        cx_linked_list_add(&begin, &end, loc_prev, loc_next, &nodes[0]);
   1.208 -        EXPECT_EQ(begin, &nodes[0]);
   1.209 -        EXPECT_EQ(end, &nodes[0]);
   1.210 -        EXPECT_EQ(nodes[0].prev, nullptr);
   1.211 -        EXPECT_EQ(nodes[0].next, nullptr);
   1.212 -
   1.213 -        cx_linked_list_add(&begin, &end, loc_prev, loc_next, &nodes[1]);
   1.214 -        EXPECT_EQ(begin, &nodes[0]);
   1.215 -        EXPECT_EQ(end, &nodes[1]);
   1.216 -        EXPECT_EQ(nodes[0].next, &nodes[1]);
   1.217 -        EXPECT_EQ(nodes[1].prev, &nodes[0]);
   1.218 -    }
   1.219 -
   1.220 -    // test with begin only / prev, next
   1.221 -    {
   1.222 -        node nodes[4];
   1.223 -        void *begin = nullptr;
   1.224 -
   1.225 -        cx_linked_list_add(&begin, nullptr, loc_prev, loc_next, &nodes[0]);
   1.226 -        EXPECT_EQ(begin, &nodes[0]);
   1.227 -        cx_linked_list_add(&begin, nullptr, loc_prev, loc_next, &nodes[1]);
   1.228 -        EXPECT_EQ(begin, &nodes[0]);
   1.229 -        EXPECT_EQ(nodes[0].next, &nodes[1]);
   1.230 -        EXPECT_EQ(nodes[1].prev, &nodes[0]);
   1.231 -
   1.232 -        cx_linked_list_add(&begin, nullptr, loc_prev, loc_next, &nodes[2]);
   1.233 -        EXPECT_EQ(nodes[1].next, &nodes[2]);
   1.234 -        EXPECT_EQ(nodes[2].prev, &nodes[1]);
   1.235 -    }
   1.236 -
   1.237 -    // test with end only / prev, next
   1.238 -    {
   1.239 -        node nodes[4];
   1.240 -        void *end = nullptr;
   1.241 -
   1.242 -        cx_linked_list_add(nullptr, &end, loc_prev, loc_next, &nodes[0]);
   1.243 -        EXPECT_EQ(end, &nodes[0]);
   1.244 -        cx_linked_list_add(nullptr, &end, loc_prev, loc_next, &nodes[1]);
   1.245 -        EXPECT_EQ(end, &nodes[1]);
   1.246 -        EXPECT_EQ(nodes[0].next, &nodes[1]);
   1.247 -        EXPECT_EQ(nodes[1].prev, &nodes[0]);
   1.248 -
   1.249 -        cx_linked_list_add(nullptr, &end, loc_prev, loc_next, &nodes[2]);
   1.250 -        EXPECT_EQ(end, &nodes[2]);
   1.251 -        EXPECT_EQ(nodes[1].next, &nodes[2]);
   1.252 -        EXPECT_EQ(nodes[2].prev, &nodes[1]);
   1.253 -    }
   1.254 -
   1.255 -    // test with begin, end / next
   1.256 -    {
   1.257 -        node nodes[4];
   1.258 -        void *begin = nullptr, *end = nullptr;
   1.259 -
   1.260 -        cx_linked_list_add(&begin, &end, -1, loc_next, &nodes[0]);
   1.261 -        EXPECT_EQ(begin, &nodes[0]);
   1.262 -        EXPECT_EQ(end, &nodes[0]);
   1.263 -        cx_linked_list_add(&begin, &end, -1, loc_next, &nodes[1]);
   1.264 -        EXPECT_EQ(end, &nodes[1]);
   1.265 -        EXPECT_EQ(nodes[0].next, &nodes[1]);
   1.266 -        EXPECT_EQ(nodes[1].prev, nullptr);
   1.267 -    }
   1.268 -}
   1.269 -
   1.270 -TEST(LinkedList_LowLevel, cx_linked_list_prepend) {
   1.271 -    // test with begin, end / prev, next
   1.272 -    {
   1.273 -        node nodes[4];
   1.274 -        void *begin = nullptr, *end = nullptr;
   1.275 -
   1.276 -        cx_linked_list_prepend(&begin, &end, loc_prev, loc_next, &nodes[0]);
   1.277 -        EXPECT_EQ(begin, &nodes[0]);
   1.278 -        EXPECT_EQ(end, &nodes[0]);
   1.279 -        EXPECT_EQ(nodes[0].prev, nullptr);
   1.280 -        EXPECT_EQ(nodes[0].next, nullptr);
   1.281 -
   1.282 -        cx_linked_list_prepend(&begin, &end, loc_prev, loc_next, &nodes[1]);
   1.283 -        EXPECT_EQ(begin, &nodes[1]);
   1.284 -        EXPECT_EQ(end, &nodes[0]);
   1.285 -        EXPECT_EQ(nodes[1].next, &nodes[0]);
   1.286 -        EXPECT_EQ(nodes[0].prev, &nodes[1]);
   1.287 -    }
   1.288 -
   1.289 -    // test with begin only / prev, next
   1.290 -    {
   1.291 -        node nodes[4];
   1.292 -        void *begin = nullptr;
   1.293 -
   1.294 -        cx_linked_list_prepend(&begin, nullptr, loc_prev, loc_next, &nodes[0]);
   1.295 -        EXPECT_EQ(begin, &nodes[0]);
   1.296 -        cx_linked_list_prepend(&begin, nullptr, loc_prev, loc_next, &nodes[1]);
   1.297 -        EXPECT_EQ(begin, &nodes[1]);
   1.298 -        EXPECT_EQ(nodes[1].next, &nodes[0]);
   1.299 -        EXPECT_EQ(nodes[0].prev, &nodes[1]);
   1.300 -
   1.301 -        cx_linked_list_prepend(&begin, nullptr, loc_prev, loc_next, &nodes[2]);
   1.302 -        EXPECT_EQ(begin, &nodes[2]);
   1.303 -        EXPECT_EQ(nodes[2].next, &nodes[1]);
   1.304 -        EXPECT_EQ(nodes[1].prev, &nodes[2]);
   1.305 -    }
   1.306 -
   1.307 -    // test with end only / prev, next
   1.308 -    {
   1.309 -        node nodes[4];
   1.310 -        void *end = nullptr;
   1.311 -
   1.312 -        cx_linked_list_prepend(nullptr, &end, loc_prev, loc_next, &nodes[0]);
   1.313 -        EXPECT_EQ(end, &nodes[0]);
   1.314 -        cx_linked_list_prepend(nullptr, &end, loc_prev, loc_next, &nodes[1]);
   1.315 -        EXPECT_EQ(end, &nodes[0]);
   1.316 -        EXPECT_EQ(nodes[1].next, &nodes[0]);
   1.317 -        EXPECT_EQ(nodes[0].prev, &nodes[1]);
   1.318 -
   1.319 -        cx_linked_list_prepend(nullptr, &end, loc_prev, loc_next, &nodes[2]);
   1.320 -        EXPECT_EQ(end, &nodes[0]);
   1.321 -        EXPECT_EQ(nodes[2].next, &nodes[1]);
   1.322 -        EXPECT_EQ(nodes[1].prev, &nodes[2]);
   1.323 -    }
   1.324 -
   1.325 -    // test with begin, end / next
   1.326 -    {
   1.327 -        node nodes[4];
   1.328 -        void *begin = nullptr, *end = nullptr;
   1.329 -
   1.330 -        cx_linked_list_prepend(&begin, &end, -1, loc_next, &nodes[0]);
   1.331 -        EXPECT_EQ(begin, &nodes[0]);
   1.332 -        EXPECT_EQ(end, &nodes[0]);
   1.333 -        cx_linked_list_prepend(&begin, &end, -1, loc_next, &nodes[1]);
   1.334 -        cx_linked_list_prepend(&begin, &end, -1, loc_next, &nodes[2]);
   1.335 -        EXPECT_EQ(begin, &nodes[2]);
   1.336 -        EXPECT_EQ(end, &nodes[0]);
   1.337 -        EXPECT_EQ(nodes[1].next, &nodes[0]);
   1.338 -        EXPECT_EQ(nodes[2].next, &nodes[1]);
   1.339 -        EXPECT_EQ(nodes[1].prev, nullptr);
   1.340 -        EXPECT_EQ(nodes[0].prev, nullptr);
   1.341 -    }
   1.342 -}
   1.343 -
   1.344 -TEST(LinkedList_LowLevel, cx_linked_list_insert) {
   1.345 -    // insert mid list
   1.346 -    {
   1.347 -        node nodes[4];
   1.348 -        void *begin = &nodes[0], *end = &nodes[2];
   1.349 -
   1.350 -        cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   1.351 -        cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   1.352 -
   1.353 -        cx_linked_list_insert(&begin, &end, loc_prev, loc_next, &nodes[1], &nodes[3]);
   1.354 -        EXPECT_EQ(begin, &nodes[0]);
   1.355 -        EXPECT_EQ(end, &nodes[2]);
   1.356 -        EXPECT_EQ(nodes[1].next, &nodes[3]);
   1.357 -        EXPECT_EQ(nodes[2].prev, &nodes[3]);
   1.358 -        EXPECT_EQ(nodes[3].prev, &nodes[1]);
   1.359 -        EXPECT_EQ(nodes[3].next, &nodes[2]);
   1.360 -    }
   1.361 -
   1.362 -    // insert end
   1.363 -    {
   1.364 -        node nodes[4];
   1.365 -        void *begin = &nodes[0], *end = &nodes[2];
   1.366 -
   1.367 -        cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   1.368 -        cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   1.369 -
   1.370 -        cx_linked_list_insert(&begin, &end, loc_prev, loc_next, &nodes[2], &nodes[3]);
   1.371 -        EXPECT_EQ(begin, &nodes[0]);
   1.372 -        EXPECT_EQ(end, &nodes[3]);
   1.373 -        EXPECT_EQ(nodes[2].next, &nodes[3]);
   1.374 -        EXPECT_EQ(nodes[3].prev, &nodes[2]);
   1.375 -        EXPECT_EQ(nodes[3].next, nullptr);
   1.376 -    }
   1.377 -
   1.378 -    // insert begin
   1.379 -    {
   1.380 -        node nodes[4];
   1.381 -        void *begin = &nodes[0], *end = &nodes[2];
   1.382 -
   1.383 -        cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   1.384 -        cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   1.385 -
   1.386 -        cx_linked_list_insert(&begin, &end, loc_prev, loc_next, nullptr, &nodes[3]);
   1.387 -        EXPECT_EQ(begin, &nodes[3]);
   1.388 -        EXPECT_EQ(end, &nodes[2]);
   1.389 -        EXPECT_EQ(nodes[0].prev, &nodes[3]);
   1.390 -        EXPECT_EQ(nodes[3].prev, nullptr);
   1.391 -        EXPECT_EQ(nodes[3].next, &nodes[0]);
   1.392 -    }
   1.393 -}
   1.394 -
   1.395 -TEST(LinkedList_LowLevel, cx_linked_list_insert_chain) {
   1.396 -    // insert mid list
   1.397 -    {
   1.398 -        node nodes[5];
   1.399 -        void *begin = &nodes[0], *end = &nodes[2];
   1.400 -
   1.401 -        cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   1.402 -        cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   1.403 -        cx_linked_list_link(&nodes[3], &nodes[4], loc_prev, loc_next);
   1.404 -
   1.405 -        cx_linked_list_insert_chain(&begin, &end, loc_prev, loc_next, &nodes[1], &nodes[3], nullptr);
   1.406 -        EXPECT_EQ(begin, &nodes[0]);
   1.407 -        EXPECT_EQ(end, &nodes[2]);
   1.408 -        EXPECT_EQ(nodes[1].next, &nodes[3]);
   1.409 -        EXPECT_EQ(nodes[2].prev, &nodes[4]);
   1.410 -        EXPECT_EQ(nodes[3].prev, &nodes[1]);
   1.411 -        EXPECT_EQ(nodes[4].next, &nodes[2]);
   1.412 -    }
   1.413 -
   1.414 -    // insert end
   1.415 -    {
   1.416 -        node nodes[5];
   1.417 -        void *begin = &nodes[0], *end = &nodes[2];
   1.418 -
   1.419 -        cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   1.420 -        cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   1.421 -        cx_linked_list_link(&nodes[3], &nodes[4], loc_prev, loc_next);
   1.422 -
   1.423 -        cx_linked_list_insert_chain(&begin, &end, loc_prev, loc_next, &nodes[2], &nodes[3], nullptr);
   1.424 -        EXPECT_EQ(begin, &nodes[0]);
   1.425 -        EXPECT_EQ(end, &nodes[4]);
   1.426 -        EXPECT_EQ(nodes[2].next, &nodes[3]);
   1.427 -        EXPECT_EQ(nodes[3].prev, &nodes[2]);
   1.428 -        EXPECT_EQ(nodes[4].next, nullptr);
   1.429 -    }
   1.430 -
   1.431 -    // insert begin
   1.432 -    {
   1.433 -        node nodes[5];
   1.434 -        void *begin = &nodes[0], *end = &nodes[2];
   1.435 -
   1.436 -        cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
   1.437 -        cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
   1.438 -        cx_linked_list_link(&nodes[3], &nodes[4], loc_prev, loc_next);
   1.439 -
   1.440 -        cx_linked_list_insert_chain(&begin, &end, loc_prev, loc_next, nullptr, &nodes[3], nullptr);
   1.441 -        EXPECT_EQ(begin, &nodes[3]);
   1.442 -        EXPECT_EQ(end, &nodes[2]);
   1.443 -        EXPECT_EQ(nodes[0].prev, &nodes[4]);
   1.444 -        EXPECT_EQ(nodes[3].prev, nullptr);
   1.445 -        EXPECT_EQ(nodes[4].next, &nodes[0]);
   1.446 -    }
   1.447 -}
   1.448 -
   1.449 -TEST(LinkedList_LowLevel, cx_linked_list_first) {
   1.450 -    auto testdata = create_nodes_test_data(3);
   1.451 -    auto begin = testdata.begin;
   1.452 -    EXPECT_EQ(cx_linked_list_first(begin, loc_prev), begin);
   1.453 -    EXPECT_EQ(cx_linked_list_first(begin->next, loc_prev), begin);
   1.454 -    EXPECT_EQ(cx_linked_list_first(begin->next->next, loc_prev), begin);
   1.455 -}
   1.456 -
   1.457 -TEST(LinkedList_LowLevel, cx_linked_list_last) {
   1.458 -    auto testdata = create_nodes_test_data(3);
   1.459 -    auto begin = testdata.begin;
   1.460 -    auto end = begin->next->next;
   1.461 -    EXPECT_EQ(cx_linked_list_last(begin, loc_next), end);
   1.462 -    EXPECT_EQ(cx_linked_list_last(begin->next, loc_next), end);
   1.463 -    EXPECT_EQ(cx_linked_list_last(begin->next->next, loc_next), end);
   1.464 -}
   1.465 -
   1.466 -TEST(LinkedList_LowLevel, cx_linked_list_prev) {
   1.467 -    auto testdata = create_nodes_test_data(3);
   1.468 -    auto begin = testdata.begin;
   1.469 -    EXPECT_EQ(cx_linked_list_prev(begin, loc_next, begin), nullptr);
   1.470 -    EXPECT_EQ(cx_linked_list_prev(begin, loc_next, begin->next), begin);
   1.471 -    EXPECT_EQ(cx_linked_list_prev(begin, loc_next, begin->next->next), begin->next);
   1.472 -}
   1.473 -
   1.474 -TEST(LinkedList_LowLevel, cx_linked_list_remove) {
   1.475 -    auto testdata = create_nodes_test_data({2, 4, 6});
   1.476 -    auto begin = reinterpret_cast<void *>(testdata.begin);
   1.477 -    auto first = testdata.begin;
   1.478 -    auto second = first->next;
   1.479 -    auto third = second->next;
   1.480 -    auto end = reinterpret_cast<void *>(third);
   1.481 -
   1.482 -    cx_linked_list_remove(&begin, &end, loc_prev, loc_next, second);
   1.483 -    EXPECT_EQ(begin, first);
   1.484 -    EXPECT_EQ(end, third);
   1.485 -    EXPECT_EQ(first->prev, nullptr);
   1.486 -    EXPECT_EQ(first->next, third);
   1.487 -    EXPECT_EQ(third->prev, first);
   1.488 -    EXPECT_EQ(third->next, nullptr);
   1.489 -
   1.490 -    cx_linked_list_remove(&begin, &end, loc_prev, loc_next, third);
   1.491 -    EXPECT_EQ(begin, first);
   1.492 -    EXPECT_EQ(end, first);
   1.493 -    EXPECT_EQ(first->prev, nullptr);
   1.494 -    EXPECT_EQ(first->next, nullptr);
   1.495 -
   1.496 -    cx_linked_list_remove(&begin, &end, loc_prev, loc_next, first);
   1.497 -    EXPECT_EQ(begin, nullptr);
   1.498 -    EXPECT_EQ(end, nullptr);
   1.499 -}
   1.500 -
   1.501 -TEST(LinkedList_LowLevel, cx_linked_list_size) {
   1.502 -    EXPECT_EQ(cx_linked_list_size(nullptr, loc_next), 0);
   1.503 -
   1.504 -    {
   1.505 -        auto testdata = create_nodes_test_data(5);
   1.506 -        EXPECT_EQ(cx_linked_list_size(testdata.begin, loc_next), 5);
   1.507 -    }
   1.508 -
   1.509 -    {
   1.510 -        auto testdata = create_nodes_test_data(13);
   1.511 -        EXPECT_EQ(cx_linked_list_size(testdata.begin, loc_next), 13);
   1.512 -    }
   1.513 -}
   1.514 -
   1.515 -TEST(LinkedList_LowLevel, cx_linked_list_sort) {
   1.516 -    int_test_data<1500> testdata;
   1.517 -    std::array<int, 1500> sorted{};
   1.518 -    std::partial_sort_copy(testdata.data.begin(), testdata.data.end(), sorted.begin(), sorted.end());
   1.519 -
   1.520 -    auto scrambled = create_nodes_test_data(testdata.data.begin(), testdata.data.end());
   1.521 -    void *begin = scrambled.begin;
   1.522 -    void *end = cx_linked_list_last(begin, loc_next);
   1.523 -
   1.524 -    cx_linked_list_sort(&begin, &end, loc_prev, loc_next, loc_data, cx_cmp_int);
   1.525 -
   1.526 -    node *check = reinterpret_cast<node *>(begin);
   1.527 -    node *check_last = nullptr;
   1.528 -    cx_for_n (i, sorted.size()) {
   1.529 -        EXPECT_EQ(check->data, sorted[i]);
   1.530 -        EXPECT_EQ(check->prev, check_last);
   1.531 -        if (i < sorted.size() - 1) {
   1.532 -            ASSERT_NE(check->next, nullptr);
   1.533 -        }
   1.534 -        check_last = check;
   1.535 -        check = check->next;
   1.536 -    }
   1.537 -    EXPECT_EQ(check, nullptr);
   1.538 -    EXPECT_EQ(end, check_last);
   1.539 -}
   1.540 -
   1.541 -TEST(LinkedList_LowLevel, cx_linked_list_reverse) {
   1.542 -    auto testdata = create_nodes_test_data({2, 4, 6, 8});
   1.543 -    auto expected = create_nodes_test_data({8, 6, 4, 2});
   1.544 -
   1.545 -    auto begin = reinterpret_cast<void *>(testdata.begin);
   1.546 -    auto end = cx_linked_list_last(begin, loc_next);
   1.547 -    auto orig_begin = begin, orig_end = end;
   1.548 -
   1.549 -    cx_linked_list_reverse(&begin, &end, loc_prev, loc_next);
   1.550 -    EXPECT_EQ(end, orig_begin);
   1.551 -    EXPECT_EQ(begin, orig_end);
   1.552 -    EXPECT_EQ(cx_linked_list_compare(begin, expected.begin, loc_next, loc_data, cx_cmp_int), 0);
   1.553 -}
   1.554 -
   1.555 -class HighLevelTest : public ::testing::Test {
   1.556 -    mutable std::unordered_set<CxList *> lists;
   1.557 -protected:
   1.558 -    CxTestingAllocator testingAllocator;
   1.559 -
   1.560 -    void TearDown() override {
   1.561 -        for (auto &&l: lists) cxListDestroy(l);
   1.562 -        EXPECT_TRUE(testingAllocator.verify());
   1.563 -    }
   1.564 -
   1.565 -    static constexpr size_t testdata_len = 250;
   1.566 -    int_test_data<testdata_len> testdata;
   1.567 -
   1.568 -    auto autofree(CxList *list) const -> CxList * {
   1.569 -        if (list != nullptr) lists.insert(list);
   1.570 -        return list;
   1.571 -    }
   1.572 -
   1.573 -    auto linkedListFromTestData() const -> CxList * {
   1.574 -        auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)));
   1.575 -        cxListAddArray(list, testdata.data.data(), testdata_len);
   1.576 -        return list;
   1.577 -    }
   1.578 -
   1.579 -    auto pointerLinkedListFromTestData() const -> CxList * {
   1.580 -        auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int *)));
   1.581 -        cxListStorePointers(list);
   1.582 -        // note: cannot use cxListAddArray() because we don't have a list of pointers
   1.583 -        cx_for_n(i, testdata_len) cxListAdd(list, &testdata.data[i]);
   1.584 -        return list;
   1.585 -    }
   1.586 -
   1.587 -    auto arrayListFromTestData() const -> CxList * {
   1.588 -        auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), testdata_len));
   1.589 -        cxListAddArray(list, testdata.data.data(), testdata_len);
   1.590 -        return list;
   1.591 -    }
   1.592 -
   1.593 -    void verifyCreate(CxList *list) const {
   1.594 -        EXPECT_EQ(list->content_destructor_type, CX_DESTRUCTOR_NONE);
   1.595 -        EXPECT_EQ(list->size, 0);
   1.596 -        EXPECT_EQ(list->allocator, &testingAllocator);
   1.597 -        EXPECT_EQ(list->cmpfunc, cx_cmp_int);
   1.598 -    }
   1.599 -
   1.600 -    void verifyAdd(
   1.601 -            CxList *list,
   1.602 -            bool as_pointer
   1.603 -    ) {
   1.604 -        auto len = testdata_len;
   1.605 -        cx_for_n (i, len) EXPECT_EQ(cxListAdd(list, &testdata.data[i]), 0);
   1.606 -        EXPECT_EQ(list->size, len);
   1.607 -        EXPECT_GE(list->capacity, list->size);
   1.608 -        cx_for_n (i, len) EXPECT_EQ(*(int *) cxListAt(list, i), testdata.data[i]);
   1.609 -        cx_for_n (i, len) ++testdata.data[i];
   1.610 -        if (as_pointer) {
   1.611 -            cx_for_n (i, len) EXPECT_EQ(*(int *) cxListAt(list, i), testdata.data[i]);
   1.612 -        } else {
   1.613 -            cx_for_n (i, len) EXPECT_EQ(*(int *) cxListAt(list, i), testdata.data[i] - 1);
   1.614 -        }
   1.615 -    }
   1.616 -
   1.617 -    static void verifyInsert(CxList *list) {
   1.618 -        int a = 5, b = 47, c = 13, d = 42;
   1.619 -
   1.620 -        EXPECT_NE(cxListInsert(list, 1, &a), 0);
   1.621 -        EXPECT_EQ(list->size, 0);
   1.622 -        EXPECT_EQ(cxListInsert(list, 0, &a), 0);
   1.623 -        EXPECT_EQ(list->size, 1);
   1.624 -        EXPECT_EQ(cxListInsert(list, 0, &b), 0);
   1.625 -        EXPECT_EQ(list->size, 2);
   1.626 -        EXPECT_EQ(cxListInsert(list, 1, &c), 0);
   1.627 -        EXPECT_EQ(list->size, 3);
   1.628 -        EXPECT_EQ(cxListInsert(list, 3, &d), 0);
   1.629 -
   1.630 -        ASSERT_EQ(list->size, 4);
   1.631 -        EXPECT_GE(list->capacity, list->size);
   1.632 -
   1.633 -        EXPECT_EQ(*(int *) cxListAt(list, 0), 47);
   1.634 -        EXPECT_EQ(*(int *) cxListAt(list, 1), 13);
   1.635 -        EXPECT_EQ(*(int *) cxListAt(list, 2), 5);
   1.636 -        EXPECT_EQ(*(int *) cxListAt(list, 3), 42);
   1.637 -    }
   1.638 -
   1.639 -    static void verifyInsertArray(
   1.640 -            CxList *list,
   1.641 -            bool pointers = false
   1.642 -    ) {
   1.643 -        int a[5] = {5, 47, 11, 13, 42};
   1.644 -        int b[5] = {9, 18, 72, 50, 7};
   1.645 -        int *aptr[5];
   1.646 -        int *bptr[5];
   1.647 -        cx_for_n(i, 5) {
   1.648 -            aptr[i] = &a[i];
   1.649 -            bptr[i] = &b[i];
   1.650 -        }
   1.651 -
   1.652 -        size_t inserted;
   1.653 -
   1.654 -        if (pointers) {
   1.655 -            inserted = cxListInsertArray(list, 0, aptr, 5);
   1.656 -        } else {
   1.657 -            inserted = cxListInsertArray(list, 0, a, 5);
   1.658 -        }
   1.659 -        EXPECT_EQ(inserted, 5);
   1.660 -        EXPECT_EQ(*(int *) cxListAt(list, 0), 5);
   1.661 -        EXPECT_EQ(*(int *) cxListAt(list, 1), 47);
   1.662 -        EXPECT_EQ(*(int *) cxListAt(list, 2), 11);
   1.663 -        EXPECT_EQ(*(int *) cxListAt(list, 3), 13);
   1.664 -        EXPECT_EQ(*(int *) cxListAt(list, 4), 42);
   1.665 -        if (pointers) {
   1.666 -            inserted = cxListInsertArray(list, 3, bptr, 5);
   1.667 -        } else {
   1.668 -            inserted = cxListInsertArray(list, 3, b, 5);
   1.669 -        }
   1.670 -        EXPECT_EQ(inserted, 5);
   1.671 -        EXPECT_EQ(*(int *) cxListAt(list, 0), 5);
   1.672 -        EXPECT_EQ(*(int *) cxListAt(list, 1), 47);
   1.673 -        EXPECT_EQ(*(int *) cxListAt(list, 2), 11);
   1.674 -        EXPECT_EQ(*(int *) cxListAt(list, 3), 9);
   1.675 -        EXPECT_EQ(*(int *) cxListAt(list, 4), 18);
   1.676 -        EXPECT_EQ(*(int *) cxListAt(list, 5), 72);
   1.677 -        EXPECT_EQ(*(int *) cxListAt(list, 6), 50);
   1.678 -        EXPECT_EQ(*(int *) cxListAt(list, 7), 7);
   1.679 -        EXPECT_EQ(*(int *) cxListAt(list, 8), 13);
   1.680 -        EXPECT_EQ(*(int *) cxListAt(list, 9), 42);
   1.681 -    }
   1.682 -
   1.683 -    void verifyRemove(CxList *list) const {
   1.684 -        EXPECT_EQ(cxListRemove(list, 2), 0);
   1.685 -        EXPECT_EQ(cxListRemove(list, 4), 0);
   1.686 -        EXPECT_EQ(list->size, testdata_len - 2);
   1.687 -        EXPECT_GE(list->capacity, list->size);
   1.688 -        EXPECT_EQ(*(int *) cxListAt(list, 0), testdata.data[0]);
   1.689 -        EXPECT_EQ(*(int *) cxListAt(list, 1), testdata.data[1]);
   1.690 -        EXPECT_EQ(*(int *) cxListAt(list, 2), testdata.data[3]);
   1.691 -        EXPECT_EQ(*(int *) cxListAt(list, 3), testdata.data[4]);
   1.692 -        EXPECT_EQ(*(int *) cxListAt(list, 4), testdata.data[6]);
   1.693 -
   1.694 -        EXPECT_EQ(cxListRemove(list, 0), 0);
   1.695 -        EXPECT_EQ(list->size, testdata_len - 3);
   1.696 -        EXPECT_GE(list->capacity, list->size);
   1.697 -        EXPECT_EQ(*(int *) cxListAt(list, 0), testdata.data[1]);
   1.698 -        EXPECT_EQ(*(int *) cxListAt(list, 1), testdata.data[3]);
   1.699 -
   1.700 -        EXPECT_NE(cxListRemove(list, testdata_len), 0);
   1.701 -    }
   1.702 -
   1.703 -    void verifyAt(CxList *list) const {
   1.704 -        auto len = testdata_len;
   1.705 -        EXPECT_EQ(list->size, len);
   1.706 -        cx_for_n (i, len) {
   1.707 -            EXPECT_EQ(*(int *) cxListAt(list, i), testdata.data[i]);
   1.708 -        }
   1.709 -        EXPECT_EQ(cxListAt(list, list->size), nullptr);
   1.710 -    }
   1.711 -
   1.712 -    void verifyFind(CxList *list) const {
   1.713 -        cx_for_n (attempt, 25) {
   1.714 -            size_t exp = rand() % testdata_len; // NOLINT(cert-msc50-cpp)
   1.715 -            int val = testdata.data[exp];
   1.716 -            // randomly picked number could occur earlier in list - find first position
   1.717 -            cx_for_n (i, exp) {
   1.718 -                if (testdata.data[i] == val) {
   1.719 -                    exp = i;
   1.720 -                    break;
   1.721 -                }
   1.722 -            }
   1.723 -            EXPECT_EQ(cxListFind(list, &val), exp);
   1.724 -        }
   1.725 -    }
   1.726 -
   1.727 -    void verifySort(CxList *list) const {
   1.728 -        std::array<int, testdata_len> expected{};
   1.729 -        std::partial_sort_copy(testdata.data.begin(), testdata.data.end(), expected.begin(), expected.end());
   1.730 -        cxListSort(list);
   1.731 -        cx_for_n (i, testdata_len) ASSERT_EQ(*(int *) cxListAt(list, i), expected[i]);
   1.732 -    }
   1.733 -
   1.734 -    void verifyIterator(CxList *list) const {
   1.735 -        int i = 0;
   1.736 -        auto iter = cxListBeginMut(list);
   1.737 -        cx_foreach(int*, x, iter) {
   1.738 -            ASSERT_EQ(iter.index, (size_t) (i + 1) / 2);
   1.739 -            ASSERT_EQ(*x, testdata.data[i]);
   1.740 -            if (i % 2 == 1) cxIteratorFlagRemoval(iter);
   1.741 -            i++;
   1.742 -        }
   1.743 -        auto len = testdata_len;
   1.744 -        EXPECT_EQ(i, len);
   1.745 -        ASSERT_EQ(list->size, len / 2);
   1.746 -        cx_for_n(j, len / 2) ASSERT_EQ(*(int *) cxListAt(list, j), testdata.data[j * 2]);
   1.747 -    }
   1.748 -
   1.749 -    static void verifyInsertViaIterator(CxList *list) {
   1.750 -        int newdata[] = {10, 20, 30, 40, 50};
   1.751 -
   1.752 -        auto iter = cxListMutIterator(list, 2);
   1.753 -        EXPECT_TRUE(cxIteratorValid(iter));
   1.754 -        EXPECT_EQ(iter.index, 2);
   1.755 -        EXPECT_EQ(*(int *) cxIteratorCurrent(iter), 2);
   1.756 -        cxListInsertAfter(&iter, &newdata[0]);
   1.757 -        EXPECT_TRUE(cxIteratorValid(iter));
   1.758 -        EXPECT_EQ(iter.index, 2);
   1.759 -        EXPECT_EQ(*(int *) cxIteratorCurrent(iter), 2);
   1.760 -        cxListInsertBefore(&iter, &newdata[1]);
   1.761 -        EXPECT_TRUE(cxIteratorValid(iter));
   1.762 -        EXPECT_EQ(iter.index, 3);
   1.763 -        EXPECT_EQ(*(int *) cxIteratorCurrent(iter), 2);
   1.764 -
   1.765 -        iter = cxListBeginMut(list);
   1.766 -        cxListInsertBefore(&iter, &newdata[2]);
   1.767 -        EXPECT_TRUE(cxIteratorValid(iter));
   1.768 -        EXPECT_EQ(iter.index, 1);
   1.769 -        EXPECT_EQ(*(int *) cxIteratorCurrent(iter), 0);
   1.770 -        iter = cxListMutIterator(list, list->size);
   1.771 -        cxListInsertBefore(&iter, &newdata[3]);
   1.772 -        EXPECT_FALSE(cxIteratorValid(iter));
   1.773 -        EXPECT_EQ(iter.index, 9);
   1.774 -        iter = cxListMutIterator(list, list->size);
   1.775 -        cxListInsertAfter(&iter, &newdata[4]);
   1.776 -        EXPECT_FALSE(cxIteratorValid(iter));
   1.777 -        EXPECT_EQ(iter.index, 10);
   1.778 -
   1.779 -        int expdata[] = {30, 0, 1, 20, 2, 10, 3, 4, 40, 50};
   1.780 -        cx_for_n (j, 10) EXPECT_EQ(*(int *) cxListAt(list, j), expdata[j]);
   1.781 -    }
   1.782 -
   1.783 -    void verifyReverse(CxList *list) const {
   1.784 -        cxListReverse(list);
   1.785 -        cx_for_n(i, testdata_len) {
   1.786 -            ASSERT_EQ(*(int *) cxListAt(list, i), testdata.data[testdata_len - 1 - i]);
   1.787 -        }
   1.788 -    }
   1.789 -
   1.790 -    static void verifyCompare(
   1.791 -            CxList *left,
   1.792 -            CxList *right
   1.793 -    ) {
   1.794 -        EXPECT_EQ(cxListCompare(left, right), 0);
   1.795 -        int x = 42;
   1.796 -        cxListAdd(left, &x);
   1.797 -        ASSERT_GT(left->size, right->size);
   1.798 -        EXPECT_GT(cxListCompare(left, right), 0);
   1.799 -        EXPECT_LT(cxListCompare(right, left), 0);
   1.800 -        cxListAdd(right, &x);
   1.801 -        ASSERT_EQ(left->size, right->size);
   1.802 -        EXPECT_EQ(cxListCompare(left, right), 0);
   1.803 -        int a = 5, b = 10;
   1.804 -        cxListInsert(left, 15, &a);
   1.805 -        cxListInsert(right, 15, &b);
   1.806 -        ASSERT_EQ(left->size, right->size);
   1.807 -        EXPECT_LT(cxListCompare(left, right), 0);
   1.808 -        EXPECT_GT(cxListCompare(right, left), 0);
   1.809 -        *(int *) cxListAt(left, 15) = 10;
   1.810 -        EXPECT_EQ(cxListCompare(left, right), 0);
   1.811 -    }
   1.812 -};
   1.813 -
   1.814 -class LinkedList : public HighLevelTest {
   1.815 -};
   1.816 -
   1.817 -class PointerLinkedList : public HighLevelTest {
   1.818 -};
   1.819 -
   1.820 -class ArrayList : public HighLevelTest {
   1.821 -};
   1.822 -
   1.823 -TEST_F(PointerLinkedList, cxListStorePointers) {
   1.824 -    auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, 47));
   1.825 -    EXPECT_FALSE(cxListIsStoringPointers(list));
   1.826 -    cxListStorePointers(list);
   1.827 -    EXPECT_EQ(list->itemsize, sizeof(void *));
   1.828 -    EXPECT_NE(list->cl, nullptr);
   1.829 -    EXPECT_NE(list->climpl, nullptr);
   1.830 -    EXPECT_TRUE(cxListIsStoringPointers(list));
   1.831 -    cxListStoreObjects(list);
   1.832 -    EXPECT_NE(list->cl, nullptr);
   1.833 -    EXPECT_EQ(list->climpl, nullptr);
   1.834 -    EXPECT_FALSE(cxListIsStoringPointers(list));
   1.835 -}
   1.836 -
   1.837 -TEST_F(LinkedList, cxLinkedListCreate) {
   1.838 -    CxList *list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)));
   1.839 -    ASSERT_NE(list, nullptr);
   1.840 -    EXPECT_EQ(list->itemsize, sizeof(int));
   1.841 -    EXPECT_EQ(list->capacity, (size_t) -1);
   1.842 -    verifyCreate(list);
   1.843 -}
   1.844 -
   1.845 -TEST_F(ArrayList, cxArrayListCreate) {
   1.846 -    CxList *list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 8));
   1.847 -    ASSERT_NE(list, nullptr);
   1.848 -    EXPECT_EQ(list->itemsize, sizeof(int));
   1.849 -    EXPECT_EQ(list->capacity, 8);
   1.850 -    verifyCreate(list);
   1.851 -}
   1.852 -
   1.853 -TEST_F(LinkedList, cxListAdd) {
   1.854 -    auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)));
   1.855 -    verifyAdd(list, false);
   1.856 -}
   1.857 -
   1.858 -TEST_F(PointerLinkedList, cxListAdd) {
   1.859 -    auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int *)));
   1.860 -    cxListStorePointers(list);
   1.861 -    verifyAdd(list, true);
   1.862 -}
   1.863 -
   1.864 -TEST_F(ArrayList, cxListAdd) {
   1.865 -    auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 8));
   1.866 -    verifyAdd(list, false);
   1.867 -}
   1.868 -
   1.869 -TEST_F(LinkedList, cxListInsert) {
   1.870 -    verifyInsert(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))));
   1.871 -}
   1.872 -
   1.873 -TEST_F(PointerLinkedList, cxListInsert) {
   1.874 -    auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int *)));
   1.875 -    cxListStorePointers(list);
   1.876 -    verifyInsert(list);
   1.877 -}
   1.878 -
   1.879 -TEST_F(ArrayList, cxListInsert) {
   1.880 -    verifyInsert(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 2)));
   1.881 -}
   1.882 -
   1.883 -TEST_F(LinkedList, cxListInsertArray) {
   1.884 -    verifyInsertArray(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))));
   1.885 -}
   1.886 -
   1.887 -TEST_F(PointerLinkedList, cxListInsertArray) {
   1.888 -    auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int *)));
   1.889 -    cxListStorePointers(list);
   1.890 -    verifyInsertArray(list, true);
   1.891 -}
   1.892 -
   1.893 -TEST_F(ArrayList, cxListInsertArray) {
   1.894 -    verifyInsertArray(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 4)));
   1.895 -}
   1.896 -
   1.897 -TEST_F(LinkedList, cxListRemove) {
   1.898 -    verifyRemove(linkedListFromTestData());
   1.899 -}
   1.900 -
   1.901 -TEST_F(PointerLinkedList, cxListRemove) {
   1.902 -    verifyRemove(pointerLinkedListFromTestData());
   1.903 -}
   1.904 -
   1.905 -TEST_F(ArrayList, cxListRemove) {
   1.906 -    verifyRemove(arrayListFromTestData());
   1.907 -}
   1.908 -
   1.909 -TEST_F(LinkedList, cxListAt) {
   1.910 -    verifyAt(linkedListFromTestData());
   1.911 -}
   1.912 -
   1.913 -TEST_F(PointerLinkedList, cxListAt) {
   1.914 -    verifyAt(pointerLinkedListFromTestData());
   1.915 -}
   1.916 -
   1.917 -TEST_F(ArrayList, cxListAt) {
   1.918 -    verifyAt(arrayListFromTestData());
   1.919 -}
   1.920 -
   1.921 -TEST_F(LinkedList, cxListFind) {
   1.922 -    verifyFind(linkedListFromTestData());
   1.923 -}
   1.924 -
   1.925 -TEST_F(PointerLinkedList, cxListFind) {
   1.926 -    verifyFind(pointerLinkedListFromTestData());
   1.927 -}
   1.928 -
   1.929 -TEST_F(ArrayList, cxListFind) {
   1.930 -    verifyFind(arrayListFromTestData());
   1.931 -}
   1.932 -
   1.933 -TEST_F(LinkedList, cxListSort) {
   1.934 -    verifySort(linkedListFromTestData());
   1.935 -}
   1.936 -
   1.937 -TEST_F(PointerLinkedList, cxListSort) {
   1.938 -    verifySort(pointerLinkedListFromTestData());
   1.939 -}
   1.940 -
   1.941 -TEST_F(ArrayList, cxListSort) {
   1.942 -    verifySort(arrayListFromTestData());
   1.943 -}
   1.944 -
   1.945 -TEST_F(LinkedList, Iterator) {
   1.946 -    verifyIterator(linkedListFromTestData());
   1.947 -}
   1.948 -
   1.949 -TEST_F(PointerLinkedList, Iterator) {
   1.950 -    verifyIterator(pointerLinkedListFromTestData());
   1.951 -}
   1.952 -
   1.953 -TEST_F(ArrayList, Iterator) {
   1.954 -    verifyIterator(arrayListFromTestData());
   1.955 -}
   1.956 -
   1.957 -TEST_F(LinkedList, InsertViaIterator) {
   1.958 -    int fivenums[] = {0, 1, 2, 3, 4, 5};
   1.959 -    CxList *list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)));
   1.960 -    cxListAddArray(list, fivenums, 5);
   1.961 -    verifyInsertViaIterator(list);
   1.962 -}
   1.963 -
   1.964 -TEST_F(PointerLinkedList, InsertViaIterator) {
   1.965 -    int fivenums[] = {0, 1, 2, 3, 4, 5};
   1.966 -    auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int *)));
   1.967 -    cxListStorePointers(list);
   1.968 -    // note: cannot use cxListAddArray() because we don't have a list of pointers
   1.969 -    cx_for_n(i, 5) cxListAdd(list, &fivenums[i]);
   1.970 -    verifyInsertViaIterator(list);
   1.971 -}
   1.972 -
   1.973 -TEST_F(ArrayList, InsertViaIterator) {
   1.974 -    int fivenums[] = {0, 1, 2, 3, 4, 5};
   1.975 -    CxList *list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 4));
   1.976 -    cxListAddArray(list, fivenums, 5);
   1.977 -    verifyInsertViaIterator(list);
   1.978 -}
   1.979 -
   1.980 -TEST_F(LinkedList, cxListReverse) {
   1.981 -    verifyReverse(linkedListFromTestData());
   1.982 -}
   1.983 -
   1.984 -TEST_F(PointerLinkedList, cxListReverse) {
   1.985 -    verifyReverse(pointerLinkedListFromTestData());
   1.986 -}
   1.987 -
   1.988 -TEST_F(ArrayList, cxListReverse) {
   1.989 -    verifyReverse(arrayListFromTestData());
   1.990 -}
   1.991 -
   1.992 -TEST_F(LinkedList, cxListCompare) {
   1.993 -    auto left = linkedListFromTestData();
   1.994 -    auto right = linkedListFromTestData();
   1.995 -    verifyCompare(left, right);
   1.996 -}
   1.997 -
   1.998 -TEST_F(LinkedList, cxListCompareWithPtrList) {
   1.999 -    auto left = linkedListFromTestData();
  1.1000 -    auto right = pointerLinkedListFromTestData();
  1.1001 -    verifyCompare(left, right);
  1.1002 -}
  1.1003 -
  1.1004 -TEST_F(LinkedList, cxListCompareWithArrayList) {
  1.1005 -    auto left = linkedListFromTestData();
  1.1006 -    auto right = arrayListFromTestData();
  1.1007 -    verifyCompare(left, right);
  1.1008 -}
  1.1009 -
  1.1010 -TEST_F(PointerLinkedList, cxListCompare) {
  1.1011 -    auto left = pointerLinkedListFromTestData();
  1.1012 -    auto right = pointerLinkedListFromTestData();
  1.1013 -    verifyCompare(left, right);
  1.1014 -}
  1.1015 -
  1.1016 -TEST_F(PointerLinkedList, cxListCompareWithNormalList) {
  1.1017 -    auto left = pointerLinkedListFromTestData();
  1.1018 -    auto right = linkedListFromTestData();
  1.1019 -    verifyCompare(left, right);
  1.1020 -}
  1.1021 -
  1.1022 -TEST_F(PointerLinkedList, cxListCompareWithArrayList) {
  1.1023 -    auto left = pointerLinkedListFromTestData();
  1.1024 -    auto right = arrayListFromTestData();
  1.1025 -    verifyCompare(left, right);
  1.1026 -}
  1.1027 -
  1.1028 -TEST_F(ArrayList, cxListCompare) {
  1.1029 -    auto left = arrayListFromTestData();
  1.1030 -    auto right = arrayListFromTestData();
  1.1031 -    verifyCompare(left, right);
  1.1032 -}
  1.1033 -
  1.1034 -TEST_F(ArrayList, cxListCompareWithPtrList) {
  1.1035 -    auto left = arrayListFromTestData();
  1.1036 -    auto right = pointerLinkedListFromTestData();
  1.1037 -    verifyCompare(left, right);
  1.1038 -}
  1.1039 -
  1.1040 -TEST_F(ArrayList, cxListCompareWithNormalList) {
  1.1041 -    auto left = arrayListFromTestData();
  1.1042 -    auto right = linkedListFromTestData();
  1.1043 -    verifyCompare(left, right);
  1.1044 -}
  1.1045 -
  1.1046 -TEST_F(PointerLinkedList, NoDestructor) {
  1.1047 -    void *item = cxMalloc(&testingAllocator, sizeof(int));
  1.1048 -    auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int *));
  1.1049 -    cxListStorePointers(list);
  1.1050 -    cxListAdd(list, item);
  1.1051 -    ASSERT_FALSE(testingAllocator.verify());
  1.1052 -    cxListDestroy(list);
  1.1053 -    EXPECT_FALSE(testingAllocator.verify());
  1.1054 -    cxFree(&testingAllocator, item);
  1.1055 -    EXPECT_TRUE(testingAllocator.verify());
  1.1056 -}
  1.1057 -
  1.1058 -TEST_F(PointerLinkedList, SimpleDestructor) {
  1.1059 -    int item = 0;
  1.1060 -    auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int *));
  1.1061 -    cxListStorePointers(list);
  1.1062 -    list->content_destructor_type = CX_DESTRUCTOR_SIMPLE;
  1.1063 -    list->simple_destructor = [](void *elem) { *(int *) elem = 42; };
  1.1064 -    cxListAdd(list, &item);
  1.1065 -    cxListDestroy(list);
  1.1066 -    EXPECT_EQ(item, 42);
  1.1067 -}
  1.1068 -
  1.1069 -TEST_F(PointerLinkedList, AdvancedDestructor) {
  1.1070 -    void *item = cxMalloc(&testingAllocator, sizeof(int));
  1.1071 -    auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int *));
  1.1072 -    cxListStorePointers(list);
  1.1073 -    list->content_destructor_type = CX_DESTRUCTOR_ADVANCED;
  1.1074 -    list->advanced_destructor.data = &testingAllocator;
  1.1075 -    list->advanced_destructor.func = (cx_destructor_func2) cxFree;
  1.1076 -    cxListAdd(list, item);
  1.1077 -    ASSERT_FALSE(testingAllocator.verify());
  1.1078 -    cxListDestroy(list);
  1.1079 -    EXPECT_TRUE(testingAllocator.verify());
  1.1080 -}

mercurial