2
* File: CoveredMarkingVisitor.cpp
3
* Author: Peter G. Jensen
5
* Created on 18 June 2015, 14:23
8
#include "CoveredMarkingVisitor.h"
11
using namespace ptrie;
12
namespace VerifyTAPN {
13
namespace DiscreteVerification {
15
CoveredMarkingVisitor::CoveredMarkingVisitor(
16
MarkingEncoder<MetaData*, NonStrictMarking>& enc)
17
: encoder(enc), scratchpad(0)
23
CoveredMarkingVisitor::~CoveredMarkingVisitor()
28
void CoveredMarkingVisitor::set_target(NonStrictMarking* m, ptriepointer_t<MetaData*> me)
34
if(encoder.scratchpad.size() > scratchpad.size())
37
scratchpad = encoder.scratchpad.clone();
41
bool CoveredMarkingVisitor::set(int index, bool value)
43
if(_found) return true; // end
44
scratchpad.set(index, value);
45
// If we have enough bits to constitute a single token (with placement)
46
if((index + 1) % encoder.offsetBitSize == 0 && index > 0)
48
size_t begin = (index / encoder.offsetBitSize) * encoder.offsetBitSize;
49
unsigned long long data = 0;
53
while (cbit >= begin + encoder.countBitSize) {
55
if(scratchpad.at(cbit))
65
if(scratchpad.at(cbit))
74
return !target_contains_token(data, count);
76
// should not really happen
78
return true; // skip if happens!
82
return false; // not enough info
86
bool CoveredMarkingVisitor::set_remainder(int index,
87
ptriepointer_t<MetaData*> pointer)
89
// special case, marking cannot cover itself
90
if(pointer.index == _targetencoding.index) return false;
91
if(_found) return true; // end
93
encoding_t remainder = pointer.remainder();
94
uint offset = index - (index % 8); // offset matches on a byte
95
uint begin = (index / encoder.offsetBitSize ) * encoder.offsetBitSize; // start from whole token
103
unsigned long long data = 0;
105
cbit += encoder.offsetBitSize - 1;
106
// unpack place/age/count
107
while (cbit >= begin + encoder.countBitSize) {
110
if(cbit < offset) bit = scratchpad.at(cbit);
111
else bit = remainder.at(cbit - offset);
124
if(cbit < offset) bit = scratchpad.at(cbit);
125
else bit = remainder.at(cbit - offset);
134
begin += encoder.offsetBitSize;
137
if(!target_contains_token(data, count))
153
bool CoveredMarkingVisitor::back(int index)
158
bool CoveredMarkingVisitor::target_contains_token(unsigned long long placeage, uint count)
160
if(count == 0) return true;
162
int age = floor(placeage / encoder.numberOfPlaces);
163
int place = (placeage % encoder.numberOfPlaces);
165
const TokenList& tokens = target->getTokenList(place);
168
for( TokenList::const_iterator it = tokens.begin();
169
it != tokens.end(); ++it)
171
if(it->getAge() == age)
173
if(it->getCount() >= cnt) return true; // continue
174
else return false; // skip branch
176
else if(it->getAge() > age) return false; // skip branch
179
return false; // skip branch
182
NonStrictMarking* CoveredMarkingVisitor::decode()
184
NonStrictMarking* m = encoder.decode(match);
185
m->meta = match.get_meta();
b'\\ No newline at end of file'