int main(int argc, char * argv[]) { bool pass = true; { int a[] = {}; int b[] = {}; std::vector<int> A = vec_transform(a, sizeof(a) / sizeof(int)); std::vector<int> B = vec_transform(b, sizeof(b) / sizeof(int)); int s = merge_sorted_arrays(A, 0, B); int r[] = {}; pass = pass && vec_compare(A, r, sizeof(r) / sizeof(int)); } { int a[] = { 1, 3, 5, 0, 0, 0, 0, 0 }; int b[] = { 2, 4, 6, 8, 10 }; std::vector<int> A = vec_transform(a, sizeof(a) / sizeof(int)); std::vector<int> B = vec_transform(b, sizeof(b) / sizeof(int)); int s = merge_sorted_arrays(A, 3, B); int r[] = {1, 2, 3, 4, 5, 6, 8, 10 }; pass = pass && vec_compare(A, r, sizeof(r) / sizeof(int)); } { int a[] = { 1, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0 }; // More buffer than required int b[] = { 2, 4, 6, 8, 10 }; std::vector<int> A = vec_transform(a, sizeof(a) / sizeof(int)); std::vector<int> B = vec_transform(b, sizeof(b) / sizeof(int)); int s = merge_sorted_arrays(A, 3, B); int r[] = {1, 2, 3, 4, 5, 6, 8, 10, 0, 0, 0 }; pass = pass && vec_compare(A, r, sizeof(r) / sizeof(int)); } return (pass ? 0 : -1); }
int obj_compare(obj_ptr left, obj_ptr right) { /* TODO if (NUMP(left) && NUMP(right)) ... */ if (TYPE(left) < TYPE(right)) return -1; if (TYPE(left) > TYPE(right)) return 1; switch (TYPE(left)) { case TYPE_INT: case TYPE_BOOL: return _int_compare(INT(left), INT(right)); case TYPE_FLOAT: return _float_compare(FLOAT(left), FLOAT(right), 0.00000001); /* TODO: Better epsilon? */ case TYPE_SYMBOL: return strcmp(SYMBOL(left), SYMBOL(right)); case TYPE_STRING: return string_compare(&STRING(left), &STRING(right)); case TYPE_CONS: { int res = 0; for (;;) { if (NTYPEP(left, TYPE(right))) return obj_compare(left, right); if (NTYPEP(left, TYPE_CONS)) return obj_compare(left, right); res = obj_compare(CAR(left), CAR(right)); if (res != 0) return res; left = CDR(left); right = CDR(right); } assert(0); /* unreachable */ break; } case TYPE_VEC: return vec_compare(&left->data.as_vec, &right->data.as_vec); /* TODO */ case TYPE_MAP: assert(TYPE(left) != TYPE_MAP); break; case TYPE_CLOSURE: assert(TYPE(left) != TYPE_CLOSURE); break; case TYPE_PRIMITIVE: assert(TYPE(left) != TYPE_PRIMITIVE); break; case TYPE_ERROR: assert(TYPE(left) != TYPE_ERROR); break; case TYPE_PORT: assert(TYPE(left) != TYPE_PORT); break; } return 0; }