30 #include <type_traits> 31 #include <unordered_set> 34 #include <pdi/pdi_fwd.h> 35 #include <pdi/logger.h> 56 virtual ~
Plugin() noexcept(
false);
65 #define PLUGIN_API_VERSION_MAJOR (0ul) 67 #define PLUGIN_API_VERSION_MINOR (0ul) 69 #define PLUGIN_API_VERSION_PATCH (1ul) 71 #define PLUGIN_API_VERSION ((PLUGIN_API_VERSION_MAJOR<<24) + (PLUGIN_API_VERSION_MINOR<<16) + (PLUGIN_API_VERSION_PATCH<<8)) 89 struct has_dependencies {
91 static constexpr decltype(C::dependencies(),
bool()) test(
int)
96 static constexpr
bool test(...)
100 static constexpr
bool value = test<T>(int());
109 typename std::enable_if<has_dependencies<T>::value, std::pair<std::unordered_set<std::string>, std::unordered_set<std::string>>>::type plugin_dependencies()
111 return T::dependencies();
120 typename std::enable_if<!has_dependencies<T>::value, std::pair<std::unordered_set<std::string>, std::unordered_set<std::string>>>::type plugin_dependencies()
128 struct has_pretty_name {
129 template <
typename C>
130 static constexpr decltype(C::pretty_name(),
bool()) test(
int)
134 template <
typename C>
135 static constexpr
bool test(...)
139 static constexpr
bool value = test<T>(int());
148 typename std::enable_if<has_pretty_name<T>::value, std::string>::type plugin_pretty_name(
const std::string& plugin_name)
150 return T::pretty_name();
159 typename std::enable_if<!has_pretty_name<T>::value, std::string>::type plugin_pretty_name(
const std::string& plugin_name)
183 #define PDI_PLUGIN(name)\ 184 _Pragma("clang diagnostic push")\ 185 _Pragma("clang diagnostic ignored \"-Wmissing-prototypes\"")\ 186 _Pragma("clang diagnostic ignored \"-Wreturn-type-c-linkage\"")\ 187 extern "C" ::std::unique_ptr<::PDI::Plugin> PDI_EXPORT PDI_plugin_##name##_loader(::PDI::Context& ctx, PC_tree_t conf) \ 189 auto plugin = ::std::unique_ptr<name##_plugin>{new name##_plugin{ctx, conf}};\ 190 ::PDI::plugin_api_version(PLUGIN_API_VERSION);\ 193 extern "C" ::std::pair<::std::unordered_set<::std::string>, ::std::unordered_set<::std::string>> PDI_EXPORT PDI_plugin_##name##_dependencies() \ 195 return ::plugin_dependencies<name##_plugin>();\ 197 extern "C" ::std::string PDI_EXPORT PDI_plugin_##name##_pretty_name() \ 199 return ::plugin_pretty_name<name##_plugin>(#name);\ 201 _Pragma("clang diagnostic pop") 203 #endif // PDI_PLUGIN_H_
unsigned long plugin_api_version(unsigned long expected_version=0)
Checks compatibility with a plugin API.
The class PDI plugins should implement.
Definition: plugin.h:42
Definition: array_datatype.h:37