#include "../../../gen/l1/VecAndSpan_U64.h"
#include "../../../gen/l1/VecAndSpan_VecU64.h"

int main() {
    VecU64 v = VecU64_new();
    for (int i = 0; i < 3; i++) {
        VecU64_append(&v, i);
        *VecU64_mat(&v, i) = *VecU64_at(&v, i) + 10;
    }
    VecVecU64 a = VecVecU64_new_filled(2, &v);
    VecU64_drop(v);
    assert(VecU64_equal_VecU64(VecVecU64_at(&a, 0), VecVecU64_at(&a, 1)));
    VecU64_pop(VecVecU64_mat(&a, 1));
    assert(!VecU64_equal_VecU64(VecVecU64_at(&a, 0), VecVecU64_at(&a, 1)));
    VecVecU64 b = VecVecU64_new();
    VecVecU64_append(&b, VecU64_new());
    assert(!VecVecU64_equal_VecVecU64(&a, &b));
    VecVecU64_append(&b, VecU64_new());
    assert(!VecVecU64_equal_VecVecU64(&a, &b));
    for (int i = 0; i < 3; i++) {
        VecU64_append(VecVecU64_mat(&b, 0), 10 + i);
    }
    assert(!VecVecU64_equal_VecVecU64(&a, &b));
    for (int i = 0; i < 2; i++) {
        VecU64_append(VecVecU64_mat(&b, 1), 10 + i);
    }
    assert(VecVecU64_equal_VecVecU64(&a, &b));
    VecVecU64 c = VecVecU64_clone(&a);
    VecVecU64 d = VecVecU64_clone(&b);
    VecVecU64_pop_and_drop(&a);
    assert(VecVecU64_equal_VecVecU64(&c, &b));
    assert(VecVecU64_equal_VecVecU64(&c, &d));
    VecVecU64_drop(d);
    VecVecU64_drop(c);
    VecVecU64_drop(b);
    VecVecU64_drop(a);
}