28#if BINIO_ENABLE_STRING
30#define STRINGBUFSIZE 256
47 if (endian_test.byte != 1) f |= BigEndian;
53 if (
sizeof(
float) == 4 &&
sizeof(double) == 8) {
55 if (dat[0] == 0x40 && dat[1] == 0xD0 && !dat[2] && !dat[3])
58 if (dat[3] == 0x40 && dat[2] == 0xD0 && !dat[1] && !dat[0])
69 "IEEE floating-point numbers are not supported on "
74 this->
setFlag(binio::BigEndian,
false);
75 this->
setFlag(binio::FloatIEEE);
102 if (size >
sizeof(
Int)) {
105 "The size of the integer to be read exceeds our system's biggest type");
109 for (i = 0; i < size; i++) {
123 unsigned int size = 0;
140 if (!swap && ((size ==
sizeof(
float)) || (size ==
sizeof(
double)))) {
153 for (i = 0; i < size; i++)
164 return *(
double *)in;
172 auto *val =
reinterpret_cast<uint64_t *
>(
d);
174 *val = ((((*val) >> 56) & 0x00000000000000FF) |
175 (((*val) >> 40) & 0x000000000000FF00) |
176 (((*val) >> 24) & 0x0000000000FF0000) |
177 (((*val) >> 8) & 0x00000000FF000000) |
178 (((*val) << 8) & 0x000000FF00000000) |
179 (((*val) << 24) & 0x0000FF0000000000) |
180 (((*val) << 40) & 0x00FF000000000000) |
181 (((*val) << 56) & 0xFF00000000000000));
185 getRaw((
char *)
d,
sizeof(
double) * size);
189 for (
double *dptr =
d; dptr <
d + size; dptr++)
swap_endian(dptr);
195 for (i = 0; i < maxlen; i++) {
207 unsigned long maxlen,
211 for (i = 0; i < maxlen; i++) {
213 if (str[i] == delim ||
err) {
223#if BINIO_ENABLE_STRING
225 char buf[STRINGBUFSIZE + 1];
231 tempstr.append(buf, read);
232 }
while (read == STRINGBUFSIZE);
240 if (!
err)
seek(-(
long)size, Add);
247 if (!
err)
switch (ft) {
272 for (i = 0; i < amount; i++)
getByte();
281 if (size >
sizeof(
Int)) {
284 "The size of the integer to be stored exceeds our system's biggest type");
288 for (i = 0; i < size; i++) {
290 putByte((
unsigned char)(val >> ((size - i - 1) * 8)) & 0xff);
292 putByte((
unsigned char)val & 0xff);
300 unsigned int size = 0;
304 auto outf = (float)f;
305 auto outd = (double)f;
319 if (!swap && ((size ==
sizeof(
float)) || (size ==
sizeof(
double)))) {
321 putRaw((
char *)&outf, size);
325 putRaw((
char *)&outd, size);
339 if (swap) out += size - 1;
340 for (i = 0; i < size; i++) {
354 if (!amount) amount = strlen(str);
356 for (i = 0; i < amount; i++) {
364#if BINIO_ENABLE_STRING
void swap_endian(double *d)
void setFlag(Flag f, bool set=true)
virtual void seek(long, Offset=Set)=0
static Flags detect_system_flags()
static const Flags system_flags
enum { BigEndian=1<< 0, FloatIEEE=1<< 1 } Flag
enum { Single, Double } FType
unsigned long readString(char *str, unsigned long amount)
Float peekFloat(FType ft)
void ignore(unsigned long amount=1)
Int readInt(unsigned int size)
virtual void getRaw(char *c, std::streamsize n)=0
Int peekInt(unsigned int size)
Float readFloat(FType ft)
void readDoubleArray(double *d, unsigned long size)
void writeInt(Int val, unsigned int size)
virtual void putRaw(const char *c, std::streamsize n)=0
virtual void putByte(Byte)=0
unsigned long writeString(const char *str, unsigned long amount=0)
void writeFloat(Float f, FType ft)
Helper macros for debugging.
#define ARTS_USER_ERROR(...)