~verifypn-cpn/verifypn/colored

« back to all changes in this revision

Viewing changes to PetriEngine/Structures/SmartStateAllocator.h

  • Committer: Jonas Finnemann Jensen
  • Date: 2011-09-15 13:30:00 UTC
  • Revision ID: jopsen@gmail.com-20110915133000-wnywm1odf82emiuw
Import of sources from github

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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>,
 
5
 * 
 
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.
 
10
 * 
 
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.
 
15
 * 
 
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/>.
 
18
 */
 
19
#ifndef SMARTSTATEALLOCATOR_H
 
20
#define SMARTSTATEALLOCATOR_H
 
21
 
 
22
#include "../PetriNet.h"
 
23
#include "SmartState.h"
 
24
 
 
25
#include <stdlib.h>
 
26
#include <string.h>
 
27
 
 
28
namespace PetriEngine{
 
29
namespace Structures{
 
30
 
 
31
template<size_t memory>
 
32
class SmartStateAllocator{
 
33
public:
 
34
        SmartStateAllocator(const PetriNet& net){
 
35
                data = new char[memory];
 
36
                offset = data;
 
37
                nPlaces = net.numberOfPlaces();
 
38
                nVars = net.numberOfVariables();
 
39
        }
 
40
 
 
41
        ~SmartStateAllocator(){
 
42
                if(data){
 
43
                        delete[] data;
 
44
                        data = NULL;
 
45
                }
 
46
        }
 
47
        /** Create new state, returns NULL if out of memory */
 
48
        SmartState* createStoredState(){
 
49
                size_t size = sizeof(SmartState) + nPlaces * sizeof(MarkVal) + nVars * sizeof(VarVal);
 
50
                if(offset - data + size > memory)
 
51
                        return NULL;
 
52
                SmartState* s = (SmartState*)offset;
 
53
                s->setParent(NULL);
 
54
                s->setTransition(0, 0);
 
55
                s->_marking = (MarkVal*)(offset + sizeof(SmartState));
 
56
                s->_valuation = (VarVal*)(offset + sizeof(SmartState) + nPlaces * sizeof(MarkVal));
 
57
                offset += size;
 
58
                return s;
 
59
        }
 
60
        /** Create new non-stored state, returns NULL if out of memory */
 
61
        SmartState* createState(SmartState* parent = NULL, unsigned int transition = 0, int multiplicity = 1){
 
62
                size_t size = sizeof(SmartState);
 
63
                if(offset - data + size > memory)
 
64
                        return NULL;
 
65
                SmartState* s = (SmartState*)offset;
 
66
                s->setParent(parent);
 
67
                s->setTransition(transition, multiplicity);
 
68
                s->_marking = NULL;
 
69
                s->_valuation = NULL;
 
70
                offset += size;
 
71
                return s;
 
72
        }
 
73
        /** Get memory usage as double between 1 and 100 */
 
74
        double percentMemoryUsed() const{
 
75
                return ((double)(offset - data)) / (((double)memory)/100);
 
76
        }
 
77
private:
 
78
        int nPlaces, nVars;
 
79
        char* data;
 
80
        char* offset;
 
81
};
 
82
 
 
83
} // Structures
 
84
} // PetriEngine
 
85
 
 
86
#endif // SMARTSTATEALLOCATOR_H