#include "InMemoryBlock.h" #include "InMemoryBlockStore.h" #include using std::unique_ptr; using std::make_unique; using std::string; using std::mutex; using std::lock_guard; using std::piecewise_construct; using std::make_tuple; using cpputils::Data; using cpputils::unique_ref; using cpputils::make_unique_ref; using boost::optional; using boost::none; namespace blockstore { namespace inmemory { InMemoryBlockStore::InMemoryBlockStore() : _blocks() {} optional> InMemoryBlockStore::tryCreate(const Key &key, Data data) { auto insert_result = _blocks.emplace(piecewise_construct, make_tuple(key.ToString()), make_tuple(key, std::move(data))); if (!insert_result.second) { return none; } //Return a pointer to the stored InMemoryBlock return optional>(make_unique_ref(insert_result.first->second)); } unique_ptr InMemoryBlockStore::load(const Key &key) { //Return a pointer to the stored InMemoryBlock try { return make_unique(_blocks.at(key.ToString())); } catch (const std::out_of_range &e) { return nullptr; } } void InMemoryBlockStore::remove(unique_ptr block) { Key key = block->key(); block.reset(); int numRemoved = _blocks.erase(key.ToString()); assert(1==numRemoved); } uint64_t InMemoryBlockStore::numBlocks() const { return _blocks.size(); } } }