|
FAUST compiler
0.9.9.6b8
|
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
1.8.0