LPRDOValue RDOArrayType::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { ASSERT(pFrom); LPRDOArrayType pFromArrayType = pFrom->typeInfo()->itype().object_dynamic_cast<RDOArrayType>(); if (pFromArrayType) { LPRDOArrayType pThisArrayType(const_cast<RDOArrayType*>(this)); LPRDOArrayValue pThisArrayValue = rdo::Factory<RDOArrayValue>::create(pThisArrayType); ASSERT(pThisArrayValue); rdo::runtime::LPRDOArrayValue pFromArrayValue = pFrom->get<RDOArrayValue>()->createRuntimeValue(); ASSERT(pFromArrayValue); for (rdo::runtime::LPRDOArrayIterator it = pFromArrayValue->begin(); !it->equal(pFromArrayValue->end()); it->next()) { LPRDOValue pItemValue = rdo::Factory<RDOValue>::create(it->getValue(), src_info, pThisArrayType->getItemType()); ASSERT(pItemValue); pThisArrayValue->insertItem(pThisArrayType->getItemType()->itype()->value_cast(pItemValue, to_src_info, src_info)); } return rdo::Factory<RDOValue>::create(pThisArrayType->typeInfo(), pThisArrayValue, pFrom->src_info()); } parser::g_error().push_only(src_info, rdo::format("Ожидается массив, найдено: %s", pFrom->src_text().c_str())); parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); parser::g_error().push_done(); return NULL; }
void RDOTypeRangeRange::checkValue(const LPRDOValue& pValue) const { if (pValue->value() < m_pMinValue->value() || pValue->value() > m_pMaxValue->value()) { if (pValue->src_filetype() == src_filetype() && pValue->src_pos().m_last_line == src_pos().m_last_line) { rdo::converter::smr2rdox::g_error().error(pValue->src_info(), rdo::format("Значение выходит за допустимый диапазон [%s..%s]: %s", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str(), pValue->value().getAsString().c_str())); } else { rdo::converter::smr2rdox::g_error().push_only(pValue->src_info(), rdo::format("Значение выходит за допустимый диапазон [%s..%s]: %s", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str(), pValue->value().getAsString().c_str())); rdo::converter::smr2rdox::g_error().push_only(src_info(), rdo::format("См. описание диапазона")); rdo::converter::smr2rdox::g_error().push_done(); } } }