예제 #1
0
파일: init_ser.c 프로젝트: hendrenja/corto
corto_int16 corto_ser_initCollection(corto_walk_opt* s, corto_value* v, void* userData) {
    corto_type t;
    void* o;

    t = corto_value_typeof(v);
    o = corto_value_ptrof(v);

    switch(corto_collection(t)->kind) {
        case CORTO_ARRAY:
            if (corto_walk_elements(s, v, userData)) {
                goto error;
            }
            break;
        case CORTO_LIST:
            *(corto_ll*)o = corto_ll_new();
            break;
        case CORTO_MAP:
            /**(corto_rbtree*)o = corto_rb_new(t);*/
            break;
        default:
            break;
    }

    return 0;
error:
    return -1;
}
예제 #2
0
static
corto_int16 corto_ser_initCollection(
    corto_walk_opt* s,
    corto_value* v,
    void* userData)
{
    corto_collection t = (corto_collection)corto_value_typeof(v);
    void *o = corto_value_ptrof(v);
    corto_member m = v->is.member.member;

    switch(t->kind) {
        case CORTO_ARRAY:
            if (corto_walk_elements(s, v, userData)) {
                goto error;
            }
            break;
        case CORTO_LIST:
            if (!m || m->modifiers & CORTO_NOT_NULL) {
                *(ut_ll*)o = ut_ll_new();
            }
            break;
        case CORTO_MAP:
            if (!m || m->modifiers & CORTO_NOT_NULL) {
                corto_type key_type = corto_map(t)->key_type;
                if (key_type) {
                    if (corto_collection_requires_alloc(key_type)) {
                        *(ut_rb*)o = ut_rb_new(corto_compare_key, key_type);
                    } else {
                        *(ut_rb*)o = ut_rb_new(corto_compare_key_ptr, key_type);
                    }
                } else {
                    /* Custom compare function, app is responsible for init */
                }
                break;
            }
        default:
            break;
    }

    return 0;
error:
    return -1;
}