FAUST compiler  0.9.9.6b8
colorize.cpp
Go to the documentation of this file.
00001 
00007 #include "colorize.h"
00008 #include "signals.hh"
00009 
00010 using namespace std; 
00011 
00012 // static funvtions needed to implement splitDependance
00013 
00014 static int allocateColor(Tree exp);                         
00015 static void colorize(Tree exp, int color);                  
00016 static void uncolorize(Tree exp);                           
00017 static void listMultiColoredExp(Tree exp, set<Tree>& lst);  
00018 
00019 
00020 
00028 void splitDependance(const set<Tree>& exps, set<Tree>& post, set<Tree>& pre)
00029 {
00030     set<Tree>::const_iterator e;
00031     for (e= exps.begin(); e != exps.end(); e++) {
00032         colorize(*e, allocateColor(*e));
00033     }
00034     
00035     pre.clear();
00036     for (e = exps.begin(); e != exps.end(); e++) {
00037         listMultiColoredExp(*e, pre);
00038     }
00039     
00040     post.clear();
00041     set_difference(exps.begin(), exps.end(), pre.begin(), pre.end(), inserter(post, post.begin()));
00042     
00043     for (e = exps.begin(); e != exps.end(); e++) {
00044         uncolorize(*e);
00045     }
00046 }
00047 
00048 //------------------------------------------- IMPLEMENTATION  (level 1)-----------------------------------------------------
00049 
00050 static void addColor(Tree exp, int color);                  
00051 static bool hasColor(Tree exp, int color);                  
00052 static int colorsCount(Tree exp);                           
00053 static void clearColors(Tree exp);                          
00054 
00059 int allocateColor(Tree exp)
00060 {
00061 //  return int(exp); 
00062     static map<Tree,int> colorMap;
00063     static int nextFreeColor = 1;
00064     int& color = colorMap[exp];
00065     if (!color)
00066         color = nextFreeColor++;
00067     return color;
00068 }
00069 
00073 void colorize(Tree exp, int color)
00074 {
00075     if (! hasColor(exp, color)) {
00076         addColor(exp, color);
00077         vector<Tree> v;
00078         int n = getSubSignals(exp, v, false);
00079         for (int i=0; i<n; i++) colorize(v[i], color);
00080     }   
00081 }
00082 
00086 void uncolorize(Tree exp)
00087 {
00088     if (colorsCount(exp) > 0) {
00089         clearColors(exp);
00090         vector<Tree> v;
00091         int n = getSubSignals(exp, v, false);
00092         for (int i=0; i<n; i++) uncolorize(v[i]);
00093     }   
00094 }
00095 
00099 void listMultiColoredExp(Tree exp, set<Tree>& lst)
00100 {
00101     assert(colorsCount(exp) > 0);
00102     if (colorsCount(exp) > 1) {
00103         // we have found a multicolored expression
00104         lst.insert(exp);
00105     } else {
00106         // it is a monocolored expression
00107         // we search its subexpressions
00108         vector<Tree> v;
00109         int n = getSubSignals(exp, v, false);
00110         for (int i=0; i<n; i++) {
00111             listMultiColoredExp(v[i], lst);
00112         }
00113     }   
00114 }
00115 
00116 //------------------------------------------- IMPLEMENTATION  (level 2)-----------------------------------------------------
00117 
00118 Tree COLORPROPERTY = tree(symbol("ColorProperty"));
00119 
00125 void setColorProperty(Tree sig, set<int>* colorset)
00126 {
00127     setProperty(sig, COLORPROPERTY, tree((void*)colorset));
00128 }
00129 
00130 
00135 set<int>* getColorProperty(Tree sig)
00136 {
00137     Tree tt;
00138     if (!getProperty(sig, COLORPROPERTY, tt)) {
00139         return 0;
00140     } else {
00141         return (set<int>*)tree2ptr(tt);
00142     }
00143 }
00144 
00145 
00146 
00147 
00154 void addColor(Tree exp, int color)
00155 {
00156     set<int>* cset = getColorProperty(exp);
00157     if (cset == 0) {
00158         cset = new set<int>();
00159         setColorProperty(exp, cset);
00160     }
00161     cset->insert(color);
00162 }
00163 
00164 
00171 bool hasColor(Tree exp, int color)
00172 {
00173     set<int>* cset = getColorProperty(exp);
00174     if (cset==0) {
00175         return false;
00176     } else {
00177         return cset->find(color) != cset->end();
00178     }
00179 }
00180 
00181 
00187 static int colorsCount(Tree exp)
00188 {
00189     set<int>* cset = getColorProperty(exp);
00190     if (cset==0) {
00191         return 0;
00192     } else {
00193         return cset->size();
00194     }
00195 }
00196 
00197 
00203 static void clearColors(Tree exp)
00204 {
00205     set<int>* cset = getColorProperty(exp);
00206     if (cset != 0) {
00207         cset->clear();
00208     }
00209 }
00210 
00211