diff --git a/distrho/src/travesty/base.h b/distrho/src/travesty/base.h index ebfb7497..ab5245d6 100644 --- a/distrho/src/travesty/base.h +++ b/distrho/src/travesty/base.h @@ -207,4 +207,18 @@ uint32_t v3_cpp_obj_unref(T** obj) return static_cast(static_cast(*obj))->unref(obj); } +template static inline +v3_result v3_cpp_obj_initialize(T** obj, v3_funknown** context) +{ + return static_cast( + static_cast(static_cast(static_cast(*obj)) + sizeof(void*)*3))->initialize(obj, context); +} + +template static inline +v3_result v3_cpp_obj_terminate(T** obj) +{ + return static_cast( + static_cast(static_cast(static_cast(*obj)) + sizeof(void*)*3))->terminate(obj); +} + #endif diff --git a/distrho/src/travesty/events.h b/distrho/src/travesty/events.h index 73798d9f..9c83bf84 100644 --- a/distrho/src/travesty/events.h +++ b/distrho/src/travesty/events.h @@ -143,4 +143,16 @@ struct v3_event_list { static constexpr const v3_tuid v3_event_list_iid = V3_ID(0x3A2C4214, 0x346349FE, 0xB2C4F397, 0xB9695A44); +#ifdef __cplusplus + +/** + * C++ variants + */ + +struct v3_event_list_cpp : v3_funknown { + v3_event_list list; +}; + +#endif + #include "align_pop.h" diff --git a/distrho/src/travesty/factory.h b/distrho/src/travesty/factory.h index 1b14f4ba..055b707d 100644 --- a/distrho/src/travesty/factory.h +++ b/distrho/src/travesty/factory.h @@ -122,4 +122,26 @@ struct v3_plugin_factory_cpp : v3_funknown { v3_plugin_factory_3 v3; }; +template<> inline +constexpr v3_plugin_factory_2* v3_cpp_obj(v3_plugin_factory_2** obj) +{ + /** + * this ugly piece of code is required due to C++ assuming `reinterpret_cast` by default, + * but we need everything to be `static_cast` for it to be `constexpr` compatible. + */ + return static_cast( + static_cast(static_cast(static_cast(*obj)) + sizeof(void*)*7)); +} + +template<> inline +constexpr v3_plugin_factory_3* v3_cpp_obj(v3_plugin_factory_3** obj) +{ + /** + * this ugly piece of code is required due to C++ assuming `reinterpret_cast` by default, + * but we need everything to be `static_cast` for it to be `constexpr` compatible. + */ + return static_cast( + static_cast(static_cast(static_cast(*obj)) + sizeof(void*)*8)); +} + #endif