Value &Value::operator=(const Value &v) { ValueImp *tmpRep = v.imp(); // Avoid the destruction of the object underneath us by // incrementing the reference on it first if(tmpRep) { tmpRep->ref(); // fprintf(stderr, "Value::operator=(%p)(copying %p) imp=%p ref=%d\n", this, &v, tmpRep, tmpRep->refcount); } if(rep) { rep->deref(); // fprintf(stderr, "Value::operator=(%p)(copying %p) old imp=%p ref=%d\n", this, &v, rep, rep->refcount); } rep = tmpRep; return *this; }
bool testInsertDelete(int numInsert, int numDelete, int delOffset, int randSeed) { srand(randSeed); char str[20]; bool result = true; assert(numDelete >= 0 && numDelete < numInsert); assert(delOffset >= 0 && delOffset+numDelete <= numInsert); PropertyMap map; // add some random numbers int *nums = (int*)malloc(numInsert*sizeof(int)); int i; for (i = 0; i < numInsert; i++) { nums[i] = int(1000.0*rand()/RAND_MAX); Value val = Number(nums[i]); ValueImp *v = val.imp(); v->ref(); sprintf(str,"%05d-%05d",nums[i],i); // ensure uniqueness map.put(str,v,0); map.checkTree(); } // check to ensure they're all there for (i = 0; i < numInsert; i++) { sprintf(str,"%05d-%05d",nums[i],i); ValueImp *v = map.get(str); if (v == 0 || v->type() != NumberType || static_cast<NumberImp*>(v)->value() != nums[i]) { result = false; } map.checkTree(); } // delete some for (i = delOffset; i < delOffset+numDelete; i++) { sprintf(str,"%05d-%05d",nums[i],i); map.remove(str); map.checkTree(); } // make sure the deletes ones aren't there any more, and the others are for (i = 0; i < numInsert; i++) { sprintf(str,"%05d-%05d",nums[i],i); ValueImp *v = map.get(str); if (i >= delOffset && i < delOffset+numDelete) { // should have been deleted if (v) result = false; } else { // should not have been deleted if (v == 0 || v->type() != NumberType || static_cast<NumberImp*>(v)->value() != nums[i]) { result = false; } } map.checkTree(); } // check that first() and next() work PropertyMapNode *it = map.first(); int itcount = 0; while (it) { itcount++; PropertyMapNode *prev = it; it = it->next(); if (it) { if (uscompare(prev->name,it->name) >= 0) result = false; } } if (itcount != numInsert-numDelete) result = false; if (result) printf("PASS: Insert %d, delete %d-%d, seed %d\n",numInsert,delOffset, delOffset+numDelete-1,randSeed); else printf("FAIL: Insert %d, delete %d-%d, seed %d\n",numInsert,delOffset, delOffset+numDelete-1,randSeed); return result; }