Query FieldList obj using field ids

gparl
gparl Newcomer

Hi all,

I have issues with FieldList forth method. The below doesn't work as expected :

const int type = updateMsg.getUpdateTypeNum();

if (type == INSTRUMENT_UPDATE_QUOTE )

decode_quote( updateMsg.getPayload().getFieldList());

void AppClient::decode_quote( const FieldList& fl )
{

enum { TIMESTAMP_FID=5, BID_FID=22, ASK_FID=25, BIDSIZE_FID=30, ASKSIZE_FID=31 };

cout << fl.toString()<<endl;

fl.forth(TIMESTAMP_FID);

const FieldEntry& ft = fl.getEntry();

const OmmTime& time = ft.getTime();

fl.reset();


if ( fl.forth(BID_FID) )
{

const FieldEntry& fb = fl.getEntry();

cout << " bid: " << fb.getReal().getAsDouble();

fl.forth(BIDSIZE_FID);

const FieldEntry& fbs = fl.getEntry();

cout << " size: " << fbs.getReal().getAsDouble();
fl.reset();

}

else if(fl.forth(ASK_FID))
{

const FieldEntry& fa = fl.getEntry();

cout << " ask: " << fa.getReal().getAsDouble();

fl.forth(ASKSIZE_FID);

const FieldEntry& fas = fl.getEntry();

cout << " size: " << fas.getReal().getAsDouble();
fl.reset();

}

cout << " tm: "<< (UInt64)time.getHour() << ":" << (UInt64)time.getMinute() << ":" << (UInt64)time.getSecond() << endl;
}

the above never prints ASK price & size, only the bid side but fl.toString() prints both.

Am I doing something wrong ?

Thanks

Best Answer

  • warat.boonyanit
    Answer ✓

    Hi @gparl

    Thank you for the explanation.

    forth() method will Iterates through the list of Data and end the iterator at the end of the container if it cannot find the matching FID.

    You will have to reset the iterator before starting a new forth.

    In fact, it would be more efficient if you use forth(<search by list>) with while loop.

    Here is an example

    ElementList searchList;

    // specify the set of fids to search for
    searchList.addArray("", OmmArray().addInt(5).addInt(22).addInt(25).addInt(30).addInt(31).complete()).complete();

    while ( fl.forth( searchList ) ) // search for a set of matching fids
    {
    const FieldEntry& fe = fl.getEntry();

    cout << "Name: " << fe.getName() << " Value: ";

    if ( fe.getCode() == Data::BlankEnum )
    cout << " blank" << endl;
    else
    switch ( fe.getFieldId() )
    {
    case 5:
    //Do stuff
    break

Answers