reprodyne/scopecontainers.h

74 lines
1.5 KiB
C++

//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<ScopeHandlerRecorder> storedScope;
std::map<void*, int> 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<ScopeHandlerRecorder> pop()
{
ordinalMap.clear();
return std::move(storedScope);
}
};
class ScopeContainerPlayer
{
public:
typedef flatbuffers::Vector<flatbuffers::Offset<OrdinalScopeTapeEntry>> BufferType;
private:
const BufferType* myRootBuffer;
BufferType::const_iterator ordinalPosition;
std::map<void*, ScopeHandlerPlayer> scopeMap;
std::vector<PlaybackError> 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