1
/* PeTe - Petri Engine exTremE
2
* Copyright (C) 2011 Jonas Finnemann Jensen <jopsen@gmail.com>,
3
* Thomas Søndersø Nielsen <primogens@gmail.com>,
4
* Lars Kærlund Østergaard <larsko@gmail.com>,
6
* This program is free software: you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation, either version 3 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19
#ifndef LIMITEDSTATEALLOCATOR_H
20
#define LIMITEDSTATEALLOCATOR_H
22
#include "../PetriNet.h"
30
namespace PetriEngine {
31
namespace Structures {
33
/** State allocator that is limited on memory */
34
template<size_t blocksize = 100000>
35
class LimitedStateAllocator{
39
} __attribute__((__packed__));
41
LimitedStateAllocator(const PetriNet& net, int memorylimit = 0){
42
_nPlaces = net.numberOfPlaces();
43
_nVars = net.numberOfVariables();
45
_blocklimit = ceil(memorylimit / (stateSize() * blocksize));
51
~LimitedStateAllocator(){
53
Block* nb = _b->parent;
58
/** Create new state */
60
if(_offset == blocksize - 1){
65
char* d = (_b->m + sizeof(Block) + stateSize() * _offset);
68
s->_parentTransition = 0;
69
s->_transitionMultiplicity = 0;
70
s->_marking = (MarkVal*)(d + sizeof(State));
71
s->_valuation = (VarVal*)(d + sizeof(State) + sizeof(MarkVal) * _nPlaces);
77
return sizeof(State) + sizeof(MarkVal) * _nPlaces + sizeof(VarVal) * _nVars;
79
void createNewBlock(){
82
size_t s = sizeof(Block) + stateSize() * blocksize;
83
char* m = new char[s];
87
b->m = m + sizeof(Block);
101
#endif // LIMITEDSTATEALLOCATOR_H