00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00028 #include <coconut_config.h>
00029 #include <semantics_delta.h>
00030 #include <add_algo>
00031
00032 namespace coco {
00033
00034 semantics_delta::semantics_delta(const std::vector<unsigned int>& __i,
00035 const std::vector<uint32_t>& __b)
00036 : delta_base("change semantics"), indices(__i), new_f_sem(__b)
00037 { std::pair_sort(indices.begin(), indices.end(), new_f_sem.begin(),
00038 new_f_sem.end()); }
00039
00040 bool semantics_delta::search(unsigned int _i,
00041 std::vector<unsigned int>::iterator& _xs)
00042 {
00043 _xs = std::lower_bound(indices.begin(), indices.end(), _i);
00044 return _xs != indices.end() && *_xs == _i;
00045 }
00046
00047 void semantics_delta::set(const std::vector<unsigned int>& _i,
00048 const std::vector<semantics>& _s)
00049 {
00050 std::vector<unsigned int>::const_iterator _xi, _ei(_i.end());
00051 std::vector<semantics>::const_iterator _xs, _es(_s.end());
00052 for(_xi = _i.begin(), _xs = _s.begin(); _xi != _ei && _xs != _es;
00053 ++_xi, ++_xs)
00054 set(*_xi, *_xs);
00055 }
00056
00057 void semantics_delta::set(const std::vector<unsigned int>& _i,
00058 const std::vector<uint32_t>& _s)
00059 {
00060 indices = _i;
00061 new_f_sem = _s;
00062 std::pair_sort(indices.begin(), indices.end(),
00063 new_f_sem.begin(), new_f_sem.end());
00064 }
00065
00066 void semantics_delta::set_convex(const std::vector<unsigned int>& _i,
00067 const std::vector<convex_e>& _s)
00068 {
00069 std::vector<unsigned int>::const_iterator _xi, _ei(_i.end());
00070 std::vector<convex_e>::const_iterator _xs, _es(_s.end());
00071 for(_xi = _i.begin(), _xs = _s.begin(); _xi != _ei && _xs != _es;
00072 ++_xi, ++_xs)
00073 set_convex(*_xi, *_xs);
00074 }
00075
00076 void semantics_delta::set_activity(const std::vector<unsigned int>& _i,
00077 const std::vector<activity_descr>& _s)
00078 {
00079 std::vector<unsigned int>::const_iterator _xi, _ei(_i.end());
00080 std::vector<activity_descr>::const_iterator _xs, _es(_s.end());
00081 for(_xi = _i.begin(), _xs = _s.begin(); _xi != _ei && _xs != _es;
00082 ++_xi, ++_xs)
00083 set_activity(*_xi, *_xs);
00084 }
00085
00086 void semantics_delta::set_separable(const std::vector<unsigned int>& _i,
00087 const std::vector<tristate>& _s)
00088 {
00089 std::vector<unsigned int>::const_iterator _xi, _ei(_i.end());
00090 std::vector<tristate>::const_iterator _xs, _es(_s.end());
00091 for(_xi = _i.begin(), _xs = _s.begin(); _xi != _ei && _xs != _es;
00092 ++_xi, ++_xs)
00093 set_separable(*_xi, *_xs);
00094 }
00095
00096 void semantics_delta::set_integer(const std::vector<unsigned int>& _i,
00097 const std::vector<bool>& _s)
00098 {
00099 std::vector<unsigned int>::const_iterator _xi, _ei(_i.end());
00100 std::vector<bool>::const_iterator _xs, _es(_s.end());
00101 for(_xi = _i.begin(), _xs = _s.begin(); _xi != _ei && _xs != _es;
00102 ++_xi, ++_xs)
00103 set_integer(*_xi, *_xs);
00104 }
00105
00106 void semantics_delta::set_hard(const std::vector<unsigned int>& _i,
00107 const std::vector<bool>& _s)
00108 {
00109 std::vector<unsigned int>::const_iterator _xi, _ei(_i.end());
00110 std::vector<bool>::const_iterator _xs, _es(_s.end());
00111 for(_xi = _i.begin(), _xs = _s.begin(); _xi != _ei && _xs != _es;
00112 ++_xi, ++_xs)
00113 set_hard(*_xi, *_xs);
00114 }
00115
00116 void semantics_delta::set_type(const std::vector<unsigned int>& _i,
00117 const std::vector<type_annotation>& _s)
00118 {
00119 std::vector<unsigned int>::const_iterator _xi, _ei(_i.end());
00120 std::vector<type_annotation>::const_iterator _xs, _es(_s.end());
00121 for(_xi = _i.begin(), _xs = _s.begin(); _xi != _ei && _xs != _es;
00122 ++_xi, ++_xs)
00123 set_type(*_xi, *_xs);
00124 }
00125
00126 void semantics_delta::set(unsigned int _i, const semantics& s)
00127 {
00128 std::vector<unsigned int>::iterator _xs;
00129 if(search(_i, _xs))
00130 new_f_sem[_xs - indices.begin()] = encode(s);
00131 else
00132 {
00133 new_f_sem.insert(new_f_sem.begin() + (_xs - indices.begin()), encode(s));
00134 indices.insert(_xs, _i);
00135 }
00136 }
00137
00138 void semantics_delta::set_convex(unsigned int _i, const convex_e& c)
00139 {
00140 std::vector<unsigned int>::iterator _xs;
00141 if(search(_i, _xs))
00142 new_f_sem[_xs - indices.begin()] =
00143 encode_convex(new_f_sem[_xs - indices.begin()], c);
00144 else
00145 {
00146 new_f_sem.insert(new_f_sem.begin() + (_xs - indices.begin()),
00147 encode_convex(0, c));
00148 indices.insert(_xs, _i);
00149 }
00150 }
00151
00152 void semantics_delta::set_activity(unsigned int _i, const activity_descr& a)
00153 {
00154 std::vector<unsigned int>::iterator _xs;
00155 if(search(_i, _xs))
00156 new_f_sem[_xs - indices.begin()] =
00157 encode_activity(new_f_sem[_xs - indices.begin()], a);
00158 else
00159 {
00160 new_f_sem.insert(new_f_sem.begin() + (_xs - indices.begin()),
00161 encode_activity(0, a));
00162 indices.insert(_xs, _i);
00163 }
00164 }
00165
00166 void semantics_delta::set_separable(unsigned int _i, const tristate& t)
00167 {
00168 std::vector<unsigned int>::iterator _xs;
00169 if(search(_i, _xs))
00170 new_f_sem[_xs - indices.begin()] =
00171 encode_separable(new_f_sem[_xs - indices.begin()], t);
00172 else
00173 {
00174 new_f_sem.insert(new_f_sem.begin() + (_xs - indices.begin()),
00175 encode_separable(0, t));
00176 indices.insert(_xs, _i);
00177 }
00178 }
00179
00180 void semantics_delta::set_integer(unsigned int _i, bool b)
00181 {
00182 std::vector<unsigned int>::iterator _xs;
00183 if(search(_i, _xs))
00184 new_f_sem[_xs - indices.begin()] =
00185 encode_integer(new_f_sem[_xs - indices.begin()], b);
00186 else
00187 {
00188 new_f_sem.insert(new_f_sem.begin() + (_xs - indices.begin()),
00189 encode_integer(0, b));
00190 indices.insert(_xs, _i);
00191 }
00192 }
00193
00194 void semantics_delta::set_hard(unsigned int _i, bool b)
00195 {
00196 std::vector<unsigned int>::iterator _xs;
00197 if(search(_i, _xs))
00198 new_f_sem[_xs - indices.begin()] =
00199 encode_hard(new_f_sem[_xs - indices.begin()], b);
00200 else
00201 {
00202 new_f_sem.insert(new_f_sem.begin() + (_xs - indices.begin()),
00203 encode_hard(0, b));
00204 indices.insert(_xs, _i);
00205 }
00206 }
00207
00208 void semantics_delta::set_type(unsigned int _i, const type_annotation& a)
00209 {
00210 std::vector<unsigned int>::iterator _xs;
00211 if(search(_i, _xs))
00212 new_f_sem[_xs - indices.begin()] =
00213 encode_type(new_f_sem[_xs - indices.begin()], a);
00214 else
00215 {
00216 new_f_sem.insert(new_f_sem.begin() + (_xs - indices.begin()),
00217 encode_type(0, a));
00218 indices.insert(_xs, _i);
00219 }
00220 }
00221
00222 bool semantics_delta::apply(work_node& _x, undelta_base*& _u,
00223 const delta_id& _did) const
00224 {
00225 std::vector<uint32_t> _vs;
00226 model* __mod = _x.get_model_ptr();
00227 std::vector<uint32_t>::const_iterator _xs, _es(new_f_sem.end());
00228
00229 if(indices.empty())
00230 {
00231 unsigned int n(__mod->number_of_nodes()), i;
00232 _vs.reserve(n);
00233 for(i = 0, _xs = new_f_sem.begin(); i < n && _xs != _es; ++i, ++_xs)
00234 {
00235 _vs.push_back(encode(__mod->node(i)->sem));
00236 decode(*_xs, __mod->node(i)->sem);
00237 }
00238 }
00239 else
00240 {
00241 std::vector<unsigned int>::const_iterator _c;
00242 _vs.reserve(new_f_sem.size());
00243 for(_c = indices.begin(), _xs = new_f_sem.begin(); _xs != _es; ++_c, ++_xs)
00244 {
00245 _vs.push_back(encode(__mod->node(*_c)->sem));
00246 decode(*_xs, __mod->node(*_c)->sem);
00247 }
00248 }
00249 _u = (undelta_base *) new semantics_undelta(indices, _vs);
00250 return true;
00251 }
00252
00253 bool semantics_undelta::unapply(work_node& _x, const delta_id& _did) const
00254 {
00255 model* __mod = _x.get_model_ptr();
00256 std::vector<uint32_t>::const_iterator _xs, _es(old_f_sem.end());
00257
00258 if(indices.empty())
00259 {
00260 unsigned int n(__mod->number_of_nodes()), i;
00261 for(i = 0, _xs = old_f_sem.begin(); i < n && _xs != _es; ++i, ++_xs)
00262 ((semantics_delta*)this)->decode(*_xs, __mod->node(i)->sem);
00263 }
00264 else
00265 {
00266 std::vector<unsigned int>::const_iterator _c;
00267 for(_c = indices.begin(), _xs = old_f_sem.begin(); _xs != _es; ++_c, ++_xs)
00268 ((semantics_delta*)this)->decode(*_xs, __mod->node(*_c)->sem);
00269 }
00270 return true;
00271 }
00272
00273 }