36 #ifndef IFSTREAMBINARY_OBJECT_H
37 #define IFSTREAMBINARY_OBJECT_H
129 int sm = bDataPos % CPPUtils::SSHT;
130 if (sm && bAlign) bDataPos += CPPUtils::SSHT - sm;
139 int sm = bDataPos % CPPUtils::SINT;
140 if (sm && bAlign) bDataPos += CPPUtils::SINT - sm;
149 int sm = bDataPos % CPPUtils::SDBL;
150 if (sm && bAlign) bDataPos += CPPUtils::SDBL - sm;
157 void checkBufferSize(
int sincr)
159 if (bDataPos + sincr > (
int) bData->size())
161 if (sincr + bData->size() > bData->capacity())
162 bData->reserve(bData->capacity() + bMemIncr);
163 bData->append(bDataPos + sincr - bData->size(),
' ');
171 static void reverseBOArray(
int n,
char* a,
int s);
178 static void reverseBO2Array(
int n,
char* a);
179 static void reverseBO4Array(
int n,
char* a);
180 static void reverseBO8Array(
int n,
char* a);
186 static void reverseBO2(
char* d);
187 static void reverseBO4(
char* d);
188 static void reverseBO8(
char* d);
243 static bool exists(
const string& filename);
248 void writeToFile(
const string& filename);
253 void writeToFile(ofstream& ofs);
258 void readFromFile(
const string& filename);
263 void readFromFile(
const string& filename,
int num_bytes);
275 void readFromFile(ifstream& ifs,
int num_bytes);
296 void setMemoryCapacityIncrement(
int mci)
298 if (mci > 0) bMemIncr = mci;
310 void readString(
string& s);
311 void readCharArray(
string& s,
int num_chars);
312 void readCharArray(
char* array,
int num_chars);
313 void readType(
string& s);
314 void readTypeArray(
string& array,
int num_chars);
324 bool readBool(
int pos);
325 void readBoolArray(
bool* array,
int num_bools);
326 void readType(
bool& b);
327 void readTypeArray(
bool* array,
int num_bools);
337 byte readByte(
int pos);
338 void readByteArray(
byte* array,
int num_bs);
339 void readType(
byte& b);
340 void readTypeArray(
byte* array,
int num_bs);
353 short readShort(
int pos);
354 void readShortArray(
short* array,
int num_shorts);
355 void readType(
short& s);
356 void readTypeArray(
short* array,
int num_shorts);
369 int readInt(
int pos);
370 void readIntArray(
int* array,
int num_ints);
371 void readType(
int& i);
372 void readTypeArray(
int* array,
int num_ints);
386 void readLongArray(
LONG_INT* array,
int num_longs);
388 void readTypeArray(
LONG_INT* array,
int num_longs);
401 float readFloat(
int pos);
402 void readFloatArray(
float* array,
int num_floats);
403 void readType(
float& f);
404 void readTypeArray(
float* array,
int num_floats);
416 double readDoubleNC();
417 double readDouble(
int pos);
418 void readDoubleArray(
double* array,
int num_doubles);
419 void readType(
double& d);
420 void readTypeArray(
double* array,
int num_doubles);
430 void writeString(
const string& str);
431 void writeString(
const char* char_string);
432 void writeCharArray(
const char* array,
int num_chars);
433 void writeType(
const string& str);
434 void writeType(
const char* char_string);
446 void writeBool(
bool b);
447 void writeBoolNC(
bool b);
448 void writeBool(
bool b,
int pos);
449 void writeBoolArray(
const bool* array,
int num_bools);
450 void writeType(
bool b);
451 void writeTypeArray(
const bool* array,
int num_bools);
463 void writeByte(
byte b);
464 void writeByteNC(
byte b);
465 void writeByte(
byte b,
int pos);
466 void writeByteArray(
const byte* array,
int num_bytes);
467 void writeType(
byte b);
468 void writeTypeArray(
const byte* array,
int num_bytes);
481 void writeShort(
short i);
482 void writeShortNC(
short i);
483 void writeShort(
short i,
int pos);
484 void writeShortArray(
const short* array,
int num_ints);
485 void writeType(
short i);
486 void writeTypeArray(
const short* array,
int num_ints);
499 void writeInt(
int i);
500 void writeIntNC(
int i);
501 void writeInt(
int i,
int pos);
502 void writeIntArray(
const int* array,
int num_ints);
503 void writeType(
int i);
504 void writeTypeArray(
const int* array,
int num_ints);
519 void writeLong(
LONG_INT l,
int pos);
520 void writeLongArray(
const LONG_INT* array,
int num_longs);
522 void writeTypeArray(
const LONG_INT* array,
int num_longs);
535 void writeFloat(
float f);
536 void writeFloatNC(
float f);
537 void writeFloat(
float f,
int pos);
538 void writeFloatArray(
const float* array,
int num_floats);
539 void writeType(
float f);
540 void writeTypeArray(
const float* array,
int num_floats);
553 void writeDouble(
double d);
554 void writeDoubleNC(
double d);
555 void writeDouble(
double d,
int pos);
556 void writeDoubleArray(
const double* array,
int num_doubles);
557 void writeType(
double d);
558 void writeTypeArray(
const double* array,
int num_doubles);
563 static string className()
564 {
return "IFStreamBinary"; }
569 static int classSize()
577 { bData->resize(spc); }
582 void reserve(
int sze)
583 { bData->reserve(sze); }
590 if (bDataPos > bSize) bSize = bDataPos;
599 if (bDataPos > bSize) bSize = bDataPos;
608 if (bDataPos > bSize) bSize = bDataPos;
621 void incrementPos(
int increment = 1)
622 { bDataPos += increment; }
627 void decrementPos(
int decrement = 1)
628 { bDataPos -= decrement; }
633 const string& getData()
const
639 int getCapacity()
const
640 {
return (
int) bData->capacity(); }
646 char* getPosPointer()
652 char* getPosPointer(
int pos)
654 char* p = &(*bData)[pos];
661 void setByteOrderReverse(
bool bor)
667 void byteOrderReverseOn()
673 void byteOrderReverseOff()
674 { bReverse =
false; }
680 bool isByteOrderReversalOn()
const
686 void setBoundaryAlignment(
bool align)
692 void boundaryAlignmentOn()
698 void boundaryAlignmentOff()
705 bool isBoundaryAlignmentOn()
const
715 inline string IFStreamBinary::readString()
725 inline void IFStreamBinary::readString(
string& s)
735 s = bData->substr(bDataPos, len);
743 inline void IFStreamBinary::readCharArray(
string& s,
int num_chars)
746 readCharArray(&s[0], num_chars);
752 inline void IFStreamBinary::readCharArray(
char* array,
int num_chars)
756 memcpy(array, &(*bData)[bDataPos], num_chars);
757 bDataPos += num_chars;
763 inline void IFStreamBinary::readType(
string& s)
771 inline void IFStreamBinary::readTypeArray(
string& s,
int num_chars)
773 readCharArray(s, num_chars);
781 inline bool IFStreamBinary::readBool()
786 bDataPos += CPPUtils::SBOL;
787 return readBool(pos);
794 inline bool IFStreamBinary::readBool(
int pos)
796 return *((
bool*) &(*bData)[pos]);
802 inline void IFStreamBinary::readBoolArray(
bool* array,
int num_bools)
806 int num_bytes = num_bools * CPPUtils::SBOL;
811 memcpy(array, &(*bData)[bDataPos], num_bytes);
812 bDataPos += num_bytes;
818 inline void IFStreamBinary::readType(
bool& b)
826 inline void IFStreamBinary::readTypeArray(
bool* array,
int num_bools)
828 readBoolArray(array, num_bools);
836 inline byte IFStreamBinary::readByte()
841 bDataPos += CPPUtils::SBYT;
842 return readByte(pos);
849 inline byte IFStreamBinary::readByte(
int pos)
851 return *((
byte*) &(*bData)[pos]);
857 inline void IFStreamBinary::readByteArray(
byte* array,
int num_bytes)
861 num_bytes *= CPPUtils::SBYT;
866 memcpy(array, &(*bData)[bDataPos], num_bytes);
867 bDataPos += num_bytes;
873 inline void IFStreamBinary::readType(
byte& b)
881 inline void IFStreamBinary::readTypeArray(
byte* array,
int num_bytes)
883 readByteArray(array, num_bytes);
891 inline short IFStreamBinary::readShort()
894 return readShortNC();
900 inline short IFStreamBinary::readShortNC()
905 bDataPos += CPPUtils::SSHT;
906 return readShort(pos);
913 inline short IFStreamBinary::readShort(
int pos)
919 s = *((
short*) &(*bData)[pos]);
921 memcpy(&s, &(*bData)[pos], 2);
923 if (bReverse) reverseBO2((
char*) &s);
930 inline void IFStreamBinary::readShortArray(
short* array,
int num_shorts)
934 int num_bytes = num_shorts * CPPUtils::SSHT;
940 memcpy(array, &(*bData)[bDataPos], num_bytes);
941 if (bReverse) reverseBO2Array(num_shorts, (
char*) array);
942 bDataPos += num_bytes;
948 inline void IFStreamBinary::readType(
short& s)
956 inline void IFStreamBinary::readTypeArray(
short* array,
int num_shorts)
958 readShortArray(array, num_shorts);
966 inline int IFStreamBinary::readInt()
975 inline int IFStreamBinary::readIntNC()
980 bDataPos += CPPUtils::SINT;
988 inline int IFStreamBinary::readInt(
int pos)
994 i = *((
int*) &(*bData)[pos]);
996 memcpy(&i, &(*bData)[pos], 4);
998 if (bReverse) reverseBO4((
char*) &i);
1005 inline void IFStreamBinary::readIntArray(
int* array,
int num_ints)
1009 int num_bytes = num_ints * CPPUtils::SINT;
1015 memcpy(array, &(*bData)[bDataPos], num_bytes);
1016 if (bReverse) reverseBO4Array(num_ints, (
char*) array);
1017 bDataPos += num_bytes;
1023 inline void IFStreamBinary::readType(
int& i)
1031 inline void IFStreamBinary::readTypeArray(
int* array,
int num_ints)
1033 readIntArray(array, num_ints);
1044 return readLongNC();
1055 bDataPos += CPPUtils::SLNG;
1056 return readLong(pos);
1071 memcpy(&l, &(*bData)[pos], 8);
1073 if (bReverse) reverseBO8((
char*) &l);
1080 inline void IFStreamBinary::readLongArray(
LONG_INT* array,
int num_longs)
1084 int num_bytes = num_longs * CPPUtils::SLNG;
1090 memcpy(array, &(*bData)[bDataPos], num_bytes);
1091 if (bReverse) reverseBO8Array(num_longs, (
char*) array);
1092 bDataPos += num_bytes;
1106 inline void IFStreamBinary::readTypeArray(
LONG_INT* array,
int num_longs)
1108 readLongArray(array, num_longs);
1116 inline float IFStreamBinary::readFloat()
1119 return readFloatNC();
1125 inline float IFStreamBinary::readFloatNC()
1130 bDataPos += CPPUtils::SFLT;
1131 return readFloat(pos);
1138 inline float IFStreamBinary::readFloat(
int pos)
1144 f = *((
float*) &(*bData)[pos]);
1146 memcpy(&f, &(*bData)[pos], 4);
1148 if (bReverse) reverseBO4((
char*) &f);
1155 inline void IFStreamBinary::readFloatArray(
float* array,
int num_floats)
1159 int num_bytes = num_floats * CPPUtils::SFLT;
1165 memcpy(array, &(*bData)[bDataPos], num_bytes);
1166 if (bReverse) reverseBO4Array(num_floats, (
char*) array);
1167 bDataPos += num_bytes;
1173 inline void IFStreamBinary::readType(
float& f)
1181 inline void IFStreamBinary::readTypeArray(
float* array,
int num_floats)
1183 readFloatArray(array, num_floats);
1191 inline double IFStreamBinary::readDouble()
1194 return readDoubleNC();
1200 inline double IFStreamBinary::readDoubleNC()
1205 bDataPos += CPPUtils::SDBL;
1206 return readDouble(pos);
1213 inline double IFStreamBinary::readDouble(
int pos)
1219 d = *((
double*) &(*bData)[pos]);
1221 memcpy(&d, &(*bData)[pos], 8);
1223 if (bReverse) reverseBO8((
char*) &d);
1230 inline void IFStreamBinary::readDoubleArray(
double* array,
int num_doubles)
1234 int num_bytes = num_doubles * CPPUtils::SDBL;
1240 memcpy(array, &(*bData)[bDataPos], num_bytes);
1241 if (bReverse) reverseBO8Array(num_doubles, (
char*) array);
1242 bDataPos += num_bytes;
1248 inline void IFStreamBinary::readType(
double& d)
1256 inline void IFStreamBinary::readTypeArray(
double* array,
int num_doubles)
1258 readDoubleArray(array, num_doubles);
1269 inline void IFStreamBinary::writeString(
const string& str)
1273 int sz = (int) str.size() + CPPUtils::SINT;
1275 checkBufferSize(sz);
1279 writeIntNC((
int) str.size());
1280 memcpy(&(*bData)[bDataPos], &str[0], str.size());
1281 bDataPos += (int) str.size();
1289 inline void IFStreamBinary::writeString(
const char* char_string)
1291 string tmp_string = char_string;
1292 writeString(tmp_string);
1298 inline void IFStreamBinary::writeCharArray(
const char* array,
int num_chars)
1300 checkBufferSize(num_chars);
1304 memcpy(&(*bData)[bDataPos], array, num_chars);
1305 bDataPos += num_chars;
1314 inline void IFStreamBinary::writeType(
const string& str)
1324 inline void IFStreamBinary::writeType(
const char* char_string)
1326 writeString(char_string);
1336 inline void IFStreamBinary::writeBool(
bool b)
1338 checkBufferSize(CPPUtils::SBOL);
1348 inline void IFStreamBinary::writeBoolNC(
bool b)
1350 writeBool(b, bDataPos);
1351 bDataPos += CPPUtils::SBOL;
1359 inline void IFStreamBinary::writeBool(
bool b,
int pos)
1361 *((
bool*) &(*bData)[pos]) = b;
1367 inline void IFStreamBinary::writeBoolArray(
const bool* array,
int num_bools)
1372 num_bools *= CPPUtils::SBOL;
1373 checkBufferSize(num_bools);
1378 memcpy(&(*bData)[bDataPos], array, num_bools);
1379 bDataPos += num_bools;
1387 inline void IFStreamBinary::writeType(
bool b)
1395 inline void IFStreamBinary::writeTypeArray(
const bool* array,
int num_bools)
1397 writeBoolArray(array, num_bools);
1407 inline void IFStreamBinary::writeByte(
byte b)
1409 checkBufferSize(CPPUtils::SBYT);
1419 inline void IFStreamBinary::writeByteNC(
byte b)
1421 writeByte(b, bDataPos);
1422 bDataPos += CPPUtils::SBYT;
1430 inline void IFStreamBinary::writeByte(
byte b,
int pos)
1432 *((
byte*) &(*bData)[pos]) = b;
1438 inline void IFStreamBinary::writeByteArray(
const byte* array,
int num_bytes)
1443 num_bytes *= CPPUtils::SBYT;
1444 checkBufferSize(num_bytes);
1449 memcpy(&(*bData)[bDataPos], array, num_bytes);
1450 bDataPos += num_bytes;
1458 inline void IFStreamBinary::writeType(
byte b)
1466 inline void IFStreamBinary::writeTypeArray(
const byte* array,
int num_bytes)
1468 writeByteArray(array, num_bytes);
1478 inline void IFStreamBinary::writeShort(
short s)
1481 checkBufferSize(CPPUtils::SSHT);
1491 inline void IFStreamBinary::writeShortNC(
short s)
1493 writeShort(s, bDataPos);
1494 bDataPos += CPPUtils::SSHT;
1502 inline void IFStreamBinary::writeShort(
short s,
int pos)
1504 if (bReverse) reverseBO2((
char*) &s);
1507 *((
short*) &(*bData)[pos]) = s;
1509 memcpy(&(*bData)[pos], &s, CPPUtils::SSHT);
1515 inline void IFStreamBinary::writeShortArray(
const short* array,
int num_shorts)
1520 int num_bytes = num_shorts * CPPUtils::SSHT;
1522 checkBufferSize(num_bytes);
1527 memcpy(&(*bData)[bDataPos], array, num_bytes);
1528 if (bReverse) reverseBO2Array(num_shorts, &(*bData)[bDataPos]);
1529 bDataPos += num_bytes;
1537 inline void IFStreamBinary::writeType(
short s)
1545 inline void IFStreamBinary::writeTypeArray(
const short* array,
int num_shorts)
1547 writeShortArray(array, num_shorts);
1557 inline void IFStreamBinary::writeInt(
int i)
1560 checkBufferSize(CPPUtils::SINT);
1570 inline void IFStreamBinary::writeIntNC(
int i)
1572 writeInt(i, bDataPos);
1573 bDataPos += CPPUtils::SINT;
1581 inline void IFStreamBinary::writeInt(
int i,
int pos)
1583 if (bReverse) reverseBO4((
char*) &i);
1586 *((
int*) &(*bData)[pos]) = i;
1588 memcpy(&(*bData)[pos], &i, CPPUtils::SINT);
1594 inline void IFStreamBinary::writeIntArray(
const int* array,
int num_ints)
1599 int num_bytes = num_ints * CPPUtils::SINT;
1601 checkBufferSize(num_bytes);
1606 memcpy(&(*bData)[bDataPos], array, num_bytes);
1607 if (bReverse) reverseBO4Array(num_ints, &(*bData)[bDataPos]);
1608 bDataPos += num_bytes;
1616 inline void IFStreamBinary::writeType(
int i)
1624 inline void IFStreamBinary::writeTypeArray(
const int* array,
int num_ints)
1626 writeIntArray(array, num_ints);
1639 checkBufferSize(CPPUtils::SLNG);
1651 writeLong(l, bDataPos);
1652 bDataPos += CPPUtils::SLNG;
1660 inline void IFStreamBinary::writeLong(
LONG_INT l,
int pos)
1662 if (bReverse) reverseBO8((
char*) &l);
1667 memcpy(&(*bData)[pos], &l, CPPUtils::SLNG);
1673 inline void IFStreamBinary::writeLongArray(
const LONG_INT* array,
int num_longs)
1678 int num_bytes = num_longs * CPPUtils::SLNG;
1680 checkBufferSize(num_bytes);
1685 memcpy(&(*bData)[bDataPos], array, num_bytes);
1686 if (bReverse) reverseBO8Array(num_longs, &(*bData)[bDataPos]);
1687 bDataPos += num_bytes;
1703 inline void IFStreamBinary::writeTypeArray(
const LONG_INT* array,
int num_longs)
1705 writeLongArray(array, num_longs);
1715 inline void IFStreamBinary::writeFloat(
float f)
1718 checkBufferSize(CPPUtils::SFLT);
1728 inline void IFStreamBinary::writeFloatNC(
float f)
1730 writeFloat(f, bDataPos);
1731 bDataPos += CPPUtils::SFLT;
1739 inline void IFStreamBinary::writeFloat(
float f,
int pos)
1741 if (bReverse) reverseBO4((
char*) &f);
1744 *((
float*) &(*bData)[pos]) = f;
1746 memcpy(&(*bData)[pos], &f, CPPUtils::SFLT);
1752 inline void IFStreamBinary::writeFloatArray(
const float* array,
int num_floats)
1757 int num_bytes = num_floats * CPPUtils::SFLT;
1759 checkBufferSize(num_bytes);
1764 memcpy(&(*bData)[bDataPos], array, num_bytes);
1765 if (bReverse) reverseBO4Array(num_floats, &(*bData)[bDataPos]);
1766 bDataPos += num_bytes;
1774 inline void IFStreamBinary::writeType(
float f)
1782 inline void IFStreamBinary::writeTypeArray(
const float* array,
int num_floats)
1784 writeFloatArray(array, num_floats);
1794 inline void IFStreamBinary::writeDouble(
double d)
1797 checkBufferSize(CPPUtils::SDBL);
1807 inline void IFStreamBinary::writeDoubleNC(
double d)
1809 writeDouble(d, bDataPos);
1810 bDataPos += CPPUtils::SDBL;
1818 inline void IFStreamBinary::writeDouble(
double d,
int pos)
1820 if (bReverse) reverseBO8((
char*) &d);
1823 *((
double*) &(*bData)[pos]) = d;
1825 memcpy(&(*bData)[pos], &d, CPPUtils::SDBL);
1831 inline void IFStreamBinary::writeDoubleArray(
const double* array,
int num_doubles)
1836 int num_bytes = num_doubles * CPPUtils::SDBL;
1838 checkBufferSize(num_bytes);
1843 memcpy(&(*bData)[bDataPos], array, num_bytes);
1844 if (bReverse) reverseBO8Array(num_doubles, &(*bData)[bDataPos]);
1845 bDataPos += num_bytes;
1853 inline void IFStreamBinary::writeType(
double d)
1861 inline void IFStreamBinary::writeTypeArray(
const double* array,
int num_doubles)
1863 writeDoubleArray(array, num_doubles);
1871 inline void IFStreamBinary::reverseBO2(
char* d)
1881 inline void IFStreamBinary::reverseBO4(
char* d)
1895 inline void IFStreamBinary::reverseBO8(
char* d)
1916 #endif // IFSTREAMBINARY_OBJECT_H