//This file is part of the reprodyne project and is licensed under the terms of the LGPL-3.0-only #pragma once #include "scopehandlers.h" #include "errorstuff.h" namespace reprodyne { class ScopeContainerRecorder { flatbuffers::FlatBufferBuilder& builder; std::vector storedScope; std::map ordinalMap; public: ScopeContainerRecorder(flatbuffers::FlatBufferBuilder& builder): builder(builder) {} void openScope(void* ptr) { storedScope.emplace_back(builder); ordinalMap[ptr] = storedScope.size() - 1; } ScopeHandlerRecorder& at(void* ptr); std::vector pop() { ordinalMap.clear(); return std::move(storedScope); } }; class ScopeContainerPlayer { public: typedef flatbuffers::Vector> BufferType; private: const BufferType* myRootBuffer; BufferType::const_iterator ordinalPosition; std::map scopeMap; std::vector deferredCompleteReadErrors; public: void openScope(void *ptr); ScopeHandlerPlayer& at(void* ptr); void load(const BufferType* rootBeer) { myRootBuffer = rootBeer; ordinalPosition = myRootBuffer->begin(); } void assertCompleteRead() { for(auto& e : deferredCompleteReadErrors) throw e; //Only the first one but that's cool too. for(auto pair : scopeMap) pair.second.assertCompletReed(); } }; }//reprodyne