void FieldInstructionSequence::decodeNop( Codecs::DataSource & source, Codecs::PresenceMap & pmap, Codecs::Decoder & decoder, Messages::ValueMessageBuilder & builder) const { if(!segment_) { decoder.reportFatal("[ERR U07]", "SegmentBody not defined for Sequence instruction."); } size_t length = 0; Codecs::FieldInstructionCPtr lengthInstruction; Messages::SingleValueBuilder<uint32> lengthSet; if(segment_->getLengthInstruction(lengthInstruction)) { source.beginField(lengthInstruction->getIdentity()->name()); lengthInstruction->decode(source, pmap, decoder, lengthSet); } else { FieldInstructionUInt32 defaultLengthInstruction; defaultLengthInstruction.setPresence(isMandatory()); defaultLengthInstruction.decode(source, pmap, decoder, lengthSet); } if(lengthSet.isSet()) { length = lengthSet.value(); Messages::ValueMessageBuilder & sequenceBuilder = builder.startSequence( identity_, segment_->getApplicationType(), segment_->getApplicationTypeNamespace(), segment_->fieldCount(), lengthSet.identity(), length); for(size_t nEntry = 0; nEntry < length; ++nEntry) { if(decoder.getLogOut()) { std::stringstream msg; msg << "Sequence entry #" << nEntry << " of " << length << std::ends; decoder.logMessage(msg.str()); } Messages::ValueMessageBuilder & entrySet( sequenceBuilder.startSequenceEntry( segment_->getApplicationType(), segment_->getApplicationTypeNamespace(), segment_->fieldCount())); decoder.decodeGroup(source, segment_, entrySet); sequenceBuilder.endSequenceEntry(entrySet); } builder.endSequence(identity_, sequenceBuilder); } }
void FieldInstructionDecimal::decodeNop( Codecs::DataSource & source, Codecs::PresenceMap & pmap, Codecs::Decoder & decoder, Messages::ValueMessageBuilder & accessor) const { PROFILE_POINT("decimal::decodeNop"); if(bool(exponentInstruction_)) { Messages::SingleValueBuilder<int32> exponentBuilder; exponentInstruction_->decode(source, pmap, decoder, exponentBuilder); if(!exponentBuilder.isSet()) { // null field return; } exponent_t exponent = static_cast<exponent_t>(exponentBuilder.value()); Messages::SingleValueBuilder<mantissa_t> mantissaBuilder; mantissaInstruction_->decode(source, pmap, decoder, mantissaBuilder); mantissa_t mantissa = 0; if(mantissaBuilder.isSet()) { mantissa = mantissaBuilder.value(); } Decimal value(mantissa, exponent, false); accessor.addValue(identity_, ValueType::DECIMAL, value); } else { exponent_t exponent = 0; decodeSignedInteger(source, decoder, exponent, identity_->name()); if(!isMandatory()) { if(checkNullInteger(exponent)) { return; } } mantissa_t mantissa; decodeSignedInteger(source, decoder, mantissa, identity_->name()); Decimal value(mantissa, exponent); accessor.addValue( identity_, ValueType::DECIMAL, value); } return; }