00001
00002
00003
00004
00005 #ifndef GAUDIPROPERTYPARSERS_PARSERVALUETOSTREAM_H
00006 #define GAUDIPROPERTYPARSERS_PARSERVALUETOSTREAM_H 1
00007
00008
00009
00010
00011
00012 #include <iostream>
00013 #include <iomanip>
00014 #include <vector>
00015 #include <map>
00016 #include <set>
00017 #include <list>
00018 #include <string>
00019 #include <sstream>
00020
00021
00022
00023
00024 #include "GaudiKernel/Map.h"
00025 #include "GaudiKernel/HashMap.h"
00026 #include "GaudiKernel/VectorMap.h"
00027
00028
00029 namespace Gaudi
00030 {
00031 namespace Utils
00032 {
00033
00039 template<class TYPE>
00040 std::ostream& toStream ( const TYPE& obj, std::ostream& s ) ;
00041
00042
00049 inline std::ostream& toStream
00050 ( const std::string& obj , std::ostream& s )
00051 {
00052 if ( std::string::npos == obj.find('\'') )
00053 { s << "\'" << obj << "\'" ; }
00054 else
00055 { s << "\"" << obj << "\"" ; }
00056 return s ;
00057 }
00062 inline std::ostream& toStream
00063 ( const bool obj , std::ostream& s )
00064 { return s << ( obj ? "True" : "False" ) ; }
00069 inline std::ostream& toStream
00070 ( const float obj , std::ostream& s )
00071 {
00072 const int p = s.precision() ;
00073 return s << std::setprecision ( 6 ) << obj << std::setprecision ( p ) ;
00074 }
00079 inline std::ostream& toStream
00080 ( const double obj , std::ostream& s )
00081 {
00082 const int p = s.precision() ;
00083 return s << std::setprecision ( 8 ) << obj << std::setprecision ( p ) ;
00084 }
00089 inline std::ostream& toStream
00090 ( const long double obj , std::ostream& s )
00091 {
00092 const int p = s.precision() ;
00093 return s << std::setprecision ( 10 ) << obj << std::setprecision ( p ) ;
00094 }
00095
00103 template<class KTYPE, class VTYPE>
00104 inline std::ostream& toStream
00105 ( const std::pair<KTYPE,VTYPE>& obj, std::ostream& s)
00106 {
00107 s << "( " ;
00108 toStream ( obj.first , s ) ;
00109 s << " , " ;
00110 toStream ( obj.second , s ) ;
00111 return s << " )" ;
00112 }
00113
00120 template<class TYPE,class ALLOCATOR>
00121 inline std::ostream& toStream
00122 ( const std::vector<TYPE,ALLOCATOR>& obj, std::ostream& s)
00123 {
00124 s << "[ ";
00125 for ( typename std::vector<TYPE,ALLOCATOR>::const_iterator cur = obj.begin() ;
00126 obj.end() != cur ; ++cur )
00127 {
00128 if ( obj.begin() != cur ) { s << " , "; }
00129 toStream ( *cur , s ) ;
00130 }
00131 return s << " ]";
00132 }
00133
00140 template<class TYPE,class ALLOCATOR>
00141 inline std::ostream& toStream
00142 ( const std::list<TYPE,ALLOCATOR>& obj, std::ostream& s)
00143 {
00144 s << "[ ";
00145 for ( typename std::list<TYPE,ALLOCATOR>::const_iterator cur = obj.begin() ;
00146 obj.end() != cur ; ++cur )
00147 {
00148 if ( obj.begin() != cur ) { s << " , "; }
00149 toStream ( *cur , s ) ;
00150 }
00151 return s << " ]";
00152 }
00153
00160 template<class TYPE,class CMP,class ALLOCATOR>
00161 inline std::ostream& toStream
00162 ( const std::set<TYPE,CMP,ALLOCATOR>& obj, std::ostream& s)
00163 {
00164 s << "[ ";
00165 for ( typename std::set<TYPE,CMP,ALLOCATOR>::const_iterator cur = obj.begin() ;
00166 obj.end() != cur ; ++cur )
00167 {
00168 if ( obj.begin() != cur ) { s << " , "; }
00169 toStream ( *cur , s ) ;
00170 }
00171 return s << " ]";
00172 }
00173
00181 template<class KTYPE, class VTYPE,class CMP,class ALLOCATOR>
00182 inline std::ostream& toStream
00183 ( const std::map<KTYPE,VTYPE,CMP,ALLOCATOR>& obj, std::ostream& s )
00184 {
00185 s << "{ ";
00186 for ( typename std::map<KTYPE,VTYPE,CMP,ALLOCATOR>::const_iterator cur =
00187 obj.begin() ; obj.end() != cur ; ++cur )
00188 {
00189 if ( obj.begin() != cur ) { s << " , " ; }
00190 toStream ( cur -> first , s ) ;
00191 s << " : " ;
00192 toStream ( cur -> second , s ) ;
00193 }
00194 return s << " }";
00195 }
00196
00205 template<class KTYPE, class VTYPE,class CMP,class ALLOCATOR>
00206 inline std::ostream& toStream
00207 ( const GaudiUtils::VectorMap<KTYPE,VTYPE,CMP,ALLOCATOR>& obj, std::ostream& s )
00208 {
00209 s << "{ ";
00210 for ( typename GaudiUtils::VectorMap<KTYPE,VTYPE,CMP,ALLOCATOR>::const_iterator cur = obj.begin() ;
00211 obj.end() != cur ; ++cur )
00212 {
00213 if ( obj.begin() != cur ) { s << " , " ; }
00214 toStream ( cur -> first , s ) ;
00215 s << " : " ;
00216 toStream ( cur -> second , s ) ;
00217 }
00218 return s << " }";
00219 }
00220
00229 template<class KTYPE, class VTYPE,class MAP>
00230 inline std::ostream& toStream
00231 ( const GaudiUtils::Map<KTYPE,VTYPE,MAP>& obj, std::ostream& s)
00232 {
00233 s << "{ ";
00234 for ( typename GaudiUtils::Map<KTYPE,VTYPE,MAP>::const_iterator cur = obj.begin() ;
00235 obj.end() != cur ; ++cur )
00236 {
00237 if ( obj.begin() != cur ) { s << " , " ; }
00238 toStream ( cur -> first , s ) ;
00239 s << " : " ;
00240 toStream ( cur -> second , s ) ;
00241 }
00242 return s << " }";
00243 }
00244
00253 template<class KTYPE, class VTYPE,class HASH,class MAP>
00254 inline std::ostream& toStream
00255 ( const GaudiUtils::HashMap<KTYPE,VTYPE,HASH,MAP>& obj, std::ostream& s)
00256 {
00257 s << "{ ";
00258 for ( typename GaudiUtils::HashMap<KTYPE,VTYPE,HASH,MAP>::const_iterator cur = obj.begin() ;
00259 obj.end() != cur ; ++cur )
00260 {
00261 if ( obj.begin() != cur ) { s << " , " ; }
00262 toStream ( cur -> first , s ) ;
00263 s << " : " ;
00264 toStream ( cur -> second , s ) ;
00265 }
00266 return s << " }";
00267 }
00268
00269
00275 template<class TYPE>
00276 inline std::ostream& toStream ( const TYPE& obj, std::ostream& s )
00277 { return s << obj ; }
00278
00279
00287 template <class TYPE>
00288 inline std::string toString ( const TYPE& obj )
00289 {
00290 std::ostringstream s;
00291 toStream ( obj , s);
00292 return s.str();
00293 }
00294
00295 }
00296 }
00297
00298
00299
00300
00301 #endif
00302
00303