--- trunk/src/brains/BlockSnapshotManager.cpp 2005/02/13 08:05:33 322 +++ trunk/src/brains/BlockSnapshotManager.cpp 2005/02/15 17:11:35 347 @@ -41,14 +41,14 @@ #include #include "brains/BlockSnapshotManager.hpp" #include "utils/physmem.h" +#include "utils/Algorithm.hpp" #include "brains/SimInfo.hpp" #include "io/DumpReader.hpp" namespace oopse { BlockSnapshotManager::BlockSnapshotManager(SimInfo* info, const std::string& filename, int storageLayout, int blockCapacity) - : SnapshotManager(storageLayout), info_(info), - blockCapacity_(blockCapacity), activeBlocks(blockCapacity_, -1) { + : SnapshotManager(storageLayout), info_(info), blockCapacity_(blockCapacity), activeBlocks_(blockCapacity_, -1) { nAtoms_ = info->getNGlobalAtoms(); nRigidBodies_ = info->getNGlobalRigidBodies(); @@ -57,41 +57,53 @@ BlockSnapshotManager::BlockSnapshotManager(SimInfo* in int bytesPerStuntDouble = DataStorage::getBytesPerStuntDouble(storageLayout); - int bytesPerFrame = nStuntDoubles * bytesPerStuntDouble; + int bytesPerFrame = (nRigidBodies_ + nAtoms_) * bytesPerStuntDouble; int frameCapacity = int (avalPhysMem / bytesPerFrame); nSnapshotPerBlock_ = frameCapacity /blockCapacity_ ; reader_ = new DumpReader(info, filename); - nframes_ = reader->getNFrames(); + nframes_ = reader_->getNFrames(); - int nblocks = nframes / nSnapshotPerBlock_; - if (nframes % nSnapshotPerBlock != 0) { + int nblocks = nframes_ / nSnapshotPerBlock_; + if (nframes_ % nSnapshotPerBlock_ != 0) { ++nblocks; } for (int i = 0; i < nblocks; ++i) { - blocks_.push_back(SnapshotBlock(i, (i+1)*nSnapshotPerBlock_); + blocks_.push_back(SnapshotBlock(i*nSnapshotPerBlock_, (i+1)*nSnapshotPerBlock_)); } //the last block may not have nSnapshotPerBlock frames, we need to consider this special situation - blocks.back.second = nframes; + blocks_.back().second = nframes_; - snapshots_.insert(snapshot_.begin(), nframes, NULL); + snapshots_.insert(snapshots_.begin(), nframes_, static_cast(NULL)); } -BlockSnapshotMananger::~BlockSnapshotMananger() { +BlockSnapshotManager::~BlockSnapshotManager() { currentSnapshot_ = NULL; previousSnapshot_ = NULL; delete reader_; - std::for_each(activeBlocks_.begin(), activeBlocks_.end(), unloadBlock); + + std::vector::iterator i; + for (i = activeBlocks_.begin(); i != activeBlocks_.end(); ++i) { + if (*i != -1) { + unloadBlock(*i); + } + } } int BlockSnapshotManager::getNActiveBlocks() { - return std::count_if(activeBlocks_.begin(), activeBlocks_.end(), std::not); +#ifdef __RWSTD + int count = 0; + std::count_if(activeBlocks_.begin(), activeBlocks_.end(), std::bind2nd(std::not_equal_to(), -1), count); + return count; +#else + return std::count_if(activeBlocks_.begin(), activeBlocks_.end(), std::bind2nd(std::not_equal_to(), -1)); +#endif } bool BlockSnapshotManager::isBlockActive(int block) { @@ -133,19 +145,28 @@ bool BlockSnapshotManager::unloadBlock(int block) { j = std::find(activeBlocks_.begin(), activeBlocks_.end(), block); assert(j != activeBlocks_.end()); *j = -1; + unloadSuccess = true; } + + return unloadSuccess; } std::vector BlockSnapshotManager::getActiveBlocks() { std::vector result; - std::copy_if(activeBlocks_.begin(), activeBlocks_.end()); + oopse::copy_if(activeBlocks_.begin(), activeBlocks_.end(), std::back_inserter(result), + std::bind2nd(std::not_equal_to(), -1)); + return result; } Snapshot* BlockSnapshotManager::loadFrame(int frame){ Snapshot* snapshot = new Snapshot(nAtoms_, nRigidBodies_, getStorageLayout()); snapshot->setID(frame); - setCurrentSnapshot(snapshot); /** @todo fixed me */ + + /** @todo fixed me */ + Snapshot* oldSnapshot = currentSnapshot_; + currentSnapshot_ = snapshot; reader_->readFrame(frame); + currentSnapshot_ = oldSnapshot; return snapshot; }