StreamOperator 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #ifndef OSGDB_STREAMOPERATOR
  2. #define OSGDB_STREAMOPERATOR
  3. #include <iostream>
  4. #include <sstream>
  5. #include <osg/Referenced>
  6. #include <osgDB/Export>
  7. #include <osgDB/DataTypes>
  8. namespace osgDB
  9. {
  10. // forward declare
  11. class InputStream;
  12. class OutputStream;
  13. class OSGDB_EXPORT OutputIterator : public osg::Referenced
  14. {
  15. public:
  16. OutputIterator() : _out(0), _outputStream(0), _supportBinaryBrackets(false) {}
  17. virtual ~OutputIterator() {}
  18. void setStream( std::ostream* ostream ) { _out = ostream; }
  19. std::ostream* getStream() { return _out; }
  20. const std::ostream* getStream() const { return _out; }
  21. void setOutputStream( OutputStream* outputStream) { _outputStream = outputStream; }
  22. OutputStream* getOutputStream() { return _outputStream; }
  23. const OutputStream* getOutputStream() const { return _outputStream; }
  24. void setSupportBinaryBrackets( bool b ) { _supportBinaryBrackets = b; }
  25. bool getSupportBinaryBrackets() const { return _supportBinaryBrackets; }
  26. virtual bool isBinary() const = 0;
  27. virtual void writeBool( bool b ) = 0;
  28. virtual void writeChar( char c ) = 0;
  29. virtual void writeUChar( unsigned char c ) = 0;
  30. virtual void writeShort( short s ) = 0;
  31. virtual void writeUShort( unsigned short s ) = 0;
  32. virtual void writeInt( int i ) = 0;
  33. virtual void writeUInt( unsigned int i ) = 0;
  34. virtual void writeLong( long l ) = 0;
  35. virtual void writeULong( unsigned long l ) = 0;
  36. virtual void writeInt64( GLint64 ll ) = 0;
  37. virtual void writeUInt64( GLuint64 ull ) = 0;
  38. virtual void writeFloat( float f ) = 0;
  39. virtual void writeDouble( double d ) = 0;
  40. virtual void writeString( const std::string& s ) = 0;
  41. virtual void writeStream( std::ostream& (*fn)(std::ostream&) ) = 0;
  42. virtual void writeBase( std::ios_base& (*fn)(std::ios_base&) ) = 0;
  43. virtual void writeGLenum( const ObjectGLenum& value ) = 0;
  44. virtual void writeProperty( const ObjectProperty& prop ) = 0;
  45. virtual void writeMark( const ObjectMark& mark ) = 0;
  46. virtual void writeCharArray( const char* s, unsigned int size ) = 0;
  47. virtual void writeWrappedString( const std::string& str ) = 0;
  48. virtual void flush() { _out->flush(); }
  49. protected:
  50. // Return true if the manipulator is std::endl
  51. bool isEndl( std::ostream& (*fn)(std::ostream&) )
  52. {
  53. #if defined (__sun) || (defined _WIN32 && !defined OSG_LIBRARY_STATIC)
  54. // What a mess, but solaris does not like taking the address below
  55. // windows std::endl is a template with different adresses in different dll's
  56. std::stringstream ss;
  57. ss << fn;
  58. std::string s = ss.str();
  59. return !s.empty() && s[0] == '\n';
  60. #else
  61. return fn==static_cast<std::ostream& (*)(std::ostream&)>(std::endl);
  62. #endif
  63. }
  64. std::ostream* _out;
  65. osgDB::OutputStream* _outputStream;
  66. bool _supportBinaryBrackets;
  67. };
  68. class OSGDB_EXPORT InputIterator : public osg::Referenced
  69. {
  70. public:
  71. InputIterator() : _in(0), _inputStream(0), _byteSwap(0), _supportBinaryBrackets(false), _failed(false) {}
  72. virtual ~InputIterator() {}
  73. void setStream( std::istream* istream ) { _in = istream; }
  74. std::istream* getStream() { return _in; }
  75. const std::istream* getStream() const { return _in; }
  76. void setInputStream( InputStream* inputStream) { _inputStream = inputStream; }
  77. InputStream* getInputStream() { return _inputStream; }
  78. const InputStream* getInputStream() const { return _inputStream; }
  79. void setByteSwap(int byteSwap) { _byteSwap = byteSwap; }
  80. int getByteSwap() const { return _byteSwap; }
  81. void setSupportBinaryBrackets( bool b ) { _supportBinaryBrackets = b; }
  82. bool getSupportBinaryBrackets() const { return _supportBinaryBrackets; }
  83. void checkStream() const;
  84. bool isFailed() const { return _failed; }
  85. virtual bool isBinary() const = 0;
  86. virtual void readBool( bool& b ) = 0;
  87. virtual void readChar( char& c ) = 0;
  88. virtual void readSChar( signed char& c ) = 0;
  89. virtual void readUChar( unsigned char& c ) = 0;
  90. virtual void readShort( short& s ) = 0;
  91. virtual void readUShort( unsigned short& s ) = 0;
  92. virtual void readInt( int& i ) = 0;
  93. virtual void readUInt( unsigned int& i ) = 0;
  94. virtual void readLong( long& l ) = 0;
  95. virtual void readULong( unsigned long& l ) = 0;
  96. virtual void readFloat( float& f ) = 0;
  97. virtual void readDouble( double& d ) = 0;
  98. virtual void readString( std::string& s ) = 0;
  99. virtual void readStream( std::istream& (*fn)(std::istream&) ) = 0;
  100. virtual void readBase( std::ios_base& (*fn)(std::ios_base&) ) = 0;
  101. virtual void readGLenum( ObjectGLenum& value ) = 0;
  102. virtual void readProperty( ObjectProperty& prop ) = 0;
  103. virtual void readMark( ObjectMark& mark ) = 0;
  104. virtual void readCharArray( char* s, unsigned int size ) = 0;
  105. virtual void readWrappedString( std::string& str ) = 0;
  106. virtual bool matchString( const std::string& /*str*/ ) { return false; }
  107. virtual void advanceToCurrentEndBracket() {}
  108. void throwException( const std::string& msg );
  109. void readComponentArray( char* s, unsigned int numElements, unsigned int numComponentsPerElements, unsigned int componentSizeInBytes);
  110. protected:
  111. std::istream* _in;
  112. osgDB::InputStream* _inputStream;
  113. int _byteSwap;
  114. bool _supportBinaryBrackets;
  115. mutable bool _failed;
  116. };
  117. }
  118. #endif