28#ifndef INCLUDED_BLPAPI_CORRELATIONID
29#define INCLUDED_BLPAPI_CORRELATIONID
71struct blpapi_ManagedPtr_t_;
72typedef struct blpapi_ManagedPtr_t_ blpapi_ManagedPtr_t;
74typedef int (*blpapi_ManagedPtr_ManagerFunction_t)(
75 blpapi_ManagedPtr_t *managedPtr,
76 const blpapi_ManagedPtr_t *srcPtr,
82} blpapi_ManagedPtr_t_data_;
84struct blpapi_ManagedPtr_t_ {
86 blpapi_ManagedPtr_t_data_ userData[4];
87 blpapi_ManagedPtr_ManagerFunction_t manager;
90typedef struct blpapi_CorrelationId_t_ {
91 unsigned int size : 8;
92 unsigned int valueType : 4;
93 unsigned int classId : 16;
94 unsigned int internalClassId : 4;
98 blpapi_ManagedPtr_t ptrValue;
103int blpapi_CorrelationId_managedPtrAddRef(
107int blpapi_CorrelationId_managedPtrRelease(
216 template <
typename TYPE>
217 static int managerFunc(blpapi_ManagedPtr_t *managedPtr,
218 const blpapi_ManagedPtr_t *srcPtr,
221 template <
typename TYPE>
static void assertSmartPtrFits();
282 template <
typename TYPE>
318 unsigned short classId()
const;
356inline bool operator==(
const CorrelationId& lhs,
const CorrelationId& rhs);
365inline bool operator!=(
const CorrelationId& lhs,
const CorrelationId& rhs);
370inline bool operator<(
const CorrelationId& lhs,
const CorrelationId& rhs);
391 std::memset(&d_impl, 0,
sizeof(d_impl));
397 copy(correlationId,
true);
402 copy(original.d_impl,
false);
407 std::memset(&d_impl, 0,
sizeof(d_impl));
409 d_impl.size =
static_cast<unsigned>(
sizeof(d_impl));
412 d_impl.classId =
static_cast<unsigned>(newClassId);
417 std::memset(&d_impl, 0,
sizeof(d_impl));
419 d_impl.size =
static_cast<unsigned>(
sizeof(d_impl));
421 d_impl.value.ptrValue.pointer = ptrValue;
422 d_impl.classId =
static_cast<unsigned>(newClassId);
425template <
typename TYPE>
427 const TYPE& smartPtr,
void *ptrValue,
int newClassId)
432 assertSmartPtrFits<TYPE>();
434 std::memset(&d_impl, 0,
sizeof(d_impl));
436 d_impl.size =
sizeof(d_impl);
438 d_impl.classId = newClassId;
440 d_impl.value.ptrValue.pointer = ptrValue;
441 d_impl.value.ptrValue.manager = &CorrelationId::managerFunc<TYPE>;
443 void *arena = (
void *)d_impl.value.ptrValue.userData;
444 new (arena) TYPE(smartPtr);
450 blpapi_ManagedPtr_ManagerFunction_t& manager
451 = d_impl.value.ptrValue.manager;
454 if (d_impl.internalClassId == e_FOREIGN_OBJECT
456 blpapi_CorrelationId_managedPtrRelease)
458 blpapi_CorrelationId_managedPtrRelease)(
473 swap(other.d_impl, d_impl);
494 return d_impl.value.ptrValue.pointer;
499 typedef int (*ManagerFuncPtr)(
500 blpapi_ManagedPtr_t *,
const blpapi_ManagedPtr_t *, int);
502 ManagerFuncPtr managerFnPtr
503 =
static_cast<ManagerFuncPtr
>(&(CorrelationId::managerFunc<TYPE>));
505 || (d_impl.value.ptrValue.manager != managerFnPtr)) {
508 return *(TYPE *)d_impl.value.ptrValue.userData;
513 return static_cast<long long>(d_impl.value.intValue);
521inline void CorrelationId::copy(
527 blpapi_ManagedPtr_ManagerFunction_t& manager
528 = d_impl.value.ptrValue.manager;
530 if (d_impl.internalClassId == e_FOREIGN_OBJECT) {
539 std::memset(&d_impl.value.ptrValue.userData,
541 sizeof(d_impl.value.ptrValue.userData));
545 BLPAPI_CALL(blpapi_CorrelationId_managedPtrAddRef)(
551 manager(&d_impl.value.ptrValue,
558template <
typename TYPE>
559inline int CorrelationId::managerFunc(blpapi_ManagedPtr_t *managedPtr,
560 const blpapi_ManagedPtr_t *srcPtr,
564 managedPtr->pointer = srcPtr->pointer;
565 managedPtr->manager = srcPtr->manager;
567 void *arena = managedPtr->userData;
568 new (arena) TYPE(*((TYPE *)&srcPtr->userData[0]));
570 TYPE *managedPtr_p = (TYPE *)&managedPtr->userData[0];
571 managedPtr_p->~TYPE();
573 static int uniquePerTemplateInstantiation;
575 const int *address = &uniquePerTemplateInstantiation;
577 std::memcpy(&rc, &address, std::min(
sizeof address,
sizeof rc));
593template <
typename TYPE>
inline void CorrelationId::assertSmartPtrFits()
599 char errorIfSmartPtrDoesNotFit[
sizeof(TYPE) <= (
sizeof(
void *) * 4)
602 (void)errorIfSmartPtrDoesNotFit;
614 if (lhs.impl().internalClassId != rhs.impl().internalClassId) {
631 return !(lhs == rhs);
637 && lhs.impl().internalClassId
640 && rhs.impl().internalClassId
646 return std::memcmp(&lhs.impl(), &rhs.impl(),
sizeof(rhs.impl())) < 0;
652 const char *valueType = 0;
661 valueType =
"POINTER";
664 valueType =
"AUTOGEN";
667 valueType =
"UNKNOWN";
670 os <<
"[ valueType=" << valueType <<
" classId=" << correlator.
classId()
671 <<
" internalClassId=" << correlator.impl().internalClassId
Provide functions for dispatchtbl.
#define BLPAPI_CALL_UNCHECKED(FUNCNAME)
Definition blpapi_call.h:354
#define BLPAPI_CALL_AVAILABLE(FUNCNAME)
Definition blpapi_call.h:352
#define BLPAPI_CALL(FUNCNAME)
Definition blpapi_call.h:353
Common definitions used by the library.
#define BLPAPI_CORRELATION_TYPE_AUTOGEN
Definition blpapi_defs.h:54
#define BLPAPI_CORRELATION_INTERNAL_CLASS_FOREIGN_OBJECT
Definition blpapi_defs.h:56
#define BLPAPI_CORRELATION_TYPE_POINTER
Definition blpapi_defs.h:53
#define BLPAPI_MANAGEDPTR_IMPOSSIBLE_OPERATION
Definition blpapi_defs.h:60
#define BLPAPI_CORRELATION_TYPE_UNSET
Definition blpapi_defs.h:51
#define BLPAPI_CORRELATION_MAX_CLASS_ID
Definition blpapi_defs.h:55
#define BLPAPI_EXPORT
Definition blpapi_defs.h:172
#define BLPAPI_MANAGEDPTR_DESTROY
Definition blpapi_defs.h:59
#define BLPAPI_CORRELATION_TYPE_INT
Definition blpapi_defs.h:52
#define BLPAPI_MANAGEDPTR_COPY
Definition blpapi_defs.h:58
struct blpapi_CorrelationId_t_ blpapi_CorrelationId_t
Definition blpapi_dispatchtbl.h:74
Defines Exceptions that can be thrown by the blpapi library.
unsigned long long blpapi_UInt64_t
Definition blpapi_types.h:70
Definition blpapi_correlationid.h:206
void swap(CorrelationId &other)
Definition blpapi_correlationid.h:469
unsigned short classId() const
Definition blpapi_correlationid.h:490
ValueType valueType() const
Definition blpapi_correlationid.h:485
void * asPointer() const
Definition blpapi_correlationid.h:492
TYPE asSmartPointer() const
Definition blpapi_correlationid.h:497
~CorrelationId()
Definition blpapi_correlationid.h:447
CorrelationId()
Definition blpapi_correlationid.h:389
long long asInteger() const
Definition blpapi_correlationid.h:511
ValueType
Definition blpapi_correlationid.h:226
@ AUTOGEN_VALUE
The CorrelationId was created internally by API.
Definition blpapi_correlationid.h:236
@ UNSET_VALUE
Definition blpapi_correlationid.h:227
@ INT_VALUE
Definition blpapi_correlationid.h:230
@ POINTER_VALUE
Definition blpapi_correlationid.h:233
@ MAX_CLASS_ID
Definition blpapi_correlationid.h:243
CorrelationId & operator=(const CorrelationId &rhs)
Definition blpapi_correlationid.h:476
static void throwOnError(int errorCode)
Definition blpapi_exception.h:526
bool operator==(const CorrelationId &lhs, const CorrelationId &rhs)
Definition blpapi_correlationid.h:606
std::ostream & operator<<(std::ostream &os, const CorrelationId &correlator)
Definition blpapi_correlationid.h:649
bool operator!=(const CorrelationId &lhs, const CorrelationId &rhs)
Definition blpapi_correlationid.h:629
bool operator<(const CorrelationId &lhs, const CorrelationId &rhs)
Definition blpapi_correlationid.h:634
Definition blpapi_abstractsession.h:195