8#ifndef INCLUDED_BDLD_DATUM
9#define INCLUDED_BDLD_DATUM
678#include <bdlscm_version.h>
687#include <bdldfp_decimal.fwd.h>
688#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
718#include <bsl_algorithm.h>
719#include <bsl_climits.h>
720#include <bsl_cstddef.h>
721#include <bsl_cstring.h>
722#include <bsl_iosfwd.h>
723#include <bsl_limits.h>
724#include <bsl_string.h>
725#include <bsl_utility.h>
727#if !defined(BSLS_PLATFORM_CPU_32_BIT) && !defined(BSLS_PLATFORM_CPU_64_BIT)
728 #error 'bdld::Datum' supports 32- or 64-bit platforms only.
732#ifdef BSLS_PLATFORM_CMP_MSVC
733 #define BDLD_DATUM_FORCE_INLINE __forceinline
735 #define BDLD_DATUM_FORCE_INLINE inline
758template <
class t_WANT_TO_BE_DEPENDENT,
class t_ALREADY_DEPENDENT>
760 typedef t_WANT_TO_BE_DEPENDENT
type;
829#ifndef BDE_OMIT_INTERNAL_DEPRECATED
841#ifdef BSLS_PLATFORM_CPU_32_BIT
848 enum InternalDataType {
851 , e_INTERNAL_LONGEST_SHORTSTRING = 1
852 , e_INTERNAL_BOOLEAN = 2
853 , e_INTERNAL_SHORTSTRING = 3
854 , e_INTERNAL_STRING = 4
855 , e_INTERNAL_DATE = 5
856 , e_INTERNAL_TIME = 6
857 , e_INTERNAL_DATETIME = 7
858 , e_INTERNAL_DATETIME_INTERVAL = 8
859 , e_INTERNAL_INTEGER = 9
860 , e_INTERNAL_INTEGER64 = 10
861 , e_INTERNAL_USERDEFINED = 11
862 , e_INTERNAL_ARRAY = 12
863 , e_INTERNAL_STRING_REFERENCE = 13
864 , e_INTERNAL_ARRAY_REFERENCE = 14
865 , e_INTERNAL_EXTENDED = 15
866 , e_INTERNAL_DOUBLE = 16
874 k_NUM_INTERNAL_TYPES = 17
880 enum ExtendedInternalDataType {
881 e_EXTENDED_INTERNAL_MAP = 0
884 , e_EXTENDED_INTERNAL_OWNED_MAP = 1
887 , e_EXTENDED_INTERNAL_NAN2 = 2
889 , e_EXTENDED_INTERNAL_ERROR = 3
891 , e_EXTENDED_INTERNAL_ERROR_ALLOC = 4
897 , e_EXTENDED_INTERNAL_SREF_ALLOC = 5
899 , e_EXTENDED_INTERNAL_AREF_ALLOC = 6
901 , e_EXTENDED_INTERNAL_DATETIME_ALLOC = 7
903 , e_EXTENDED_INTERNAL_DATETIME_INTERVAL_ALLOC = 8
906 , e_EXTENDED_INTERNAL_INTEGER64_ALLOC = 9
908 , e_EXTENDED_INTERNAL_BINARY_ALLOC = 10
910 , e_EXTENDED_INTERNAL_DECIMAL64 = 11
912 , e_EXTENDED_INTERNAL_DECIMAL64_SPECIAL = 12
914 , e_EXTENDED_INTERNAL_DECIMAL64_ALLOC = 13
916 , e_EXTENDED_INTERNAL_NIL = 14
918 , e_EXTENDED_INTERNAL_INT_MAP = 15
926 k_NUM_EXTENDED_INTERNAL_TYPES = 16
932 static const unsigned short k_DOUBLE_MASK = 0x7ff0U;
939 static const int k_SHORTSTRING_SIZE = 6;
943 static const int k_TYPE_MASK_BITS = 16;
947 static const short k_DATETIME_OFFSET_FROM_EPOCH = 18262;
960#ifdef BSLS_PLATFORM_IS_LITTLE_ENDIAN
962 static const int k_EXPONENT_OFFSET = 6;
965 static const int k_EXPONENT_LSB = k_EXPONENT_OFFSET;
967 static const int k_EXPONENT_MSB = k_EXPONENT_OFFSET + 1;
969 static const int k_DATA_OFFSET = 0;
972 static const int k_SHORTSTRING_OFFSET = 0;
975 static const int k_SHORT_OFFSET = 4;
981 static const int k_MASK_OFFSET = 4;
985 static const int k_NEARDATE_OFFSET = 4;
989 static const int k_TIME_OFFSET = 0;
993 static const int k_EXPONENT_OFFSET = 0;
996 static const int k_EXPONENT_LSB = k_EXPONENT_OFFSET + 1;
998 static const int k_EXPONENT_MSB = k_EXPONENT_OFFSET;
1000 static const int k_DATA_OFFSET = 4;
1003 static const int k_SHORTSTRING_OFFSET = 2;
1006 static const int k_SHORT_OFFSET = 2;
1012 static const int k_MASK_OFFSET = 0;
1016 static const int k_NEARDATE_OFFSET = 2;
1020 static const int k_TIME_OFFSET = 4;
1027 e_DECIMAL64_SPECIAL_NAN,
1028 e_DECIMAL64_SPECIAL_INFINITY,
1029 e_DECIMAL64_SPECIAL_NEGATIVE_INFINITY
1035 struct ShortString5 {
1037#ifdef BSLS_PLATFORM_IS_LITTLE_ENDIAN
1040 unsigned short d_exponent;
1042 unsigned short d_exponent;
1048 struct ShortString6 {
1050#ifdef BSLS_PLATFORM_IS_LITTLE_ENDIAN
1052 unsigned short d_exponent;
1054 unsigned short d_exponent;
1059 struct TypedAccess {
1130#ifdef BSLS_PLATFORM_IS_LITTLE_ENDIAN
1137 unsigned short d_ushort;
1139 unsigned short d_exponent;
1141 unsigned short d_exponent;
1144 unsigned short d_ushort;
1153 struct ExponentAccess {
1155#ifdef BSLS_PLATFORM_IS_LITTLE_ENDIAN
1156 unsigned int d_dummy;
1157 unsigned int d_value;
1159 unsigned int d_value;
1160 unsigned int d_dummy;
1171 ShortString5 d_string5;
1173 ShortString6 d_string6;
1178 ExponentAccess d_exp;
1189 static Datum createExtendedDataObject(ExtendedInternalDataType
type,
1191 static Datum createExtendedDataObject(ExtendedInternalDataType
type,
1201 ExtendedInternalDataType extendedInternalType()
const;
1206 DataType typeFromExtendedInternalType()
const;
1214 DatumArrayRef theLongArrayReference()
const;
1232 enum InternalDataType {
1233 e_INTERNAL_UNINITIALIZED = 0,
1239 e_INTERNAL_BOOLEAN = 3,
1241 e_INTERNAL_SHORTSTRING = 4,
1243 e_INTERNAL_STRING = 5,
1245 e_INTERNAL_DATE = 6,
1247 e_INTERNAL_TIME = 7,
1249 e_INTERNAL_DATETIME = 8,
1251 e_INTERNAL_DATETIME_INTERVAL = 9,
1253 e_INTERNAL_INTEGER = 10,
1255 e_INTERNAL_INTEGER64 = 11,
1257 e_INTERNAL_USERDEFINED = 12,
1259 e_INTERNAL_ARRAY = 13,
1261 e_INTERNAL_STRING_REFERENCE = 14,
1263 e_INTERNAL_ARRAY_REFERENCE = 15,
1265 e_INTERNAL_DOUBLE = 16,
1267 e_INTERNAL_MAP = 17,
1270 e_INTERNAL_OWNED_MAP = 18,
1273 e_INTERNAL_ERROR = 19,
1275 e_INTERNAL_ERROR_ALLOC = 20,
1277 e_INTERNAL_BINARY = 21,
1279 e_INTERNAL_BINARY_ALLOC = 22,
1281 e_INTERNAL_DECIMAL64 = 23,
1283 e_INTERNAL_INT_MAP = 24,
1286 e_INTERNAL_LONGEST_SHORTSTRING = 25
1293 k_NUM_INTERNAL_TYPES = 25
1299 static const int k_SHORTSTRING_SIZE = 15;
1304 static const int k_SMALLBINARY_SIZE_OFFSET = 15;
1309 static const int k_SMALLBINARY_SIZE = 14;
1321 struct TypedAccess {
1350 static Datum createDatum(InternalDataType
type,
void *data);
1354 static Datum createDatum(InternalDataType
type,
int data);
1361 void* theInlineStorage();
1365 void* theAlignedInlineStorage();
1368 const void* theInlineStorage()
const;
1372 const void* theAlignedInlineStorage()
const;
1392 bsl::size_t nBytes)
const;
1403 bsl::size_t alignment)
const;
1409 template <
class t_TYPE>
1410 t_TYPE *allocatedPtr()
const;
1414 InternalDataType internalType()
const;
1464 bsl::size_t theMapAllocNumBytes()
const;
1465 bsl::size_t theIntMapAllocNumBytes()
const;
1466 bsl::size_t theErrorAllocNumBytes()
const;
1467 bsl::size_t theBinaryAllocNumBytes()
const;
1468 bsl::size_t theInternalStringAllocNumBytes()
const;
1469 bsl::size_t theInternalArrayAllocNumBytes()
const;
1883 template <
class t_VISITOR>
1884 void apply(t_VISITOR& visitor)
const;
2091 bsl::ostream&
print(bsl::ostream& stream,
2093 int spacesPerLevel = 4)
const;
2095#ifndef BDE_OMIT_INTERNAL_DEPRECATED
2206template <
class t_HASH_ALGORITHM>
2589 const Datum *d_data_p;
2699 int spacesPerLevel = 4) const;
2764 void setKey(
int key);
2767 void setValue(
const Datum& value);
2775 const Datum& value()
const;
2791 bsl::ostream&
print(bsl::ostream& stream,
2793 int spacesPerLevel = 4)
const;
2945 bool isSorted() const;
2972 int spacesPerLevel = 4) const;
3037 void setValue(
const Datum& value);
3045 const Datum& value()
const;
3061 bsl::ostream&
print(bsl::ostream& stream,
3063 int spacesPerLevel = 4)
const;
3217 bool isSorted() const;
3222 bool ownsKeys() const;
3249 int spacesPerLevel = 4) const;
3292 template <
class t_TYPE>
3293 static t_TYPE load(
const void *source,
int offset);
3297 template <
class t_TYPE>
3298 static t_TYPE store(
void *destination,
int offset, t_TYPE value);
3301#ifdef BSLS_PLATFORM_CPU_32_BIT
3313#ifdef BSLS_PLATFORM_IS_LITTLE_ENDIAN
3314 static const int b00 = 0;
3315 static const int b32 = 4;
3316 static const int b48 = 6;
3318 static const int b00 = 4;
3319 static const int b32 = 2;
3320 static const int b48 = 0;
3362template <
class t_TYPE>
3364t_TYPE Datum_Helpers::load(
const void *source,
int offset)
3368 return *
static_cast<const t_TYPE *
>(
3369 static_cast<const void *
>(
3370 static_cast<const char *
>(source) + offset));
3373template <
class t_TYPE>
3375t_TYPE Datum_Helpers::store(
void *destination,
int offset, t_TYPE value)
3379 return *
static_cast<t_TYPE *
>(
3380 static_cast<void *
>(
3381 static_cast<char *
>(destination) + offset)) = value;
3384#ifdef BSLS_PLATFORM_CPU_32_BIT
3396 store<short>(&value, b48, store<short>(&value, b32, high16) < 0 ? -1 : 0);
3397 store<long> (&value, b00, low32);
3410 if ((load<short>(&value, b48) == 0 && load<short>(&value, b32) >= 0) ||
3411 (load<short>(&value, b48) == -1 && load<short>(&value, b32) < 0)) {
3412 *phigh16 = load<short>(&value, b32);
3413 *plow32 = load<long> (&value, b00);
3424 store<short>(&value, b48, 0);
3425 store<short>(&value, b32, high16);
3426 store<long>(&value, b00, low32);
3439 if (load<short>(&value, b48) == 0) {
3440 *phigh16 = load<short>(&value, b32);
3441 *plow32 = load<long>(&value, b00);
3455#ifdef BSLS_PLATFORM_CPU_32_BIT
3459Datum Datum::createExtendedDataObject(ExtendedInternalDataType type,
3463 result.d_exp.d_value = (k_DOUBLE_MASK | e_INTERNAL_EXTENDED)
3464 << k_TYPE_MASK_BITS | type;
3465 result.d_as.d_cvp =
data;
3470Datum Datum::createExtendedDataObject(ExtendedInternalDataType type,
3474 result.d_exp.d_value = (k_DOUBLE_MASK | e_INTERNAL_EXTENDED)
3475 << k_TYPE_MASK_BITS | type;
3476 result.d_as.d_int =
data;
3483Datum::ExtendedInternalDataType Datum::extendedInternalType()
const
3486 return static_cast<ExtendedInternalDataType
>(d_as.d_short);
3490Datum::DataType Datum::typeFromExtendedInternalType()
const
3494 static const DataType convert[] = {
3503 , Datum::e_DATETIME_INTERVAL
3505 , Datum::e_INTEGER64
3507 , Datum::e_DECIMAL64
3508 , Datum::e_DECIMAL64
3509 , Datum::e_DECIMAL64
3515 k_NUM_EXTENDED_INTERNAL_TYPES);
3517 const ExtendedInternalDataType type = extendedInternalType();
3520 static_cast<int>(k_NUM_EXTENDED_INTERNAL_TYPES));
3524#ifdef BSLS_PLATFORM_CMP_GNU
3525# pragma GCC diagnostic push
3526# pragma GCC diagnostic ignored "-Warray-bounds"
3528 return convert[type];
3529#ifdef BSLS_PLATFORM_CMP_GNU
3530# pragma GCC diagnostic pop
3539 extendedInternalType() == e_EXTENDED_INTERNAL_INTEGER64_ALLOC);
3540 return Datum_Helpers::load<bsls::Types::Int64>(d_as.d_cvp, 0);
3544DatumArrayRef Datum::theLongArrayReference()
const
3546 return DatumArrayRef(
3547 Datum_Helpers::load<Datum *> (d_as.d_cvp, 0),
3548 Datum_Helpers::load<SizeType>(d_as.d_cvp,
sizeof(Datum *)));
3555 Datum_Helpers::load<char *> (d_as.d_cvp, 0),
3556 Datum_Helpers::load<SizeType>(d_as.d_cvp,
sizeof(
char *)));
3563 return Datum_Helpers32::loadSmallInt64(d_as.d_short, d_as.d_int);
3570Datum Datum::createDatum(InternalDataType type,
void *data)
3573 result.d_as.d_type = type;
3574 result.d_as.d_ptr =
data;
3579Datum Datum::createDatum(InternalDataType type,
int data)
3582 result.d_as.d_type = type;
3583 result.d_as.d_int64 =
data;
3591void* Datum::theInlineStorage()
3593 return d_data.buffer() + 1;
3597void* Datum::theAlignedInlineStorage()
3599 return d_data.buffer() + 8;
3603const void* Datum::theInlineStorage()
const
3605 return d_data.buffer() + 1;
3609const void* Datum::theAlignedInlineStorage()
const
3611 return d_data.buffer() + 8;
3620void Datum::safeDeallocateBytes(
const AllocatorType& allocator,
3621 bsl::size_t nBytes)
const
3623 void *ptr = allocatedPtr<void>();
3626 AllocUtil::deallocateBytes(allocator, ptr, nBytes);
3631void Datum::safeDeallocateBytes(
const AllocatorType& allocator,
3633 bsl::size_t alignment)
const
3635 void *ptr = allocatedPtr<void>();
3638 AllocUtil::deallocateBytes(allocator, ptr, nBytes, alignment);
3642template <
class t_TYPE>
3644t_TYPE *Datum::allocatedPtr()
const
3646#ifdef BSLS_PLATFORM_CPU_32_BIT
3647 return static_cast<t_TYPE *
>(
const_cast<void*
>(d_as.d_cvp));
3649 return static_cast<t_TYPE *
>(d_as.d_ptr);
3653Datum::InternalDataType Datum::internalType()
const
3655#ifdef BSLS_PLATFORM_CPU_32_BIT
3656 if (0x7f == d_data[k_EXPONENT_MSB] &&
3657 0xf0 == (d_data[k_EXPONENT_LSB] & 0xf0)) {
3658 return static_cast<InternalDataType
>(d_data[k_EXPONENT_LSB] & 0x0f);
3660 return e_INTERNAL_DOUBLE;
3662 return static_cast<InternalDataType
>(d_as.d_type);
3667DatumArrayRef Datum::theArrayReference()
const
3669#ifdef BSLS_PLATFORM_CPU_32_BIT
3670 return DatumArrayRef(allocatedPtr<const Datum>(), d_as.d_ushort);
3672 return DatumArrayRef(allocatedPtr<const Datum>(), d_as.d_int32);
3677DatumArrayRef Datum::theInternalArray()
const
3679 const Datum *
data = allocatedPtr<const Datum>();
3681 const SizeType
size = *
reinterpret_cast<const SizeType *
>(
data);
3682 return DatumArrayRef(data + 1, size);
3684 return DatumArrayRef(0, 0);
3690#ifdef BSLS_PLATFORM_CPU_32_BIT
3691 const char *
data = allocatedPtr<const char>();
3693 Datum_Helpers::load<SizeType>(data, 0));
3703#ifdef BSLS_PLATFORM_CPU_32_BIT
3706 const char *str =
reinterpret_cast<const char *
>(theInlineStorage());
3707 const SizeType len = *str++;
3715#ifdef BSLS_PLATFORM_CPU_32_BIT
3718 const char* str =
reinterpret_cast<const char*
>(theInlineStorage());
3727#ifdef BSLS_PLATFORM_CPU_32_BIT
3735bsl::size_t Datum::theMapAllocNumBytes()
const
3740 const Datum_MapHeader *header = allocatedPtr<const Datum_MapHeader>();
3742 return header ? header->d_allocatedSize : 0;
3746bsl::size_t Datum::theIntMapAllocNumBytes()
const
3751 const Datum_IntMapHeader *hdr = allocatedPtr<const Datum_IntMapHeader>();
3753 return hdr ? (hdr->d_capacity + 1) *
sizeof(DatumIntMapEntry) : 0;
3757bsl::size_t Datum::theErrorAllocNumBytes()
const
3761#ifdef BSLS_PLATFORM_CPU_32_BIT
3767 e_EXTENDED_INTERNAL_ERROR_ALLOC == extendedInternalType());
3772 const char*
data = allocatedPtr<const char>();
3774 const bsl::size_t msgLen = Datum_Helpers::load<int>(data,
sizeof(
int));
3775 const bsl::size_t align =
sizeof(int);
3776 const bsl::size_t headLen = 2 *
sizeof(int);
3778 return headLen + ((msgLen + align - 1) & ~(align - 1));
3782bsl::size_t Datum::theBinaryAllocNumBytes()
const
3786#ifdef BSLS_PLATFORM_CPU_32_BIT
3788 e_EXTENDED_INTERNAL_BINARY_ALLOC == extendedInternalType());
3789 return *allocatedPtr<const SizeType>() +
sizeof(double);
3792 return d_as.d_int32;
3797bsl::size_t Datum::theInternalStringAllocNumBytes()
const
3802#ifdef BSLS_PLATFORM_CPU_32_BIT
3803 const char *
data = allocatedPtr<const char>();
3804 const bsl::size_t msgLen = Datum_Helpers::load<SizeType>(data, 0);
3805 const bsl::size_t align =
sizeof(SizeType);
3806 const bsl::size_t headLen =
sizeof(SizeType);
3808 return headLen + ((msgLen + align - 1) & ~(align - 1));
3811 return d_as.d_int32;
3816bsl::size_t Datum::theInternalArrayAllocNumBytes()
const
3821 const Datum *
data = allocatedPtr<const Datum>();
3823 const bsl::size_t length = *
reinterpret_cast<const SizeType*
>(
data);
3824 return (length + 1) *
sizeof(Datum);
3838#ifdef BSLS_PLATFORM_CPU_32_BIT
3842 if (bsl::numeric_limits<unsigned short>::max() >= length) {
3844 result.
d_as.d_exponent = k_DOUBLE_MASK | e_INTERNAL_ARRAY_REFERENCE;
3845 result.
d_as.d_ushort =
static_cast<unsigned short>(length);
3846 result.
d_as.d_cvp = array;
3850 void *mem = AllocUtil::allocateBytes(allocator,
3851 sizeof(array) +
sizeof(length));
3852 Datum_Helpers::store<const Datum *>(mem, 0, array);
3853 Datum_Helpers::store<SizeType> (mem,
sizeof(array), length);
3855 return createExtendedDataObject(e_EXTENDED_INTERNAL_AREF_ALLOC, mem);
3859 BSLS_ASSERT(length <= bsl::numeric_limits<unsigned int>::max());
3862 result.
d_as.d_type = e_INTERNAL_ARRAY_REFERENCE;
3863 result.
d_as.d_int32 =
static_cast<int>(length);
3864 result.
d_as.d_ptr =
reinterpret_cast<void*
>(
const_cast<Datum*
>(array));
3873 return createArrayReference(value.
data(), value.
length(), allocator);
3880#ifdef BSLS_PLATFORM_CPU_32_BIT
3881 result.d_exp.d_value = (k_DOUBLE_MASK | e_INTERNAL_BOOLEAN)
3882 << k_TYPE_MASK_BITS;
3883 result.
d_as.d_int = value;
3885 result.
d_as.d_type = e_INTERNAL_BOOLEAN;
3886 result.
d_as.d_int32 = value;
3895#ifdef BSLS_PLATFORM_CPU_32_BIT
3899 result.d_exp.d_value = (k_DOUBLE_MASK | e_INTERNAL_DATE)
3900 << k_TYPE_MASK_BITS;
3903 result.
d_as.d_type = e_INTERNAL_DATE;
3904 new (result.theAlignedInlineStorage())
bdlt::Date(value);
3914#ifdef BSLS_PLATFORM_CPU_32_BIT
3917 const int dateOffsetFromEpoch =
3919 - k_DATETIME_OFFSET_FROM_EPOCH;
3920 const short shortDateOffsetFromEpoch =
3921 static_cast<short>(dateOffsetFromEpoch);
3923 if (
static_cast<int>(shortDateOffsetFromEpoch) == dateOffsetFromEpoch &&
3925 result.d_exp.d_value =
3926 (k_DOUBLE_MASK | e_INTERNAL_DATETIME) << k_TYPE_MASK_BITS
3927 | (0xffff & dateOffsetFromEpoch);
3937 void *mem = AllocUtil::newObject<bdlt::Datetime>(allocator, value);
3938 result = createExtendedDataObject(e_EXTENDED_INTERNAL_DATETIME_ALLOC,
3944 result.
d_as.d_type = e_INTERNAL_DATETIME;
3955#ifdef BSLS_PLATFORM_CPU_32_BIT
3960 Datum_Helpers32::storeSmallInt64(msValue,
3961 &result.
d_as.d_short,
3962 &result.
d_as.d_int)) {
3963 result.
d_as.d_exponent = k_DOUBLE_MASK | e_INTERNAL_DATETIME_INTERVAL;
3965 void *mem = AllocUtil::newObject<bdlt::DatetimeInterval>(allocator,
3967 result = createExtendedDataObject(
3968 e_EXTENDED_INTERNAL_DATETIME_INTERVAL_ALLOC,
3974 result.
d_as.d_type = e_INTERNAL_DATETIME_INTERVAL;
3975 result.
d_as.d_int32 = value.
days();
3985#ifdef BSLS_PLATFORM_CPU_32_BIT
3988 return createExtendedDataObject(e_EXTENDED_INTERNAL_NAN2, 0);
3990 result.d_double = value;
3993 result.
d_as.d_type = e_INTERNAL_DOUBLE;
3994 result.
d_as.d_double = value;
4002#ifdef BSLS_PLATFORM_CPU_32_BIT
4003 return createExtendedDataObject(e_EXTENDED_INTERNAL_ERROR, code);
4005 return createDatum(e_INTERNAL_ERROR, code);
4013#ifdef BSLS_PLATFORM_CPU_32_BIT
4014 result.d_exp.d_value = (k_DOUBLE_MASK | e_INTERNAL_INTEGER)
4015 << k_TYPE_MASK_BITS;
4016 result.
d_as.d_int = value;
4018 result.
d_as.d_type = e_INTERNAL_INTEGER;
4019 result.
d_as.d_int32 = value;
4029#ifdef BSLS_PLATFORM_CPU_32_BIT
4030 if (Datum_Helpers32::storeSmallInt64(value,
4031 &result.
d_as.d_short,
4032 &result.
d_as.d_int)) {
4033 result.
d_as.d_exponent = k_DOUBLE_MASK | e_INTERNAL_INTEGER64;
4035 void *mem = AllocUtil::newObject<bsls::Types::Int64>(allocator, value);
4036 result = createExtendedDataObject(e_EXTENDED_INTERNAL_INTEGER64_ALLOC,
4042 result.
d_as.d_type = e_INTERNAL_INTEGER64;
4043 result.
d_as.d_int64 = value;
4052#ifdef BSLS_PLATFORM_CPU_32_BIT
4056 result.
d_as.d_exponent = k_DOUBLE_MASK | Datum::e_INTERNAL_EXTENDED;
4057 result.
d_as.d_ushort = e_EXTENDED_INTERNAL_NIL;
4059 result.
d_as.d_type = e_INTERNAL_NIL;
4065Datum Datum::createStringRef(
const char *
string,
4071#ifdef BSLS_PLATFORM_CPU_32_BIT
4075 if (bsl::numeric_limits<unsigned short>::max() >= length) {
4077 result.d_exp.d_value = (k_DOUBLE_MASK | e_INTERNAL_STRING_REFERENCE)
4078 << k_TYPE_MASK_BITS | length;
4079 result.
d_as.d_cvp = string;
4083 void *mem = AllocUtil::allocateBytes(allocator,
4084 sizeof(length) +
sizeof(
string));
4085 Datum_Helpers::store<const char *>(mem, 0,
string);
4086 Datum_Helpers::store<SizeType> (mem,
sizeof(
string), length);
4088 return createExtendedDataObject(e_EXTENDED_INTERNAL_SREF_ALLOC, mem);
4092 BSLS_ASSERT(length <= bsl::numeric_limits<unsigned int>::max());
4095 result.
d_as.d_type = e_INTERNAL_STRING_REFERENCE;
4096 result.
d_as.d_int32 =
static_cast<int>(length);
4097 result.
d_as.d_ptr =
const_cast<char*
>(string);
4103Datum Datum::createStringRef(
const char *
string,
4108 return createStringRef(
string, bsl::strlen(
string), allocator);
4115 return createStringRef(value.
data(), value.
length(), allocator);
4122#ifdef BSLS_PLATFORM_CPU_32_BIT
4123 result.d_exp.d_value = (k_DOUBLE_MASK | e_INTERNAL_TIME)
4124 << k_TYPE_MASK_BITS;
4127 *
reinterpret_cast<bdlt::Time*
>(&rawTime) = value;
4128 const bool rc = Datum_Helpers32::storeInt48(rawTime,
4129 &result.
d_as.d_short,
4130 &result.
d_as.d_int);
4133 result.
d_as.d_type = e_INTERNAL_TIME;
4134 new (result.theAlignedInlineStorage())
bdlt::Time(value);
4140Datum Datum::createUdt(
void *data,
int type)
4145#ifdef BSLS_PLATFORM_CPU_32_BIT
4146 result.
d_as.d_exponent = k_DOUBLE_MASK | e_INTERNAL_USERDEFINED;
4147 result.
d_as.d_ushort =
static_cast<unsigned short>(type);
4148 result.
d_as.d_cvp = data;
4150 result.
d_as.d_type = e_INTERNAL_USERDEFINED;
4151 result.
d_as.d_int32 = type;
4152 result.
d_as.d_ptr = data;
4165#ifdef BSLS_PLATFORM_CPU_32_BIT
4166 result.
d_as.d_exponent = k_DOUBLE_MASK | e_INTERNAL_ARRAY;
4169 result.
d_as.d_type = e_INTERNAL_ARRAY;
4182#ifdef BSLS_PLATFORM_CPU_32_BIT
4183 return createExtendedDataObject(e_EXTENDED_INTERNAL_MAP, map.
size());
4185 return createDatum(e_INTERNAL_MAP, map.
size());
4196#ifdef BSLS_PLATFORM_CPU_32_BIT
4197 return createExtendedDataObject(e_EXTENDED_INTERNAL_INT_MAP, map.
size());
4199 return createDatum(e_INTERNAL_INT_MAP, map.
size());
4210#ifdef BSLS_PLATFORM_CPU_32_BIT
4211 return createExtendedDataObject(e_EXTENDED_INTERNAL_OWNED_MAP,
4214 return createDatum(e_INTERNAL_OWNED_MAP, map.
size());
4222 return copyString(value.
data(), value.
length(), allocator);
4232 AllocUtil::deallocateBytes(allocator, ptr,
4246 AllocUtil::deallocateBytes(
4267void Datum::disposeUninitializedMap(
4282bool Datum::isArray()
const
4284 return (e_ARRAY == type());
4288bool Datum::isBinary()
const
4290 return (e_BINARY == type());
4294bool Datum::isBoolean()
const
4296#ifdef BSLS_PLATFORM_CPU_32_BIT
4297 return d_exp.d_value == (k_DOUBLE_MASK | e_INTERNAL_BOOLEAN)
4298 << k_TYPE_MASK_BITS;
4300 return (e_BOOLEAN == type());
4305bool Datum::isDate()
const
4307#ifdef BSLS_PLATFORM_CPU_32_BIT
4308 return d_exp.d_value == (k_DOUBLE_MASK | e_INTERNAL_DATE)
4309 << k_TYPE_MASK_BITS;
4311 return (e_DATE == type());
4316bool Datum::isDatetime()
const
4318 return (e_DATETIME == type());
4322bool Datum::isDatetimeInterval()
const
4324 return (e_DATETIME_INTERVAL == type());
4328bool Datum::isDecimal64()
const
4330 return (e_DECIMAL64 == type());
4334bool Datum::isDouble()
const
4336 return (e_DOUBLE == type());
4340bool Datum::isError()
const
4342 return (e_ERROR == type());
4346bool Datum::isExternalReference()
const
4348#ifdef BSLS_PLATFORM_CPU_32_BIT
4349 switch (internalType()) {
4350 case e_INTERNAL_STRING_REFERENCE:
4351 case e_INTERNAL_ARRAY_REFERENCE:
4352 case e_INTERNAL_USERDEFINED:
4354 case e_INTERNAL_EXTENDED:
4355 switch (extendedInternalType()) {
4356 case e_EXTENDED_INTERNAL_SREF_ALLOC:
4357 case e_EXTENDED_INTERNAL_AREF_ALLOC:
4366 switch (internalType()) {
4367 case e_INTERNAL_STRING_REFERENCE:
4368 case e_INTERNAL_ARRAY_REFERENCE:
4369 case e_INTERNAL_USERDEFINED:
4371 case e_INTERNAL_UNINITIALIZED:
4382bool Datum::isInteger()
const
4384#ifdef BSLS_PLATFORM_CPU_32_BIT
4385 return d_exp.d_value == (k_DOUBLE_MASK | e_INTERNAL_INTEGER)
4386 << k_TYPE_MASK_BITS;
4388 return (e_INTEGER == type());
4393bool Datum::isInteger64()
const
4395 return (e_INTEGER64 == type());
4399bool Datum::isIntMap()
const
4401 return (e_INT_MAP == type());
4405bool Datum::isMap()
const
4407 return (e_MAP == type());
4411bool Datum::isNull()
const
4413#ifdef BSLS_PLATFORM_CPU_32_BIT
4414 return d_exp.d_value == (((k_DOUBLE_MASK | Datum::e_INTERNAL_EXTENDED) << k_TYPE_MASK_BITS)
4415 | e_EXTENDED_INTERNAL_NIL);
4417 return (e_NIL == type());
4422bool Datum::isString()
const
4424 return (e_STRING == type());
4428bool Datum::isTime()
const
4430 return (e_TIME == type());
4434bool Datum::isUdt()
const
4436 return (e_USERDEFINED == type());
4444 const InternalDataType type = internalType();
4445 if (e_INTERNAL_ARRAY == type) {
4446 return theInternalArray();
4449#ifdef BSLS_PLATFORM_CPU_32_BIT
4450 if (e_INTERNAL_EXTENDED == type) {
4451 return theLongArrayReference();
4455 return theArrayReference();
4463#ifdef BSLS_PLATFORM_CPU_32_BIT
4465 *allocatedPtr<const SizeType>());
4467 const InternalDataType type = internalType();
4469 case e_INTERNAL_BINARY:
4471 d_data.buffer()[k_SMALLBINARY_SIZE_OFFSET]);
4472 case e_INTERNAL_BINARY_ALLOC:
4475 BSLS_ASSERT(0 ==
"Bad binary internal-type (memory corruption?)");
4482bool Datum::theBoolean()
const
4486#ifdef BSLS_PLATFORM_CPU_32_BIT
4487 return static_cast<bool>(d_as.d_int);
4489 return d_as.d_int32;
4498#ifdef BSLS_PLATFORM_CPU_32_BIT
4499 return *
reinterpret_cast<const bdlt::Date *
>(&d_as.d_int);
4501 return *
reinterpret_cast<const bdlt::Date *
>(theAlignedInlineStorage());
4510#ifdef BSLS_PLATFORM_CPU_32_BIT
4511 const InternalDataType type = internalType();
4513 if (type == e_INTERNAL_DATETIME) {
4515 k_DATETIME_OFFSET_FROM_EPOCH + d_as.d_short;
4529 extendedInternalType() == e_EXTENDED_INTERNAL_DATETIME_ALLOC);
4530 return *allocatedPtr<const bdlt::Datetime>();
4533 theAlignedInlineStorage());
4542#ifdef BSLS_PLATFORM_CPU_32_BIT
4543 const InternalDataType type = internalType();
4545 if (type == e_INTERNAL_DATETIME_INTERVAL) {
4548 Datum_Helpers32::loadSmallInt64(d_as.d_short, d_as.d_int));
4554 extendedInternalType() == e_EXTENDED_INTERNAL_DATETIME_INTERVAL_ALLOC);
4555 return *allocatedPtr<const bdlt::DatetimeInterval>();
4567double Datum::theDouble()
const
4571#ifdef BSLS_PLATFORM_CPU_32_BIT
4573 0x7f != d_data[k_EXPONENT_MSB] ||
4574 0xf0 != (d_data[k_EXPONENT_LSB] & 0xf0) ||
4575 e_INTERNAL_INF == (d_data[k_EXPONENT_LSB] & 0x0f))) {
4579 return bsl::numeric_limits<double>::quiet_NaN();
4581 return d_as.d_double;
4590#ifdef BSLS_PLATFORM_CPU_32_BIT
4595 if (e_EXTENDED_INTERNAL_ERROR == extendedInternalType()) {
4599 const char *data = allocatedPtr<const char>();
4601 if (e_INTERNAL_ERROR == internalType()) {
4602 return DatumError(
static_cast<int>(d_as.d_int64));
4605 const char *data = allocatedPtr<const char>();
4609 Datum_Helpers::load<int>(data, 0),
4611 Datum_Helpers::load<int>(data,
sizeof(
int))));
4615int Datum::theInteger()
const
4619#ifdef BSLS_PLATFORM_CPU_32_BIT
4622 return d_as.d_int32;
4631#ifdef BSLS_PLATFORM_CPU_32_BIT
4632 const InternalDataType type = internalType();
4635 return theSmallInteger64();
4639 e_EXTENDED_INTERNAL_INTEGER64_ALLOC == extendedInternalType());
4640 return theLargeInteger64();
4642 return d_as.d_int64;
4651 const DatumMapEntry *map = allocatedPtr<const DatumMapEntry>();
4690 const InternalDataType type = internalType();
4692 case e_INTERNAL_SHORTSTRING:
4693 return theShortString();
4694 case e_INTERNAL_STRING:
4695 return theInternalString();
4696 case e_INTERNAL_STRING_REFERENCE:
4697 return theStringReference();
4698 case e_INTERNAL_LONGEST_SHORTSTRING: {
4700 return theLongestShortString();
4702#ifdef BSLS_PLATFORM_CPU_32_BIT
4704 return theLongStringReference();
4707 BSLS_ASSERT(0 ==
"Bad string internal-type (memory corruption?)");
4719#ifdef BSLS_PLATFORM_CPU_32_BIT
4722 rawTime = Datum_Helpers32::loadInt48(d_as.d_short, d_as.d_int);
4723 return *
reinterpret_cast<bdlt::Time*
>(&rawTime);
4725 return *
reinterpret_cast<const bdlt::Time *
>(theAlignedInlineStorage());
4733#ifdef BSLS_PLATFORM_CPU_32_BIT
4734 return DatumUdt(allocatedPtr<void>(), d_as.d_ushort);
4736 return DatumUdt(allocatedPtr<void>(), d_as.d_int32);
4743#ifdef BSLS_PLATFORM_CPU_32_BIT
4744 static const DataType convert[] = {
4753 , e_DATETIME_INTERVAL
4764 const InternalDataType type = internalType();
4765 if (e_INTERNAL_EXTENDED == type) {
4766 return typeFromExtendedInternalType();
4768 return convert[type];
4770 static const DataType convert[] = {
4780 , e_DATETIME_INTERVAL
4799 const InternalDataType type = internalType();
4803 return convert[type];
4807template <
class t_VISITOR>
4808void Datum::apply(t_VISITOR& visitor)
const
4810#ifdef BSLS_PLATFORM_CPU_32_BIT
4811 switch (internalType()) {
4812 case e_INTERNAL_INF:
4813 visitor(bsl::numeric_limits<double>::infinity());
4815 case e_INTERNAL_BOOLEAN:
4816 visitor(theBoolean());
4818 case e_INTERNAL_SHORTSTRING:
4819 visitor(theShortString());
4821 case e_INTERNAL_LONGEST_SHORTSTRING:
4822 visitor(theLongestShortString());
4824 case e_INTERNAL_STRING:
4825 visitor(theInternalString());
4827 case e_INTERNAL_DATE:
4830 case e_INTERNAL_TIME:
4833 case e_INTERNAL_DATETIME:
4834 visitor(theDatetime());
4836 case e_INTERNAL_DATETIME_INTERVAL:
4837 visitor(theDatetimeInterval());
4839 case e_INTERNAL_INTEGER:
4840 visitor(theInteger());
4842 case e_INTERNAL_INTEGER64:
4843 visitor(theInteger64());
4845 case e_INTERNAL_USERDEFINED:
4848 case e_INTERNAL_ARRAY:
4849 visitor(theInternalArray());
4851 case e_INTERNAL_STRING_REFERENCE:
4852 visitor(theStringReference());
4854 case e_INTERNAL_ARRAY_REFERENCE:
4855 visitor(theArrayReference());
4857 case e_INTERNAL_EXTENDED:
4858 switch (extendedInternalType()) {
4859 case e_EXTENDED_INTERNAL_INT_MAP:
4860 visitor(theIntMap());
4862 case e_EXTENDED_INTERNAL_MAP:
4864 case e_EXTENDED_INTERNAL_OWNED_MAP:
4867 case e_EXTENDED_INTERNAL_NAN2:
4868 visitor(theDouble());
4870 case e_EXTENDED_INTERNAL_ERROR:
4872 case e_EXTENDED_INTERNAL_ERROR_ALLOC:
4873 visitor(theError());
4875 case e_EXTENDED_INTERNAL_SREF_ALLOC:
4876 visitor(theLongStringReference());
4878 case e_EXTENDED_INTERNAL_AREF_ALLOC:
4879 visitor(theLongArrayReference());
4881 case e_EXTENDED_INTERNAL_DATETIME_ALLOC:
4882 visitor(theDatetime());
4884 case e_EXTENDED_INTERNAL_DATETIME_INTERVAL_ALLOC:
4885 visitor(theDatetimeInterval());
4887 case e_EXTENDED_INTERNAL_INTEGER64_ALLOC:
4888 visitor(theInteger64());
4890 case e_EXTENDED_INTERNAL_BINARY_ALLOC:
4891 visitor(theBinary());
4893 case e_EXTENDED_INTERNAL_DECIMAL64:
4894 case e_EXTENDED_INTERNAL_DECIMAL64_SPECIAL:
4895 case e_EXTENDED_INTERNAL_DECIMAL64_ALLOC: {
4906 t_VISITOR>::type dec64MemFunPtr = &Datum::theDecimal64;
4907 visitor((this->*dec64MemFunPtr)());
4909 case e_EXTENDED_INTERNAL_NIL:
4914 0 ==
"Unknown extended-type (memory corruption?)");
4917 case e_INTERNAL_DOUBLE:
4924 switch (internalType()) {
4925 case e_INTERNAL_INF:
4926 visitor(bsl::numeric_limits<double>::infinity());
4928 case e_INTERNAL_NIL:
4931 case e_INTERNAL_BOOLEAN:
4932 visitor(theBoolean());
4934 case e_INTERNAL_SHORTSTRING:
4935 visitor(theShortString());
4937 case e_INTERNAL_STRING:
4938 visitor(theInternalString());
4940 case e_INTERNAL_DATE:
4943 case e_INTERNAL_TIME:
4946 case e_INTERNAL_DATETIME:
4947 visitor(theDatetime());
4949 case e_INTERNAL_DATETIME_INTERVAL:
4950 visitor(theDatetimeInterval());
4952 case e_INTERNAL_INTEGER:
4953 visitor(theInteger());
4955 case e_INTERNAL_INTEGER64:
4956 visitor(theInteger64());
4958 case e_INTERNAL_USERDEFINED:
4961 case e_INTERNAL_ARRAY:
4962 visitor(theInternalArray());
4964 case e_INTERNAL_STRING_REFERENCE:
4965 visitor(theStringReference());
4967 case e_INTERNAL_ARRAY_REFERENCE:
4968 visitor(theArrayReference());
4970 case e_INTERNAL_MAP:
4972 case e_INTERNAL_OWNED_MAP:
4975 case e_INTERNAL_ERROR:
4977 case e_INTERNAL_ERROR_ALLOC:
4978 visitor(theError());
4980 case e_INTERNAL_DOUBLE:
4981 visitor(d_as.d_double);
4983 case e_INTERNAL_BINARY:
4985 case e_INTERNAL_BINARY_ALLOC:
4986 visitor(theBinary());
4988 case e_INTERNAL_DECIMAL64: {
4999 t_VISITOR>::type dec64MemFunPtr = &Datum::theDecimal64;
5000 visitor((this->*dec64MemFunPtr)());
5002 case e_INTERNAL_INT_MAP:
5003 visitor(theIntMap());
5005 case e_INTERNAL_LONGEST_SHORTSTRING:
5006 visitor(theLongestShortString());
5008 case e_INTERNAL_UNINITIALIZED:
5017#ifndef BDE_OMIT_INTERNAL_DEPRECATED
5019void Datum::createUninitializedMapOwningKeys(
5025 createUninitializedMap(result, capacity, keysCapacity, allocator);
5031 return adoptMap(mapping);
5035void Datum::disposeUninitializedMapOwningKeys(
5039 return disposeUninitializedMap(mapping, allocator);
5049DatumArrayRef::DatumArrayRef()
5069 return d_data_p[index];
5125 return d_data_p + d_length;
5163 return *(
end() - 1);
5169 return 0 == d_length;
5235 return d_data_p[index];
5284 return d_data_p + d_size;
5322 return *(
end() - 1);
5392, d_ownsKeys(ownsKeys)
5405 return d_data_p[index];
5454 return d_data_p + d_size;
5492 return *(
end() - 1);
5532, d_capacity(capacity)
5681, d_allocatedSize(allocatedSize)
5698 return d_allocatedSize;
5732 return !(lhs == rhs);
5742bool bdld::operator==(
const DatumIntMapEntry& lhs,
const DatumIntMapEntry& rhs)
5744 return (
lhs.key() ==
rhs.key()) && (
lhs.value() ==
rhs.value());
5748bool bdld::operator!=(
const DatumIntMapEntry& lhs,
const DatumIntMapEntry& rhs)
5762 return (
lhs.key() ==
rhs.key()) && (
lhs.value() ==
rhs.value());
5780 return rhs.print(stream, 0, -1);
5783template <
class t_HASH_ALGORITHM>
5789 switch (input.
type()) {
5831 for (bsl::size_t i = 0; i < input.
theArray().length(); ++i) {
5837 for (bsl::size_t i = 0; i < input.
theMap().
size(); ++i) {
5858 const typename Datum_MakeDependent<Dec64MemFunPtr,
5859 t_HASH_ALGORITHM>::type
5860 dec64MemFunPtr = &Datum::theDecimal64;
5861 hashAppend(hashAlg, (input.*dec64MemFunPtr)());
5865 for (bsl::size_t i = 0; i < input.
theIntMap().
size(); ++i) {
5871 BSLS_ASSERT(0 ==
"Unknown type (memory corruption?)");
5877bsl::ostream&
bdld::operator<<(bsl::ostream& stream,
const DatumArrayRef& rhs)
5879 return rhs.print(stream, 0 , -1);
5883bsl::ostream&
bdld::operator<<(bsl::ostream& stream,
const DatumMapEntry& rhs)
5885 return rhs.print(stream, 0 , -1);
5890 const DatumIntMapEntry& rhs)
5892 return rhs.print(stream, 0 , -1);
5896bsl::ostream&
bdld::operator<<(bsl::ostream& stream,
const DatumIntMapRef& rhs)
5898 return rhs.print(stream, 0 , -1);
5902bsl::ostream&
bdld::operator<<(bsl::ostream& stream,
const DatumMapRef& rhs)
5904 return rhs.print(stream, 0 , -1);
Definition bdld_datum.h:2561
size_type length() const
Return a const pointer to the length of the array.
Definition bdld_datum.h:5081
const_iterator begin() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5095
BSLMF_NESTED_TRAIT_DECLARATION(DatumArrayRef, bdlb::HasPrintMethod)
bsl::reverse_iterator< const_iterator > const_reverse_iterator
Definition bdld_datum.h:2581
size_type size() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5088
DatumArrayRef()
Create a DatumArrayRef object representing an empty array.
Definition bdld_datum.h:5049
bsl::size_t size_type
Definition bdld_datum.h:2568
const_iterator end() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5123
DatumArrayRef(const DatumArrayRef &other)=default
DatumArrayRef & operator=(const DatumArrayRef &rhs)=default
Assign to this object the value of the specified rhs object.
const_reverse_iterator rbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5109
bsl::ptrdiff_t difference_type
Definition bdld_datum.h:2569
const_reverse_iterator crbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5116
element_type & reference
Definition bdld_datum.h:2574
pointer data() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5074
bsl::reverse_iterator< iterator > reverse_iterator
Definition bdld_datum.h:2580
const_reference operator[](size_type position) const
Definition bdld_datum.h:5066
Datum::SizeType SizeType
Definition bdld_datum.h:2585
const bdld::Datum element_type
Definition bdld_datum.h:2565
const_reverse_iterator rend() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5137
element_type * pointer
Definition bdld_datum.h:2571
bool empty() const BSLS_KEYWORD_NOEXCEPT
Return size() == 0.
Definition bdld_datum.h:5167
pointer iterator
Definition bdld_datum.h:2577
const_iterator cbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5102
const_reference back() const
Definition bdld_datum.h:5160
BSLMF_NESTED_TRAIT_DECLARATION(DatumArrayRef, bsl::is_trivially_copyable)
const_iterator cend() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5130
const_reverse_iterator crend() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5144
const element_type & const_reference
Definition bdld_datum.h:2575
bdld::Datum value_type
Definition bdld_datum.h:2566
const_reference front() const
Definition bdld_datum.h:5152
const element_type * const_pointer
Definition bdld_datum.h:2572
const_pointer const_iterator
Definition bdld_datum.h:2578
Definition bdld_datumbinaryref.h:157
const void * data() const
Return the pointer to the non-modifiable binary data.
Definition bdld_datumbinaryref.h:294
SizeType size() const
Return the size of the binary data.
Definition bdld_datumbinaryref.h:300
Definition bdld_datumerror.h:161
bslstl::StringRef message() const
Definition bdld_datumerror.h:327
int code() const
Return the error code.
Definition bdld_datumerror.h:321
Definition bdld_datum.h:2734
const Datum & value() const
Return the value for this entry.
Definition bdld_datum.h:5210
bsl::ostream & print(bsl::ostream &stream, int level=0, int spacesPerLevel=4) const
BSLMF_NESTED_TRAIT_DECLARATION(DatumIntMapEntry, bdlb::HasPrintMethod)
BSLMF_NESTED_TRAIT_DECLARATION(DatumIntMapEntry, bsl::is_trivially_copyable)
void setValue(const Datum &value)
Set the value for this entry to the specified value.
Definition bdld_datum.h:5197
DatumIntMapEntry()
Create a DatumIntMapEntry object.
Definition bdld_datum.h:5177
void setKey(int key)
Set the key for this entry to the specified key.
Definition bdld_datum.h:5191
~DatumIntMapEntry()=default
Destroy this object.
int key() const
Return the key for this entry.
Definition bdld_datum.h:5204
Definition bdld_datum.h:2831
const_iterator begin() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5254
const_reverse_iterator crbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5275
const element_type * const_pointer
Definition bdld_datum.h:2842
~DatumIntMapRef()=default
Destroy this object.
Datum::SizeType SizeType
Definition bdld_datum.h:2857
element_type * pointer
Definition bdld_datum.h:2841
const_iterator cbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5261
element_type & reference
Definition bdld_datum.h:2844
const_pointer const_iterator
Definition bdld_datum.h:2848
bsl::reverse_iterator< iterator > reverse_iterator
Definition bdld_datum.h:2850
pointer data() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5240
bsl::ptrdiff_t difference_type
Definition bdld_datum.h:2839
const element_type & const_reference
Definition bdld_datum.h:2845
const_reference back() const
Definition bdld_datum.h:5319
const_iterator cend() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5289
bdld::DatumIntMapEntry value_type
Definition bdld_datum.h:2836
bool empty() const BSLS_KEYWORD_NOEXCEPT
Return size() == 0.
Definition bdld_datum.h:5326
const_reverse_iterator crend() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5303
const_iterator end() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5282
const_reverse_iterator rbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5268
BSLMF_NESTED_TRAIT_DECLARATION(DatumIntMapRef, bsl::is_trivially_copyable)
bool isSorted() const
Return true if underlying map is sorted and false otherwise.
Definition bdld_datum.h:5332
const_reference operator[](size_type position) const
Definition bdld_datum.h:5232
size_type size() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5246
bsl::size_t size_type
Definition bdld_datum.h:2838
DatumIntMapRef(const DatumIntMapEntry *data, SizeType size, bool sorted)
Definition bdld_datum.h:5220
const bdld::DatumIntMapEntry element_type
Definition bdld_datum.h:2835
bsl::reverse_iterator< const_iterator > const_reverse_iterator
Definition bdld_datum.h:2851
pointer iterator
Definition bdld_datum.h:2847
BSLMF_NESTED_TRAIT_DECLARATION(DatumIntMapRef, bdlb::HasPrintMethod)
const_reference front() const
Definition bdld_datum.h:5311
const_reverse_iterator rend() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5296
Definition bdld_datum.h:3007
DatumMapEntry()
Create a DatumMapEntry object.
Definition bdld_datum.h:5342
BSLMF_NESTED_TRAIT_DECLARATION(DatumMapEntry, bsl::is_trivially_copyable)
const Datum & value() const
Return the value for this entry.
Definition bdld_datum.h:5375
BSLMF_NESTED_TRAIT_DECLARATION(DatumMapEntry, bdlb::HasPrintMethod)
bsl::ostream & print(bsl::ostream &stream, int level=0, int spacesPerLevel=4) const
void setKey(const bslstl::StringRef &key)
Set the key for this entry to the specified key.
Definition bdld_datum.h:5356
const bslstl::StringRef & key() const
Return the key for this entry.
Definition bdld_datum.h:5369
void setValue(const Datum &value)
Set the value for this entry to the specified value.
Definition bdld_datum.h:5362
~DatumMapEntry()=default
Destroy this object.
Definition bdld_datum.h:3100
bsl::size_t size_type
Definition bdld_datum.h:3107
const_pointer const_iterator
Definition bdld_datum.h:3117
bsl::reverse_iterator< const_iterator > const_reverse_iterator
Definition bdld_datum.h:3120
element_type * pointer
Definition bdld_datum.h:3110
bool empty() const BSLS_KEYWORD_NOEXCEPT
Return size() == 0.
Definition bdld_datum.h:5496
const_iterator cbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5431
size_type size() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5416
DatumMapRef(const DatumMapEntry *data, SizeType size, bool sorted, bool ownsKeys)
Definition bdld_datum.h:5385
const_reverse_iterator crbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5445
const element_type & const_reference
Definition bdld_datum.h:3114
pointer data() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5410
BSLMF_NESTED_TRAIT_DECLARATION(DatumMapRef, bdlb::HasPrintMethod)
const_reverse_iterator crend() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5473
const_reference front() const
Definition bdld_datum.h:5481
bdld::DatumMapEntry value_type
Definition bdld_datum.h:3105
bool ownsKeys() const
Definition bdld_datum.h:5508
bsl::ptrdiff_t difference_type
Definition bdld_datum.h:3108
bsl::reverse_iterator< iterator > reverse_iterator
Definition bdld_datum.h:3119
const_reverse_iterator rend() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5466
pointer iterator
Definition bdld_datum.h:3116
const bdld::DatumMapEntry element_type
Definition bdld_datum.h:3104
element_type & reference
Definition bdld_datum.h:3113
Datum::SizeType SizeType
Definition bdld_datum.h:3126
const_iterator end() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5452
const_reverse_iterator rbegin() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5438
bool isSorted() const
Return true if underlying map is sorted and false otherwise.
Definition bdld_datum.h:5502
const_iterator cend() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5459
const_iterator begin() const BSLS_KEYWORD_NOEXCEPT
Definition bdld_datum.h:5424
const element_type * const_pointer
Definition bdld_datum.h:3111
~DatumMapRef()=default
Destroy this object.
BSLMF_NESTED_TRAIT_DECLARATION(DatumMapRef, bsl::is_trivially_copyable)
const_reference back() const
Definition bdld_datum.h:5489
const_reference operator[](size_type position) const
Definition bdld_datum.h:5402
Definition bdld_datum.h:2224
DatumMutableArrayRef & operator=(const DatumMutableArrayRef &rhs)=default
SizeType capacity() const
Return the allocated capacity of the array.
Definition bdld_datum.h:5556
Datum::SizeType SizeType
Definition bdld_datum.h:2231
void * allocatedPtr() const
Return pointer to the memory allocated for the array.
Definition bdld_datum.h:5538
DatumMutableArrayRef()
Create a DatumMutableArrayRef object that refers to no array.
Definition bdld_datum.h:5519
SizeType * length() const
Return pointer to the length of the array.
Definition bdld_datum.h:5550
Datum * data() const
Return pointer to the first element of the held array.
Definition bdld_datum.h:5544
~DatumMutableArrayRef()=default
DatumMutableArrayRef(const DatumMutableArrayRef &original)=default
Definition bdld_datum.h:2398
void * allocatedPtr() const
Return pointer to the memory allocated for the map.
Definition bdld_datum.h:5586
bool * sorted() const
Definition bdld_datum.h:5604
~DatumMutableIntMapRef()=default
Datum::SizeType SizeType
Definition bdld_datum.h:2406
DatumMutableIntMapRef(const DatumMutableIntMapRef &original)=default
SizeType * size() const
Definition bdld_datum.h:5598
DatumMutableIntMapRef()
Create a DatumMutableIntMapRef object.
Definition bdld_datum.h:5567
DatumMutableIntMapRef & operator=(const DatumMutableIntMapRef &rhs)=default
DatumIntMapEntry * data() const
Return pointer to the first element in the (held) map.
Definition bdld_datum.h:5592
Definition bdld_datum.h:2474
DatumMutableMapOwningKeysRef()
Create a DatumMutableMapOwningKeysRef object.
Definition bdld_datum.h:5663
Datum::SizeType SizeType
Definition bdld_datum.h:2482
SizeType * size() const
Definition bdld_datum.h:5715
~DatumMutableMapOwningKeysRef()=default
Destroy this object.
DatumMapEntry * data() const
Return pointer to the first element in the held map.
Definition bdld_datum.h:5702
DatumMutableMapOwningKeysRef(const DatumMutableMapOwningKeysRef &original)=default
DatumMutableMapOwningKeysRef & operator=(const DatumMutableMapOwningKeysRef &rhs)=default
void * allocatedPtr() const
Return pointer to the memory allocated for the map.
Definition bdld_datum.h:5689
char * keys() const
Return pointer to the start of the buffer where keys are stored.
Definition bdld_datum.h:5708
bool * sorted() const
Definition bdld_datum.h:5721
SizeType allocatedSize() const
Return the number of bytes allocated for the map.
Definition bdld_datum.h:5696
Definition bdld_datum.h:2326
DatumMapEntry * data() const
Return pointer to the first element in the (held) map.
Definition bdld_datum.h:5640
Datum::SizeType SizeType
Definition bdld_datum.h:2334
SizeType * size() const
Definition bdld_datum.h:5646
DatumMutableMapRef & operator=(const DatumMutableMapRef &rhs)=default
DatumMutableMapRef()
Create a DatumMutableMapRef object.
Definition bdld_datum.h:5615
DatumMutableMapRef(const DatumMutableMapRef &original)=default
void * allocatedPtr() const
Return pointer to the memory allocated for the map.
Definition bdld_datum.h:5634
~DatumMutableMapRef()=default
bool * sorted() const
Definition bdld_datum.h:5652
Definition bdld_datumudt.h:144
void * data() const
Return the pointer to the user-defined object.
Definition bdld_datumudt.h:275
int type() const
Return the type of the user-defined object.
Definition bdld_datumudt.h:281
Definition bdld_datum.h:799
DatumArrayRef theArray() const
Definition bdld_datum.h:4440
bsls::AlignedBuffer< 16 > d_data
Definition bdld_datum.h:1340
bool isArray() const
Definition bdld_datum.h:4282
friend bool operator==(const Datum &lhs, const Datum &rhs)
static Datum adoptMapOwningKeys(const DatumMutableMapOwningKeysRef &mapping)
Definition bdld_datum.h:5029
static Datum createTime(const bdlt::Time &value)
Return, by value, a datum having the specified Time value.
Definition bdld_datum.h:4119
static void createUninitializedMap(DatumMutableMapOwningKeysRef *result, SizeType capacity, SizeType keysCapacity, const AllocatorType &allocator)
bdlt::Datetime theDatetime() const
Definition bdld_datum.h:4506
static Datum adoptIntMap(const DatumMutableIntMapRef &intMap)
Definition bdld_datum.h:4190
static Datum createStringRef(const char *string, SizeType length, const AllocatorType &allocator)
Definition bdld_datum.h:4065
@ k_NUM_TYPES
Definition bdld_datum.h:838
bool isError() const
Definition bdld_datum.h:4340
static Datum createNull()
Return, by value, a datum having no value.
Definition bdld_datum.h:4049
DatumMapRef theMap() const
Definition bdld_datum.h:4647
bsls::Types::size_type SizeType
Definition bdld_datum.h:1478
static void createUninitializedMap(DatumMutableMapRef *result, SizeType capacity, const AllocatorType &allocator)
bool isString() const
Definition bdld_datum.h:4422
static Datum createError(int code)
Definition bdld_datum.h:4000
bool isBoolean() const
Definition bdld_datum.h:4294
DatumBinaryRef theBinary() const
Definition bdld_datum.h:4459
static const char * dataTypeToAscii(DataType type)
static Datum copyString(const char *string, SizeType length, const AllocatorType &allocator)
friend bool operator!=(const Datum &lhs, const Datum &rhs)
DataType type() const
Definition bdld_datum.h:4741
static Datum createInteger64(bsls::Types::Int64 value, const AllocatorType &allocator)
Definition bdld_datum.h:4025
bdlt::DatetimeInterval theDatetimeInterval() const
Definition bdld_datum.h:4538
bslstl::StringRef theString() const
Definition bdld_datum.h:4686
bsl::allocator AllocatorType
Definition bdld_datum.h:807
static Datum createUdt(void *data, int type)
Definition bdld_datum.h:4140
TypedAccess d_as
Definition bdld_datum.h:1341
static void createUninitializedArray(DatumMutableArrayRef *result, SizeType capacity, const AllocatorType &allocator)
bool isInteger() const
Definition bdld_datum.h:4382
bool isMap() const
Definition bdld_datum.h:4405
bdlt::Time theTime() const
Definition bdld_datum.h:4715
BSLMF_NESTED_TRAIT_DECLARATION(Datum, bdlb::HasPrintMethod)
bsl::ostream & print(bsl::ostream &stream, int level=0, int spacesPerLevel=4) const
Datum & operator=(const Datum &rhs)=default
static Datum createArrayReference(const Datum *array, SizeType length, const AllocatorType &allocator)
Definition bdld_datum.h:3832
DatumError theError() const
Definition bdld_datum.h:4586
static void destroy(const Datum &value, const AllocatorType &allocator)
bdldfp::Decimal64 theDecimal64() const
bool theBoolean() const
Definition bdld_datum.h:4482
static Datum createDecimal64(bdldfp::Decimal64 value, const AllocatorType &allocator)
BSLMF_NESTED_TRAIT_DECLARATION(Datum, bslmf::IsBitwiseMoveable)
static Datum createDouble(double value)
Definition bdld_datum.h:3982
static Datum createInteger(int value)
Return, by value, a datum having the specified int value.
Definition bdld_datum.h:4010
static Datum adoptArray(const DatumMutableArrayRef &array)
Definition bdld_datum.h:4158
static void * createUninitializedBinary(Datum *result, SizeType size, const AllocatorType &allocator)
bool isExternalReference() const
Definition bdld_datum.h:4346
Datum clone(const AllocatorType &allocator) const
BSLMF_NESTED_TRAIT_DECLARATION(Datum, bsl::is_trivially_copyable)
static Datum createDatetime(const bdlt::Datetime &value, const AllocatorType &allocator)
Definition bdld_datum.h:3910
bool isDouble() const
Definition bdld_datum.h:4334
BSLMF_NESTED_TRAIT_DECLARATION(Datum, bsl::is_trivially_default_constructible)
bdlt::Date theDate() const
Definition bdld_datum.h:4494
static void disposeUninitializedIntMap(const DatumMutableIntMapRef &intMap, const AllocatorType &allocator)
Definition bdld_datum.h:4238
static Datum copyBinary(const void *value, SizeType size, const AllocatorType &allocator)
static void disposeUninitializedMapOwningKeys(const DatumMutableMapOwningKeysRef &mapping, const AllocatorType &allocator)
Definition bdld_datum.h:5035
DatumIntMapRef theIntMap() const
Definition bdld_datum.h:4667
static void createUninitializedIntMap(DatumMutableIntMapRef *result, SizeType capacity, const AllocatorType &allocator)
double theDouble() const
Definition bdld_datum.h:4567
static void createUninitializedMapOwningKeys(DatumMutableMapOwningKeysRef *result, SizeType capacity, SizeType keysCapacity, const AllocatorType &allocator)
Definition bdld_datum.h:5019
bsls::Types::Int64 theInteger64() const
Definition bdld_datum.h:4627
static Datum createError(int code, const bslstl::StringRef &message, const AllocatorType &allocator)
bool isNull() const
Definition bdld_datum.h:4411
static Datum createDatetimeInterval(const bdlt::DatetimeInterval &value, const AllocatorType &allocator)
Definition bdld_datum.h:3951
bool isDecimal64() const
Definition bdld_datum.h:4328
bool isInteger64() const
Definition bdld_datum.h:4393
static void disposeUninitializedMap(const DatumMutableMapRef &map, const AllocatorType &allocator)
Definition bdld_datum.h:4254
bool isBinary() const
Definition bdld_datum.h:4288
friend bsl::ostream & operator<<(bsl::ostream &stream, const Datum &rhs)
void apply(t_VISITOR &visitor) const
Definition bdld_datum.h:4808
static Datum createDate(const bdlt::Date &value)
Return, by value, a datum having the specified Date value.
Definition bdld_datum.h:3892
DataType
Definition bdld_datum.h:811
@ e_MAP
Definition bdld_datum.h:825
@ e_BINARY
Definition bdld_datum.h:826
@ e_DATETIME_INTERVAL
Definition bdld_datum.h:821
@ e_ARRAY
Definition bdld_datum.h:824
@ e_TIME
Definition bdld_datum.h:819
@ e_INTEGER
Definition bdld_datum.h:813
@ e_USERDEFINED
Definition bdld_datum.h:823
@ e_DATE
Definition bdld_datum.h:818
@ e_ERROR_VALUE
Definition bdld_datum.h:831
@ e_INT_MAP
Definition bdld_datum.h:828
@ e_DECIMAL64
Definition bdld_datum.h:827
@ e_BOOLEAN
Definition bdld_datum.h:816
@ e_DATETIME
Definition bdld_datum.h:820
@ e_REAL
Definition bdld_datum.h:830
@ e_INTEGER64
Definition bdld_datum.h:822
@ e_STRING
Definition bdld_datum.h:815
@ e_DOUBLE
Definition bdld_datum.h:814
@ e_NIL
Definition bdld_datum.h:812
@ e_ERROR
Definition bdld_datum.h:817
bool isDate() const
Definition bdld_datum.h:4305
bool isUdt() const
Definition bdld_datum.h:4434
DatumUdt theUdt() const
Definition bdld_datum.h:4730
static char * createUninitializedString(Datum *result, SizeType length, const AllocatorType &allocator)
static void disposeUninitializedArray(const DatumMutableArrayRef &array, const AllocatorType &allocator)
Definition bdld_datum.h:4226
bool isDatetimeInterval() const
Definition bdld_datum.h:4322
static Datum adoptMap(const DatumMutableMapRef &map)
Definition bdld_datum.h:4176
static Datum createBoolean(bool value)
Return, by value, a datum having the specified bool value.
Definition bdld_datum.h:3877
Datum(const Datum &original)=default
Create a datum having the value of the specified original.
bool isDatetime() const
Definition bdld_datum.h:4316
bool isIntMap() const
Definition bdld_datum.h:4399
bool isTime() const
Definition bdld_datum.h:4428
int theInteger() const
Definition bdld_datum.h:4615
Definition bdldfp_decimal.h:1890
Definition bdlt_date.h:294
Definition bdlt_datetimeinterval.h:201
int days() const
Definition bdlt_datetimeinterval.h:1156
void setTotalMilliseconds(bsls::Types::Int64 milliseconds)
Definition bdlt_datetimeinterval.h:970
bsls::Types::Int64 fractionalDayInMicroseconds() const
Definition bdlt_datetimeinterval.h:1162
int microseconds() const
Definition bdlt_datetimeinterval.h:1195
bsls::Types::Int64 totalMilliseconds() const
Definition bdlt_datetimeinterval.h:1236
Definition bdlt_datetime.h:330
Date date() const
Return the value of the "date" part of this object.
Definition bdlt_datetime.h:2234
int microsecond() const
Return the value of the microsecond attribute of this object.
Definition bdlt_datetime.h:2301
Time time() const
Return the value of the "time" part of this object.
Definition bdlt_datetime.h:2345
Definition bdlt_time.h:195
int addMilliseconds(int milliseconds)
Definition bslma_bslallocator.h:588
Definition bsls_alignedbuffer.h:262
Definition bslstl_stringref.h:374
const CHAR_TYPE * data() const
Definition bslstl_stringref.h:962
size_type length() const
Definition bslstl_stringref.h:984
bsl::ostream & operator<<(bsl::ostream &stream, const bdlat_AttributeInfo &attributeInfo)
BSLS_PLATFORM_COMPILER_ERROR
Definition bdld_datum.h:729
#define BDLD_DATUM_FORCE_INLINE
Definition bdld_datum.h:735
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#define BSLS_ANNOTATION_FALLTHROUGH
Definition bsls_annotation.h:410
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_ASSERT_OPT(X)
Definition bsls_assert.h:2045
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
bsl::size_t size(const TYPE &array)
Return the number of elements in the specified array.
void hashAppend(HASH_ALGORITHM &hashAlgorithm, const BigEndianInt16 &object)
Definition bdld_datum.h:740
bsl::ostream & operator<<(bsl::ostream &stream, const Datum &rhs)
void hashAppend(t_HASH_ALGORITHM &hashAlgorithm, const Datum &datum)
bool operator==(const Datum &lhs, const Datum &rhs)
bool operator!=(const Datum &lhs, const Datum &rhs)
Decimal_Type64 Decimal64
Definition bdldfp_decimal.h:750
Definition bdlat_valuetypefunctions.h:939
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
ALLOCATOR & lhs
Definition bslstl_string.h:3917
BSLS_KEYWORD_CONSTEXPR CONTAINER::value_type * data(CONTAINER &container)
Definition bslstl_iterator.h:1325
bsl::enable_if<(bsl::is_integral< TYPE >::value||bsl::is_pointer< TYPE >::value||bsl::is_enum< TYPE >::value)&&!bsl::is_same< TYPE, bool >::value >::type hashAppend(HASH_ALGORITHM &hashAlg, TYPE input)
Definition bslh_hash.h:643
Definition bslstl_algorithm.h:84
StringRefImp< char > StringRef
Definition bslstl_stringref.h:725
Definition bdlb_printmethods.h:306
Definition bdld_datum.h:3288
Definition bdld_datum.h:759
t_WANT_TO_BE_DEPENDENT type
Definition bdld_datum.h:760
static const Datetime & epoch()
Definition bdlt_epochutil.h:397
static const int k_MS_PER_D_32
Definition bdlt_timeunitratio.h:339
Definition bslmf_istriviallycopyable.h:324
Definition bslmf_istriviallydefaultconstructible.h:296
Definition bslma_allocatorutil.h:413
Definition bslmf_isbitwisecopyable.h:298
Definition bslmf_isbitwisemoveable.h:718
Definition bslmf_nil.h:133
std::size_t size_type
Definition bsls_types.h:126
long long Int64
Definition bsls_types.h:134