Example #1
0
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);
        }
    }