2009-04-22 11:55:26 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
|
|
|
|
* Distributed under the terms of the MIT License.
|
|
|
|
*/
|
|
|
|
|
2009-06-19 23:00:25 +00:00
|
|
|
#include <Variant.h>
|
2009-04-22 11:55:26 +00:00
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
|
|
template<typename NumberType>
|
|
|
|
inline NumberType
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_ToNumber() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::~BVariant()
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
Unset();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::Unset()
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
2009-06-19 23:00:25 +00:00
|
|
|
if ((fFlags & B_VARIANT_OWNS_DATA) != 0) {
|
2009-04-22 11:55:26 +00:00
|
|
|
switch (fType) {
|
|
|
|
case B_STRING_TYPE:
|
|
|
|
free(fString);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fType = 0;
|
|
|
|
fFlags = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-06-19 17:26:59 +00:00
|
|
|
bool
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::IsNumber() const
|
2009-06-19 17:26:59 +00:00
|
|
|
{
|
|
|
|
switch (fType) {
|
|
|
|
case B_INT8_TYPE:
|
|
|
|
case B_UINT8_TYPE:
|
|
|
|
case B_INT16_TYPE:
|
|
|
|
case B_UINT16_TYPE:
|
|
|
|
case B_INT32_TYPE:
|
|
|
|
case B_UINT32_TYPE:
|
|
|
|
case B_INT64_TYPE:
|
|
|
|
case B_UINT64_TYPE:
|
|
|
|
case B_FLOAT_TYPE:
|
|
|
|
case B_DOUBLE_TYPE:
|
|
|
|
return true;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::IsInteger() const
|
2009-06-19 17:26:59 +00:00
|
|
|
{
|
|
|
|
switch (fType) {
|
|
|
|
case B_INT8_TYPE:
|
|
|
|
case B_UINT8_TYPE:
|
|
|
|
case B_INT16_TYPE:
|
|
|
|
case B_UINT16_TYPE:
|
|
|
|
case B_INT32_TYPE:
|
|
|
|
case B_UINT32_TYPE:
|
|
|
|
case B_INT64_TYPE:
|
|
|
|
case B_UINT64_TYPE:
|
|
|
|
return true;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::IsFloat() const
|
2009-06-19 17:26:59 +00:00
|
|
|
{
|
|
|
|
switch (fType) {
|
|
|
|
case B_FLOAT_TYPE:
|
|
|
|
case B_DOUBLE_TYPE:
|
|
|
|
return true;
|
|
|
|
default:
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-04-22 11:55:26 +00:00
|
|
|
int8
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::ToInt8() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
return _ToNumber<int8>();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint8
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::ToUInt8() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
return _ToNumber<uint8>();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int16
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::ToInt16() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
return _ToNumber<int16>();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint16
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::ToUInt16() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
return _ToNumber<uint16>();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int32
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::ToInt32() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
return _ToNumber<int32>();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint32
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::ToUInt32() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
return _ToNumber<uint32>();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int64
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::ToInt64() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
return _ToNumber<int64>();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint64
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::ToUInt64() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
return _ToNumber<uint64>();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
float
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::ToFloat() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
return _ToNumber<float>();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
double
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::ToDouble() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
return _ToNumber<double>();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void*
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::ToPointer() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
return fType == B_POINTER_TYPE ? fString : NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const char*
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::ToString() const
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
return fType == B_STRING_TYPE ? fString : NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(const BVariant& other)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
2009-06-19 23:00:25 +00:00
|
|
|
if ((other.fFlags & B_VARIANT_OWNS_DATA) != 0) {
|
2009-04-22 11:55:26 +00:00
|
|
|
switch (other.fType) {
|
|
|
|
case B_STRING_TYPE:
|
|
|
|
fType = B_STRING_TYPE;
|
|
|
|
fString = strdup(other.fString);
|
2009-06-19 23:00:25 +00:00
|
|
|
fFlags = B_VARIANT_OWNS_DATA;
|
2009-04-22 11:55:26 +00:00
|
|
|
return;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-06-19 23:00:25 +00:00
|
|
|
memcpy(this, &other, sizeof(BVariant));
|
2009-04-22 11:55:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-07-13 18:33:06 +00:00
|
|
|
/*static*/ size_t
|
|
|
|
BVariant::SizeOfType(uint32 type)
|
|
|
|
{
|
|
|
|
switch (type) {
|
|
|
|
case B_INT8_TYPE:
|
|
|
|
return 1;
|
|
|
|
case B_UINT8_TYPE:
|
|
|
|
return 1;
|
|
|
|
case B_INT16_TYPE:
|
|
|
|
return 2;
|
|
|
|
case B_UINT16_TYPE:
|
|
|
|
return 2;
|
|
|
|
case B_INT32_TYPE:
|
|
|
|
return 4;
|
|
|
|
case B_UINT32_TYPE:
|
|
|
|
return 4;
|
|
|
|
case B_INT64_TYPE:
|
|
|
|
return 8;
|
|
|
|
case B_UINT64_TYPE:
|
|
|
|
return 8;
|
|
|
|
case B_FLOAT_TYPE:
|
|
|
|
return sizeof(float);
|
|
|
|
case B_DOUBLE_TYPE:
|
|
|
|
return sizeof(double);
|
|
|
|
case B_POINTER_TYPE:
|
|
|
|
return sizeof(void*);
|
|
|
|
default:
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-04-22 11:55:26 +00:00
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(int8 value)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
fType = B_INT8_TYPE;
|
|
|
|
fFlags = 0;
|
|
|
|
fInt8 = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(uint8 value)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
fType = B_UINT8_TYPE;
|
|
|
|
fFlags = 0;
|
|
|
|
fUInt8 = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(int16 value)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
fType = B_INT16_TYPE;
|
|
|
|
fFlags = 0;
|
|
|
|
fInt16 = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(uint16 value)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
fType = B_UINT16_TYPE;
|
|
|
|
fFlags = 0;
|
|
|
|
fUInt16 = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(int32 value)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
fType = B_INT32_TYPE;
|
|
|
|
fFlags = 0;
|
|
|
|
fInt32 = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(uint32 value)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
fType = B_UINT32_TYPE;
|
|
|
|
fFlags = 0;
|
|
|
|
fUInt32 = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(int64 value)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
fType = B_INT64_TYPE;
|
|
|
|
fFlags = 0;
|
|
|
|
fInt64 = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(uint64 value)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
fType = B_UINT64_TYPE;
|
|
|
|
fFlags = 0;
|
|
|
|
fUInt64 = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(float value)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
fType = B_FLOAT_TYPE;
|
|
|
|
fFlags = 0;
|
|
|
|
fFloat = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(double value)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
fType = B_DOUBLE_TYPE;
|
|
|
|
fFlags = 0;
|
|
|
|
fDouble = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(const void* value)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
fType = B_POINTER_TYPE;
|
|
|
|
fFlags = 0;
|
|
|
|
fPointer = (void*)value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
2009-06-19 23:00:25 +00:00
|
|
|
BVariant::_SetTo(const char* value, uint32 flags)
|
2009-04-22 11:55:26 +00:00
|
|
|
{
|
|
|
|
fType = B_STRING_TYPE;
|
2009-04-22 23:22:16 +00:00
|
|
|
fFlags = 0;
|
2009-04-22 11:55:26 +00:00
|
|
|
|
|
|
|
if (value != NULL) {
|
2009-06-19 23:00:25 +00:00
|
|
|
if ((flags & B_VARIANT_DONT_COPY_DATA) == 0) {
|
2009-04-22 11:55:26 +00:00
|
|
|
fString = strdup(value);
|
2009-06-19 23:00:25 +00:00
|
|
|
fFlags |= B_VARIANT_OWNS_DATA;
|
2009-04-22 11:55:26 +00:00
|
|
|
} else {
|
|
|
|
fString = (char*)value;
|
2009-06-19 23:00:25 +00:00
|
|
|
fFlags |= flags & B_VARIANT_OWNS_DATA;
|
2009-04-22 11:55:26 +00:00
|
|
|
}
|
|
|
|
} else
|
|
|
|
fString = NULL;
|
|
|
|
}
|
|
|
|
|