bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack) { BlockDescriptor& block_data = getBlockDescriptor(); bool names_left = name_stack.first != name_stack.second; if (names_left) { const std::string& top_name = name_stack.first->first; ParamDescriptor::deserialize_func_t deserialize_func = NULL; Param* paramp = NULL; BlockDescriptor::param_map_t::iterator found_it = block_data.mNamedParams.find(top_name); if (found_it != block_data.mNamedParams.end()) { // find pointer to member parameter from offset table paramp = getParamFromHandle(found_it->second->mParamHandle); deserialize_func = found_it->second->mDeserializeFunc; } else { BlockDescriptor::param_map_t::iterator found_it = block_data.mSynonyms.find(top_name); if (found_it != block_data.mSynonyms.end()) { // find pointer to member parameter from offset table paramp = getParamFromHandle(found_it->second->mParamHandle); deserialize_func = found_it->second->mDeserializeFunc; } } Parser::name_stack_range_t new_name_stack(name_stack.first, name_stack.second); ++new_name_stack.first; if (deserialize_func) { return deserialize_func(*paramp, p, new_name_stack, name_stack.first == name_stack.second ? -1 : name_stack.first->second); } } // try to parse unnamed parameters, in declaration order for ( BlockDescriptor::param_list_t::iterator it = block_data.mUnnamedParams.begin(); it != block_data.mUnnamedParams.end(); ++it) { Param* paramp = getParamFromHandle((*it)->mParamHandle); ParamDescriptor::deserialize_func_t deserialize_func = (*it)->mDeserializeFunc; if (deserialize_func && deserialize_func(*paramp, p, name_stack, name_stack.first == name_stack.second ? -1 : name_stack.first->second)) { return true; } } return false; }
bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack, S32 parent_generation) { BlockDescriptor& block_data = mostDerivedBlockDescriptor(); bool names_left = name_stack.first != name_stack.second; S32 parse_generation = name_stack.first == name_stack.second ? -1 : name_stack.first->second; if (names_left) { const std::string& top_name = name_stack.first->first; ParamDescriptor::deserialize_func_t deserialize_func = NULL; Param* paramp = NULL; BlockDescriptor::param_map_t::iterator found_it = block_data.mNamedParams.find(top_name); if (found_it != block_data.mNamedParams.end()) { // find pointer to member parameter from offset table paramp = getParamFromHandle(found_it->second->mParamHandle); deserialize_func = found_it->second->mDeserializeFunc; Parser::name_stack_range_t new_name_stack(name_stack.first, name_stack.second); ++new_name_stack.first; return deserialize_func(*paramp, p, new_name_stack, parse_generation); } } // try to parse unnamed parameters, in declaration order for ( BlockDescriptor::param_list_t::iterator it = block_data.mUnnamedParams.begin(); it != block_data.mUnnamedParams.end(); ++it) { Param* paramp = getParamFromHandle((*it)->mParamHandle); ParamDescriptor::deserialize_func_t deserialize_func = (*it)->mDeserializeFunc; if (deserialize_func && deserialize_func(*paramp, p, name_stack, parse_generation)) { return true; } } // if no match, and no names left on stack, this is just an existence assertion of this block // verify by calling readValue with NoParamValue type, an inherently unparseable type if (!names_left) { NoParamValue no_value; return p.readValue(no_value); } return false; }