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
|
// Function definition -*- c++ -*-
#ifdef __GNUC__
# pragma implementation
#endif // __GNUC__
#include "Function.h"
#include "VariableDefinition.h"
#include "Variable.h"
#include "ExpressionList.h"
#include "Substitution.h"
/** @file Function.C
* Function (typed macro) definition
*/
/* Copyright 1999-2003 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. */
Function::Function (char* name, unsigned arity,
class VariableDefinition** params,
class Expression* expr,
bool copy) :
myName (name), myArity (arity),
myParams (params), myExpr (expr), myCopy (copy)
{
assert (name && expr);
}
Function::~Function ()
{
delete[] myName;
myExpr->destroy ();
for (unsigned i = 0; i < myArity; i++)
delete myParams[i];
delete[] myParams;
}
void
Function::substitute (class Substitution& substitution)
{
class Expression* expr = myExpr->substitute (substitution);
assert (!!expr);
myExpr->destroy ();
myExpr = expr;
}
class Expression*
Function::expand (class ExpressionList* params)
{
if (myArity != (params ? params->size () : 0))
return NULL;
class Substitution substitution;
for (unsigned i = 0; i < myArity; i++) {
if (!(*params)[i].isAssignable (myParams[i]->getType ()))
return NULL;
substitution.setExpr (*myParams[i], *(*params)[i].copy ());
}
return myExpr->substitute (substitution);
}
|