1 /* 2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Copyright 2011, Rene Gollent, rene@gollent.com. 4 * Distributed under the terms of the MIT License. 5 */ 6 #ifndef _VARIANT_H 7 #define _VARIANT_H 8 9 10 #include <Rect.h> 11 #include <SupportDefs.h> 12 #include <TypeConstants.h> 13 14 #include <Referenceable.h> 15 16 17 enum { 18 B_VARIANT_DONT_COPY_DATA = 0x01, 19 B_VARIANT_OWNS_DATA = 0x02, 20 B_VARIANT_REFERENCEABLE_DATA = 0x04 21 }; 22 23 24 class BMessage; 25 26 27 class BVariant { 28 public: 29 inline BVariant(); 30 inline BVariant(bool value); 31 inline BVariant(int8 value); 32 inline BVariant(uint8 value); 33 inline BVariant(int16 value); 34 inline BVariant(uint16 value); 35 inline BVariant(int32 value); 36 inline BVariant(uint32 value); 37 inline BVariant(int64 value); 38 inline BVariant(uint64 value); 39 inline BVariant(float value); 40 inline BVariant(double value); 41 inline BVariant(const BRect &value); 42 inline BVariant(float left, float top, float right, 43 float bottom); 44 inline BVariant(const void* value); 45 inline BVariant(const char* value, 46 uint32 flags = 0); 47 inline BVariant(BReferenceable* value, type_code type); 48 // type must be a custom type 49 inline BVariant(const BVariant& other); 50 ~BVariant(); 51 52 inline void SetTo(const BVariant& other); 53 inline void SetTo(bool value); 54 inline void SetTo(int8 value); 55 inline void SetTo(uint8 value); 56 inline void SetTo(int16 value); 57 inline void SetTo(uint16 value); 58 inline void SetTo(int32 value); 59 inline void SetTo(uint32 value); 60 inline void SetTo(int64 value); 61 inline void SetTo(uint64 value); 62 inline void SetTo(float value); 63 inline void SetTo(double value); 64 inline void SetTo(const BRect& value); 65 inline void SetTo(float left, float top, float right, 66 float bottom); 67 inline void SetTo(const void* value); 68 inline void SetTo(const char* value, 69 uint32 flags = 0); 70 inline void SetTo(BReferenceable* value, type_code type); 71 // type must be a custom type 72 status_t SetToTypedData(const void* data, 73 type_code type); 74 void Unset(); 75 76 inline BVariant& operator=(const BVariant& other); 77 78 bool operator==(const BVariant& other) const; 79 inline bool operator!=(const BVariant& other) const; 80 81 inline type_code Type() const { return fType; } 82 size_t Size() const; 83 const uint8* Bytes() const; 84 85 inline bool IsNumber() const; 86 inline bool IsInteger(bool* _isSigned = NULL) const; 87 inline bool IsFloat() const; 88 // floating point, not just float 89 90 bool ToBool() const; 91 int8 ToInt8() const; 92 uint8 ToUInt8() const; 93 int16 ToInt16() const; 94 uint16 ToUInt16() const; 95 int32 ToInt32() const; 96 uint32 ToUInt32() const; 97 int64 ToInt64() const; 98 uint64 ToUInt64() const; 99 float ToFloat() const; 100 double ToDouble() const; 101 void* ToPointer() const; 102 const char* ToString() const; 103 BRect ToRect() const; 104 BReferenceable* ToReferenceable() const; 105 106 void SwapEndianess(); 107 // has effect only on scalar types (pointer 108 // counting as scalar, not string, though) 109 110 status_t AddToMessage(BMessage& message, 111 const char* fieldName) const; 112 status_t SetFromMessage(const BMessage& message, 113 const char* fieldName); 114 115 static size_t SizeOfType(type_code type); 116 static bool TypeIsNumber(type_code type); 117 static bool TypeIsInteger(type_code type, 118 bool* _isSigned = NULL); 119 static bool TypeIsFloat(type_code type); 120 121 private: 122 void _SetTo(const BVariant& other); 123 void _SetTo(bool value); 124 void _SetTo(int8 value); 125 void _SetTo(uint8 value); 126 void _SetTo(int16 value); 127 void _SetTo(uint16 value); 128 void _SetTo(int32 value); 129 void _SetTo(uint32 value); 130 void _SetTo(int64 value); 131 void _SetTo(uint64 value); 132 void _SetTo(float value); 133 void _SetTo(double value); 134 void _SetTo(const void* value); 135 void _SetTo(float left, float top, float right, 136 float bottom); 137 bool _SetTo(const char* value, 138 uint32 flags); 139 void _SetTo(BReferenceable* value, type_code type); 140 141 template<typename NumberType> 142 inline NumberType _ToNumber() const; 143 144 private: 145 type_code fType; 146 uint32 fFlags; 147 union { 148 bool fBool; 149 int8 fInt8; 150 uint8 fUInt8; 151 int16 fInt16; 152 uint16 fUInt16; 153 int32 fInt32; 154 uint32 fUInt32; 155 int64 fInt64; 156 uint64 fUInt64; 157 float fFloat; 158 double fDouble; 159 void* fPointer; 160 char* fString; 161 BReferenceable* fReferenceable; 162 struct { 163 float left; 164 float top; 165 float right; 166 float bottom; 167 } fRect; 168 uint8 fBytes[sizeof(float) * 4]; 169 }; 170 }; 171 172 173 BVariant::BVariant() 174 : 175 fType(0), 176 fFlags(0) 177 { 178 } 179 180 181 BVariant::BVariant(bool value) 182 { 183 _SetTo(value); 184 } 185 186 187 BVariant::BVariant(int8 value) 188 { 189 _SetTo(value); 190 } 191 192 193 BVariant::BVariant(uint8 value) 194 { 195 _SetTo(value); 196 } 197 198 199 BVariant::BVariant(int16 value) 200 { 201 _SetTo(value); 202 } 203 204 205 BVariant::BVariant(uint16 value) 206 { 207 _SetTo(value); 208 } 209 210 211 BVariant::BVariant(int32 value) 212 { 213 _SetTo(value); 214 } 215 216 217 BVariant::BVariant(uint32 value) 218 { 219 _SetTo(value); 220 } 221 222 223 BVariant::BVariant(int64 value) 224 { 225 _SetTo(value); 226 } 227 228 229 BVariant::BVariant(uint64 value) 230 { 231 _SetTo(value); 232 } 233 234 235 BVariant::BVariant(float value) 236 { 237 _SetTo(value); 238 } 239 240 241 BVariant::BVariant(double value) 242 { 243 _SetTo(value); 244 } 245 246 247 BVariant::BVariant(const BRect& value) 248 { 249 _SetTo(value.left, value.top, value.right, value.bottom); 250 } 251 252 253 BVariant::BVariant(float left, float top, float right, float bottom) 254 { 255 _SetTo(left, top, right, bottom); 256 } 257 258 259 BVariant::BVariant(const void* value) 260 { 261 _SetTo(value); 262 } 263 264 265 BVariant::BVariant(const char* value, uint32 flags) 266 { 267 _SetTo(value, flags); 268 } 269 270 271 BVariant::BVariant(BReferenceable* value, type_code type) 272 { 273 _SetTo(value, type); 274 } 275 276 277 BVariant::BVariant(const BVariant& other) 278 { 279 _SetTo(other); 280 } 281 282 283 BVariant& 284 BVariant::operator=(const BVariant& other) 285 { 286 Unset(); 287 _SetTo(other); 288 return *this; 289 } 290 291 292 bool 293 BVariant::operator!=(const BVariant& other) const 294 { 295 return !(*this == other); 296 } 297 298 299 void 300 BVariant::SetTo(const BVariant& other) 301 { 302 Unset(); 303 _SetTo(other); 304 } 305 306 307 void 308 BVariant::SetTo(bool value) 309 { 310 Unset(); 311 _SetTo(value); 312 } 313 314 315 void 316 BVariant::SetTo(int8 value) 317 { 318 Unset(); 319 _SetTo(value); 320 } 321 322 323 void 324 BVariant::SetTo(uint8 value) 325 { 326 Unset(); 327 _SetTo(value); 328 } 329 330 331 void 332 BVariant::SetTo(int16 value) 333 { 334 Unset(); 335 _SetTo(value); 336 } 337 338 339 void 340 BVariant::SetTo(uint16 value) 341 { 342 Unset(); 343 _SetTo(value); 344 } 345 346 347 void 348 BVariant::SetTo(int32 value) 349 { 350 Unset(); 351 _SetTo(value); 352 } 353 354 355 void 356 BVariant::SetTo(uint32 value) 357 { 358 Unset(); 359 _SetTo(value); 360 } 361 362 363 void 364 BVariant::SetTo(int64 value) 365 { 366 Unset(); 367 _SetTo(value); 368 } 369 370 371 void 372 BVariant::SetTo(uint64 value) 373 { 374 Unset(); 375 _SetTo(value); 376 } 377 378 379 void 380 BVariant::SetTo(float value) 381 { 382 Unset(); 383 _SetTo(value); 384 } 385 386 387 void 388 BVariant::SetTo(double value) 389 { 390 Unset(); 391 _SetTo(value); 392 } 393 394 395 void 396 BVariant::SetTo(const BRect& value) 397 { 398 Unset(); 399 _SetTo(value.left, value.top, value.right, value.bottom); 400 } 401 402 403 void 404 BVariant::SetTo(float left, float top, float right, float bottom) 405 { 406 Unset(); 407 _SetTo(left, top, right, bottom); 408 } 409 410 411 void 412 BVariant::SetTo(const void* value) 413 { 414 Unset(); 415 _SetTo(value); 416 } 417 418 419 void 420 BVariant::SetTo(const char* value, uint32 flags) 421 { 422 Unset(); 423 _SetTo(value, flags); 424 } 425 426 427 void 428 BVariant::SetTo(BReferenceable* value, type_code type) 429 { 430 Unset(); 431 _SetTo(value, type); 432 } 433 434 435 bool 436 BVariant::IsNumber() const 437 { 438 return TypeIsNumber(fType); 439 } 440 441 442 bool 443 BVariant::IsInteger(bool* _isSigned) const 444 { 445 return TypeIsInteger(fType, _isSigned); 446 } 447 448 449 bool 450 BVariant::IsFloat() const 451 { 452 return TypeIsFloat(fType); 453 } 454 455 456 #endif // _VARIANT_H 457