1#ifndef OSGDB_STREAMOPERATOR
2#define OSGDB_STREAMOPERATOR
6#include <osg/Referenced>
8#include <osgDB/DataTypes>
17class OSGDB_EXPORT OutputIterator : public osg::Referenced
20 OutputIterator() : _out(0), _outputStream(0), _supportBinaryBrackets(false) {}
21 virtual ~OutputIterator() {}
23 void setStream( std::ostream* ostream ) { _out = ostream; }
24 std::ostream* getStream() { return _out; }
25 const std::ostream* getStream() const { return _out; }
27 void setOutputStream( OutputStream* outputStream) { _outputStream = outputStream; }
28 OutputStream* getOutputStream() { return _outputStream; }
29 const OutputStream* getOutputStream() const { return _outputStream; }
31 void setSupportBinaryBrackets( bool b ) { _supportBinaryBrackets = b; }
32 bool getSupportBinaryBrackets() const { return _supportBinaryBrackets; }
34 virtual bool isBinary() const = 0;
36 virtual void writeBool( bool b ) = 0;
37 virtual void writeChar( char c ) = 0;
38 virtual void writeUChar( unsigned char c ) = 0;
39 virtual void writeShort( short s ) = 0;
40 virtual void writeUShort( unsigned short s ) = 0;
41 virtual void writeInt( int i ) = 0;
42 virtual void writeUInt( unsigned int i ) = 0;
43 virtual void writeLong( long l ) = 0;
44 virtual void writeULong( unsigned long l ) = 0;
45 virtual void writeInt64( GLint64 ll ) = 0;
46 virtual void writeUInt64( GLuint64 ull ) = 0;
47 virtual void writeFloat( float f ) = 0;
48 virtual void writeDouble( double d ) = 0;
49 virtual void writeString( const std::string& s ) = 0;
50 virtual void writeStream( std::ostream& (*fn)(std::ostream&) ) = 0;
51 virtual void writeBase( std::ios_base& (*fn)(std::ios_base&) ) = 0;
53 virtual void writeGLenum( const ObjectGLenum& value ) = 0;
54 virtual void writeProperty( const ObjectProperty& prop ) = 0;
55 virtual void writeMark( const ObjectMark& mark ) = 0;
56 virtual void writeCharArray( const char* s, unsigned int size ) = 0;
57 virtual void writeWrappedString( const std::string& str ) = 0;
59 virtual void flush() { _out->flush(); }
62 // Return true if the manipulator is std::endl
63 bool isEndl( std::ostream& (*fn)(std::ostream&) )
65#if defined (__sun) || (defined _WIN32 && !defined OSG_LIBRARY_STATIC)
66 // What a mess, but solaris does not like taking the address below
67 // windows std::endl is a template with different adresses in different dll's
70 std::string s = ss.str();
71 return !s.empty() && s[0] == '\n';
73 return fn==static_cast<std::ostream& (*)(std::ostream&)>(std::endl);
78 osgDB::OutputStream* _outputStream;
79 bool _supportBinaryBrackets;
82class OSGDB_EXPORT InputIterator : public osg::Referenced
85 InputIterator() : _in(0), _inputStream(0), _byteSwap(0), _supportBinaryBrackets(false), _failed(false) {}
86 virtual ~InputIterator() {}
88 void setStream( std::istream* istream ) { _in = istream; }
89 std::istream* getStream() { return _in; }
90 const std::istream* getStream() const { return _in; }
92 void setInputStream( InputStream* inputStream) { _inputStream = inputStream; }
93 InputStream* getInputStream() { return _inputStream; }
94 const InputStream* getInputStream() const { return _inputStream; }
96 void setByteSwap(int byteSwap) { _byteSwap = byteSwap; }
97 int getByteSwap() const { return _byteSwap; }
99 void setSupportBinaryBrackets( bool b ) { _supportBinaryBrackets = b; }
100 bool getSupportBinaryBrackets() const { return _supportBinaryBrackets; }
102 void checkStream() const;
103 bool isFailed() const { return _failed; }
105 virtual bool isBinary() const = 0;
107 virtual void readBool( bool& b ) = 0;
108 virtual void readChar( char& c ) = 0;
109 virtual void readSChar( signed char& c ) = 0;
110 virtual void readUChar( unsigned char& c ) = 0;
111 virtual void readShort( short& s ) = 0;
112 virtual void readUShort( unsigned short& s ) = 0;
113 virtual void readInt( int& i ) = 0;
114 virtual void readUInt( unsigned int& i ) = 0;
115 virtual void readLong( long& l ) = 0;
116 virtual void readULong( unsigned long& l ) = 0;
117 virtual void readFloat( float& f ) = 0;
118 virtual void readDouble( double& d ) = 0;
119 virtual void readString( std::string& s ) = 0;
120 virtual void readStream( std::istream& (*fn)(std::istream&) ) = 0;
121 virtual void readBase( std::ios_base& (*fn)(std::ios_base&) ) = 0;
123 virtual void readGLenum( ObjectGLenum& value ) = 0;
124 virtual void readProperty( ObjectProperty& prop ) = 0;
125 virtual void readMark( ObjectMark& mark ) = 0;
126 virtual void readCharArray( char* s, unsigned int size ) = 0;
127 virtual void readWrappedString( std::string& str ) = 0;
129 virtual bool matchString( const std::string& /*str*/ ) { return false; }
130 virtual void advanceToCurrentEndBracket() {}
132 void throwException( const std::string& msg );
134 void readComponentArray( char* s, unsigned int numElements, unsigned int numComponentsPerElements, unsigned int componentSizeInBytes);
138 osgDB::InputStream* _inputStream;
140 bool _supportBinaryBrackets;
141 mutable bool _failed;