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>
316 unsigned short classId()
const;
354inline bool operator==(
const CorrelationId& lhs,
const CorrelationId& rhs);
363inline bool operator!=(
const CorrelationId& lhs,
const CorrelationId& rhs);
368inline bool operator<(
const CorrelationId& lhs,
const CorrelationId& rhs);
389 std::memset(&d_impl, 0,
sizeof(d_impl));
395 copy(correlationId,
true);
400 copy(original.d_impl,
false);
405 std::memset(&d_impl, 0,
sizeof(d_impl));
407 d_impl.size =
static_cast<unsigned>(
sizeof(d_impl));
410 d_impl.classId =
static_cast<unsigned>(newClassId);
415 std::memset(&d_impl, 0,
sizeof(d_impl));
417 d_impl.size =
static_cast<unsigned>(
sizeof(d_impl));
419 d_impl.value.ptrValue.pointer = ptrValue;
420 d_impl.classId =
static_cast<unsigned>(newClassId);
423template <
typename TYPE>
425 const TYPE& smartPtr,
void *ptrValue,
int newClassId)
430 assertSmartPtrFits<TYPE>();
432 std::memset(&d_impl, 0,
sizeof(d_impl));
434 d_impl.size =
sizeof(d_impl);
436 d_impl.classId = newClassId;
438 d_impl.value.ptrValue.pointer = ptrValue;
439 d_impl.value.ptrValue.manager = &CorrelationId::managerFunc<TYPE>;
441 void *arena = (
void *)d_impl.value.ptrValue.userData;
442 new (arena) TYPE(smartPtr);
448 blpapi_ManagedPtr_ManagerFunction_t& manager
449 = d_impl.value.ptrValue.manager;
452 if (d_impl.internalClassId == e_FOREIGN_OBJECT
454 blpapi_CorrelationId_managedPtrRelease)
456 blpapi_CorrelationId_managedPtrRelease)(
471 swap(other.d_impl, d_impl);
492 return d_impl.value.ptrValue.pointer;
497 typedef int (*ManagerFuncPtr)(
498 blpapi_ManagedPtr_t *,
const blpapi_ManagedPtr_t *, int);
500 ManagerFuncPtr managerFnPtr
501 =
static_cast<ManagerFuncPtr
>(&(CorrelationId::managerFunc<TYPE>));
503 || (d_impl.value.ptrValue.manager != managerFnPtr)) {
506 return *(TYPE *)d_impl.value.ptrValue.userData;
511 return static_cast<long long>(d_impl.value.intValue);
519inline void CorrelationId::copy(
525 blpapi_ManagedPtr_ManagerFunction_t& manager
526 = d_impl.value.ptrValue.manager;
528 if (d_impl.internalClassId == e_FOREIGN_OBJECT) {
537 std::memset(&d_impl.value.ptrValue.userData,
539 sizeof(d_impl.value.ptrValue.userData));
543 BLPAPI_CALL(blpapi_CorrelationId_managedPtrAddRef)(
549 manager(&d_impl.value.ptrValue,
556template <
typename TYPE>
557inline int CorrelationId::managerFunc(blpapi_ManagedPtr_t *managedPtr,
558 const blpapi_ManagedPtr_t *srcPtr,
562 managedPtr->pointer = srcPtr->pointer;
563 managedPtr->manager = srcPtr->manager;
565 void *arena = managedPtr->userData;
566 new (arena) TYPE(*((TYPE *)&srcPtr->userData[0]));
568 TYPE *managedPtr_p = (TYPE *)&managedPtr->userData[0];
569 managedPtr_p->~TYPE();
571 static int uniquePerTemplateInstantiation;
573 const int *address = &uniquePerTemplateInstantiation;
575 std::memcpy(&rc, &address, std::min(
sizeof address,
sizeof rc));
591template <
typename TYPE>
inline void CorrelationId::assertSmartPtrFits()
597 char errorIfSmartPtrDoesNotFit[
sizeof(TYPE) <= (
sizeof(
void *) * 4)
600 (void)errorIfSmartPtrDoesNotFit;
612 if (lhs.impl().internalClassId != rhs.impl().internalClassId) {
629 return !(lhs == rhs);
635 && lhs.impl().internalClassId
638 && rhs.impl().internalClassId
644 return std::memcmp(&lhs.impl(), &rhs.impl(),
sizeof(rhs.impl())) < 0;
650 const char *valueType = 0;
659 valueType =
"POINTER";
662 valueType =
"AUTOGEN";
665 valueType =
"UNKNOWN";
668 os <<
"[ valueType=" << valueType <<
" classId=" << correlator.
classId()
669 <<
" 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:467
unsigned short classId() const
Definition blpapi_correlationid.h:488
ValueType valueType() const
Definition blpapi_correlationid.h:483
void * asPointer() const
Definition blpapi_correlationid.h:490
TYPE asSmartPointer() const
Definition blpapi_correlationid.h:495
~CorrelationId()
Definition blpapi_correlationid.h:445
CorrelationId()
Definition blpapi_correlationid.h:387
long long asInteger() const
Definition blpapi_correlationid.h:509
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:474
static void throwOnError(int errorCode)
Definition blpapi_exception.h:526
bool operator==(const CorrelationId &lhs, const CorrelationId &rhs)
Definition blpapi_correlationid.h:604
std::ostream & operator<<(std::ostream &os, const CorrelationId &correlator)
Definition blpapi_correlationid.h:647
bool operator!=(const CorrelationId &lhs, const CorrelationId &rhs)
Definition blpapi_correlationid.h:627
bool operator<(const CorrelationId &lhs, const CorrelationId &rhs)
Definition blpapi_correlationid.h:632
Definition blpapi_abstractsession.h:195