36 #ifndef IFSTREAMBINARY_OBJECT_H
37 #define IFSTREAMBINARY_OBJECT_H
130 int sm = bDataPos % CPPUtils::SSHT;
131 if (sm && bAlign) bDataPos += CPPUtils::SSHT - sm;
140 int sm = bDataPos % CPPUtils::SINT;
141 if (sm && bAlign) bDataPos += CPPUtils::SINT - sm;
150 int sm = bDataPos % CPPUtils::SDBL;
151 if (sm && bAlign) bDataPos += CPPUtils::SDBL - sm;
160 if (bDataPos + sincr > (
int) bData->size())
162 if (sincr + bData->size() > bData->capacity())
163 bData->reserve(bData->capacity() + bMemIncr);
164 bData->append(bDataPos + sincr - bData->size(),
' ');
187 static void reverseBO2(
char* d);
188 static void reverseBO4(
char* d);
189 static void reverseBO8(
char* d);
244 static bool exists(
const string& filename);
299 if (mci > 0) bMemIncr = mci;
311 void readString(
string& s);
312 void readCharArray(
string& s,
int num_chars);
313 void readCharArray(
char* array,
int num_chars);
314 void readType(
string& s);
315 void readTypeArray(
string& array,
int num_chars);
325 bool readBool(
int pos);
326 void readBoolArray(
bool* array,
int num_bools);
327 void readType(
bool& b);
328 void readTypeArray(
bool* array,
int num_bools);
338 byte readByte(
int pos);
339 void readByteArray(
byte* array,
int num_bs);
340 void readType(
byte& b);
341 void readTypeArray(
byte* array,
int num_bs);
354 short readShort(
int pos);
355 void readShortArray(
short* array,
int num_shorts);
356 void readType(
short& s);
357 void readTypeArray(
short* array,
int num_shorts);
370 int readInt(
int pos);
371 void readIntArray(
int* array,
int num_ints);
372 void readType(
int& i);
373 void readTypeArray(
int* array,
int num_ints);
387 void readLongArray(
LONG_INT* array,
int num_longs);
389 void readTypeArray(
LONG_INT* array,
int num_longs);
402 float readFloat(
int pos);
403 void readFloatArray(
float* array,
int num_floats);
404 void readType(
float& f);
405 void readTypeArray(
float* array,
int num_floats);
417 double readDoubleNC();
418 double readDouble(
int pos);
419 void readDoubleArray(
double* array,
int num_doubles);
420 void readType(
double& d);
421 void readTypeArray(
double* array,
int num_doubles);
431 void writeString(
const string& str);
432 void writeString(
const char* char_string);
433 void writeCharArray(
const char* array,
int num_chars);
434 void writeType(
const string& str);
435 void writeType(
const char* char_string);
447 void writeBool(
bool b);
448 void writeBoolNC(
bool b);
449 void writeBool(
bool b,
int pos);
450 void writeBoolArray(
const bool* array,
int num_bools);
451 void writeType(
bool b);
452 void writeTypeArray(
const bool* array,
int num_bools);
464 void writeByte(
byte b);
465 void writeByteNC(
byte b);
466 void writeByte(
byte b,
int pos);
467 void writeByteArray(
const byte* array,
int num_bytes);
468 void writeType(
byte b);
469 void writeTypeArray(
const byte* array,
int num_bytes);
482 void writeShort(
short i);
483 void writeShortNC(
short i);
484 void writeShort(
short i,
int pos);
485 void writeShortArray(
const short* array,
int num_ints);
486 void writeType(
short i);
487 void writeTypeArray(
const short* array,
int num_ints);
500 void writeInt(
int i);
501 void writeIntNC(
int i);
502 void writeInt(
int i,
int pos);
503 void writeIntArray(
const int* array,
int num_ints);
504 void writeType(
int i);
505 void writeTypeArray(
const int* array,
int num_ints);
520 void writeLong(
LONG_INT l,
int pos);
521 void writeLongArray(
const LONG_INT* array,
int num_longs);
523 void writeTypeArray(
const LONG_INT* array,
int num_longs);
536 void writeFloat(
float f);
537 void writeFloatNC(
float f);
538 void writeFloat(
float f,
int pos);
539 void writeFloatArray(
const float* array,
int num_floats);
540 void writeType(
float f);
541 void writeTypeArray(
const float* array,
int num_floats);
554 void writeDouble(
double d);
555 void writeDoubleNC(
double d);
556 void writeDouble(
double d,
int pos);
557 void writeDoubleArray(
const double* array,
int num_doubles);
558 void writeType(
double d);
559 void writeTypeArray(
const double* array,
int num_doubles);
565 {
return "IFStreamBinary"; }
578 { bData->resize(spc); }
584 { bData->reserve(sze); }
591 if (bDataPos > bSize) bSize = bDataPos;
600 if (bDataPos > bSize) bSize = bDataPos;
609 if (bDataPos > bSize) bSize = bDataPos;
623 { bDataPos += increment; }
629 { bDataPos -= decrement; }
641 {
return (
int) bData->capacity(); }
648 {
return getPosPointer(bDataPos); }
655 char* p = &(*bData)[pos];
675 { bReverse =
false; }
716 inline string IFStreamBinary::readString()
726 inline void IFStreamBinary::readString(
string& s)
736 s = bData->substr(bDataPos, len);
744 inline void IFStreamBinary::readCharArray(
string& s,
int num_chars)
747 readCharArray(&s[0], num_chars);
753 inline void IFStreamBinary::readCharArray(
char* array,
int num_chars)
757 memcpy(array, &(*bData)[bDataPos], num_chars);
758 bDataPos += num_chars;
764 inline void IFStreamBinary::readType(
string& s)
772 inline void IFStreamBinary::readTypeArray(
string& s,
int num_chars)
774 readCharArray(s, num_chars);
782 inline bool IFStreamBinary::readBool()
787 bDataPos += CPPUtils::SBOL;
788 return readBool(pos);
795 inline bool IFStreamBinary::readBool(
int pos)
797 return *((
bool*) &(*bData)[pos]);
803 inline void IFStreamBinary::readBoolArray(
bool* array,
int num_bools)
807 int num_bytes = num_bools * CPPUtils::SBOL;
812 memcpy(array, &(*bData)[bDataPos], num_bytes);
813 bDataPos += num_bytes;
819 inline void IFStreamBinary::readType(
bool& b)
827 inline void IFStreamBinary::readTypeArray(
bool* array,
int num_bools)
829 readBoolArray(array, num_bools);
837 inline byte IFStreamBinary::readByte()
842 bDataPos += CPPUtils::SBYT;
843 return readByte(pos);
850 inline byte IFStreamBinary::readByte(
int pos)
852 return *((
byte*) &(*bData)[pos]);
858 inline void IFStreamBinary::readByteArray(
byte* array,
int num_bytes)
862 num_bytes *= CPPUtils::SBYT;
867 memcpy(array, &(*bData)[bDataPos], num_bytes);
868 bDataPos += num_bytes;
874 inline void IFStreamBinary::readType(
byte& b)
882 inline void IFStreamBinary::readTypeArray(
byte* array,
int num_bytes)
884 readByteArray(array, num_bytes);
892 inline short IFStreamBinary::readShort()
895 return readShortNC();
901 inline short IFStreamBinary::readShortNC()
906 bDataPos += CPPUtils::SSHT;
907 return readShort(pos);
914 inline short IFStreamBinary::readShort(
int pos)
920 s = *((
short*) &(*bData)[pos]);
922 memcpy(&s, &(*bData)[pos], 2);
924 if (bReverse) reverseBO2((
char*) &s);
931 inline void IFStreamBinary::readShortArray(
short* array,
int num_shorts)
935 int num_bytes = num_shorts * CPPUtils::SSHT;
941 memcpy(array, &(*bData)[bDataPos], num_bytes);
942 if (bReverse) reverseBO2Array(num_shorts, (
char*) array);
943 bDataPos += num_bytes;
949 inline void IFStreamBinary::readType(
short& s)
957 inline void IFStreamBinary::readTypeArray(
short* array,
int num_shorts)
959 readShortArray(array, num_shorts);
967 inline int IFStreamBinary::readInt()
976 inline int IFStreamBinary::readIntNC()
981 bDataPos += CPPUtils::SINT;
989 inline int IFStreamBinary::readInt(
int pos)
995 i = *((
int*) &(*bData)[pos]);
997 memcpy(&i, &(*bData)[pos], 4);
999 if (bReverse) reverseBO4((
char*) &i);
1006 inline void IFStreamBinary::readIntArray(
int* array,
int num_ints)
1010 int num_bytes = num_ints * CPPUtils::SINT;
1016 memcpy(array, &(*bData)[bDataPos], num_bytes);
1017 if (bReverse) reverseBO4Array(num_ints, (
char*) array);
1018 bDataPos += num_bytes;
1024 inline void IFStreamBinary::readType(
int& i)
1032 inline void IFStreamBinary::readTypeArray(
int* array,
int num_ints)
1034 readIntArray(array, num_ints);
1045 return readLongNC();
1056 bDataPos += CPPUtils::SLNG;
1057 return readLong(pos);
1072 memcpy(&l, &(*bData)[pos], 8);
1074 if (bReverse) reverseBO8((
char*) &l);
1081 inline void IFStreamBinary::readLongArray(
LONG_INT* array,
int num_longs)
1085 int num_bytes = num_longs * CPPUtils::SLNG;
1091 memcpy(array, &(*bData)[bDataPos], num_bytes);
1092 if (bReverse) reverseBO8Array(num_longs, (
char*) array);
1093 bDataPos += num_bytes;
1107 inline void IFStreamBinary::readTypeArray(
LONG_INT* array,
int num_longs)
1109 readLongArray(array, num_longs);
1117 inline float IFStreamBinary::readFloat()
1120 return readFloatNC();
1126 inline float IFStreamBinary::readFloatNC()
1131 bDataPos += CPPUtils::SFLT;
1132 return readFloat(pos);
1139 inline float IFStreamBinary::readFloat(
int pos)
1145 f = *((
float*) &(*bData)[pos]);
1147 memcpy(&f, &(*bData)[pos], 4);
1149 if (bReverse) reverseBO4((
char*) &f);
1156 inline void IFStreamBinary::readFloatArray(
float* array,
int num_floats)
1160 int num_bytes = num_floats * CPPUtils::SFLT;
1166 memcpy(array, &(*bData)[bDataPos], num_bytes);
1167 if (bReverse) reverseBO4Array(num_floats, (
char*) array);
1168 bDataPos += num_bytes;
1174 inline void IFStreamBinary::readType(
float& f)
1182 inline void IFStreamBinary::readTypeArray(
float* array,
int num_floats)
1184 readFloatArray(array, num_floats);
1192 inline double IFStreamBinary::readDouble()
1195 return readDoubleNC();
1201 inline double IFStreamBinary::readDoubleNC()
1206 bDataPos += CPPUtils::SDBL;
1207 return readDouble(pos);
1214 inline double IFStreamBinary::readDouble(
int pos)
1220 d = *((
double*) &(*bData)[pos]);
1222 memcpy(&d, &(*bData)[pos], 8);
1224 if (bReverse) reverseBO8((
char*) &d);
1231 inline void IFStreamBinary::readDoubleArray(
double* array,
int num_doubles)
1235 int num_bytes = num_doubles * CPPUtils::SDBL;
1241 memcpy(array, &(*bData)[bDataPos], num_bytes);
1242 if (bReverse) reverseBO8Array(num_doubles, (
char*) array);
1243 bDataPos += num_bytes;
1249 inline void IFStreamBinary::readType(
double& d)
1257 inline void IFStreamBinary::readTypeArray(
double* array,
int num_doubles)
1259 readDoubleArray(array, num_doubles);
1270 inline void IFStreamBinary::writeString(
const string& str)
1274 int sz = (int) str.size() + CPPUtils::SINT;
1276 checkBufferSize(sz);
1280 writeIntNC((
int) str.size());
1281 memcpy(&(*bData)[bDataPos], &str[0], str.size());
1282 bDataPos += (int) str.size();
1290 inline void IFStreamBinary::writeString(
const char* char_string)
1292 string tmp_string = char_string;
1293 writeString(tmp_string);
1299 inline void IFStreamBinary::writeCharArray(
const char* array,
int num_chars)
1301 checkBufferSize(num_chars);
1305 memcpy(&(*bData)[bDataPos], array, num_chars);
1306 bDataPos += num_chars;
1315 inline void IFStreamBinary::writeType(
const string& str)
1325 inline void IFStreamBinary::writeType(
const char* char_string)
1327 writeString(char_string);
1337 inline void IFStreamBinary::writeBool(
bool b)
1339 checkBufferSize(CPPUtils::SBOL);
1349 inline void IFStreamBinary::writeBoolNC(
bool b)
1351 writeBool(b, bDataPos);
1352 bDataPos += CPPUtils::SBOL;
1360 inline void IFStreamBinary::writeBool(
bool b,
int pos)
1362 *((
bool*) &(*bData)[pos]) = b;
1368 inline void IFStreamBinary::writeBoolArray(
const bool* array,
int num_bools)
1373 num_bools *= CPPUtils::SBOL;
1374 checkBufferSize(num_bools);
1379 memcpy(&(*bData)[bDataPos], array, num_bools);
1380 bDataPos += num_bools;
1388 inline void IFStreamBinary::writeType(
bool b)
1396 inline void IFStreamBinary::writeTypeArray(
const bool* array,
int num_bools)
1398 writeBoolArray(array, num_bools);
1408 inline void IFStreamBinary::writeByte(
byte b)
1410 checkBufferSize(CPPUtils::SBYT);
1420 inline void IFStreamBinary::writeByteNC(
byte b)
1422 writeByte(b, bDataPos);
1423 bDataPos += CPPUtils::SBYT;
1431 inline void IFStreamBinary::writeByte(
byte b,
int pos)
1433 *((
byte*) &(*bData)[pos]) = b;
1439 inline void IFStreamBinary::writeByteArray(
const byte* array,
int num_bytes)
1444 num_bytes *= CPPUtils::SBYT;
1445 checkBufferSize(num_bytes);
1450 memcpy(&(*bData)[bDataPos], array, num_bytes);
1451 bDataPos += num_bytes;
1459 inline void IFStreamBinary::writeType(
byte b)
1467 inline void IFStreamBinary::writeTypeArray(
const byte* array,
int num_bytes)
1469 writeByteArray(array, num_bytes);
1479 inline void IFStreamBinary::writeShort(
short s)
1482 checkBufferSize(CPPUtils::SSHT);
1492 inline void IFStreamBinary::writeShortNC(
short s)
1494 writeShort(s, bDataPos);
1495 bDataPos += CPPUtils::SSHT;
1503 inline void IFStreamBinary::writeShort(
short s,
int pos)
1505 if (bReverse) reverseBO2((
char*) &s);
1508 *((
short*) &(*bData)[pos]) = s;
1510 memcpy(&(*bData)[pos], &s, CPPUtils::SSHT);
1516 inline void IFStreamBinary::writeShortArray(
const short* array,
int num_shorts)
1521 int num_bytes = num_shorts * CPPUtils::SSHT;
1523 checkBufferSize(num_bytes);
1528 memcpy(&(*bData)[bDataPos], array, num_bytes);
1529 if (bReverse) reverseBO2Array(num_shorts, &(*bData)[bDataPos]);
1530 bDataPos += num_bytes;
1538 inline void IFStreamBinary::writeType(
short s)
1546 inline void IFStreamBinary::writeTypeArray(
const short* array,
int num_shorts)
1548 writeShortArray(array, num_shorts);
1558 inline void IFStreamBinary::writeInt(
int i)
1561 checkBufferSize(CPPUtils::SINT);
1571 inline void IFStreamBinary::writeIntNC(
int i)
1573 writeInt(i, bDataPos);
1574 bDataPos += CPPUtils::SINT;
1582 inline void IFStreamBinary::writeInt(
int i,
int pos)
1584 if (bReverse) reverseBO4((
char*) &i);
1587 *((
int*) &(*bData)[pos]) = i;
1589 memcpy(&(*bData)[pos], &i, CPPUtils::SINT);
1595 inline void IFStreamBinary::writeIntArray(
const int* array,
int num_ints)
1600 int num_bytes = num_ints * CPPUtils::SINT;
1602 checkBufferSize(num_bytes);
1607 memcpy(&(*bData)[bDataPos], array, num_bytes);
1608 if (bReverse) reverseBO4Array(num_ints, &(*bData)[bDataPos]);
1609 bDataPos += num_bytes;
1617 inline void IFStreamBinary::writeType(
int i)
1625 inline void IFStreamBinary::writeTypeArray(
const int* array,
int num_ints)
1627 writeIntArray(array, num_ints);
1640 checkBufferSize(CPPUtils::SLNG);
1652 writeLong(l, bDataPos);
1653 bDataPos += CPPUtils::SLNG;
1661 inline void IFStreamBinary::writeLong(
LONG_INT l,
int pos)
1663 if (bReverse) reverseBO8((
char*) &l);
1668 memcpy(&(*bData)[pos], &l, CPPUtils::SLNG);
1674 inline void IFStreamBinary::writeLongArray(
const LONG_INT* array,
int num_longs)
1679 int num_bytes = num_longs * CPPUtils::SLNG;
1681 checkBufferSize(num_bytes);
1686 memcpy(&(*bData)[bDataPos], array, num_bytes);
1687 if (bReverse) reverseBO8Array(num_longs, &(*bData)[bDataPos]);
1688 bDataPos += num_bytes;
1704 inline void IFStreamBinary::writeTypeArray(
const LONG_INT* array,
int num_longs)
1706 writeLongArray(array, num_longs);
1716 inline void IFStreamBinary::writeFloat(
float f)
1719 checkBufferSize(CPPUtils::SFLT);
1729 inline void IFStreamBinary::writeFloatNC(
float f)
1731 writeFloat(f, bDataPos);
1732 bDataPos += CPPUtils::SFLT;
1740 inline void IFStreamBinary::writeFloat(
float f,
int pos)
1742 if (bReverse) reverseBO4((
char*) &f);
1745 *((
float*) &(*bData)[pos]) = f;
1747 memcpy(&(*bData)[pos], &f, CPPUtils::SFLT);
1753 inline void IFStreamBinary::writeFloatArray(
const float* array,
int num_floats)
1758 int num_bytes = num_floats * CPPUtils::SFLT;
1760 checkBufferSize(num_bytes);
1765 memcpy(&(*bData)[bDataPos], array, num_bytes);
1766 if (bReverse) reverseBO4Array(num_floats, &(*bData)[bDataPos]);
1767 bDataPos += num_bytes;
1775 inline void IFStreamBinary::writeType(
float f)
1783 inline void IFStreamBinary::writeTypeArray(
const float* array,
int num_floats)
1785 writeFloatArray(array, num_floats);
1795 inline void IFStreamBinary::writeDouble(
double d)
1798 checkBufferSize(CPPUtils::SDBL);
1808 inline void IFStreamBinary::writeDoubleNC(
double d)
1810 writeDouble(d, bDataPos);
1811 bDataPos += CPPUtils::SDBL;
1819 inline void IFStreamBinary::writeDouble(
double d,
int pos)
1821 if (bReverse) reverseBO8((
char*) &d);
1824 *((
double*) &(*bData)[pos]) = d;
1826 memcpy(&(*bData)[pos], &d, CPPUtils::SDBL);
1832 inline void IFStreamBinary::writeDoubleArray(
const double* array,
int num_doubles)
1837 int num_bytes = num_doubles * CPPUtils::SDBL;
1839 checkBufferSize(num_bytes);
1844 memcpy(&(*bData)[bDataPos], array, num_bytes);
1845 if (bReverse) reverseBO8Array(num_doubles, &(*bData)[bDataPos]);
1846 bDataPos += num_bytes;
1854 inline void IFStreamBinary::writeType(
double d)
1862 inline void IFStreamBinary::writeTypeArray(
const double* array,
int num_doubles)
1864 writeDoubleArray(array, num_doubles);
1872 inline void IFStreamBinary::reverseBO2(
char* d)
1882 inline void IFStreamBinary::reverseBO4(
char* d)
1896 inline void IFStreamBinary::reverseBO8(
char* d)
Opens a file for binary read and write access.
IFStreamBinary(bool align)
void writeToFile(ofstream &ofs)
virtual ~IFStreamBinary()
const string & getData() const
void byteOrderReverseOn()
void setBoundaryAlignment(bool align)
static string className()
static void reverseBO8Array(int n, char *a)
bool isBoundaryAlignmentOn() const
void incrementPos(int increment=1)
void boundaryAlignmentOff()
static void reverseBOArray(int n, char *a, int s)
IFStreamBinary(const IFStreamBinary &db)
static bool exists(const string &filename)
void setMemoryCapacityIncrement(int mci)
void readFromFile(const string &filename, int num_bytes)
void writeToFile(const string &filename)
IFStreamBinary(string *str)
const string & getFileName() const
void checkBufferSize(int sincr)
void boundaryAlignmentOn()
void setByteOrderReverse(bool bor)
void byteOrderReverseOff()
void readFromFile(const string &filename)
bool isByteOrderReversalOn() const
char * getPosPointer(int pos)
void readFromFile(ifstream &ifs, int num_bytes)
IFStreamBinary(const string &filename, int num_bytes)
void decrementPos(int decrement=1)
static void reverseBO4Array(int n, char *a)
IFStreamBinary(const string &filename)
IFStreamBinary & operator=(const IFStreamBinary &db)
static void reverseBO2Array(int n, char *a)