Initial release
This commit is contained in:
+222
@@ -0,0 +1,222 @@
|
||||
//------------------------------------------------------------------------
|
||||
// Project : SDK Base
|
||||
// Version : 1.0
|
||||
//
|
||||
// Category : Helpers
|
||||
// Filename : base/source/fstreamer.h
|
||||
// Created by : Steinberg, 12/2005
|
||||
// Description : Extract of typed stream i/o methods from FStream
|
||||
//
|
||||
//-----------------------------------------------------------------------------
|
||||
// This file is part of a Steinberg SDK. It is subject to the license terms
|
||||
// in the LICENSE file found in the top-level directory of this distribution
|
||||
// and at www.steinberg.net/sdklicenses.
|
||||
// No part of the SDK, including this file, may be copied, modified, propagated,
|
||||
// or distributed except according to the terms contained in the LICENSE file.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "pluginterfaces/base/funknown.h"
|
||||
|
||||
namespace Steinberg {
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
enum FSeekMode
|
||||
{
|
||||
kSeekSet,
|
||||
kSeekCurrent,
|
||||
kSeekEnd
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// FStreamer
|
||||
//------------------------------------------------------------------------
|
||||
/** Byteorder-aware base class for typed stream i/o. */
|
||||
//------------------------------------------------------------------------
|
||||
class FStreamer
|
||||
{
|
||||
public:
|
||||
//------------------------------------------------------------------------
|
||||
FStreamer (int16 byteOrder = BYTEORDER);
|
||||
virtual ~FStreamer () {}
|
||||
|
||||
/** @name Implementing class must override. */
|
||||
///@{
|
||||
virtual TSize readRaw (void*, TSize) = 0; ///< Read one buffer of size.
|
||||
virtual TSize writeRaw (const void*, TSize) = 0; ///< Write one buffer of size.
|
||||
virtual int64 seek (int64, FSeekMode) = 0; ///< Set file position for stream.
|
||||
virtual int64 tell () = 0; ///< Return current file position.
|
||||
///@}
|
||||
|
||||
/** @name Streams are byteOrder aware. */
|
||||
///@{
|
||||
inline void setByteOrder (int32 e) { byteOrder = (int16)e; }
|
||||
inline int32 getByteOrder () const { return byteOrder; }
|
||||
///@}
|
||||
|
||||
/** @name read and write int8 and char. */
|
||||
///@{
|
||||
bool writeChar8 (char8);
|
||||
bool readChar8 (char8&);
|
||||
bool writeUChar8 (unsigned char);
|
||||
bool readUChar8 (unsigned char&);
|
||||
bool writeChar16 (char16 c);
|
||||
bool readChar16 (char16& c);
|
||||
|
||||
bool writeInt8 (int8 c);
|
||||
bool readInt8 (int8& c);
|
||||
bool writeInt8u (uint8 c);
|
||||
bool readInt8u (uint8& c);
|
||||
///@}
|
||||
|
||||
/** @name read and write int16. */
|
||||
///@{
|
||||
bool writeInt16 (int16);
|
||||
bool readInt16 (int16&);
|
||||
bool writeInt16Array (const int16* array, int32 count);
|
||||
bool readInt16Array (int16* array, int32 count);
|
||||
bool writeInt16u (uint16);
|
||||
bool readInt16u (uint16&);
|
||||
bool writeInt16uArray (const uint16* array, int32 count);
|
||||
bool readInt16uArray (uint16* array, int32 count);
|
||||
///@}
|
||||
|
||||
/** @name read and write int32. */
|
||||
///@{
|
||||
bool writeInt32 (int32);
|
||||
bool readInt32 (int32&);
|
||||
bool writeInt32Array (const int32* array, int32 count);
|
||||
bool readInt32Array (int32* array, int32 count);
|
||||
bool writeInt32u (uint32);
|
||||
bool readInt32u (uint32&);
|
||||
bool writeInt32uArray (const uint32* array, int32 count);
|
||||
bool readInt32uArray (uint32* array, int32 count);
|
||||
///@}
|
||||
|
||||
/** @name read and write int64. */
|
||||
///@{
|
||||
bool writeInt64 (int64);
|
||||
bool readInt64 (int64&);
|
||||
bool writeInt64Array (const int64* array, int32 count);
|
||||
bool readInt64Array (int64* array, int32 count);
|
||||
bool writeInt64u (uint64);
|
||||
bool readInt64u (uint64&);
|
||||
bool writeInt64uArray (const uint64* array, int32 count);
|
||||
bool readInt64uArray (uint64* array, int32 count);
|
||||
///@}
|
||||
|
||||
/** @name read and write float and float array. */
|
||||
///@{
|
||||
bool writeFloat (float);
|
||||
bool readFloat (float&);
|
||||
bool writeFloatArray (const float* array, int32 count);
|
||||
bool readFloatArray (float* array, int32 count);
|
||||
///@}
|
||||
|
||||
/** @name read and write double and double array. */
|
||||
///@{
|
||||
bool writeDouble (double);
|
||||
bool readDouble (double&);
|
||||
bool writeDoubleArray (const double* array, int32 count);
|
||||
bool readDoubleArray (double* array, int32 count);
|
||||
///@}
|
||||
|
||||
/** @name read and write Boolean. */
|
||||
///@{
|
||||
bool writeBool (bool); ///< Write one boolean
|
||||
bool readBool (bool&); ///< Read one bool.
|
||||
///@}
|
||||
|
||||
/** @name read and write Strings. */
|
||||
///@{
|
||||
TSize writeString8 (const char8* ptr, bool terminate = false); ///< a direct output function writing only one string (ascii 8bit)
|
||||
TSize readString8 (char8* ptr, TSize size); ///< a direct input function reading only one string (ascii) (ended by a \n or \0 or eof)
|
||||
|
||||
bool writeStr8 (const char8* ptr); ///< write a string length (strlen) and string itself
|
||||
char8* readStr8 (); ///< read a string length and string text (The return string must be deleted when use is finished)
|
||||
|
||||
static int32 getStr8Size (const char8* ptr); ///< returns the size of a saved string
|
||||
|
||||
bool writeStringUtf8 (const tchar* ptr); ///< always terminated, converts to utf8 if non ascii characters are in string
|
||||
int32 readStringUtf8 (tchar* ptr, int32 maxSize); ///< read a UTF8 string
|
||||
///@}
|
||||
|
||||
bool skip (uint32 bytes);
|
||||
bool pad (uint32 bytes);
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
protected:
|
||||
int16 byteOrder;
|
||||
};
|
||||
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
/** FStreamSizeHolder Declaration
|
||||
remembers size of stream chunk for backward compatibility.
|
||||
|
||||
<b>Example:</b>
|
||||
@code
|
||||
externalize (a)
|
||||
{
|
||||
FStreamSizeHolder sizeHolder;
|
||||
sizeHolder.beginWrite (); // sets start mark, writes dummy size
|
||||
a << ....
|
||||
sizeHolder.endWrite (); // jumps to start mark, updates size, jumps back here
|
||||
}
|
||||
|
||||
internalize (a)
|
||||
{
|
||||
FStreamSizeHolder sizeHolder;
|
||||
sizeHolder.beginRead (); // reads size, mark
|
||||
a >> ....
|
||||
sizeHolder.endRead (); // jumps forward if new version has larger size
|
||||
}
|
||||
@endcode
|
||||
*/
|
||||
//------------------------------------------------------------------------
|
||||
class FStreamSizeHolder
|
||||
{
|
||||
public:
|
||||
FStreamSizeHolder (FStreamer &s);
|
||||
|
||||
void beginWrite (); ///< remembers position and writes 0
|
||||
int32 endWrite (); ///< writes and returns size (since the start marker)
|
||||
int32 beginRead (); ///< returns size
|
||||
void endRead (); ///< jump to end of chunk
|
||||
|
||||
protected:
|
||||
FStreamer &stream;
|
||||
int64 sizePos;
|
||||
};
|
||||
|
||||
class IBStream;
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// IBStreamer
|
||||
//------------------------------------------------------------------------
|
||||
/** Wrapper class for typed reading/writing from or to IBStream.
|
||||
Can be used framework-independent in plug-ins. */
|
||||
//------------------------------------------------------------------------
|
||||
class IBStreamer: public FStreamer
|
||||
{
|
||||
public:
|
||||
//------------------------------------------------------------------------
|
||||
/** Constructor for a given IBSTream and a byteOrder. */
|
||||
IBStreamer (IBStream* stream, int16 byteOrder = BYTEORDER);
|
||||
|
||||
IBStream* getStream () { return stream; } ///< Returns the associated IBStream.
|
||||
|
||||
// FStreamer overrides:
|
||||
TSize readRaw (void*, TSize) SMTG_OVERRIDE; ///< Read one buffer of size.
|
||||
TSize writeRaw (const void*, TSize) SMTG_OVERRIDE; ///< Write one buffer of size.
|
||||
int64 seek (int64, FSeekMode) SMTG_OVERRIDE; ///< Set file position for stream.
|
||||
int64 tell () SMTG_OVERRIDE; ///< Return current file position.
|
||||
//------------------------------------------------------------------------
|
||||
protected:
|
||||
IBStream* stream;
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
} // namespace Steinberg
|
||||
Reference in New Issue
Block a user