00001
00007 #include "colorize.h"
00008 #include "signals.hh"
00009
00010 using namespace std;
00011
00012
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
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
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
00104 lst.insert(exp);
00105 } else {
00106
00107
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
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