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