/* Web Polygraph http://www.web-polygraph.org/ * (C) 2003-2006 The Measurement Factory * Licensed under the Apache License, Version 2.0 */ #include "base/polygraph.h" #include "base/ObjId.h" #include "base/RndPermut.h" #include "runtime/IOBuf.h" #include "csm/ContentCfg.h" #include "csm/BodyIter.h" BodyIter::BodyIter() { reset(); } BodyIter::~BodyIter() { reset(); } void BodyIter::contentSize(Size aContentSize) { theContentSize = aContentSize; } void BodyIter::start(WrBuf *aBuf) { Assert(theOid); Assert(aBuf); theBuf = aBuf; theRng.seed(GlbPermut(theContentHash, rndBodyIter)); theBuiltSize = 0; } void BodyIter::reset() { theOid.reset(); theBuf = 0; theContentSize = theBuiltSize = Size(); } bool BodyIter::canPour() const { return theBuf && !theBuf->full() && !pouredAll(); } bool BodyIter::pouredAll() const { return theContentSize.known() && theBuiltSize >= theContentSize; } bool BodyIter::pour() { if (theBuiltSize == 0) pourPrefix(); return pourBody(); } void BodyIter::pourPrefix() { if (Should(theContentCfg && theBuf)) theBuiltSize += theContentCfg->pourContentPrefix(theOid, *theBuf); }