Hash* Hash_deserialize(Hash *self, InStream *instream) { uint32_t size = InStream_Read_C32(instream); uint32_t num_charbufs = InStream_Read_C32(instream); uint32_t num_other = size - num_charbufs; CharBuf *key = num_charbufs ? CB_new(0) : NULL; Hash_init(self, size); // Read key-value pairs with CharBuf keys. while (num_charbufs--) { uint32_t len = InStream_Read_C32(instream); char *key_buf = CB_Grow(key, len); InStream_Read_Bytes(instream, key_buf, len); key_buf[len] = '\0'; CB_Set_Size(key, len); Hash_Store(self, (Obj*)key, THAW(instream)); } DECREF(key); // Read remaining key/value pairs. while (num_other--) { Obj *k = THAW(instream); Hash_Store(self, k, THAW(instream)); DECREF(k); } return self; }
Compiler* Compiler_deserialize(Compiler *self, InStream *instream) { self->boost = InStream_Read_F32(instream); self->parent = (Query*)THAW(instream); self->sim = (Similarity*)THAW(instream); return self; }
TermQuery* TermQuery_Deserialize_IMP(TermQuery *self, InStream *instream) { TermQueryIVARS *const ivars = TermQuery_IVARS(self); ivars->field = Freezer_read_string(instream); ivars->term = (Obj*)THAW(instream); ivars->boost = InStream_Read_F32(instream); return self; }
RangeQuery* RangeQuery_Deserialize_IMP(RangeQuery *self, InStream *instream) { // Deserialize components. float boost = InStream_Read_F32(instream); String *field = Freezer_read_string(instream); Obj *lower_term = InStream_Read_U8(instream) ? THAW(instream) : NULL; Obj *upper_term = InStream_Read_U8(instream) ? THAW(instream) : NULL; bool include_lower = !!InStream_Read_U8(instream); bool include_upper = !!InStream_Read_U8(instream); // Init object. RangeQuery_init(self, field, lower_term, upper_term, include_lower, include_upper); RangeQuery_Set_Boost(self, boost); DECREF(upper_term); DECREF(lower_term); DECREF(field); return self; }
RangeQuery* RangeQuery_deserialize(RangeQuery *self, InStream *instream) { // Deserialize components. float boost = InStream_Read_F32(instream); CharBuf *field = CB_Deserialize((CharBuf*)VTable_Make_Obj(CHARBUF), instream); Obj *lower_term = InStream_Read_U8(instream) ? THAW(instream) : NULL; Obj *upper_term = InStream_Read_U8(instream) ? THAW(instream) : NULL; bool_t include_lower = InStream_Read_U8(instream); bool_t include_upper = InStream_Read_U8(instream); // Init object. RangeQuery_init(self, field, lower_term, upper_term, include_lower, include_upper); RangeQuery_Set_Boost(self, boost); DECREF(upper_term); DECREF(lower_term); DECREF(field); return self; }
PolyQuery* PolyQuery_Deserialize_IMP(PolyQuery *self, InStream *instream) { float boost = InStream_Read_F32(instream); uint32_t num_children = InStream_Read_U32(instream); PolyQuery_init(self, NULL); PolyQueryIVARS *const ivars = PolyQuery_IVARS(self); PolyQuery_Set_Boost(self, boost); Vec_Grow(ivars->children, num_children); while (num_children--) { Vec_Push(ivars->children, THAW(instream)); } return self; }
Vector* Freezer_deserialize_varray(Vector *array, InStream *instream) { uint32_t size = InStream_Read_C32(instream); Vec_init(array, size); for (uint32_t tick = InStream_Read_C32(instream); tick < size; tick += InStream_Read_C32(instream) ) { Obj *obj = THAW(instream); Vec_Store(array, tick, obj); } Vec_Resize(array, size); return array; }
Hash* Freezer_deserialize_hash(Hash *hash, InStream *instream) { uint32_t size = InStream_Read_C32(instream); Hash_init(hash, size); while (size--) { uint32_t len = InStream_Read_C32(instream); char *key_buf = (char*)MALLOCATE(len + 1); InStream_Read_Bytes(instream, key_buf, len); key_buf[len] = '\0'; String *key = Str_new_steal_utf8(key_buf, len); Hash_Store(hash, key, THAW(instream)); DECREF(key); } return hash; }