void base_read_archive::read_iterable(ReadIterator rit, variant obj, schema* type) { iterable iter(obj); schema* iter_type = iter.iterated_type(); Reader item_reader; variant item; while(rit->next(item_reader, item)) { variant result_item; if (item_reader) read(item_reader, iter_type, result_item); else result_item = item; iter.insert( result_item ); } }
void base_read_archive::read_iterated(Reader r, const str& name, variant& iterated) { iterable iter(iterated); schema* iter_type = iter.iterated_type(); ReadIterator rit = r->create_iterator(name, iter_type); if (!rit) return; Reader item_reader; variant item; while(rit->next(item_reader, item)) { variant result_item; if (item_reader) read(item_reader, iter_type, result_item); else result_item = item; iter.insert( result_item ); } }
bool base_read_archive::read(Reader r, schema* type, variant& result) { if (!type || type->options() & TYPE_NON_INSTANTIABLE || type == type_schema<variant>()) { assert(types_); variant v; if (!r->attribute("class", type_schema<str>(), v)) { assert(false); //?? return false; } str class_id = v; type = types_->get_type(class_id); assert(type); } assert(type); //instantiate if (!type->create(result)) { return false; } void* this_ = result.get_pointer(); size_t type_options = type->options(); if (type_options & TYPE_ITERATED) { iterable iter(result); schema* iter_type = iter.iterated_type(); ReadIterator rit = r->create_iterator("", iter_type); Reader item_reader; variant item; while(rit->next(item_reader, item)) { variant result_item; if (item_reader) read(item_reader, iter_type, result_item); else result_item = item; iter.insert( result_item ); } } else { schema_collector sc; type->visit(&sc); schema_collector::container::iterator it = sc.begin(); schema_collector::container::iterator nd = sc.end(); for(; it != nd; it++) { schema_item& item = it->second; if (item.flags & CONST) continue; if (item.flags & TRANSIENT) continue; if (item.set) { variant value; if (attributed_type(item.type)) { if (r->attribute(it->first, item.type, value)) { item.set->set(this_, value); } } else { Reader rr = r->create_node(it->first); if (rr) { read(rr, item.type, value); item.set->set(this_, value); } } } else if (item.flags & STATIC_FIELD) { assert(item.get); variant sf = item.get->get(this_); if (item.type->options() & TYPE_ITERATED) { read_iterated(r, it->first, sf); } else { read_object(r, it->first, sf, sf.get_schema()); } } } if (type_options & TYPE_MUTABLE) { IDynamicObject* obj = result; mutable_reader mr(obj, *this); r->visit(&mr); obj = null; } } return true; }