Esempio n. 1
0
	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;
	}
Esempio n. 2
0
	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;
	}