32#include <unordered_set>
35#include <pdi/pdi_fwd.h>
36#include <pdi/logger.h>
37#include <pdi/version.h>
78#define PDI_PLUGIN_API_VERSION_MAJOR 0
81#define PDI_PLUGIN_API_VERSION_MINOR (PDI_VERSION_MAJOR * 128 + PDI_VERSION_MINOR)
84#define PDI_PLUGIN_API_VERSION_PATCH PDI_VERSION_PATCH
91#define PDI_COMPUTE_PLUGIN_API_VERSION(MAJOR, MINOR, PATCH) \
92 (((UINT64_C(0) + (MAJOR)) << 48) | ((UINT64_C(0) + (MINOR)) << 32) | ((UINT64_C(0) + (PATCH)) << 16))
95#define PDI_PLUGIN_API_VERSION \
96 PDI_COMPUTE_PLUGIN_API_VERSION(PDI_PLUGIN_API_VERSION_MAJOR, PDI_PLUGIN_API_VERSION_MINOR, PDI_PLUGIN_API_VERSION_PATCH)
99#define PLUGIN_API_VERSION_MAJOR PDI_PLUGIN_API_VERSION_MAJOR
102#define PLUGIN_API_VERSION_MINOR PDI_PLUGIN_API_VERSION_MINOR
105#define PLUGIN_API_VERSION_PATCH PDI_PLUGIN_API_VERSION_PATCH
108#define PLUGIN_API_VERSION PDI_PLUGIN_API_VERSION
111#if defined(__clang__) && __clang_major__ >= 14
112#pragma clang deprecated(PLUGIN_API_VERSION_MAJOR, "use PDI_PLUGIN_API_VERSION_MAJOR instead")
113#pragma clang deprecated(PLUGIN_API_VERSION_MINOR, "use PDI_PLUGIN_API_VERSION_MINOR instead")
114#pragma clang deprecated(PLUGIN_API_VERSION_PATCH, "use PDI_PLUGIN_API_VERSION_PATCH instead")
115#pragma clang deprecated(PLUGIN_API_VERSION, "use PDI_PLUGIN_API_VERSION instead")
133#if defined(__clang__)
139#define PDI_PLUGIN_IGNORE_WARNINGS_BEGIN \
140 _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wmissing-prototypes\"") \
141 _Pragma("clang diagnostic ignored \"-Wreturn-type-c-linkage\"")
144#define PDI_PLUGIN_IGNORE_WARNINGS_END _Pragma("clang diagnostic pop")
146#define PDI_PLUGIN_IGNORE_WARNINGS_BEGIN
147#define PDI_PLUGIN_IGNORE_WARNINGS_END
167#define PDI_PLUGIN(name) \
168 PDI_PLUGIN_IGNORE_WARNINGS_BEGIN extern "C" ::std::unique_ptr<::PDI::Plugin> PDI_EXPORT PDI_plugin_##name##_loader( \
169 ::PDI::Logger& logger, \
170 ::PDI::Context& ctx, \
174 auto plugin = ::std::unique_ptr<name##_plugin>{new name##_plugin{logger, ctx, conf}}; \
175 ::PDI::plugin_api_version(PDI_PLUGIN_API_VERSION); \
178 extern "C" ::std::pair<::std::unordered_set<::std::string>, ::std::unordered_set<::std::string>> PDI_EXPORT PDI_plugin_##name##_dependencies() \
180 return []<class P>() { \
181 if constexpr (requires { P::dependencies(); }) { \
182 return P::dependencies(); \
184 return ::std::pair<::std::unordered_set<::std::string>, ::std::unordered_set<::std::string>>{}; \
186 }.template operator()<name##_plugin>(); \
188 extern "C" ::std::string PDI_EXPORT PDI_plugin_##name##_pretty_name() \
190 return []<class P>(const char* fallback) -> ::std::string { \
191 if constexpr (requires { P::pretty_name(); }) { \
192 return P::pretty_name(); \
196 }.template operator()<name##_plugin>(#name); \
198 PDI_PLUGIN_IGNORE_WARNINGS_END
Wrapper for spdlog::logger with additional pattern getter method.
Definition logger.h:44
virtual ~Plugin() noexcept(false)
Plugin(Logger &logger, Context &ctx)
Initialization of the plugin.
Context & context()
Provides access to the PDI context for this plugin instance.
Logger & logger()
Provides access to the logger for this plugin instance.
Plugin(const Plugin &)=delete
Definition array_datatype.h:38
uint64_t plugin_api_version(uint64_t expected_version=0)
Checks compatibility with a plugin API.