| 41 |
|
#include <algorithm> |
| 42 |
|
#include "brains/BlockSnapshotManager.hpp" |
| 43 |
|
#include "utils/physmem.h" |
| 44 |
+ |
#include "utils/Algorithm.hpp" |
| 45 |
|
#include "brains/SimInfo.hpp" |
| 46 |
|
#include "io/DumpReader.hpp" |
| 47 |
|
|
| 48 |
|
namespace oopse { |
| 49 |
< |
BlockSnapshotMananger::BlockSnapshotMananger(SimInfo* info, const std::string& filename, |
| 49 |
> |
BlockSnapshotManager::BlockSnapshotManager(SimInfo* info, const std::string& filename, |
| 50 |
|
int storageLayout, int blockCapacity) |
| 51 |
|
: SnapshotManager(storageLayout), info_(info), blockCapacity_(blockCapacity), activeBlocks_(blockCapacity_, -1) { |
| 52 |
|
|
| 72 |
|
} |
| 73 |
|
|
| 74 |
|
for (int i = 0; i < nblocks; ++i) { |
| 75 |
< |
blocks_.push_back(SnapshotBlock(i, (i+1)*nSnapshotPerBlock_); |
| 75 |
> |
blocks_.push_back(SnapshotBlock(i, (i+1)*nSnapshotPerBlock_)); |
| 76 |
|
} |
| 77 |
|
//the last block may not have nSnapshotPerBlock frames, we need to consider this special situation |
| 78 |
< |
blocks_.back.second = nframes_; |
| 78 |
> |
blocks_.back().second = nframes_; |
| 79 |
|
|
| 80 |
|
snapshots_.insert(snapshots_.begin(), nframes_, NULL); |
| 81 |
|
|
| 82 |
|
} |
| 83 |
|
|
| 84 |
|
|
| 85 |
< |
BlockSnapshotMananger::~BlockSnapshotMananger() { |
| 85 |
> |
BlockSnapshotManager::~BlockSnapshotManager() { |
| 86 |
|
currentSnapshot_ = NULL; |
| 87 |
|
previousSnapshot_ = NULL; |
| 88 |
|
|
| 89 |
|
delete reader_; |
| 90 |
< |
std::for_each(activeBlocks_.begin(), activeBlocks_.end(), unloadBlock); |
| 90 |
> |
|
| 91 |
> |
std::vector<int>::iterator i; |
| 92 |
> |
for (i = activeBlocks_.begin(); i != activeBlocks_.end(); ++i) { |
| 93 |
> |
if (*i != -1) { |
| 94 |
> |
unloadBlock(*i); |
| 95 |
> |
} |
| 96 |
> |
} |
| 97 |
|
} |
| 98 |
|
|
| 99 |
|
int BlockSnapshotManager::getNActiveBlocks() { |
| 100 |
< |
return std::count_if(activeBlocks_.begin(), activeBlocks_.end(), std::not); |
| 100 |
> |
return std::count_if(activeBlocks_.begin(), activeBlocks_.end(), std::bind2nd(std::not_equal_to<int>(), -1)); |
| 101 |
|
} |
| 102 |
|
|
| 103 |
|
bool BlockSnapshotManager::isBlockActive(int block) { |
| 139 |
|
j = std::find(activeBlocks_.begin(), activeBlocks_.end(), block); |
| 140 |
|
assert(j != activeBlocks_.end()); |
| 141 |
|
*j = -1; |
| 142 |
+ |
unloadSuccess = true; |
| 143 |
|
} |
| 144 |
+ |
|
| 145 |
+ |
return unloadSuccess; |
| 146 |
|
} |
| 147 |
|
|
| 148 |
|
std::vector<int> BlockSnapshotManager::getActiveBlocks() { |
| 149 |
|
std::vector<int> result; |
| 150 |
< |
std::copy_if(activeBlocks_.begin(), activeBlocks_.end()); |
| 150 |
> |
oopse::copy_if(activeBlocks_.begin(), activeBlocks_.end(), std::back_inserter(result), |
| 151 |
> |
std::bind2nd(std::not_equal_to<int>(), -1)); |
| 152 |
> |
return result; |
| 153 |
|
} |
| 154 |
|
|
| 155 |
|
Snapshot* BlockSnapshotManager::loadFrame(int frame){ |
| 156 |
|
Snapshot* snapshot = new Snapshot(nAtoms_, nRigidBodies_, getStorageLayout()); |
| 157 |
|
snapshot->setID(frame); |
| 158 |
< |
setCurrentSnapshot(snapshot); /** @todo fixed me */ |
| 158 |
> |
|
| 159 |
> |
/** @todo fixed me */ |
| 160 |
> |
Snapshot* oldSnapshot = currentSnapshot_; |
| 161 |
> |
currentSnapshot_ = snapshot; |
| 162 |
|
reader_->readFrame(frame); |
| 163 |
+ |
currentSnapshot_ = oldSnapshot; |
| 164 |
|
return snapshot; |
| 165 |
|
} |
| 166 |
|
|