Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

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 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 //--------------------------------------------------- writeRecord ------------ 00091 void Distribution_t::writeRecord (std::ostream & out) const 00092 { 00093 writeLE (out, &mean); 00094 writeLE (out, &sd); 00095 } 00096 00097 00098 00099 00100 //================================================ Tile_t ====================== 00101 const NCode_t Tile_t::NCODE = M_TILE; 00102 00103 00104 //----------------------------------------------------- clear ------------------ 00105 void Tile_t::clear ( ) 00106 { 00107 source = NULL_ID; 00108 gaps . clear( ); 00109 offset = 0; 00110 range . clear( ); 00111 } 00112 00113 00114 //----------------------------------------------------- readMessage ------------ 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 //----------------------------------------------------- readRecord ------------- 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 //----------------------------------------------------- writeMessage ----------- 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 //----------------------------------------------------- writeRecord ------------ 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 //================================================ Helper Functions ============ 00252 //----------------------------------------------------- operator& -------------- 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 //----------------------------------------------------- operator| -------------- 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 //----------------------------------------------------- operator== ------------- 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 //----------------------------------------------------- operator== ------------- 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 //----------------------------------------------------- operator== ------------- 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 //----------------------------------------------------- WrapStirng ------------- 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 }

Generated on Tue May 17 15:19:01 2005 for libAMOS by doxygen 1.3.8