74 lines
1.5 KiB
C
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
|