00001
00006 #ifdef HAVE_CONFIG_H
00007 #include <tumble-conf.h>
00008 #endif
00009
00010 #include "globals.h"
00011 #include "datastore.h"
00012
00013
00014 DataStore::DataStore(PersistantStore& store)
00015 : data_hash(store), control_points(store), data_points(store)
00016 { }
00017
00023 ControlPoint DataStore::add_cp(const Point2D &p)
00024 {
00025 control_points.push_front(p);
00026 return control_points.begin();
00027 }
00028
00033 void DataStore::rem_cp(ControlPoint cp)
00034 {
00035 control_points.erase(cp);
00036 }
00037
00044 DataPoint DataStore::add_dp(ControlPoint cp, const LinearData &d)
00045 {
00046 DataPoint dp;
00047 data_points.push_front(d);
00048 dp = data_points.begin();
00049 data_hash[cp] = dp;
00050 return dp;
00051 }
00052
00059 void DataStore::rem_dp(ControlPoint cp, DataPoint dp)
00060 {
00061 data_points.erase(dp);
00062 data_hash.erase(cp);
00063 }
00064
00065
00072 void DataStore::replace_cp(const ControlPoint& old_cp,
00073 const ControlPoint& new_cp)
00074 {
00075 Data_Hash_T::iterator data = data_hash.find(old_cp);
00076
00077 if(data != data_hash.end()){
00078 assert(!has_data(new_cp));
00079 DataPoint dp = (*data).second;
00080 data_hash.erase(data);
00081 data_hash[new_cp] = dp;
00082 }
00083 rem_cp(old_cp);
00084 }
00085
00086 void DataStore::replace_dp(const ControlPoint& cp, const LinearData &new_ld)
00087 {
00088 rem_dp(cp, get_data(cp));
00089 add_dp(cp, new_ld);
00090 }
00091
00092
00093
00094
00095 DataPoint DataStore::get_data(const ControlPoint& cp) const
00096 {
00097 Data_Hash_T::const_iterator data = data_hash.find(cp);
00098 assert(data != data_hash.end());
00099 return (*data).second;
00100 }
00101
00102 bool DataStore::has_data(const ControlPoint& cp) const
00103 {
00104 return (data_hash.count(cp) != 0);
00105 }
00106
00107 unsigned DataStore::num_control_points() const
00108 {
00109 return control_points.size();
00110 }
00111
00112 unsigned DataStore::num_data_points() const
00113 {
00114 return data_points.size();
00115 }
00116
00117 unsigned DataStore::data_length() const
00118 {
00119 return data_points.begin()->length;
00120 }
00121
00122
00123
00124
00130 void DataStore::add_channels(unsigned num_new_channels)
00131 {
00132 unsigned old_length = data_length();
00133 unsigned new_length = num_new_channels+old_length;
00134
00135 ControlPoint cp;
00136 for (cp = control_points.begin(); cp != control_points.end() ; cp++ )
00137 {
00138 DataPoint dp_old = get_data(cp);
00139 LinearData ld_new(new_length);
00140 for (unsigned i = 0; i < old_length; i++)
00141 {
00142 ld_new.set( dp_old->get(i), i);
00143 }
00144 replace_dp(cp, ld_new);
00145 }
00146 }
00147
00148
00149
00150
00151
00152
00153
00154
00155
00161 void DataStore::write_geo_into(unsigned indexX, unsigned indexY)
00162 {
00163 assert(indexX < data_length());
00164 assert(indexY < data_length());
00165
00166 ControlPoint cp;
00167 for (cp = control_points.begin(); cp != control_points.end() ; cp++ )
00168 {
00169 DataPoint dp = get_data(cp);
00170 dp->set(cp->x() , indexX);
00171 dp->set(cp->y() , indexY);
00172 }
00173 }
00174
00175
00181 void DataStore::read_geo_from(unsigned indexX, unsigned indexY)
00182 {
00183 assert(indexX < data_length());
00184 assert(indexY < data_length());
00185
00186 ControlPoint cp;
00187 DataPoint dp;
00188 for (cp = control_points.begin(); cp != control_points.end() ; cp++ )
00189 {
00190 dp = get_data(cp);
00191 cp->assign( dp->get(indexX), dp->get(indexY) );
00192 }
00193 }
00194
00200 void DataStore::swap_geo_with(unsigned indexX, unsigned indexY)
00201 {
00202 assert(indexX < data_length());
00203 assert(indexY < data_length());
00204
00205 ControlPoint cp;
00206 DataPoint dp;
00207 double tempX, tempY;
00208 for (cp = control_points.begin(); cp != control_points.end() ; cp++ )
00209 {
00210 dp = get_data(cp);
00211 tempX = cp->x();
00212 tempY = cp->y();
00213 cp->assign( dp->get(indexX), dp->get(indexY) );
00214 dp->set(tempX,indexX);
00215 dp->set(tempY,indexY);
00216 }
00217 }
00218
00219
00225 void DataStore::copy_data(unsigned indexFrom, unsigned indexTo)
00226 {
00227 assert(indexFrom < data_length());
00228 assert(indexTo < data_length());
00229
00230 for (DataPoint dp = data_points.begin(); dp != data_points.end() ; dp++ )
00231 {
00232 dp->set( dp->get(indexFrom), indexTo );
00233 }
00234 }
00235
00243 void DataStore::copy_data_2(unsigned indexAx, unsigned indexAy, unsigned indexBx, unsigned indexBy)
00244 {
00245 assert(indexAx < data_length());
00246 assert(indexAy < data_length());
00247 assert(indexBx < data_length());
00248 assert(indexBy < data_length());
00249
00250 for (DataPoint dp = data_points.begin(); dp != data_points.end() ; dp++ )
00251 {
00252 dp->set( dp->get(indexAx), indexBx );
00253 dp->set( dp->get(indexAy), indexBy );
00254 }
00255 }
00256
00262 void DataStore::swap_data(unsigned indexA, unsigned indexB)
00263 {
00264 assert(indexA < data_length());
00265 assert(indexB < data_length());
00266
00267 double temp;
00268 for (DataPoint dp = data_points.begin(); dp != data_points.end() ; dp++ )
00269 {
00270 temp = dp -> get(indexB);
00271 dp->set( dp->get(indexA), indexB );
00272 dp->set( temp, indexA );
00273 }
00274 }
00275
00283 void DataStore::swap_data_2(unsigned indexAx, unsigned indexAy, unsigned indexBx, unsigned indexBy)
00284 {
00285 assert(indexAx < data_length());
00286 assert(indexAy < data_length());
00287 assert(indexBx < data_length());
00288 assert(indexBy < data_length());
00289
00290 double tempX, tempY;
00291 for (DataPoint dp = data_points.begin(); dp != data_points.end() ; dp++ )
00292 {
00293 tempX = dp -> get(indexBx);
00294 tempY = dp -> get(indexBy);
00295 dp->set( dp->get(indexAx), indexBx );
00296 dp->set( dp->get(indexAy), indexBy );
00297 dp->set( tempX, indexAx );
00298 dp->set( tempY, indexAy );
00299 }
00300 }
00301
00302
00303
00304
00305
00306
00307
00308
00310 void DataStore::print() const
00311 {
00312 std::cout<<*this;
00313 }
00314
00316 std::ostream& operator<<(std::ostream &stream, const DataStore &ds)
00317 {
00318 stream << "DataStore: " << std::endl;
00319 stream << " ---control points: " << ds.control_points.size() << std::endl;
00320 stream << " ---data points: " << ds.data_points.size() << std::endl;
00321 stream << " ---data hash size: " << ds.data_hash.size() << std::endl;
00322 return stream;
00323 }
00324
00325