Apama  10.3.1.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
correlator_plugin.hpp
Go to the documentation of this file.
1 /*
2  * correlator_plugin.hpp
3  *
4  * Apama Plugin C++ API definitions. Used by plugin libraries and the plugin
5  * support code within the Engine itself.
6  *
7  * $Copyright(c) 2002, 2004-2006, 2008-2013 Progress Software Corporation (PSC). All rights reserved.$
8  * $Copyright (c) 2013-2018 Software AG, Darmstadt, Germany and/or Software AG USA Inc., Reston, VA, USA, and/or its subsidiaries and/or its affiliates and/or their licensors.$
9  * Use, reproduction, transfer, publication or disclosure is prohibited except as specifically provided for in your License Agreement with Software AG
10  *
11  * $Id: correlator_plugin.hpp 339905 2018-10-25 12:25:38Z antm $
12  */
13 
21 #ifndef CORRELATOR_PLUGIN_HPP
22 #define CORRELATOR_PLUGIN_HPP
23 
24 #ifndef _AP_NO_DEPRECATED_PLUGINAPI_WARNING
25 #ifdef __GNUC__
26 #warning This API for writing EPL plugins is deprecated. Please use the API located in epl_plugin.hpp instead
27 #else
28 #pragma message("correlator_plugin.hpp(0) Warning: This API for writing EPL plugins is deprecated. Please use the API located in epl_plugin.hpp instead")
29 #endif
30 #endif
31 
32 #include <ApamaTypes.h>
33 #include <AP_Platform.h>
34 #include <AP_PluginCommon.h>
35 #include <exception>
36 #include <stdexcept>
37 #include <string>
38 #include <vector>
39 #include <iostream>
40 #include <memory>
41 
51  /* Version history:
52  * 1.0 First version released in Apama Engine 2.0.3
53  * Win32 support added in Apama Engine 2.0.4
54  * 2.0 Add serialisation support for Apama Engine 2.1 release
55  * Unfortunately this breaks back compatibility of chunks
56  * 3.0 Added getCorrelator, for internal use only
57  * 4.0 Make the result of the getCorrelator() context method into a real
58  * public class - AP_CorrelatorInterface. Unfortunately v3.0 plugins
59  * will be expecting a different type to be returned by this method,
60  * so a major version bump is required. However, this does bring the
61  * C++ and C plugin APIs back into sync - future changes can be made
62  * to both APIs and the version numbers incremented together.
63  * 5.0 Add getContextId and sendEventTo. Also added the optional
64  * GET_CAPABILITIES and THREAD_ENDED functions that the plugin may
65  * provide. Improved some function prototypes.
66  * 6.0 Improved the interface's const-correctness. Increased the
67  * performance of AP_TypeList, made AP_Chunk construction and
68  * destruction cheaper, especially in a multi-threaded
69  * environment. Added AP_Type::visitSequenceElements.
70  * 7.0 Remove serialisation support
71  * Prohibit mutation of string arguments to plug-in functions
72  * Improve validation of returned values
73  * 8.0 Integrate BlockingAware functions into public AP_Context and
74  * AP_CorrelatorInterface.
75  * 9.0 Add support for modifying sequence lengths and returning sequences
76  */
77 #define AP_PLUGIN_VERSION 0x00090000
78 
79 // suse doesn't have std::initializer_list because it's still on gcc 4.3. Snip out those functions on suse
80 #if (__GNUC__ > 4 || __GNUC_MINOR__ > 3 || !defined(__linux__))
81 #define _has_std_initializer_list
82 #endif
83 
84 
85 
94 class AP_PluginException : public std::runtime_error
95 {
96 public:
99  explicit AP_PluginException(const std::string& what) : std::runtime_error(what) { }
100 };
101 
102 
111 {
112 public:
115  explicit AP_TypeException(const std::string& what) : AP_PluginException(what) { }
116 };
117 
118 
128 {
129 public:
132  explicit AP_UnimplementedException(const std::string& what) : AP_PluginException(what) { }
133 };
134 
135 
143 {
144 public:
147  explicit AP_BoundsException(const std::string& what) : AP_PluginException(what) { }
148 };
149 
160 {
161 public:
169  explicit AP_UserPluginException(const std::string &type, const std::string& what)
170  : AP_PluginException(what), type(type)
171  {}
172 
175  const std::string& getType() const
176  {
177  return type;
178  }
179 
180  ~AP_UserPluginException() throw() {}
181 private:
182  std::string type;
183 };
184 
185 /* Forward declarations */
186 class AP_Chunk;
188 
209 class AP_PLUGIN_API AP_Context
210 {
211 public:
214  virtual ~AP_Context() {}
215 
218  virtual uint32 version() const = 0;
219 
234  virtual char8* char8alloc(size_t len) const = 0;
235 
247  virtual char8* char8dup(const char8* s) const = 0;
248 
257  virtual void char8free(char8* s) const = 0;
258 
262  virtual AP_CorrelatorInterface* getCorrelator() const = 0;
263 
268  virtual AP_uint64 getContextId() const = 0;
269 
277  virtual void pluginNowBlocking() const = 0;
278 
285  class NoContext;
286 };
287 
294 class AP_PLUGIN_API AP_Context::NoContext: public AP_Context
295 {
296 public:
297  virtual ~NoContext() {}
298  virtual uint32 version() const { return 0; }
299  virtual char8* char8alloc(size_t len) const { return 0; }
300  virtual char8* char8dup(const char8* s) const { return 0; }
301  virtual void char8free(char8* s) const { }
302  virtual AP_CorrelatorInterface* getCorrelator() const { return 0; }
303  virtual AP_uint64 getContextId() const { return 0; }
304  virtual void pluginNowBlocking() const { }
305 };
306 
315 {
316 public:
324  typedef std::shared_ptr<AP_EventHandlerInterface> ptr_t;
325 
330 
339  virtual void handleEvent(const AP_Context &ctx, const char *event, const char *channel) = 0;
340 };
341 
351 {
352 public:
355  virtual ~AP_CorrelatorInterface() = 0;
356 
369  virtual void pluginNowBlocking() const = 0;
370 
378  virtual void sendEvent(const char* event) = 0;
379 
394  virtual void sendEventTo(const char* event, AP_uint64 targetContext, AP_uint64 sourceContext) = 0;
395 
406  virtual void sendEventTo(const char* event, AP_uint64 targetContext, const AP_Context &source) = 0;
407 
418  virtual void sendEventTo(const char *event, const char *targetChannel, const AP_Context &source) = 0;
419 #ifdef _has_std_initializer_list
420 
435  void subscribe(const AP_EventHandlerInterface::ptr_t &handler, std::initializer_list<const char *> channels)
436  {
437  subscribe_impl(handler, channels.begin(), channels.end());
438  }
439 #endif
440 
467  template<typename ITER>
468  void subscribe(const AP_EventHandlerInterface::ptr_t &handler, const ITER &start, const ITER &end)
469  {
470  subscribe_impl(handler, start, end);
471  }
472 
488  template<typename T>
489  void subscribe(const AP_EventHandlerInterface::ptr_t &handler, const T &channel)
490  {
491  subscribe_impl(handler, &channel, (&channel)+1);
492  }
493 #ifdef _has_std_initializer_list
494 
507  void unsubscribe(const AP_EventHandlerInterface::ptr_t &handler, std::initializer_list<const char *> channels)
508  {
509  unsubscribe_impl(handler, channels.begin(), channels.end());
510  }
511 #endif
512 
537  template<typename ITER>
538  void unsubscribe(const AP_EventHandlerInterface::ptr_t &handler, const ITER &start, const ITER &end)
539  {
540  unsubscribe_impl(handler, start, end);
541  }
542 
554  template<typename T>
555  void unsubscribe(const AP_EventHandlerInterface::ptr_t &handler, const T &channel)
556  {
557  unsubscribe_impl(handler, &channel, (&channel)+1);
558  }
559 
567  virtual void unsubscribe(const AP_EventHandlerInterface::ptr_t &handler) = 0;
568 
569 protected:
572  virtual void subscribe_impl(const AP_EventHandlerInterface::ptr_t &handler, char const *const *start, char const *const *end) = 0;
575  virtual void unsubscribe_impl(const AP_EventHandlerInterface::ptr_t &handler, char const *const *start, char const *const *end) = 0;
581  template<typename ITER>
582  void subscribe_impl(const AP_EventHandlerInterface::ptr_t &handler, const ITER &start, const ITER &end)
583  {
584  for (ITER it = start; it != end; ++it) {
585  subscribe_impl(handler, (char const *const *) &(*it), (char const *const *) &(*it) + 1);
586  }
587  }
593  template<typename ITER>
594  void unsubscribe_impl(const AP_EventHandlerInterface::ptr_t &handler, const ITER &start, const ITER &end)
595  {
596  for (ITER it = start; it != end; ++it) {
597  unsubscribe_impl(handler, (char const *const *) &(*it), (char const *const *) &(*it) + 1);
598  }
599  }
600 };
601 
613 class AP_PLUGIN_API AP_Chunk
614 {
615 public:
630  virtual ~AP_Chunk() {}
631 
642  virtual AP_Chunk* copy(const AP_Context& ctx) const = 0;
643 
649  explicit AP_Chunk(const AP_Context &) {}
650 
655  AP_Chunk() {}
656 };
657 
658 
659 
674 class AP_Type
675 {
676 public:
679  virtual ~AP_Type() = 0;
680 
683  virtual AP_TypeDiscriminator discriminator() const = 0;
684 
687  virtual void copyFrom(const AP_Type &other) = 0;
688 
691  virtual AP_Chunk* chunkValue() const = 0;
692 
704  virtual AP_Chunk *chunkValue(AP_Chunk* val) const = 0;
705 
708  virtual int64 integerValue() const = 0;
709 
712  virtual void integerValue(int64 val) = 0;
713 
716  virtual float64 floatValue() const = 0;
717 
720  virtual void floatValue(float64 val) = 0;
721 
724  virtual AP_decimal decimalValue() const = 0;
725 
728  virtual void decimalValue(AP_decimal val) = 0;
729 
732  virtual bool booleanValue() const = 0;
733 
736  virtual void booleanValue(bool val) = 0;
737 
740  virtual const char8* stringValue() const = 0;
741 
747  virtual void stringValue(const char8* val) = 0;
748 
751  virtual size_t sequenceLength() const = 0;
752 
761  virtual void setSequenceLength(size_t length) const = 0;
762 
771  virtual void createSequence(AP_TypeDiscriminator inner) = 0;
772 
775  virtual AP_TypeDiscriminator sequenceType() const = 0;
776 
782  virtual AP_Type &sequenceElement(size_t index) const = 0;
783 
792  template <typename FN>
793  void visitSequenceElements(const FN &fn, size_t start = 0, size_t length = size_t(-1)) const {
794  visitSequenceElementsImpl(Wrap<FN>(fn), start, length);
795  }
796 
802  virtual AP_Type* const * sequenceElements(size_t start = 0, size_t length = size_t(-1)) const = 0;
803 
813  virtual void releaseSequenceElements() const = 0;
814 
825  virtual AP_Chunk* const * chunkSequenceElements(size_t start = 0, size_t length = size_t(-1)) const = 0;
826 
835  virtual void releaseChunkSequenceElements() const = 0;
836 
842  virtual int64* integerSequenceElements(size_t start = 0, size_t length = size_t(-1)) const = 0;
843 
853  virtual void releaseIntegerSequenceElements() const = 0;
854 
860  virtual float64* floatSequenceElements(size_t start = 0, size_t length = size_t(-1)) const = 0;
861 
871  virtual void releaseFloatSequenceElements() const = 0;
872 
878  virtual AP_decimal* decimalSequenceElements(size_t start = 0, size_t length = size_t(-1)) const = 0;
879 
889  virtual void releaseDecimalSequenceElements() const = 0;
890 
896  virtual bool* booleanSequenceElements(size_t start = 0, size_t length = size_t(-1)) const = 0;
897 
907  virtual void releaseBooleanSequenceElements() const = 0;
908 
916  virtual const char8** stringSequenceElements(size_t start = 0, size_t length = size_t(-1)) const = 0;
917 
935  virtual void releaseStringSequenceElements() const = 0;
936 
937 
940  operator AP_Chunk*() const {
941  return chunkValue();
942  }
943 
947  chunkValue(val);
948  return *this;
949  }
950 
953  operator int64() const {
954  return integerValue();
955  }
956 
959  AP_Type &operator= (int64 val) {
960  integerValue(val);
961  return *this;
962  }
963 
966  operator float64() const {
967  return floatValue();
968  }
969 
972  AP_Type &operator= (float64 val) {
973  floatValue(val);
974  return *this;
975  }
976 
979  operator AP_decimal() const {
980  return decimalValue();
981  }
982 
985  AP_Type &operator= (AP_decimal val) {
986  decimalValue(val);
987  return *this;
988  }
989 
992  operator bool() const {
993  return booleanValue();
994  }
995 
998  AP_Type &operator= (bool val) {
999  booleanValue(val);
1000  return *this;
1001  }
1002 
1005  operator const char8*() const {
1006  return stringValue();
1007  }
1008 
1011  AP_Type &operator= (const char8* val) {
1012  stringValue(val);
1013  return *this;
1014  }
1015 
1018  AP_Type& operator[] (size_t index) const {
1019  return sequenceElement(index);
1020  }
1021 
1024  AP_Type &operator=(const AP_Type &other)
1025  {
1026  copyFrom(other);
1027  return *this;
1028  }
1029 
1030 protected:
1037  class ElementFn {
1038  public:
1039  virtual ~ElementFn() { }
1040  virtual void operator()(AP_Type &) const =0;
1041  };
1042 
1045  virtual void visitSequenceElementsImpl(const ElementFn &, size_t start, size_t length) const =0;
1046 
1047 private:
1050  template <typename FN>
1051  class Wrap : public ElementFn {
1052  public:
1053  explicit Wrap(const FN &fn) : fn(fn) {}
1054  void operator()(AP_Type &arg) const { fn(arg); }
1055  private:
1056  const FN &fn;
1057  };
1058 };
1059 
1060 
1061 
1070 {
1071 public:
1075  template <typename T> AP_TypeList(const T *array, size_t n)
1076  : ptr(reinterpret_cast<const char *>(static_cast<const AP_Type *>(array))),
1077  n(n),
1078  stride(sizeof(T))
1079  {}
1080 
1083  size_t size() const { return n; }
1084 
1087  bool empty() const { return n==0; }
1088 
1091  const AP_Type &operator[] (size_t i) const {
1092  return *reinterpret_cast<const AP_Type *>(ptr + i*stride);
1093  }
1094 
1095 private:
1098  const char *ptr;
1101  size_t n;
1104  size_t stride;
1105 };
1106 
1107 
1108 
1119 typedef void (AP_PLUGIN_CALL* AP_FunctionPtr)(const AP_Context& ctx, const AP_TypeList& args, AP_Type& rval, AP_TypeDiscriminator rtype);
1120 
1121 
1122 
1134 {
1137  const char8* name;
1138 
1142 
1145  size_t nParams;
1146 
1149  const char8** paramTypes;
1150 
1153  const char8* returnType;
1154 };
1155 
1156 
1157 
1182 typedef AP_PLUGIN_DLL_SYM AP_ErrorCode (AP_PLUGIN_CALL* AP_InitFunctionPtr)(const AP_Context& ctx, uint32& version, uint32& nFunctions, AP_Function*& functions);
1183 
1184 
1198 typedef AP_PLUGIN_DLL_SYM AP_ErrorCode (AP_PLUGIN_CALL* AP_ShutdownFunctionPtr)(const AP_Context& ctx);
1199 
1200 
1219 typedef AP_PLUGIN_DLL_SYM AP_ErrorCode (AP_PLUGIN_CALL* AP_LibraryVersionFunctionPtr)(const AP_Context& ctx, uint32& version);
1220 
1237 typedef AP_PLUGIN_DLL_SYM AP_Capabilities (AP_PLUGIN_CALL* AP_GetCapabilitiesFunctionPtr)(const AP_Context& ctx);
1238 
1239 
1255 typedef AP_PLUGIN_DLL_SYM AP_ErrorCode (AP_PLUGIN_CALL* AP_ThreadEndedFunctionPtr) (const AP_Context& ctx);
1256 
1257 #endif // CORRELATOR_PLUGIN_HPP
virtual void pluginNowBlocking() const =0
virtual const char8 ** stringSequenceElements(size_t start=0, size_t length=size_t(-1)) const =0
[DEPRECATED] Execution context for a library function call.
Definition: correlator_plugin.hpp:209
AP_UnimplementedException(const std::string &what)
Definition: correlator_plugin.hpp:132
AP_PLUGIN_DLL_SYM AP_ErrorCode(AP_PLUGIN_CALL *AP_ThreadEndedFunctionPtr)(const AP_Context &ctx)
Definition: correlator_plugin.hpp:1255
size_t nParams
Definition: correlator_plugin.hpp:1145
virtual size_t sequenceLength() const =0
[DEPRECATED] Type-safe encapsulation of an EPL object, for passing arguments and return values into a...
Definition: correlator_plugin.hpp:674
const char8 * returnType
Definition: correlator_plugin.hpp:1153
void subscribe(const AP_EventHandlerInterface::ptr_t &handler, std::initializer_list< const char * > channels)
Definition: correlator_plugin.hpp:435
virtual void releaseDecimalSequenceElements() const =0
virtual bool * booleanSequenceElements(size_t start=0, size_t length=size_t(-1)) const =0
virtual void subscribe_impl(const AP_EventHandlerInterface::ptr_t &handler, char const *const *start, char const *const *end)=0
std::shared_ptr< AP_EventHandlerInterface > ptr_t
Definition: correlator_plugin.hpp:324
virtual void pluginNowBlocking() const =0
void unsubscribe(const AP_EventHandlerInterface::ptr_t &handler, const T &channel)
Definition: correlator_plugin.hpp:555
virtual AP_Chunk *const * chunkSequenceElements(size_t start=0, size_t length=size_t(-1)) const =0
AP_FunctionPtr fptr
Definition: correlator_plugin.hpp:1141
AP_Capabilities
Definition: AP_PluginCommon.h:108
AP_PLUGIN_DLL_SYM AP_ErrorCode(AP_PLUGIN_CALL * AP_InitFunctionPtr)(const AP_Context &ctx, uint32 &version, uint32 &nFunctions, AP_Function *&functions)
Definition: correlator_plugin.hpp:1182
virtual ~AP_Context()
Definition: correlator_plugin.hpp:214
virtual AP_uint64 getContextId() const =0
virtual AP_Type & sequenceElement(size_t index) const =0
AP_Type & operator=(AP_Chunk *val)
Definition: correlator_plugin.hpp:946
void subscribe_impl(const AP_EventHandlerInterface::ptr_t &handler, const ITER &start, const ITER &end)
Definition: correlator_plugin.hpp:582
virtual bool booleanValue() const =0
virtual void sendEvent(const char *event)=0
[DEPRECATED] Thrown by plugin authors to signal an error to any EPL calling this plugin.
Definition: correlator_plugin.hpp:159
virtual void releaseFloatSequenceElements() const =0
[DEPRECATED]
Definition: correlator_plugin.hpp:1037
virtual AP_TypeDiscriminator sequenceType() const =0
virtual void releaseBooleanSequenceElements() const =0
AP_Chunk()
Definition: correlator_plugin.hpp:655
virtual void setSequenceLength(size_t length) const =0
STL namespace.
const AP_Type & operator[](size_t i) const
Definition: correlator_plugin.hpp:1091
virtual void releaseIntegerSequenceElements() const =0
virtual void copyFrom(const AP_Type &other)=0
void(AP_PLUGIN_CALL * AP_FunctionPtr)(const AP_Context &ctx, const AP_TypeList &args, AP_Type &rval, AP_TypeDiscriminator rtype)
Definition: correlator_plugin.hpp:1119
AP_TypeDiscriminator
Definition: AP_PluginCommon.h:56
virtual ~AP_EventHandlerInterface()
Definition: correlator_plugin.hpp:329
virtual ~AP_CorrelatorInterface()=0
virtual void releaseStringSequenceElements() const =0
virtual int64 * integerSequenceElements(size_t start=0, size_t length=size_t(-1)) const =0
AP_Type & operator[](size_t index) const
Definition: correlator_plugin.hpp:1018
virtual AP_decimal * decimalSequenceElements(size_t start=0, size_t length=size_t(-1)) const =0
AP_BoundsException(const std::string &what)
Definition: correlator_plugin.hpp:147
[DEPRECATED] An interface class that should be implemented by event handlers which are registered via...
Definition: correlator_plugin.hpp:314
AP_PLUGIN_DLL_SYM AP_ErrorCode(AP_PLUGIN_CALL * AP_ShutdownFunctionPtr)(const AP_Context &ctx)
Definition: correlator_plugin.hpp:1198
[DEPRECATED] Type error.
Definition: correlator_plugin.hpp:110
virtual char8 * char8dup(const char8 *s) const =0
AP_Type & operator=(const AP_Type &other)
Definition: correlator_plugin.hpp:1024
AP_TypeException(const std::string &what)
Definition: correlator_plugin.hpp:115
[DEPRECATED] Thrown by an attempt to use a function that is defined but not implemented in this versi...
Definition: correlator_plugin.hpp:127
[DEPRECATED] Asynchronous interface to the correlator.
Definition: correlator_plugin.hpp:350
void visitSequenceElements(const FN &fn, size_t start=0, size_t length=size_t(-1)) const
Definition: correlator_plugin.hpp:793
virtual char8 * char8alloc(size_t len) const =0
virtual void sendEventTo(const char *event, AP_uint64 targetContext, AP_uint64 sourceContext)=0
virtual AP_CorrelatorInterface * getCorrelator() const =0
virtual void releaseSequenceElements() const =0
virtual void unsubscribe_impl(const AP_EventHandlerInterface::ptr_t &handler, char const *const *start, char const *const *end)=0
[DEPRECATED] Container class for an ordered list of AP_Type objects, typically used to hold the argum...
Definition: correlator_plugin.hpp:1069
void unsubscribe_impl(const AP_EventHandlerInterface::ptr_t &handler, const ITER &start, const ITER &end)
Definition: correlator_plugin.hpp:594
void subscribe(const AP_EventHandlerInterface::ptr_t &handler, const T &channel)
Definition: correlator_plugin.hpp:489
void subscribe(const AP_EventHandlerInterface::ptr_t &handler, const ITER &start, const ITER &end)
Definition: correlator_plugin.hpp:468
virtual AP_Type *const * sequenceElements(size_t start=0, size_t length=size_t(-1)) const =0
bool empty() const
Definition: correlator_plugin.hpp:1087
virtual void releaseChunkSequenceElements() const =0
AP_UserPluginException(const std::string &type, const std::string &what)
Definition: correlator_plugin.hpp:169
virtual float64 floatValue() const =0
[DEPRRECATED] Base class for all 'chunk' classes.
Definition: correlator_plugin.hpp:613
virtual AP_Chunk * chunkValue() const =0
[DEPRRECATED] Boundary checking error.
Definition: correlator_plugin.hpp:142
const std::string & getType() const
Definition: correlator_plugin.hpp:175
const char8 ** paramTypes
Definition: correlator_plugin.hpp:1149
virtual int64 integerValue() const =0
AP_PLUGIN_DLL_SYM AP_ErrorCode(AP_PLUGIN_CALL * AP_LibraryVersionFunctionPtr)(const AP_Context &ctx, uint32 &version)
Definition: correlator_plugin.hpp:1219
void unsubscribe(const AP_EventHandlerInterface::ptr_t &handler, std::initializer_list< const char * > channels)
Definition: correlator_plugin.hpp:507
[DEPRECATED] Plugin function descriptor.
Definition: correlator_plugin.hpp:1133
virtual AP_TypeDiscriminator discriminator() const =0
AP_PLUGIN_DLL_SYM AP_Capabilities(AP_PLUGIN_CALL * AP_GetCapabilitiesFunctionPtr)(const AP_Context &ctx)
Definition: correlator_plugin.hpp:1237
[DEPRECATED] Base class of all exceptions thrown across the correlator/plugin boundary.
Definition: correlator_plugin.hpp:94
virtual void createSequence(AP_TypeDiscriminator inner)=0
virtual void visitSequenceElementsImpl(const ElementFn &, size_t start, size_t length) const =0
virtual ~AP_Type()=0
size_t size() const
Definition: correlator_plugin.hpp:1083
AP_ENGINE_CLIENT_API void char8free(char *string)
Free any char* string returned from the client API.
AP_PluginException(const std::string &what)
Definition: correlator_plugin.hpp:99
const char8 * name
Definition: correlator_plugin.hpp:1137
virtual float64 * floatSequenceElements(size_t start=0, size_t length=size_t(-1)) const =0
virtual AP_decimal decimalValue() const =0
AP_Chunk(const AP_Context &)
Definition: correlator_plugin.hpp:649
virtual void char8free(char8 *s) const =0
AP_TypeList(const T *array, size_t n)
Definition: correlator_plugin.hpp:1075
virtual uint32 version() const =0
virtual ~AP_Chunk()
Definition: correlator_plugin.hpp:630
void unsubscribe(const AP_EventHandlerInterface::ptr_t &handler, const ITER &start, const ITER &end)
Definition: correlator_plugin.hpp:538
virtual const char8 * stringValue() const =0
virtual void handleEvent(const AP_Context &ctx, const char *event, const char *channel)=0