diff options
author | Tim Blechmann <tim@klingt.org> | 2024-03-08 12:30:22 +0800 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-03-19 13:37:01 +0000 |
commit | 0eb32bc4fe4c099ef5cc38a9841cda0d18c9691f (patch) | |
tree | 76ab7f04e9fd1496c9ac7bde29637d73dcca5a5c | |
parent | edec1f8a4dbe6ed26f5996b1fbe24c4ee51c5585 (diff) |
GStreamer: introduce templated cast functions to improve type safety
Small quality of life improvement when casting between gstreamer
classes.
Pick-to: 6.5
Change-Id: I466601888f07d467a4d976bf0d4bf09e7fa0a7d3
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
(cherry picked from commit f8d2d0be8deacf0209847b8b4b428ffbe05fbc6a)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit 984f0411e197c759ee3fcbf580541a8507dffb82)
-rw-r--r-- | src/plugins/multimedia/gstreamer/common/qgst_p.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/plugins/multimedia/gstreamer/common/qgst_p.h b/src/plugins/multimedia/gstreamer/common/qgst_p.h index 1b066bbde..080e8e04c 100644 --- a/src/plugins/multimedia/gstreamer/common/qgst_p.h +++ b/src/plugins/multimedia/gstreamer/common/qgst_p.h @@ -40,6 +40,67 @@ QT_BEGIN_NAMESPACE +namespace QGstImpl { + +template <typename T> +struct GstObjectTraits +{ + // using Type = T; + // template <typename U> + // static bool isObjectOfType(U *); + // template <typename U> + // static T *cast(U *); +}; + +#define QGST_DEFINE_CAST_TRAITS(ClassName, MACRO_LABEL) \ + template <> \ + struct GstObjectTraits<ClassName> \ + { \ + using Type = ClassName; \ + template <typename U> \ + static bool isObjectOfType(U *arg) \ + { \ + return GST_IS_##MACRO_LABEL(arg); \ + } \ + template <typename U> \ + static Type *cast(U *arg) \ + { \ + return GST_##MACRO_LABEL##_CAST(arg); \ + } \ + template <typename U> \ + static Type *checked_cast(U *arg) \ + { \ + return GST_##MACRO_LABEL(arg); \ + } \ + }; \ + static_assert(true, "ensure semicolon") + +QGST_DEFINE_CAST_TRAITS(GstPipeline, PIPELINE); +QGST_DEFINE_CAST_TRAITS(GstElement, ELEMENT); +QGST_DEFINE_CAST_TRAITS(GstBin, BIN); +QGST_DEFINE_CAST_TRAITS(GstPad, PAD); + +#undef QGST_DEFINE_CAST_TRAITS + +} // namespace QGstImpl + +template <typename DestinationType, typename SourceType> +DestinationType *qGstSafeCast(SourceType *arg) +{ + using Traits = QGstImpl::GstObjectTraits<DestinationType>; + if (Traits::isObjectOfType(arg)) + return Traits::cast(arg); + return nullptr; +} + +template <typename DestinationType, typename SourceType> +DestinationType *qGstCheckedCast(SourceType *arg) +{ + using Traits = QGstImpl::GstObjectTraits<DestinationType>; + Q_ASSERT(Traits::isObjectOfType(arg)); + return Traits::cast(arg); +} + class QSize; class QGstStructure; class QGstCaps; |