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; }
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; }