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
00019 const NCode_t Distribution_t::NCODE = M_DISTRIBUTION;
00020
00021
00022
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
00051 void Distribution_t::readRecord (std::istream & in)
00052 {
00053 readLE (in, &mean);
00054 readLE (in, &sd);
00055 }
00056
00057
00058
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
00085 void Distribution_t::writeRecord (std::ostream & out) const
00086 {
00087 writeLE (out, &mean);
00088 writeLE (out, &sd);
00089 }
00090
00091
00092
00093
00094
00095 const NCode_t Tile_t::NCODE = M_TILE;
00096
00097
00098
00099 void Tile_t::clear ( )
00100 {
00101 source = NULL_ID;
00102 gaps . clear( );
00103 offset = 0;
00104 range . clear( );
00105 }
00106
00107
00108
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
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
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
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
00246
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
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
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
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
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
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 }