datastore.C

Go to the documentation of this file.
00001 
00006 #ifdef HAVE_CONFIG_H
00007 #include <tumble-conf.h>
00008 #endif /* HAVE_CONFIG_H */
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   Data access.
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 /* EXPENSIVE Function */
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    Channel swapping in the Data and Geometry Vectors
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   Printing.
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 

Generated on Mon May 24 09:53:30 2010 for TUMBLE by  doxygen 1.5.2