123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- commit c90702bdbc43fc542d7df6d5ec4b321912ca0035
- Author: Manuel Nickschas <sputnick@quassel-irc.org>
- Date: Tue Jan 7 18:34:54 2020 +0100
- common: Disable enum type stream operators for Qt >= 5.14
-
- Starting from version 5.14, Qt provides stream operators for enum
- types, which collide with the ones we ship in types.h. Disable
- Quassel's stream operators when compiling against Qt 5.14 or later.
-
- Add a unit test that ensures that enum serialization honors the width
- of the underlying type.
- diff --git a/src/common/types.h b/src/common/types.h
- index 467d9fb2..c4b9f364 100644
- --- a/src/common/types.h
- +++ b/src/common/types.h
- @@ -140,6 +140,7 @@ Q_DECLARE_METATYPE(QHostAddress)
- typedef QList<MsgId> MsgIdList;
- typedef QList<BufferId> BufferIdList;
-
- +#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
- /**
- * Catch-all stream serialization operator for enum types.
- *
- @@ -169,6 +170,7 @@ QDataStream &operator>>(QDataStream &in, T &value) {
- value = static_cast<T>(v);
- return in;
- }
- +#endif
-
- // Exceptions
-
- diff --git a/src/common/typestest.cpp b/src/common/typestest.cpp
- new file mode 100644
- index 00000000..04031c29
- --- /dev/null
- +++ b/src/common/typestest.cpp
- @@ -0,0 +1,79 @@
- +/***************************************************************************
- + * Copyright (C) 2005-2020 by the Quassel Project *
- + * devel@quassel-irc.org *
- + * *
- + * This program is free software; you can redistribute it and/or modify *
- + * it under the terms of the GNU General Public License as published by *
- + * the Free Software Foundation; either version 2 of the License, or *
- + * (at your option) version 3. *
- + * *
- + * This program is distributed in the hope that it will be useful, *
- + * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- + * GNU General Public License for more details. *
- + * *
- + * You should have received a copy of the GNU General Public License *
- + * along with this program; if not, write to the *
- + * Free Software Foundation, Inc., *
- + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
- + ***************************************************************************/
- +
- +#include <cstdint>
- +
- +#include <QByteArray>
- +#include <QDataStream>
- +#include <QObject>
- +
- +#include "testglobal.h"
- +#include "types.h"
- +
- +using namespace ::testing;
- +
- +class EnumHolder
- +{
- + Q_GADGET
- +
- +public:
- + enum class Enum16 : uint16_t {};
- + enum class Enum32 : uint32_t {};
- +
- + enum class EnumQt16 : uint16_t {};
- + Q_ENUM(EnumQt16)
- + enum class EnumQt32 : uint32_t {};
- + Q_ENUM(EnumQt32)
- +};
- +
- +// Verify that enums are (de)serialized as their underlying type
- +TEST(TypesTest, enumSerialization)
- +{
- + QByteArray data;
- + QDataStream out(&data, QIODevice::WriteOnly);
- +
- + // Serialize
- + out << EnumHolder::Enum16(0xabcd);
- + ASSERT_THAT(data.size(), Eq(2));
- + out << EnumHolder::Enum32(0x123456);
- + ASSERT_THAT(data.size(), Eq(6));
- + out << EnumHolder::EnumQt16(0x4321);
- + ASSERT_THAT(data.size(), Eq(8));
- + out << EnumHolder::Enum32(0xfedcba);
- + ASSERT_THAT(data.size(), Eq(12));
- + ASSERT_THAT(out.status(), Eq(QDataStream::Status::Ok));
- +
- + // Deserialize
- + QDataStream in(data);
- + EnumHolder::Enum16 enum16;
- + EnumHolder::Enum32 enum32;
- + EnumHolder::EnumQt16 enumQt16;
- + EnumHolder::EnumQt32 enumQt32;
- + in >> enum16 >> enum32 >> enumQt16 >> enumQt32;
- + ASSERT_THAT(in.status(), Eq(QDataStream::Status::Ok));
- + EXPECT_TRUE(in.atEnd());
- +
- + EXPECT_THAT((int)enum16, Eq(0xabcd));
- + EXPECT_THAT((int)enum32, Eq(0x123456));
- + EXPECT_THAT((int)enumQt16, Eq(0x4321));
- + EXPECT_THAT((int)enumQt32, Eq(0xfedcba));
- +}
- +
- +#include "typestest.moc"
|