From b6e2caf7452bf2b695583196fd7b346c1663d798 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Mon, 7 Aug 2023 16:24:13 +0200 Subject: [PATCH] tst_Encoder: port away from Q_FOREACH Qt is defaulting to QT_NO_FOREACH these days, so make sure we integrate nicely with downstream and fix the single Q_FOREACH/foreach user, in tst_encoder.cpp. Unfortunately, the container's initialization code doesn't exactly lend itself to making the container const (not even IILE (Immediately-Invoked Lambda Expression) would help here, due to the interdependency with `len`), so the idiomatic solution would be to use std::as_const()/qAsConst(). The former is available from C++17, which we don't require, yet, and the latter is not available under QT_NO_AS_CONST (the default for Qt these days), so grab the nettle and implement a t17::as_const() that switches between a manual implementation of std::as_const and the real thing, depending on __cpp_lib_as_const. The `t17` here mimicks the qNN (q20::remove_cvref_t/q23::forward_like/etc) mechanism used in Qt itself for backports, with s/q/t/ because ... _T_inyCbor. The t17 implementation is local to tst_encoder.cpp, but can easily be extracted into a separate header once more users emerge. --- tests/encoder/encoder.pro | 2 ++ tests/encoder/tst_encoder.cpp | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/tests/encoder/encoder.pro b/tests/encoder/encoder.pro index 62d9b7e..180f0d7 100644 --- a/tests/encoder/encoder.pro +++ b/tests/encoder/encoder.pro @@ -3,6 +3,8 @@ SOURCES += tst_encoder.cpp CONFIG += testcase parallel_test c++11 QT = core testlib +DEFINES += QT_NO_FOREACH QT_NO_AS_CONST + INCLUDEPATH += ../../src msvc: POST_TARGETDEPS = ../../lib/tinycbor.lib else: POST_TARGETDEPS += ../../lib/libtinycbor.a diff --git a/tests/encoder/tst_encoder.cpp b/tests/encoder/tst_encoder.cpp index 31c2915..61ce9c9 100644 --- a/tests/encoder/tst_encoder.cpp +++ b/tests/encoder/tst_encoder.cpp @@ -29,6 +29,19 @@ #include #endif +#include +namespace t17 { +#ifdef __cpp_lib_as_const + using std::as_const; +#else + template + constexpr typename std::add_const::type &as_const(T &t) noexcept { return t; } + // prevent rvalue arguments: + template + void as_const(const T &&) = delete; +#endif // __cpp_lib_as_const +} // namespace t17 + Q_DECLARE_METATYPE(CborError) namespace QTest { template<> char *toString(const CborError &err) @@ -153,7 +166,7 @@ CborError encodeVariant(CborEncoder *encoder, const QVariant &v) CborError err = cbor_encoder_create_array(encoder, &sub, len); if (err && !isOomError(err)) return err; - foreach (const QVariant &v2, list) { + for (const QVariant &v2 : t17::as_const(list)) { err = static_cast(err | encodeVariant(&sub, v2)); if (err && !isOomError(err)) return err; -- 2.25.1