+
+// ---------------------------------------------
+// aggr_diff : from a sequence of strings, collect
+// the ones which are different than the previous.
+// this includes the prior time period.
+// the idea is to see the sequence of handovers
+
+struct CAT_aggr_diff_scratch{
+ std::string val;
+ std::string prev_s;
+// gs_int64_t prev_ts; // for now, just catenate strings
+};
+
+struct CAT_aggr_diff_scratch_ptr{
+ CAT_aggr_diff_scratch *ptr;
+};
+
+
+
+void CAT_aggr_diff_HFTA_AGGR_INIT_(gs_sp_t s){
+ CAT_aggr_diff_scratch_ptr *p = (CAT_aggr_diff_scratch_ptr *)s;
+ CAT_aggr_diff_scratch *v = new CAT_aggr_diff_scratch();
+ v->prev_s = "";
+ v->val = "";
+
+ p->ptr = v;
+}
+void CAT_aggr_diff_HFTA_AGGR_REINIT_(gs_sp_t s){
+ CAT_aggr_diff_scratch_ptr *p = (CAT_aggr_diff_scratch_ptr *)s;
+ CAT_aggr_diff_scratch *v = p->ptr;
+ v->val=v->prev_s;
+}
+void CAT_aggr_diff_HFTA_AGGR_UPDATE_(gs_sp_t s, vstring *str){
+ char str_buf[MAXTUPLESZ-20];
+ int i;
+ for(i=0;i<str->length;++i) str_buf[i] = *(((char *)str->offset)+i);
+ str_buf[i]='\0';
+
+ CAT_aggr_diff_scratch_ptr *p = (CAT_aggr_diff_scratch_ptr *)s;
+ CAT_aggr_diff_scratch *v = p->ptr;
+ if(str_buf != v->prev_s){
+ if(v->val.size()>0)
+ v->val += ':';
+ v->val += str_buf;
+ v->prev_s = str_buf;
+ }
+}
+
+void CAT_aggr_diff_HFTA_AGGR_OUTPUT_(vstring *res, gs_sp_t s){
+ CAT_aggr_diff_scratch_ptr *p = (CAT_aggr_diff_scratch_ptr *)s;
+ CAT_aggr_diff_scratch *v = p->ptr;
+//printf("output val=%s\n",v->val.c_str());
+ res->offset = (gs_p_t)malloc(v->val.size());
+ res->length = v->val.size();
+ if(res->length>MAXTUPLESZ-20)
+ res->length=MAXTUPLESZ-20;
+// v->val.copy((char *)(res->offset), 0, res->length);
+ const char *dat = v->val.c_str();
+ memcpy((char *)(res->offset), dat, res->length);
+// for(int i=0;i<res->length;++i)
+// *(((char *)res->offset)+i) = dat[i];
+ res->reserved = INTERNAL;
+}
+void CAT_aggr_diff_HFTA_AGGR_DESTROY_(gs_sp_t s){
+ CAT_aggr_diff_scratch_ptr *p = (CAT_aggr_diff_scratch_ptr *)s;
+ CAT_aggr_diff_scratch *v = p->ptr;
+ delete v;
+}
+
+
+