qtutilities/misc/compat.h

79 lines
1.8 KiB
C++

#ifndef QT_UTILITIES_COMPAT_H
#define QT_UTILITIES_COMPAT_H
#include "../global.h"
#include <QtGlobal>
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#define QT_UTILITIES_USE_Q_STRING_VIEW
#endif
// note: QStringView has been available since Qt 5.10 but for a consistent ABI/API regardless which
// Qt 5.x version is used it makes sense to stick to QStringRef when using Qt 5.
#ifdef QT_UTILITIES_USE_Q_STRING_VIEW
#include <QStringView>
#else
#include <QStringRef>
#endif
namespace QtUtilities {
using Utf16CharType =
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
char16_t
#else
ushort
#endif
;
using StringView =
#ifdef QT_UTILITIES_USE_Q_STRING_VIEW
QStringView
#else
QStringRef
#endif
;
/*!
* \brief Makes either a QStringView or a QStringRef depending on the Qt version.
*/
inline StringView makeStringView(const QString &str)
{
return StringView(
#ifndef QT_UTILITIES_USE_Q_STRING_VIEW
&
#endif
str);
}
/*!
* \brief Makes either a QStringView or a QStringRef depending on the Qt version, applying "mid()" parameters.
*/
inline StringView midRef(const QString &str, int pos, int n = -1)
{
#ifdef QT_UTILITIES_USE_Q_STRING_VIEW
return QStringView(str).mid(pos, n);
#else
return str.midRef(pos, n);
#endif
}
/*!
* \brief Splits \a str into QStringViews, QStringRefs or QStrings depending on the Qt version.
*/
template <class... SplitArgs> inline auto splitRef(const QString &str, SplitArgs &&... args)
{
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
return QStringView(str).split(std::forward<SplitArgs>(args)...);
#elif QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)
return str.splitRef(std::forward<SplitArgs>(args)...);
#else
return str.split(std::forward<SplitArgs>(args)...);
#endif
}
} // namespace QtUtilities
#endif // QT_UTILITIES_COMPAT_H