]> git.sesse.net Git - remoteglot-book/blobdiff - binmerger.cpp
Switch value format to protobuf. Slightly smaller, easier to deal with extensions...
[remoteglot-book] / binmerger.cpp
index 612a19b123dd9100056468776eb42436ca18a071..6c162404e416e1c347ee449d83ee82153297ebfb 100644 (file)
@@ -4,34 +4,46 @@
 #include <string>
 #include <string.h>
 #include <assert.h>
-#include "count.h"
+#include "count.pb.h"
 
 using namespace std;
 
-
 void merge_count(void* userdata,
                  const uint8_t *key, size_t len_key,
                 const uint8_t *val0, size_t len_val0,
                 const uint8_t *val1, size_t len_val1,
                 uint8_t **merged_val, size_t *len_merged_val)
 {
-       assert(len_val0 == sizeof(Count));
-       assert(len_val1 == sizeof(Count));
-
-       const Count* c0 = reinterpret_cast<const Count*>(val0);
-       const Count* c1 = reinterpret_cast<const Count*>(val1);
-       unique_ptr<Count> c((Count *)malloc(sizeof(Count)));  // Needs to be with malloc, per merger spec.
-
-       c->white = c0->white + c1->white;
-       c->draw = c0->draw + c1->draw;
-       c->black = c0->black + c1->black;
-       c->opening_num = c0->opening_num;  // Arbitrary choice.
-       c->sum_white_elo = c0->sum_white_elo + c1->sum_white_elo;
-       c->sum_black_elo = c0->sum_black_elo + c1->sum_black_elo;
-       c->num_elo = c0->num_elo + c1->num_elo;
-
-       *merged_val = reinterpret_cast<uint8_t *>(c.release());
-       *len_merged_val = sizeof(Count);
+       Count c0, c1;
+       c0.ParseFromArray(val0, len_val0);
+       c1.ParseFromArray(val1, len_val1);
+
+       Count c;
+
+       c.set_white(c0.white() + c1.white());
+       c.set_draw(c0.draw() + c1.draw());
+       c.set_black(c0.black() + c1.black());
+       c.set_sum_white_elo(c0.sum_white_elo() + c1.sum_white_elo());
+       c.set_sum_black_elo(c0.sum_black_elo() + c1.sum_black_elo());
+       c.set_num_elo(c0.num_elo() + c1.num_elo());
+       if (c0.first_timestamp() <= c1.first_timestamp()) {
+               c.set_opening_num(c0.opening_num());
+               if (c0.has_first_timestamp()) {
+                       c.set_first_timestamp(c0.first_timestamp());
+               }
+       } else {
+               c.set_opening_num(c1.opening_num());
+               if (c1.has_first_timestamp()) {
+                       c.set_first_timestamp(c1.first_timestamp());
+               }
+       }
+
+       static string buf;  // Keep allocated.
+       c.SerializeToString(&buf);
+
+       *merged_val = reinterpret_cast<uint8_t *>(malloc(buf.size()));
+       *len_merged_val = buf.size();
+       memcpy(*merged_val, buf.data(), buf.size());
 }
 
 int main(int argc, char **argv)