+++ /dev/null
-/************************************************************************
- ************************************************************************
- FAUST compiler
- Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale
- ---------------------------------------------------------------------
- This program 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 of the License, or
- (at your option) any later version.
-
- This program 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.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- ************************************************************************
- ************************************************************************/
-/**
- * @file boxcomplexity.cpp
- * Implement complexity computation for box diagrams.
- */
-
-
-
-
-// construction des representations graphiques
-
-
-#include <ostream>
-#include "xtended.hh"
-#include "boxcomplexity.h"
-
-using namespace std;
-
-/**
- * property Key used to store box complexity
- */
-Tree BCOMPLEXITY = tree ("BCOMPLEXITY");
-
-static int computeBoxComplexity (Tree box);
-
-/**
- * Return the complexity propety of a box expression tree.
- * Return the complexity propety of a box expression tree. If no
- * complexity property exist, it is created an computeBoxComplexity
- * is called do to the job.
- *
- * @param box an evaluated box expression tree
- * @return the complexity of box
- *
- * @see computeBoxComplexity
- */
-int boxComplexity (Tree box)
-{
- Tree prop = box->getProperty(BCOMPLEXITY);
-
- if (prop) {
- return tree2int(prop);
-
- } else {
- int v = computeBoxComplexity(box);
- box->setProperty(BCOMPLEXITY,tree(v));
- return v;
- }
-}
-
-/**
- * internal shortcut to simplify computeBoxComplexity code
- */
-#define BC boxComplexity
-
-
-/**
- * Compute the complexity of a box expression.
- *
- * Compute the complexity of a box expression tree according to the
- * complexity of its subexpressions. Basically it counts the number
- * of boxes to be drawn. The box-diagram expression is supposed
- * to be evaluated. It will exit with an error if it is not the case.
- *
- * @param box an evaluated box expression tree
- * @return the complexity of box
- */
-int computeBoxComplexity (Tree box)
-{
- int i;
- double r;
- prim0 p0;
- prim1 p1;
- prim2 p2;
- prim3 p3;
- prim4 p4;
- prim5 p5;
-
- Tree t1, t2, ff, label, cur, min, max, step, type, name, file;
-
- xtended* xt = (xtended*) getUserData(box);
-
-
- // simple elements
- if (xt) return 1;
- else if (isBoxInt(box, &i)) return 1;
- else if (isBoxReal(box, &r)) return 1;
-
- else if (isBoxCut(box)) return 0;
- else if (isBoxWire(box)) return 0;
-
- else if (isBoxPrim0(box, &p0)) return 1;
- else if (isBoxPrim1(box, &p1)) return 1;
- else if (isBoxPrim2(box, &p2)) return 1;
- else if (isBoxPrim3(box, &p3)) return 1;
- else if (isBoxPrim4(box, &p4)) return 1;
- else if (isBoxPrim5(box, &p5)) return 1;
-
- // foreign elements
- else if (isBoxFFun(box, ff)) return 1;
- else if (isBoxFConst(box, type, name, file))
- return 1;
- else if (isBoxFVar(box, type, name, file))
- return 1;
- // slots and symbolic boxes
- else if (isBoxSlot(box, &i)) return 1;
- else if (isBoxSymbolic(box,t1,t2)) return 1 + BC(t2);
-
- // block diagram binary operator
- else if (isBoxSeq(box, t1, t2)) return BC(t1) + BC(t2);
- else if (isBoxSplit(box, t1, t2)) return BC(t1) + BC(t2);
- else if (isBoxMerge(box, t1, t2)) return BC(t1) + BC(t2);
- else if (isBoxPar(box, t1, t2)) return BC(t1) + BC(t2);
- else if (isBoxRec(box, t1, t2)) return BC(t1) + BC(t2);
-
- // user interface widgets
- else if (isBoxButton(box, label)) return 1;
- else if (isBoxCheckbox(box, label)) return 1;
- else if (isBoxVSlider(box, label, cur, min, max, step)) return 1;
- else if (isBoxHSlider(box, label, cur, min, max, step)) return 1;
- else if (isBoxHBargraph(box, label, min, max)) return 1;
- else if (isBoxVBargraph(box, label, min, max)) return 1;
- else if (isBoxNumEntry(box, label, cur, min, max, step))return 1;
-
- // user interface groups
- else if (isBoxVGroup(box, label, t1)) return BC(t1);
- else if (isBoxHGroup(box, label, t1)) return BC(t1);
- else if (isBoxTGroup(box, label, t1)) return BC(t1);
-
- //a completer
- else {
- //fout << tree2str(box);
- cerr << "ERROR in boxComplexity : not an evaluated box [[ " << *box << " ]]";
- exit(-1);
- }
-
- return -1;
-}