#include "BlockRef.h" #include "ParallelAccessBlockStore.h" #include "ParallelAccessBlockStoreAdapter.h" #include #include #include using std::string; using std::promise; using cpputils::dynamic_pointer_move; using cpputils::make_unique_ref; using boost::none; using cpputils::unique_ref; using cpputils::make_unique_ref; using boost::optional; using boost::none; namespace blockstore { namespace parallelaccess { ParallelAccessBlockStore::ParallelAccessBlockStore(unique_ref baseBlockStore) : _baseBlockStore(std::move(baseBlockStore)), _parallelAccessStore(make_unique_ref(_baseBlockStore.get())) { } Key ParallelAccessBlockStore::createKey() { return _baseBlockStore->createKey(); } optional> ParallelAccessBlockStore::tryCreate(const Key &key, cpputils::Data data) { ASSERT(!_parallelAccessStore.isOpened(key), ("Key "+key.ToString()+"already exists").c_str()); auto block = _baseBlockStore->tryCreate(key, std::move(data)); if (block == none) { //TODO Test this code branch return none; } return unique_ref(_parallelAccessStore.add(key, std::move(*block))); } optional> ParallelAccessBlockStore::load(const Key &key) { auto block = _parallelAccessStore.load(key); if (block == none) { return none; } return unique_ref(std::move(*block)); } void ParallelAccessBlockStore::remove(unique_ref block) { Key key = block->key(); auto block_ref = dynamic_pointer_move(block); ASSERT(block_ref != none, "Block is not a BlockRef"); return _parallelAccessStore.remove(key, std::move(*block_ref)); } uint64_t ParallelAccessBlockStore::numBlocks() const { return _baseBlockStore->numBlocks(); } } }