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
#else
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
#endif
00038
#else // ... there are other compilers, right?
00039
namespace Sgi = std;
00040 #define HASHMAP std
00041
#endif
00042
00043
00044
00045
00046
namespace AMOS {
00047
00048
00060 inline void *
SafeCalloc (size_t num, size_t size)
00061 {
00062
void * Q = calloc (num, size);
00063
if ( Q == NULL )
00064
AMOS_THROW_ALLOC (
"calloc failed");
00065
00066
return Q;
00067 }
00068
00069
00070
00081 inline void *
SafeMalloc (size_t size)
00082 {
00083
void * Q = malloc (size);
00084
if ( Q == NULL )
00085
AMOS_THROW_ALLOC (
"malloc failed");
00086
00087
return Q;
00088 }
00089
00090
00091
00105 inline void *
SafeRealloc (
void * P, size_t size)
00106 {
00107
void * Q = realloc (P, size);
00108
if ( Q == NULL && size != 0 )
00109
AMOS_THROW_ALLOC (
"realloc failed");
00110
00111
return Q;
00112 }
00113
00114
00115
00126 inline char *
SafeStrdup (
const char * str)
00127 {
00128
char * Q = strdup (str);
00129
if ( Q == NULL )
00130
AMOS_THROW_ALLOC (
"strdup failed");
00131
return Q;
00132 }
00133
00134
00135
00146
char Complement (
char ch);
00147
00148
00149
00160
void ReverseComplement (std::string & str);
00161
00162
00163
00174
void ReverseComplement (
char * str);
00175
00176
00177
00185
void Reverse (std::string & str);
00186
00187
00188
00194
void Reverse (
char * str);
00195
00196
00197
00205 inline void writeLE (std::ostream & out,
const uint8_t * i)
00206 {
00207 out . put ((
char)(*i));
00208 }
00209 inline void writeLE (std::ostream & out,
const int8_t * i)
00210 {
00211
writeLE (out, (
const uint8_t *)(i));
00212 }
00213 inline void writeLE (std::ostream & out,
const BankFlags_t * i)
00214 {
00215 assert (
sizeof (
BankFlags_t) == 1 );
00216
writeLE (out, (
const uint8_t *)(i));
00217 }
00218
00219
00220
00228 inline void writeLE (std::ostream & out,
const uint16_t * i)
00229 {
00230
union {uint16_t i;
char c[
sizeof (uint16_t)];} u16;
00231 u16.i =
htol16 (*i);
00232 out . write (u16.c, sizeof (uint16_t));
00233 }
00234 inline void writeLE (std::ostream & out,
const int16_t * i)
00235 {
00236
writeLE (out, (
const uint16_t *)(i));
00237 }
00238
00239
00240
00248 inline void writeLE (std::ostream & out,
const uint32_t * i)
00249 {
00250
union {uint32_t i;
char c[
sizeof (uint32_t)];} u32;
00251 u32.i =
htol32 (*i);
00252 out . write (u32.c, sizeof (uint32_t));
00253 }
00254 inline void writeLE (std::ostream & out,
const int32_t * i)
00255 {
00256
writeLE (out, (
const uint32_t *)(i));
00257 }
00258
00259
00260
00268 inline void writeLE (std::ostream & out,
const uint64_t * i)
00269 {
00270
union {uint64_t i;
char c[
sizeof (uint64_t)];} u64;
00271 u64.i =
htol64 (*i);
00272 out . write (u64.c, sizeof (uint64_t));
00273 }
00274 inline void writeLE (std::ostream & out,
const int64_t * i)
00275 {
00276
writeLE (out, (
const uint64_t *)(i));
00277 }
00278
00279
00280
00288 inline void readLE (std::istream & in, uint8_t * i)
00289 {
00290 *i = in . get( );
00291 }
00292 inline void readLE (std::istream & in, int8_t * i)
00293 {
00294
readLE (in, (uint8_t *)(i));
00295 }
00296 inline void readLE (std::istream & in,
BankFlags_t * i)
00297 {
00298 assert (
sizeof (
BankFlags_t) == 1 );
00299
readLE (in, (uint8_t *)(i));
00300 }
00301
00302
00303
00311 inline void readLE (std::istream & in, uint16_t * i)
00312 {
00313
union {uint16_t i;
char c[
sizeof (uint16_t)];} u16;
00314 in . read (u16.c, sizeof (uint16_t));
00315 *i =
ltoh16 (u16.i);
00316 }
00317 inline void readLE (std::istream & in, int16_t * i)
00318 {
00319
readLE (in, (uint16_t *)(i));
00320 }
00321
00322
00323
00331 inline void readLE (std::istream & in, uint32_t * i)
00332 {
00333
union {uint32_t i;
char c[
sizeof (uint32_t)];} u32;
00334 in . read (u32.c, sizeof (uint32_t));
00335 *i =
ltoh32 (u32.i);
00336 }
00337 inline void readLE (std::istream & in, int32_t * i)
00338 {
00339
readLE (in, (uint32_t *)(i));
00340 }
00341
00342
00343
00351 inline void readLE (std::istream & in, uint64_t * i)
00352 {
00353
union {uint64_t i;
char c[
sizeof (uint64_t)];} u64;
00354 in . read (u64.c, sizeof (uint64_t));
00355 *i =
ltoh64 (u64.i);
00356 }
00357 inline void readLE (std::istream & in, int64_t * i)
00358 {
00359
readLE (in, (uint64_t *)(i));
00360 }
00361
00362 }
00363
00364
#endif // #ifndef __utility_AMOS_HH