1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
|
// Type constraint class -*- c++ -*-
#ifndef CONSTRAINT_H_
# define CONSTRAINT_H_
# ifdef __GNUC__
# pragma interface
# endif // __GNUC__
# include <list>
# include "typedefs.h"
/** @file Constraint.h
* Constraint that limits the domain of a data type
*/
/* Copyright 1998-2001 Marko Mkel (msmakela@tcs.hut.fi).
This file is part of MARIA, a reachability analyzer and model checker
for high-level Petri nets.
MARIA is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
MARIA is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
The GNU General Public License is often shipped with GNU software, and
is generally kept in a file called COPYING or LICENSE. If you do not
have a copy of the license, write to the Free Software Foundation,
59 Temple Place, Suite 330, Boston, MA 02111 USA. */
/** Value constraint */
class Constraint
{
public:
/*@{*/
/** List of value ranges that the constraint allows */
typedef std::list<class Range*> List;
/** Iterator to the range list */
typedef List::iterator iterator;
/** Const iterator to the range list */
typedef List::const_iterator const_iterator;
/*@}*/
/** Constructor */
Constraint ();
/** Copy constructor
* @param old constraint to be copied
* @param type type of the new constraint
*/
Constraint (const class Constraint& old, const class Type& type);
private:
/** Copy constructor */
Constraint (const class Constraint& old);
/** Assignment operator */
class Constraint& operator= (const class Constraint& old);
public:
/** Destructor */
~Constraint ();
/** Set the type of the constraint */
void setType (const class Type& type);
/** Get the first value of the constraint
* @return the smallest value
*/
const class Value& getFirstValue () const;
/** Get the last value of the constraint
* @return the largest value
*/
const class Value& getLastValue () const;
/** Get the high bound of the value
* @param value value whose high bound is to be sought
* @return the high bound
*/
const class Value& getNextHigh (const class Value& value) const;
/** Get the smallest high bound greater than the value
* @param value value whose successor is to be sought
* @return the successor of the value, or NULL
*/
const class Value* getNextLow (const class Value& value) const;
/** Get the low bound of the value
* @param value value whose high bound is to be sought
* @return the high bound
*/
const class Value& getPrevLow (const class Value& value) const;
/** Get the biggest high bound smaller than the value
* @param value value whose predecessor is to be sought
* @return the predecessor of the value, or NULL
*/
const class Value* getPrevHigh (const class Value& value) const;
/** @name Accessors to the range list */
/*@{*/
bool empty () const { return myList.empty (); }
size_t size () const { return myList.size (); }
const_iterator begin () const { return myList.begin (); }
const_iterator end () const { return myList.end (); }
iterator begin () { return myList.begin (); }
iterator end () { return myList.end (); }
/*@}*/
/** Append a range to the constraint
* @param range Range to be appended
*/
void append (class Range& range);
/** Restrict the constraint by another constraint
* @param constraint Constraint to be restricted by
* @param type Type of this constraint
*/
void restrict (const class Constraint& constraint, const class Type& type);
/** Determine whether the constraint encloses another constraint
* @param other the other constraint to be investigated
* @return true if all values accepted by the other constraint
* are accepted by this constraint
*/
bool isSuperset (const class Constraint& other) const;
/** Determine whether the two constraints are disjoint
* @param other the other constraint
* @return true if the constraints are disjoint
*/
bool isDisjoint (const class Constraint& other) const;
/** Determine whether the constraint accepts a value
* @param value value to be checked
* @return true if the value passes the check
*/
bool isConstrained (const class Value& value) const;
/**
* Determine the number of possible values for this constraint
* @return number of possible values
*/
card_t getNumValues () const;
#ifdef EXPR_COMPILE
/** Generate C code for checking the constraint
* @param cexpr the compilation
* @param indent indentation level
* @param value C expression referring to the value
*/
void compileCheck (class CExpression& cexpr,
unsigned indent,
const char* value) const;
/** Emit code for converting a value to a number
* @param out output stream
* @param indent indentation level
* @param type the data type of the constraint
* @param value value to be converted
* @param number number to be computed
* @param add flag: add to number instead of assigning
* @param work auxiliary variable (NULL for leaf types)
*/
void compileConversion (class StringBuffer& out,
unsigned indent,
const class Type& type,
const char* value,
const char* number,
bool add,
const char* work) const;
/** Emit code for converting a number to a value
* @param out output stream
* @param indent indentation level
* @param type the data type of the constraint
* @param number number to be converted
* @param value value to be computed
* @param leaf flag: generate leaf type comparisons and assignments
*/
void compileReverseConversion (class StringBuffer& out,
unsigned indent,
const class Type& type,
const char* number,
const char* value,
bool leaf) const;
#endif // EXPR_COMPILE
/** Display the constraint definition
* @param printer the printer object
*/
void display (const class Printer& printer) const;
private:
/** List of ranges belonging to the constraint */
List myList;
};
#endif // CONSTRAINT_H_
|