38 #ifndef IFSTREAMBINARY_OBJECT_H
39 #define IFSTREAMBINARY_OBJECT_H
132 int sm = bDataPos % CPPUtils::SSHT;
133 if (sm && bAlign) bDataPos += CPPUtils::SSHT - sm;
142 int sm = bDataPos % CPPUtils::SINT;
143 if (sm && bAlign) bDataPos += CPPUtils::SINT - sm;
152 int sm = bDataPos % CPPUtils::SDBL;
153 if (sm && bAlign) bDataPos += CPPUtils::SDBL - sm;
162 if (bDataPos + sincr > (
int)bData->size())
164 if (sincr + bData->size() > bData->capacity())
165 bData->reserve(bData->capacity() + bMemIncr);
166 bData->append(bDataPos + sincr - bData->size(),
' ');
189 static void reverseBO2(
char* d);
190 static void reverseBO4(
char* d);
191 static void reverseBO8(
char* d);
246 static bool exists(
const string& filename);
301 if (mci > 0) bMemIncr = mci;
313 void readString(
string& s);
314 void readCharArray(
string& s,
int num_chars);
315 void readCharArray(
char* array,
int num_chars);
316 void readType(
string& s);
317 void readTypeArray(
string& array,
int num_chars);
327 bool readBool(
int pos);
328 void readBoolArray(
bool* array,
int num_bools);
329 void readType(
bool& b);
330 void readTypeArray(
bool* array,
int num_bools);
340 byte readByte(
int pos);
341 void readByteArray(
byte* array,
int num_bs);
342 void readType(
byte& b);
343 void readTypeArray(
byte* array,
int num_bs);
356 short readShort(
int pos);
357 void readShortArray(
short* array,
int num_shorts);
358 void readType(
short& s);
359 void readTypeArray(
short* array,
int num_shorts);
372 int readInt(
int pos);
373 void readIntArray(
int* array,
int num_ints);
374 void readType(
int& i);
375 void readTypeArray(
int* array,
int num_ints);
389 void readLongArray(
LONG_INT* array,
int num_longs);
391 void readTypeArray(
LONG_INT* array,
int num_longs);
404 float readFloat(
int pos);
405 void readFloatArray(
float* array,
int num_floats);
406 void readType(
float& f);
407 void readTypeArray(
float* array,
int num_floats);
419 double readDoubleNC();
420 double readDouble(
int pos);
421 void readDoubleArray(
double* array,
int num_doubles);
422 void readType(
double& d);
423 void readTypeArray(
double* array,
int num_doubles);
433 void writeString(
const string& str);
434 void writeString(
const char* char_string);
435 void writeCharArray(
const char* array,
int num_chars);
436 void writeType(
const string& str);
437 void writeType(
const char* char_string);
449 void writeBool(
bool b);
450 void writeBoolNC(
bool b);
451 void writeBool(
bool b,
int pos);
452 void writeBoolArray(
const bool* array,
int num_bools);
453 void writeType(
bool b);
454 void writeTypeArray(
const bool* array,
int num_bools);
466 void writeByte(
byte b);
467 void writeByteNC(
byte b);
468 void writeByte(
byte b,
int pos);
469 void writeByteArray(
const byte* array,
int num_bytes);
470 void writeType(
byte b);
471 void writeTypeArray(
const byte* array,
int num_bytes);
484 void writeShort(
short i);
485 void writeShortNC(
short i);
486 void writeShort(
short i,
int pos);
487 void writeShortArray(
const short* array,
int num_ints);
488 void writeType(
short i);
489 void writeTypeArray(
const short* array,
int num_ints);
502 void writeInt(
int i);
503 void writeIntNC(
int i);
504 void writeInt(
int i,
int pos);
505 void writeIntArray(
const int* array,
int num_ints);
506 void writeType(
int i);
507 void writeTypeArray(
const int* array,
int num_ints);
522 void writeLong(
LONG_INT l,
int pos);
523 void writeLongArray(
const LONG_INT* array,
int num_longs);
525 void writeTypeArray(
const LONG_INT* array,
int num_longs);
538 void writeFloat(
float f);
539 void writeFloatNC(
float f);
540 void writeFloat(
float f,
int pos);
541 void writeFloatArray(
const float* array,
int num_floats);
542 void writeType(
float f);
543 void writeTypeArray(
const float* array,
int num_floats);
556 void writeDouble(
double d);
557 void writeDoubleNC(
double d);
558 void writeDouble(
double d,
int pos);
559 void writeDoubleArray(
const double* array,
int num_doubles);
560 void writeType(
double d);
561 void writeTypeArray(
const double* array,
int num_doubles);
568 return "IFStreamBinary";
601 if (bDataPos > bSize) bSize = bDataPos;
610 if (bDataPos > bSize) bSize = bDataPos;
619 if (bDataPos > bSize) bSize = bDataPos;
636 bDataPos += increment;
644 bDataPos -= decrement;
660 return (
int)bData->capacity();
669 return getPosPointer(bDataPos);
677 char* p = &(*bData)[pos];
754 inline string IFStreamBinary::readString()
764 inline void IFStreamBinary::readString(
string& s)
774 s = bData->substr(bDataPos, len);
782 inline void IFStreamBinary::readCharArray(
string& s,
int num_chars)
785 readCharArray(&s[0], num_chars);
791 inline void IFStreamBinary::readCharArray(
char* array,
int num_chars)
795 memcpy(array, &(*bData)[bDataPos], num_chars);
796 bDataPos += num_chars;
802 inline void IFStreamBinary::readType(
string& s)
810 inline void IFStreamBinary::readTypeArray(
string& s,
int num_chars)
812 readCharArray(s, num_chars);
820 inline bool IFStreamBinary::readBool()
825 bDataPos += CPPUtils::SBOL;
826 return readBool(pos);
833 inline bool IFStreamBinary::readBool(
int pos)
835 return *((
bool*) &(*bData)[pos]);
841 inline void IFStreamBinary::readBoolArray(
bool* array,
int num_bools)
845 int num_bytes = num_bools * CPPUtils::SBOL;
850 memcpy(array, &(*bData)[bDataPos], num_bytes);
851 bDataPos += num_bytes;
857 inline void IFStreamBinary::readType(
bool& b)
865 inline void IFStreamBinary::readTypeArray(
bool* array,
int num_bools)
867 readBoolArray(array, num_bools);
875 inline byte IFStreamBinary::readByte()
880 bDataPos += CPPUtils::SBYT;
881 return readByte(pos);
888 inline byte IFStreamBinary::readByte(
int pos)
890 return *((
byte*) &(*bData)[pos]);
896 inline void IFStreamBinary::readByteArray(
byte* array,
int num_bytes)
900 num_bytes *= CPPUtils::SBYT;
905 memcpy(array, &(*bData)[bDataPos], num_bytes);
906 bDataPos += num_bytes;
912 inline void IFStreamBinary::readType(
byte& b)
920 inline void IFStreamBinary::readTypeArray(
byte* array,
int num_bytes)
922 readByteArray(array, num_bytes);
930 inline short IFStreamBinary::readShort()
933 return readShortNC();
939 inline short IFStreamBinary::readShortNC()
944 bDataPos += CPPUtils::SSHT;
945 return readShort(pos);
952 inline short IFStreamBinary::readShort(
int pos)
958 s = *((
short*) &(*bData)[pos]);
960 memcpy(&s, &(*bData)[pos], 2);
962 if (bReverse) reverseBO2((
char*) &s);
969 inline void IFStreamBinary::readShortArray(
short* array,
int num_shorts)
973 int num_bytes = num_shorts * CPPUtils::SSHT;
979 memcpy(array, &(*bData)[bDataPos], num_bytes);
980 if (bReverse) reverseBO2Array(num_shorts, (
char*) array);
981 bDataPos += num_bytes;
987 inline void IFStreamBinary::readType(
short& s)
995 inline void IFStreamBinary::readTypeArray(
short* array,
int num_shorts)
997 readShortArray(array, num_shorts);
1005 inline int IFStreamBinary::readInt()
1014 inline int IFStreamBinary::readIntNC()
1019 bDataPos += CPPUtils::SINT;
1020 return readInt(pos);
1027 inline int IFStreamBinary::readInt(
int pos)
1033 i = *((
int*) &(*bData)[pos]);
1035 memcpy(&i, &(*bData)[pos], 4);
1037 if (bReverse) reverseBO4((
char*) &i);
1044 inline void IFStreamBinary::readIntArray(
int* array,
int num_ints)
1048 int num_bytes = num_ints * CPPUtils::SINT;
1054 memcpy(array, &(*bData)[bDataPos], num_bytes);
1055 if (bReverse) reverseBO4Array(num_ints, (
char*) array);
1056 bDataPos += num_bytes;
1062 inline void IFStreamBinary::readType(
int& i)
1070 inline void IFStreamBinary::readTypeArray(
int* array,
int num_ints)
1072 readIntArray(array, num_ints);
1083 return readLongNC();
1094 bDataPos += CPPUtils::SLNG;
1095 return readLong(pos);
1110 memcpy(&l, &(*bData)[pos], 8);
1112 if (bReverse) reverseBO8((
char*) &l);
1119 inline void IFStreamBinary::readLongArray(
LONG_INT* array,
int num_longs)
1123 int num_bytes = num_longs * CPPUtils::SLNG;
1129 memcpy(array, &(*bData)[bDataPos], num_bytes);
1130 if (bReverse) reverseBO8Array(num_longs, (
char*) array);
1131 bDataPos += num_bytes;
1145 inline void IFStreamBinary::readTypeArray(
LONG_INT* array,
int num_longs)
1147 readLongArray(array, num_longs);
1155 inline float IFStreamBinary::readFloat()
1158 return readFloatNC();
1164 inline float IFStreamBinary::readFloatNC()
1169 bDataPos += CPPUtils::SFLT;
1170 return readFloat(pos);
1177 inline float IFStreamBinary::readFloat(
int pos)
1183 f = *((
float*) &(*bData)[pos]);
1185 memcpy(&f, &(*bData)[pos], 4);
1187 if (bReverse) reverseBO4((
char*) &f);
1194 inline void IFStreamBinary::readFloatArray(
float* array,
int num_floats)
1198 int num_bytes = num_floats * CPPUtils::SFLT;
1204 memcpy(array, &(*bData)[bDataPos], num_bytes);
1205 if (bReverse) reverseBO4Array(num_floats, (
char*) array);
1206 bDataPos += num_bytes;
1212 inline void IFStreamBinary::readType(
float& f)
1220 inline void IFStreamBinary::readTypeArray(
float* array,
int num_floats)
1222 readFloatArray(array, num_floats);
1230 inline double IFStreamBinary::readDouble()
1233 return readDoubleNC();
1239 inline double IFStreamBinary::readDoubleNC()
1244 bDataPos += CPPUtils::SDBL;
1245 return readDouble(pos);
1252 inline double IFStreamBinary::readDouble(
int pos)
1258 d = *((
double*) &(*bData)[pos]);
1260 memcpy(&d, &(*bData)[pos], 8);
1262 if (bReverse) reverseBO8((
char*) &d);
1269 inline void IFStreamBinary::readDoubleArray(
double* array,
int num_doubles)
1273 int num_bytes = num_doubles * CPPUtils::SDBL;
1279 memcpy(array, &(*bData)[bDataPos], num_bytes);
1280 if (bReverse) reverseBO8Array(num_doubles, (
char*) array);
1281 bDataPos += num_bytes;
1287 inline void IFStreamBinary::readType(
double& d)
1295 inline void IFStreamBinary::readTypeArray(
double* array,
int num_doubles)
1297 readDoubleArray(array, num_doubles);
1308 inline void IFStreamBinary::writeString(
const string& str)
1312 int sz = (int) str.size() + CPPUtils::SINT;
1314 checkBufferSize(sz);
1318 writeIntNC((
int) str.size());
1319 memcpy(&(*bData)[bDataPos], &str[0], str.size());
1320 bDataPos += (int) str.size();
1328 inline void IFStreamBinary::writeString(
const char* char_string)
1330 string tmp_string = char_string;
1331 writeString(tmp_string);
1337 inline void IFStreamBinary::writeCharArray(
const char* array,
int num_chars)
1339 checkBufferSize(num_chars);
1343 memcpy(&(*bData)[bDataPos], array, num_chars);
1344 bDataPos += num_chars;
1353 inline void IFStreamBinary::writeType(
const string& str)
1363 inline void IFStreamBinary::writeType(
const char* char_string)
1365 writeString(char_string);
1375 inline void IFStreamBinary::writeBool(
bool b)
1377 checkBufferSize(CPPUtils::SBOL);
1387 inline void IFStreamBinary::writeBoolNC(
bool b)
1389 writeBool(b, bDataPos);
1390 bDataPos += CPPUtils::SBOL;
1398 inline void IFStreamBinary::writeBool(
bool b,
int pos)
1400 *((
bool*) &(*bData)[pos]) = b;
1406 inline void IFStreamBinary::writeBoolArray(
const bool* array,
int num_bools)
1411 num_bools *= CPPUtils::SBOL;
1412 checkBufferSize(num_bools);
1417 memcpy(&(*bData)[bDataPos], array, num_bools);
1418 bDataPos += num_bools;
1426 inline void IFStreamBinary::writeType(
bool b)
1434 inline void IFStreamBinary::writeTypeArray(
const bool* array,
int num_bools)
1436 writeBoolArray(array, num_bools);
1446 inline void IFStreamBinary::writeByte(
byte b)
1448 checkBufferSize(CPPUtils::SBYT);
1458 inline void IFStreamBinary::writeByteNC(
byte b)
1460 writeByte(b, bDataPos);
1461 bDataPos += CPPUtils::SBYT;
1469 inline void IFStreamBinary::writeByte(
byte b,
int pos)
1471 *((
byte*) &(*bData)[pos]) = b;
1477 inline void IFStreamBinary::writeByteArray(
const byte* array,
int num_bytes)
1482 num_bytes *= CPPUtils::SBYT;
1483 checkBufferSize(num_bytes);
1488 memcpy(&(*bData)[bDataPos], array, num_bytes);
1489 bDataPos += num_bytes;
1497 inline void IFStreamBinary::writeType(
byte b)
1505 inline void IFStreamBinary::writeTypeArray(
const byte* array,
int num_bytes)
1507 writeByteArray(array, num_bytes);
1517 inline void IFStreamBinary::writeShort(
short s)
1520 checkBufferSize(CPPUtils::SSHT);
1530 inline void IFStreamBinary::writeShortNC(
short s)
1532 writeShort(s, bDataPos);
1533 bDataPos += CPPUtils::SSHT;
1541 inline void IFStreamBinary::writeShort(
short s,
int pos)
1543 if (bReverse) reverseBO2((
char*) &s);
1546 *((
short*) &(*bData)[pos]) = s;
1548 memcpy(&(*bData)[pos], &s, CPPUtils::SSHT);
1554 inline void IFStreamBinary::writeShortArray(
const short* array,
int num_shorts)
1559 int num_bytes = num_shorts * CPPUtils::SSHT;
1561 checkBufferSize(num_bytes);
1566 memcpy(&(*bData)[bDataPos], array, num_bytes);
1567 if (bReverse) reverseBO2Array(num_shorts, &(*bData)[bDataPos]);
1568 bDataPos += num_bytes;
1576 inline void IFStreamBinary::writeType(
short s)
1584 inline void IFStreamBinary::writeTypeArray(
const short* array,
int num_shorts)
1586 writeShortArray(array, num_shorts);
1596 inline void IFStreamBinary::writeInt(
int i)
1599 checkBufferSize(CPPUtils::SINT);
1609 inline void IFStreamBinary::writeIntNC(
int i)
1611 writeInt(i, bDataPos);
1612 bDataPos += CPPUtils::SINT;
1620 inline void IFStreamBinary::writeInt(
int i,
int pos)
1622 if (bReverse) reverseBO4((
char*) &i);
1625 *((
int*) &(*bData)[pos]) = i;
1627 memcpy(&(*bData)[pos], &i, CPPUtils::SINT);
1633 inline void IFStreamBinary::writeIntArray(
const int* array,
int num_ints)
1638 int num_bytes = num_ints * CPPUtils::SINT;
1640 checkBufferSize(num_bytes);
1645 memcpy(&(*bData)[bDataPos], array, num_bytes);
1646 if (bReverse) reverseBO4Array(num_ints, &(*bData)[bDataPos]);
1647 bDataPos += num_bytes;
1655 inline void IFStreamBinary::writeType(
int i)
1663 inline void IFStreamBinary::writeTypeArray(
const int* array,
int num_ints)
1665 writeIntArray(array, num_ints);
1678 checkBufferSize(CPPUtils::SLNG);
1690 writeLong(l, bDataPos);
1691 bDataPos += CPPUtils::SLNG;
1699 inline void IFStreamBinary::writeLong(
LONG_INT l,
int pos)
1701 if (bReverse) reverseBO8((
char*) &l);
1706 memcpy(&(*bData)[pos], &l, CPPUtils::SLNG);
1712 inline void IFStreamBinary::writeLongArray(
const LONG_INT* array,
int num_longs)
1717 int num_bytes = num_longs * CPPUtils::SLNG;
1719 checkBufferSize(num_bytes);
1724 memcpy(&(*bData)[bDataPos], array, num_bytes);
1725 if (bReverse) reverseBO8Array(num_longs, &(*bData)[bDataPos]);
1726 bDataPos += num_bytes;
1742 inline void IFStreamBinary::writeTypeArray(
const LONG_INT* array,
int num_longs)
1744 writeLongArray(array, num_longs);
1754 inline void IFStreamBinary::writeFloat(
float f)
1757 checkBufferSize(CPPUtils::SFLT);
1767 inline void IFStreamBinary::writeFloatNC(
float f)
1769 writeFloat(f, bDataPos);
1770 bDataPos += CPPUtils::SFLT;
1778 inline void IFStreamBinary::writeFloat(
float f,
int pos)
1780 if (bReverse) reverseBO4((
char*) &f);
1783 *((
float*) &(*bData)[pos]) = f;
1785 memcpy(&(*bData)[pos], &f, CPPUtils::SFLT);
1791 inline void IFStreamBinary::writeFloatArray(
const float* array,
int num_floats)
1796 int num_bytes = num_floats * CPPUtils::SFLT;
1798 checkBufferSize(num_bytes);
1803 memcpy(&(*bData)[bDataPos], array, num_bytes);
1804 if (bReverse) reverseBO4Array(num_floats, &(*bData)[bDataPos]);
1805 bDataPos += num_bytes;
1813 inline void IFStreamBinary::writeType(
float f)
1821 inline void IFStreamBinary::writeTypeArray(
const float* array,
int num_floats)
1823 writeFloatArray(array, num_floats);
1833 inline void IFStreamBinary::writeDouble(
double d)
1836 checkBufferSize(CPPUtils::SDBL);
1846 inline void IFStreamBinary::writeDoubleNC(
double d)
1848 writeDouble(d, bDataPos);
1849 bDataPos += CPPUtils::SDBL;
1857 inline void IFStreamBinary::writeDouble(
double d,
int pos)
1859 if (bReverse) reverseBO8((
char*) &d);
1862 *((
double*) &(*bData)[pos]) = d;
1864 memcpy(&(*bData)[pos], &d, CPPUtils::SDBL);
1870 inline void IFStreamBinary::writeDoubleArray(
const double* array,
int num_doubles)
1875 int num_bytes = num_doubles * CPPUtils::SDBL;
1877 checkBufferSize(num_bytes);
1882 memcpy(&(*bData)[bDataPos], array, num_bytes);
1883 if (bReverse) reverseBO8Array(num_doubles, &(*bData)[bDataPos]);
1884 bDataPos += num_bytes;
1892 inline void IFStreamBinary::writeType(
double d)
1900 inline void IFStreamBinary::writeTypeArray(
const double* array,
int num_doubles)
1902 writeDoubleArray(array, num_doubles);
1910 inline void IFStreamBinary::reverseBO2(
char* d)
1920 inline void IFStreamBinary::reverseBO4(
char* d)
1934 inline void IFStreamBinary::reverseBO8(
char* d)
1955 #endif // IFSTREAMBINARY_OBJECT_H