示例#1
0
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);
}
示例#2
0
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;
}