Added class Variant, a typed union-like wrapper for a single value.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30321 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -12,6 +12,7 @@ Application DebugAnalyzer
|
|||||||
ModelLoader.cpp
|
ModelLoader.cpp
|
||||||
Table.cpp
|
Table.cpp
|
||||||
ThreadsPage.cpp
|
ThreadsPage.cpp
|
||||||
|
Variant.cpp
|
||||||
|
|
||||||
: libcolumnlistview.a libdebug.so be
|
: libcolumnlistview.a libdebug.so be
|
||||||
: DebugAnalyzer.rdef
|
: DebugAnalyzer.rdef
|
||||||
|
|||||||
@@ -0,0 +1,285 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009, Ingo Weinhold, [email protected].
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Variant.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
template<typename NumberType>
|
||||||
|
inline NumberType
|
||||||
|
Variant::_ToNumber() const
|
||||||
|
{
|
||||||
|
switch (fType) {
|
||||||
|
case B_INT8_TYPE:
|
||||||
|
return (NumberType)fInt8;
|
||||||
|
case B_UINT8_TYPE:
|
||||||
|
return (NumberType)fUInt8;
|
||||||
|
case B_INT16_TYPE:
|
||||||
|
return (NumberType)fInt16;
|
||||||
|
case B_UINT16_TYPE:
|
||||||
|
return (NumberType)fUInt16;
|
||||||
|
case B_INT32_TYPE:
|
||||||
|
return (NumberType)fInt32;
|
||||||
|
case B_UINT32_TYPE:
|
||||||
|
return (NumberType)fUInt32;
|
||||||
|
case B_INT64_TYPE:
|
||||||
|
return (NumberType)fInt64;
|
||||||
|
case B_UINT64_TYPE:
|
||||||
|
return (NumberType)fUInt64;
|
||||||
|
case B_FLOAT_TYPE:
|
||||||
|
return (NumberType)fFloat;
|
||||||
|
case B_DOUBLE_TYPE:
|
||||||
|
return (NumberType)fDouble;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::~Variant()
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::Unset()
|
||||||
|
{
|
||||||
|
if ((fFlags & VARIANT_OWNS_DATA) != 0) {
|
||||||
|
switch (fType) {
|
||||||
|
case B_STRING_TYPE:
|
||||||
|
free(fString);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fType = 0;
|
||||||
|
fFlags = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int8
|
||||||
|
Variant::ToInt8() const
|
||||||
|
{
|
||||||
|
return _ToNumber<int8>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8
|
||||||
|
Variant::ToUInt8() const
|
||||||
|
{
|
||||||
|
return _ToNumber<uint8>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int16
|
||||||
|
Variant::ToInt16() const
|
||||||
|
{
|
||||||
|
return _ToNumber<int16>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint16
|
||||||
|
Variant::ToUInt16() const
|
||||||
|
{
|
||||||
|
return _ToNumber<uint16>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
Variant::ToInt32() const
|
||||||
|
{
|
||||||
|
return _ToNumber<int32>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint32
|
||||||
|
Variant::ToUInt32() const
|
||||||
|
{
|
||||||
|
return _ToNumber<uint32>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int64
|
||||||
|
Variant::ToInt64() const
|
||||||
|
{
|
||||||
|
return _ToNumber<int64>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint64
|
||||||
|
Variant::ToUInt64() const
|
||||||
|
{
|
||||||
|
return _ToNumber<uint64>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float
|
||||||
|
Variant::ToFloat() const
|
||||||
|
{
|
||||||
|
return _ToNumber<float>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double
|
||||||
|
Variant::ToDouble() const
|
||||||
|
{
|
||||||
|
return _ToNumber<double>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void*
|
||||||
|
Variant::ToPointer() const
|
||||||
|
{
|
||||||
|
return fType == B_POINTER_TYPE ? fString : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char*
|
||||||
|
Variant::ToString() const
|
||||||
|
{
|
||||||
|
return fType == B_STRING_TYPE ? fString : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(const Variant& other)
|
||||||
|
{
|
||||||
|
if ((other.fFlags & VARIANT_OWNS_DATA) != 0) {
|
||||||
|
switch (other.fType) {
|
||||||
|
case B_STRING_TYPE:
|
||||||
|
fType = B_STRING_TYPE;
|
||||||
|
fString = strdup(other.fString);
|
||||||
|
fFlags = VARIANT_OWNS_DATA;
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(this, &other, sizeof(Variant));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(int8 value)
|
||||||
|
{
|
||||||
|
fType = B_INT8_TYPE;
|
||||||
|
fFlags = 0;
|
||||||
|
fInt8 = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(uint8 value)
|
||||||
|
{
|
||||||
|
fType = B_UINT8_TYPE;
|
||||||
|
fFlags = 0;
|
||||||
|
fUInt8 = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(int16 value)
|
||||||
|
{
|
||||||
|
fType = B_INT16_TYPE;
|
||||||
|
fFlags = 0;
|
||||||
|
fInt16 = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(uint16 value)
|
||||||
|
{
|
||||||
|
fType = B_UINT16_TYPE;
|
||||||
|
fFlags = 0;
|
||||||
|
fUInt16 = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(int32 value)
|
||||||
|
{
|
||||||
|
fType = B_INT32_TYPE;
|
||||||
|
fFlags = 0;
|
||||||
|
fInt32 = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(uint32 value)
|
||||||
|
{
|
||||||
|
fType = B_UINT32_TYPE;
|
||||||
|
fFlags = 0;
|
||||||
|
fUInt32 = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(int64 value)
|
||||||
|
{
|
||||||
|
fType = B_INT64_TYPE;
|
||||||
|
fFlags = 0;
|
||||||
|
fInt64 = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(uint64 value)
|
||||||
|
{
|
||||||
|
fType = B_UINT64_TYPE;
|
||||||
|
fFlags = 0;
|
||||||
|
fUInt64 = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(float value)
|
||||||
|
{
|
||||||
|
fType = B_FLOAT_TYPE;
|
||||||
|
fFlags = 0;
|
||||||
|
fFloat = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(double value)
|
||||||
|
{
|
||||||
|
fType = B_DOUBLE_TYPE;
|
||||||
|
fFlags = 0;
|
||||||
|
fDouble = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(const void* value)
|
||||||
|
{
|
||||||
|
fType = B_POINTER_TYPE;
|
||||||
|
fFlags = 0;
|
||||||
|
fPointer = (void*)value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::_SetTo(const char* value, uint32 flags)
|
||||||
|
{
|
||||||
|
fType = B_STRING_TYPE;
|
||||||
|
|
||||||
|
if (value != NULL) {
|
||||||
|
if ((flags & VARIANT_DONT_COPY_DATA) == 0) {
|
||||||
|
fString = strdup(value);
|
||||||
|
fFlags |= VARIANT_OWNS_DATA;
|
||||||
|
} else {
|
||||||
|
fString = (char*)value;
|
||||||
|
fFlags |= flags & VARIANT_OWNS_DATA;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
fString = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,309 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2009, Ingo Weinhold, [email protected].
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*/
|
||||||
|
#ifndef VARIANT_H
|
||||||
|
#define VARIANT_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <SupportDefs.h>
|
||||||
|
#include <TypeConstants.h>
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
VARIANT_DONT_COPY_DATA = 0x01,
|
||||||
|
VARIANT_OWNS_DATA = 0x02
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Variant {
|
||||||
|
public:
|
||||||
|
inline Variant();
|
||||||
|
inline Variant(int8 value);
|
||||||
|
inline Variant(uint8 value);
|
||||||
|
inline Variant(int16 value);
|
||||||
|
inline Variant(uint16 value);
|
||||||
|
inline Variant(int32 value);
|
||||||
|
inline Variant(uint32 value);
|
||||||
|
inline Variant(int64 value);
|
||||||
|
inline Variant(uint64 value);
|
||||||
|
inline Variant(float value);
|
||||||
|
inline Variant(double value);
|
||||||
|
inline Variant(const void* value);
|
||||||
|
inline Variant(const char* value,
|
||||||
|
uint32 flags = 0);
|
||||||
|
inline Variant(const Variant& other);
|
||||||
|
~Variant();
|
||||||
|
|
||||||
|
inline void SetTo(const Variant& other);
|
||||||
|
inline void SetTo(int8 value);
|
||||||
|
inline void SetTo(uint8 value);
|
||||||
|
inline void SetTo(int16 value);
|
||||||
|
inline void SetTo(uint16 value);
|
||||||
|
inline void SetTo(int32 value);
|
||||||
|
inline void SetTo(uint32 value);
|
||||||
|
inline void SetTo(int64 value);
|
||||||
|
inline void SetTo(uint64 value);
|
||||||
|
inline void SetTo(float value);
|
||||||
|
inline void SetTo(double value);
|
||||||
|
inline void SetTo(const void* value);
|
||||||
|
inline void SetTo(const char* value,
|
||||||
|
uint32 flags = 0);
|
||||||
|
void Unset();
|
||||||
|
|
||||||
|
inline Variant& operator=(const Variant& other);
|
||||||
|
|
||||||
|
type_code Type() const { return fType; }
|
||||||
|
|
||||||
|
int8 ToInt8() const;
|
||||||
|
uint8 ToUInt8() const;
|
||||||
|
int16 ToInt16() const;
|
||||||
|
uint16 ToUInt16() const;
|
||||||
|
int32 ToInt32() const;
|
||||||
|
uint32 ToUInt32() const;
|
||||||
|
int64 ToInt64() const;
|
||||||
|
uint64 ToUInt64() const;
|
||||||
|
float ToFloat() const;
|
||||||
|
double ToDouble() const;
|
||||||
|
void* ToPointer() const;
|
||||||
|
const char* ToString() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void _SetTo(const Variant& other);
|
||||||
|
void _SetTo(int8 value);
|
||||||
|
void _SetTo(uint8 value);
|
||||||
|
void _SetTo(int16 value);
|
||||||
|
void _SetTo(uint16 value);
|
||||||
|
void _SetTo(int32 value);
|
||||||
|
void _SetTo(uint32 value);
|
||||||
|
void _SetTo(int64 value);
|
||||||
|
void _SetTo(uint64 value);
|
||||||
|
void _SetTo(float value);
|
||||||
|
void _SetTo(double value);
|
||||||
|
void _SetTo(const void* value);
|
||||||
|
void _SetTo(const char* value,
|
||||||
|
uint32 flags);
|
||||||
|
|
||||||
|
template<typename NumberType>
|
||||||
|
inline NumberType _ToNumber() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
type_code fType;
|
||||||
|
uint32 fFlags;
|
||||||
|
union {
|
||||||
|
int8 fInt8;
|
||||||
|
uint8 fUInt8;
|
||||||
|
int16 fInt16;
|
||||||
|
uint16 fUInt16;
|
||||||
|
int32 fInt32;
|
||||||
|
uint32 fUInt32;
|
||||||
|
int64 fInt64;
|
||||||
|
uint64 fUInt64;
|
||||||
|
float fFloat;
|
||||||
|
double fDouble;
|
||||||
|
void* fPointer;
|
||||||
|
char* fString;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant()
|
||||||
|
:
|
||||||
|
fType(0),
|
||||||
|
fFlags(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(int8 value)
|
||||||
|
{
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(uint8 value)
|
||||||
|
{
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(int16 value)
|
||||||
|
{
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(uint16 value)
|
||||||
|
{
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(int32 value)
|
||||||
|
{
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(uint32 value)
|
||||||
|
{
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(int64 value)
|
||||||
|
{
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(uint64 value)
|
||||||
|
{
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(float value)
|
||||||
|
{
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(double value)
|
||||||
|
{
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(const void* value)
|
||||||
|
{
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(const char* value, uint32 flags)
|
||||||
|
{
|
||||||
|
_SetTo(value, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant::Variant(const Variant& other)
|
||||||
|
{
|
||||||
|
_SetTo(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Variant&
|
||||||
|
Variant::operator=(const Variant& other)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(other);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(const Variant& other)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(int8 value)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(uint8 value)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(int16 value)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(uint16 value)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(int32 value)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(uint32 value)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(int64 value)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(uint64 value)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(float value)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(double value)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(const void* value)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Variant::SetTo(const char* value, uint32 flags)
|
||||||
|
{
|
||||||
|
Unset();
|
||||||
|
_SetTo(value, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // VARIANT_H
|
||||||
Reference in New Issue
Block a user