Tuesday, March 1, 2011

Google Protocol Buffer repeated field C++

I have the below protocol buffer. Note that StockStatic is a repeated field.

message ServiceResponse
{
    enum Type
    {
     REQUEST_FAILED     = 1;
     STOCK_STATIC_SNAPSHOT   = 2;
    }

    message StockStaticSnapshot
    {
     repeated StockStatic stock_static  = 1;
    }
    required Type type      = 1;
    optional StockStaticSnapshot stock_static_snapshot  = 2;

}

message StockStatic
{
    optional string sector   = 1;
      optional string subsector = 2;
}

I am filling out the StockStatic fields while iterating through a vector.

ServiceResponse.set_type(ServiceResponse_Type_STOCK_STATIC_SNAPSHOT);

ServiceResponse_StockStaticSnapshot stockStaticSnapshot;

for (vector<stockStaticInfo>::iterator it = m_staticStocks.begin(); it!= m_staticStocks.end(); ++it)
{
 StockStatic* pStockStaticEntity = stockStaticSnapshot.add_stock_static();

 SetStockStaticProtoFields(*it, pStockStaticEntity); // sets sector and subsector field to pStockStaticEntity by reading the fields using (*it)
}

But the above code is right only if StockStatic was an optional field and not a repeated field. My questions is what line of code am i missing to make it a repeated field?

From stackoverflow
  • Another way of accomplishing the same thing:

    message SearchResponse {
      message Result {
      required string url = 1;
      optional string title = 2;
      repeated string snippets = 3;
      }  
      repeated Result result = 1;
    }
    
  • No, you're doing the right thing.

    Here's a snippet of my PB (detail ommited for brevity):

    message DemandSummary
    {
        required uint32 solutionIndex     = 1;
        required uint32 demandID          = 2;
    }
    message ComputeResponse
    {
        repeated DemandSummary solutionInfo  = 3;
    }
    

    ...and the C++ to fill up ComputeResponse::solutionInfo:

    ComputeResponse response;
    
    for ( int i = 0; i < demList.size(); ++i ) {
    
        DemandSummary* summary = response->add_solutioninfo();
        summary->set_solutionindex(solutionID);
        summary->set_demandid(demList[i].toUInt());
    }
    

    response.solutionInfo now contains demList.size() elements.

    aajkaltak : Thank you.. I just realized the call to response->add_solutioninfo() ---- adds more than 1 element.. thank you!

0 comments:

Post a Comment