ParamInfo* TracerBase::getParamType(std::istream& stream) { boost::optional<ParamInfo::Type> parType; std::string parTypeName; stream >> parTypeName; if (parTypeName == "E") { parType = ParamInfo::Type::ENUMERATIVE; } else if (parTypeName == "I") { parType = ParamInfo::Type::INTEGER; } else if (parTypeName == "R") { parType = ParamInfo::Type::REAL; } else if (parTypeName == "B") { parType = ParamInfo::Type::BOOL; } else if (parTypeName == "A") { parType = ParamInfo::Type::ARRAY; } else if (parTypeName == "S") { parType = ParamInfo::Type::STRING; } else { int i = 0; try { // тип ресурса сначала пишет в поток его ID i = boost::lexical_cast<int>(parTypeName); } catch (const boost::bad_lexical_cast &) {} if (i) { parType = ParamInfo::Type::RESOURCE; //потом его имя stream >> parTypeName; //потом число его параметров stream >> parTypeName; int n = boost::lexical_cast<int>(parTypeName); for (i = 0; i < n; ++i) getParam(stream); } } ASSERT(parType.is_initialized()); ParamInfo* pParam = new ParamInfo(parType.get()); if (parType == ParamInfo::Type::ENUMERATIVE) { std::size_t enumCount; stream >> enumCount; for (std::size_t j = 0; j < enumCount; j++) { std::string enumID; stream >> enumID; std::string enumName; stream >> enumName; pParam->addEnumValue(enumName); } }