New directory tree, with preprocessor/ inside interpretor/.
[Faustine.git] / interpretor / preprocessor / faust-0.9.47mr3 / compiler / headers / schema.h
diff --git a/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/schema.h b/interpretor/preprocessor/faust-0.9.47mr3/compiler/headers/schema.h
new file mode 100644 (file)
index 0000000..dff27b0
--- /dev/null
@@ -0,0 +1,181 @@
+/************************************************************************
+ ************************************************************************
+    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.
+ ************************************************************************
+ ************************************************************************/
+
+#ifndef __SCHEMA__
+#define __SCHEMA__
+
+
+#include "device.h"
+#include <vector>
+#include <string>
+#include <set>
+
+using namespace std;
+
+const double dWire = 8;                        ///< distance between two wires
+//const double dLetter = 6;                    ///< width of a letter
+const double dLetter = 4.3;                    ///< width of a letter
+const double dHorz = 4;                ///< marge horizontale
+const double dVert = 4;                                ///< marge verticale
+
+
+struct point
+{
+    double  x;
+    double  y;
+
+    point(double u, double v) : x(u), y(v) {}
+    point(const point& p) : x(p.x), y(p.y) {}
+
+    bool operator<(const point& p) const {
+        if (x < p.x)        return true;
+        else if (x > p.x)   return false;
+        else if (y < p.y)   return true;
+        else                return false;
+    }
+};
+
+struct trait
+{
+    point   start;
+    point   end;
+    bool    hasRealInput;
+    bool    hasRealOutput;
+
+    trait(const point& p1, const point& p2) : start(p1), end(p2)    {}
+    void draw(device& dev) const { dev.trait(start.x, start.y, end.x, end.y); }
+
+    bool operator<(const trait& t) const {
+        if (start < t.start)        return true;
+        else if (t.start < start)   return false;
+        else if (end < t.end)       return true;
+        else                        return false;
+    }
+};
+
+struct collector
+{
+    set<point>  fOutputs;       // collect real outputs
+    set<point>  fInputs;        // collect real inputs
+    set<trait>  fTraits;        // collect traits to draw
+    set<trait>  fWithInput;     // collect traits with a real input
+    set<trait>  fWithOutput;    // collect traits with a real output
+
+    void addOutput(const point& p)  { fOutputs.insert(p); }
+    void addInput(const point& p)   { fInputs.insert(p); }
+    void addTrait(const trait& t)   { fTraits.insert(t); }
+    void computeVisibleTraits();
+    bool isVisible(const trait& t);
+    void draw(device& dev);
+};
+
+enum { kLeftRight=1, kRightLeft=-1 };
+
+
+
+/**
+ * An abstract block diagram schema
+ */
+class schema
+{
+  private:
+       const unsigned int      fInputs;
+       const unsigned int      fOutputs;
+       const double            fWidth;
+       const double            fHeight;
+
+       // fields only defined after place() is called
+       bool                    fPlaced;                ///< false until place() is called
+       double                  fX;
+       double                  fY;
+       int                             fOrientation;
+
+  public:
+
+       schema(unsigned int inputs, unsigned int outputs, double width, double height)
+               :       fInputs(inputs),
+                       fOutputs(outputs),
+                       fWidth(width),
+                       fHeight(height),
+                       fPlaced(false),
+                       fX(0),
+                       fY(0),
+                       fOrientation(0)
+       {}
+       virtual ~schema() {}
+
+       // constant fields
+       double                  width()         const           { return fWidth; }
+       double                  height()        const           { return fHeight; }
+       unsigned int    inputs()        const           { return fInputs; }
+       unsigned int    outputs()       const           { return fOutputs; }
+
+       // starts and end placement
+       void                    beginPlace (double x, double y, int orientation)
+                                                       { fX = x; fY = y; fOrientation = orientation; }
+       void                    endPlace ()                     { fPlaced = true; }
+
+       // fields available after placement
+       bool                    placed()        const           { return fPlaced; }
+       double                  x()                     const           { return fX; }
+       double                  y()                     const           { return fY; }
+       int                             orientation()   const   { return fOrientation; }
+
+
+       // abstract interface for subclasses
+       virtual void    place(double x, double y, int orientation)      = 0;
+    virtual void       draw(device& dev)                                                       = 0;
+    virtual void       collectTraits(collector& c)                                     = 0;
+    virtual point      inputPoint(unsigned int i) const                        = 0;
+       virtual point   outputPoint(unsigned int i)const                        = 0;
+};
+
+// various functions to create schemas
+
+schema* makeBlockSchema        (unsigned int inputs,
+                                                        unsigned int outputs,
+                                                        const string& name,
+                                                        const string& color,
+                                                        const string& link);
+
+schema* makeCableSchema        (unsigned int n=1);
+schema* makeInverterSchema     (const string& color);
+schema* makeCutSchema          ();
+schema* makeEnlargedSchema     (schema* s, double width);
+schema* makeParSchema          (schema* s1, schema* s2);
+schema* makeSeqSchema          (schema* s1, schema* s2);
+schema* makeMergeSchema        (schema* s1, schema* s2);
+schema* makeSplitSchema        (schema* s1, schema* s2);
+schema* makeRecSchema          (schema* s1, schema* s2);
+schema* makeTopSchema          (schema* s1, double margin, const string& text, const string& link);
+schema* makeDecorateSchema     (schema* s1, double margin, const string& text);
+
+
+
+
+
+
+
+
+
+#endif
+
+