00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __utility_AMOS_HH
00011 #define __utility_AMOS_HH 1
00012
00013 #include "inttypes_AMOS.hh"
00014 #include "exceptions_AMOS.hh"
00015 #include <new>
00016 #include <cstdlib>
00017 #include <cstring>
00018 #include <iostream>
00019 #include <cassert>
00020 #include <errno.h>
00021
00022
00023 #ifdef __GNUC__
00024 #if __GNUC__ < 3
00025 #include <hash_map.h>
00026 namespace Sgi { using ::hash_map; };
00027 #define HASHMAP std
00028 #elif __GNUC__ == 3
00029 #include <ext/hash_map>
00030 #if __GNUC_MINOR__ == 0
00031 namespace Sgi = std;
00032 #define HASHMAP std
00033 #else
00034 namespace Sgi = ::__gnu_cxx;
00035 #define HASHMAP __gnu_cxx
00036 #endif
00037 #elif __GNUC__ > 3
00038 #include <ext/hash_map>
00039 namespace Sgi = ::__gnu_cxx;
00040 #define HASHMAP __gnu_cxx
00041 #endif
00042 #else // ... there are other compilers, right?
00043 namespace Sgi = std;
00044 #define HASHMAP std
00045 #endif
00046
00047
00048
00049
00050 namespace AMOS {
00051
00052
00064 inline void * SafeCalloc (size_t num, size_t size)
00065 {
00066 void * Q = calloc (num, size);
00067 if ( Q == NULL )
00068 AMOS_THROW_ALLOC ("calloc failed");
00069
00070 return Q;
00071 }
00072
00073
00074
00085 inline void * SafeMalloc (size_t size)
00086 {
00087 void * Q = malloc (size);
00088 if ( Q == NULL )
00089 AMOS_THROW_ALLOC ("malloc failed");
00090
00091 return Q;
00092 }
00093
00094
00095
00109 inline void * SafeRealloc (void * P, size_t size)
00110 {
00111 void * Q = realloc (P, size);
00112 if ( Q == NULL && size != 0 )
00113 AMOS_THROW_ALLOC ("realloc failed");
00114
00115 return Q;
00116 }
00117
00118
00119
00130 inline char * SafeStrdup (const char * str)
00131 {
00132 char * Q = strdup (str);
00133 if ( Q == NULL )
00134 AMOS_THROW_ALLOC ("strdup failed");
00135 return Q;
00136 }
00137
00138
00139
00150 char Complement (char ch);
00151
00152
00153
00164 void ReverseComplement (std::string & str);
00165
00166
00167
00178 void ReverseComplement (char * str);
00179
00180
00181
00189 void Reverse (std::string & str);
00190
00191
00192
00198 void Reverse (char * str);
00199
00200
00201
00209 inline void writeLE (std::ostream & out, const uint8_t * i)
00210 {
00211 out . put ((char)(*i));
00212 }
00213 inline void writeLE (std::ostream & out, const int8_t * i)
00214 {
00215 writeLE (out, (const uint8_t *)(i));
00216 }
00217 inline void writeLE (std::ostream & out, const BankFlags_t * i)
00218 {
00219 assert ( sizeof (BankFlags_t) == 1 );
00220 writeLE (out, (const uint8_t *)(i));
00221 }
00222
00223
00224
00232 inline void writeLE (std::ostream & out, const uint16_t * i)
00233 {
00234 union {uint16_t i; char c[sizeof (uint16_t)];} u16;
00235 u16.i = htol16 (*i);
00236 out . write (u16.c, sizeof (uint16_t));
00237 }
00238 inline void writeLE (std::ostream & out, const int16_t * i)
00239 {
00240 writeLE (out, (const uint16_t *)(i));
00241 }
00242
00243
00244
00252 inline void writeLE (std::ostream & out, const uint32_t * i)
00253 {
00254 union {uint32_t i; char c[sizeof (uint32_t)];} u32;
00255 u32.i = htol32 (*i);
00256 out . write (u32.c, sizeof (uint32_t));
00257 }
00258 inline void writeLE (std::ostream & out, const int32_t * i)
00259 {
00260 writeLE (out, (const uint32_t *)(i));
00261 }
00262
00263
00264
00272 inline void writeLE (std::ostream & out, const uint64_t * i)
00273 {
00274 union {uint64_t i; char c[sizeof (uint64_t)];} u64;
00275 u64.i = htol64 (*i);
00276 out . write (u64.c, sizeof (uint64_t));
00277 }
00278 inline void writeLE (std::ostream & out, const int64_t * i)
00279 {
00280 writeLE (out, (const uint64_t *)(i));
00281 }
00282
00283
00284
00292 inline void readLE (std::istream & in, uint8_t * i)
00293 {
00294 *i = in . get( );
00295 }
00296 inline void readLE (std::istream & in, int8_t * i)
00297 {
00298 readLE (in, (uint8_t *)(i));
00299 }
00300 inline void readLE (std::istream & in, BankFlags_t * i)
00301 {
00302 assert ( sizeof (BankFlags_t) == 1 );
00303 readLE (in, (uint8_t *)(i));
00304 }
00305
00306
00307
00315 inline void readLE (std::istream & in, uint16_t * i)
00316 {
00317 union {uint16_t i; char c[sizeof (uint16_t)];} u16;
00318 in . read (u16.c, sizeof (uint16_t));
00319 *i = ltoh16 (u16.i);
00320 }
00321 inline void readLE (std::istream & in, int16_t * i)
00322 {
00323 readLE (in, (uint16_t *)(i));
00324 }
00325
00326
00327
00335 inline void readLE (std::istream & in, uint32_t * i)
00336 {
00337 union {uint32_t i; char c[sizeof (uint32_t)];} u32;
00338 in . read (u32.c, sizeof (uint32_t));
00339 *i = ltoh32 (u32.i);
00340 }
00341 inline void readLE (std::istream & in, int32_t * i)
00342 {
00343 readLE (in, (uint32_t *)(i));
00344 }
00345
00346
00347
00355 inline void readLE (std::istream & in, uint64_t * i)
00356 {
00357 union {uint64_t i; char c[sizeof (uint64_t)];} u64;
00358 in . read (u64.c, sizeof (uint64_t));
00359 *i = ltoh64 (u64.i);
00360 }
00361 inline void readLE (std::istream & in, int64_t * i)
00362 {
00363 readLE (in, (uint64_t *)(i));
00364 }
00365
00366 }
00367
00368 #endif // #ifndef __utility_AMOS_HH