00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef TEUCHOS_SERIALIZATION_TRAITS_HPP
00035 #define TEUCHOS_SERIALIZATION_TRAITS_HPP
00036
00037 #include "Teuchos_ConfigDefs.hpp"
00038
00039 #ifdef HAVE_TEUCHOS_QD
00040 #include <qd/dd_real.h>
00041 #include <qd/qd_real.h>
00042 #endif
00043
00044 namespace Teuchos {
00045
00046
00047 template<typename T>
00048 struct UndefinedSerializationTraits {
00050 static inline T notDefined() {return(T::this_type_is_missing_a_specialization());}
00051 };
00052
00053
00060 template <typename Ordinal, typename T>
00061 class SerializationTraits {
00062 public:
00063
00065
00066
00068 static const bool supportsDirectSerialization = false;
00069
00071
00073
00074
00076 static Ordinal fromCountToDirectBytes(const Ordinal count) { (void)count; UndefinedSerializationTraits<T>::notDefined(); return 0; }
00077
00079 static char* convertToCharPtr( T* ptr ) { (void)ptr; UndefinedSerializationTraits<T>::notDefined(); return 0; }
00080
00082 static const char* convertToCharPtr( const T* ptr ) { (void)ptr; UndefinedSerializationTraits<T>::notDefined(); return 0; }
00083
00085 static Ordinal fromDirectBytesToCount(const Ordinal bytes) { (void)bytes; UndefinedSerializationTraits<T>::notDefined(); return 0; }
00086
00088 static T* convertFromCharPtr( char* ptr ) { (void)ptr; UndefinedSerializationTraits<T>::notDefined(); return 0; }
00089
00091 static const T* convertFromCharPtr( const char* ptr ) { (void)ptr; UndefinedSerializationTraits<T>::notDefined(); return 0; }
00092
00094
00096
00097
00099 static Ordinal fromCountToIndirectBytes(const Ordinal count) { (void)count; UndefinedSerializationTraits<T>::notDefined(); return 0; }
00100
00116 static void serialize(
00117 const Ordinal count, const T buffer[], const Ordinal bytes, char charBuffer[]
00118 )
00119 { (void)count; (void)buffer; (void)bytes; (void)charBuffer; UndefinedSerializationTraits<T>::notDefined(); }
00120
00122 static Ordinal fromIndirectBytesToCount(const Ordinal bytes) { (void)bytes; UndefinedSerializationTraits<T>::notDefined(); return 0; }
00123
00139 static void deserialize(
00140 const Ordinal bytes, const char charBuffer[], const Ordinal count, T buffer[]
00141 )
00142 { (void)bytes; (void)charBuffer; (void)count; (void)buffer;
00143 UndefinedSerializationTraits<T>::notDefined(); }
00144
00146
00147 };
00148
00149
00150 template <typename Ordinal, typename T>
00151 class DirectSerializationTraits {
00152 public:
00153 static const bool supportsDirectSerialization = true;
00154
00155 static Ordinal fromCountToDirectBytes(const Ordinal count)
00156 { return sizeof(T)*count; }
00157 static char* convertToCharPtr( T* ptr )
00158 { return reinterpret_cast<char*>(ptr); }
00159 static const char* convertToCharPtr( const T* ptr )
00160 { return reinterpret_cast<const char*>(ptr); }
00161 static Ordinal fromDirectBytesToCount(const Ordinal count)
00162 { return count/sizeof(T); }
00163 static T* convertFromCharPtr( char* ptr )
00164 { return reinterpret_cast<T*>(ptr); }
00165 static const T* convertFromCharPtr( const char* ptr )
00166 { return reinterpret_cast<const T*>(ptr); }
00167
00168 static Ordinal fromCountToIndirectBytes(const Ordinal count)
00169 { return fromCountToDirectBytes(count); }
00170 static void serialize(
00171 const Ordinal count, const T buffer[], const Ordinal bytes, char charBuffer[]
00172 )
00173 {
00174 #ifdef TEUCHOS_DEBUG
00175 TEST_FOR_EXCEPT(bytes!=fromCountToIndirectBytes(count));
00176 #endif
00177 const char *_buffer = convertToCharPtr(buffer);
00178 std::copy(_buffer,_buffer+bytes,charBuffer);
00179 }
00180 static Ordinal fromIndirectBytesToCount(const Ordinal bytes)
00181 { return fromDirectBytesToCount(bytes); }
00182 static void deserialize(
00183 const Ordinal bytes, const char charBuffer[], const Ordinal count, T buffer[]
00184 )
00185 {
00186 #ifdef TEUCHOS_DEBUG
00187 TEST_FOR_EXCEPT(count!=fromIndirectBytesToCount(bytes));
00188 #endif
00189 char *_buffer = convertToCharPtr(buffer);
00190 std::copy(charBuffer,charBuffer+bytes,_buffer);
00191 }
00192 };
00193
00194 template<typename Ordinal>
00195 class SerializationTraits<Ordinal,char>
00196 : public DirectSerializationTraits<Ordinal,char>
00197 {};
00198
00199 template<typename Ordinal>
00200 class SerializationTraits<Ordinal,short int>
00201 : public DirectSerializationTraits<Ordinal,short int>
00202 {};
00203
00204 template<typename Ordinal>
00205 class SerializationTraits<Ordinal,int>
00206 : public DirectSerializationTraits<Ordinal,int>
00207 {};
00208
00209 template<typename Ordinal>
00210 class SerializationTraits<Ordinal,unsigned int>
00211 : public DirectSerializationTraits<Ordinal,unsigned int>
00212 {};
00213
00214 template<typename Ordinal>
00215 class SerializationTraits<Ordinal,long int>
00216 : public DirectSerializationTraits<Ordinal,long int>
00217 {};
00218
00219 template<typename Ordinal>
00220 class SerializationTraits<Ordinal,long unsigned int>
00221 : public DirectSerializationTraits<Ordinal,long unsigned int>
00222 {};
00223
00224 template<typename Ordinal>
00225 class SerializationTraits<Ordinal,float>
00226 : public DirectSerializationTraits<Ordinal,float>
00227 {};
00228
00229 template<typename Ordinal>
00230 class SerializationTraits<Ordinal,double>
00231 : public DirectSerializationTraits<Ordinal,double>
00232 {};
00233
00234 template<typename Ordinal, typename P1, typename P2>
00235 class SerializationTraits<Ordinal,std::pair<P1,P2> >
00236 : public DirectSerializationTraits<Ordinal,std::pair<P1,P2> >
00237 {};
00238
00239 #ifdef HAVE_TEUCHOS_QD
00240 template<typename Ordinal>
00241 class SerializationTraits<Ordinal,dd_real>
00242 : public DirectSerializationTraits<Ordinal,dd_real>
00243 {};
00244
00245 template<typename Ordinal>
00246 class SerializationTraits<Ordinal,qd_real>
00247 : public DirectSerializationTraits<Ordinal,qd_real>
00248 {};
00249 #endif
00250
00251 #ifdef HAVE_TEUCHOS_COMPLEX
00252
00253 template<typename Ordinal>
00254 class SerializationTraits<Ordinal,std::complex<float> >
00255 : public DirectSerializationTraits<Ordinal,std::complex<float> >
00256 {};
00257
00258 template<typename Ordinal>
00259 class SerializationTraits<Ordinal,std::complex<double> >
00260 : public DirectSerializationTraits<Ordinal,std::complex<double> >
00261 {};
00262
00263 #endif // HAVE_TEUCHOS_COMPLEX
00264
00265 #ifdef HAVE_TEUCHOS_LONG_LONG_INT
00266
00267 template<typename Ordinal>
00268 class SerializationTraits<Ordinal, long long int>
00269 : public DirectSerializationTraits<Ordinal, long long int>
00270 {};
00271
00272 #endif // HAVE_TEUCHOS_LONG_LONG_INT
00273
00274 }
00275
00276 #endif // TEUCHOS_SERIALIZATION_TRAITS_HPP