Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Copy a std::vector to a repeated field from protobuf with memcpy

Tags:

At first I have this simple protobuf file

message messagetest {     ...     repeated float samples = 6;     .... } 

Which creates a headerfile with this methods

    //repeated float samples = 6;       inline int samples_size() const;       inline void clear_samples();       static const int kSamplesFieldNumber = 6;       inline float samples(int index) const;       inline void set_samples(int index, float value);       inline void add_samples(float value);       inline const ::google::protobuf::RepeatedField< float >&  samples() const;       inline ::google::protobuf::RepeatedField< float >* mutable_samples(); 

What I'm basically doing is to copy all data one by one in a for loop.

int main(int argc, char** argv) {         messagetest fMessage;          vector<float> fData (1000, 0);      // Create 1000 random values     for (int i = 0; i < fData.size(); i++)     {         fData[i] = rand() % 1001;     }          for (int j = 0; j < fData.size(); j++)     {         fMessage.add_samples(fData[j]);         }      return 0; } 

But I want to use a method like memcpy to accelerate the copy process. It is just an idea that comes to my mind. If it's completely wrong correct me. The last declaration in the headerfile is:

inline ::google::protobuf::RepeatedField< float >* mutable_samples(); 

I have no idea what this method does (lack of skill). But it kind of looks like a vector. Maybe that's the solution for my problem. If so, I have no idea how to implement it.

like image 660
akristmann Avatar asked Mar 19 '13 12:03

akristmann


1 Answers

Since this isn't here yet and I like one-liners:

*fMessage.mutable_samples() = {fData.begin(), fData.end()}; 
like image 122
mgild Avatar answered Sep 21 '22 06:09

mgild