host/common/win32/svtypes.h (114 lines of code) (raw):
/// @file svtypes.h
/// Defines all the types used by SV software.
///
#ifndef SVTYPES__H
#define SVTYPES__H
#include <errno.h>
#include <limits.h>
#include "svstatus.h"
#include <string.h>
typedef unsigned char SV_UCHAR;
typedef SV_UCHAR *SV_PUCHAR;
typedef unsigned short SV_USHORT;
typedef SV_USHORT *SV_PUSHORT;
typedef unsigned int SV_UINT;
typedef int SV_INT;
typedef long SV_LONG;
typedef unsigned long SV_ULONG;
typedef __int64 SV_LONGLONG;
typedef unsigned __int64 SV_ULONGLONG;
typedef unsigned short SV_WCHAR;
#define LLSPEC "%I64d"
#define ULLSPEC "%I64u"
typedef SV_USHORT SV_EVENT_TYPE;
typedef SV_LONGLONG SV_OFFSET_TYPE;
#define SV_UINT_MAX UINT_MAX
typedef union _SV_LARGE_INTEGER {
struct {
SV_ULONG LowPart;
SV_LONG HighPart;
} u;
SV_LONGLONG QuadPart;
} SV_LARGE_INTEGER;
typedef union _SV_ULARGE_INTEGER {
struct {
SV_ULONG LowPart;
SV_ULONG HighPart;
} u;
SV_ULONGLONG QuadPart;
} SV_ULARGE_INTEGER;
typedef struct _SV_TIME {
SV_USHORT wYear;
SV_USHORT wMonth;
SV_USHORT wDay;
SV_USHORT wHour;
SV_USHORT wMinute;
SV_USHORT wSecond;
SV_USHORT wMilliseconds;
SV_USHORT wMicroseconds;
SV_USHORT wHundrecNanoseconds;
} SV_TIME;
typedef struct tagGUID {
SV_ULONG Data1;
SV_USHORT Data2;
SV_USHORT Data3;
SV_UCHAR Data4[8];
} SV_GUID;
///
/// Discriminated union of error information. Avoiding dynamic dispatch because of the overhead.
///
struct SVERROR
{
enum SVERROR_TYPE { SVERROR_SVSTATUS, SVERROR_ERRNO, SVERROR_NTSTATUS, SVERROR_HRESULT };
SVERROR_TYPE tag;
union tagError {
SVSTATUS SVStatus;
SV_INT unixErrno; // not named `errno' due to macro
SV_ULONG ntstatus;
SV_LONG hr;
} error;
SVERROR() : tag( SVERROR_SVSTATUS ) { error.SVStatus = SVS_OK; }
SVERROR( SVSTATUS theError ) : tag( SVERROR_SVSTATUS ) { error.SVStatus = theError; }
SVERROR( SV_LONG hr ) : tag( SVERROR_HRESULT ) { error.hr = hr; }
SVERROR( SV_ULONG dwError ) : tag( SVERROR_NTSTATUS ) { error.ntstatus = dwError; }
SVERROR( SV_INT unixErrno ) : tag( SVERROR_ERRNO ) { error.unixErrno = unixErrno; }
~SVERROR() {}
bool failed()
{
if( SVERROR_SVSTATUS == tag )
{
return( !( SVS_OK == error.SVStatus || SVS_FALSE == error.SVStatus ) );
}
else if( SVERROR_ERRNO == tag )
{
return( 0 != error.unixErrno );
}
else if( SVERROR_NTSTATUS == tag )
{
return( 0 != error.ntstatus );
}
return( error.hr < 0 );
}
bool succeeded() { return( !failed() ); }
SVERROR_TYPE getTag() { return tag; }
SV_LONG const& operator=( SV_LONG hr ) { tag = SVERROR_HRESULT; return( error.hr = hr ); }
SV_ULONG const& operator=( SV_ULONG dwError ) { tag = SVERROR_NTSTATUS; return( error.ntstatus = dwError ); }
SV_INT const& operator=( SV_INT unixErrno ) { tag = SVERROR_ERRNO; return( error.unixErrno = unixErrno ); }
SVSTATUS const& operator=( SVSTATUS SVStatus ) { tag = SVERROR_SVSTATUS; return( error.SVStatus = SVStatus ); }
bool operator==( const SVERROR& svhr )
{
if( SVERROR_SVSTATUS == tag )
{
return( error.SVStatus == svhr.error.SVStatus );
}
else if( SVERROR_ERRNO == tag )
{
return( error.unixErrno == svhr.error.unixErrno);
}
else if( SVERROR_NTSTATUS == tag )
{
return( error.ntstatus == svhr.error.ntstatus);
}
return( error.hr == svhr.error.hr );
}
bool operator!=( const SVERROR& svhr )
{
return !(operator==(svhr));
}
char const* toString(char * pszError = NULL, const SV_UINT errorLen = 0);
};
#endif // SVTYPES__H