datatypes_AMOS.cc

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 #include "datatypes_AMOS.hh"
00011 #include <sstream>
00012 using namespace AMOS;
00013 using namespace std;
00014 
00015 
00016 
00017 
00018 //================================================ Distribution_t ==============
00019 const NCode_t Distribution_t::NCODE = M_DISTRIBUTION;
00020 
00021 
00022 //----------------------------------------------------- readMessage ------------
00023 void Distribution_t::readMessage (const Message_t & msg)
00024 {
00025   clear( );
00026 
00027   try {
00028     istringstream ss;
00029 
00030     ss . str (msg . getField (F_MEAN));
00031     ss >> mean;
00032     if ( !ss )
00033       AMOS_THROW_ARGUMENT ("Invalid mean format");
00034     ss . clear( );
00035 
00036     ss . str (msg . getField (F_SD));
00037     ss >> sd;
00038     if ( !ss )
00039       AMOS_THROW_ARGUMENT ("Invalid standard deviation format");
00040     ss . clear( );
00041   }
00042   catch (ArgumentException_t) {
00043     
00044     clear( );
00045     throw;
00046   }
00047 }
00048 
00049 
00050 //--------------------------------------------------- readRecord -------------
00051 void Distribution_t::readRecord (std::istream & in)
00052 {
00053   readLE (in, &mean);
00054   readLE (in, &sd);
00055 }
00056 
00057 
00058 //----------------------------------------------------- writeMessage -----------
00059 void Distribution_t::writeMessage (Message_t & msg) const
00060 {
00061   msg . clear( );
00062 
00063   try {
00064     ostringstream ss;
00065 
00066     msg . setMessageCode (Distribution_t::getNCode( ));
00067 
00068     ss << mean;
00069     msg . setField (F_MEAN, ss . str( ));
00070     ss . str (NULL_STRING);
00071 
00072     ss << sd;
00073     msg . setField (F_SD, ss . str( ));
00074     ss . str (NULL_STRING);
00075   }
00076   catch (ArgumentException_t) {
00077 
00078     msg . clear( );
00079     throw;
00080   }
00081 }
00082 
00083 
00084 //--------------------------------------------------- writeRecord ------------
00085 void Distribution_t::writeRecord (std::ostream & out) const
00086 {
00087   writeLE (out, &mean);
00088   writeLE (out, &sd);
00089 }
00090 
00091 
00092 
00093 
00094 //================================================ Tile_t ======================
00095 const NCode_t Tile_t::NCODE = M_TILE;
00096 
00097 
00098 //----------------------------------------------------- clear ------------------
00099 void Tile_t::clear ( )
00100 {
00101   source = NULL_ID;
00102   gaps . clear( );
00103   offset = 0;
00104   range . clear( );
00105 }
00106 
00107 
00108 //----------------------------------------------------- readMessage ------------
00109 void Tile_t::readMessage (const Message_t & msg)
00110 {
00111   clear( );
00112 
00113   try {
00114     Pos_t gap;
00115     istringstream ss;
00116 
00117     if ( msg . exists (F_SOURCE) )
00118       {
00119         ss . str (msg . getField (F_SOURCE));
00120         ss >> source;
00121         if ( !ss )
00122           AMOS_THROW_ARGUMENT ("Invalid source link format");
00123         ss . clear( );
00124       }
00125 
00126     if ( msg . exists (F_OFFSET) )
00127       {
00128         ss . str (msg . getField (F_OFFSET));
00129         ss >> offset;
00130         if ( !ss )
00131           AMOS_THROW_ARGUMENT ("Invalid offset format");
00132         ss . clear( );
00133       }
00134 
00135     if ( msg . exists (F_CLEAR) )
00136       {
00137         ss . str (msg . getField (F_CLEAR));
00138         ss >> range . begin;
00139         ss . ignore( );
00140         ss >> range . end;
00141         if ( !ss )
00142           AMOS_THROW_ARGUMENT ("Invalid clear range format");
00143         ss . clear( );
00144       }
00145 
00146     if ( msg . exists (F_GAPS) )
00147       {
00148         ss . str (msg . getField (F_GAPS));
00149 
00150         while ( ss )
00151           {
00152             ss >> gap;
00153             if ( ! ss . fail( ) )
00154               gaps . push_back (gap);
00155           }
00156 
00157         if ( !ss . eof( ) )
00158           AMOS_THROW_ARGUMENT ("Invalid gaps format");
00159         ss . clear( );
00160       }
00161   }
00162   catch (ArgumentException_t) {
00163     
00164     clear( );
00165     throw;
00166   }
00167 }
00168 
00169 
00170 //----------------------------------------------------- readRecord -------------
00171 void Tile_t::readRecord (istream & in)
00172 {
00173   Size_t size;
00174 
00175   readLE (in, &size);
00176   gaps . resize (size);
00177   for ( Pos_t i = 0; i < size; i ++ )
00178     readLE (in, &(gaps [i]));
00179   readLE (in, &source);
00180   readLE (in, &offset);
00181   readLE (in, &(range . begin));
00182   readLE (in, &(range . end));
00183 }
00184 
00185 
00186 //----------------------------------------------------- writeMessage -----------
00187 void Tile_t::writeMessage (Message_t & msg) const
00188 {
00189   msg . clear( );
00190 
00191   try {
00192     vector<Pos_t>::const_iterator vi;
00193     ostringstream ss;
00194 
00195     msg . setMessageCode (Tile_t::getNCode( ));
00196 
00197     if ( source != NULL_ID )
00198       {
00199         ss << source;
00200         msg . setField (F_SOURCE, ss . str( ));
00201         ss . str (NULL_STRING);
00202       }
00203 
00204     ss << offset;
00205     msg . setField (F_OFFSET, ss . str( ));
00206     ss . str (NULL_STRING);
00207 
00208     ss << range . begin << ',' << range . end;
00209     msg . setField (F_CLEAR, ss . str( ));
00210     ss . str (NULL_STRING);
00211 
00212     if ( !gaps . empty( ) )
00213       {
00214         for ( vi = gaps . begin( ); vi != gaps . end( ); vi ++ )
00215           ss << *vi << '\n';
00216         msg . setField (F_GAPS, ss . str( ));
00217         ss . str (NULL_STRING);
00218       }
00219   }
00220   catch (ArgumentException_t) {
00221 
00222     msg . clear( );
00223     throw;
00224   }
00225 }
00226 
00227 
00228 //----------------------------------------------------- writeRecord ------------
00229 void Tile_t::writeRecord (ostream & out) const
00230 {
00231   Size_t size = gaps . size( );
00232 
00233   writeLE (out, &size);
00234   for ( Pos_t i = 0; i < size; i ++ )
00235     writeLE (out, &(gaps [i]));
00236   writeLE (out, &source);
00237   writeLE (out, &offset);
00238   writeLE (out, &(range . begin));
00239   writeLE (out, &(range . end));
00240 }
00241 
00242 
00243 
00244 
00245 //================================================ Helper Functions ============
00246 //----------------------------------------------------- operator& --------------
00247 Range_t AMOS::operator& (Range_t a, Range_t b)
00248 {
00249   if ( a . begin > a . end )
00250     {
00251       Pos_t tmp = a . begin;
00252       a . begin = a . end;
00253       a . end = tmp;
00254     }
00255 
00256   if ( b . begin > b . end )
00257     {
00258       Pos_t tmp = b . begin;
00259       b . begin = b . end;
00260       b . end = tmp;
00261     }
00262 
00263   if ( a . begin >= b . end  ||  a . end <= b . begin )
00264     return Range_t (0,0);
00265   else if ( a . begin < b . begin )
00266     return Range_t (b . begin, a . end < b . end ? a . end : b . end);
00267   else
00268     return Range_t (a . begin, a . end < b . end ? a . end : b . end);
00269 }
00270 
00271 
00272 //----------------------------------------------------- operator| --------------
00273 Range_t AMOS::operator| (Range_t a, Range_t b)
00274 {
00275   if ( a . begin > a . end )
00276     {
00277       Pos_t tmp = a . begin;
00278       a . begin = a . end;
00279       a . end = tmp;
00280     }
00281 
00282   if ( b . begin > b . end )
00283     {
00284       Pos_t tmp = b . begin;
00285       b . begin = b . end;
00286       b . end = tmp;
00287     }
00288 
00289   if ( a . begin >= b . end  ||  a . end <= b . begin )
00290     return Range_t (0,0);
00291   else
00292     return Range_t (a . begin < b . begin ? a . begin : b . begin,
00293                     a . end > b . end ? a . end : b . end);
00294 }
00295 
00296 
00297 //----------------------------------------------------- operator== -------------
00298 bool AMOS::operator== (const Range_t & a, const Range_t & b)
00299 {
00300   return ( a . begin == b . begin  &&  a . end == b . end );
00301 }
00302 bool AMOS::operator!= (const Range_t & a, const Range_t & b)
00303 {
00304   return !(a == b);
00305 }
00306 
00307 
00308 //----------------------------------------------------- operator== -------------
00309 bool AMOS::operator== (const Distribution_t & a, const Distribution_t & b)
00310 {
00311   return ( a . mean == b . mean  &&
00312            a . sd == b . sd );
00313 }
00314 bool AMOS::operator!= (const Distribution_t & a, const Distribution_t & b)
00315 {
00316   return !(a == b);
00317 }
00318 
00319 
00320 //----------------------------------------------------- operator== -------------
00321 bool AMOS::operator== (const Tile_t & a, const Tile_t & b)
00322 {
00323   return ( a . source == b . source  &&
00324            a . gaps == b . gaps  &&
00325            a . offset == b . offset  &&
00326            a . range == b . range );
00327 }
00328 bool AMOS::operator!= (const Tile_t & a, const Tile_t & b)
00329 {
00330   return !(a == b);
00331 }
00332 
00333 
00334 //----------------------------------------------------- WrapStirng -------------
00335 void AMOS::WrapString (ostream & out, const string & s, int per)
00336 {
00337   int  i, n;
00338   
00339   n = s . size ( );
00340   for  (i = 0;  i < n;  i += per)
00341     {
00342       int  j, last;
00343       
00344       last = i + per;
00345       if  (n < last)
00346         last = n;
00347       for  (j = i;  j < last;  j ++)
00348         out << s [j];
00349       out << endl;
00350     }
00351 }

Generated on Mon Feb 22 17:36:27 2010 for libAMOS by  doxygen 1.4.7