root/OpenSceneGraph/trunk/src/osgPlugins/osg/BinaryStreamOperator.h @ 13041

Revision 13041, 6.1 kB (checked in by robert, 3 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
Line 
1#ifndef OSG2_BINARYSTREAMOPERATOR
2#define OSG2_BINARYSTREAMOPERATOR
3
4#include <osgDB/StreamOperator>
5
6#if defined(_MSC_VER)
7typedef unsigned __int32 uint32_t;
8typedef __int32 int32_t;
9#else
10#include <stdint.h>
11#endif
12
13
14class BinaryOutputIterator : public osgDB::OutputIterator
15{
16public:
17    BinaryOutputIterator( std::ostream* ostream ) { _out = ostream; }
18    virtual ~BinaryOutputIterator() {}
19
20    virtual bool isBinary() const { return true; }
21
22    virtual void writeBool( bool b )
23    { char c = b?1:0; _out->write( &c, osgDB::CHAR_SIZE ); }
24
25    virtual void writeChar( char c )
26    { _out->write( &c, osgDB::CHAR_SIZE ); }
27
28    virtual void writeUChar( unsigned char c )
29    { _out->write( (char*)&c, osgDB::CHAR_SIZE ); }
30
31    virtual void writeShort( short s )
32    { _out->write( (char*)&s, osgDB::SHORT_SIZE ); }
33
34    virtual void writeUShort( unsigned short s )
35    { _out->write( (char*)&s, osgDB::SHORT_SIZE ); }
36
37    virtual void writeInt( int i )
38    { _out->write( (char*)&i, osgDB::INT_SIZE ); }
39
40    virtual void writeUInt( unsigned int i )
41    { _out->write( (char*)&i, osgDB::INT_SIZE ); }
42
43    virtual void writeLong( long l )
44    {
45        // On 64-bit systems a long may not be the same size as the file value
46        int32_t value=(int32_t)l;
47        _out->write( (char*)&value, osgDB::LONG_SIZE );
48    }
49
50    virtual void writeULong( unsigned long l )
51    {
52        // On 64-bit systems a long may not be the same size as the file value
53        uint32_t value=(int32_t)l;
54        _out->write( (char*)&value, osgDB::LONG_SIZE );
55    }
56
57    virtual void writeFloat( float f )
58    { _out->write( (char*)&f, osgDB::FLOAT_SIZE ); }
59
60    virtual void writeDouble( double d )
61    { _out->write((char*)&d, osgDB::DOUBLE_SIZE); }
62
63    virtual void writeString( const std::string& s )
64    {
65        int size = s.size();
66        _out->write( (char*)&size, osgDB::INT_SIZE );
67        _out->write( s.c_str(), s.size() );
68    }
69
70    virtual void writeStream( std::ostream& (*fn)(std::ostream&) ) {}
71
72    virtual void writeBase( std::ios_base& (*fn)(std::ios_base&) ) {}
73
74    virtual void writeGLenum( const osgDB::ObjectGLenum& value )
75    { GLenum e = value.get(); _out->write((char*)&e, osgDB::GLENUM_SIZE); }
76
77    virtual void writeProperty( const osgDB::ObjectProperty& prop )
78    { if (prop._mapProperty) _out->write((char*)&(prop._value), osgDB::INT_SIZE); }
79
80    virtual void writeMark( const osgDB::ObjectMark& mark ) {}
81
82    virtual void writeCharArray( const char* s, unsigned int size )
83    { if ( size>0 ) _out->write( s, size ); }
84
85    virtual void writeWrappedString( const std::string& str )
86    { writeString( str ); }
87};
88
89class BinaryInputIterator : public osgDB::InputIterator
90{
91public:
92    BinaryInputIterator( std::istream* istream, int byteSwap )
93    {
94        _in = istream;
95        setByteSwap(byteSwap);
96    }
97
98    virtual ~BinaryInputIterator() {}
99
100    virtual bool isBinary() const { return true; }
101
102    virtual void readBool( bool& b )
103    {
104        char c = 0;
105        _in->read( &c, osgDB::CHAR_SIZE );
106        b = (c!=0);
107    }
108
109    virtual void readChar( char& c )
110    { _in->read( &c, osgDB::CHAR_SIZE ); }
111
112    virtual void readSChar( signed char& c )
113    { _in->read( (char*)&c, osgDB::CHAR_SIZE ); }
114
115    virtual void readUChar( unsigned char& c )
116    { _in->read( (char*)&c, osgDB::CHAR_SIZE ); }
117
118    virtual void readShort( short& s )
119    {
120        _in->read( (char*)&s, osgDB::SHORT_SIZE );
121        if ( _byteSwap ) osg::swapBytes( (char*)&s, osgDB::SHORT_SIZE );
122    }
123
124    virtual void readUShort( unsigned short& s )
125    {
126        _in->read( (char*)&s, osgDB::SHORT_SIZE );
127        if ( _byteSwap ) osg::swapBytes( (char*)&s, osgDB::SHORT_SIZE );
128    }
129
130    virtual void readInt( int& i )
131    {
132        _in->read( (char*)&i, osgDB::INT_SIZE );
133        if ( _byteSwap ) osg::swapBytes( (char*)&i, osgDB::INT_SIZE );
134    }
135
136    virtual void readUInt( unsigned int& i )
137    {
138        _in->read( (char*)&i, osgDB::INT_SIZE );
139        if ( _byteSwap ) osg::swapBytes( (char*)&i, osgDB::INT_SIZE );
140    }
141
142    virtual void readLong( long& l )
143    {
144        // On 64-bit systems a long may not be the same size as the file value
145        int32_t value;
146        _in->read( (char*)&value, osgDB::LONG_SIZE );
147        if ( _byteSwap ) osg::swapBytes( (char*)&value, osgDB::LONG_SIZE );
148        l = (long)value;
149    }
150
151    virtual void readULong( unsigned long& l )
152    {
153        uint32_t value;
154        _in->read( (char*)&value, osgDB::LONG_SIZE );
155        if ( _byteSwap ) osg::swapBytes( (char*)&value, osgDB::LONG_SIZE );
156        l = (unsigned long)value;
157    }
158
159    virtual void readFloat( float& f )
160    {
161        _in->read( (char*)&f, osgDB::FLOAT_SIZE );
162        if ( _byteSwap ) osg::swapBytes( (char*)&f, osgDB::FLOAT_SIZE );
163    }
164
165    virtual void readDouble( double& d )
166    {
167        _in->read( (char*)&d, osgDB::DOUBLE_SIZE );
168        if ( _byteSwap ) osg::swapBytes( (char*)&d, osgDB::DOUBLE_SIZE );
169    }
170
171    virtual void readString( std::string& s )
172    {
173        int size = 0;
174        readInt( size );
175        if ( size>0 )
176        {
177            s.resize( size );
178            _in->read( (char*)s.c_str(), size );
179        }
180        else if ( size<0 )
181        {
182            throwException( "InputStream::readString() error, negative string size read." );
183        }
184    }
185
186    virtual void readStream( std::istream& (*fn)(std::istream&) ) {}
187
188    virtual void readBase( std::ios_base& (*fn)(std::ios_base&) ) {}
189
190    virtual void readGLenum( osgDB::ObjectGLenum& value )
191    {
192        GLenum e = 0;
193        _in->read( (char*)&e, osgDB::GLENUM_SIZE );
194        if ( _byteSwap ) osg::swapBytes( (char*)&e, osgDB::GLENUM_SIZE );
195        value.set( e );
196    }
197
198    virtual void readProperty( osgDB::ObjectProperty& prop )
199    {
200        int value = 0;
201        if ( prop._mapProperty )
202        {
203            _in->read( (char*)&value, osgDB::INT_SIZE );
204            if ( _byteSwap ) osg::swapBytes( (char*)&value, osgDB::INT_SIZE );
205        }
206        prop.set( value );
207    }
208
209    virtual void readMark( osgDB::ObjectMark& mark ) {}
210
211    virtual void readCharArray( char* s, unsigned int size )
212    { if ( size>0 ) _in->read( s, size ); }
213
214    virtual void readWrappedString( std::string& str )
215    { readString( str ); }
216
217protected:
218};
219
220#endif
Note: See TracBrowser for help on using the browser.