// merge the info from 'incoming' into this record. // we finish with a union of this+incoming and special handling for collisions bool MediaAnalyticsItem::merge(MediaAnalyticsItem *incoming) { // if I don't have key or session id, take them from incoming // 'this' should never be missing both of them... if (mKey.empty()) { mKey = incoming->mKey; } else if (mSessionID == 0) { mSessionID = incoming->mSessionID; } // we always take the more recent 'finalized' value setFinalized(incoming->getFinalized()); // for each attribute from 'incoming', resolve appropriately int nattr = incoming->mPropCount; for (int i = 0 ; i < nattr; i++ ) { Prop *iprop = &incoming->mProps[i]; Prop *oprop = findProp(iprop->mName); const char *p = iprop->mName; size_t len = strlen(p); char semantic = p[len-1]; if (oprop == NULL) { // no oprop, so we insert the new one oprop = allocateProp(p); copyProp(oprop, iprop); } else { // merge iprop into oprop switch (semantic) { case '<': // first aka keep old) /* nop */ break; default: // default is 'last' case '>': // last (aka keep new) copyProp(oprop, iprop); break; case '+': /* sum */ // XXX validate numeric types, sum in place break; } } } // not sure when we'd return false... return true; }
void finalize(Box* b) { GCAllocation* al = GCAllocation::fromUserData(b); assert(!hasFinalized(al)); setFinalized(al); b->cls->tp_dealloc(b); }