text: /* Copyright 2012. Bloomberg Finance L.P.
   *
   * Permission is hereby granted, free of charge, to any person obtaining a copy
   * of this software and associated documentation files (the "Software"), to
   * deal in the Software without restriction, including without limitation the
   * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
   * sell copies of the Software, and to permit persons to whom the Software is
   * furnished to do so, subject to the following conditions:  The above
   * copyright notice and this permission notice shall be included in all copies
   * or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
   * IN THE SOFTWARE.
   */
  // blpapi_call.h                                                      -*-C++-*-
  
  #ifndef INCLUDED_BLPAPI_CALL
  #define INCLUDED_BLPAPI_CALL
  
  //@PURPOSE: Provide functions for dispatchtbl
  //
  //@DESCRIPTION: This component provides an interface to initialize the
  // function table. [NOT TO BE INCLUDED BY APPLICATION CODE DIRECTLY]
  #ifdef __cplusplus
  
  // We only support dispatchtbl on windows currently
  #if defined(_WIN32) || defined(__WIN32__)
  #include <blpapi_dispatchtbl.h>
  #include <blpapi_exception.h>
  
  // NOTE: The following macros are used to avoid direct dependencies
  // on functions that may not be available in an old DLL.
  
  #define BLPAPI_TABLE_CHECK(FUNCNAME) \
      ((g_blpapiFunctionTableSize &&                                            \
        offsetof(blpapi_FunctionEntries_t, FUNCNAME) <                          \
        g_blpapiFunctionTableSize - 1) ? 1 : 0)
  
  #define BLPAPI_TABLE_CALL(FUNCNAME)                                           \
      (BLPAPI_TABLE_CHECK(FUNCNAME)                                             \
          ? (g_blpapiFunctionEntries.FUNCNAME)                                  \
          : BLPAPI_UNSUPPORTED_CALL(FUNCNAME))
  
  #define BLPAPI_CALL_AVAILABLE(FUNCNAME) BLPAPI_TABLE_CHECK(FUNCNAME)
  #define BLPAPI_CALL(FUNCNAME) BLPAPI_TABLE_CALL(FUNCNAME)
  
  #define BLPAPI_UNSUPPORTED_CALL(FUNCNAME)                                     \
      (throw UnsupportedOperationException(#FUNCNAME " not supported"), 0)
  
  #define BLPAPI_CALL_EVENTFORMATTER_APPENDMESSAGESEQ(a1, a2, a3, a4, a5, a6)   \
      (BLPAPI_TABLE_CALL(                                                       \
          blpapi_EventFormatter_appendMessageSeq)(a1, a2, a3, a4, a5, a6))
  
  #define BLPAPI_CALL_EVENTFORMATTER_APPENDRECAPMESSAGESEQ(a1, a2, a3, a4, a5)  \
      (BLPAPI_TABLE_CALL(                                                       \
          blpapi_EventFormatter_appendRecapMessageSeq)(a1, a2, a3, a4, a5))
  
  #define BLPAPI_CALL_MESSAGE_ADDREF(a1)                                        \
      do {                                                                      \
          if (BLPAPI_TABLE_CHECK(blpapi_Message_addRef))                        \
              g_blpapiFunctionEntries.blpapi_Message_addRef(a1);                \
      } while(0)
  
  #define BLPAPI_CALL_MESSAGE_RELEASE(a1)                                       \
      do {                                                                      \
          if (BLPAPI_TABLE_CHECK(blpapi_Message_release))                       \
              g_blpapiFunctionEntries.blpapi_Message_release(a1);               \
      } while(0)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_SETMAXEVENTQUEUESIZE(a1, a2)               \
      do {                                                                      \
          if (BLPAPI_TABLE_CHECK(blpapi_SessionOptions_setMaxEventQueueSize))   \
              g_blpapiFunctionEntries.                                          \
                        blpapi_SessionOptions_setMaxEventQueueSize(a1, a2);     \
      } while(0)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_SETSLOWCONSUMERHIWATERMARK(a1, a2)         \
      (BLPAPI_TABLE_CHECK(                                                      \
          blpapi_SessionOptions_setSlowConsumerWarningHiWaterMark)              \
      ? g_blpapiFunctionEntries.                                                \
            blpapi_SessionOptions_setSlowConsumerWarningHiWaterMark(a1, a2)     \
      : 0)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_SETSLOWCONSUMERLOWATERMARK(a1, a2)         \
      (BLPAPI_TABLE_CHECK(                                                      \
          blpapi_SessionOptions_setSlowConsumerWarningLoWaterMark)              \
      ? g_blpapiFunctionEntries.                                                \
            blpapi_SessionOptions_setSlowConsumerWarningLoWaterMark(a1, a2)     \
      : 0)
  
  #define BLPAPI_CALL_REQUEST_SETPREFERREDROUTE(a1, a2)                         \
      do {                                                                      \
          if (BLPAPI_TABLE_CHECK(blpapi_Request_setPreferredRoute))             \
              g_blpapiFunctionEntries.blpapi_Request_setPreferredRoute(a1, a2); \
      } while(0)
  
  #define BLPAPI_CALL_MESSAGE_FRAGMENTTYPE(a1)                                  \
      (BLPAPI_TABLE_CHECK(blpapi_Message_fragmentType)                          \
      ? g_blpapiFunctionEntries.blpapi_Message_fragmentType(a1)                 \
      : 0)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_MAXEVENTQUEUESIZE(a1)                      \
      (BLPAPI_TABLE_CHECK(blpapi_SessionOptions_maxEventQueueSize)              \
      ? g_blpapiFunctionEntries.blpapi_SessionOptions_maxEventQueueSize(a1)     \
      : ULONG_MAX)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_SLOWCONSUMERHIWATERMARK(a1)                \
      (BLPAPI_TABLE_CHECK(blpapi_SessionOptions_slowConsumerWarningHiWaterMark) \
      ? g_blpapiFunctionEntries                                                 \
          .blpapi_SessionOptions_slowConsumerWarningHiWaterMark(a1)             \
      : 1.0f)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_SLOWCONSUMERLOWATERMARK(a1)                \
      (BLPAPI_TABLE_CHECK(blpapi_SessionOptions_slowConsumerWarningLoWaterMark) \
      ? g_blpapiFunctionEntries                                                 \
          .blpapi_SessionOptions_slowConsumerWarningLoWaterMark(a1)             \
      : 0.0f)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_DEFAULTKEEPALIVEINACTIVITYTIME(h)          \
      (BLPAPI_TABLE_CHECK(                                                      \
          blpapi_SessionOptions_defaultKeepAliveInactivityTime)                 \
      ? g_blpapiFunctionEntries.                                                \
                  blpapi_SessionOptions_defaultKeepAliveInactivityTime(h)       \
      : INT_MAX)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_DEFAULTKEEPALIVERESPONSETIMEOUT(h)         \
      (BLPAPI_TABLE_CHECK(                                                      \
          blpapi_SessionOptions_defaultKeepAliveResponseTimeout)                \
      ? g_blpapiFunctionEntries.                                                \
                  blpapi_SessionOptions_defaultKeepAliveResponseTimeout(h)      \
      : INT_MAX)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_KEEPALIVEENABLED(h)                        \
      (BLPAPI_TABLE_CHECK(blpapi_SessionOptions_keepAliveEnabled)               \
      ? g_blpapiFunctionEntries.                                                \
                  blpapi_SessionOptions_keepAliveEnabled(h)                     \
      : 1)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_SETDEFAULTKEEPALIVEINACTIVITYTIME(h, t)    \
      (BLPAPI_TABLE_CHECK(                                                      \
          blpapi_SessionOptions_setDefaultKeepAliveInactivityTime)              \
      ? g_blpapiFunctionEntries.                                                \
                  blpapi_SessionOptions_setDefaultKeepAliveInactivityTime(h,t)  \
      : 0)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_SETDEFAULTKEEPALIVERESPONSETIMEOUT(h, t)   \
      (BLPAPI_TABLE_CHECK(                                                      \
          blpapi_SessionOptions_setDefaultKeepAliveResponseTimeout)             \
      ? g_blpapiFunctionEntries.                                                \
                  blpapi_SessionOptions_setDefaultKeepAliveResponseTimeout(h,t) \
      : 0)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_SETKEEPALIVEENABLED(h, t)                  \
      (BLPAPI_TABLE_CHECK(blpapi_SessionOptions_setKeepAliveEnabled)            \
      ? g_blpapiFunctionEntries.blpapi_SessionOptions_setKeepAliveEnabled(h, t) \
      : 0)
  
  #define BLPAPI_CALL_HIGHPRECISIONDATETIME_COMPARE(a1, a2)                     \
      (BLPAPI_TABLE_CHECK(blpapi_HighPrecisionDatetime_compare)                 \
      ? g_blpapiFunctionEntries.blpapi_HighPrecisionDatetime_compare(a1, a2)    \
      : blpapi_Datetime_compare((a1)->datetime, (a2)->datetime))
  
  #define BLPAPI_CALL_HIGHPRECISIONDATETIME_PRINT(a1, a2, a3, a4, a5)           \
      (BLPAPI_TABLE_CHECK(blpapi_HighPrecisionDatetime_print)                   \
      ? g_blpapiFunctionEntries.blpapi_HighPrecisionDatetime_print(a1,          \
                                                                   a2,          \
                                                                   a3,          \
                                                                   a4,          \
                                                                   a5)          \
      : blpapi_Datetime_print(&((a1)->datetime), a2, a3, a4, a5))
  
  #define BLPAPI_CALL_ELEMENT_SETVALUEHIGHPRECISIONDATETIME(a1, a2, a3)         \
      (BLPAPI_TABLE_CHECK(blpapi_Element_setValueHighPrecisionDatetime)         \
      ? g_blpapiFunctionEntries.blpapi_Element_setValueHighPrecisionDatetime    \
          (a1, a2, a3)                                                          \
      : blpapi_Element_setValueDatetime(a1, &((a2)->datetime), a3))
  
  #define BLPAPI_CALL_ELEMENT_SETELEMENTHIGHPRECISIONDATETIME(a1, a2, a3, a4)   \
      (BLPAPI_TABLE_CHECK(blpapi_Element_setElementHighPrecisionDatetime)       \
      ? g_blpapiFunctionEntries.blpapi_Element_setElementHighPrecisionDatetime  \
          (a1, a2, a3, a4)                                                      \
      : blpapi_Element_setElementDatetime(a1, a2, a3, &((a4)->datetime)))
  
  #define BLPAPI_CALL_ELEMENT_GETVALUEASHIGHPRECISIONDATETIME(a1, a2, a3)       \
      if (BLPAPI_TABLE_CHECK(blpapi_Element_getValueAsHighPrecisionDatetime)) { \
          return g_blpapiFunctionEntries                                        \
                  .blpapi_Element_getValueAsHighPrecisionDatetime(              \
                                                 a1,                            \
                                                 &(a2)->rawHighPrecisionValue(),\
                                                 a3);                           \
      } else {                                                                  \
          buffer->rawHighPrecisionValue().picoseconds = 0;                      \
          return blpapi_Element_getValueAsDatetime(a1,                          \
                                                   &(a2)->rawValue(),           \
                                                   a3);                         \
      }
  
  #define BLPAPI_CALL_SESSION_RESUBSCRIBEWITHID(a1, a2, a3, a4, a5)             \
      (BLPAPI_TABLE_CHECK(blpapi_Session_resubscribeWithId)                     \
      ? g_blpapiFunctionEntries.blpapi_Session_resubscribeWithId(a1,            \
                                                                 a2,            \
                                                                 a3,            \
                                                                 a4,            \
                                                                 a5)            \
      : blpapi_Session_resubscribe(a1, a2, a4, a5))
  
  #define BLPAPI_CALL_EVENTFORMATTER_SETVALUENULL(a1, a2, a3)                   \
      (BLPAPI_TABLE_CALL(blpapi_EventFormatter_setValueNull)(a1, a2, a3))
  
  #define BLPAPI_CALL_DIAGNOSTICSUTIL_MEMORYINFO(a1, a2)                        \
      if (BLPAPI_TABLE_CHECK(blpapi_DiagnosticsUtil_memoryInfo)) {              \
          return g_blpapiFunctionEntries.blpapi_DiagnosticsUtil_memoryInfo(a1,  \
                                                                           a2); \
      } else {                                                                  \
          return -1;                                                            \
      }
  
  #define BLPAPI_CALL_SUBSCRIPTIONLIST_ADDRESOLVED(a1, a2, a3)                  \
  (BLPAPI_TABLE_CHECK(blpapi_SubscriptionList_addResolved)                  \
      ? g_blpapiFunctionEntries.blpapi_SubscriptionList_addResolved(        \
                                           a1,                              \
                                           a2,                              \
                                           a3)                              \
      : blpapi_SubscriptionList_add(a1, a2, a3, 0, 0, 0, 0))
  
  #define BLPAPI_CALL_SUBSCRIPTIONLIST_ISRESOLVEDAT(a1, a2, a3)                 \
  (BLPAPI_TABLE_CHECK(blpapi_SubscriptionList_isResolvedAt)                 \
      ? g_blpapiFunctionEntries                                             \
              .blpapi_SubscriptionList_isResolvedAt(a1, a2, a3)             \
      : (*a2 = 0, 0))
  
  #define BLPAPI_CALL_PROVIDERSESSION_DEREGISTERSERVICE(a1, a2)                 \
      (BLPAPI_TABLE_CALL(blpapi_ProviderSession_deregisterService)(a1, a2))
  
  #define BLPAPI_CALL_SERVICEREGISTRATIONOPTIONS_SETPARTSTOREGISTER(a1, a2)     \
      (BLPAPI_TABLE_CALL(                                                       \
          blpapi_ServiceRegistrationOptions_setPartsToRegister)(a1, a2))
  
  #define BLPAPI_CALL_SERVICEREGISTRATIONOPTIONS_GETPARTSTOREGISTER(a1)         \
      (BLPAPI_TABLE_CALL(                                                       \
          blpapi_ServiceRegistrationOptions_getPartsToRegister)(a1))
  
  #define BLPAPI_CALL_PROVIDERSESSION_DELETETOPICS(a1, a2, a3)                 \
      (BLPAPI_TABLE_CALL(blpapi_ProviderSession_deleteTopics)(a1, a2, a3))
  
  #define BLPAPI_CALL_PROVIDERSESSION_ACTIVATESUBSERVICECODERANGE(              \
                                                            a1, a2, a3, a4, a5) \
      (BLPAPI_TABLE_CALL(blpapi_ProviderSession_activateSubServiceCodeRange)(   \
                             a1, a2, a3, a4, a5))
  
  #define BLPAPI_CALL_PROVIDERSESSION_DEACTIVATESUBSERVICECODERANGE(            \
                                                                a1, a2, a3, a4) \
      (BLPAPI_TABLE_CALL(blpapi_ProviderSession_deactivateSubServiceCodeRange)( \
                             a1, a2, a3, a4))
  
  #define BLPAPI_CALL_SERVICEREGISTRATIONOPTIONS_ADDACTIVATESUBSERVICECODERANGE(\
                                                                a1, a2, a3, a4) \
      (BLPAPI_TABLE_CALL(                                                       \
           blpapi_ServiceRegistrationOptions_addActiveSubServiceCodeRange)(     \
               a1, a2, a3, a4))
  
  #define                                                                       \
    BLPAPI_CALL_SERVICEREGISTRATIONOPTIONS_REMOVEALLACTIVESUBSERVICECODERANGES( \
                                                                            a1) \
      (BLPAPI_TABLE_CALL(                                                       \
         blpapi_ServiceRegistrationOptions_removeAllActiveSubServiceCodeRanges)(\
                                                                             a1))
  
  #define BLPAPI_CALL_MESSAGE_TIMERECEIVED(a1, a2)                              \
      (BLPAPI_TABLE_CALL(blpapi_Message_timeReceived)(a1, a2))
  
  #define BLPAPI_CALL_SESSIONOPTION_SETRECORDSUBSCRIPTIONDATARECEIVETIMES(a1,   \
                                                                          a2)   \
      do {                                                                      \
          if (BLPAPI_TABLE_CHECK(                                               \
                blpapi_SessionOptions_setRecordSubscriptionDataReceiveTimes)) { \
              g_blpapiFunctionEntries                                           \
                  .blpapi_SessionOptions_setRecordSubscriptionDataReceiveTimes( \
                                                                            a1, \
                                                                            a2);\
          }                                                                     \
      } while(0)
  
  #define BLPAPI_CALL_SESSIONOPTION_RECORDSUBSCRIPTIONDATARECEIVETIMES(a1)      \
      (BLPAPI_TABLE_CHECK(                                                      \
              blpapi_SessionOptions_recordSubscriptionDataReceiveTimes)         \
          ? (g_blpapiFunctionEntries                                            \
              .blpapi_SessionOptions_recordSubscriptionDataReceiveTimes)        \
          : false)
  
  #define BLPAPI_CALL_TIMEPOINTUTIL_NANOSECONDSBETWEEN(a1, a2)                  \
      (BLPAPI_TABLE_CALL(blpapi_TimePointUtil_nanosecondsBetween)(a1, a2))
  
  #define BLPAPI_CALL_HIGHRESOLUTIONCLOCK_NOW(a1)                               \
      (BLPAPI_TABLE_CALL(blpapi_HighResolutionClock_now)(a1))
  
  #define BLPAPI_CALL_HIGHPRECISIONDATETIME_FROMTIMEPOINT(a1, a2, a3)           \
      (BLPAPI_TABLE_CALL(blpapi_HighPrecisionDatetime_fromTimePoint)(a1, a2, a3))
  
  #else  // if defined(_WIN32) || defined(__WIN32__)
  
  #define BLPAPI_CALL_AVAILABLE(FUNCNAME) true
  #define BLPAPI_CALL(FUNCNAME) FUNCNAME
  
  #define BLPAPI_CALL_EVENTFORMATTER_APPENDMESSAGESEQ(a1, a2, a3, a4, a5, a6)   \
      (blpapi_EventFormatter_appendMessageSeq)(a1, a2, a3, a4, a5, a6)
  #define BLPAPI_CALL_EVENTFORMATTER_APPENDRECAPMESSAGESEQ(a1, a2, a3, a4, a5)  \
      (blpapi_EventFormatter_appendRecapMessageSeq)(a1, a2, a3, a4, a5)
  #define BLPAPI_CALL_MESSAGE_ADDREF(a1)                                        \
      (blpapi_Message_addRef)(a1)
  #define BLPAPI_CALL_MESSAGE_RELEASE(a1)                                       \
      (blpapi_Message_release)(a1)
  #define BLPAPI_CALL_SESSIONOPTIONS_SETMAXEVENTQUEUESIZE(a1, a2)               \
      (blpapi_SessionOptions_setMaxEventQueueSize)(a1, a2)
  #define BLPAPI_CALL_SESSIONOPTIONS_SETSLOWCONSUMERHIWATERMARK(a1, a2)         \
      (blpapi_SessionOptions_setSlowConsumerWarningHiWaterMark)(a1, a2)
  #define BLPAPI_CALL_SESSIONOPTIONS_SETSLOWCONSUMERLOWATERMARK(a1, a2)         \
      (blpapi_SessionOptions_setSlowConsumerWarningLoWaterMark)(a1, a2)
  #define BLPAPI_CALL_REQUEST_SETPREFERREDROUTE(a1, a2)                         \
      (blpapi_Request_setPreferredRoute)(a1, a2)
  #define BLPAPI_CALL_MESSAGE_FRAGMENTTYPE(a1)                                  \
      (blpapi_Message_fragmentType)(a1)
  #define BLPAPI_CALL_SESSIONOPTIONS_MAXEVENTQUEUESIZE(a1)                      \
      (blpapi_SessionOptions_maxEventQueueSize)(a1)
  #define BLPAPI_CALL_SESSIONOPTIONS_SLOWCONSUMERHIWATERMARK(a1)                \
      (blpapi_SessionOptions_slowConsumerWarningHiWaterMark)(a1)
  #define BLPAPI_CALL_SESSIONOPTIONS_SLOWCONSUMERLOWATERMARK(a1)                \
      (blpapi_SessionOptions_slowConsumerWarningLoWaterMark)(a1)
  
  #define BLPAPI_CALL_SESSIONOPTIONS_DEFAULTKEEPALIVEINACTIVITYTIME(a1)         \
      (blpapi_SessionOptions_defaultKeepAliveInactivityTime)(a1)
  #define BLPAPI_CALL_SESSIONOPTIONS_DEFAULTKEEPALIVERESPONSETIMEOUT(a1)        \
      (blpapi_SessionOptions_defaultKeepAliveResponseTimeout)(a1)
  #define BLPAPI_CALL_SESSIONOPTIONS_KEEPALIVEENABLED(a1)                       \
      (blpapi_SessionOptions_keepAliveEnabled)(a1)
  #define BLPAPI_CALL_SESSIONOPTIONS_SETDEFAULTKEEPALIVEINACTIVITYTIME(a1, a2)  \
      (blpapi_SessionOptions_setDefaultKeepAliveInactivityTime)(a1, a2)
  #define BLPAPI_CALL_SESSIONOPTIONS_SETDEFAULTKEEPALIVERESPONSETIMEOUT(a1, a2) \
      (blpapi_SessionOptions_setDefaultKeepAliveResponseTimeout)(a1, a2)
  #define BLPAPI_CALL_SESSIONOPTIONS_SETKEEPALIVEENABLED(a1, a2)                \
      (blpapi_SessionOptions_setKeepAliveEnabled)(a1, a2)
  
  #define BLPAPI_CALL_HIGHPRECISIONDATETIME_COMPARE(a1, a2)                     \
      (blpapi_HighPrecisionDatetime_compare)(a1, a2)
  #define BLPAPI_CALL_HIGHPRECISIONDATETIME_PRINT(a1, a2, a3, a4, a5)           \
      (blpapi_HighPrecisionDatetime_print)(a1, a2, a3, a4, a5)
  #define BLPAPI_CALL_ELEMENT_SETVALUEHIGHPRECISIONDATETIME(a1, a2, a3)         \
      (blpapi_Element_setValueHighPrecisionDatetime(a1, a2, a3))
  #define BLPAPI_CALL_ELEMENT_SETELEMENTHIGHPRECISIONDATETIME(a1, a2, a3, a4)   \
      (blpapi_Element_setElementHighPrecisionDatetime(a1, a2, a3, a4))
  #define BLPAPI_CALL_ELEMENT_GETVALUEASHIGHPRECISIONDATETIME(a1, a2, a3)       \
      return blpapi_Element_getValueAsHighPrecisionDatetime(                    \
                                                   a1,                          \
                                                   &a2->rawHighPrecisionValue(),\
                                                   a3);
  #define BLPAPI_CALL_SESSION_RESUBSCRIBEWITHID(a1, a2, a3, a4, a5)             \
      (blpapi_Session_resubscribeWithId)(a1, a2, a3, a4, a5)
  
  #define BLPAPI_CALL_EVENTFORMATTER_SETVALUENULL(a1, a2, a3)                   \
      (blpapi_EventFormatter_setValueNull)(a1, a2, a3)
  
  #define BLPAPI_CALL_DIAGNOSTICSUTIL_MEMORYINFO(a1, a2)                        \
      return blpapi_DiagnosticsUtil_memoryInfo(a1, a2);
  
  #define BLPAPI_CALL_SUBSCRIPTIONLIST_ADDRESOLVED(a1, a2, a3)                  \
      (blpapi_SubscriptionList_addResolved)(a1, a2, a3)
  #define BLPAPI_CALL_SUBSCRIPTIONLIST_ISRESOLVEDAT(a1, a2, a3)                 \
      (blpapi_SubscriptionList_isResolvedAt)(a1, a2, a3)
  
  #define BLPAPI_CALL_PROVIDERSESSION_DEREGISTERSERVICE(a1, a2)                 \
      (blpapi_ProviderSession_deregisterService(a1, a2))
  
  #define BLPAPI_CALL_SERVICEREGISTRATIONOPTIONS_SETPARTSTOREGISTER(a1, a2)     \
      (blpapi_ServiceRegistrationOptions_setPartsToRegister(a1, a2))
  
  #define BLPAPI_CALL_SERVICEREGISTRATIONOPTIONS_GETPARTSTOREGISTER(a1)         \
      (blpapi_ServiceRegistrationOptions_getPartsToRegister(a1))
  
  #define BLPAPI_CALL_PROVIDERSESSION_DELETETOPICS(a1, a2, a3)                 \
      (blpapi_ProviderSession_deleteTopics(a1, a2, a3))
  
  #define BLPAPI_CALL_PROVIDERSESSION_ACTIVATESUBSERVICECODERANGE(              \
                                                            a1, a2, a3, a4, a5) \
      (blpapi_ProviderSession_activateSubServiceCodeRange)(a1, a2, a3, a4, a5)
  
  #define BLPAPI_CALL_PROVIDERSESSION_DEACTIVATESUBSERVICECODERANGE(            \
                                                                a1, a2, a3, a4) \
      (blpapi_ProviderSession_deactivateSubServiceCodeRange)(a1, a2, a3, a4)
  
  #define BLPAPI_CALL_SERVICEREGISTRATIONOPTIONS_ADDACTIVATESUBSERVICECODERANGE(\
                                                                a1, a2, a3, a4) \
      (blpapi_ServiceRegistrationOptions_addActiveSubServiceCodeRange)(         \
                                                                  a1, a2, a3, a4)
  
  #define                                                                       \
    BLPAPI_CALL_SERVICEREGISTRATIONOPTIONS_REMOVEALLACTIVESUBSERVICECODERANGES( \
                                                                            a1) \
      (blpapi_ServiceRegistrationOptions_removeAllActiveSubServiceCodeRanges)(a1)
  
  #define BLPAPI_CALL_MESSAGE_TIMERECEIVED(a1, a2)                              \
      (blpapi_Message_timeReceived)(a1, a2)
  #define BLPAPI_CALL_SESSIONOPTION_SETRECORDSUBSCRIPTIONDATARECEIVETIMES(a1,   \
                                                                          a2)   \
      (blpapi_SessionOptions_setRecordSubscriptionDataReceiveTimes)(a1, a2)
  #define BLPAPI_CALL_SESSIONOPTION_RECORDSUBSCRIPTIONDATARECEIVETIMES(a1)      \
      (blpapi_SessionOptions_recordSubscriptionDataReceiveTimes)(a1)
  
  #define BLPAPI_CALL_TIMEPOINTUTIL_NANOSECONDSBETWEEN(a1,a2)                   \
      (blpapi_TimePointUtil_nanosecondsBetween)(a1, a2)
  #define BLPAPI_CALL_HIGHRESOLUTIONCLOCK_NOW(a1)                               \
      (blpapi_HighResolutionClock_now)(a1)
  #define BLPAPI_CALL_HIGHPRECISIONDATETIME_FROMTIMEPOINT(a1, a2, a3)           \
      (blpapi_HighPrecisionDatetime_fromTimePoint)(a1, a2, a3)
  
  #endif // if defined(_WIN32) || defined(__WIN32__)
  
  #endif // __cplusplus
  
  #endif // INCLUDED_BLPAPI_CALL
  