From 6dd9a9c012996e4aa5e76c4f34af82ce67ed6b94 Mon Sep 17 00:00:00 2001 From: Patrick Franz Date: Sat, 31 Aug 2024 10:09:23 +0200 Subject: [PATCH] Import qt6-positioning_6.7.2.orig.tar.xz [dgit import orig qt6-positioning_6.7.2.orig.tar.xz] --- .QT-ENTERPRISE-LICENSE-AGREEMENT | 262 + .cmake.conf | 7 + .tag | 1 + CMakeLists.txt | 25 + LICENSES/Apache-2.0.txt | 202 + LICENSES/BSD-3-Clause.txt | 9 + LICENSES/CC0-1.0.txt | 121 + LICENSES/GFDL-1.3-no-invariants-only.txt | 451 ++ LICENSES/GPL-2.0-only.txt | 339 ++ LICENSES/GPL-3.0-only.txt | 674 +++ LICENSES/LGPL-3.0-only.txt | 165 + LICENSES/LicenseRef-Qt-Commercial.txt | 8 + LICENSES/OFL-1.1.txt | 92 + LICENSES/Qt-GPL-exception-1.0.txt | 22 + cmake/FindGconf.cmake | 17 + cmake/FindGypsy.cmake | 17 + coin/axivion/ci_config_linux.json | 44 + coin/module_config.yaml | 12 + conanfile.py | 53 + config.tests/gypsy/CMakeLists.txt | 33 + config.tests/gypsy/main.cpp | 19 + config.tests/winrt/CMakeLists.txt | 39 + config.tests/winrt/main.cpp | 22 + configure.json | 5 + dependencies.yaml | 10 + dist/changes-5.10.0 | 62 + dist/changes-5.10.1 | 26 + dist/changes-5.11.0 | 116 + dist/changes-5.11.1 | 40 + dist/changes-5.11.2 | 38 + dist/changes-5.11.3 | 32 + dist/changes-5.12.0 | 52 + dist/changes-5.12.1 | 56 + dist/changes-5.12.2 | 33 + dist/changes-5.12.3 | 33 + dist/changes-5.12.4 | 20 + dist/changes-5.12.5 | 20 + dist/changes-5.13.0 | 46 + dist/changes-5.13.1 | 20 + dist/changes-5.13.2 | 20 + dist/changes-5.14.0 | 47 + dist/changes-5.14.1 | 20 + dist/changes-5.14.2 | 20 + dist/changes-5.15.0 | 51 + dist/changes-5.15.1 | 20 + dist/changes-5.15.2 | 48 + dist/changes-5.2.1 | 53 + dist/changes-5.3.0 | 74 + dist/changes-5.3.1 | 57 + dist/changes-5.3.2 | 50 + dist/changes-5.4.0 | 54 + dist/changes-5.4.1 | 29 + dist/changes-5.4.2 | 28 + dist/changes-5.5.0 | 40 + dist/changes-5.5.1 | 54 + dist/changes-5.6.0 | 69 + dist/changes-5.6.1 | 38 + dist/changes-5.6.2 | 55 + dist/changes-5.6.3 | 38 + dist/changes-5.7.0 | 53 + dist/changes-5.7.1 | 45 + dist/changes-5.8.0 | 70 + dist/changes-5.9.0 | 131 + dist/changes-5.9.1 | 43 + dist/changes-5.9.2 | 56 + dist/changes-5.9.3 | 41 + dist/changes-5.9.4 | 31 + examples/CMakeLists.txt | 10 + examples/examples.pro | 5 + examples/positioning/CMakeLists.txt | 13 + .../logfilepositionsource/CMakeLists.txt | 50 + .../clientapplication.cpp | 28 + .../logfilepositionsource/clientapplication.h | 27 + .../doc/src/logfilepositionsource.qdoc | 71 + .../logfilepositionsource/logfile.qrc | 5 + .../logfilepositionsource.cpp | 92 + .../logfilepositionsource.h | 41 + .../logfilepositionsource.pro | 16 + .../logfilepositionsource/main.cpp | 15 + .../logfilepositionsource/simplelog.txt | 156 + examples/positioning/positioning.pro | 8 + .../satelliteinfo/ApplicationScreen.qml | 273 + examples/positioning/satelliteinfo/Button.qml | 30 + .../positioning/satelliteinfo/CMakeLists.txt | 122 + examples/positioning/satelliteinfo/Header.qml | 59 + .../positioning/satelliteinfo/HelpPopup.qml | 61 + .../positioning/satelliteinfo/LegendBox.qml | 66 + examples/positioning/satelliteinfo/Main.qml | 48 + .../positioning/satelliteinfo/PageButton.qml | 29 + .../satelliteinfo/PermissionsScreen.qml | 53 + .../positioning/satelliteinfo/PositionBox.qml | 58 + .../positioning/satelliteinfo/RssiView.qml | 472 ++ .../satelliteinfo/SatelliteView.qml | 428 ++ .../satelliteinfo/SettingsView.qml | 91 + .../positioning/satelliteinfo/SkyView.qml | 434 ++ examples/positioning/satelliteinfo/Theme.qml | 90 + .../positioning/satelliteinfo/ViewSwitch.qml | 45 + .../doc/images/rssiview_settings.webp | Bin 0 -> 23674 bytes .../doc/images/skyview_tableview.webp | Bin 0 -> 29264 bytes .../satelliteinfo/doc/src/satelliteinfo.qdoc | 205 + .../fonts/TitilliumWeb-Regular.ttf | Bin 0 -> 57392 bytes .../fonts/TitilliumWeb-SemiBold.ttf | Bin 0 -> 56752 bytes .../satelliteinfo/fonts/qt_attribution.json | 16 + .../satelliteinfo/icons/checkbox.svg | 1 + .../satelliteinfo/icons/checkbox_blank.svg | 1 + .../satelliteinfo/icons/darkmode.svg | 3 + .../satelliteinfo/icons/filter.svg | 1 + .../positioning/satelliteinfo/icons/help.svg | 3 + .../satelliteinfo/icons/lightmode.svg | 3 + .../positioning/satelliteinfo/icons/place.svg | 3 + .../satelliteinfo/icons/qt_attribution.json | 15 + .../satelliteinfo/icons/qtlogo_green.png | Bin 0 -> 10836 bytes .../satelliteinfo/icons/qtlogo_white.png | Bin 0 -> 6320 bytes .../satelliteinfo/icons/rssiview.svg | 3 + .../satelliteinfo/icons/satellite1.png | Bin 0 -> 2006 bytes .../satelliteinfo/icons/satellite2.png | Bin 0 -> 1757 bytes .../satelliteinfo/icons/satellite_small.png | Bin 0 -> 1382 bytes .../satelliteinfo/icons/search.svg | 1 + .../satelliteinfo/icons/settings.svg | 3 + .../satelliteinfo/icons/skyview.svg | 3 + .../positioning/satelliteinfo/icons/sort.svg | 1 + .../satelliteinfo/icons/tableview.svg | 3 + examples/positioning/satelliteinfo/main.cpp | 52 + .../positioning/satelliteinfo/nmealog.txt | 1403 +++++ examples/positioning/satelliteinfo/qmldir | 17 + examples/positioning/satelliteinfo/roles.h | 26 + .../satelliteinfo/satelliteinfo.pro | 90 + .../satelliteinfo/satellitemodel.cpp | 152 + .../satelliteinfo/satellitemodel.h | 47 + .../satelliteinfo/sortfiltermodel.cpp | 92 + .../satelliteinfo/sortfiltermodel.h | 48 + .../positioning/shared/Info.cmake.ios.plist | 39 + .../positioning/shared/Info.cmake.macos.plist | 33 + .../positioning/shared/Info.qmake.ios.plist | 39 + .../positioning/shared/Info.qmake.macos.plist | 30 + .../weatherinfo/BigForecastIcon.qml | 64 + .../positioning/weatherinfo/CMakeLists.txt | 91 + .../positioning/weatherinfo/ForecastIcon.qml | 51 + .../positioning/weatherinfo/WeatherIcon.qml | 28 + .../positioning/weatherinfo/WeatherInfo.qml | 254 + examples/positioning/weatherinfo/appmodel.cpp | 492 ++ examples/positioning/weatherinfo/appmodel.h | 142 + .../doc/images/example-weatherinfo.png | Bin 0 -> 105928 bytes .../weatherinfo/doc/src/weatherinfo.qdoc | 146 + .../weatherinfo/icons/waypoint.svg | 4 + .../weatherinfo/icons/weather-few-clouds.svg | 4 + .../weatherinfo/icons/weather-fog.svg | 4 + .../weatherinfo/icons/weather-haze.svg | 4 + .../weatherinfo/icons/weather-icy.svg | 4 + .../weatherinfo/icons/weather-overcast.svg | 4 + .../icons/weather-showers-scattered.svg | 4 + .../weatherinfo/icons/weather-showers.svg | 6 + .../weatherinfo/icons/weather-sleet.svg | 4 + .../weatherinfo/icons/weather-snow.svg | 4 + .../weatherinfo/icons/weather-storm.svg | 6 + .../icons/weather-sunny-very-few-clouds.svg | 10 + .../weatherinfo/icons/weather-sunny.svg | 4 + .../icons/weather-thundershower.svg | 4 + examples/positioning/weatherinfo/main.cpp | 19 + .../weatherinfo/openmeteobackend.cpp | 293 + .../weatherinfo/openmeteobackend.h | 32 + .../weatherinfo/openweathermapbackend.cpp | 218 + .../weatherinfo/openweathermapbackend.h | 38 + .../weatherinfo/providerbackend.cpp | 6 + .../positioning/weatherinfo/providerbackend.h | 43 + examples/positioning/weatherinfo/qmldir | 6 + .../weatherinfo/weatherapibackend.cpp | 220 + .../weatherinfo/weatherapibackend.h | 33 + .../positioning/weatherinfo/weatherinfo.pro | 58 + src/3rdparty/clip2tri/CMakeLists.txt | 31 + src/3rdparty/clip2tri/LICENSE | 21 + src/3rdparty/clip2tri/clip2tri.cpp | 406 ++ src/3rdparty/clip2tri/clip2tri.h | 102 + src/3rdparty/clip2tri/qt_attribution.json | 13 + src/3rdparty/clipper/CMakeLists.txt | 25 + src/3rdparty/clipper/LICENSE | 48 + src/3rdparty/clipper/clipper.cpp | 4629 +++++++++++++++ src/3rdparty/clipper/clipper.h | 404 ++ src/3rdparty/clipper/qt_attribution.json | 13 + src/3rdparty/poly2tri/AUTHORS | 8 + src/3rdparty/poly2tri/CMakeLists.txt | 30 + src/3rdparty/poly2tri/LICENSE | 27 + src/3rdparty/poly2tri/common/shapes.cpp | 363 ++ src/3rdparty/poly2tri/common/shapes.h | 325 + src/3rdparty/poly2tri/common/utils.h | 127 + src/3rdparty/poly2tri/poly2tri.h | 39 + src/3rdparty/poly2tri/qt_attribution.json | 14 + .../poly2tri/sweep/advancing_front.cpp | 109 + src/3rdparty/poly2tri/sweep/advancing_front.h | 118 + src/3rdparty/poly2tri/sweep/cdt.cpp | 72 + src/3rdparty/poly2tri/sweep/cdt.h | 105 + src/3rdparty/poly2tri/sweep/sweep.cpp | 814 +++ src/3rdparty/poly2tri/sweep/sweep.h | 285 + src/3rdparty/poly2tri/sweep/sweep_context.cpp | 216 + src/3rdparty/poly2tri/sweep/sweep_context.h | 186 + src/CMakeLists.txt | 13 + src/plugins/CMakeLists.txt | 8 + src/plugins/position/CMakeLists.txt | 24 + src/plugins/position/android/CMakeLists.txt | 7 + .../position/android/jar/AndroidManifest.xml | 6 + .../position/android/jar/CMakeLists.txt | 22 + .../qt/android/positioning/QtPositioning.java | 606 ++ .../position/android/src/CMakeLists.txt | 26 + .../position/android/src/jnipositioning.cpp | 735 +++ .../position/android/src/jnipositioning.h | 28 + src/plugins/position/android/src/plugin.json | 9 + .../android/src/positionfactory_android.cpp | 27 + .../android/src/positionfactory_android.h | 22 + .../src/qgeopositioninfosource_android.cpp | 267 + .../src/qgeopositioninfosource_android_p.h | 66 + .../src/qgeosatelliteinfosource_android.cpp | 183 + .../src/qgeosatelliteinfosource_android_p.h | 63 + .../position/corelocation/CMakeLists.txt | 39 + src/plugins/position/corelocation/plugin.json | 9 + .../corelocation/qgeopositioninfosource_cl.mm | 271 + .../qgeopositioninfosource_cl_p.h | 71 + .../qgeopositioninfosourcefactory_cl.h | 22 + .../qgeopositioninfosourcefactory_cl.mm | 25 + src/plugins/position/geoclue2/CMakeLists.txt | 34 + .../position/geoclue2/geocluetypes.cpp | 28 + src/plugins/position/geoclue2/geocluetypes.h | 27 + .../org.freedesktop.GeoClue2.Client.xml | 122 + .../org.freedesktop.GeoClue2.Location.xml | 96 + .../org.freedesktop.GeoClue2.Manager.xml | 60 + src/plugins/position/geoclue2/plugin.json | 9 + .../qgeopositioninfosource_geoclue2.cpp | 429 ++ .../qgeopositioninfosource_geoclue2_p.h | 64 + ...qgeopositioninfosourcefactory_geoclue2.cpp | 35 + .../qgeopositioninfosourcefactory_geoclue2.h | 32 + src/plugins/position/gypsy/CMakeLists.txt | 27 + src/plugins/position/gypsy/plugin.json | 9 + .../qgeopositioninfosourcefactory_gypsy.cpp | 30 + .../qgeopositioninfosourcefactory_gypsy.h | 23 + .../gypsy/qgeosatelliteinfosource_gypsy.cpp | 406 ++ .../gypsy/qgeosatelliteinfosource_gypsy_p.h | 107 + src/plugins/position/nmea/CMakeLists.txt | 32 + src/plugins/position/nmea/plugin.json | 9 + .../qgeopositioninfosourcefactory_nmea.cpp | 522 ++ .../nmea/qgeopositioninfosourcefactory_nmea.h | 27 + src/plugins/position/nmea/qiopipe.cpp | 164 + src/plugins/position/nmea/qiopipe_p.h | 79 + .../position/positionpoll/CMakeLists.txt | 23 + src/plugins/position/positionpoll/plugin.json | 9 + .../positionpoll/positionpollfactory.cpp | 35 + .../positionpoll/positionpollfactory.h | 26 + .../positionpoll/qgeoareamonitor_polling.cpp | 476 ++ .../positionpoll/qgeoareamonitor_polling.h | 64 + src/plugins/position/winrt/CMakeLists.txt | 32 + src/plugins/position/winrt/plugin.json | 9 + .../winrt/qgeopositioninfosource_winrt.cpp | 622 ++ .../winrt/qgeopositioninfosource_winrt_p.h | 91 + .../qgeopositioninfosourcefactory_winrt.cpp | 37 + .../qgeopositioninfosourcefactory_winrt.h | 26 + src/positioning/CMakeLists.txt | 73 + src/positioning/configure.cmake | 31 + src/positioning/configure.json | 48 + src/positioning/doc/images/permissions.png | Bin 0 -> 19306 bytes src/positioning/doc/qtpositioning.qdocconf | 63 + src/positioning/doc/snippets/CMakeLists.txt | 1 + .../doc/snippets/cpp/CMakeLists.txt | 23 + src/positioning/doc/snippets/cpp/cppqml.cpp | 71 + src/positioning/doc/snippets/cpp/main.cpp | 8 + .../doc/snippets/doc_src_qtpositioning.qml | 10 + src/positioning/doc/src/cpp-position.qdoc | 172 + .../doc/src/cpp-qml-positioning.qdoc | 90 + .../doc/src/external-resources.qdoc | 47 + src/positioning/doc/src/plugins/geoclue2.qdoc | 62 + src/positioning/doc/src/plugins/gypsy.qdoc | 91 + src/positioning/doc/src/plugins/nmea.qdoc | 209 + src/positioning/doc/src/qml-position.qdoc | 90 + src/positioning/doc/src/qt6-changes.qdoc | 209 + .../doc/src/qtpositioning-android.qdoc | 58 + .../doc/src/qtpositioning-examples.qdoc | 13 + .../doc/src/qtpositioning-ios.qdoc | 53 + .../doc/src/qtpositioning-plugins.qdoc | 90 + .../doc/src/qtpositioning-qml.qdoc | 25 + src/positioning/doc/src/qtpositioning.qdoc | 129 + src/positioning/qclipperutils.cpp | 120 + src/positioning/qclipperutils_p.h | 85 + src/positioning/qdoublematrix4x4.cpp | 1081 ++++ src/positioning/qdoublematrix4x4_p.h | 911 +++ src/positioning/qdoublevector2d.cpp | 85 + src/positioning/qdoublevector2d_p.h | 226 + src/positioning/qdoublevector3d.cpp | 108 + src/positioning/qdoublevector3d_p.h | 266 + src/positioning/qgeoaddress.cpp | 742 +++ src/positioning/qgeoaddress.h | 87 + src/positioning/qgeoaddress_p.h | 50 + src/positioning/qgeoareamonitorinfo.cpp | 406 ++ src/positioning/qgeoareamonitorinfo.h | 103 + src/positioning/qgeoareamonitorsource.cpp | 398 ++ src/positioning/qgeoareamonitorsource.h | 75 + src/positioning/qgeocircle.cpp | 430 ++ src/positioning/qgeocircle.h | 65 + src/positioning/qgeocircle_p.h | 60 + src/positioning/qgeocoordinate.cpp | 759 +++ src/positioning/qgeocoordinate.h | 125 + src/positioning/qgeocoordinate_p.h | 60 + src/positioning/qgeocoordinateobject.cpp | 60 + src/positioning/qgeocoordinateobject_p.h | 63 + src/positioning/qgeolocation.cpp | 248 + src/positioning/qgeolocation.h | 65 + src/positioning/qgeolocation_p.h | 47 + src/positioning/qgeopath.cpp | 722 +++ src/positioning/qgeopath.h | 76 + src/positioning/qgeopath_p.h | 224 + src/positioning/qgeopolygon.cpp | 667 +++ src/positioning/qgeopolygon.h | 75 + src/positioning/qgeopolygon_p.h | 101 + src/positioning/qgeopositioninfo.cpp | 418 ++ src/positioning/qgeopositioninfo.h | 122 + src/positioning/qgeopositioninfo_p.h | 42 + src/positioning/qgeopositioninfosource.cpp | 605 ++ src/positioning/qgeopositioninfosource.h | 93 + src/positioning/qgeopositioninfosource_p.h | 60 + .../qgeopositioninfosourcefactory.cpp | 54 + .../qgeopositioninfosourcefactory.h | 30 + src/positioning/qgeorectangle.cpp | 916 +++ src/positioning/qgeorectangle.h | 98 + src/positioning/qgeorectangle_p.h | 53 + src/positioning/qgeosatelliteinfo.cpp | 401 ++ src/positioning/qgeosatelliteinfo.h | 125 + src/positioning/qgeosatelliteinfo_p.h | 41 + src/positioning/qgeosatelliteinfosource.cpp | 390 ++ src/positioning/qgeosatelliteinfosource.h | 73 + src/positioning/qgeosatelliteinfosource_p.h | 37 + src/positioning/qgeoshape.cpp | 415 ++ src/positioning/qgeoshape.h | 97 + src/positioning/qgeoshape_p.h | 58 + src/positioning/qlocationutils.cpp | 569 ++ src/positioning/qlocationutils_p.h | 313 + src/positioning/qnmeapositioninfosource.cpp | 964 +++ src/positioning/qnmeapositioninfosource.h | 70 + src/positioning/qnmeapositioninfosource_p.h | 154 + src/positioning/qnmeasatelliteinfosource.cpp | 918 +++ src/positioning/qnmeasatelliteinfosource.h | 81 + src/positioning/qnmeasatelliteinfosource_p.h | 146 + src/positioning/qpositioningglobal.h | 10 + src/positioning/qpositioningglobal_p.h | 21 + src/positioning/qwebmercator.cpp | 100 + src/positioning/qwebmercator_p.h | 39 + src/positioningquick/CMakeLists.txt | 54 + src/positioningquick/geosatelliteinfo.qdoc | 89 + src/positioningquick/locationsingleton.cpp | 359 ++ src/positioningquick/locationsingleton_p.h | 78 + src/positioningquick/positioningplugin.cpp | 592 ++ .../qdeclarativegeoaddress.cpp | 346 ++ .../qdeclarativegeoaddress_p.h | 93 + .../qdeclarativegeolocation.cpp | 225 + .../qdeclarativegeolocation_p.h | 80 + .../qdeclarativepluginparameter.cpp | 114 + .../qdeclarativepluginparameter_p.h | 63 + src/positioningquick/qdeclarativeposition.cpp | 645 ++ src/positioningquick/qdeclarativeposition_p.h | 184 + .../qdeclarativepositionsource.cpp | 871 +++ .../qdeclarativepositionsource_p.h | 187 + .../qdeclarativesatellitesource.cpp | 531 ++ .../qdeclarativesatellitesource_p.h | 142 + .../qpositioningquickglobal.h | 20 + .../qpositioningquickglobal_p.h | 26 + .../qpositioningquickmodule.cpp | 4 + .../qpositioningquickmodule_p.h | 148 + .../qquickgeocoordinateanimation.cpp | 263 + .../qquickgeocoordinateanimation_p.h | 68 + .../qquickgeocoordinateanimation_p_p.h | 46 + tests/CMakeLists.txt | 10 + .../positioning_backend/CMakeLists.txt | 31 + .../positioning_backend/logwidget.cpp | 21 + .../positioning_backend/logwidget.h | 22 + .../applications/positioning_backend/main.cpp | 29 + .../positioning_backend/widget.cpp | 163 + .../applications/positioning_backend/widget.h | 45 + .../positioning_backend/widget.ui | 334 ++ tests/auto/CMakeLists.txt | 41 + .../QtPositioning.5.10.0.linux-gcc-amd64.txt | 4773 +++++++++++++++ .../QtPositioning.5.11.0.linux-gcc-amd64.txt | 4773 +++++++++++++++ .../QtPositioning.5.12.0.linux-gcc-amd64.txt | 4838 +++++++++++++++ .../QtPositioning.5.13.0.linux-gcc-amd64.txt | 5208 ++++++++++++++++ .../QtPositioning.5.14.0.linux-gcc-amd64.txt | 5268 ++++++++++++++++ .../QtPositioning.5.15.0.linux-gcc-amd64.txt | 5278 +++++++++++++++++ .../QtPositioning.5.3.0.linux-gcc-amd64.txt | 3822 ++++++++++++ .../QtPositioning.5.4.0.linux-gcc-amd64.txt | 3854 ++++++++++++ .../QtPositioning.5.6.0.linux-gcc-amd64.txt | 4118 +++++++++++++ .../QtPositioning.5.7.0.linux-gcc-amd64.txt | 4400 ++++++++++++++ .../QtPositioning.5.8.0.linux-gcc-amd64.txt | 4425 ++++++++++++++ .../QtPositioning.5.9.0.linux-gcc-amd64.txt | 4446 ++++++++++++++ tests/auto/cmake/CMakeLists.txt | 47 + .../declarative_geolocation/CMakeLists.txt | 19 + tests/auto/declarative_geolocation/main.cpp | 23 + .../tst_declarativegeolocation.qml | 136 + .../declarative_positioning_core/BLACKLIST | 6 + .../CMakeLists.txt | 49 + .../declarative_positioning_core/factory.cpp | 25 + .../declarative_positioning_core/factory.h | 30 + .../declarative_positioning_core/main.cpp | 24 + .../properties.cpp | 43 + .../declarative_positioning_core/properties.h | 54 + .../tst_address.qml | 70 + .../tst_coordinate.qml | 379 ++ .../tst_geoshape.qml | 318 + .../tst_position.qml | 27 + .../tst_positionsource.qml | 420 ++ .../CMakeLists.txt | 37 + .../auto/declarative_satellitesource/main.cpp | 24 + .../tst_satellite.qml | 23 + .../tst_satellitesource.qml | 478 ++ tests/auto/doublevectors/CMakeLists.txt | 19 + .../auto/doublevectors/tst_doublevectors.cpp | 268 + tests/auto/dummypositionplugin/CMakeLists.txt | 24 + tests/auto/dummypositionplugin/plugin.cpp | 188 + tests/auto/dummypositionplugin/plugin.json | 9 + tests/auto/positionplugin/CMakeLists.txt | 24 + tests/auto/positionplugin/plugin.cpp | 223 + tests/auto/positionplugin/plugin.json | 9 + tests/auto/positionplugintest/CMakeLists.txt | 26 + .../positionplugintest/tst_positionplugin.cpp | 84 + .../qdeclarativegeolocation/CMakeLists.txt | 12 + .../tst_qdeclarativegeolocation.cpp | 156 + .../auto/qdeclarativeposition/CMakeLists.txt | 11 + .../tst_qdeclarativeposition.cpp | 219 + .../auto/qdeclarativepositionsource/BLACKLIST | 52 + .../qdeclarativepositionsource/CMakeLists.txt | 21 + .../tst_qdeclarativepositionsource.cpp | 512 ++ tests/auto/qgeoaddress/CMakeLists.txt | 19 + tests/auto/qgeoaddress/tst_qgeoaddress.cpp | 622 ++ tests/auto/qgeoareamonitor/BLACKLIST | 2 + tests/auto/qgeoareamonitor/CMakeLists.txt | 36 + .../qgeoareamonitor/logfilepositionsource.cpp | 107 + .../qgeoareamonitor/logfilepositionsource.h | 56 + .../positionconsumerthread.cpp | 48 + .../qgeoareamonitor/positionconsumerthread.h | 49 + tests/auto/qgeoareamonitor/simplelog.txt | 87 + .../qgeoareamonitor/tst_qgeoareamonitor.cpp | 925 +++ tests/auto/qgeocircle/CMakeLists.txt | 19 + tests/auto/qgeocircle/tst_qgeocircle.cpp | 448 ++ tests/auto/qgeocoordinate/CMakeLists.txt | 17 + .../qgeocoordinate/tst_qgeocoordinate.cpp | 975 +++ .../auto/qgeocoordinateobject/CMakeLists.txt | 11 + .../tst_qgeocoordinateobject.cpp | 74 + tests/auto/qgeolocation/CMakeLists.txt | 17 + tests/auto/qgeolocation/tst_qgeolocation.cpp | 387 ++ tests/auto/qgeolocation/tst_qgeolocation.h | 65 + tests/auto/qgeopath/CMakeLists.txt | 19 + tests/auto/qgeopath/tst_qgeopath.cpp | 367 ++ tests/auto/qgeopolygon/CMakeLists.txt | 19 + tests/auto/qgeopolygon/tst_qgeopolygon.cpp | 384 ++ tests/auto/qgeopositioninfo/CMakeLists.txt | 19 + .../qgeopositioninfo/tst_qgeopositioninfo.cpp | 395 ++ .../qgeopositioninfosource/CMakeLists.txt | 30 + .../testqgeopositioninfosource.cpp | 790 +++ .../testqgeopositioninfosource_p.h | 104 + .../tst_qgeopositioninfosource.cpp | 12 + tests/auto/qgeorectangle/CMakeLists.txt | 19 + .../auto/qgeorectangle/tst_qgeorectangle.cpp | 2394 ++++++++ tests/auto/qgeosatelliteinfo/CMakeLists.txt | 19 + .../tst_qgeosatelliteinfo.cpp | 420 ++ .../qgeosatelliteinfosource/CMakeLists.txt | 25 + .../testqgeosatelliteinfosource.cpp | 745 +++ .../testqgeosatelliteinfosource_p.h | 92 + .../tst_qgeosatelliteinfosource.cpp | 12 + tests/auto/qgeoshape/CMakeLists.txt | 17 + tests/auto/qgeoshape/tst_qgeoshape.cpp | 218 + .../qnmeapositioninfosource/CMakeLists.txt | 10 + .../dummy/CMakeLists.txt | 24 + .../dummy/tst_dummynmeapositioninfosource.cpp | 139 + .../realtime/CMakeLists.txt | 27 + .../tst_qnmeapositioninfosource_realtime.cpp | 19 + .../realtime_generic/CMakeLists.txt | 38 + ...meapositioninfosource_realtime_generic.cpp | 52 + .../simulation/CMakeLists.txt | 27 + ...tst_qnmeapositioninfosource_simulation.cpp | 18 + .../simulation_generic/CMakeLists.txt | 42 + ...apositioninfosource_simulation_generic.cpp | 39 + .../tst_qnmeapositioninfosource.cpp | 590 ++ .../tst_qnmeapositioninfosource.h | 157 + .../qnmeasatelliteinfosource/CMakeLists.txt | 7 + .../dummy/CMakeLists.txt | 17 + .../tst_dummynmeasatelliteinfosource.cpp | 177 + .../generic_realtime/CMakeLists.txt | 19 + ...tst_nmeasatelliteinfosource_generic_rt.cpp | 68 + .../generic_simulation/CMakeLists.txt | 19 + ...st_nmeasatelliteinfosource_generic_sim.cpp | 70 + .../nmea/CMakeLists.txt | 15 + .../nmea/tst_nmeasatelliteinfosource.cpp | 531 ++ .../CMakeLists.txt | 12 + .../tst_qquickgeocoordinateanimation.cpp | 28 + tests/auto/qwebmercator/CMakeLists.txt | 15 + tests/auto/qwebmercator/tst_qwebmercator.cpp | 43 + .../auto/satellitesourceplugin/CMakeLists.txt | 15 + tests/auto/satellitesourceplugin/plugin.cpp | 235 + tests/auto/satellitesourceplugin/plugin.json | 9 + tests/auto/utils/qlocationtestutils.cpp | 89 + tests/auto/utils/qlocationtestutils_p.h | 150 + tests/auto/utils/qnmeaproxyfactory.cpp | 105 + tests/auto/utils/qnmeaproxyfactory.h | 71 + tests/benchmarks/CMakeLists.txt | 10 + tests/benchmarks/README | 81 + .../qgeoareamonitorinfo/CMakeLists.txt | 15 + .../tst_bench_qgeoareamonitorinfo.cpp | 230 + .../qgeopositioninfo/CMakeLists.txt | 15 + .../tst_bench_qgeopositioninfo.cpp | 228 + .../qgeosatelliteinfo/CMakeLists.txt | 15 + .../tst_bench_qgeosatelliteinfo.cpp | 223 + tests/global/global.cfg | 5 + 504 files changed, 123755 insertions(+) create mode 100644 .QT-ENTERPRISE-LICENSE-AGREEMENT create mode 100644 .cmake.conf create mode 100644 .tag create mode 100644 CMakeLists.txt create mode 100644 LICENSES/Apache-2.0.txt create mode 100644 LICENSES/BSD-3-Clause.txt create mode 100644 LICENSES/CC0-1.0.txt create mode 100644 LICENSES/GFDL-1.3-no-invariants-only.txt create mode 100644 LICENSES/GPL-2.0-only.txt create mode 100644 LICENSES/GPL-3.0-only.txt create mode 100644 LICENSES/LGPL-3.0-only.txt create mode 100644 LICENSES/LicenseRef-Qt-Commercial.txt create mode 100644 LICENSES/OFL-1.1.txt create mode 100644 LICENSES/Qt-GPL-exception-1.0.txt create mode 100644 cmake/FindGconf.cmake create mode 100644 cmake/FindGypsy.cmake create mode 100644 coin/axivion/ci_config_linux.json create mode 100644 coin/module_config.yaml create mode 100644 conanfile.py create mode 100644 config.tests/gypsy/CMakeLists.txt create mode 100644 config.tests/gypsy/main.cpp create mode 100644 config.tests/winrt/CMakeLists.txt create mode 100644 config.tests/winrt/main.cpp create mode 100644 configure.json create mode 100644 dependencies.yaml create mode 100644 dist/changes-5.10.0 create mode 100644 dist/changes-5.10.1 create mode 100644 dist/changes-5.11.0 create mode 100644 dist/changes-5.11.1 create mode 100644 dist/changes-5.11.2 create mode 100644 dist/changes-5.11.3 create mode 100644 dist/changes-5.12.0 create mode 100644 dist/changes-5.12.1 create mode 100644 dist/changes-5.12.2 create mode 100644 dist/changes-5.12.3 create mode 100644 dist/changes-5.12.4 create mode 100644 dist/changes-5.12.5 create mode 100644 dist/changes-5.13.0 create mode 100644 dist/changes-5.13.1 create mode 100644 dist/changes-5.13.2 create mode 100644 dist/changes-5.14.0 create mode 100644 dist/changes-5.14.1 create mode 100644 dist/changes-5.14.2 create mode 100644 dist/changes-5.15.0 create mode 100644 dist/changes-5.15.1 create mode 100644 dist/changes-5.15.2 create mode 100644 dist/changes-5.2.1 create mode 100644 dist/changes-5.3.0 create mode 100644 dist/changes-5.3.1 create mode 100644 dist/changes-5.3.2 create mode 100644 dist/changes-5.4.0 create mode 100644 dist/changes-5.4.1 create mode 100644 dist/changes-5.4.2 create mode 100644 dist/changes-5.5.0 create mode 100644 dist/changes-5.5.1 create mode 100644 dist/changes-5.6.0 create mode 100644 dist/changes-5.6.1 create mode 100644 dist/changes-5.6.2 create mode 100644 dist/changes-5.6.3 create mode 100644 dist/changes-5.7.0 create mode 100644 dist/changes-5.7.1 create mode 100644 dist/changes-5.8.0 create mode 100644 dist/changes-5.9.0 create mode 100644 dist/changes-5.9.1 create mode 100644 dist/changes-5.9.2 create mode 100644 dist/changes-5.9.3 create mode 100644 dist/changes-5.9.4 create mode 100644 examples/CMakeLists.txt create mode 100644 examples/examples.pro create mode 100644 examples/positioning/CMakeLists.txt create mode 100644 examples/positioning/logfilepositionsource/CMakeLists.txt create mode 100644 examples/positioning/logfilepositionsource/clientapplication.cpp create mode 100644 examples/positioning/logfilepositionsource/clientapplication.h create mode 100644 examples/positioning/logfilepositionsource/doc/src/logfilepositionsource.qdoc create mode 100644 examples/positioning/logfilepositionsource/logfile.qrc create mode 100644 examples/positioning/logfilepositionsource/logfilepositionsource.cpp create mode 100644 examples/positioning/logfilepositionsource/logfilepositionsource.h create mode 100644 examples/positioning/logfilepositionsource/logfilepositionsource.pro create mode 100644 examples/positioning/logfilepositionsource/main.cpp create mode 100644 examples/positioning/logfilepositionsource/simplelog.txt create mode 100644 examples/positioning/positioning.pro create mode 100644 examples/positioning/satelliteinfo/ApplicationScreen.qml create mode 100644 examples/positioning/satelliteinfo/Button.qml create mode 100644 examples/positioning/satelliteinfo/CMakeLists.txt create mode 100644 examples/positioning/satelliteinfo/Header.qml create mode 100644 examples/positioning/satelliteinfo/HelpPopup.qml create mode 100644 examples/positioning/satelliteinfo/LegendBox.qml create mode 100644 examples/positioning/satelliteinfo/Main.qml create mode 100644 examples/positioning/satelliteinfo/PageButton.qml create mode 100644 examples/positioning/satelliteinfo/PermissionsScreen.qml create mode 100644 examples/positioning/satelliteinfo/PositionBox.qml create mode 100644 examples/positioning/satelliteinfo/RssiView.qml create mode 100644 examples/positioning/satelliteinfo/SatelliteView.qml create mode 100644 examples/positioning/satelliteinfo/SettingsView.qml create mode 100644 examples/positioning/satelliteinfo/SkyView.qml create mode 100644 examples/positioning/satelliteinfo/Theme.qml create mode 100644 examples/positioning/satelliteinfo/ViewSwitch.qml create mode 100644 examples/positioning/satelliteinfo/doc/images/rssiview_settings.webp create mode 100644 examples/positioning/satelliteinfo/doc/images/skyview_tableview.webp create mode 100644 examples/positioning/satelliteinfo/doc/src/satelliteinfo.qdoc create mode 100644 examples/positioning/satelliteinfo/fonts/TitilliumWeb-Regular.ttf create mode 100644 examples/positioning/satelliteinfo/fonts/TitilliumWeb-SemiBold.ttf create mode 100644 examples/positioning/satelliteinfo/fonts/qt_attribution.json create mode 100644 examples/positioning/satelliteinfo/icons/checkbox.svg create mode 100644 examples/positioning/satelliteinfo/icons/checkbox_blank.svg create mode 100644 examples/positioning/satelliteinfo/icons/darkmode.svg create mode 100644 examples/positioning/satelliteinfo/icons/filter.svg create mode 100644 examples/positioning/satelliteinfo/icons/help.svg create mode 100644 examples/positioning/satelliteinfo/icons/lightmode.svg create mode 100644 examples/positioning/satelliteinfo/icons/place.svg create mode 100644 examples/positioning/satelliteinfo/icons/qt_attribution.json create mode 100644 examples/positioning/satelliteinfo/icons/qtlogo_green.png create mode 100644 examples/positioning/satelliteinfo/icons/qtlogo_white.png create mode 100644 examples/positioning/satelliteinfo/icons/rssiview.svg create mode 100644 examples/positioning/satelliteinfo/icons/satellite1.png create mode 100644 examples/positioning/satelliteinfo/icons/satellite2.png create mode 100644 examples/positioning/satelliteinfo/icons/satellite_small.png create mode 100644 examples/positioning/satelliteinfo/icons/search.svg create mode 100644 examples/positioning/satelliteinfo/icons/settings.svg create mode 100644 examples/positioning/satelliteinfo/icons/skyview.svg create mode 100644 examples/positioning/satelliteinfo/icons/sort.svg create mode 100644 examples/positioning/satelliteinfo/icons/tableview.svg create mode 100644 examples/positioning/satelliteinfo/main.cpp create mode 100644 examples/positioning/satelliteinfo/nmealog.txt create mode 100644 examples/positioning/satelliteinfo/qmldir create mode 100644 examples/positioning/satelliteinfo/roles.h create mode 100644 examples/positioning/satelliteinfo/satelliteinfo.pro create mode 100644 examples/positioning/satelliteinfo/satellitemodel.cpp create mode 100644 examples/positioning/satelliteinfo/satellitemodel.h create mode 100644 examples/positioning/satelliteinfo/sortfiltermodel.cpp create mode 100644 examples/positioning/satelliteinfo/sortfiltermodel.h create mode 100644 examples/positioning/shared/Info.cmake.ios.plist create mode 100644 examples/positioning/shared/Info.cmake.macos.plist create mode 100644 examples/positioning/shared/Info.qmake.ios.plist create mode 100644 examples/positioning/shared/Info.qmake.macos.plist create mode 100644 examples/positioning/weatherinfo/BigForecastIcon.qml create mode 100644 examples/positioning/weatherinfo/CMakeLists.txt create mode 100644 examples/positioning/weatherinfo/ForecastIcon.qml create mode 100644 examples/positioning/weatherinfo/WeatherIcon.qml create mode 100644 examples/positioning/weatherinfo/WeatherInfo.qml create mode 100644 examples/positioning/weatherinfo/appmodel.cpp create mode 100644 examples/positioning/weatherinfo/appmodel.h create mode 100644 examples/positioning/weatherinfo/doc/images/example-weatherinfo.png create mode 100644 examples/positioning/weatherinfo/doc/src/weatherinfo.qdoc create mode 100644 examples/positioning/weatherinfo/icons/waypoint.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-few-clouds.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-fog.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-haze.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-icy.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-overcast.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-showers-scattered.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-showers.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-sleet.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-snow.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-storm.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-sunny-very-few-clouds.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-sunny.svg create mode 100644 examples/positioning/weatherinfo/icons/weather-thundershower.svg create mode 100644 examples/positioning/weatherinfo/main.cpp create mode 100644 examples/positioning/weatherinfo/openmeteobackend.cpp create mode 100644 examples/positioning/weatherinfo/openmeteobackend.h create mode 100644 examples/positioning/weatherinfo/openweathermapbackend.cpp create mode 100644 examples/positioning/weatherinfo/openweathermapbackend.h create mode 100644 examples/positioning/weatherinfo/providerbackend.cpp create mode 100644 examples/positioning/weatherinfo/providerbackend.h create mode 100644 examples/positioning/weatherinfo/qmldir create mode 100644 examples/positioning/weatherinfo/weatherapibackend.cpp create mode 100644 examples/positioning/weatherinfo/weatherapibackend.h create mode 100644 examples/positioning/weatherinfo/weatherinfo.pro create mode 100644 src/3rdparty/clip2tri/CMakeLists.txt create mode 100644 src/3rdparty/clip2tri/LICENSE create mode 100644 src/3rdparty/clip2tri/clip2tri.cpp create mode 100644 src/3rdparty/clip2tri/clip2tri.h create mode 100644 src/3rdparty/clip2tri/qt_attribution.json create mode 100644 src/3rdparty/clipper/CMakeLists.txt create mode 100644 src/3rdparty/clipper/LICENSE create mode 100644 src/3rdparty/clipper/clipper.cpp create mode 100644 src/3rdparty/clipper/clipper.h create mode 100644 src/3rdparty/clipper/qt_attribution.json create mode 100644 src/3rdparty/poly2tri/AUTHORS create mode 100644 src/3rdparty/poly2tri/CMakeLists.txt create mode 100644 src/3rdparty/poly2tri/LICENSE create mode 100644 src/3rdparty/poly2tri/common/shapes.cpp create mode 100644 src/3rdparty/poly2tri/common/shapes.h create mode 100644 src/3rdparty/poly2tri/common/utils.h create mode 100644 src/3rdparty/poly2tri/poly2tri.h create mode 100644 src/3rdparty/poly2tri/qt_attribution.json create mode 100644 src/3rdparty/poly2tri/sweep/advancing_front.cpp create mode 100644 src/3rdparty/poly2tri/sweep/advancing_front.h create mode 100644 src/3rdparty/poly2tri/sweep/cdt.cpp create mode 100644 src/3rdparty/poly2tri/sweep/cdt.h create mode 100644 src/3rdparty/poly2tri/sweep/sweep.cpp create mode 100644 src/3rdparty/poly2tri/sweep/sweep.h create mode 100644 src/3rdparty/poly2tri/sweep/sweep_context.cpp create mode 100644 src/3rdparty/poly2tri/sweep/sweep_context.h create mode 100644 src/CMakeLists.txt create mode 100644 src/plugins/CMakeLists.txt create mode 100644 src/plugins/position/CMakeLists.txt create mode 100644 src/plugins/position/android/CMakeLists.txt create mode 100644 src/plugins/position/android/jar/AndroidManifest.xml create mode 100644 src/plugins/position/android/jar/CMakeLists.txt create mode 100644 src/plugins/position/android/jar/src/org/qtproject/qt/android/positioning/QtPositioning.java create mode 100644 src/plugins/position/android/src/CMakeLists.txt create mode 100644 src/plugins/position/android/src/jnipositioning.cpp create mode 100644 src/plugins/position/android/src/jnipositioning.h create mode 100644 src/plugins/position/android/src/plugin.json create mode 100644 src/plugins/position/android/src/positionfactory_android.cpp create mode 100644 src/plugins/position/android/src/positionfactory_android.h create mode 100644 src/plugins/position/android/src/qgeopositioninfosource_android.cpp create mode 100644 src/plugins/position/android/src/qgeopositioninfosource_android_p.h create mode 100644 src/plugins/position/android/src/qgeosatelliteinfosource_android.cpp create mode 100644 src/plugins/position/android/src/qgeosatelliteinfosource_android_p.h create mode 100644 src/plugins/position/corelocation/CMakeLists.txt create mode 100644 src/plugins/position/corelocation/plugin.json create mode 100644 src/plugins/position/corelocation/qgeopositioninfosource_cl.mm create mode 100644 src/plugins/position/corelocation/qgeopositioninfosource_cl_p.h create mode 100644 src/plugins/position/corelocation/qgeopositioninfosourcefactory_cl.h create mode 100644 src/plugins/position/corelocation/qgeopositioninfosourcefactory_cl.mm create mode 100644 src/plugins/position/geoclue2/CMakeLists.txt create mode 100644 src/plugins/position/geoclue2/geocluetypes.cpp create mode 100644 src/plugins/position/geoclue2/geocluetypes.h create mode 100644 src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Client.xml create mode 100644 src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Location.xml create mode 100644 src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Manager.xml create mode 100644 src/plugins/position/geoclue2/plugin.json create mode 100644 src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp create mode 100644 src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2_p.h create mode 100644 src/plugins/position/geoclue2/qgeopositioninfosourcefactory_geoclue2.cpp create mode 100644 src/plugins/position/geoclue2/qgeopositioninfosourcefactory_geoclue2.h create mode 100644 src/plugins/position/gypsy/CMakeLists.txt create mode 100644 src/plugins/position/gypsy/plugin.json create mode 100644 src/plugins/position/gypsy/qgeopositioninfosourcefactory_gypsy.cpp create mode 100644 src/plugins/position/gypsy/qgeopositioninfosourcefactory_gypsy.h create mode 100644 src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy.cpp create mode 100644 src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy_p.h create mode 100644 src/plugins/position/nmea/CMakeLists.txt create mode 100644 src/plugins/position/nmea/plugin.json create mode 100644 src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.cpp create mode 100644 src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.h create mode 100644 src/plugins/position/nmea/qiopipe.cpp create mode 100644 src/plugins/position/nmea/qiopipe_p.h create mode 100644 src/plugins/position/positionpoll/CMakeLists.txt create mode 100644 src/plugins/position/positionpoll/plugin.json create mode 100644 src/plugins/position/positionpoll/positionpollfactory.cpp create mode 100644 src/plugins/position/positionpoll/positionpollfactory.h create mode 100644 src/plugins/position/positionpoll/qgeoareamonitor_polling.cpp create mode 100644 src/plugins/position/positionpoll/qgeoareamonitor_polling.h create mode 100644 src/plugins/position/winrt/CMakeLists.txt create mode 100644 src/plugins/position/winrt/plugin.json create mode 100644 src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp create mode 100644 src/plugins/position/winrt/qgeopositioninfosource_winrt_p.h create mode 100644 src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.cpp create mode 100644 src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.h create mode 100644 src/positioning/CMakeLists.txt create mode 100644 src/positioning/configure.cmake create mode 100644 src/positioning/configure.json create mode 100644 src/positioning/doc/images/permissions.png create mode 100644 src/positioning/doc/qtpositioning.qdocconf create mode 100644 src/positioning/doc/snippets/CMakeLists.txt create mode 100644 src/positioning/doc/snippets/cpp/CMakeLists.txt create mode 100644 src/positioning/doc/snippets/cpp/cppqml.cpp create mode 100644 src/positioning/doc/snippets/cpp/main.cpp create mode 100644 src/positioning/doc/snippets/doc_src_qtpositioning.qml create mode 100644 src/positioning/doc/src/cpp-position.qdoc create mode 100644 src/positioning/doc/src/cpp-qml-positioning.qdoc create mode 100644 src/positioning/doc/src/external-resources.qdoc create mode 100644 src/positioning/doc/src/plugins/geoclue2.qdoc create mode 100644 src/positioning/doc/src/plugins/gypsy.qdoc create mode 100644 src/positioning/doc/src/plugins/nmea.qdoc create mode 100644 src/positioning/doc/src/qml-position.qdoc create mode 100644 src/positioning/doc/src/qt6-changes.qdoc create mode 100644 src/positioning/doc/src/qtpositioning-android.qdoc create mode 100644 src/positioning/doc/src/qtpositioning-examples.qdoc create mode 100644 src/positioning/doc/src/qtpositioning-ios.qdoc create mode 100644 src/positioning/doc/src/qtpositioning-plugins.qdoc create mode 100644 src/positioning/doc/src/qtpositioning-qml.qdoc create mode 100644 src/positioning/doc/src/qtpositioning.qdoc create mode 100644 src/positioning/qclipperutils.cpp create mode 100644 src/positioning/qclipperutils_p.h create mode 100644 src/positioning/qdoublematrix4x4.cpp create mode 100644 src/positioning/qdoublematrix4x4_p.h create mode 100644 src/positioning/qdoublevector2d.cpp create mode 100644 src/positioning/qdoublevector2d_p.h create mode 100644 src/positioning/qdoublevector3d.cpp create mode 100644 src/positioning/qdoublevector3d_p.h create mode 100644 src/positioning/qgeoaddress.cpp create mode 100644 src/positioning/qgeoaddress.h create mode 100644 src/positioning/qgeoaddress_p.h create mode 100644 src/positioning/qgeoareamonitorinfo.cpp create mode 100644 src/positioning/qgeoareamonitorinfo.h create mode 100644 src/positioning/qgeoareamonitorsource.cpp create mode 100644 src/positioning/qgeoareamonitorsource.h create mode 100644 src/positioning/qgeocircle.cpp create mode 100644 src/positioning/qgeocircle.h create mode 100644 src/positioning/qgeocircle_p.h create mode 100644 src/positioning/qgeocoordinate.cpp create mode 100644 src/positioning/qgeocoordinate.h create mode 100644 src/positioning/qgeocoordinate_p.h create mode 100644 src/positioning/qgeocoordinateobject.cpp create mode 100644 src/positioning/qgeocoordinateobject_p.h create mode 100644 src/positioning/qgeolocation.cpp create mode 100644 src/positioning/qgeolocation.h create mode 100644 src/positioning/qgeolocation_p.h create mode 100644 src/positioning/qgeopath.cpp create mode 100644 src/positioning/qgeopath.h create mode 100644 src/positioning/qgeopath_p.h create mode 100644 src/positioning/qgeopolygon.cpp create mode 100644 src/positioning/qgeopolygon.h create mode 100644 src/positioning/qgeopolygon_p.h create mode 100644 src/positioning/qgeopositioninfo.cpp create mode 100644 src/positioning/qgeopositioninfo.h create mode 100644 src/positioning/qgeopositioninfo_p.h create mode 100644 src/positioning/qgeopositioninfosource.cpp create mode 100644 src/positioning/qgeopositioninfosource.h create mode 100644 src/positioning/qgeopositioninfosource_p.h create mode 100644 src/positioning/qgeopositioninfosourcefactory.cpp create mode 100644 src/positioning/qgeopositioninfosourcefactory.h create mode 100644 src/positioning/qgeorectangle.cpp create mode 100644 src/positioning/qgeorectangle.h create mode 100644 src/positioning/qgeorectangle_p.h create mode 100644 src/positioning/qgeosatelliteinfo.cpp create mode 100644 src/positioning/qgeosatelliteinfo.h create mode 100644 src/positioning/qgeosatelliteinfo_p.h create mode 100644 src/positioning/qgeosatelliteinfosource.cpp create mode 100644 src/positioning/qgeosatelliteinfosource.h create mode 100644 src/positioning/qgeosatelliteinfosource_p.h create mode 100644 src/positioning/qgeoshape.cpp create mode 100644 src/positioning/qgeoshape.h create mode 100644 src/positioning/qgeoshape_p.h create mode 100644 src/positioning/qlocationutils.cpp create mode 100644 src/positioning/qlocationutils_p.h create mode 100644 src/positioning/qnmeapositioninfosource.cpp create mode 100644 src/positioning/qnmeapositioninfosource.h create mode 100644 src/positioning/qnmeapositioninfosource_p.h create mode 100644 src/positioning/qnmeasatelliteinfosource.cpp create mode 100644 src/positioning/qnmeasatelliteinfosource.h create mode 100644 src/positioning/qnmeasatelliteinfosource_p.h create mode 100644 src/positioning/qpositioningglobal.h create mode 100644 src/positioning/qpositioningglobal_p.h create mode 100644 src/positioning/qwebmercator.cpp create mode 100644 src/positioning/qwebmercator_p.h create mode 100644 src/positioningquick/CMakeLists.txt create mode 100644 src/positioningquick/geosatelliteinfo.qdoc create mode 100644 src/positioningquick/locationsingleton.cpp create mode 100644 src/positioningquick/locationsingleton_p.h create mode 100644 src/positioningquick/positioningplugin.cpp create mode 100644 src/positioningquick/qdeclarativegeoaddress.cpp create mode 100644 src/positioningquick/qdeclarativegeoaddress_p.h create mode 100644 src/positioningquick/qdeclarativegeolocation.cpp create mode 100644 src/positioningquick/qdeclarativegeolocation_p.h create mode 100644 src/positioningquick/qdeclarativepluginparameter.cpp create mode 100644 src/positioningquick/qdeclarativepluginparameter_p.h create mode 100644 src/positioningquick/qdeclarativeposition.cpp create mode 100644 src/positioningquick/qdeclarativeposition_p.h create mode 100644 src/positioningquick/qdeclarativepositionsource.cpp create mode 100644 src/positioningquick/qdeclarativepositionsource_p.h create mode 100644 src/positioningquick/qdeclarativesatellitesource.cpp create mode 100644 src/positioningquick/qdeclarativesatellitesource_p.h create mode 100644 src/positioningquick/qpositioningquickglobal.h create mode 100644 src/positioningquick/qpositioningquickglobal_p.h create mode 100644 src/positioningquick/qpositioningquickmodule.cpp create mode 100644 src/positioningquick/qpositioningquickmodule_p.h create mode 100644 src/positioningquick/qquickgeocoordinateanimation.cpp create mode 100644 src/positioningquick/qquickgeocoordinateanimation_p.h create mode 100644 src/positioningquick/qquickgeocoordinateanimation_p_p.h create mode 100644 tests/CMakeLists.txt create mode 100644 tests/applications/positioning_backend/CMakeLists.txt create mode 100644 tests/applications/positioning_backend/logwidget.cpp create mode 100644 tests/applications/positioning_backend/logwidget.h create mode 100644 tests/applications/positioning_backend/main.cpp create mode 100644 tests/applications/positioning_backend/widget.cpp create mode 100644 tests/applications/positioning_backend/widget.h create mode 100644 tests/applications/positioning_backend/widget.ui create mode 100644 tests/auto/CMakeLists.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.10.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.11.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.12.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.13.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.14.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.15.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.3.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.4.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.6.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.7.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.8.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtPositioning.5.9.0.linux-gcc-amd64.txt create mode 100644 tests/auto/cmake/CMakeLists.txt create mode 100644 tests/auto/declarative_geolocation/CMakeLists.txt create mode 100644 tests/auto/declarative_geolocation/main.cpp create mode 100644 tests/auto/declarative_geolocation/tst_declarativegeolocation.qml create mode 100644 tests/auto/declarative_positioning_core/BLACKLIST create mode 100644 tests/auto/declarative_positioning_core/CMakeLists.txt create mode 100644 tests/auto/declarative_positioning_core/factory.cpp create mode 100644 tests/auto/declarative_positioning_core/factory.h create mode 100644 tests/auto/declarative_positioning_core/main.cpp create mode 100644 tests/auto/declarative_positioning_core/properties.cpp create mode 100644 tests/auto/declarative_positioning_core/properties.h create mode 100644 tests/auto/declarative_positioning_core/tst_address.qml create mode 100644 tests/auto/declarative_positioning_core/tst_coordinate.qml create mode 100644 tests/auto/declarative_positioning_core/tst_geoshape.qml create mode 100644 tests/auto/declarative_positioning_core/tst_position.qml create mode 100644 tests/auto/declarative_positioning_core/tst_positionsource.qml create mode 100644 tests/auto/declarative_satellitesource/CMakeLists.txt create mode 100644 tests/auto/declarative_satellitesource/main.cpp create mode 100644 tests/auto/declarative_satellitesource/tst_satellite.qml create mode 100644 tests/auto/declarative_satellitesource/tst_satellitesource.qml create mode 100644 tests/auto/doublevectors/CMakeLists.txt create mode 100644 tests/auto/doublevectors/tst_doublevectors.cpp create mode 100644 tests/auto/dummypositionplugin/CMakeLists.txt create mode 100644 tests/auto/dummypositionplugin/plugin.cpp create mode 100644 tests/auto/dummypositionplugin/plugin.json create mode 100644 tests/auto/positionplugin/CMakeLists.txt create mode 100644 tests/auto/positionplugin/plugin.cpp create mode 100644 tests/auto/positionplugin/plugin.json create mode 100644 tests/auto/positionplugintest/CMakeLists.txt create mode 100644 tests/auto/positionplugintest/tst_positionplugin.cpp create mode 100644 tests/auto/qdeclarativegeolocation/CMakeLists.txt create mode 100644 tests/auto/qdeclarativegeolocation/tst_qdeclarativegeolocation.cpp create mode 100644 tests/auto/qdeclarativeposition/CMakeLists.txt create mode 100644 tests/auto/qdeclarativeposition/tst_qdeclarativeposition.cpp create mode 100644 tests/auto/qdeclarativepositionsource/BLACKLIST create mode 100644 tests/auto/qdeclarativepositionsource/CMakeLists.txt create mode 100644 tests/auto/qdeclarativepositionsource/tst_qdeclarativepositionsource.cpp create mode 100644 tests/auto/qgeoaddress/CMakeLists.txt create mode 100644 tests/auto/qgeoaddress/tst_qgeoaddress.cpp create mode 100644 tests/auto/qgeoareamonitor/BLACKLIST create mode 100644 tests/auto/qgeoareamonitor/CMakeLists.txt create mode 100644 tests/auto/qgeoareamonitor/logfilepositionsource.cpp create mode 100644 tests/auto/qgeoareamonitor/logfilepositionsource.h create mode 100644 tests/auto/qgeoareamonitor/positionconsumerthread.cpp create mode 100644 tests/auto/qgeoareamonitor/positionconsumerthread.h create mode 100644 tests/auto/qgeoareamonitor/simplelog.txt create mode 100644 tests/auto/qgeoareamonitor/tst_qgeoareamonitor.cpp create mode 100644 tests/auto/qgeocircle/CMakeLists.txt create mode 100644 tests/auto/qgeocircle/tst_qgeocircle.cpp create mode 100644 tests/auto/qgeocoordinate/CMakeLists.txt create mode 100644 tests/auto/qgeocoordinate/tst_qgeocoordinate.cpp create mode 100644 tests/auto/qgeocoordinateobject/CMakeLists.txt create mode 100644 tests/auto/qgeocoordinateobject/tst_qgeocoordinateobject.cpp create mode 100644 tests/auto/qgeolocation/CMakeLists.txt create mode 100644 tests/auto/qgeolocation/tst_qgeolocation.cpp create mode 100644 tests/auto/qgeolocation/tst_qgeolocation.h create mode 100644 tests/auto/qgeopath/CMakeLists.txt create mode 100644 tests/auto/qgeopath/tst_qgeopath.cpp create mode 100644 tests/auto/qgeopolygon/CMakeLists.txt create mode 100644 tests/auto/qgeopolygon/tst_qgeopolygon.cpp create mode 100644 tests/auto/qgeopositioninfo/CMakeLists.txt create mode 100644 tests/auto/qgeopositioninfo/tst_qgeopositioninfo.cpp create mode 100644 tests/auto/qgeopositioninfosource/CMakeLists.txt create mode 100644 tests/auto/qgeopositioninfosource/testqgeopositioninfosource.cpp create mode 100644 tests/auto/qgeopositioninfosource/testqgeopositioninfosource_p.h create mode 100644 tests/auto/qgeopositioninfosource/tst_qgeopositioninfosource.cpp create mode 100644 tests/auto/qgeorectangle/CMakeLists.txt create mode 100644 tests/auto/qgeorectangle/tst_qgeorectangle.cpp create mode 100644 tests/auto/qgeosatelliteinfo/CMakeLists.txt create mode 100644 tests/auto/qgeosatelliteinfo/tst_qgeosatelliteinfo.cpp create mode 100644 tests/auto/qgeosatelliteinfosource/CMakeLists.txt create mode 100644 tests/auto/qgeosatelliteinfosource/testqgeosatelliteinfosource.cpp create mode 100644 tests/auto/qgeosatelliteinfosource/testqgeosatelliteinfosource_p.h create mode 100644 tests/auto/qgeosatelliteinfosource/tst_qgeosatelliteinfosource.cpp create mode 100644 tests/auto/qgeoshape/CMakeLists.txt create mode 100644 tests/auto/qgeoshape/tst_qgeoshape.cpp create mode 100644 tests/auto/qnmeapositioninfosource/CMakeLists.txt create mode 100644 tests/auto/qnmeapositioninfosource/dummy/CMakeLists.txt create mode 100644 tests/auto/qnmeapositioninfosource/dummy/tst_dummynmeapositioninfosource.cpp create mode 100644 tests/auto/qnmeapositioninfosource/realtime/CMakeLists.txt create mode 100644 tests/auto/qnmeapositioninfosource/realtime/tst_qnmeapositioninfosource_realtime.cpp create mode 100644 tests/auto/qnmeapositioninfosource/realtime_generic/CMakeLists.txt create mode 100644 tests/auto/qnmeapositioninfosource/realtime_generic/tst_qnmeapositioninfosource_realtime_generic.cpp create mode 100644 tests/auto/qnmeapositioninfosource/simulation/CMakeLists.txt create mode 100644 tests/auto/qnmeapositioninfosource/simulation/tst_qnmeapositioninfosource_simulation.cpp create mode 100644 tests/auto/qnmeapositioninfosource/simulation_generic/CMakeLists.txt create mode 100644 tests/auto/qnmeapositioninfosource/simulation_generic/tst_qnmeapositioninfosource_simulation_generic.cpp create mode 100644 tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.cpp create mode 100644 tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.h create mode 100644 tests/auto/qnmeasatelliteinfosource/CMakeLists.txt create mode 100644 tests/auto/qnmeasatelliteinfosource/dummy/CMakeLists.txt create mode 100644 tests/auto/qnmeasatelliteinfosource/dummy/tst_dummynmeasatelliteinfosource.cpp create mode 100644 tests/auto/qnmeasatelliteinfosource/generic_realtime/CMakeLists.txt create mode 100644 tests/auto/qnmeasatelliteinfosource/generic_realtime/tst_nmeasatelliteinfosource_generic_rt.cpp create mode 100644 tests/auto/qnmeasatelliteinfosource/generic_simulation/CMakeLists.txt create mode 100644 tests/auto/qnmeasatelliteinfosource/generic_simulation/tst_nmeasatelliteinfosource_generic_sim.cpp create mode 100644 tests/auto/qnmeasatelliteinfosource/nmea/CMakeLists.txt create mode 100644 tests/auto/qnmeasatelliteinfosource/nmea/tst_nmeasatelliteinfosource.cpp create mode 100644 tests/auto/qquickgeocoordinateanimation/CMakeLists.txt create mode 100644 tests/auto/qquickgeocoordinateanimation/tst_qquickgeocoordinateanimation.cpp create mode 100644 tests/auto/qwebmercator/CMakeLists.txt create mode 100644 tests/auto/qwebmercator/tst_qwebmercator.cpp create mode 100644 tests/auto/satellitesourceplugin/CMakeLists.txt create mode 100644 tests/auto/satellitesourceplugin/plugin.cpp create mode 100644 tests/auto/satellitesourceplugin/plugin.json create mode 100644 tests/auto/utils/qlocationtestutils.cpp create mode 100644 tests/auto/utils/qlocationtestutils_p.h create mode 100644 tests/auto/utils/qnmeaproxyfactory.cpp create mode 100644 tests/auto/utils/qnmeaproxyfactory.h create mode 100644 tests/benchmarks/CMakeLists.txt create mode 100644 tests/benchmarks/README create mode 100644 tests/benchmarks/qgeoareamonitorinfo/CMakeLists.txt create mode 100644 tests/benchmarks/qgeoareamonitorinfo/tst_bench_qgeoareamonitorinfo.cpp create mode 100644 tests/benchmarks/qgeopositioninfo/CMakeLists.txt create mode 100644 tests/benchmarks/qgeopositioninfo/tst_bench_qgeopositioninfo.cpp create mode 100644 tests/benchmarks/qgeosatelliteinfo/CMakeLists.txt create mode 100644 tests/benchmarks/qgeosatelliteinfo/tst_bench_qgeosatelliteinfo.cpp create mode 100644 tests/global/global.cfg diff --git a/.QT-ENTERPRISE-LICENSE-AGREEMENT b/.QT-ENTERPRISE-LICENSE-AGREEMENT new file mode 100644 index 0000000..2d225ec --- /dev/null +++ b/.QT-ENTERPRISE-LICENSE-AGREEMENT @@ -0,0 +1,262 @@ +Qt Frame Agreement +Version 2024-02 + +1. PARTIES OF THIS AGREEMENT +1.1. This Qt Frame Agreement—comprised of these general terms together with the appendices attached hereto, (hereinafter “Agreement”) is made by and between: The Qt Company, as defined below (hereinafter ”The Qt Company”) AND Customer name (hereinafter “Customer"):___________________ Business Id (e.g. VAT or EIN number):___________________ +1.2. The parties above are hereinafter individually referred to as a "Party" and collectively as the "Parties". + +2. STRUCTURE AND OBJECT OF THE AGREEMENT +2.1. The Parties have entered into this Agreement to agree on the terms and conditions applicable to The Qt Company's delivery of products and services ("Services") to Customer. +2.2. This Agreement is comprised of the following components: +(i) This Agreement, which contains the general terms applicable to all Services, +(ii) Appendices for each of the Services, containing terms applicable to that individual set of Services ("Service Terms"), +(iii) a Qt Appendix for Pricing, if applicable, which contains pricing for specific Services, and +(iv) other topic-specific appendices, such as Support or Marketing Rights. +2.3. Any and all Services purchased shall be specified in, and agreed upon between, the Parties under a separate purchase order, statement of work, quote, or similar document ("Purchase Document"). Each Purchase Document concluded under this Agreement shall include a reference to this Agreement and be governed by this Agreement. + +3. DEFINITIONS +3.1. "Affiliate" of a Party shall mean an entity (i) which is directly or indirectly controlling such Party; (ii) which is under the same direct or indirect ownership or control as such Party; or (iii) which is directly or indirectly owned or controlled by such Party. For these purposes, an entity shall be treated as being controlled by another if that other entity has fifty percent (50 %) or more of the votes in such entity, is able to direct its affairs and/or to control the composition of its board of directors or equivalent body. +3.2. "Contractor" shall mean third-party consultants, distributors and contractors performing services to Customer under an applicable contractual arrangement. +3.3. "Customer" shall mean the individual or legal entity specified in Section 1 above, that is a Party to this Agreement. +3.4. "Force Majeure Event" shall have the meaning set forth in Section 11.7. +3.5. "Licensed Software" shall mean The Qt Company's commercial software product which is licensed for use by Customer under this Agreement and corresponding Service Terms. Licensed Software shall include, if and to the extent applicable and specified in the applicable relevant Service Terms, corresponding online or electronic documentation, associated media and printed materials, including the source code, and example programs. The Qt Company may in the course of its development activities, at its free and absolute discretion and without any obligation to send or publish any notifications to Customer or in general, make changes, additions or deletions in the components and functionalities of the Licensed Software, provided that no such changes, additions or deletions will affect the already released version of the Licensed Software, but only upcoming version(s). Licensed Software is commercial computer software, developed at private expense and offered to the public under standard commercial terms. +3.6. "Professional Services" shall mean The Qt Company's professional-, consulting-, training- and/or project services delivered to Customer under this Agreement and specified in a Purchase Document. +3.7. "Support" shall mean maintenance and support services provided by The Qt Company to assist Customer in using the Licensed Software, as further specified in the Appendix for Support Terms. +3.8. "The Qt Company" shall mean: +(i) in the event Customer is an entity residing in the United States or a legal entity incorporated in or having its headquarters in the United States, The Qt Company Inc., a Delaware corporation with its office at 3031 Tisch Way, 110 Plaza West, San Jose, CA 95128, USA.; or +(ii) in the event Customer is an entity residing outside of the United States or a legal entity incorporated or having its registered office outside of the United States, The Qt Company Oy., a Finnish company with its registered office at Miestentie 7, 02150 Espoo, Finland. + +4. PRICES AND PAYMENT +4.1. The Qt Company agrees to make Services available to Customer subject to the prices set forth in the Appendix for Pricing. In the event that the Appendix for Pricing does not include a price for certain Services, the applicable price shall be the price agreed by the Parties in the respective Purchase Document. +4.2. All prices are exclusive of value added tax or other taxes, levels, or duties. Value added tax as well as other possible public charges imposed by authorities shall be added to the prices. +4.3. All fees under this Agreement are non-cancellable and non-refundable. +4.4. All fees under this Agreement shall be paid by Customer no later than thirty (30) days from the date of the applicable invoice from The Qt Company. +4.5. Unless otherwise agreed or provided in the respective Service Terms or Purchase Document, The Qt Company will invoice fees for: +4.5.1. Licensed Software and Support in advance upon conclusion of the Purchase Document, and +4.5.2. Professional Services monthly in arrears after the Service has been performed. +4.6. A late payment charge of the lower of: (a) one percent (1%) per month; or (b) the highest interest rate stipulated by applicable law, shall be charged on any unpaid balances that remain past due and which have not been disputed by Customer in good faith within thirty (30) days of receipt of invoice from The Qt Company. +4.7. The Qt Company may either (i) invoice Customer based on existing agreement, (ii) request Customer to place a purchase order corresponding to a quote by The Qt Company, or (iii) use Customer's stored Credit Card information to automatically charge the Customer for the relevant Renewal Term. +4.8. Unless and to the extent otherwise agreed in the Appendix for Pricing or in the Purchase Document, The Qt Company shall be entitled to adjust the prices set forth in the Appendix for Pricing by notifying Customer of the change in writing at least sixty (60) days before the effective date of the change. The change shall not affect the current pricing term of Services agreed upon before the effective date of the change. + +5. CONFIDENTIALITY +5.1. The Parties shall keep confidential, and shall not use or disclose to any unauthorized third parties, the existence and content of this Agreement as well as any Confidential Information received from the other Party or otherwise learned in connection with the Agreement or the performance of the Services, without the prior written consent of the other Party. Confidential Information shall mean information that is designated as confidential or that would be reasonably understood to be confidential given the circumstances of disclosure and the nature of the information. The Parties shall not use Confidential Information received from the other Party for any other purposes than the performance of the Agreement or the fulfilment of their rights and obligations hereunder. +5.2. Each Party shall limit access the other Party's Confidential Information only to those of its employees, subcontractors, Contractors, Affiliates or financial or legal advisors who necessarily need access to the Confidential Information for the proper performance of the Party's rights and obligations under the Agreement. Each Party shall ensure that the persons receiving Confidential Information of the other Party are bound by confidentiality obligations not less restrictive than those stipulated herein. +5.3. Each Party shall protect the confidentiality of the other Party's Confidential Information with at least the same degree of security as it exercises to its own confidential information, but no less than a standard of reasonable care. +5.4. The confidentiality obligation stipulated herein shall not be applied to material and information which: +(iii) has become generally available or otherwise public prior to its submission by the other Party; +(iv) becomes generally available or otherwise public due to a reason other than the negligence or omission of the recipient or its personnel or other actions in violation of this Agreement or applicable legislation; +(v) the Party has lawfully received from a third party without any obligation of confidentiality; +(vi) was lawfully in the possession of the receiving Party prior to receipt of the same from the other Party without any obligation of confidentiality related thereto; +(vii) a Party has developed independently without using material or information received from the other Party; or +(viii) a Party must disclose pursuant to law, decree or other order issued by competent regulatory or governmental body or other public authority or a judicial order, in which case the Party shall, to the extent permitted by applicable law, inform the other Party in writing of the disclosure of information prior to such disclosure. +5.5. Each Party shall, upon request of the other Party at any time, including upon termination, cancellation or expiry of the Agreement, promptly destroy or deliver to the other Party any and all the documents, files, copies and material containing Confidential Information of the other Party. Notwithstanding the foregoing, a Party may retain one copy of the Confidential Information in a secure location, if and solely to the extent required to comply with applicable laws or regulations. Any Confidential Information stored in electronic back-up form shall be rendered inaccessible and destroyed in accordance with standard back-up procedures. + +6. INTELLECTUAL PROPERTY RIGHTS +6.1. Unless and to the extent expressly provided in the respective Service Terms, this Agreement carries no assignment or license to the intellectual property rights of either Party and all such rights are and shall remain the exclusive property of the Party to whom such rights are vested under applicable law at the signing of this Agreement or thereafter. +6.2. Where The Qt Company's delivery includes any materials owned by a third party, such third party materials shall be governed in all respects by the applicable license terms of such third-party right holders. The Qt Company shall duly inform the Customer whenever such third party materials are included in the Services and of applicable license terms to be followed by the Customer in using such third party materials. + +7. FEES AND ORDERING +7.1. Services Fees. Services Fees are described in the Purchase Document. +7.2. Ordering Services. +(i) Customer may purchase Services pursuant to agreed pricing terms or, if no specific pricing terms have been agreed upon, at The Qt Company's standard pricing terms applicable at the time of purchase. +(ii) Unless expressly otherwise agreed, any price or other term quoted to Customer shall only be valid for the thirty (30) days from the date such price has been quoted. + +8. LIMITED WARRANTY AND WARRANTY DISCLAIMER +8.1. The Qt Company hereby represents and warrants that: (i) it has the power and authority to grant the rights and licenses granted to Customer under this Agreement; (ii) the Licensed Software will operate materially in accordance with its specifications (as set forth in the applicable product documentation or, where relevant, program description); (iii) Professional Services and Support will be performed in a professional, workmanlike manner pursuant to the Agreement; and (iv) during the ten years prior to the effective date of this Agreement, there have not been any claims alleging that the Licensed Software has infringed any intellectual property rights of a third party and, to the knowledge of The Qt Company as of the effective date of this Agreement, no such infringement exists. These warranties do not apply to issues arising from, or relating to, any third-party materials or Customer's use of the Licensed Software in violation of applicable law or the terms of this Agreement. +8.2. Except to the extent set forth above, the Services are delivered to Customer "as is" and to the maximum extent permitted by applicable law, exclusive of other warranties, whether express, implied, or otherwise. Customer's sole and exclusive remedy and The Qt Company's entire liability for deficiencies or errors in the Services shall be limited, at The Qt Company's option, to correction of the error, replacement of the Services, re-performance of the Service or return of the applicable fees paid for the defective Service for the time period during which Customer was not able to utilize the Service as agreed. + +9. LIMITATION OF LIABILITY +9.1. EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, (II) A BREACH OR VIOLATION OF THE OTHER PARTY'S INTELLECTUAL PROPERTY RIGHTS, OR (III) WHERE REQUIRED BY APPLICABLE LAW, IN NO EVENT SHALL EITHER PARTY BE LIABLE TO THE OTHER PARTY FOR ANY LOST PROFITS, LOSS OF DATA, LOSS OF BUSINESS OR GOODWILL OR ANY OTHER INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE COST, DAMAGES OR EXPENSE OF ANY KIND, HOWSOEVER ARISING UNDER OR IN CONNECTION WITH THIS AGREEMENT. +9.2. EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, (II) A BREACH OR VIOLATION OF THE OTHER PARTY'S INTELLECTUAL PROPERTY RIGHTS, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL EITHER PARTY'S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT EXCEED THE AGGREGATE FEES PAID OR PAYABLE TO THE QT COMPANY BY CUSTOMER FOR THE RESPECTIVE LICENSED SOFTWARE OR SERVICE GIVING RISE TO THE LIABILITY. THE FOREGOING LIMITATION WILL NOT APPLY TO CUSTOMER'S OBLIGATION TO PAY THE APPLICABLE FEES CORRESPONDING TO ITS ACTUAL USE OF LICENSED SOFTWARE OR SERVICES. + +10. TERM AND TERMINATION +10.1. This Agreement shall enter into force upon signing by both Parties and is effective as of the last date of signature. +10.2. This Agreement shall remain in force until further notice and may be terminated without cause by either Party by no less than three (3) months' prior written notice to the other Party. +10.3. Termination of a particular Purchase Document and the Services governed thereunder shall be stipulated under the applicable Service Terms. +10.4. Either Party may terminate this Agreement with immediate effect, if the other Party: +(i) commits a material breach of the terms of this Agreement (including applicable Service Terms) and has not remedied such breach within a reasonable period of time (which shall be no less than thirty (30) days) of the non-breaching Party's written notice specifying the breach, or +(ii) becomes bankrupt, insolvent or goes into liquidation or debt restructuring. +10.5. Termination of this Agreement shall, as such, have no effect on the validity of any Services ordered and agreed prior to the effective date of such termination, and such Services shall continue to remain in force pursuant to applicable Service Terms (including the terms of this Agreement) for the remainder of the duration of the applicable Service validity term. + +11. GOVERNING LAW AND DISPUTE RESOLUTION +11.1. The United Nations Convention on Contracts for the International Sale of Goods will not apply to this Agreement. +11.2. Where this Agreement is concluded with The Qt Company, Inc., a Delaware corporation, the Parties agree that this Section 10.2 will apply. This Agreement will be governed by, and construed in accordance with the laws of the State of California and any controlling United States federal law. Any dispute, controversy or claim arising out of or relating to this contract, including the formation, interpretation, breach or termination thereof, and whether the claims asserted are arbitrable, will be referred to and finally determined by arbitration in accordance with the JAMS International Arbitration Rules. The tribunal will consist of one arbitrator. The place of arbitration will be San Francisco, California, USA. The language to be used in the arbitral proceedings will be English. Judgment upon the award rendered by the arbitrator(s) may be entered in any court having jurisdiction thereof. This Section 10.2 shall not preclude parties from seeking provisional remedies in aid of arbitration from a court of appropriate jurisdiction. Notwithstanding the foregoing, any action by The Qt Company solely to collect license or other fees hereunder may be brought in any court of competent jurisdiction. +11.3. Where this Agreement is concluded with The Qt Company, Oy., a Finnish company, the parties agree that this Section 10.3 will apply. This Agreement shall be construed and interpreted in accordance with the laws of Finland, excluding its choice of law provisions. All disputes arising out of or in connection with this Agreement shall be finally settled in accordance with the laws of Finland, excluding its choice of law provisions. All disputes arising out of or in connection with this Agreement shall be finally settled under the Rules of Arbitration of the International Chamber of Commerce by one or more arbitrators appointed in accordance with the said Rules. The place of arbitration will be Helsinki, Finland. The language to be used in arbitral proceedings will be English. This Section 10.3 shall not preclude parties from seeking provisional remedies in aid of arbitration from a court of appropriate jurisdiction. + +12. MISCELLANOUS +12.1. No Assignment. Customer shall not be entitled to assign or transfer all or any of its rights, benefits and obligations under this Agreement except in case of sale of relevant business or assets or otherwise with prior written consent of The Qt Company, which shall not be unreasonably withheld or delayed. The Qt Company shall be entitled to freely assign or transfer any of its rights, benefits or obligations under this Agreement. +12.2. Surviving Sections. Any terms and conditions that by their nature or otherwise reasonably should survive termination of this Agreement shall so be deemed to survive. +12.3. Entire Agreement. This Agreement, its Appendices and any applicable Purchase Documents constitute the complete agreement between the Parties and supersedes all prior or contemporaneous discussions, representations, contracts (including prior License Agreements and similar prior agreements), and proposals, written or oral, with respect to the subject matters discussed herein. +12.4. Subcontractors. The Qt Company may utilize subcontractors in the performance of Services under this Agreement, provided that The Qt Company remains responsible for the performance of the Services and compliance with this Agreement, as well as ensuring that subcontractors are required to abide by relevant restrictions (e.g., confidentiality) set forth in this Agreement. +12.5. Modifications. No modification of this Agreement shall be effective unless contained in a writing executed by an authorized representative of each Party. No standard terms and conditions or provisions of any Customer purchase order or other ordering form that Customer may use in connection with the acquisition of Services will modify or affect this Agreement, the parties agree that any such terms and conditions are void with no legal effect. +12.6. Affiliate Orders. Customer Affiliates may purchase Services via this Agreement as follows: +(i) any purchases by Customer Affiliates from The Qt Company or its Affiliates will create a contractual relationship directly between the relevant The Qt Company entity and the respective ordering Customer Affiliate; +(ii) the entry into a Purchase Document between The Qt Company and Customer Affiliate creates an agreement between The Qt Company and Customer Affiliate and incorporates all terms and conditions of this Agreement as the governing agreement between The Qt Company and Customer Affiliate ("Accession Agreement"): and +(iii) Customer Affiliate will be deemed "Customer" under the terms of this Agreement and all rights and obligations under such Accession Agreement are vested and borne solely by the ordering Customer Affiliate and the relevant The Qt Company entity as contracting parties under such Accession Agreement. +12.7. Force Majeure. Neither Party shall be liable to the other for any delay or non-performance of its obligations hereunder in the event and to the extent that such delay or non-performance is due to an event of act of God, terrorist attack or other similar unforeseeable catastrophic event that prevents either Party for fulfilling its obligations under this Agreement and which such Party cannot avoid or circumvent ("Force Majeure Event"). If the Force Majeure Event results in a delay or non-performance of a Party for a period of three (3) months or longer, then either Party shall have the right to terminate the relevant Purchase Document and Services thereunder with immediate effect without any liability (except for the obligations of payment arising prior to the Force Majeure Event) towards the other Party. +12.8. Notices. Any notice given by one Party to the other shall be deemed properly given and deemed received if specifically acknowledged by the receiving Party in writing or when successfully delivered to the recipient by hand, fax, or special courier during normal business hours on a business day to the addresses specified for each Party in this Agreement. Each communication and document made or delivered by one Party to the other Party pursuant to this Agreement shall be in the English language. +12.9. Attorney Fees. The prevailing Party in any action to enforce this Agreement shall be entitled to recover its attorney's fees and costs in connection with such action. +12.10. Privacy and Security. The Parties commit to and comply with their respective applicable obligations under the privacy and security terms set forth in the Privacy and Security Appendix and relevant Appendices attached hereto. +12.11. Feedback. Customer agrees that, from time to time, The Qt Company, may request feedback from Customer regarding the Services ("Feedback"). Customer may choose to provide Feedback and agrees that The Qt Company may freely use, copy, disclose, and exploit any Feedback. No Feedback will be considered Customer Confidential Information unless explicitly agreed otherwise between the Parties. +12.12. Export Control. Customer acknowledges that the Services, or portions thereof, may be subject to export control restrictions under the applicable laws of respective countries. Customer shall fully comply with all applicable export license restrictions and requirements, economic sanctions restrictions, as well as with all laws and regulations relating thereto, and shall procure all necessary governmental authorizations, including without limitation, all necessary licenses, approvals, permissions, or consents, where necessary (e.g., for re-exportation of the Redistributables, Applications and/or Devices, each as defined in the relevant Service Terms). +12.13. Severability. If any provision of this Agreement shall be adjudged by any court of competent jurisdiction to be unenforceable or invalid, that provision shall be limited or eliminated to the minimum extent necessary so that this Agreement shall otherwise remain in full force and effect and enforceable. + +13. APPENDICES +13.1. The following appendices form an integral part of this Agreement. In case of a discrepancy between this Agreement and any of its Appendices, this Agreement shall prevail. In case of discrepancies between the Purchase Document(s) and this Agreement or applicable Service Terms, the terms of this Agreement or the applicable Service Terms shall prevail, except in cases where an express deliberate deviation from the terms of this Agreement or applicable Service Terms has been concluded pursuant to Section 2.3 hereof, in which case the Purchase Document shall prevail. +1. Appendix for Qt Development Framework +2. Appendix for Support Terms https://www.qt.io/terms-conditions/support-terms +3. Appendix for Privacy and Security Terms https://www.qt.io/terms-conditions/privacy-and-security + +Appendix for Qt Development Framework +Version 2024-02 + +1. This Appendix for Qt Development Framework is an integral part of the Agreement and specifies the legal terms for the licensing of Licensed Software (as defined below) between The Qt Company and the Customer. Entry into this Appendix governs the use of and supersedes any prior contracts between the Parties (including prior License Agreements and similar prior agreements), with respect to the Licensed Software under this Appendix. + +2. DEFINITIONS +2.1. Capitalized words used in this Appendix shall have the meanings described in the Agreement or as defined below. +2.2. "Add-on Products" shall mean The Qt Company's specific add-on software products which are not licensed as part of The Qt Company's standard Services offerings, but shall be included into the scope of Licensed Software only if so specifically agreed between the Parties. +2.3. "Application" means software products created using the Licensed Software, which include the Redistributables, or part thereof. +2.4. "End Customer" shall mean Customer's customer(s) to whom Customer, directly or indirectly, distributes copies of the Redistributables as integrated or incorporated into Applications or Devices. +2.5. "Data Protection Legislation" shall mean the General Data Protection Regulation (EU 2016/679) (GDPR) and any national implementing laws, regulations and secondary legislation, as may be amended or updated from time to time, as well as any other data protection laws or regulations applicable in the relevant territory. +2.6. "Deployment Platforms" shall mean target operating systems and/or hardware specified in the License Certificate, on which the Redistributables can be distributed pursuant to the terms and conditions of this Appendix. +2.7. "Designated User(s)" shall mean the employee(s) of Customer or Customer's Affiliates acting within the scope of their employment or Customer's Contractors acting within the scope of their services on behalf of Customer. +2.8. "Development License" shall mean the license needed by the Customer for each Designated User to use Licensed Software under the license grant described in Section 5 of this Appendix. Development Licenses are available per respective Licensed Software products; each product having its designated scope and purpose of use. +2.9. "Development Platforms" shall mean the host operating system(s) specified in the License Certificate, on which Licensed Software can be used under the Development License. +2.10. "Devices" shall mean +(i) hardware devices or products that +a. are manufactured and/or distributed by the Customer, its Affiliates, Contractors or End Customer, and +b. incorporate, integrate or link to Applications such that substantial functionality of such unit, when used by an End User, is provided by Application(s) or otherwise depends on the Licensed Software; or +(ii) Applications designed for the hardware devices specified in item (i). +Devices covered by this Appendix shall be specified in the Pricing Appendix or Purchase Document. +2.11. "Distribution License(s)" shall mean a royalty-bearing license required for any kind of sale, trade, exchange, loan, lease, rental or other distribution by or on behalf of Customer to a third party of Redistributables in connection with Devices pursuant to license grant described in Section 5.3 of this Appendix. Distribution Licenses are sold separately for each type of Device respectively and cannot be used for any other type of Devices. +2.12. "Distribution License Packs" shall mean set of prepaid Distribution Licenses for distribution of Redistributables, as defined in The Qt Company's standard price list, quote, Pricing Appendix or in the Purchase Document, as applicable. +2.13. "Evaluation License Term" shall mean a time period specified in the License Certificate for the Customer to use the relevant Licensed Software for evaluation purposes according to Section 5.6 of this Appendix. +2.14. "Intellectual Property Rights" shall mean patents (including utility models), design patents, and designs (whether or not capable of registration), chip topography rights and other like protection, copyrights, trademarks, service marks, trade names, logos or other words or symbols and any other form of statutory protection of any kind and applications for any of the foregoing as well as any trade secrets. +2.15. "License Certificate" shall mean a certificate generated by The Qt Company for each Designated User respectively upon their download of the Licensed Software, which will be available under the respective Designated User's Qt Account at account.qt.io. License Certificates will specify relevant information pertaining to the Licensed Software purchased by Customer and the license to the Licensed Software. +2.16. "License Fee" shall mean the fee charged to Customer for rights granted under this Appendix. +2.17. "Licensed Software" shall mean the specified product(s) of Qt Software which Customer has purchased and which is provided to Customer under the terms of this Appendix (including its Exhibits). Licensed Software shall include corresponding online or electronic documentation, associated media and printed materials, including source code (where applicable), example programs and the documentation. Licensed Software does not include Third Party Software (as defined in Section 6) or Qt Community Edition. The Qt Company may, in the course of its development activities, at its free and absolute discretion and without any obligation to send or publish any notifications to Customer or in general, make changes, additions or deletions in the components and functionalities of the Licensed Software, provided that no such changes, additions or deletions will affect the already released version of the Licensed Software, but only upcoming version(s). +2.18. "License Term" shall mean the agreed validity period of the Development License during which the relevant Licensed Software product can be used pursuant to this Appendix. The agreed License Term, as ordered and paid for by Customer, shall be memorialized in the applicable License Certificate. +2.19. "Customer's Records" shall mean books and records that contain information bearing on Customer's compliance with the Agreement, Customer's use of Qt Community Edition and/or the payments due to The Qt Company under the Agreement, including, but not limited to user information, assembly logs, sales records and distribution records. +2.20. "Modified Software" shall have the meaning as set forth below in Section 4. +2.21. "Qt Software" shall mean the development and design software of The Qt Company, which The Qt Company makes available under commercial and/or open source licenses as either the "Licensed Software" or the "Qt Community Edition". +2.22. "Permitted Software" shall mean third party products that are generally available to the public, which may include parts of Qt Community Edition or be developed using Qt Community Edition. +2.23. "Pre-Release Code" shall have the meaning as set forth in Section 7. +2.24. "Prohibited Combination" shall mean any effort to use, combine, incorporate, link or integrate Licensed Software with any software created with or incorporating Qt Community Edition, or use Licensed Software for creation of any such software. +2.25. "Qt Community Edition" shall mean the open source version of Qt Software available under the terms of the GNU Lesser General Public License, version 2.1 or later ("LGPL") or the GNU General Public License, version 2.0 or later ("GPL"). For clarity, Qt Community Edition shall not be provided, governed or used under this Appendix. +2.26. "Redistributables" shall mean the portions of Licensed Software as set forth in Exhibit 1 hereto that may be distributed pursuant to this Appendix in object code form only, including any relevant documentation. Where relevant, any reference to Licensed Software in this Appendix includes and refers to Redistributables. +2.27. "Renewal Term" shall mean an extension of the previous License Term as agreed between the Parties. +2.28. "Submitted Modified Software" shall have the meaning as set forth in Section 4.2 of this Appendix. +2.29. "Third-Party Software" shall have the meaning set forth in Section 6 of this Appendix. +2.30. "Updates" shall mean a release or version of the Licensed Software containing bug fixes, error corrections and other changes that are generally made available to users of the Licensed Software that have contracted for Support. Updates are generally depicted as a change to the digits following the decimal in the Licensed Software version number. The Qt Company shall make Updates available to Customer under the Support. Updates shall be considered as part of the Licensed Software hereunder. +2.31. "Upgrades" shall mean a release or version of the Licensed Software containing enhancements and new features and are generally depicted as a change to the first digit of the Licensed Software version number. In the event that Upgrades are provided to Customer under this Appendix, they shall be considered as part of the Licensed Software hereunder. + +3. OWNERSHIP +3.1. Ownership of The Qt Company +3.1.1. The Licensed Software is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties. The Licensed Software is licensed, not sold. +3.1.2. All of The Qt Company's Intellectual Property Rights are and shall remain the exclusive property of The Qt Company or its respective licensors . No rights to The Qt Company's Intellectual Property Rights are assigned or granted to Customer under this Appendix, except when and to the extent expressly specified herein. +3.2. Ownership of Customer +3.2.1. All of Customer's Intellectual Property Rights are and shall remain the exclusive property of Customer or its licensors respectively. +3.2.2. Except to the extent set forth in this Appendix, all Intellectual Property Rights to the Modified Software, Applications and Devices (except to Redistributables included therein) shall remain with Customer. + +4. MODIFIED SOFTWARE +4.1. Customer may create bug-fixes, error corrections, patches or modifications to the Licensed Software ("Modified Software"). To the extent that Customer's Modified Software breaks source or binary compatibility or other functionality with the Licensed Software, Customer acknowledges that The Qt Company's ability to provide Support may be prevented or limited and Customer's ability to make use of Updates may be restricted. +4.2. Customer may, at its sole and absolute discretion, choose to submit Modified Software to The Qt Company ("Submitted Modified Software") in connection with Customer's Support request, service request or otherwise. In the event Customer does so, then, Customer hereby grants The Qt Company a sublicensable, assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and fully paid-up license, under all of Customer's Intellectual Property Rights, to reproduce, adapt, translate, modify, and prepare derivative works of, publicly display, publicly perform, sublicense, make available and distribute such Submitted Modified Software as The Qt Company sees fit at its free and absolute discretion. + +5. LICENSES GRANTED +5.1. Development with Licensed Software +5.1.1. Subject to the terms of the Agreement, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable license, valid for each License Term, to use, modify and copy the Licensed Software by Designated Users on the Development Platforms for the sole purposes of designing, developing, demonstrating and testing Application(s) and/or Devices, and to provide support and other services related to such Applications and Devices to End Customers. Each Application and/or Device can only include, incorporate or integrate contributions by such Designated Users who are duly licensed for the applicable Development Platform(s) and Deployment Platform(s) (i.e have a valid license for the appropriate Licensed Software product and only use one type of Qt Development License per Customer Application and/or Device(s)). +5.1.2. Customer may install copies of the Licensed Software on five (5) computers per Designated User, provided that only Designated Users who have a valid Development License may use the Licensed Software. +5.1.3. Customer may designate another Designated User to replace a then-current Designated User by notifying The Qt Company in writing, where such replacement is due to termination of employment, long-term absence or other permanent reason affecting Designated User's need for Licensed Software. +5.1.4. Upon expiry of the initially agreed License Term, the respective License Term shall be automatically extended by one or more Renewal Term(s), unless and until either Party notifies the other Party in writing, that it does not wish to continue the License Term, such notification to be provided to the other Party no less than thirty (30) days before expiry of the respective License Term. The Qt Company shall, in good time before the due date for the above notification, remind the Customer on the coming Renewal Term. Unless otherwise agreed between the Parties, Renewal Term shall be equal to the length of the previous License Term, but no longer than thirty-six (36) months. +5.1.5. Any such Renewal Term shall be subject to License Fees agreed between the Parties or, if no advance agreement exists, subject to The Qt Company's standard list pricing applicable at the commencement date of any such Renewal Term. +5.2. Distribution of Applications +5.2.1. Subject to the terms of the Agreement, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable, perpetual, royalty-free and revocable (only for Customer’s material breach of agreement) right and license to: +(i) distribute, by itself or through its Contractors, Redistributables as installed, incorporated or integrated into Applications for execution on the Deployment Platforms; and +(ii) grant perpetual and irrevocable sublicenses to Redistributables, as distributed hereunder, for End Customers solely to the extent necessary in order for the End Customers to use the Applications for their respective intended purposes. +5.2.2. Right to distribute the Redistributables as part of an Application as provided herein is not royalty-bearing but is conditional upon the Application having been created, updated and maintained under a valid and duly paid Development License. +5.3. Distribution of Devices +5.3.1. Subject to the terms of the Agreement, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable, perpetual, revocable (only for Customer’s material breach of agreement), royalty-bearing right and license to: +(i) distribute, by itself or through one or more tiers of Contractors, Redistributables as installed, incorporated or integrated, or intended to be installed, incorporated or integrated into Devices for execution on the Deployment Platforms; and +(ii) grant perpetual and irrevocable sublicenses to Redistributables, as distributed hereunder, for End Customers solely to the extent necessary in order for the End Customers to use the Devices for their respective intended purposes. +5.3.2. Right to distribute the Devices as provided herein is conditional upon (i) the Devices having been created, updated and maintained under a valid and duly paid Development License, and (ii) Customer having acquired corresponding Distribution Licenses at the time of distribution of any Devices to End Customers. +5.4. Further Requirements +5.4.1. The licenses granted in this Section 5 by The Qt Company to Customer are conditional and subject to Customer's compliance with the following terms: +(i) Customer acknowledges that The Qt Company has separate products for the purpose of Applications and Devices respectively, where development and distribution of Devices is only allowed using the correct designated product. Customer shall ensure and bear the burden of proof that Customer is using a correct product entitling Customer to development and distribution of Devices; +(ii) Customer shall not remove or alter any copyright, trademark or other proprietary rights notice(s) contained in any portion of the Licensed Software; +(iii) Applications must add primary and substantial functionality to Licensed Software so as not to compete with the Licensed Software; +(iv) Applications may not pass on functionality which in any way makes it possible for others to create software with Licensed Software; provided however that Customer may use Licensed Software’s scripting and QML ("Qt Quick") functionality solely in order to enable scripting, themes and styles that augment the functionality and appearance of the Application(s) without adding primary and substantial functionality to the Application(s); +(v) Customer shall not use Licensed Software in any manner or for any purpose that infringes, misappropriates or otherwise violates any Intellectual Property Right or right of any third party, or that violates any applicable law; +(vi) Customer shall not use The Qt Company's or any of its suppliers' names, logos, or trademarks to market Applications, except that Customer may use “Built with Qt” logo to indicate that an Application or Device was developed using Licensed Software; +(vii) Customer shall not distribute, sublicense or disclose source code of Licensed Software to any third party (provided however that Customer may appoint employee(s) of Contractors and Affiliates as Designated Users to use Licensed Software pursuant to this Appendix). +(viii) Customer shall not grant the End Customers a right to: (a) make copies of the Redistributables except when and to the extent required to use the Applications and/or Devices for their intended purpose; (b) modify the Redistributables or create derivative works thereof; (c) decompile, disassemble or otherwise reverse engineer Redistributables; or (d) redistribute any copy or portion of the Redistributables to any third party, except as part of the onward sale of the Application or Device on which the Redistributables are installed; +(ix) Customer shall not, and shall cause that its Affiliates or Contractors shall not, use Licensed Software in any Prohibited Combination, unless Customer has received specific advance written permission from The Qt Company to do so. Absent such written permission, any and all distribution by Customer during the term of the Agreement of a hardware device or product: a) which incorporates or integrates any part of Licensed Software or Qt Community Edition; or b) where substantial functionality is provided by software built with Licensed Software or Qt Community Edition or otherwise depends on Licensed Software or Qt Community Edition, shall be considered to be Device distribution under this Appendix and shall be dependent on Customer’s compliance thereof (including but not limited to the obligation to pay applicable License Fees for such distribution). Notwithstanding the foregoing, Customer is entitled to use and combine Licensed Software with Permitted Software; +(x) Customer shall cause all of its Affiliates, Contractors and End Customer entitled to make use of the licenses granted under this Appendix, to be contractually bound to comply with the relevant terms hereof and not to use the Licensed Software beyond the terms hereof nor for any purposes other than operating within the scope of their services for Customer. Customer shall be responsible for any and all actions and omissions of its Affiliates, Contractors, and End Customers relating to the Licensed Software and use thereof (including but not limited to payment of all applicable License Fees); +(xi) Except when and to the extent explicitly provided in this Section 5, Customer shall not transfer, publish, disclose, display or otherwise make available the Licensed Software; and +(xii) Customer shall not attempt or enlist a third party to conduct or attempt to conduct any of the above. +5.4.2. The above terms shall not be applicable if and solely to the extent they conflict with any mandatory provisions of applicable laws. +5.4.3. Any use of Licensed Software beyond the provisions of this Appendix is strictly prohibited and requires, at a minimum an additional license from The Qt Company (e.g. certain additional rights granted under software development kit “SDK” agreement with regard to limitations of Section 5.4.1 iv, vii or viii). +5.5. Evaluation License +5.5.1. Subject to the terms of this Appendix, The Qt Company grants to Customer a worldwide, non-exclusive, non-transferable license, valid for the Evaluation License Term to use the relevant Licensed Software product solely for Customer’s internal use to evaluate and determine whether the Licensed Software meets Customer's business requirements, specifically excluding any commercial use of the Licensed Software or any derived work thereof. +5.5.2. Upon the expiry of the Evaluation License Term, Customer must either discontinue use of the relevant Licensed Software or acquire a commercial Development License specified herein. + +6. THIRD-PARTY SOFTWARE. The Licensed Software may provide links or access to third party libraries or code (collectively "Third-Party Software") to implement various functions. Third-Party Software does not, however, comprise part of the Licensed Software, but is provided to Customer complimentary and use thereof is discretionary for Customer. Third-Party Software will be listed in the ".../src/3rdparty" source tree delivered with the Licensed Software or documented in the Licensed Software, as such may be amended from time to time. Customer acknowledges that use or distribution of Third-Party Software is in all respects subject to applicable license terms of applicable third-party right holders. + +7. PRE-RELEASE CODE +7.1. The Licensed Software may contain pre-release code and functionality, or sample code marked or otherwise stated with appropriate designation such as "Technology Preview", "Alpha", "Beta", "Experimental", "Sample", "Example" etc. ("Pre-Release Code"). +7.2. Such Pre-Release Code may be provided complimentary for Customer, in order to provide experimental support or information for new platforms or preliminary versions of one or more new functionalities, or for other similar reasons. Pre-Release Code may not be at the level of performance and compatibility of a final, generally available, product offering. Pre-Release Code may not operate correctly, may contain errors and may be substantially modified by The Qt Company prior to a commercial product release, if any. The Qt Company is under no obligation to make Pre-Release Code commercially available, or provide any Support or Updates relating thereto. To the maximum extent permitted by law, the Qt Company assumes no liability whatsoever regarding any Pre-Release Code and any use thereof is exclusively at Customer's own risk and expense. +7.3. Unless Licensed Software specifies different license terms for the respective Pre-Release Code, Customer is entitled to use such pre-release code pursuant to Section 5 of this Appendix, just like other Licensed Software. + +8. SUPPORT. Support is provided according to agreed support level and subject to applicable requirements and restrictions, as specified in the Appendix for Support Terms. + +9. FEES AND ORDERING: DISTRIBUTION LICENSES +9.1. Distribution License Packs +9.1.1. Unless otherwise agreed in writing, Distribution Licenses shall be purchased by way of Distribution License Packs. +9.1.2. Upon due payment of the ordered Distribution License Pack(s), Customer will have an account of Distribution Licenses available for distributing the Redistributables in accordance with this Agreement. +9.2. Each time Customer distributes a copy of Redistributables, one Distribution License is used and Customer's account of available Distribution Licenses is decreased accordingly. +9.3. Customer may distribute copies of the Redistributables so long as Customer has Distribution Licenses remaining on its account. + +10. RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS +10.1. Customer's Record-keeping +10.1.1. Customer shall at all times during the term of the Agreement or validity of any of the licenses hereunder, whichever is later, and for a period of two (2) years thereafter, maintain Customer's Records in an accurate and up-to-date form. Customer's Records shall be adequate to reasonably enable The Qt Company to determine Customer's compliance with the provisions of the Agreement. The records shall conform to general good accounting practices. +10.1.2. Customer shall, within thirty (30) days from receiving The Qt Company's request to that effect, deliver to The Qt Company a report based on Customer's Records, such report to contain information, in sufficient detail, on: (i) number and identity of users working with Licensed Software or Qt Community Edition, (ii) copies of Redistributables distributed by Customer during the most recent calendar quarter and/or any other term specified by The Qt Company, and (iii) any other information pertaining to Customer's compliance with the terms of the Agreement (e.g. information on products and/or projects relating to use of Distribution Licenses), as The Qt Company may reasonably require from time to time. +10.2. The Qt Company's Audit Rights +10.2.1. The Qt Company or an independent auditor acting on behalf of The Qt Company may, upon at least thirty (30) days' prior written notice and at The Qt Company expense, audit Customer with respect to Customer's use of the Licensed Software, but not more frequently than once during each six (6) month period. Such audit may be conducted by mail, electronic means or through an in-person visit to Customer's place of business. Any possible in-person audit shall be conducted during regular business hours at Customer's facilities, shall not unreasonably interfere with Customer's business activities and shall be limited in scope to verify Customer's compliance with the terms of the Agreement. The Qt Company or its independent auditor shall be entitled to inspect Customer's Records and conduct necessary interviews of Customer's relevant employees and Contractors. All Customer's Records and use thereof shall be subject to the obligation of confidentiality under the Agreement. +10.2.2. If an audit reveals that Customer is using the Licensed Software beyond scope of the licenses Customer has paid for, Customer shall pay to The Qt Company any amounts owed for such unauthorized use within thirty (30) days from receipt of the corresponding invoice from The Qt Company. +10.2.3. In addition, in the event the audit reveals a material violation of the terms of the Agreement (without limitation, either (i) underpayment of more than 10% of License Fees or 10,000 euros (whichever is more) or (ii) distribution of products, which include or result from Prohibited Combination, shall be deemed a material violation for purposes of this section), then Customer shall pay The Qt Company's reasonable cost of conducting such audit. + +11. TERMINATION +11.1. Termination of Licenses +11.1.1. The Qt Company may terminate Customer's rights to any and all Licensed Software (including access to Support), if Customer: +(i) commits a material breach of the Agreement (including this Appendix) and has not remedied the breach within a reasonable period of time (which shall be no less than 30 days) of The Qt Company's written notice specifying the breach, or +(ii) becomes bankrupt, insolvent or goes into liquidation or debt restructuring. +11.2. Suspension of rights: Instead of termination, The Qt Company reserves the right to suspend or withhold grants of any and all rights to the Licensed Software (including Support), should Customer fail to make payment in timely fashion or otherwise violate or is reasonably suspected of violating its obligations under the Agreement and/or this Appendix, and where such violation or breach is not cured within ten (10) business days following The Qt Company's written notice thereof. +11.3. Parties Rights and Duties upon Termination +11.3.1. Upon expiry or termination of the Development Licenses, Customer shall cease and shall cause all Designated Users (including those of its Affiliates' and Contractors') to cease using the relevant Licensed Software. +11.3.2. Upon such expiry or termination of Development Licenses, Customer shall destroy or return to The Qt Company all copies of the respective Licensed Software and all related materials and will certify the same by Customer's duly authorized officer to The Qt Company upon its request, provided however that Customer may retain and utilize such copies of the Licensed Software to the extent required to provide Customer's continued support to End Customers, for archiving purposes or as is required under applicable law. +11.3.3. Distribution Licenses are perpetual and, therefore, Customer's distribution rights hereunder shall only terminate upon The Qt Company's termination of Distribution Licenses due to Customer's material breach as set forth in Section 11.1.1(i) of this Appendix. In case of such termination by The Qt Company due to Customer's material breach, Customer must cease any distribution of Applications and Devices at the effective date of termination. +11.3.4. Expiry or termination of any of Customer's licenses hereunder for any reason whatsoever shall not: +(i) relieve Customer of its obligation to pay any License Fees accrued or payable to The Qt Company prior to the effective date of termination, and Customer pay to The Qt Company all such fees within 30 days from the effective date of termination of the licenses; +(ii) relieve Customer of its obligation to ensure that Applications and Devices (including those already distributed) remain in compliance with the terms of the Agreement; nor +(iii) affect any rights of End Customer to continue use of Applications and Devices (and therein incorporated Redistributables). +11.4. Extension of Rights under Special Circumstances. In the event that, during the applicable License Term, The Qt Company is declared bankrupt under a final, non-cancellable decision by relevant court of law, and the Agreement is not, at the date of expiry of the Development License(s), assigned to a party who has assumed The Qt Company's position as a legitimate licensor of Licensed Software under the Agreement, then all valid Development Licenses possessed by Customer at such date of expiry, and which Customer has not notified for expiry, shall be extended to be valid in perpetuity under the terms of the Agreement. Any such extension shall not apply to The Qt Company's Support obligations. + +EXHIBIT 1, Licensed Software +At the time of conclusion of this Appendix, the latest available version of Licensed Software includes the software libraries and tools set forth in Exhibit 1 (as provided below), depending on which product(s) Customer has purchased under the relevant Purchase Document. +The modules and tools are specific to each product version respectively and may vary from version to version. Modules and tools included in the latest publicly available version of the respective product at any given time are listed in Exhibit 1 of https://www.qt.io/terms-conditions/qt-dev-framework/exhibit-1. If a new version of Licensed Software does not include a module or tool present in an older version which Customer is entitled to use under a valid license from The Qt Company, then Customer will continue to have such right during the validity of Customer's license to relevant Licensed Software. In the event a new version of the Licensed Software adds modules or tools to any previous version(s), Customer's rights will extend to cover also such additional modules and tools. + +EXHIBIT 2 - Small Business Terms +1. This Exhibit applies to entities that qualify as a Qualified Small Business (defined below) and provides additional terms and conditions applicable to small business pricing and licensing. In the event that Customer is a Qualified Small Business and there is any conflict between the terms of this Exhibit and any other terms of the Agreement, the terms in this Exhibit shall take precedence. + +2. APPLICABILITY FOR SMALL BUSINESS LICENSES. Any small business discounts applied require that Customer (including any Customer Affiliates or group entities) has an annual revenue (including annual capital funding) below 1 Million EUR, or the equivalent thereof, as approved by The Qt Company (each, a "Qualified Small Business"). The annual revenue, including funding, must be evidenced upon request by business records and approved by The Qt Company in its reasonable discretion. + +3. SUPPORT. Support is limited to: (i) Install Support; and (ii) for any other Standard Support issue, five (5) support tickets annually. + +4. LIMITATION ON NUMBER OF SMALL BUSINESS DEVELOPER LICENSES. Qualified Small Business discounts and purchasing structure may be applied to a maximum of three discounted developer licenses (either ADE or DCP) per Qualified Small Business. Any additional licenses purchased will be at The Qt Company list price in effect at the time. + +5. LIMITATION FOR NUMBER OF INSTALLATIONS. Customer may install copies of the Licensed Software on two (2) computers per Designated User, provided that only the Designated Users who have a valid Development License may use the Licensed Software. + +6. CONDITIONAL WAIVER OF DISTRIBUTION LICENSES. For Qualified Small Businesses, the Agreement requirements to purchase Distribution Licenses for Devices shall apply only when Customer ceases to be a Qualified Small Business (e.g., when annual revenue threshholds are bypassed). + +7. ADDITIONAL TERMS FOR RENEWALS. The initial subscription purchase term for Qualified Small Business Licenses is twelve (12) months. Upon expiration of the initial twelve (12) month term and unless terminated in accordance with the Agreement, the Licenses will automatically renew for additional twelve (12) month terms with applicable Qualified Small Business discounts. If Customer ceases to be a Qualified Small Business, renewal pricing shall be at The Qt Company list price in effect at the time of renewal, or as agreed in writing between the parties. + +8. ADDITIONAL AUDIT RIGHTS. In addition to the audit rights set forth in the Agreement, The Qt Company reserves the right to audit Customer financial records in order to determine whether Customer is a Qualified Small Business. diff --git a/.cmake.conf b/.cmake.conf new file mode 100644 index 0000000..fc775f2 --- /dev/null +++ b/.cmake.conf @@ -0,0 +1,7 @@ +set(QT_REPO_MODULE_VERSION "6.7.2") +set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1") + +set(QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_LEAN_HEADERS=1") +list(APPEND QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_AS_CONST=1") +list(APPEND QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_FOREACH=1") +list(APPEND QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_CONTEXTLESS_CONNECT=1") diff --git a/.tag b/.tag new file mode 100644 index 0000000..fcc5b04 --- /dev/null +++ b/.tag @@ -0,0 +1 @@ +e7b33b314ff6a2ef2f9d808a0a69945dc697152f diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..ba12ac1 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,25 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) + +include(.cmake.conf) +project(QtPositioning + VERSION "${QT_REPO_MODULE_VERSION}" + DESCRIPTION "Qt Positioning Libraries" + HOMEPAGE_URL "https://qt.io/" + LANGUAGES CXX C +) + +# Make sure we use the fixed BASE argument of qt_add_resource. +set(QT_USE_FIXED_QT_ADD_RESOURCE_BASE TRUE) + +find_package(Qt6 ${PROJECT_VERSION} CONFIG REQUIRED COMPONENTS BuildInternals Core) +find_package(Qt6 ${PROJECT_VERSION} QUIET CONFIG OPTIONAL_COMPONENTS Quick Qml Gui Widgets Network Test DBus SerialPort Svg QuickTest) +qt_internal_project_setup() + +if(WASM) + message(NOTICE "Skipping the build as the condition \"NOT WASM\" is not met.") + return() +endif() +qt_build_repo() diff --git a/LICENSES/Apache-2.0.txt b/LICENSES/Apache-2.0.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSES/Apache-2.0.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/LICENSES/BSD-3-Clause.txt b/LICENSES/BSD-3-Clause.txt new file mode 100644 index 0000000..b91bbd8 --- /dev/null +++ b/LICENSES/BSD-3-Clause.txt @@ -0,0 +1,9 @@ +Copyright (c) . + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/LICENSES/CC0-1.0.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/LICENSES/GFDL-1.3-no-invariants-only.txt b/LICENSES/GFDL-1.3-no-invariants-only.txt new file mode 100644 index 0000000..857214d --- /dev/null +++ b/LICENSES/GFDL-1.3-no-invariants-only.txt @@ -0,0 +1,451 @@ + + GNU Free Documentation License + Version 1.3, 3 November 2008 + + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +0. PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document "free" in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of "copyleft", which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + + +1. APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The "Document", below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as "you". You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A "Modified Version" of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A "Secondary Section" is a named appendix or a front-matter section of +the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The "Invariant Sections" are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The "Cover Texts" are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A "Transparent" copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not "Transparent" is called "Opaque". + +Examples of suitable formats for Transparent copies include plain +ASCII without markup, Texinfo input format, LaTeX input format, SGML +or XML using a publicly available DTD, and standard-conforming simple +HTML, PostScript or PDF designed for human modification. Examples of +transparent image formats include PNG, XCF and JPG. Opaque formats +include proprietary formats that can be read and edited only by +proprietary word processors, SGML or XML for which the DTD and/or +processing tools are not generally available, and the +machine-generated HTML, PostScript or PDF produced by some word +processors for output purposes only. + +The "Title Page" means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, "Title Page" means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +The "publisher" means any person or entity that distributes copies of +the Document to the public. + +A section "Entitled XYZ" means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as "Acknowledgements", +"Dedications", "Endorsements", or "History".) To "Preserve the Title" +of such a section when you modify the Document means that it remains a +section "Entitled XYZ" according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +2. VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no +other conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + + +3. COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to +give them a chance to provide you with an updated version of the +Document. + + +4. MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +A. Use in the Title Page (and on the covers, if any) a title distinct + from that of the Document, and from those of previous versions + (which should, if there were any, be listed in the History section + of the Document). You may use the same title as a previous version + if the original publisher of that version gives permission. +B. List on the Title Page, as authors, one or more persons or entities + responsible for authorship of the modifications in the Modified + Version, together with at least five of the principal authors of the + Document (all of its principal authors, if it has fewer than five), + unless they release you from this requirement. +C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. +D. Preserve all the copyright notices of the Document. +E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. +F. Include, immediately after the copyright notices, a license notice + giving the public permission to use the Modified Version under the + terms of this License, in the form shown in the Addendum below. +G. Preserve in that license notice the full lists of Invariant Sections + and required Cover Texts given in the Document's license notice. +H. Include an unaltered copy of this License. +I. Preserve the section Entitled "History", Preserve its Title, and add + to it an item stating at least the title, year, new authors, and + publisher of the Modified Version as given on the Title Page. If + there is no section Entitled "History" in the Document, create one + stating the title, year, authors, and publisher of the Document as + given on its Title Page, then add an item describing the Modified + Version as stated in the previous sentence. +J. Preserve the network location, if any, given in the Document for + public access to a Transparent copy of the Document, and likewise + the network locations given in the Document for previous versions + it was based on. These may be placed in the "History" section. + You may omit a network location for a work that was published at + least four years before the Document itself, or if the original + publisher of the version it refers to gives permission. +K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section all + the substance and tone of each of the contributor acknowledgements + and/or dedications given therein. +L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section titles. +M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. +N. Do not retitle any existing section to be Entitled "Endorsements" + or to conflict in title with any Invariant Section. +O. Preserve any Warranty Disclaimers. + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled "Endorsements", provided it contains +nothing but endorsements of your Modified Version by various +parties--for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + + +5. COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled "History" +in the various original documents, forming one section Entitled +"History"; likewise combine any sections Entitled "Acknowledgements", +and any sections Entitled "Dedications". You must delete all sections +Entitled "Endorsements". + + +6. COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other +documents released under this License, and replace the individual +copies of this License in the various documents with a single copy +that is included in the collection, provided that you follow the rules +of this License for verbatim copying of each of the documents in all +other respects. + +You may extract a single document from such a collection, and +distribute it individually under this License, provided you insert a +copy of this License into the extracted document, and follow this +License in all other respects regarding verbatim copying of that +document. + + +7. AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an "aggregate" if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + + +8. TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled "Acknowledgements", +"Dedications", or "History", the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + + +9. TERMINATION + +You may not copy, modify, sublicense, or distribute the Document +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense, or distribute it is void, and +will automatically terminate your rights under this License. + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, receipt of a copy of some or all of the same material does +not give you any rights to use it. + + +10. FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions of the +GNU Free Documentation License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. See +https://www.gnu.org/licenses/. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. If the Document +specifies that a proxy can decide which future versions of this +License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the +Document. + +11. RELICENSING + +"Massive Multiauthor Collaboration Site" (or "MMC Site") means any +World Wide Web server that publishes copyrightable works and also +provides prominent facilities for anybody to edit those works. A +public wiki that anybody can edit is an example of such a server. A +"Massive Multiauthor Collaboration" (or "MMC") contained in the site +means any set of copyrightable works thus published on the MMC site. + +"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 +license published by Creative Commons Corporation, a not-for-profit +corporation with a principal place of business in San Francisco, +California, as well as future copyleft versions of that license +published by that same organization. + +"Incorporate" means to publish or republish a Document, in whole or in +part, as part of another Document. + +An MMC is "eligible for relicensing" if it is licensed under this +License, and if all works that were first published under this License +somewhere other than this MMC, and subsequently incorporated in whole or +in part into the MMC, (1) had no cover texts or invariant sections, and +(2) were thus incorporated prior to November 1, 2008. + +The operator of an MMC Site may republish an MMC contained in the site +under CC-BY-SA on the same site at any time before August 1, 2009, +provided the MMC is eligible for relicensing. + + +ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + + Copyright (c) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled "GNU + Free Documentation License". + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with the + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. diff --git a/LICENSES/GPL-2.0-only.txt b/LICENSES/GPL-2.0-only.txt new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSES/GPL-2.0-only.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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) any later version. + + 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. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/LICENSES/GPL-3.0-only.txt b/LICENSES/GPL-3.0-only.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSES/GPL-3.0-only.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 of the License, or + (at your option) any later version. + + 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/LICENSES/LGPL-3.0-only.txt b/LICENSES/LGPL-3.0-only.txt new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/LICENSES/LGPL-3.0-only.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/LICENSES/LicenseRef-Qt-Commercial.txt b/LICENSES/LicenseRef-Qt-Commercial.txt new file mode 100644 index 0000000..825b1f3 --- /dev/null +++ b/LICENSES/LicenseRef-Qt-Commercial.txt @@ -0,0 +1,8 @@ +Licensees holding valid commercial Qt licenses may use this software in +accordance with the the terms contained in a written agreement between +you and The Qt Company. Alternatively, the terms and conditions that were +accepted by the licensee when buying and/or downloading the +software do apply. + +For the latest licensing terms and conditions, see https://www.qt.io/terms-conditions. +For further information use the contact form at https://www.qt.io/contact-us. diff --git a/LICENSES/OFL-1.1.txt b/LICENSES/OFL-1.1.txt new file mode 100644 index 0000000..c928ff5 --- /dev/null +++ b/LICENSES/OFL-1.1.txt @@ -0,0 +1,92 @@ +Copyright (c) , (), +with Reserved Font Name . + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +SIL OPEN FONT LICENSE +Version 1.1 - 26 February 2007 + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/LICENSES/Qt-GPL-exception-1.0.txt b/LICENSES/Qt-GPL-exception-1.0.txt new file mode 100644 index 0000000..d0322bf --- /dev/null +++ b/LICENSES/Qt-GPL-exception-1.0.txt @@ -0,0 +1,22 @@ +The Qt Company GPL Exception 1.0 + +Exception 1: + +As a special exception you may create a larger work which contains the +output of this application and distribute that work under terms of your +choice, so long as the work is not otherwise derived from or based on +this application and so long as the work does not in itself generate +output that contains the output from this application in its original +or modified form. + +Exception 2: + +As a special exception, you have permission to combine this application +with Plugins licensed under the terms of your choice, to produce an +executable, and to copy and distribute the resulting executable under +the terms of your choice. However, the executable must be accompanied +by a prominent notice offering all users of the executable the entire +source code to this application, excluding the source code of the +independent modules, but including any changes you have made to this +application, under the terms of this license. + diff --git a/cmake/FindGconf.cmake b/cmake/FindGconf.cmake new file mode 100644 index 0000000..c117e99 --- /dev/null +++ b/cmake/FindGconf.cmake @@ -0,0 +1,17 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +find_package(PkgConfig QUIET) +if (PkgConfig_FOUND) + pkg_check_modules(Gconf gconf-2.0 IMPORTED_TARGET) + + if (TARGET PkgConfig::Gconf) + mark_as_advanced(Gconf_LIBRARIES Gconf_INCLUDE_DIRS) + if (NOT TARGET Gconf::Gconf) + add_library(Gconf::Gconf INTERFACE IMPORTED) + target_link_libraries(Gconf::Gconf INTERFACE PkgConfig::Gconf) + endif() + else() + set(Gconf_FOUND 0) + endif() +endif() diff --git a/cmake/FindGypsy.cmake b/cmake/FindGypsy.cmake new file mode 100644 index 0000000..a6458b9 --- /dev/null +++ b/cmake/FindGypsy.cmake @@ -0,0 +1,17 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +find_package(PkgConfig QUIET) +if (PkgConfig_FOUND) + pkg_check_modules(Gypsy gypsy IMPORTED_TARGET) + + if (TARGET PkgConfig::Gypsy) + mark_as_advanced(Gypsy_LIBRARIES Gypsy_INCLUDE_DIRS) + if (NOT TARGET Gypsy::Gypsy) + add_library(Gypsy::Gypsy INTERFACE IMPORTED) + target_link_libraries(Gypsy::Gypsy INTERFACE PkgConfig::Gypsy) + endif() + else() + set(Gypsy_FOUND 0) + endif() +endif() diff --git a/coin/axivion/ci_config_linux.json b/coin/axivion/ci_config_linux.json new file mode 100644 index 0000000..f806cff --- /dev/null +++ b/coin/axivion/ci_config_linux.json @@ -0,0 +1,44 @@ +{ + "Project": { + "BuildSystemIntegration": { + "child_order": [ + "GCCSetup", + "CMake", + "LinkLibraries" + ] + }, + "CMake": { + "_active": true, + "_copy_from": "CMakeIntegration", + "build_environment": {}, + "build_options": "-j4", + "generate_options": "--fresh", + "generator": "Ninja" + }, + "GCCSetup": { + "_active": true, + "_copy_from": "Command", + "build_command": "gccsetup --cc gcc --cxx g++ --config ../../../axivion/" + }, + "LinkLibraries": { + "_active": true, + "_copy_from": "AxivionLinker", + "input_files": [ + "build/lib/lib*.so*.ir", + "build/qml/*/lib*.so*.ir" + ], + "ir": "build/$(env:TESTED_MODULE_COIN).ir", + "plugin_files": [ + "build/plugins/*/lib*.so*.ir" + ] + } + }, + "_Format": "1.0", + "_Version": "7.6.2", + "_VersionNum": [ + 7, + 6, + 2, + 12725 + ] +} diff --git a/coin/module_config.yaml b/coin/module_config.yaml new file mode 100644 index 0000000..16d158c --- /dev/null +++ b/coin/module_config.yaml @@ -0,0 +1,12 @@ +version: 2 +accept_configuration: + condition: property + property: features + not_contains_value: Disable + +instructions: + Build: + - !include "{{qt/qtbase}}/coin_module_build_template_v2.yaml" + + Test: + - !include "{{qt/qtbase}}/coin_module_test_template_v3.yaml" diff --git a/conanfile.py b/conanfile.py new file mode 100644 index 0000000..5fd70d2 --- /dev/null +++ b/conanfile.py @@ -0,0 +1,53 @@ +# Copyright (C) 2021 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +from conans import ConanFile +import re +from pathlib import Path +from typing import List, Dict, Any + + +def _parse_qt_version_by_key(key: str) -> str: + with open(Path(__file__).parent.resolve() / ".cmake.conf") as f: + m = re.search(fr'{key} .*"(.*)"', f.read()) + return m.group(1) if m else "" + + +def _get_qt_minor_version() -> str: + return ".".join(_parse_qt_version_by_key("QT_REPO_MODULE_VERSION").split(".")[:2]) + + +class QtPositioning(ConanFile): + name = "qtpositioning" + license = "LGPL-3.0, GPL-2.0+, Commercial Qt License Agreement" + author = "The Qt Company " + url = "https://code.qt.io/cgit/qt/qtpositioning.git" + description = "Qt Positioning support." + topics = "qt", "qt6", "positioning" + settings = "os", "compiler", "arch", "build_type" + # for referencing the version number and prerelease tag and dependencies info + exports = ".cmake.conf", "dependencies.yaml" + exports_sources = "*", "!conan*.*" + python_requires = f"qt-conan-common/{_get_qt_minor_version()}@qt/everywhere" + python_requires_extend = "qt-conan-common.QtLeafModule" + + def get_qt_leaf_module_options(self) -> Dict[str, Any]: + """Implements abstractmethod from qt-conan-common.QtLeafModule""" + return {"force_nmea_plugin": ["yes", "no", None]} + + def get_qt_leaf_module_default_options(self) -> Dict[str, Any]: + """Implements abstractmethod from qt-conan-common.QtLeafModule""" + return {"force_nmea_plugin": "yes"} + + def override_qt_requirements(self) -> List[str]: + """Implements abstractmethod from qt-conan-common.QtLeafModule""" + requirements = ["qtbase", "qtdeclarative"] + if self.options.force_nmea_plugin: + requirements.append("qtserialport") + return requirements + + def is_qt_module_feature(self, option_name: str) -> bool: + """Implements abstractmethod from qt-conan-common.QtLeafModule""" + if option_name == "force_nmea_plugin": + return False + return True diff --git a/config.tests/gypsy/CMakeLists.txt b/config.tests/gypsy/CMakeLists.txt new file mode 100644 index 0000000..079f24f --- /dev/null +++ b/config.tests/gypsy/CMakeLists.txt @@ -0,0 +1,33 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from gypsy.pro. + +cmake_minimum_required(VERSION 3.16) +project(config_test_gypsy LANGUAGES C CXX) + +if(DEFINED QT_CONFIG_COMPILE_TEST_CMAKE_SYSTEM_PREFIX_PATH) + set(CMAKE_SYSTEM_PREFIX_PATH "${QT_CONFIG_COMPILE_TEST_CMAKE_SYSTEM_PREFIX_PATH}") +endif() +if(DEFINED QT_CONFIG_COMPILE_TEST_CMAKE_SYSTEM_FRAMEWORK_PATH) + set(CMAKE_SYSTEM_FRAMEWORK_PATH "${QT_CONFIG_COMPILE_TEST_CMAKE_SYSTEM_FRAMEWORK_PATH}") +endif() + +foreach(p ${QT_CONFIG_COMPILE_TEST_PACKAGES}) + find_package(${p}) +endforeach() + +if(QT_CONFIG_COMPILE_TEST_LIBRARIES) + link_libraries(${QT_CONFIG_COMPILE_TEST_LIBRARIES}) +endif() +if(QT_CONFIG_COMPILE_TEST_LIBRARY_TARGETS) + foreach(lib ${QT_CONFIG_COMPILE_TEST_LIBRARY_TARGETS}) + if(TARGET ${lib}) + link_libraries(${lib}) + endif() + endforeach() +endif() + +add_executable(${PROJECT_NAME} + main.cpp +) diff --git a/config.tests/gypsy/main.cpp b/config.tests/gypsy/main.cpp new file mode 100644 index 0000000..e215232 --- /dev/null +++ b/config.tests/gypsy/main.cpp @@ -0,0 +1,19 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include +#include +#include +#include + +int main() +{ + GypsyControl *control = gypsy_control_get_default(); + GypsyDevice *device = gypsy_device_new("test"); + GypsySatellite *satellite = gypsy_satellite_new("test"); + + GConfClient *client = gconf_client_get_default(); + g_object_unref(client); + + return 0; +} diff --git a/config.tests/winrt/CMakeLists.txt b/config.tests/winrt/CMakeLists.txt new file mode 100644 index 0000000..b0be974 --- /dev/null +++ b/config.tests/winrt/CMakeLists.txt @@ -0,0 +1,39 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from winrt.pro. + +cmake_minimum_required(VERSION 3.16) +project(config_test_winrt LANGUAGES C CXX) + +if(DEFINED QT_CONFIG_COMPILE_TEST_CMAKE_SYSTEM_PREFIX_PATH) + set(CMAKE_SYSTEM_PREFIX_PATH "${QT_CONFIG_COMPILE_TEST_CMAKE_SYSTEM_PREFIX_PATH}") +endif() +if(DEFINED QT_CONFIG_COMPILE_TEST_CMAKE_SYSTEM_FRAMEWORK_PATH) + set(CMAKE_SYSTEM_FRAMEWORK_PATH "${QT_CONFIG_COMPILE_TEST_CMAKE_SYSTEM_FRAMEWORK_PATH}") +endif() + +foreach(p ${QT_CONFIG_COMPILE_TEST_PACKAGES}) + find_package(${p}) +endforeach() + +if(QT_CONFIG_COMPILE_TEST_LIBRARIES) + link_libraries(${QT_CONFIG_COMPILE_TEST_LIBRARIES}) +endif() +if(QT_CONFIG_COMPILE_TEST_LIBRARY_TARGETS) + foreach(lib ${QT_CONFIG_COMPILE_TEST_LIBRARY_TARGETS}) + if(TARGET ${lib}) + link_libraries(${lib}) + endif() + endforeach() +endif() + +add_executable(${PROJECT_NAME} + main.cpp +) + +if(MSVC) + target_link_libraries(${PROJECT_NAME} PRIVATE + runtimeobject + ) +endif() diff --git a/config.tests/winrt/main.cpp b/config.tests/winrt/main.cpp new file mode 100644 index 0000000..3c9c549 --- /dev/null +++ b/config.tests/winrt/main.cpp @@ -0,0 +1,22 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include +#include +#include +#include +#include + +using namespace Microsoft::WRL::Wrappers; +using namespace ABI::Windows::Devices::Geolocation; +using namespace ABI::Windows::Foundation; + +typedef IAsyncOperationCompletedHandler AccessHandler; + +int main(int, char**) +{ + IGeolocator *locator; + RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Devices_Geolocation_Geolocator).Get(), + reinterpret_cast(&locator)); + return 0; +} diff --git a/configure.json b/configure.json new file mode 100644 index 0000000..d54624a --- /dev/null +++ b/configure.json @@ -0,0 +1,5 @@ +{ + "subconfigs": [ + "src/positioning" + ] +} diff --git a/dependencies.yaml b/dependencies.yaml new file mode 100644 index 0000000..32e9423 --- /dev/null +++ b/dependencies.yaml @@ -0,0 +1,10 @@ +dependencies: + ../qtbase: + ref: b5fbe0923cfc566036b83c3d968f225b26117efc + required: true + ../qtdeclarative: + ref: 12533cc0bd83a2076efb4af0bc1832b0db9568fc + required: false + ../qtserialport: + ref: b246f588224ad5b3d9a3456acb18fb8d98edac48 + required: false diff --git a/dist/changes-5.10.0 b/dist/changes-5.10.0 new file mode 100644 index 0000000..1703cf6 --- /dev/null +++ b/dist/changes-5.10.0 @@ -0,0 +1,62 @@ +Qt 5.10 introduces many new features and improvements as well as bugfixes +over the 5.9.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.10 series is binary compatible with the 5.9.x series. +Applications compiled for 5.9 will continue to run with 5.10. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.10.0 Changes * +**************************************************************************** + + - This release contains only minor code improvements. + +QtLocation +---------- + + - Map: + * [QTBUG-55782] Added methods to add or remove MapItemViews at runtime. + * Visible region now returns a QGeoPolygon. + + - MapGestureArea: + * Added rotation and tilt scroll wheel actions. + + - MapPolyline: + * Added setPath overload taking a QGeoPath. + + - MapboxGL: + * Updated Mapbox GL Native to v1.1.0. + * [QTBUG-62002] Updated map styles. + * [QTBUG-61442] Fix MapParameter dynamic usage. + + - QDeclarativeGeoMap: + * Added setBearing overload to rotate the map around a given + QGeoCoordinate. + * Added alignCoordinateToPoint method to QDeclarativeGeoMap. + + - QDeclarativeGeoMapType: + * [QTBUG-58931] Added CameraCapabilities and metadata properties to + QDeclarativeGeoMapType. + + - QGeoRouteRequest/RouteQuery: + * Add TrafficFeature to the query features. + +QtPositioning +------------- + + - QGeoPath: + * Add ::size() to QGeoPath to retrieve the number of coordinates in the + path. + + - QGeoPolygon: + * Added QGeoPolygon shape. diff --git a/dist/changes-5.10.1 b/dist/changes-5.10.1 new file mode 100644 index 0000000..695c4e3 --- /dev/null +++ b/dist/changes-5.10.1 @@ -0,0 +1,26 @@ +Qt 5.10.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.10.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.10 series is binary compatible with the 5.9.x series. +Applications compiled for 5.9 will continue to run with 5.10. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +This release contains all fixes included in the Qt 5.9.4 release. + +**************************************************************************** +* Qt 5.10.1 Changes * +**************************************************************************** + + - This release contains only minor code improvements. diff --git a/dist/changes-5.11.0 b/dist/changes-5.11.0 new file mode 100644 index 0000000..aae6398 --- /dev/null +++ b/dist/changes-5.11.0 @@ -0,0 +1,116 @@ +Qt 5.11 introduces many new features and improvements as well as bugfixes +over the 5.10.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.11 series is binary compatible with the 5.10.x series. +Applications compiled for 5.10 will continue to run with 5.11. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.11.0 Changes * +**************************************************************************** + +QtLocation +---------- + + - Qt.labs.location + * A new experimental QML plugin introduced, Qt.labs.location, which + offers two new categories of QML elements: Map Objects and the + Navigator type. Both are experimental, not supposed to work in every + setup (check documentation). This plugin can be disabled at configure + time, through the location-labs-plugin feature. + * Map objects are supposed to be QQuickItem-less equivalents of + Map Items. They are supposed to be easy to implement in plugins, and + to introduce minimal overhead. They come with a reference + implementation based on QSGNodes, that is supposed to work in all of the + currently offered raster based plugins. + At the present, the MapboxGL plugin does not offer map objects support. + * The Navigator type is a new QML api to expose turn-by-turn navigation + functions present in plugins. It requires a plugin supporting + one of the Navigation capabilities to actually work. + At the present, none of the open source plugins have these capabilities. + + - MapParameter + * MapParameter type now deprecated and re-registered under the DynamicParameter + name. + + - QGeoServiceProvider/QGeoServiceProviderFactory + * Added QGeoServiceProviderFactoryV2, capable of producing + QNavigationManagerEngine objects. + Note: QNavigationManagerEngine is private API. + + - QGeoPath + * The path property changed type, from QList to + QVariantList. This is binary-compatible with the previous release, + and source-compatible in QML. + It may, however, introduce source incompatibilities when using + the QObject property API in C++ (::property and ::setProperty), for + example in the generation of language bindings. + For the regular user-code, the use case was deemed as rare enough + (since QGeoShape has a public setter/getter for the path) to not cause + any problem. + As the beta phase passed without issues, this change was therefore left in place. + + - QGeoRoute + * QGeoRoute, QGeoRouteSegment and QGeoManeuver private implementation are + now (privately) exported and can be subclassed in plugins to provide + custom private implementations. + * QGeoRouteRequest now allows to specify extra parameters in QVariantMap form. + * RouteQuery (QDeclarativeGeoRouteQuery) now allows to specify extra parameters + through Map/DynamicParameters. + * Added extended attributes to QGeoManeuver/QDeclarativeGeoManeuver. + * [QTBUG-64066] Introduced new Waypoint QML type, intended to replace + QGeoCoordinate as mean to specify waypoints in a RouteQuery. + + - QPlace + * QPlace private implementation is now (privately) exported and can be + subclassed in plugins to provide custom private implementations. + * QPlaceContent::Type has a new value, CustomType. + + - QDeclarativeGeoMap + * [QTBUG-66315] Fixed a crash calling Map.clearMapItems before Map is + initialized. + * Fixed MapGestureArea not emitting when controlled with scroll wheel. + * [QTBUG-66880] Fixed clearData not triggering scene update. + * [QTBUG-67580] Fixed crash in QQuickGeoMapGestureArea. + * [QTBUG-67759] Fixed crash when calling clearData at startup. + + - Map Items + * [QTBUG-66758] Fixed re-set map items rendering stale geometry. + * [QTBUG-38459] Fixed the geometry of map items so that, if layers.enabled + is set to true, the scene graph renderer will not cut the items borders + anymore. + * [QTBUG-66692, QTBUG-66830] Fixed polyline geometry generation. + * [QTBUG-62086, QTBUG-65833] Fixed MapItemView not setting context data + upon item deletion. + * [QTBUG-67765] Fixed interaction with Map Items borders. + + - Plugins + * Mapbox: Added OnlinePlacesFeature, PlaceRecommendationsFeature, SearchSuggestionsFeature + and LocalizedPlacesFeature. + * Mapbox: Added OnlineGeocodingFeature, ReverseGeocodingFeature and LocalizedGeocodingFeature. + * Mapbox/OSM: OSRM backend now returns extended attributes for the maneuvers, such as + bearing_before, bearing_after, instruction, type and modifier. + * Mapbox/OSM: OSRM backend now uses Waypoint's bearing when sending a route request. + * Mapbox/OSM: Added OSRM's {leg,step}_index extra attribute to QGeoManeuver. + * Mapbox: Supported Mapbox Directions API voice & banner instructions. + * MapboxGL: Added map margins support via 'margins' map parameter. + * HERE: the plugin now uses Waypoint's bearing when sending a route request. + * OSM: supported the query limit parameter in the nominatim backend. + + +QtPositioning +---------- + + * [QTBUG-65937] Metatype for QGeoPositionInfo is now declared and registered. + This change introduces a potential source incompatibility, as existing user code may + contain the type registration already. diff --git a/dist/changes-5.11.1 b/dist/changes-5.11.1 new file mode 100644 index 0000000..4ce6df8 --- /dev/null +++ b/dist/changes-5.11.1 @@ -0,0 +1,40 @@ +Qt 5.11.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.11.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.11 series is binary compatible with the 5.10.x series. +Applications compiled for 5.10 will continue to run with 5.11. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.11.1 Changes * +**************************************************************************** + +QtLocation +---------- + +* [QTBUG-63223] Fixed MapPolyline documentation. +* Fixed a crash in Map{Polyline,Polygon,Route}ObjectQsg. +* [QTBUG-68261] Changed nominatim default endpoint base URL to HTTPS. +* Bumped mapbox-gl-native to the latest version, fixing offline tiles support. +* [QTBUG-68121] Supported raster-dem source types in the MapboxGL plugin. +* [QTBUG-68358] Added missing route query parameters to the query in the mapbox plugin. +* [QTBUG-68366] Fixed MapItemView deleting wrong item after changing to use the delegate model internally. +* [QTBUG-68598] Supported dynamic QObject properties in QMapboxGLStyleChange. + + +QtPositioning +------------- + +* [QTBUG-64699] Fixed QGeoPositionInfo timestamp comparison in nmea source. diff --git a/dist/changes-5.11.2 b/dist/changes-5.11.2 new file mode 100644 index 0000000..ffc0b7d --- /dev/null +++ b/dist/changes-5.11.2 @@ -0,0 +1,38 @@ +Qt 5.11.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.11.0 through 5.11.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.11 series is binary compatible with the 5.10.x series. +Applications compiled for 5.10 will continue to run with 5.11. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.11.2 Changes * +**************************************************************************** + +QtLocation +---------- + +* [QTBUG-68086] Documented potential SSL dependency in OSM provider. +* [QTBUG-69031] Added Qt.labs.location::Navigator::trackPositionSource property. +* [QTBUG-69262] Improved the Clipper dependency attribution file. +* [QTBUG-59665] Removed indexing of offline data from OSM plugin. + + +QtPositioning +------------- + +* Reduced minimum NMEA update interval. +* [QTBUG-64699] NMEA sentences now combined by timestamp also in live mode. + diff --git a/dist/changes-5.11.3 b/dist/changes-5.11.3 new file mode 100644 index 0000000..9b09a0c --- /dev/null +++ b/dist/changes-5.11.3 @@ -0,0 +1,32 @@ +Qt 5.11.3 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.11.0 through 5.11.2. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.11 series is binary compatible with the 5.10.x series. +Applications compiled for 5.10 will continue to run with 5.11. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.11.3 Changes * +**************************************************************************** + + QtLocation + ---------- + + - [QTBUG-69617] Fixed Qt.labs.location not linking statically on iOS. + - [QTBUG-71355] Fixed crash when calling QGeoPath::length() on empty + QGeoPath instance. + - Fixed place search matching based on category in mapbox plugin. Previously, + the search results contained places which did not have any category set. + diff --git a/dist/changes-5.12.0 b/dist/changes-5.12.0 new file mode 100644 index 0000000..4fd5b69 --- /dev/null +++ b/dist/changes-5.12.0 @@ -0,0 +1,52 @@ +Qt 5.12 introduces many new features and improvements as well as bugfixes +over the 5.11.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.12 series is binary compatible with the 5.11.x series. +Applications compiled for 5.11 will continue to run with 5.12. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtLocation * +**************************************************************************** + + + - Added QDeclarativeGeoRoute::equals to perform deep comparisons in QML. + - MapItemView now exposes add and remove transitions, so that they can + be changed (defaults are none for add, and item fade out for remove). + - Enabled incremental updates in PlaceSearchModel, which prevents previousPage or + nextPage from resetting the model, but rather appending the new data to it. + - [QTBUG-68966] Added Map.visibleArea property. + - [QTBUG-62683][QTBUG-62397] Enabled nesting of MapItemView. This required + a behavioral change, as MapItemView is now a MapItemGroup, not anymore a + plain QObject. Due to a bug, MapItemView was previously not a Qt Quick + Item, making it possible to create it as a child of any QObject. This + has now been fixed, so if you happen to have a MapItemView in your scene + which is not a child of a Qt Quick Item, you will get an error message. + - Enabled asynchronous incremental updates of QPlaceReply. + - Changed QDeclarativeGeoMapItemBase::geoShape property from read-only into R/W. + - Added support for route legs. + - [QTBUG-70499] Fixed HERE plugin requesting the route incorrectly. + - Added ESRI place search manager to the ESRI plugin. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + + - Exposed mercatorToCoord and coordToMercator to QML. + - [QTBUG-62875] QGeoPath can now be cleared directly using clearPath. + - Added QGeoPolygon::perimeter property. + - Added holes support to QGeoPolygon. Currently visualized only when using + in a MapPolygon with the MapboxGL plugin. + - [QTBUG-43435] Added Geoclue2 position plugin. + - [QTBUG-52660] QtPositioning now properly checks for authorization on iOS. + diff --git a/dist/changes-5.12.1 b/dist/changes-5.12.1 new file mode 100644 index 0000000..2ea2eda --- /dev/null +++ b/dist/changes-5.12.1 @@ -0,0 +1,56 @@ +Qt 5.12.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.12.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.12 series is binary compatible with the 5.11.x series. +Applications compiled for 5.11 will continue to run with 5.12. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtLocation * +**************************************************************************** + + + - Exposed support for chinese maps in the MapboxGL plugin. + - Fixed unstable rotation gesture on some platforms. + - [QTBUG-71607] Fixed MapPolyline drawing incorrectly at high zoom levels. + - [QTBUG-71607] Fixed missing geometry update when changing map items + border width. + - [QTBUG-71264] Fixed MapItemView removing wrong indices on model changes. + - Added QAbstractNavigator::setTrackPosition. + - [QTBUG-70254] Improved the initialization behavior of CategoryModel. + - [QTBUG-69512] Fixed compilation with GCC < 5.0. + - [QTBUG-72180] Fixed a regression in error handling inside + QGeoServiceProvider. + - [QTBUG-72462] Introduced a plugin parameter to decide U-Turn direction. + - Fixed MapItemView attempting to instantiate items when map not set. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + + - [QTBUG-72291] Fixed horizontal accuracy comparison for competing position + results. + - [QTBUG-62682][QTBUG-68331] Enabled QVariant::save for QGeoCoordinate. + - Registered QGeoCoordinate debug streaming operator + + - [QTBUG-64689] Android: Implemented collection of vertical accuracy data. + - [QTBUG-66427] Android: Fixed + QGeoPositionInfoSource::supportedPositioningMethods(). + + - WinRT: Fixed setting of verticalAccuracy. + - [QTBUG-71194] WinRT: Made sure that Co(Un)Initialize is called. + - WinRT: Added categorized logging. + - WinRT: Fixed namespaced builds + - WinRT: Implemented minimumUpdateInterval. diff --git a/dist/changes-5.12.2 b/dist/changes-5.12.2 new file mode 100644 index 0000000..d9822a3 --- /dev/null +++ b/dist/changes-5.12.2 @@ -0,0 +1,33 @@ +Qt 5.12.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.12.0 through 5.12.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.12 series is binary compatible with the 5.11.x series. +Applications compiled for 5.11 will continue to run with 5.12. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtLocation * +**************************************************************************** + + - [QTBUG-61509] Fixed crash when assigning a Component to MapQuickItem.sourceItem. + - [QTBUG-72935] Fixed QGeoRectangle::operator|=-. + - [QTBUG-71264] Fixed MapObjectView removing wrong indices on model changes. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + + - Several improvements in the WinRT positioning plugin. + - Geoclue plugin re-enabled on all *BSD. diff --git a/dist/changes-5.12.3 b/dist/changes-5.12.3 new file mode 100644 index 0000000..f66e469 --- /dev/null +++ b/dist/changes-5.12.3 @@ -0,0 +1,33 @@ +Qt 5.12.3 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.12.0 through 5.12.2. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.12 series is binary compatible with the 5.11.x series. +Applications compiled for 5.11 will continue to run with 5.12. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + + - Documented QGeoPath::length behavior properly. + +**************************************************************************** +* UNSPECIFIED * +**************************************************************************** + + - Fixed incorrect indexing of Mapbox tiles in the cache. + - Fixed crash when destroying Maps containing MapItemViews. + - Added a notice to the MapViewer example to inform when a HTTPS-based map + is selected without SSL support. diff --git a/dist/changes-5.12.4 b/dist/changes-5.12.4 new file mode 100644 index 0000000..a285cd8 --- /dev/null +++ b/dist/changes-5.12.4 @@ -0,0 +1,20 @@ +Qt 5.12.4 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.12.0 through 5.12.3. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.12 series is binary compatible with the 5.11.x series. +Applications compiled for 5.11 will continue to run with 5.12. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.12.5 b/dist/changes-5.12.5 new file mode 100644 index 0000000..e8be931 --- /dev/null +++ b/dist/changes-5.12.5 @@ -0,0 +1,20 @@ +Qt 5.12.5 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.12.0 through 5.12.4. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.12 series is binary compatible with the 5.11.x series. +Applications compiled for 5.11 will continue to run with 5.12. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.13.0 b/dist/changes-5.13.0 new file mode 100644 index 0000000..564a37e --- /dev/null +++ b/dist/changes-5.13.0 @@ -0,0 +1,46 @@ +Qt 5.13 introduces many new features and improvements as well as bugfixes +over the 5.12.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.13 series is binary compatible with the 5.12.x series. +Applications compiled for 5.12 will continue to run with 5.13. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtLocation * +**************************************************************************** + + - Added a GeoJSON parser which can be used to annotate maps with tracks, + polygonal boundaries, etc. + - GeoJSON returned in Nominatim queries is now converted into the corresponding + geoshapes using QGeoJson. + - GeoJSON returned in Nominatim queries is now converted into the corresponding + geoshapes using QGeoJson. + - Introduced Qt.labs.location QtLocationLabs singleton type, offering tech-preview + map related API. + - Added departure time attribute to route queries. + - Introduced QGeoMapObject::geoShape property. + - Additional navigation information now exposed via Navigator. + - Fixed crash when removing items from MapboxGL maps. + - Renamed MapIconObject.size to MapIconObject.iconSize. + - Added Map.fitViewportToGeoShape(shape, margins). + - Added Navigator currentRouteLeg property. + - Introduced extendedAttributes property to Geo Location types. + - Introduced extendedAttributes property to Geo Routes types. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + +- Added holes support to QGeoPolygon, currently rendered only when using the + MapboxGL backend. + diff --git a/dist/changes-5.13.1 b/dist/changes-5.13.1 new file mode 100644 index 0000000..57ebdbe --- /dev/null +++ b/dist/changes-5.13.1 @@ -0,0 +1,20 @@ +Qt 5.13.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.13.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.13 series is binary compatible with the 5.12.x series. +Applications compiled for 5.12 will continue to run with 5.13. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.13.2 b/dist/changes-5.13.2 new file mode 100644 index 0000000..e3bb833 --- /dev/null +++ b/dist/changes-5.13.2 @@ -0,0 +1,20 @@ +Qt 5.13.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.13.0 through 5.13.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.13 series is binary compatible with the 5.12.x series. +Applications compiled for 5.12 will continue to run with 5.13. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.14.0 b/dist/changes-5.14.0 new file mode 100644 index 0000000..a2748e5 --- /dev/null +++ b/dist/changes-5.14.0 @@ -0,0 +1,47 @@ +Qt 5.14 introduces many new features and improvements as well as bugfixes +over the 5.13.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.14 series is binary compatible with the 5.13.x series. +Applications compiled for 5.13 will continue to run with 5.14. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtLocation * +**************************************************************************** + + - [QTBUG-76867] Added property to disable the automatic fade-in/fade-out + behavior of MapItems on low zoom levels. + - Added QDeclarativeGeoServiceProviderRequirements + navigation property. + - Added notification signal to Map.visibleRegion property. + - Added automaticReroutingEnabled, isOnRoute and alternativeRoutes + properties to QDeclarativeNavigator. + - Added a recalculateRoutes invokable method to QDeclarativeNavigator. + + - Geoservice Plugins + * MapboxGL: Added support for image sources. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + + - [QTBUG-66304] Exposed PluginParameter also from QtPositioning qml + plugin, to be used in PositionSource as replacement of environment + variables. + - [QTBUG-59274] Added Satellite info source capabilities to the serial nmea + plugin. + + + + + diff --git a/dist/changes-5.14.1 b/dist/changes-5.14.1 new file mode 100644 index 0000000..d008638 --- /dev/null +++ b/dist/changes-5.14.1 @@ -0,0 +1,20 @@ +Qt 5.14.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.14.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.14 series is binary compatible with the 5.13.x series. +Applications compiled for 5.13 will continue to run with 5.14. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.14.2 b/dist/changes-5.14.2 new file mode 100644 index 0000000..68a0051 --- /dev/null +++ b/dist/changes-5.14.2 @@ -0,0 +1,20 @@ +Qt 5.14.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.14.0 through 5.14.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.14 series is binary compatible with the 5.13.x series. +Applications compiled for 5.13 will continue to run with 5.14. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.15.0 b/dist/changes-5.15.0 new file mode 100644 index 0000000..f084e9e --- /dev/null +++ b/dist/changes-5.15.0 @@ -0,0 +1,51 @@ +Qt 5.15 introduces many new features and improvements as well as bugfixes +over the 5.14.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.15 series is binary compatible with the 5.14.x series. +Applications compiled for 5.14 will continue to run with 5.15. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* QtPositioning * +**************************************************************************** + + - QGeoPolygon: + * Fixed contains method. + + - serialnmea plugin: + * [QTBUG-82819] Fixed serialnmea plugin initialization when used with serial port. + + - [QTBUG-81069] Fixed a dangling pointer issue in QML PositionSource API. + + - Fixed QGeoCoordinate::CoordinateFormat missing Q_ENUM. + + - Removed the usage of deprecated APIs from other Qt modules. + + +**************************************************************************** +* QtLocation * +**************************************************************************** + + - Added optional Argument to Map.fitViewportToMapItems. + + - Fixed a memory leak related to MapObjects.border. + + - Updated the 3rdparty library earcut. + + - Fixed Map*ObjectsQSG implementation triggering QSGBatchRenderer crashes. + + - Ported Map*ObjectPrivateQSG to the shader-based projection geometries. + + - Fixed segmentation fault due to null pointer usage in qdeclarativepolylinemapitem.cpp. + + - Removed the usage of deprecated APIs from other Qt modules. diff --git a/dist/changes-5.15.1 b/dist/changes-5.15.1 new file mode 100644 index 0000000..332ee9d --- /dev/null +++ b/dist/changes-5.15.1 @@ -0,0 +1,20 @@ +Qt 5.15.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.15.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +https://doc.qt.io/qt-5/index.html + +The Qt version 5.15 series is binary compatible with the 5.14.x series. +Applications compiled for 5.14 will continue to run with 5.15. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + + - This release contains only minor code improvements. diff --git a/dist/changes-5.15.2 b/dist/changes-5.15.2 new file mode 100644 index 0000000..1e66906 --- /dev/null +++ b/dist/changes-5.15.2 @@ -0,0 +1,48 @@ +Qt 5.15.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.15.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + https://doc.qt.io/qt-5.15/index.html + +The Qt version 5.15 series is binary compatible with the 5.14.x series. +Applications compiled for 5.14 will continue to run with 5.15. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Important Behavior Changes * +**************************************************************************** + +**************************************************************************** +* Library * +**************************************************************************** + + +General +------- + + - [QTBUG-86248] The generated clipper2tri, clipper, poly2tri libraries have + been renamed to qt_clipper2tri, qt_clipper, qt_poly2tri. This avoids + conflicts for static builds. + +Third-Party Code +---------------- + + - Update and extend third-party documentation for Mapbox GL plugin + dependencies: libc++, Optional, Mapbox GL Native, Boost, CSS Color Parser, + cURL Parse Date, Earcut Polygon Triangulation Library, geojson-cpp, + geojson-vt-cpp, geometry.hpp, kdbush.hpp, polylabel, protozero, RapidJSON, + shelf-pack-cpp, supercluster.hpp, tao_tuple, unique_resource, variant, + Vector Tile Library, Wagyu Geometry Processing Library, nunicode. + + - Added actual license text of Boost Software License (used in Clipper Polygon + Clipping Library) + diff --git a/dist/changes-5.2.1 b/dist/changes-5.2.1 new file mode 100644 index 0000000..37a1f55 --- /dev/null +++ b/dist/changes-5.2.1 @@ -0,0 +1,53 @@ +Qt 5.2.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.2.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://qt-project.org/doc/qt-5.2 + +The Qt version 5.2 series is binary compatible with the 5.1.x series. +Applications compiled for 5.1 will continue to run with 5.2. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt-project.org/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* General * +**************************************************************************** + +General Improvements +-------------------- + + - [QTBUG-34910] Fixed too long weather status string in weatherinfo + example (UI change). + - [QTBUG-36187] Byte order marker removed from positionpoll plugin + which caused compile errors on some older compilers. + - Fixed make install rules for all examples. + - declarative_core unit test was fixed and re-enabled. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - [QTBUG-33220] Removed QtQml dependency from QtPositioning. + +**************************************************************************** +* Plugin Specific Changes * +**************************************************************************** + +GeoClue +------- + + - Delay satellite provider until requested. + - Sets the default preferred positioning method to AllPositioningMethods. + - Fix for incorrect accuracy values reported by the plug-in. + diff --git a/dist/changes-5.3.0 b/dist/changes-5.3.0 new file mode 100644 index 0000000..1bf445a --- /dev/null +++ b/dist/changes-5.3.0 @@ -0,0 +1,74 @@ +Qt 5.3 introduces many new features and improvements as well as bugfixes +over the 5.2.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + + http://qt-project.org/doc/qt-5.3 + +The Qt version 5.3 series is binary compatible with the 5.2.x series. +Applications compiled for 5.2 will continue to run with 5.3. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt-project.org/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* General * +**************************************************************************** + +General Improvements +-------------------- + + - New SatelliteInfo example added. The example displays the signal + strength of surrounding satellites. The example employs a demo mode on + those platforms which don't provide satellite information + + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - Position (QML): + * Added direction and vertical speed properties. + + - QGeoPositionInfoSource: + * iOS position backend added. + * [QTBUG-34102] Android backend added. Android devices can retrieve + their current position. Network- and Satellite-based providers are + supported. + + - QGeoSatelliteInfoSource: + * [QTBUG-34102] Android backend added. Android devices can retrieve + information about the currently accessible GPS and GLONASS satellites. + + - QGeoRectangle: + * Added QGeoRectangle(QList) constructor added. + * Improved class documentation. + + - QGeoShape: + * Added extendShape(QGeoCoordinate) function. + + - QNmeaPositionInfoSource: + * Added support for reporting position accuracy. + + +**************************************************************************** +* Plugin Specific Changes * +**************************************************************************** + +GeoClue +------- + - [QTBUG-36298] Reports direction of travel and + vertical speed attributes, if supported by the active Geoclue + provider. + - Fixed the emission of the updateTimeout() signal when + position updates do not arrive in a timely manner. + - Position info source provider no longer internally filters + position updates to the requested update interval. + diff --git a/dist/changes-5.3.1 b/dist/changes-5.3.1 new file mode 100644 index 0000000..8913770 --- /dev/null +++ b/dist/changes-5.3.1 @@ -0,0 +1,57 @@ +Qt 5.3.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.3.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://qt-project.org/doc/qt-5.3 + +The Qt version 5.3 series is binary compatible with the 5.2.x series. +Applications compiled for 5.2 will continue to run with 5.3. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt-project.org/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* General * +**************************************************************************** + +General Improvements +-------------------- + + - Added PLUGIN_CLASS_NAME variable to all plug-in based projects. This + enables the automatic static linking and deployment of this plug-ins. + + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - QGeoPositionInfoSource: + * WinRT backend added + + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Android +------- + + - [QTBUG-39082] Fixed crash on Galaxy S4 when running satellite and position + updates at the same time. + +iOS +--- + + - [QTBUG-38770] Added "classname" entry to all qmldir files enabling QML + plug-ins when doing static builds on iOS. + diff --git a/dist/changes-5.3.2 b/dist/changes-5.3.2 new file mode 100644 index 0000000..b1981f6 --- /dev/null +++ b/dist/changes-5.3.2 @@ -0,0 +1,50 @@ +Qt 5.3.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.3.0 and Qt 5.3.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://qt-project.org/doc/qt-5.3 + +The Qt version 5.3 series is binary compatible with the 5.2.x series. +Applications compiled for 5.2 will continue to run with 5.3. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt-project.org/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - [QTBUG-39843] [iOS] Fixed link error of positioncl and positionpoll + plug-in. + + - [QTBUG-40198] Fixed symbol clash between sensor and position plug-in. + This happened when using static builds of Qt (e.g. on iOS) and the + application used QtSensors and QtPositioning at the same time. + + - Improved weatherinfo example to not hang on the "Loading weather data" + screen if the current QGeoPositionInfoSource instance returned an error + during its startup. + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +[iOS] + + - [QTBUG-38300] Fixed wrong value of QGeoPositionInfo attributes if those + attributes were not provided by the platforms CoreLocation framework. + +[Linux] + + - [QTBUG-40425] Fixed missing error report when failing to connect to GeoClue. + diff --git a/dist/changes-5.4.0 b/dist/changes-5.4.0 new file mode 100644 index 0000000..3a14766 --- /dev/null +++ b/dist/changes-5.4.0 @@ -0,0 +1,54 @@ +Qt 5.4 introduces many new features and improvements as well as bugfixes +over the 5.3.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + + http://qt-project.org/doc/qt-5.4 + +The Qt version 5.4 series is binary compatible with the 5.3.x series. +Applications compiled for 5.3 will continue to run with 5.4. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt-project.org/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - Position: + * [QTBUG-39547] Added magneticVariation and magneticVariationValid + property to the QML Position type. + + - General: + * Weatherinfo end Flickr example improved. + + - QGeoCircle: + * [QTBUG-41447] Fixed contains() when rounding errors occur + + - QGeoCoordinate: + * [QTBUG-41739] Fixed toString() output in cases when rounding + of longitude/latitude is necessary. + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Android +------- + + - [QTBUG-41873] Fixed wrong initialization of QGeoPositionInfoSource::error() + after class instantiation. + +iOS +--- + + - [QTBUG-41827] Fixed position retrieval on iOS 8. This was required due + to the new authorization scheme in CLLocationManager. + diff --git a/dist/changes-5.4.1 b/dist/changes-5.4.1 new file mode 100644 index 0000000..4876ab3 --- /dev/null +++ b/dist/changes-5.4.1 @@ -0,0 +1,29 @@ +Qt 5.4.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.4.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5.4 + +The Qt version 5.4 series is binary compatible with the 5.3.x series. +Applications compiled for 5.3 will continue to run with 5.4. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - PositionSource: + * Fixed a case where an NMEA source file, which is integrated + using qrc, was not loaded. diff --git a/dist/changes-5.4.2 b/dist/changes-5.4.2 new file mode 100644 index 0000000..4f256ef --- /dev/null +++ b/dist/changes-5.4.2 @@ -0,0 +1,28 @@ +Qt 5.4.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.4.0 and Qt 5.4.1. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5.4 + +The Qt version 5.4 series is binary compatible with the 5.3.x series. +Applications compiled for 5.3 will continue to run with 5.4. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - [QTBUG-44572] Fixed issue where the default timeout for position update + requests was not set on WinRT. diff --git a/dist/changes-5.5.0 b/dist/changes-5.5.0 new file mode 100644 index 0000000..737ce13 --- /dev/null +++ b/dist/changes-5.5.0 @@ -0,0 +1,40 @@ +Qt 5.5 introduces many new features and improvements as well as bugfixes +over the 5.4.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.5 series is binary compatible with the 5.4.x series. +Applications compiled for 5.4 will continue to run with 5.5. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - Added QGeoShape::center() function + - Converted QGeoShape, QGeoCircle, QGeoRectangle & QGeoCoordinate to Q_GADGET. + It simplifies the integration of the above classes into QML as the extensive + QML value type wrapper conversion is implicitly done by Qt QML. The existing + custom wrappers were removed. + - Fixed Debug stream operators for QGeoAreaMonitorInfo, QGeoCoordinate, + QGeoPositionInfo, QGeoSatelliteInfo & QGeoShape following a QDebug related + change in Qt Base. + - [QTBUG-44663] Added updateTimeout() signal to QML PositionSource type + - [QTBUG-44983] Fixed broken build of qtlocation repo when using qmake -r + on OS X + +QtLocation +---------- + + - First Technology Preview release of this module diff --git a/dist/changes-5.5.1 b/dist/changes-5.5.1 new file mode 100644 index 0000000..8b2ce35 --- /dev/null +++ b/dist/changes-5.5.1 @@ -0,0 +1,54 @@ +Qt 5.5.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.5.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5.5/ + +The Qt version 5.5 series is binary compatible with the 5.4.x series. +Applications compiled for 5.4 will continue to run with 5.5. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +----------- + + - Fixed change signal emission for Map.activeMapType property. + - Improved places-list and places-map examples. + - [QTBUG-47188] Fixed incorrect naming of OSM plugin's parameter. + The documentation mandates the osm prefix which was not used in + the case of the geocoding.host, useragent and routing.host parameters. + The required osm.places.host parameter was not handled at all. + - [QTBUG-47322] Added support for zoom level 19 to OSM plugin. + - Fixed an issue where the incorrect prefetch algorithm was used for map + tile fetching. + +QtPositioning +------------- + + - Improved minor documentation issues. + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Windows +------- + + - Added missing QtQuick.Controls import to mapviewer example. + +Linux/gcc +--------- + + - [QTBUG-47427] Fixed compile issue in geoclue plugin when using gcc 4.5. diff --git a/dist/changes-5.6.0 b/dist/changes-5.6.0 new file mode 100644 index 0000000..1402343 --- /dev/null +++ b/dist/changes-5.6.0 @@ -0,0 +1,69 @@ +Qt 5.6 introduces many new features and improvements as well as bugfixes +over the 5.5.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.6 series is binary compatible with the 5.5.x series. +Applications compiled for 5.5 will continue to run with 5.6. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - Removed Blackberry 10 support. + - [QTBUG-40702] Removed dependency towards libgeoclue. The plugin uses the + GeoClue DBus interface. + - Enabled Position plugin for OS X. Previously only the plugin was only working + for iOS. + - [QTBUG-48082] Added QtSerialPort based NMEA position plugin for Windows. + - Improved and fixed the WinRT position backend. Various changes on the WinRT + platform caused the necessity for such and update. + - Fixed endless requests towards Android's LocationManager when stopUpdates() was not + called in pair with startUpdates(). + +QtLocation +---------- + + - First stable release of the Qt Location API. The QML API changed significantly + compared to the Qt 5.5 release. The changes are documented in the official + module documentation under "API changes". + - Improved the Flick and Pinch implementation for QML Map. + - [QTBUG-44809] Fixed tile version handling + - Fixed crash during Map.setVisibleRegion while no plugin has been set. + - Improved error reporting in map, geocoding and routing model APIs. + - QTBUG[36919] Added means to prevent stealing of mouse/touch grabs on map. + - Improved coordinate related animation handling. Previously an animation along + the longitude always used a shortest path direction. Now it is possible to set + the direction for the animation. + - [QTBUG-46147] Fixed crash in QML Map element. + - [QTBUG-44311] Fixed bouncing Map flick on zoom level 2. + - [QTBUG-47020] & [QTBUG-47019] Improved Mouse and keyboard integration of QML Map + - [QTBUG-46388] Fixed Pinch when no MouseArea overlaps QML Map element. + - Fixed various unit test. + - Fixed a variety of minor documentation issues. + - Fixed dysfunctional tile cache for OSM plugin due to the server delivering JPEG + file when PNG files were expected. + - [QTBUG-41187] Unified the default tile cache location on disk. + - Fixed crash in gesture area while receiving wheel events. + - Fixed route requests with excluded areas for HERE plugin. + - Added support for custom map background color. + - Improved Map rendering performance throughout the QML API. + - [QTBUG-49772] Fixed weatherinfo example due to missing appid handling for + openweatermap.org. + - [QTBUG-47292] Added ability to clear the map cache. + - [QTBUG-50060] Improved performance of QML MapPolyline. + - [QTBUG-50240] Fixed OSM routing to handle changed server status code for a + successful route retrieval. + - [QTBUG-50519] Fixed map in mapviewer example when displaying the minimap. diff --git a/dist/changes-5.6.1 b/dist/changes-5.6.1 new file mode 100644 index 0000000..cd579b6 --- /dev/null +++ b/dist/changes-5.6.1 @@ -0,0 +1,38 @@ +Qt 5.6.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.6.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5.6/ + +The Qt version 5.6 series is binary compatible with the 5.5.x series. +Applications compiled for 5.5 will continue to run with 5.6. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + http://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +---------- + + - Improved the example and class documentation + - Consolidated various qmake project files across the module + - [QTBUG-51541] Fixed compile issue on linux/gcc-4.8 when using C++98 + - Improved compression rate of various screenshots throughout the documentation + +QtPositioning +------------- + + - [QTBUG-38802] Added default capability (location) for WinRT + - [QTBUG-53059] Fixed crash on iOS/OS X due to incorrectly initialized member + variable in the positioning backend + diff --git a/dist/changes-5.6.2 b/dist/changes-5.6.2 new file mode 100644 index 0000000..9f2a6f9 --- /dev/null +++ b/dist/changes-5.6.2 @@ -0,0 +1,55 @@ +Qt 5.6.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.6.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.6 series is binary compatible with the 5.5.x series. +Applications compiled for 5.5 will continue to run with 5.6. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +---------- + + - Fixed autotests containing bugs not showing in the tests + - [QTBUG-31797][QTBUG-53455] Fixed the QtLocation autotest framework by + replacing waitForRendering() with waitForPolished() + - Disabled explicit example installation + - [QTBUG-52514] Fixed QML Map not working with repeaters + - [QTBUG-53128] Fixed QML Map items not updating on window resize + - [QTBUG-52075] Fixed QML Map items losing focus during fast dragging + - [QTBUG-52301] Prevented flickering upon MapItemView's model reset + - [QTBUG-54141] Fixed QML Map setVisibleRegion failing in some cases + - Fixed a potential memory leak in QGeoTiledMappingManagerEngine + - [QTBUG-19929] Prevented generating MapCircles with invalid radius + - [QTBUG-54599] Added support for fetching OSM provider information from + a remote repository + - [QTBUG-54337] Fixed bounding calculation for QGeoCircle + - Added a minimal QML Map usage example + - Added support for dynamically remove unavailable providers from the OSM + plugin + - [QTBUG-55081] Fixed accessing MapPolyline before it is added to a Map + - [QTBUG-54964] Fixed invisible copyright notice on Android using Holo theme + - Improved macOS documentation + - Fixed the geocoding in the MapViewer example + - [QTBUG-55371] Fixed OSM plugin geocoding feature + +QtPositioning +------------- + + - [QTBUG-54026] Reduced Android minimum update interval + - Improved Android 5.0+ compatibility + diff --git a/dist/changes-5.6.3 b/dist/changes-5.6.3 new file mode 100644 index 0000000..4709ff2 --- /dev/null +++ b/dist/changes-5.6.3 @@ -0,0 +1,38 @@ +Qt 5.6.3 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.6.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.6 series is binary compatible with the 5.5.x series. +Applications compiled for 5.5 will continue to run with 5.6. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +---------- + + - [QTBUG-56099] Updated HERE plugin base address + - [QTBUG-56119] Added OSRMv5 support to the osm plugin + - [QTBUG-57027] Fixed fitViewportToGeoShape on rectangles crossing the date + line. + - Updated HERE plugin geocoding endpoints + + +QtPositioning +------------- + + - [QTBUG-54844] Fixed error status for QGeoPositionInfoSourceAndroid + - [QTBUG-56623] WinRT backend now uses backend-provided timestamps diff --git a/dist/changes-5.7.0 b/dist/changes-5.7.0 new file mode 100644 index 0000000..d1fdb43 --- /dev/null +++ b/dist/changes-5.7.0 @@ -0,0 +1,53 @@ +Qt 5.7 introduces many new features and improvements as well as bugfixes +over the 5.6.x series. Also, there is a change in the licensing terms. +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.7 series is binary compatible with the 5.6.x series. +Applications compiled for 5.6 will continue to run with 5.7. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Important License Changes * +**************************************************************************** + + This module is no longer available under LGPLv2.1. The libraries are + now available under the following licenses: + * Commercial License + * GNU General Public License v2.0 (LICENSE.GPL2) and later + * GNU Lesser General Public License v3.0 (LICENSE.LGPL3) + + The tools are now available under the following licenses: + * Commercial License + * GNU General Public License 3.0 (LICENSE.GPL3) with exceptions + described in The Qt Company GPL Exception 1.0 (LICENSE.GPL3-EXCEPT) + +**************************************************************************** +* Library * +**************************************************************************** + +QtPositioning +------------- + + - Added support for tvOs to iOS/OS X positioning engine + - Added qHash() function for QGeoCoordinate + - Fixed negative QGeoCoordinate.azimuthTo results + - Added experimental support for GeoPosition API on Windows desktop + running Windows 8 or later + +QtLocation +---------- + + - [QTBUG-47025] Added option to hide map data copyright information + - Adjusted minimum map zoom level to prevent gray bounds. It prevents the map + from being smaller than the canvas size. + - Fixed several internal performance issues diff --git a/dist/changes-5.7.1 b/dist/changes-5.7.1 new file mode 100644 index 0000000..2d111d5 --- /dev/null +++ b/dist/changes-5.7.1 @@ -0,0 +1,45 @@ +Qt 5.7.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.7.0. + +Qt 5.7.1 contains a merge from Qt 5.6.2 and all changes in Qt 5.6.2 are +also in Qt 5.7.1. For more see changes-5.6.2. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.7 series is binary compatible with the 5.6.x series. +Applications compiled for 5.6 will continue to run with 5.7. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +---------- + +- [QTBUG-55535] Fixed map polygon not working correctly when zooming. +- [QTBUG-55964] Fixed rendering of polylines and polygons at the edge + of the map. +- [QTBUG-52610] Fixed incorrect map polyline drawing. +- [QTBUG-52076] Fixed crashes on tessellation of self-intersecting + GeoPolygons. +- [QTBUG-52030] Fixed that map's center and zoom were not initialized when + used in a layout. +- [QTBUG-52514] Fixed not working MapPolygon inside Repeater. +- [QTBUG-53128] Fixed map objects moving incorrectly on map resize. +- [QTBUG-52075] Fixed losing map item focus while dragging. + +QtPositioning +------------- + +- [QTBUG-54506] Fixed unneeded dependency on Activity for Android Platform. diff --git a/dist/changes-5.8.0 b/dist/changes-5.8.0 new file mode 100644 index 0000000..1c2a5b4 --- /dev/null +++ b/dist/changes-5.8.0 @@ -0,0 +1,70 @@ +Qt 5.8 introduces many new features and improvements as well as bugfixes +over the 5.7.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + + http://doc.qt.io/qt-5/index.html + +The Qt version 5.8 series is binary compatible with the 5.7.x series. +Applications compiled for 5.7 will continue to run with 5.8. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + + https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +----------- + + - Added geoservices plugin to support ESRI mapping, geocoding and routing + services. + - Improved HERE geoservice plugin code base (improved warning) and converted + the HERE endpoints to newer versions (away from Nokia endpoints. At the same time + China specific URLs were removed. + - Improved Mapbox plugin to cater for better cache customization and + to support the standard box map modes. + - Renamed various internal C++ functions to improve code readability + - Added better high DPI support in the various geoservice provider plugins. + For more details see QTBUG-53318, QTBUG-48868 and QTBUG-36949. + - [QTBUG-45284] Added offline data support and improved cache handling in OSM + geoservice plugin + - Added routing support to Mapbox plugin + - Added server side provider support for QtLocation. This enables the quicker + selection of alternative providers by already deployed OSM applications in case + an OSM based default provider changes T&Cs. + - Removed QtSystemInfo dependency from QtLocation + - [QTBUG-56213] Adapted map related mouse/touch behavior following + changes to general mouse/touch handling in Qt QML + - Adapted QtLocation and QtPositioning to the Qt Lite related build system changes + - Marked QGeoMapPrivate as private export + - Added support for unitary tile caching. This enables use cases whereby the cache + size can be defined in number of tiles rather then bytes. + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Android +------- + + - [QTBUG-55988] Added capability to ask for Location permissions at runtime. This is + required since Android 7.0. + +WinRT +----- + + - Fixed a name space related compile problem in the positioning plugin for WinRT + - Migrated the QtLocation rendering code to the new scenegraph changes enabling + Direct3D 12 + - [QTBUG-54474] Added GeolocationAccessStatus existence check + - [QTBUG-56340] Added direction information to position updates + - [QTBUG-56623] Changed positioning plugin to use the platforms positioning time + stamp rather than a programmatically acquired time stamp at the time of the callback. + Effectively, this forwards time stamps from the GPS satellite to the user application. + - [QTBUG-53925] Enabled WinRT positioning backend for MSVC2013/2015 diff --git a/dist/changes-5.9.0 b/dist/changes-5.9.0 new file mode 100644 index 0000000..46faf68 --- /dev/null +++ b/dist/changes-5.9.0 @@ -0,0 +1,131 @@ +Qt 5.9 introduces many new features and improvements as well as bugfixes +over the 5.8.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* General * +**************************************************************************** + +Third-Party Code +---------------- + + - Added Mapbox GL Native as a third-party component to + src/3rdparty/mapbox-gl-native. + +**************************************************************************** +* Library * +**************************************************************************** + +QtLocation +----------- + + - Added boundingGeoRectangle to QGeoShape to return a geographical bounding + box in form of a QGeoRectangle. + - Added QGeoPath as a new geo shape. + - Added a new QML type, MapParameter, to control plugin-specific map features + at runtime. + - Deprecated QGeoShape::extendShape. + - Renamed the QGeoProjection class into QWebMercator. + - Added new private API, QGeoProjection, for the coordinate <-> screen projection + conversion, removing it from QGeoTiledMapScene. + - Moved CacheAreas enum from QGeoFileTileCache into QAbstractGeoTileCache. + - Map.zoomLevel now always refers to a normalized tile size of 256x256 pixels. + Conversions to/from different tile sizes are performed internally by QGeoMap. + - Added clipping support to Clip2Tri 3rd party library through clipper, to protect Qt from + clipper invocations that throw. + - Updated clipper lib to version 6.4. + - QGeoProjectionWebMercator now uses a projection matrix to project to item position. + - [QTBUG-58124] Fixed a bug on destruction of the OSM plugin causing segfault. + - Added rotation, tilt and field of view properties to QDeclarativeGeoMap. + - Changed map items to be always positioned/wrapped based on their geo left bound. + - Changed the Map items opacity ramp values from 2.0 -> 3.0 to 1.5 -> 2.5. + - QDeclarativeGeoMap::setVisibleRegion now handles QGeoPath as well. + - Map Items geo data is now managed by a contained QGeoShape, which also handles geographical + transformations such as translations. + - Moved the declarative implementation from imports/ into location/declarativemaps and + location/declarativeplaces, privately exporting the classes. + - QQuickGeoMapGestureArea now correctly works with tilted/rotated maps. + - Added two new gestures to QQuickGeoMapGestureArea, two fingers rotation and two fingers tilting. + - Added the infrastructure to allow a QGeoMap to be responsible for drawing map items. + - Added a new QML type, MapCopyrightNotice, backed by the now exposed QDeclarativeGeoMapCopyrightNotice. + - MapCopyrightNotice can now be styled using CSS. + - Added a new plugin, MapboxGL, based on the mapbox-gl-native 3rd party library. + - The MapboxGL plugin now ships with a built-in development token. + - Added a new QML type, MapItemGroup, to group multiple map items in a new meta map item. + - Added the new mapItemOpacity method to QGeoMapItemBase, to account for the opacity of a MapItemGroup too. + - Added the new fitViewportToVisibleMapItems method to QDeclarativeGeoMap. + - Adapted mapviewer example to enable changing tilting/rotation/FoV. + - QGeoTiledMap now uses anisotropic filtering when available. + - Unblacklisted some previously blacklisted autotests now fixed in qtdeclarative. + - Blacklisted flick autotests on windows due to platform-induced flakiness. + - Added support to the MapboxGL plugin to natively renders map polylines, polygons and rectangles. + - Added support to the MapboxGL plugin to render both via FBO and via QSGRenderNode. + - QGeoCameraCapabilities are now specific to a QGeoMapType, and not any longer fixed to a plugin. + - DevicePixelRatio is now considered before enabling mipmapping so that mipmapping remains off if + tiles do not need to be minificated. + - Changed QGeoTiledMap default FoV from 90 to 45 degrees. + - [QTBUG-59417] Fixed QGeoTiledMapScene viewing frustum calculation. + - Added a new mapReady signal to QDeclarativeGeoMap to notify when the map becomes ready. + - Added ICU support to MapboxGL plugin, depending on its availability. + - [QTBUG-58821] Removed dependency on QtWidgets. + - Added a new plugin, itemsoverlay, to provide a transparent canvas to add only map items. + - MapQuickItem now correctly tilts and rotates when the zoomLevel property is set. + - [QTBUG-59259] Increased QGeoCoordinate debug operator precision. + - Improved the mapviewer example, also using QtQuick.Controls2 sliders. + - QtPositioning now also compiler-optimized when building in release. + - [QTBUG-59503] Flick autotests skipped on windows. + - [QTBUG-59479] Mercator-projected qgeocoordinates in map items are now cached. + - Removed pathPropertyChanged() from Polyline,Polygon. + - [QTBUG-23659] Enabled overzooming tiles in qgeotiledmapscene. + - [QTBUG-59416] keepTouchGrab now considered when handing mouse events in QDeclarativeGeoMap. + - Tile formats now proactively converted to ARGB32_Premultiplied. + - Added possibility to disable prefetching. + - Added parameter to control prefetching in tile-based geoservice plugins. + - Disabled warnings in third-party code. + - Improved flicking behavior of QQuickGeoMapGestureArea. + - [QTBUG-60021] Map update now triggered after initialization. + - QGeoMap pointers now protected with QPointer. + - QtLocation now marked as warning-free. + - [QTBUG-58801] Fixed copyright notice not showing before map type is changed. + - Added overzoomEnabled to QGeoCameraCapabilities. + - Various fixes for building with various QtLite configurations. + - QGeoTileFetcher::handleReply now virtual. + - [QTBUG-60266] declarative_ui autotests disabled for boot2qt. + + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +iOS +--- + + - [QTBUG-52014][QTBUG-59275] Allow background updates if such capability + is present in infoDict. + + +WinRT +----- + + - [QTBUG-57288] Remove support for WinRT 8.1 and Windows Phone 8.1. + - [QTBUG-60299] Added error handling for GeoPositionInfoSource creation. + + +Android +------- + + - [QTBUG-59010] Added guard against unprotected javaVM pointer usage. + - [QTBUG-59158] UTC flag for Android position timestamps now set. diff --git a/dist/changes-5.9.1 b/dist/changes-5.9.1 new file mode 100644 index 0000000..58b4ac7 --- /dev/null +++ b/dist/changes-5.9.1 @@ -0,0 +1,43 @@ +Qt 5.9.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Library * +**************************************************************************** + + - [QTBUG-60007] Fixed plugin resources not loading on static builds + - [QTBUG-60881] Fixed building on configurations without OpenGL + - Fixed an incorrect condition in QDeclarativeGeoMap::geometryChanged() + causing a crash in some scenarios + - MapItems can now be set to render under specific style layers with the + MapboxGL plugin + - [QTBUG-60821] Added detailed 3rd party attributions for the 3rd party + mapbox-gl-native library + - [QTBUG-61070] MapQuickItem's setCoordinate now checks for coordinate's + validity. + - [QTBUG-61087] OpenGL is now a requirement to build the MapboxGL plugin + - LocationSingleton now allows to create a qgeopath from a list of coordinates, + and not only empty qgeopaths + - Updated QtLocation qmltypes + - [QTBUG-61266] Updated QtPositioning qmltypes, adding 5.9 version + - [QTBUG-57690] Fixed Map.visibleRegion in the case that all the map is visible + - Various documentation fixes + - The MapboxGL plugin now uses the MapItem's objectName (if present) when creating + a mapbox layer name for it + diff --git a/dist/changes-5.9.2 b/dist/changes-5.9.2 new file mode 100644 index 0000000..ac6321d --- /dev/null +++ b/dist/changes-5.9.2 @@ -0,0 +1,56 @@ +Qt 5.9.2 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.9.2 Changes * +**************************************************************************** + +QtLocation +---------- + - [QTBUG-61070] mapQuickItems aren't drawn any longer if coordinate is invalid + - [QTBUG-61813] Fixed Map.toCoordinate always clamping y values to 0 + - [QTBUG-61727] Fixed dragging items out of map bounds + - [QTBUG-62098] Fixed plugins build dependency + - [QTBUG-62122] Fixed potential memleak on QDeclarativeGeoMap destruction + - [QTBUG-62154] Fixed MapCircle artifacts with small radiuses + - Restored usage of setProperty on Map.fitViewportToGeoShape + - [QTBUG-57690] Fixed visible region computation in QGeoProjectionWebMercator + - Fixed QDeclarativeGeoMap::populateMap duplicating items + - Fixed GeocodeModel not autoUpdating if plugin attaches late + - [QTBUG-62075] Fixed PluginParameter not working with script as property values + - Added a configure feature for each geoservice plugin + - Fixed file tile cache not honoring disk cache size of 0 + - [QTBUG-63124] Fixed wrong clipper dependency due to incorrect qmake syntax + - [QTBUG-63251] Fixed Map.fromCoordinate returning wrong values during tilting + + - OSM + * [QTBUG-61637] Fixed OSM plugin not working with providersrepository.disabled = true + * [QTBUG-63033] Fixed disabling redirection for providers that have no local fallback + + - MapboxGL: + * [QTBUG-61442] Fixed MapParameter dynamic usage + * [QTBUG-62454] Bumped Mapbox GL to v1.1.0 to prevent a crash + * [QTBUG-62861] Fixed broken native text rendering with Mapbox GL plugin + * [QTBUG-58869] Fixed Mapbox GL not rendering circles natively + * Fixed Mapbox GL plugin not respecting MapItem visibility and opacity + + +QtPositioning +------------- + - [QTBUG-62778] Fixed PositionSource never turning active on Android in some cases diff --git a/dist/changes-5.9.3 b/dist/changes-5.9.3 new file mode 100644 index 0000000..98a9b30 --- /dev/null +++ b/dist/changes-5.9.3 @@ -0,0 +1,41 @@ +Qt 5.9.3 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.9.3 Changes * +**************************************************************************** + +QtLocation +---------- + + - [QTBUG-63374] Fixed MapBoxGL crashing when no OpenGLContext can be created + - Updated all FDL and BSD license header throughout the module + - [QTBUG-62417] Forced MapBoxGL to only build on Windows when Qt is build + with Angle + - [QTBUG-63926] Added check to MapBoxGL handling corner cases of Polygon + placement + - [QTBUG-63928] Fixed missing consideration of alpha channel when + setting DeclarativeRectangleMapItem opacity. + +QtPositioning +------------- + + - Updated all FDL and BSD license header throughout the module + - Added missing null check to Android positioning plug-in + diff --git a/dist/changes-5.9.4 b/dist/changes-5.9.4 new file mode 100644 index 0000000..6393129 --- /dev/null +++ b/dist/changes-5.9.4 @@ -0,0 +1,31 @@ +Qt 5.9.4 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.0. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.9.4 Changes * +**************************************************************************** + +QtLocation +---------- + + - [QTBUG-63013] Upgraded Mapbox GL to fix SQLite query binding. + - [QTBUG-58589] Added plugin dependencies to the mapviewer example. + - [QTBUG-64632] Upgraded Mapbox GL to fix remove GLES limitations on Windows. + This upgrade also fixed building Mapbox GL with MinGW. + - [QTBUG-57147] Fixed license headers. diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 0000000..488b9a2 --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +qt_examples_build_begin(EXTERNAL_BUILD) + +if(TARGET Qt::Positioning) + add_subdirectory(positioning) +endif() + +qt_examples_build_end() diff --git a/examples/examples.pro b/examples/examples.pro new file mode 100644 index 0000000..ba3715c --- /dev/null +++ b/examples/examples.pro @@ -0,0 +1,5 @@ +TEMPLATE = subdirs + +qtHaveModule(positioning) { + SUBDIRS += positioning +} diff --git a/examples/positioning/CMakeLists.txt b/examples/positioning/CMakeLists.txt new file mode 100644 index 0000000..5949f00 --- /dev/null +++ b/examples/positioning/CMakeLists.txt @@ -0,0 +1,13 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +if(TARGET Qt::Widgets) + qt_internal_add_example(logfilepositionsource) +endif() +if(TARGET Qt::Quick AND TARGET Qt::Svg) + qt_internal_add_example(satelliteinfo) +endif() +if(TARGET Qt::Network AND TARGET Qt::Quick) + qt_internal_add_example(weatherinfo) + set_target_properties(weatherinfo PROPERTIES UNITY_BUILD OFF) +endif() diff --git a/examples/positioning/logfilepositionsource/CMakeLists.txt b/examples/positioning/logfilepositionsource/CMakeLists.txt new file mode 100644 index 0000000..9ffaa4b --- /dev/null +++ b/examples/positioning/logfilepositionsource/CMakeLists.txt @@ -0,0 +1,50 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) +project(logfilepositionsource LANGUAGES CXX) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/positioning/logfilepositionsource") + +find_package(Qt6 REQUIRED COMPONENTS Core Positioning Widgets) + +qt_standard_project_setup() + +qt_add_executable(logfilepositionsource + clientapplication.cpp clientapplication.h + logfilepositionsource.cpp logfilepositionsource.h + main.cpp +) + +set_target_properties(logfilepositionsource PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) + +target_link_libraries(logfilepositionsource PRIVATE + Qt::Core + Qt::Positioning + Qt::Widgets +) + +# Resources: +set(logfile_resource_files + "simplelog.txt" +) + +qt_add_resources(logfilepositionsource "logfile" + PREFIX + "/" + FILES + ${logfile_resource_files} +) + +install(TARGETS logfilepositionsource + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/examples/positioning/logfilepositionsource/clientapplication.cpp b/examples/positioning/logfilepositionsource/clientapplication.cpp new file mode 100644 index 0000000..e6885ce --- /dev/null +++ b/examples/positioning/logfilepositionsource/clientapplication.cpp @@ -0,0 +1,28 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "clientapplication.h" +#include "logfilepositionsource.h" + +#include + +ClientApplication::ClientApplication(QWidget *parent) + : QMainWindow(parent) +{ + resize(700, 525); + + textEdit = new QTextEdit; + setCentralWidget(textEdit); + + LogFilePositionSource *source = new LogFilePositionSource(this); + connect(source, &LogFilePositionSource::positionUpdated, + this, &ClientApplication::positionUpdated); + + source->startUpdates(); +} + +void ClientApplication::positionUpdated(const QGeoPositionInfo &info) +{ + textEdit->append(tr("Position updated: Date/time = %1, Coordinate = %2"). + arg(info.timestamp().toString(), info.coordinate().toString())); +} diff --git a/examples/positioning/logfilepositionsource/clientapplication.h b/examples/positioning/logfilepositionsource/clientapplication.h new file mode 100644 index 0000000..c9e2ab6 --- /dev/null +++ b/examples/positioning/logfilepositionsource/clientapplication.h @@ -0,0 +1,27 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause +#ifndef CLIENTAPPLICATION_H +#define CLIENTAPPLICATION_H + +#include + +QT_BEGIN_NAMESPACE +class QGeoPositionInfo; +class QTextEdit; +QT_END_NAMESPACE + +class ClientApplication : public QMainWindow +{ + Q_OBJECT +public: + ClientApplication(QWidget *parent = 0); + +private slots: + void positionUpdated(const QGeoPositionInfo &info); + +private: + QTextEdit *textEdit; +}; + + +#endif diff --git a/examples/positioning/logfilepositionsource/doc/src/logfilepositionsource.qdoc b/examples/positioning/logfilepositionsource/doc/src/logfilepositionsource.qdoc new file mode 100644 index 0000000..76f3f92 --- /dev/null +++ b/examples/positioning/logfilepositionsource/doc/src/logfilepositionsource.qdoc @@ -0,0 +1,71 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! +\example logfilepositionsource +\title Log File Position Source (C++) +\ingroup qtpositioning-examples +\examplecategory {Positioning & Location} + +\brief Logfile Position Source shows how to create and work with a custom + position source. It can be useful for simulating GPS data, or when the + data is received in some custom format. + +\include examples-run.qdocinc + +\section1 Creating custom Position Source + +In this example, the data is read from a text file, \e simplelog.txt. The file +specifies position data using a simple text format: it contains one position +update per line, where each line contains a date/time, a latitude and a +longitude, separated by spaces. The date/time is in ISO 8601 format and the +latitude and longitude are in degrees decimal format. +Here is an excerpt from \e simplelog.txt: + +\code +2009-08-24T22:25:01 -27.576082 153.092415 +2009-08-24T22:25:02 -27.576223 153.092530 +2009-08-24T22:25:03 -27.576364 153.092648 +\endcode + +We create a custom \c LogFilePositionSource class, which derives from +\l QGeoPositionInfoSource. It reads position data from the file and distributes +it via the \l {QGeoPositionInfoSource::}{positionUpdated()} signal. + +The resulting time and position information is then displayed on the screen as +simple text in date/time and latitude/longitude format. + +Here is the definition of the \c LogFilePositionSource class: + +\quotefromfile logfilepositionsource/logfilepositionsource.h +\skipto class LogFilePositionSource +\printuntil }; + +The main methods overrided by the subclass are: + +\list + \li \l{QGeoPositionInfoSource::startUpdates()}{startUpdates()}: called by client applications + to start regular position updates. + \li \l{QGeoPositionInfoSource::stopUpdates()}{stopUpdates()}: called by client applications to + stop regular position updates. + \li \l{QGeoPositionInfoSource::requestUpdate()}{requestUpdate()}: called by client applications + to request a single update, with a specified timeout. +\endlist + +When a position update is available, the subclass emits the +\l{QGeoPositionInfoSource::positionUpdated()}{positionUpdated()} signal. + +Here are the key methods in the class implementation: + +\quotefromfile logfilepositionsource/logfilepositionsource.cpp +\skipto LogFilePositionSource::LogFilePositionSource +\printuntil /^\}/ +\skipto LogFilePositionSource::startUpdates +\printuntil /^\}/ +\skipto LogFilePositionSource::stopUpdates +\printuntil /^\}/ +\skipto LogFilePositionSource::requestUpdate +\printuntil /^\}/ +\printuntil LogFilePositionSource::readNextPosition +\printuntil /^\}/ +*/ diff --git a/examples/positioning/logfilepositionsource/logfile.qrc b/examples/positioning/logfilepositionsource/logfile.qrc new file mode 100644 index 0000000..6121394 --- /dev/null +++ b/examples/positioning/logfilepositionsource/logfile.qrc @@ -0,0 +1,5 @@ + + + simplelog.txt + + diff --git a/examples/positioning/logfilepositionsource/logfilepositionsource.cpp b/examples/positioning/logfilepositionsource/logfilepositionsource.cpp new file mode 100644 index 0000000..eab67f7 --- /dev/null +++ b/examples/positioning/logfilepositionsource/logfilepositionsource.cpp @@ -0,0 +1,92 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "logfilepositionsource.h" + +#include +#include +#include + +LogFilePositionSource::LogFilePositionSource(QObject *parent) + : QGeoPositionInfoSource(parent), + logFile(new QFile(this)), + timer(new QTimer(this)) +{ + connect(timer, &QTimer::timeout, this, &LogFilePositionSource::readNextPosition); + + logFile->setFileName(":/simplelog.txt"); + if (!logFile->open(QIODevice::ReadOnly)) + qWarning() << "Error: cannot open source file" << logFile->fileName(); +} + +QGeoPositionInfo LogFilePositionSource::lastKnownPosition(bool /*satelliteMethodsOnly*/) const +{ + return lastPosition; +} + +LogFilePositionSource::PositioningMethods LogFilePositionSource::supportedPositioningMethods() const +{ + return AllPositioningMethods; +} + +int LogFilePositionSource::minimumUpdateInterval() const +{ + return 500; +} + +void LogFilePositionSource::startUpdates() +{ + lastError = QGeoPositionInfoSource::NoError; + int interval = updateInterval(); + if (interval < minimumUpdateInterval()) + interval = minimumUpdateInterval(); + + timer->start(interval); +} + +void LogFilePositionSource::stopUpdates() +{ + timer->stop(); +} + +void LogFilePositionSource::requestUpdate(int /*timeout*/) +{ + // For simplicity, ignore timeout - assume that if data is not available + // now, no data will be added to the file later + lastError = QGeoPositionInfoSource::NoError; + if (logFile->canReadLine()) { + readNextPosition(); + } else { + lastError = QGeoPositionInfoSource::UpdateTimeoutError; + emit QGeoPositionInfoSource::errorOccurred(lastError); + } +} + +void LogFilePositionSource::readNextPosition() +{ + QByteArray line = logFile->readLine().trimmed(); + if (!line.isEmpty()) { + QList data = line.split(' '); + double latitude; + double longitude; + bool hasLatitude = false; + bool hasLongitude = false; + QDateTime timestamp = QDateTime::fromString(QString(data.value(0)), Qt::ISODate); + latitude = data.value(1).toDouble(&hasLatitude); + longitude = data.value(2).toDouble(&hasLongitude); + + if (hasLatitude && hasLongitude && timestamp.isValid()) { + QGeoCoordinate coordinate(latitude, longitude); + QGeoPositionInfo info(coordinate, timestamp); + if (info.isValid()) { + lastPosition = info; + emit positionUpdated(info); + } + } + } +} + +QGeoPositionInfoSource::Error LogFilePositionSource::error() const +{ + return lastError; +} diff --git a/examples/positioning/logfilepositionsource/logfilepositionsource.h b/examples/positioning/logfilepositionsource/logfilepositionsource.h new file mode 100644 index 0000000..6280511 --- /dev/null +++ b/examples/positioning/logfilepositionsource/logfilepositionsource.h @@ -0,0 +1,41 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause +#ifndef LOGFILEPOSITIONSOURCE_H +#define LOGFILEPOSITIONSOURCE_H + +#include + +QT_BEGIN_NAMESPACE +class QFile; +class QTimer; +QT_END_NAMESPACE + +class LogFilePositionSource : public QGeoPositionInfoSource +{ + Q_OBJECT +public: + LogFilePositionSource(QObject *parent = 0); + + QGeoPositionInfo lastKnownPosition(bool satelliteMethodsOnly = false) const override; + + PositioningMethods supportedPositioningMethods() const override; + int minimumUpdateInterval() const override; + Error error() const override; + +public slots: + virtual void startUpdates() override; + virtual void stopUpdates() override; + + virtual void requestUpdate(int timeout = 5000) override; + +private slots: + void readNextPosition(); + +private: + QFile *logFile; + QTimer *timer; + QGeoPositionInfo lastPosition; + Error lastError = QGeoPositionInfoSource::NoError; +}; + +#endif diff --git a/examples/positioning/logfilepositionsource/logfilepositionsource.pro b/examples/positioning/logfilepositionsource/logfilepositionsource.pro new file mode 100644 index 0000000..cb9e30a --- /dev/null +++ b/examples/positioning/logfilepositionsource/logfilepositionsource.pro @@ -0,0 +1,16 @@ +TEMPLATE = app +TARGET = logfilepositionsource +QT = positioning core widgets + + +HEADERS = logfilepositionsource.h \ + clientapplication.h +SOURCES = logfilepositionsource.cpp \ + clientapplication.cpp \ + main.cpp + +RESOURCES += \ + logfile.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/positioning/logfilepositionsource +INSTALLS += target diff --git a/examples/positioning/logfilepositionsource/main.cpp b/examples/positioning/logfilepositionsource/main.cpp new file mode 100644 index 0000000..17e08cb --- /dev/null +++ b/examples/positioning/logfilepositionsource/main.cpp @@ -0,0 +1,15 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause +#include + +#include "clientapplication.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + ClientApplication client; + client.show(); + + return app.exec(); +} diff --git a/examples/positioning/logfilepositionsource/simplelog.txt b/examples/positioning/logfilepositionsource/simplelog.txt new file mode 100644 index 0000000..d016b2a --- /dev/null +++ b/examples/positioning/logfilepositionsource/simplelog.txt @@ -0,0 +1,156 @@ +2009-08-24T22:24:37 -27.572321 153.090718 +2009-08-24T22:24:38 -27.572470 153.090783 +2009-08-24T22:24:39 -27.572616 153.090845 +2009-08-24T22:24:40 -27.572763 153.090908 +2009-08-24T22:24:41 -27.572914 153.090971 +2009-08-24T22:24:42 -27.573068 153.091036 +2009-08-24T22:24:43 -27.573224 153.091102 +2009-08-24T22:24:44 -27.573383 153.091167 +2009-08-24T22:24:45 -27.573541 153.091232 +2009-08-24T22:24:46 -27.573700 153.091298 +2009-08-24T22:24:47 -27.573860 153.091366 +2009-08-24T22:24:48 -27.574019 153.091435 +2009-08-24T22:24:49 -27.574178 153.091507 +2009-08-24T22:24:50 -27.574340 153.091581 +2009-08-24T22:24:51 -27.574506 153.091654 +2009-08-24T22:24:52 -27.574670 153.091729 +2009-08-24T22:24:53 -27.574836 153.091800 +2009-08-24T22:24:54 -27.575001 153.091870 +2009-08-24T22:24:55 -27.575165 153.091940 +2009-08-24T22:24:56 -27.575327 153.092010 +2009-08-24T22:24:57 -27.575485 153.092078 +2009-08-24T22:24:58 -27.575641 153.092144 +2009-08-24T22:24:59 -27.575795 153.092218 +2009-08-24T22:25:00 -27.575942 153.092308 +2009-08-24T22:25:01 -27.576082 153.092415 +2009-08-24T22:25:02 -27.576223 153.092530 +2009-08-24T22:25:03 -27.576364 153.092648 +2009-08-24T22:25:04 -27.576505 153.092763 +2009-08-24T22:25:05 -27.576646 153.092879 +2009-08-24T22:25:06 -27.576784 153.092990 +2009-08-24T22:25:07 -27.576918 153.093099 +2009-08-24T22:25:08 -27.577046 153.093204 +2009-08-24T22:25:09 -27.577168 153.093303 +2009-08-24T22:25:10 -27.577284 153.093396 +2009-08-24T22:25:11 -27.577396 153.093484 +2009-08-24T22:25:12 -27.577499 153.093568 +2009-08-24T22:25:13 -27.577595 153.093647 +2009-08-24T22:25:14 -27.577692 153.093727 +2009-08-24T22:25:15 -27.577793 153.093810 +2009-08-24T22:25:16 -27.577897 153.093896 +2009-08-24T22:25:17 -27.578006 153.093984 +2009-08-24T22:25:18 -27.578120 153.094074 +2009-08-24T22:25:19 -27.578237 153.094168 +2009-08-24T22:25:20 -27.578360 153.094267 +2009-08-24T22:25:21 -27.578487 153.094370 +2009-08-24T22:25:22 -27.578617 153.094474 +2009-08-24T22:25:23 -27.578748 153.094581 +2009-08-24T22:25:24 -27.578880 153.094688 +2009-08-24T22:25:25 -27.579014 153.094796 +2009-08-24T22:25:26 -27.579149 153.094905 +2009-08-24T22:25:27 -27.579285 153.095012 +2009-08-24T22:25:28 -27.579420 153.095121 +2009-08-24T22:25:29 -27.579552 153.095231 +2009-08-24T22:25:30 -27.579684 153.095340 +2009-08-24T22:25:31 -27.579820 153.095449 +2009-08-24T22:25:32 -27.579956 153.095558 +2009-08-24T22:25:33 -27.580095 153.095667 +2009-08-24T22:25:34 -27.580240 153.095776 +2009-08-24T22:25:35 -27.580392 153.095885 +2009-08-24T22:25:36 -27.580536 153.095995 +2009-08-24T22:25:37 -27.580679 153.096109 +2009-08-24T22:25:38 -27.580824 153.096226 +2009-08-24T22:25:39 -27.580965 153.096337 +2009-08-24T22:25:40 -27.581101 153.096441 +2009-08-24T22:25:41 -27.581237 153.096537 +2009-08-24T22:25:42 -27.581356 153.096628 +2009-08-24T22:25:43 -27.581466 153.096714 +2009-08-24T22:25:44 -27.581555 153.096795 +2009-08-24T22:25:45 -27.581606 153.096847 +2009-08-24T22:25:46 -27.581539 153.096855 +2009-08-24T22:25:47 -27.581572 153.096873 +2009-08-24T22:25:48 -27.581579 153.096875 +2009-08-24T22:25:49 -27.581582 153.096878 +2009-08-24T22:25:50 -27.581588 153.096880 +2009-08-24T22:25:51 -27.581588 153.096880 +2009-08-24T22:25:52 -27.581592 153.096881 +2009-08-24T22:25:53 -27.581596 153.096882 +2009-08-24T22:25:54 -27.581599 153.096883 +2009-08-24T22:25:55 -27.581601 153.096883 +2009-08-24T22:25:56 -27.581602 153.096883 +2009-08-24T22:25:57 -27.581606 153.096890 +2009-08-24T22:25:58 -27.581606 153.096919 +2009-08-24T22:25:59 -27.581605 153.096985 +2009-08-24T22:26:00 -27.581573 153.097060 +2009-08-24T22:26:01 -27.581532 153.097142 +2009-08-24T22:26:02 -27.581484 153.097227 +2009-08-24T22:26:03 -27.581426 153.097324 +2009-08-24T22:26:04 -27.581373 153.097424 +2009-08-24T22:26:05 -27.581320 153.097530 +2009-08-24T22:26:06 -27.581265 153.097641 +2009-08-24T22:26:07 -27.581203 153.097757 +2009-08-24T22:26:08 -27.581144 153.097875 +2009-08-24T22:26:09 -27.581093 153.097995 +2009-08-24T22:26:10 -27.581042 153.098116 +2009-08-24T22:26:11 -27.580987 153.098231 +2009-08-24T22:26:12 -27.580919 153.098334 +2009-08-24T22:26:13 -27.580841 153.098428 +2009-08-24T22:26:14 -27.580754 153.098511 +2009-08-24T22:26:15 -27.580667 153.098591 +2009-08-24T22:26:16 -27.580581 153.098671 +2009-08-24T22:26:17 -27.580492 153.098751 +2009-08-24T22:26:18 -27.580401 153.098832 +2009-08-24T22:26:19 -27.580311 153.098914 +2009-08-24T22:26:20 -27.580224 153.098996 +2009-08-24T22:26:21 -27.580140 153.099078 +2009-08-24T22:26:22 -27.580059 153.099159 +2009-08-24T22:26:23 -27.579980 153.099245 +2009-08-24T22:26:24 -27.579900 153.099336 +2009-08-24T22:26:25 -27.579826 153.099433 +2009-08-24T22:26:26 -27.579753 153.099529 +2009-08-24T22:26:27 -27.579680 153.099623 +2009-08-24T22:26:28 -27.579606 153.099716 +2009-08-24T22:26:29 -27.579538 153.099808 +2009-08-24T22:26:30 -27.579477 153.099893 +2009-08-24T22:26:31 -27.579416 153.099968 +2009-08-24T22:26:32 -27.579393 153.100027 +2009-08-24T22:26:33 -27.579376 153.100092 +2009-08-24T22:26:34 -27.579384 153.100142 +2009-08-24T22:26:35 -27.579403 153.100181 +2009-08-24T22:26:36 -27.579429 153.100210 +2009-08-24T22:26:37 -27.579460 153.100237 +2009-08-24T22:26:38 -27.579493 153.100265 +2009-08-24T22:26:39 -27.579518 153.100291 +2009-08-24T22:26:40 -27.579536 153.100336 +2009-08-24T22:26:41 -27.579591 153.100358 +2009-08-24T22:26:42 -27.579618 153.100383 +2009-08-24T22:26:43 -27.579639 153.100404 +2009-08-24T22:26:44 -27.579650 153.100420 +2009-08-24T22:26:45 -27.579665 153.100432 +2009-08-24T22:26:46 -27.579679 153.100442 +2009-08-24T22:26:47 -27.579690 153.100451 +2009-08-24T22:26:48 -27.579697 153.100459 +2009-08-24T22:26:49 -27.579700 153.100462 +2009-08-24T22:26:50 -27.579699 153.100464 +2009-08-24T22:26:51 -27.579699 153.100466 +2009-08-24T22:26:52 -27.579700 153.100466 +2009-08-24T22:26:53 -27.579704 153.100466 +2009-08-24T22:26:54 -27.579705 153.100465 +2009-08-24T22:26:55 -27.579708 153.100468 +2009-08-24T22:26:56 -27.579712 153.100471 +2009-08-24T22:26:57 -27.579719 153.100476 +2009-08-24T22:26:58 -27.579728 153.100485 +2009-08-24T22:26:59 -27.579744 153.100493 +2009-08-24T22:27:00 -27.579759 153.100496 +2009-08-24T22:27:01 -27.579780 153.100481 +2009-08-24T22:27:02 -27.579788 153.100462 +2009-08-24T22:27:03 -27.579791 153.100436 +2009-08-24T22:27:04 -27.579788 153.100426 +2009-08-24T22:27:05 -27.579783 153.100409 +2009-08-24T22:27:06 -27.579781 153.100390 +2009-08-24T22:27:07 -27.579780 153.100375 +2009-08-24T22:27:08 -27.579779 153.100364 +2009-08-24T22:27:09 -27.579778 153.100354 +2009-08-24T22:27:10 -27.579777 153.100347 +2009-08-24T22:27:11 -27.579777 153.100341 +2009-08-24T22:27:12 -27.579776 153.100336 diff --git a/examples/positioning/positioning.pro b/examples/positioning/positioning.pro new file mode 100644 index 0000000..7eb3b6a --- /dev/null +++ b/examples/positioning/positioning.pro @@ -0,0 +1,8 @@ +TEMPLATE = subdirs + +qtHaveModule(widgets): SUBDIRS += logfilepositionsource +qtHaveModule(quick) { + SUBDIRS += satelliteinfo + + qtHaveModule(network): SUBDIRS += weatherinfo +} diff --git a/examples/positioning/satelliteinfo/ApplicationScreen.qml b/examples/positioning/satelliteinfo/ApplicationScreen.qml new file mode 100644 index 0000000..3d29635 --- /dev/null +++ b/examples/positioning/satelliteinfo/ApplicationScreen.qml @@ -0,0 +1,273 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtPositioning +import QtQuick +import QtQuick.Controls.Basic as QC +import QtQuick.Layouts + +import SatelliteInformation + +Rectangle { + id: root + + required property SatelliteModel satellitesModel + required property SortFilterModel sortFilterModel + property color inUseColor: Theme.inUseColor + property color inViewColor: Theme.inViewColor + + property bool simulation: false + + color: Theme.darkBackgroundColor + + function toggleState() { + switch (statesItem.state) { + case "stopped": + statesItem.state = "single" + break + case "single": + statesItem.state = "running" + break + case "running": + statesItem.state = "stopped" + break + } + } + + function updateActive(state) { + satelliteSource.active = state + positionSource.active = state + } + + function enterSingle() { + updateActive(false) + satelliteSource.update() + positionSource.update() + } + + //! [0] + SatelliteSource { + id: satelliteSource + name: root.simulation ? "nmea" : "" + //! [0] + PluginParameter { + name: "nmea.source" + value: "qrc:///nmealog.txt" + } + //! [1] + onSatellitesInViewChanged: root.satellitesModel.updateSatellitesInView(satellitesInView) + onSatellitesInUseChanged: root.satellitesModel.updateSatellitesInUse(satellitesInUse) + //! [1] + onSourceErrorChanged: { + if (sourceError !== SatelliteSource.NoError) { + // If the positionSource is in simulation mode, switch the + // whole app into this mode. Otherwise show an error. + if (positionSource.name !== "nmea") { + applicationHeader.statusString = + qsTr("SatelliteSource Error: %1").arg(sourceError) + applicationHeader.redStatus = true + } else { + root.simulation = true + active = true + } + } + } + //! [2] + } + //! [2] + + //! [3] + PositionSource { + id: positionSource + name: root.simulation ? "nmea" : "" + //! [3] + PluginParameter { + name: "nmea.source" + value: "qrc:///nmealog.txt" + } + //! [4] + onPositionChanged: { + let posData = position.coordinate.toString().split(", ") + positionBox.latitudeString = posData[0] + positionBox.longitudeString = posData[1] + } + // ![4] + onSourceErrorChanged: { + if (sourceError !== PositionSource.NoError) { + // If the satelliteSource is in simulation mode, switch the + // whole app into this mode. Otherwise show an error. + if (satelliteSource.name !== "nmea") { + applicationHeader.statusString = + qsTr("PositionSource Error: %1").arg(sourceError) + applicationHeader.redStatus = true + } else { + root.simulation = true + active = true + } + } + } + //! [5] + } + //! [5] + + Header { + id: applicationHeader + width: parent.width + anchors.top: parent.top + simulation: root.simulation + } + + StackLayout { + id: viewsLayout + width: parent.width + anchors { + top: applicationHeader.bottom + bottom: positionBox.top + } + currentIndex: navigationTab.currentIndex !== navigationTab.settingsIndex + ? navigationTab.currentIndex : currentIndex + SkyView { + satellitesModel: root.satellitesModel + inViewColor: root.inViewColor + inUseColor: root.inUseColor + } + SatelliteView { + sortFilterModel: root.sortFilterModel + inViewColor: root.inViewColor + inUseColor: root.inUseColor + } + RssiView { + satellitesModel: root.satellitesModel + inViewColor: root.inViewColor + inUseColor: root.inUseColor + } + } + + PositionBox { + id: positionBox + width: parent.width + anchors.bottom: modeButton.top + visible: viewsLayout.currentIndex !== navigationTab.tableViewIndex + height: visible ? implicitHeight : 0 + } + + Button { + id: modeButton + anchors { + horizontalCenter: parent.horizontalCenter + bottom: separator.top + bottomMargin: Theme.defaultSpacing + } + width: parent.width * 0.8 + onClicked: root.toggleState() + } + + Rectangle { + id: separator + anchors.bottom: navigationTab.top + color: Theme.separatorColor + height: 1 + width: parent.width + } + + ViewSwitch { + id: navigationTab + anchors.bottom: parent.bottom + width: parent.width + onCurrentIndexChanged: { + if (currentIndex === navigationTab.settingsIndex) + settingsView.open() + else + settingsView.close() + } + } + + QC.Drawer { + id: settingsView + dragMargin: -1 + edge: Qt.RightEdge + height: root.height - navigationTab.height + width: root.width / 2 + onClosed: navigationTab.currentIndex = viewsLayout.currentIndex + + SettingsView { + anchors.fill: parent + onShowHelp: { + settingsView.close() + helpPopup.open() + } + onToggleMode: { + settingsView.close() + Theme.darkMode = !Theme.darkMode + } + } + } + + HelpPopup { + id: helpPopup + width: root.width + height: root.height + } + + Item { + id: statesItem + visible: false + state: "running" + states: [ + State { + name: "stopped" + PropertyChanges { + modeButton { + text: qsTr("Single") + redHover: false + } + } + PropertyChanges { + applicationHeader { + statusString: qsTr("Stopped") + redStatus: true + } + } + StateChangeScript { + script: root.updateActive(false) + } + }, + State { + name: "single" + PropertyChanges { + modeButton { + text: qsTr("Start") + redHover: false + } + } + PropertyChanges { + applicationHeader { + statusString: qsTr("Single Request") + redStatus: false + } + } + StateChangeScript { + script: root.enterSingle() + } + }, + State { + name: "running" + PropertyChanges { + modeButton { + text: qsTr("Stop") + redHover: true + } + } + PropertyChanges { + applicationHeader { + statusString: qsTr("Running") + redStatus: false + } + } + StateChangeScript { + script: root.updateActive(true) + } + } + ] + } +} diff --git a/examples/positioning/satelliteinfo/Button.qml b/examples/positioning/satelliteinfo/Button.qml new file mode 100644 index 0000000..19f6a77 --- /dev/null +++ b/examples/positioning/satelliteinfo/Button.qml @@ -0,0 +1,30 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls.Basic + +ItemDelegate { + id: root + + property bool redHover: false + readonly property color pressedColor: root.redHover ? Theme.buttonRedTextPressedColor + : Theme.buttonTextPressedColor + + contentItem: Text { + text: root.text + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + color: root.pressed ? root.pressedColor : Theme.buttonTextColor + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + background: Rectangle { + border { + width: 2 + color: root.pressed ? root.pressedColor : Theme.buttonTextColor + } + radius: 10 + color: Theme.buttonBackgroundColor + } +} diff --git a/examples/positioning/satelliteinfo/CMakeLists.txt b/examples/positioning/satelliteinfo/CMakeLists.txt new file mode 100644 index 0000000..d998017 --- /dev/null +++ b/examples/positioning/satelliteinfo/CMakeLists.txt @@ -0,0 +1,122 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) +project(satelliteinfo LANGUAGES CXX) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/positioning/satelliteinfo") + +find_package(Qt6 REQUIRED COMPONENTS Core Svg Quick PositioningQuick) +find_package(Qt6 OPTIONAL_COMPONENTS SerialPort) + +qt_standard_project_setup(REQUIRES 6.5) + +qt_add_executable(satelliteinfo + main.cpp +) + +set_target_properties(satelliteinfo PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE + MACOSX_BUNDLE_GUI_IDENTIFIER "io.qt.examples.satelliteinfo" +) + +target_link_libraries(satelliteinfo PRIVATE + Qt::Core + Qt::PositioningQuick + Qt::Quick + Qt::Svg +) + +# For mobile platforms we need to explicitly link with Qt::SerialPort +# to use NMEA plugin. The reason for such behavior is that, at least on Android, +# the plugin dependencies were not explicitly added to the list of deployment +# targets until Qt 6.5. +if(ANROID AND TARGET Qt::SerialPort) + target_link_libraries(satelliteinfo PRIVATE Qt::SerialPort) +endif() + +if (APPLE) + # Using absolute path for shared plist files is a Ninja bug workaround + get_filename_component(SHARED_PLIST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../shared ABSOLUTE) + if (IOS) + set_target_properties(satelliteinfo PROPERTIES + MACOSX_BUNDLE_INFO_PLIST "${SHARED_PLIST_DIR}/Info.cmake.ios.plist" + ) + else() + set_target_properties(satelliteinfo PROPERTIES + MACOSX_BUNDLE_INFO_PLIST "${SHARED_PLIST_DIR}/Info.cmake.macos.plist" + ) + endif() +endif() + +qt_add_resources(satelliteinfo "resources" + FILES + nmealog.txt + fonts/TitilliumWeb-Regular.ttf + fonts/TitilliumWeb-SemiBold.ttf +) + +set_source_files_properties(Theme.qml PROPERTIES + QT_QML_SINGLETON_TYPE TRUE +) + +qt_add_qml_module(satelliteinfo + URI SatelliteInformation + VERSION 1.0 + SOURCES + roles.h + satellitemodel.cpp satellitemodel.h + sortfiltermodel.cpp sortfiltermodel.h + QML_FILES + ApplicationScreen.qml + Button.qml + Header.qml + HelpPopup.qml + LegendBox.qml + Main.qml + RssiView.qml + PageButton.qml + PermissionsScreen.qml + PositionBox.qml + SatelliteView.qml + SettingsView.qml + SkyView.qml + Theme.qml + ViewSwitch.qml + RESOURCES + icons/checkbox.svg + icons/checkbox_blank.svg + icons/darkmode.svg + icons/filter.svg + icons/help.svg + icons/lightmode.svg + icons/place.svg + icons/qtlogo_green.png + icons/qtlogo_white.png + icons/rssiview.svg + icons/satellite_small.png + icons/satellite1.png + icons/satellite2.png + icons/search.svg + icons/settings.svg + icons/skyview.svg + icons/sort.svg + icons/tableview.svg +) + +install(TARGETS satelliteinfo + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) + +if(APPLE AND NOT CMAKE_GENERATOR STREQUAL "Xcode") + # Need to sign application for location permissions to work + add_custom_command(TARGET satelliteinfo + POST_BUILD COMMAND codesign -s - satelliteinfo.app) +endif() diff --git a/examples/positioning/satelliteinfo/Header.qml b/examples/positioning/satelliteinfo/Header.qml new file mode 100644 index 0000000..bd6341a --- /dev/null +++ b/examples/positioning/satelliteinfo/Header.qml @@ -0,0 +1,59 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Layouts + +Rectangle { + id: root + + property bool simulation: false + property string statusString + property bool redStatus: false + + color: Theme.backgroundColor + + implicitWidth: Math.max(applicationName.implicitWidth, + applicationMode.implicitWidth, + applicationStatus.implicitWidth) + + rootLayout.anchors.leftMargin + + rootLayout.anchors.rightMargin + implicitHeight: applicationName.implicitHeight + + applicationMode.implicitHeight + + applicationStatus.implicitHeight + + 2 * rootLayout.spacing + + rootLayout.anchors.topMargin + + rootLayout.anchors.bottomMargin + + ColumnLayout { + id: rootLayout + anchors.fill: parent + spacing: 0 + + + Text { + id: applicationName + text: qsTr("Satellite Info") + color: Theme.textMainColor + font.pixelSize: Theme.largeFontSize + font.weight: Theme.fontDefaultWeight + Layout.alignment: Qt.AlignHCenter + } + Text { + id: applicationMode + text: root.simulation ? qsTr("Simulation mode") : qsTr("Realtime mode") + color: Theme.textGrayColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontDefaultWeight + Layout.alignment: Qt.AlignHCenter + } + Text { + id: applicationStatus + text: root.statusString + color: root.redStatus ? Theme.redColor : Theme.greenColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + Layout.alignment: Qt.AlignHCenter + } + } +} diff --git a/examples/positioning/satelliteinfo/HelpPopup.qml b/examples/positioning/satelliteinfo/HelpPopup.qml new file mode 100644 index 0000000..a43b418 --- /dev/null +++ b/examples/positioning/satelliteinfo/HelpPopup.qml @@ -0,0 +1,61 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls.Basic as QC +import QtQuick.Layouts + +QC.Popup { + id: root + padding: 0 + Rectangle { + anchors.fill: parent + color: Theme.backgroundColor + ColumnLayout { + anchors.fill: parent + + Item { + implicitHeight: root.height * 0.1 + Layout.fillWidth: true + } + Image { + source: Theme.darkMode ? "icons/qtlogo_white.png" : "icons/qtlogo_green.png" + fillMode: Image.PreserveAspectFit + Layout.alignment: Qt.AlignHCenter + } + Text { + text: qsTr("Satellite Info") + color: Theme.textMainColor + font.pixelSize: Theme.largeFontSize + font.weight: Theme.fontDefaultWeight + Layout.alignment: Qt.AlignHCenter + } + Item { + implicitHeight: root.height * 0.05 + Layout.fillWidth: true + } + Text { + text: qsTr("Explore satellite information using the SkyView and\nRSSI View. ") + + qsTr("Track the satellites contributing to your\nGPS fix in real-time.") + horizontalAlignment: Text.AlignHCenter + color: Theme.textSecondaryColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontDefaultWeight + Layout.alignment: Qt.AlignHCenter + } + Item { + Layout.fillHeight: true + } + Button { + text: qsTr("Back to the Application") + implicitWidth: root.width * 0.8 + Layout.alignment: Qt.AlignHCenter + onClicked: root.close() + } + Item { + implicitHeight: root.height * 0.2 + Layout.fillWidth: true + } + } + } +} diff --git a/examples/positioning/satelliteinfo/LegendBox.qml b/examples/positioning/satelliteinfo/LegendBox.qml new file mode 100644 index 0000000..c5ba280 --- /dev/null +++ b/examples/positioning/satelliteinfo/LegendBox.qml @@ -0,0 +1,66 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Layouts + +Rectangle { + id: root + + radius: 8 + color: Theme.legendBackgroundColor + + implicitWidth: Math.max(inUseTxt.implicitWidth, inViewTxt.implicitWidth) + + rootLayout.columnSpacing + + Math.max(inUseIcon.width, inViewIcon.width) + + rootLayout.anchors.leftMargin + rootLayout.anchors.rightMargin + implicitHeight: inUseTxt.implicitHeight + inViewTxt.implicitHeight + + rootLayout.rowSpacing + + rootLayout.anchors.topMargin + rootLayout.anchors.bottomMargin + + GridLayout { + id: rootLayout + columns: 2 + anchors { + fill: parent + topMargin: Theme.defaultSpacing + bottomMargin: Theme.defaultSpacing + leftMargin: 2 * Theme.defaultSpacing + rightMargin: 2 * Theme.defaultSpacing + } + columnSpacing: Theme.defaultSpacing + rowSpacing: 0 + + Text { + id: inUseTxt + text: qsTr("In Use") + color: Theme.textMainColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + Layout.alignment: Qt.AlignRight + } + Rectangle { + id: inUseIcon + implicitHeight: inUseTxt.font.pixelSize + implicitWidth: implicitHeight + radius: height / 2 + color: Theme.inUseColor + } + + Text { + id: inViewTxt + text: qsTr("In View") + color: Theme.textMainColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + Layout.alignment: Qt.AlignRight + } + Rectangle { + id: inViewIcon + implicitHeight: inViewTxt.font.pixelSize + implicitWidth: implicitHeight + radius: height / 2 + color: Theme.inViewColor + } + } +} diff --git a/examples/positioning/satelliteinfo/Main.qml b/examples/positioning/satelliteinfo/Main.qml new file mode 100644 index 0000000..c790302 --- /dev/null +++ b/examples/positioning/satelliteinfo/Main.qml @@ -0,0 +1,48 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +pragma ComponentBehavior: Bound +import QtCore +import QtQuick +import QtQuick.Window +import SatelliteInformation + +Window { + id: root + + required property SatelliteModel satellitesModel + required property SortFilterModel sortFilterModel + + width: 360 + height: 640 + visible: true + title: qsTr("Satellite Info") + + + LocationPermission { + id: permission + accuracy: LocationPermission.Precise + availability: LocationPermission.WhenInUse + } + + PermissionsScreen { + anchors.fill: parent + visible: permission.status !== Qt.PermissionStatus.Granted + requestDenied: permission.status === Qt.PermissionStatus.Denied + onRequestPermission: permission.request() + } + + Component { + id: applicationComponent + ApplicationScreen { + satellitesModel: root.satellitesModel + sortFilterModel: root.sortFilterModel + } + } + + Loader { + anchors.fill: parent + active: permission.status === Qt.PermissionStatus.Granted + sourceComponent: applicationComponent + } +} diff --git a/examples/positioning/satelliteinfo/PageButton.qml b/examples/positioning/satelliteinfo/PageButton.qml new file mode 100644 index 0000000..4307cd5 --- /dev/null +++ b/examples/positioning/satelliteinfo/PageButton.qml @@ -0,0 +1,29 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls.Basic + +ItemDelegate { + id: root + + property alias source: root.icon.source + property bool selected: false + readonly property int iconSize: availableHeight - root.font.pixelSize - spacing + + // Pick an implicit height in such way that the icon has twice more space + // then the text + implicitHeight: topPadding + bottomPadding + spacing + 3 * root.font.pixelSize + + icon.height: iconSize + icon.width: iconSize + icon.color: selected ? Theme.iconSelected : Theme.iconNormal + palette.text: selected ? Theme.iconTextSelected : Theme.iconTextNormal + display: AbstractButton.TextUnderIcon + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontDefaultWeight + + background: Rectangle { + color: "transparent" + } +} diff --git a/examples/positioning/satelliteinfo/PermissionsScreen.qml b/examples/positioning/satelliteinfo/PermissionsScreen.qml new file mode 100644 index 0000000..b926818 --- /dev/null +++ b/examples/positioning/satelliteinfo/PermissionsScreen.qml @@ -0,0 +1,53 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Layouts + +Rectangle { + id: root + + property bool requestDenied: false + + signal requestPermission + + color: Theme.backgroundColor + + ColumnLayout { + id: rootLayout + anchors.fill: parent + spacing: 0 + + Item { + Layout.fillHeight: true + } + Text { + id: textItem + text: root.requestDenied + ? qsTr("The application cannot run because the Location permission\n" + + "was not granted.\n" + + "Please grant the permission and restart the application.") + : qsTr("The application requires the Location permission to get\n" + + "the position and satellite information.\n" + + "Please press the button to request the permission.") + horizontalAlignment: Text.AlignHCenter + color: Theme.textSecondaryColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + Layout.alignment: Qt.AlignHCenter + } + Item { + Layout.fillHeight: true + } + Button { + visible: !root.requestDenied + implicitWidth: root.width * 0.8 + text: qsTr("Request Permission") + Layout.alignment: Qt.AlignHCenter + onClicked: root.requestPermission() + } + Item { + Layout.fillHeight: true + } + } +} diff --git a/examples/positioning/satelliteinfo/PositionBox.qml b/examples/positioning/satelliteinfo/PositionBox.qml new file mode 100644 index 0000000..9e82b64 --- /dev/null +++ b/examples/positioning/satelliteinfo/PositionBox.qml @@ -0,0 +1,58 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Layouts + +Rectangle { + id: root + + property alias latitudeString: latValue.text + property alias longitudeString: lonValue.text + + implicitHeight: rootLayout.implicitHeight + 2 * rootLayout.anchors.margins + color: Theme.darkBackgroundColor + + GridLayout { + id: rootLayout + anchors { + fill: parent + margins: Theme.defaultSpacing * 2 + } + columns: 3 + Image { + id: posImg + source: "icons/place.svg" + Layout.alignment: Qt.AlignTop | Qt.AlignHCenter + Layout.rowSpan: 2 + } + Text { + text: qsTr("latitude") + color: Theme.textMainColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + } + Text { + id: latValue + text: qsTr("N/A") + color: Theme.textMainColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontLightWeight + Layout.fillWidth: true + } + Text { + text: qsTr("longitude") + color: Theme.textMainColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + } + Text { + id: lonValue + text: qsTr("N/A") + color: Theme.textMainColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontLightWeight + Layout.fillWidth: true + } + } +} diff --git a/examples/positioning/satelliteinfo/RssiView.qml b/examples/positioning/satelliteinfo/RssiView.qml new file mode 100644 index 0000000..5585aff --- /dev/null +++ b/examples/positioning/satelliteinfo/RssiView.qml @@ -0,0 +1,472 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +pragma ComponentBehavior: Bound +import QtQuick +import QtQuick.Layouts +import QtQuick.Shapes + +import SatelliteInformation + +Rectangle { + id: root + + required property SatelliteModel satellitesModel + required property color inViewColor + required property color inUseColor + + color: Theme.darkBackgroundColor + + // A rectangle which is rounded only from the top side + component SemiRoundedRectangle : Shape { + id: roundRect + property int radius: 4 + property color color: "white" + visible: roundRect.height > 0 + ShapePath { + id: path + readonly property int radius: Math.min(roundRect.radius, + roundRect.width / 2, + roundRect.height / 2) + + strokeWidth: 1 + strokeColor: roundRect.color + fillColor: roundRect.color + + startX: 0 + startY: roundRect.height + PathLine { + x: 0 + y: path.radius + } + PathArc { + x: path.radius + y: 0 + radiusX: path.radius + radiusY: path.radius + useLargeArc: false + } + PathLine { + x: roundRect.width - path.radius + y: 0 + } + PathArc { + x: roundRect.width + y: path.radius + radiusX: path.radius + radiusY: path.radius + useLargeArc: false + } + PathLine { + x: roundRect.width + y: roundRect.height + } + PathLine { + x: 0 + y: roundRect.height + } + } + } + + component DashedLine : Shape { + id: line + property color color: "white" + ShapePath { + strokeWidth: line.height + strokeColor: line.color + strokeStyle: ShapePath.DashLine + dashPattern: [4, 4] + fillColor: "transparent" + startX: 0 + startY: 0 + PathLine { + x: line.width + y: 0 + } + } + } + + component SatelliteBox : Rectangle { + id: satBox + + required property var modelData + + implicitWidth: satRect.border.width * 2 + satRect.anchors.margins * 2 + + satRectLayout.anchors.leftMargin + + satRectLayout.anchors.rightMargin + + satIdText.width + satImg.width + implicitHeight: satRect.border.width * 2 + satRect.anchors.margins * 2 + + satRectLayout.anchors.bottomMargin + rssiText.height + + Math.max(satIdText.height + satRectLayout.anchors.topMargin, + satImg.height) + + color: "transparent" + + Rectangle { + id: satRect + anchors { + fill: parent + margins: Theme.defaultSpacing + } + border { + width: 1 + color: Theme.satelliteItemBorderColor + } + radius: 8 + color: "transparent" + ColumnLayout { + id: satRectLayout + anchors { + fill: parent + topMargin: Theme.defaultSpacing + bottomMargin: Theme.defaultSpacing + leftMargin: Theme.defaultSpacing * 2 + rightMargin: Theme.defaultSpacing * 2 + } + spacing: 0 + Text { + id: satIdText + text: qsTr("Sat #") + satBox.modelData.id + color: Theme.satelliteItemMainColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + Layout.alignment: Qt.AlignLeft + } + Text { + id: rssiText + text: satBox.modelData.rssi >= 0 ? satBox.modelData.rssi + qsTr(" dBm") + : qsTr("N/A") + color: Theme.satelliteItemSecondaryColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + Layout.alignment: Qt.AlignCenter + } + } + } + Image { + id: satImg + anchors { + top: parent.top + right: satRect.right + rightMargin: Theme.defaultSpacing + } + source: "icons/satellite_small.png" + } + } + + // Hidden SatelliteBox instance to determine a proper height for the ListView + SatelliteBox { + id: hiddenSatelliteBox + visible: false + modelData: ({"id": 999, "rssi": 999}) + } + + Rectangle { + id: satListRect + readonly property int spacing: Theme.defaultSpacing * 2 + anchors.top: parent.top + color: Theme.backgroundColor + height: hiddenSatelliteBox.height + spacing * 2 + width: parent.width + + ListView { + id: satView + anchors { + fill: parent + topMargin: satListRect.spacing + bottomMargin: satListRect.spacing + } + model: root.satellitesModel + delegate: SatelliteBox { + id: satDelegate + } + orientation: ListView.Horizontal + } + } + + Rectangle { + id: separator + anchors { + top: satListRect.bottom + } + color: Theme.separatorColor + height: 1 + width: root.width + } + + ColumnLayout { + anchors{ + top: separator.bottom + bottom: parent.bottom + left: parent.left + right: parent.right + margins: Theme.defaultSpacing + } + + spacing: Theme.defaultSpacing + + LegendBox { + id: legend + Layout.alignment: Qt.AlignRight + } + + Item { + id: rect + readonly property int maxVisibleLevel: 70 + + Layout.fillHeight: true + Layout.fillWidth: true + + Rectangle { + id: axis + readonly property int scaleWidth: 2 + readonly property int scaleSpacing: 2 + readonly property int offset: maxRssiLabel.width + scaleWidth + scaleSpacing + + color: "transparent" + height: rect.height - maxRssiLabel.height + width: rect.width + + Text { + id: maxRssiLabel + anchors { + top: axis.top + left: axis.left + } + text: "70" + color: Theme.textSecondaryColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + } + Rectangle { + id: greenRect + width: axis.scaleWidth + height: axis.height * 20 / rect.maxVisibleLevel + anchors { + top: axis.top + left: maxRssiLabel.right + leftMargin: axis.scaleSpacing + } + color: "#489d22" + } + DashedLine { + anchors { + top: greenRect.top + left: greenRect.right + right: axis.right + } + height: 1 + color: "#338e8e8e" + } + Text { + anchors { + bottom: greenRect.bottom + right: maxRssiLabel.right + } + text: "50" + color: Theme.textSecondaryColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + } + Rectangle { + id: lightgreenRect + width: axis.scaleWidth + height: axis.height * 10 / rect.maxVisibleLevel + anchors { + top: greenRect.bottom + left: greenRect.left + } + color: "#2cde85" + } + DashedLine { + anchors { + top: lightgreenRect.top + left: lightgreenRect.right + right: axis.right + } + height: 1 + color: "#338e8e8e" + } + Text { + anchors { + bottom: lightgreenRect.bottom + right: maxRssiLabel.right + } + text: "40" + color: Theme.textSecondaryColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + } + Rectangle { + id: yellowRect + width: axis.scaleWidth + height: axis.height * 10 / rect.maxVisibleLevel + anchors { + top: lightgreenRect.bottom + left: lightgreenRect.left + } + color: "#ffcc00" + } + DashedLine { + anchors { + top: yellowRect.top + left: yellowRect.right + right: axis.right + } + height: 1 + color: "#338e8e8e" + } + Text { + anchors { + bottom: yellowRect.bottom + right: maxRssiLabel.right + } + text: "30" + color: Theme.textSecondaryColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + } + Rectangle { + id: goldRect + width: axis.scaleWidth + height: axis.height * 10 / rect.maxVisibleLevel + anchors { + top: yellowRect.bottom + left: yellowRect.left + } + color: "#ffb800" + } + DashedLine { + anchors { + top: goldRect.top + left: goldRect.right + right: axis.right + } + height: 1 + color: "#338e8e8e" + } + Text { + anchors { + bottom: goldRect.bottom + right: maxRssiLabel.right + } + text: "20" + color: Theme.textSecondaryColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + } + Rectangle { + id: orangeRect + width: axis.scaleWidth + height: axis.height * 10 / rect.maxVisibleLevel + anchors { + top: goldRect.bottom + left: goldRect.left + } + color: "#f9a70e" + } + DashedLine { + anchors { + top: orangeRect.top + left: orangeRect.right + right: axis.right + } + height: 1 + color: "#338e8e8e" + } + Text { + anchors { + bottom: orangeRect.bottom + right: maxRssiLabel.right + } + text: "10" + color: Theme.textSecondaryColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + } + Rectangle { + id: redRect + width: axis.scaleWidth + height: axis.height * 10 / rect.maxVisibleLevel + anchors { + top: orangeRect.bottom + left: orangeRect.left + } + color: "#c50000" + } + DashedLine { + anchors { + top: redRect.top + left: redRect.right + right: axis.right + } + height: 1 + color: "#338e8e8e" + } + Text { + anchors { + bottom: redRect.bottom + right: maxRssiLabel.right + } + text: "0" + color: Theme.textSecondaryColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + } + Rectangle { + anchors { + top: redRect.bottom + left: redRect.left + right: axis.right + } + height: 1 + color: "#8e8e8e" + } + } + + Row { + id: view + + anchors { + fill: rect + leftMargin: axis.offset + view.spacing + } + + property int rows: repeater.model.size + property int singleWidth: view.width / rows - spacing + + spacing: Theme.defaultSpacing + + //! [0] + Repeater { + id: repeater + model: root.satellitesModel + delegate: Rectangle { + required property var modelData + height: rect.height + width: view.singleWidth + color: "transparent" + SemiRoundedRectangle { + anchors.bottom: satId.top + width: parent.width + height: (parent.height - satId.height) + * Math.min(parent.modelData.rssi, rect.maxVisibleLevel) + / rect.maxVisibleLevel + color: parent.modelData.inUse ? root.inUseColor : root.inViewColor + } + Text { + id: satId + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + text: parent.modelData.id + color: Theme.textSecondaryColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + } + } + } + //! [0] + } + } + } +} diff --git a/examples/positioning/satelliteinfo/SatelliteView.qml b/examples/positioning/satelliteinfo/SatelliteView.qml new file mode 100644 index 0000000..042dd57 --- /dev/null +++ b/examples/positioning/satelliteinfo/SatelliteView.qml @@ -0,0 +1,428 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +pragma ComponentBehavior: Bound +import QtPositioning +import QtQuick +import QtQuick.Controls.Basic as QC +import QtQuick.Layouts +import SatelliteInformation + +Rectangle { + id: root + + required property SortFilterModel sortFilterModel + required property color inViewColor + required property color inUseColor + + readonly property int iconItemWidth: 50 + + color: Theme.darkBackgroundColor + + property var satelliteSystemModel: [ + {"name": "GPS", "id": GeoSatelliteInfo.GPS}, + {"name": "GLONASS", "id": GeoSatelliteInfo.GLONASS}, + {"name": "GALILEO", "id": GeoSatelliteInfo.GALILEO}, + {"name": "BEIDOU", "id": GeoSatelliteInfo.BEIDOU}, + {"name": "QZSS", "id": GeoSatelliteInfo.QZSS} + ] + + component RssiElement : Rectangle { + id: rssiRoot + + required property int rssi + + implicitHeight: rssiVal.implicitHeight + implicitWidth: rssiVal.implicitWidth + dbm.implicitWidth + rssiLayout.spacing + color: "transparent" + + RowLayout { + id: rssiLayout + anchors.fill: parent + spacing: 2 + Text { + id: rssiVal + text: rssiRoot.rssi >= 0 ? rssiRoot.rssi : qsTr("N/A") + color: Theme.textSecondaryColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontDefaultWeight + } + Text{ + id: dbm + visible: rssiRoot.rssi >= 0 + text: qsTr("dBm") + color: Theme.textGrayColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontDefaultWeight + } + } + } + + component StatusElement : Rectangle { + id: statusRoot + + required property bool inUse + + implicitHeight: statusText.implicitHeight + implicitWidth: statusText.implicitWidth + statusIcon.implicitWidth + statusLayout.spacing + color: "transparent" + + RowLayout { + id: statusLayout + anchors.fill: parent + spacing: Theme.defaultSpacing + Rectangle { + id: statusIcon + implicitHeight: statusText.font.pixelSize + implicitWidth: implicitHeight + radius: height / 2 + color: statusRoot.inUse ? root.inUseColor : root.inViewColor + } + Text { + id: statusText + text: statusRoot.inUse ? qsTr("In Use") : qsTr("In View") + color: Theme.textSecondaryColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + } + } + } + + RssiElement { + id: hiddenRssiElement + rssi: 999 + visible: false + } + StatusElement { + id: hiddenStatusElement + inUse: false + visible: false + } + + component ListHeader : Rectangle { + implicitHeight: identifierHdr.height + color: root.color + + RowLayout { + anchors { + fill: parent + leftMargin: Theme.defaultSpacing * 2 + rightMargin: Theme.defaultSpacing * 2 + } + spacing: Theme.defaultSpacing * 2 + Item { + id: blank + implicitWidth: root.iconItemWidth + } + Text { + id: identifierHdr + text: qsTr("Identifier") + color: Theme.textSecondaryColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + Layout.fillWidth: true + } + Text { + id: rssiHdr + text: qsTr("RSSI") + color: Theme.textSecondaryColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + Layout.preferredWidth: hiddenRssiElement.width + } + Text { + id: statusHdr + text: qsTr("Status") + color: Theme.textSecondaryColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + Layout.preferredWidth: hiddenStatusElement.width + } + } + Rectangle { + anchors.bottom: parent.bottom + height: 1 + width: parent.width + color: Theme.tableSeparatorColor + } + } + + component ListItem : Rectangle { + id: listItem + + required property int index + required property var modelData + + color: "transparent" + + RowLayout { + anchors { + fill: parent + leftMargin: Theme.defaultSpacing * 2 + rightMargin: Theme.defaultSpacing * 2 + } + spacing: Theme.defaultSpacing * 2 + Rectangle { + implicitWidth: root.iconItemWidth + color: "transparent" + Image { + anchors.centerIn: parent + source: listItem.index % 2 === 0 ? "icons/satellite1.png" + : "icons/satellite2.png" + } + } + Text { + text: listItem.modelData.system + "-" + listItem.modelData.id + color: Theme.textMainColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + Layout.fillWidth: true + } + RssiElement { + rssi: listItem.modelData.rssi + Layout.preferredWidth: hiddenRssiElement.width + } + StatusElement { + inUse: listItem.modelData.inUse + Layout.preferredWidth: hiddenStatusElement.width + } + } + Rectangle { + anchors.bottom: parent.bottom + height: 1 + width: parent.width + color: Theme.tableSeparatorColor + } + } + + component SearchInput : QC.TextField { + id: searchInput + palette { + placeholderText: Theme.grayColor + text: Theme.textMainColor + } + rightPadding: padding + searchIcon.width + searchIcon.anchors.rightMargin + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + background: Rectangle { + border { + width: 1 + color:Theme.searchBorderColor + } + color: "transparent" + radius: 3 + Image { + id: searchIcon + anchors { + right: parent.right + rightMargin: Theme.defaultSpacing + verticalCenter: parent.verticalCenter + } + source: "icons/search.svg" + sourceSize.height: searchInput.implicitHeight - searchInput.padding * 2 + fillMode: Image.PreserveAspectFit + } + } + } + + component IconButton : QC.ToolButton { + id: iconButton + property bool selected: false + icon.width: 0 + icon.height: 0 + icon.color: selected ? Theme.greenColor : Theme.grayColor + background: Rectangle { + border { + width: 1 + color: iconButton.selected ? Theme.greenColor : Theme.searchBorderColor + } + color: "transparent" + radius: 3 + } + } + + component MenuPopup : QC.Popup { + modal: true + background: Rectangle { + radius: 8 + color: Theme.backgroundColor + border { + width: 1 + color: Theme.separatorColor + } + } + } + + component CheckElement : QC.ItemDelegate { + id: checkElement + + readonly property int iconSize: font.pixelSize * 2 + + checked: true + padding: 0 + + display: QC.AbstractButton.TextBesideIcon + + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + palette.text: checked ? Theme.greenColor : Theme.textSecondaryColor + + icon.source: checked ? "icons/checkbox.svg" : "icons/checkbox_blank.svg" + icon.height: iconSize + icon.width: iconSize + icon.color: checked ? Theme.greenColor : Theme.textSecondaryColor + + LayoutMirroring.enabled: true + LayoutMirroring.childrenInherit: true + + background: Rectangle { + anchors.fill: parent + color: "transparent" + } + + onClicked: { + checked = !checked + } + } + + Rectangle { + id: sortAndFilter + width: root.width + height: searchField.implicitHeight + sortAndFilterLayout.anchors.margins * 2 + color: Theme.backgroundColor + RowLayout { + id: sortAndFilterLayout + anchors { + fill: parent + margins: Theme.defaultSpacing * 2 + } + spacing: Theme.defaultSpacing * 2 + SearchInput { + id: searchField + placeholderText: qsTr("Search") + Layout.fillWidth: true + onTextChanged: root.sortFilterModel.updateFilterString(text); + } + IconButton { + selected: sortMenu.visible + icon.source: "icons/sort.svg" + rotation: 90 + Layout.preferredHeight: searchField.implicitHeight + Layout.preferredWidth: Layout.preferredHeight + onClicked: sortMenu.open() + } + IconButton { + selected: filterMenu.visible + icon.source: "icons/filter.svg" + Layout.preferredHeight: searchField.implicitHeight + Layout.preferredWidth: Layout.preferredHeight + onClicked: filterMenu.open() + } + } + } + + Rectangle { + id: separator + anchors.top: sortAndFilter.bottom + color: Theme.separatorColor + height: 1 + width: root.width + } + + ListView { + id: satellitesView + anchors { + top: separator.bottom + bottom: root.bottom + } + width: root.width + clip: true + model: root.sortFilterModel + header: ListHeader { + height: 30 + width: root.width + z: 2 // to show on top of the items + } + headerPositioning: ListView.OverlayHeader + delegate: ListItem { + height: 50 + width: root.width + } + } + + MenuPopup { + id: sortMenu + x: root.width - sortMenu.width - Theme.defaultSpacing + y: satellitesView.y - Theme.defaultSpacing + ColumnLayout { + anchors.fill: parent + spacing: Theme.defaultSpacing + CheckElement { + checked: false + text: qsTr("By Identifier") + Layout.alignment: Qt.AlignRight + onCheckedChanged: { + root.sortFilterModel.updateSortRoles(Roles.SystemRole, checked) + } + } + CheckElement { + checked: false + text: qsTr("By Status") + Layout.alignment: Qt.AlignRight + onCheckedChanged: { + root.sortFilterModel.updateSortRoles(Roles.InUseRole, checked) + } + } + } + } + + MenuPopup { + id: filterMenu + x: root.width - filterMenu.width - Theme.defaultSpacing + y: satellitesView.y - Theme.defaultSpacing + ColumnLayout { + id: filterLayout + anchors.fill: parent + spacing: Theme.defaultSpacing + Text { + text: qsTr("Satellite Identifier") + color: Theme.textMainColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + Layout.alignment: Qt.AlignRight + } + //! [0] + Repeater { + model: root.satelliteSystemModel + delegate: CheckElement { + required property var modelData + text: modelData.name + Layout.alignment: Qt.AlignRight + onCheckedChanged: { + root.sortFilterModel.updateSelectedSystems(modelData.id, checked) + } + } + } + //! [0] + Text { + text: qsTr("Satellite Status") + color: Theme.textMainColor + font.pixelSize: Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + Layout.alignment: Qt.AlignRight + } + //! [1] + CheckElement { + text: qsTr("In View") + Layout.alignment: Qt.AlignRight + onCheckedChanged: root.sortFilterModel.updateShowInView(checked) + } + CheckElement { + text: qsTr("In Use") + Layout.alignment: Qt.AlignRight + onCheckedChanged: root.sortFilterModel.updateShowInUse(checked) + } + //! [1] + } + } +} diff --git a/examples/positioning/satelliteinfo/SettingsView.qml b/examples/positioning/satelliteinfo/SettingsView.qml new file mode 100644 index 0000000..0350151 --- /dev/null +++ b/examples/positioning/satelliteinfo/SettingsView.qml @@ -0,0 +1,91 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Controls.Basic +import QtQuick.Layouts + +Rectangle { + id: root + + signal showHelp + signal toggleMode + + color: Theme.backgroundColor + + component Entry: ItemDelegate { + id: entryRoot + + property bool heading: false + property alias source: entryRoot.icon.source + readonly property int iconSize: entryRoot.font.pixelSize + + icon.height: iconSize + icon.width: iconSize + icon.color: Theme.iconNormal + palette.text: Theme.iconTextNormal + display: AbstractButton.TextBesideIcon + font.pixelSize: entryRoot.heading ? Theme.largeFontSize : Theme.mediumFontSize + font.weight: Theme.fontDefaultWeight + + LayoutMirroring.enabled: true + LayoutMirroring.childrenInherit: true + + background: Rectangle { + anchors.fill: parent + color: entryRoot.heading ? "transparent" : Theme.settingsEntryBackground + Rectangle { + height: 1 + width: parent.width + anchors.bottom: parent.bottom + color: Theme.settingsSeparatorColor + } + } + } + + ColumnLayout { + anchors { + fill: parent + topMargin: Theme.defaultSpacing + } + spacing: 0 + + Entry { + heading: true + text: qsTr("Settings") + bottomPadding: 20 + Layout.alignment: Qt.AlignRight + Layout.fillWidth: true + } + + Entry { + text: qsTr("Light Mode") + source: "icons/lightmode.svg" + visible: Theme.darkMode + Layout.alignment: Qt.AlignRight + Layout.fillWidth: true + onClicked: root.toggleMode() + } + + Entry { + text: qsTr("Dark Mode") + source: "icons/darkmode.svg" + visible: !Theme.darkMode + Layout.alignment: Qt.AlignRight + Layout.fillWidth: true + onClicked: root.toggleMode() + } + + Entry { + text: qsTr("Help") + source: "icons/help.svg" + Layout.alignment: Qt.AlignRight + Layout.fillWidth: true + onClicked: root.showHelp() + } + + Item { + Layout.fillHeight: true + } + } +} diff --git a/examples/positioning/satelliteinfo/SkyView.qml b/examples/positioning/satelliteinfo/SkyView.qml new file mode 100644 index 0000000..0ce751c --- /dev/null +++ b/examples/positioning/satelliteinfo/SkyView.qml @@ -0,0 +1,434 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +pragma ComponentBehavior: Bound +import QtQuick +import QtQuick.Shapes +import SatelliteInformation + +Rectangle { + id: root + + // Multisample this item to get rid of aliasing in our custom shapes. + layer.enabled: true + layer.samples: 4 + // Sample text to calculate sky view size properly + Text { + id: sampleText + visible: false + text: "270°" + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + } + + required property SatelliteModel satellitesModel + required property color inViewColor + required property color inUseColor + + + readonly property real fullRadius: width < height ? width / 2 - sampleText.width * 1.1 + : height / 2 - sampleText.height * 1.1 + + readonly property real maxUsedRadius: 0.9 * fullRadius + readonly property real radiusStep: maxUsedRadius / 9 + readonly property int centerX: width / 2 + readonly property int centerY: height / 2 + + color: Theme.darkBackgroundColor + + LegendBox { + id: legend + anchors { + top: root.top + right: root.right + margins: Theme.defaultSpacing + } + } + + // Shape for the SkyView + Shape { + id: rootShape + readonly property color mainColor: Theme.textMainColor + readonly property color dashedColor: Qt.rgba(mainColor.r, + mainColor.g, + mainColor.b, + 0.5) + + // Circles + component ElevationCircle: ShapePath { + id: circle + + property color color: "white" + property real radius: 0 + property bool dashed: false + + strokeColor: circle.color + fillColor: "transparent" + strokeStyle: circle.dashed ? ShapePath.DashLine : ShapePath.SolidLine + dashPattern: [4, 4] + PathAngleArc { + centerX: root.centerX + centerY: root.centerY + radiusX: circle.radius + radiusY: circle.radius + startAngle: 0 + sweepAngle: 360 + } + } + + ElevationCircle { + radius: root.fullRadius + color: Theme.greenColor + } + ElevationCircle { + radius: root.radiusStep * 9 + color: rootShape.dashedColor + dashed: true + } + ElevationCircle { + radius: root.radiusStep * 7 + color: rootShape.dashedColor + dashed: true + } + ElevationCircle { + radius: root.radiusStep * 5 + color: rootShape.dashedColor + dashed: true + } + ElevationCircle { + radius: root.radiusStep * 3 + color: rootShape.dashedColor + dashed: true + } + ElevationCircle { + radius: root.radiusStep + color: rootShape.mainColor + } + + // Lines + component Line: ShapePath { + id: line + readonly property color green: Theme.greenColor + strokeColor: Qt.rgba(green.r, green.g, green.b, 0.5) + property real angle + property real radianAngle: line.angle / 180 * Math.PI + startX: root.centerX + root.fullRadius * Math.cos(radianAngle) + startY: root.centerY + root.fullRadius * Math.sin(radianAngle) + PathLine { + x: root.centerX + root.fullRadius * Math.cos(line.radianAngle + Math.PI) + y: root.centerY + root.fullRadius * Math.sin(line.radianAngle + Math.PI) + } + } + + Line { + angle: 0 + } + Line { + angle: 30 + } + Line { + angle: 60 + } + Line { + angle: 90 + } + Line { + angle: 120 + } + Line { + angle: 150 + } + + // Azimuth captions + component AzimuthCaption: Text { + id: textElement + property real angle + property real offsetX: 0 + property real offsetY: 0 + // Subtract 90, because 0 should be on top, not on the right + property real radianAngle: (angle - 90) / 180 * Math.PI + // end of line coordinates + property int lineX: root.centerX + root.fullRadius * Math.cos(radianAngle) + property int lineY: root.centerY + root.fullRadius * Math.sin(radianAngle) + x: lineX + offsetX + y: lineY + offsetY + text: angle.toFixed(0) + '°' + color: Theme.textMainColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + } + + AzimuthCaption { + text: 'N' + angle: 0 + offsetY: -height + offsetX: -width / 2 + } + AzimuthCaption { + angle: 30 + offsetY: -height + } + AzimuthCaption { + angle: 60 + offsetX: width * 0.5 + offsetY: -height / 2 + } + AzimuthCaption { + text: 'E' + angle: 90 + offsetX: width * 0.5 + offsetY: -height / 2 + } + AzimuthCaption { + angle: 120 + } + AzimuthCaption { + angle: 150 + } + AzimuthCaption { + text: 'S' + angle: 180 + offsetX: -width / 2 + } + AzimuthCaption { + angle: 210 + offsetX: -width / 2 + offsetY: height / 2 + } + AzimuthCaption { + angle: 240 + offsetX: -width + } + AzimuthCaption { + text: 'W' + angle: 270 + offsetX: -width * 1.5 + offsetY: -height / 2 + } + AzimuthCaption { + angle: 300 + offsetX: -width + offsetY: -height + } + AzimuthCaption { + angle: 330 + offsetX: -width + offsetY: -height + } + + // Elevation captions + component ElevationCaption: Text { + property real step + x: root.centerX - implicitWidth / 2 + y: root.centerY - (step * root.radiusStep + implicitHeight) + color: Theme.textMainColor + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + } + + ElevationCaption { + text: "80°" + step: 1 + } + ElevationCaption { + text: "60°" + step: 3 + } + ElevationCaption { + text: "40°" + step: 5 + } + ElevationCaption { + text: "20°" + step: 7 + } + ElevationCaption { + text: "0°" + step: 9 + } + } + + // Actual satellite positions + Item { + id: satelliteItemView + anchors.fill: parent + + property string selectedName: "" + property var selectedData: ({"name": "", "azimuth": 0, "elevation": 0}) + // selected{X,Y} holds the center of the selected circle + property int selectedX: -1 + property int selectedY: -1 + + Repeater { + model: root.satellitesModel + delegate: Rectangle { + id: satItem + + required property var modelData + property bool selected: satelliteItemView.selectedName === modelData.name + + readonly property color normalColor: modelData.inUse ? root.inUseColor + : root.inViewColor + readonly property color selectedColor: Qt.rgba(normalColor.r, + normalColor.g, + normalColor.b, + 0.5) + readonly property color centerColor: selected ? Theme.whiteColor + : Theme.blackColor + readonly property int normalWidth: 10 + readonly property int centerWidth: 6 + readonly property int outerWidth: selected ? normalWidth + 10 : normalWidth + + width: outerWidth + height: width + radius: width / 2 + color: selectedColor + visible: modelData.azimuth > -1 && modelData.elevation > -1 + property real angle: (modelData.azimuth - 90) / 180 * Math.PI + property real distance: root.maxUsedRadius * (90 - modelData.elevation) / 90 + x: root.centerX + distance * Math.cos(angle) - width / 2 + y: root.centerY + distance * Math.sin(angle) - height / 2 + Rectangle { + anchors.centerIn: parent + width: satItem.normalWidth + height: width + radius: width / 2 + color: satItem.normalColor + + Rectangle { + anchors.centerIn: parent + width: satItem.centerWidth + height: width + radius: width / 2 + color: satItem.centerColor + } + } + MouseArea { + anchors { + fill: parent + margins: -20 // so that it's easier to select the item + } + onClicked: { + satelliteItemView.selectedName = satItem.modelData.name + satelliteItemView.selectedData = satItem.modelData + satelliteItemView.selectedX = satItem.x + satItem.width / 2 + satelliteItemView.selectedY = satItem.y + satItem.height / 2 + } + } + + onXChanged: { + if (satItem.selected) + satelliteItemView.selectedX = satItem.x + satItem.width / 2 + } + onYChanged: { + if (satItem.selected) + satelliteItemView.selectedY = satItem.y + satItem.height / 2 + } + + Component.onCompleted: { + if (satItem.selected) { + satelliteItemView.selectedData = satItem.modelData + satelliteItemView.selectedX = satItem.x + satItem.width / 2 + satelliteItemView.selectedY = satItem.y + satItem.height / 2 + } + } + } + } + + Rectangle { + id: blurRect + anchors.fill: parent + color: Theme.backgroundBlurColor + visible: satelliteItemView.selectedName !== "" + MouseArea { + anchors.fill: parent + onClicked: satelliteItemView.selectedName = "" + } + } + + Rectangle { + id: satInfoRect + visible: satelliteItemView.selectedName !== "" + implicitWidth: Math.max(satName.width, satAzimuth.width, satElevation.width) + + satInfoCol.anchors.leftMargin + satInfoCol.anchors.rightMargin + implicitHeight: satName.height + satAzimuth.height + satElevation.height + + satInfoCol.anchors.topMargin + satInfoCol.anchors.bottomMargin + + 2 * satInfoCol.spacing + // We need to make sure that the popup fits into the view. + // This depends on the position of the actual satellite. + // We try to show the popup top-right from the satellite, + // but adjust if it's too close to the window border. + // Keep in mind that (0, 0) is the top left corner. + readonly property int xOffset: 15 + readonly property int yOffset: 25 + x: satelliteItemView.selectedX + satInfoRect.xOffset + satInfoRect.width + < satelliteItemView.width + ? satelliteItemView.selectedX + satInfoRect.xOffset + : satelliteItemView.selectedX - satInfoRect.xOffset - satInfoRect.width + y: satelliteItemView.selectedY - satInfoRect.yOffset - satInfoRect.height > 0 + ? satelliteItemView.selectedY - satInfoRect.yOffset - satInfoRect.height + : satelliteItemView.selectedY + satInfoRect.yOffset + color: Theme.whiteColor + border { + color: Theme.lightGrayColor + width: 1 + } + radius: 8 + MouseArea { + anchors.fill: parent + onClicked: {} // suppress mouse area of blurRect + } + Column { + id: satInfoCol + anchors { + fill: parent + topMargin: Theme.defaultSpacing + bottomMargin: Theme.defaultSpacing + leftMargin: Theme.defaultSpacing * 2 + rightMargin: Theme.defaultSpacing * 2 + } + spacing: 0 + Text { + id: satName + text: qsTr("Sat ") + satelliteItemView.selectedData.name + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontDefaultWeight + color: Theme.darkGrayColor + } + Text { + id: satAzimuth + text: qsTr("Azimuth: ") + + satelliteItemView.selectedData.azimuth.toFixed(0) + "°" + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + color: Theme.grayColor + } + Text { + id: satElevation + text: qsTr("Elevation: ") + + satelliteItemView.selectedData.elevation.toFixed(0) + "°" + font.pixelSize: Theme.smallFontSize + font.weight: Theme.fontLightWeight + color: Theme.grayColor + } + } + } + + Shape { + id: connectionLine + visible: satelliteItemView.selectedName !== "" + ShapePath { + strokeColor: Theme.whiteColor + strokeWidth: 1 + startX: satelliteItemView.selectedX + startY: satelliteItemView.selectedY + PathLine { + x: satInfoRect.x > satelliteItemView.selectedX + ? satInfoRect.x : satInfoRect.x + satInfoRect.width + y: satInfoRect.y > satelliteItemView.selectedY + ? satInfoRect.y : satInfoRect.y + satInfoRect.height + } + } + } + } +} diff --git a/examples/positioning/satelliteinfo/Theme.qml b/examples/positioning/satelliteinfo/Theme.qml new file mode 100644 index 0000000..f08abb8 --- /dev/null +++ b/examples/positioning/satelliteinfo/Theme.qml @@ -0,0 +1,90 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +pragma Singleton +import QtQuick + +QtObject { + id: root + + property bool darkMode: true + + // colors + readonly property color greenColor: "#2cde85" + readonly property color redColor: "#c50000" + readonly property color whiteColor: "#ffffff" + readonly property color almostWhiteColor: "#fefefe" + readonly property color lightGrayColor: "#e8e8e8" + readonly property color grayColor: "#969696" + readonly property color darkGrayColor: "#585757" + readonly property color blackColor: "#000000" + + readonly property color inUseColor: root.greenColor + readonly property color inViewColor: "#e3a5e5" + + readonly property color iconNormal: root.darkMode ? root.lightGrayColor : root.darkGrayColor + readonly property color iconSelected: root.greenColor + + readonly property color iconTextNormal: root.darkMode ? root.lightGrayColor + : root.darkGrayColor + readonly property color iconTextSelected: root.greenColor + + readonly property color buttonBackgroundColor: root.darkMode ? root.almostWhiteColor + : root.greenColor + readonly property color buttonTextColor: root.darkGrayColor + readonly property color buttonTextPressedColor: root.darkMode ? root.greenColor + : root.whiteColor + readonly property color buttonRedTextPressedColor: root.redColor + + readonly property color backgroundColor: root.darkMode ? "#06054b" : root.whiteColor + readonly property color darkBackgroundColor: root.darkMode ? "#020233" : "#f8fffc" + + readonly property color textGrayColor: root.grayColor + readonly property color textMainColor: root.darkMode ? root.whiteColor : root.darkGrayColor + readonly property color textSecondaryColor: root.darkMode ? root.lightGrayColor + : root.darkGrayColor + readonly property color textGreenColor: root.greenColor + readonly property color textRedColor: root.redColor + + readonly property color settingsSeparatorColor: root.darkMode ? "#21205d" : "#ebeaea" + readonly property color settingsEntryBackground: root.darkMode ? "#080545" : "#f7f6f6" + + readonly property color legendBackgroundColor: root.darkMode ? "#010c6b" : "#d9feec" + + readonly property color backgroundBlurColor: root.darkMode ? Qt.rgba(0, 0, 0, 0.35) + : Qt.rgba(0, 0, 0, 0.1) + + readonly property color satelliteItemMainColor: root.darkMode ? root.almostWhiteColor + : root.greenColor + readonly property color satelliteItemSecondaryColor: root.darkMode ? root.grayColor + : root.darkGrayColor + readonly property color satelliteItemBorderColor: root.darkMode ? root.almostWhiteColor + : "#8e8e8e" + + readonly property color separatorColor: Qt.rgba(root.grayColor.r, + root.grayColor.g, + root.grayColor.b, + 0.3) + readonly property color tableSeparatorColor: root.darkMode + ? Qt.rgba(root.lightGrayColor.r, + root.lightGrayColor.g, + root.lightGrayColor.b, + 0.2) + : Qt.rgba(root.darkGrayColor.r, + root.darkGrayColor.g, + root.darkGrayColor.b, + 0.2) + + readonly property color searchBorderColor: root.darkMode ? root.lightGrayColor + : root.grayColor + + // font + readonly property int largeFontSize: 18 + readonly property int mediumFontSize: 14 + readonly property int smallFontSize: 12 + readonly property int fontDefaultWeight: Font.DemiBold + readonly property int fontLightWeight: Font.Normal + + // some sizes + readonly property int defaultSpacing: 5 +} diff --git a/examples/positioning/satelliteinfo/ViewSwitch.qml b/examples/positioning/satelliteinfo/ViewSwitch.qml new file mode 100644 index 0000000..1b211ce --- /dev/null +++ b/examples/positioning/satelliteinfo/ViewSwitch.qml @@ -0,0 +1,45 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +pragma ComponentBehavior: Bound +import QtQuick +import QtQuick.Layouts + +Rectangle { + id: root + + property int currentIndex: 0 + readonly property int tableViewIndex: 1 + readonly property int settingsIndex: 3 + + implicitHeight: rootLayout.implicitHeight + 2 * rootLayout.anchors.margins + color: Theme.backgroundColor + + RowLayout { + id: rootLayout + anchors { + fill: parent + margins: Theme.defaultSpacing + } + spacing: 0 + property real itemWidth: rootLayout.width / repeater.model.length + Repeater { + id: repeater + model: [ + {"name" : qsTr("Sky View"), "source": "icons/skyview.svg"}, + {"name" : qsTr("Table View"), "source": "icons/tableview.svg"}, + {"name" : qsTr("RSSI View"), "source": "icons/rssiview.svg"}, + {"name" : qsTr("Settings"), "source": "icons/settings.svg"}, + ] + PageButton { + required property var modelData + required property int index + implicitWidth: rootLayout.itemWidth + text: modelData.name + source: modelData.source + selected: root.currentIndex === index + onClicked: root.currentIndex = index + } + } + } +} diff --git a/examples/positioning/satelliteinfo/doc/images/rssiview_settings.webp b/examples/positioning/satelliteinfo/doc/images/rssiview_settings.webp new file mode 100644 index 0000000000000000000000000000000000000000..ddb9ef712b43a5237ba0530b4a675277c3d93ad3 GIT binary patch literal 23674 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 literal 0 HcmV?d00001 diff --git a/examples/positioning/satelliteinfo/doc/src/satelliteinfo.qdoc b/examples/positioning/satelliteinfo/doc/src/satelliteinfo.qdoc new file mode 100644 index 0000000..f129a45 --- /dev/null +++ b/examples/positioning/satelliteinfo/doc/src/satelliteinfo.qdoc @@ -0,0 +1,205 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \example satelliteinfo + \title Satellite Info + \examplecategory {Application Examples} + \examplecategory {Positioning & Location} + \meta tags {c++, qml, quick} + + \brief The Satellite Info example shows the available satellites + using Sky View, Table View, or RSSI View and the user's current position. + It is implemented with \l{Qt Positioning} and \l{Qt Quick}. + + \ingroup qtpositioning-examples + + This example demonstrates the usage of \l {Qt Positioning QML Types} + {Qt Positioning QML API}: + + \list + \li \l {PositionSource} + \li \l {SatelliteSource} + \endlist + + The example also shows how to use a custom \c {C++} model together with a + custom proxy model from \c {QML}. + + \section1 UI Overview + + The example shows satellite information in three different tabs. + The data is taken from the \l {SatelliteSource::satellitesInView} and + \l {SatelliteSource::satellitesInUse} properties. + + \image ../images/skyview_tableview.webp + + The \e {Sky View} tab shows the relative satellite positions using the + \c {Azimuth} and \c {Elevation} \l {geoSatelliteInfo::attribute} + {attributes}. Clicking on an individual satellite object opens a popup + with the \l {geoSatelliteInfo::satelliteIdentifier} {satellite identifier}, + its azimuth and elevation. + + The \e {Table View} tab shows the list of all detected satellites, and + allows to apply sorting and filtering to the list. + + \image ../images/rssiview_settings.webp + + The \e {RSSI View} tab shows the signal strength of satellites in view using + the \l {geoSatelliteInfo::}{signalStrength} property. The numbers below the + bars represent the individual \l {geoSatelliteInfo::satelliteIdentifier} + {satellite identifiers}. + + The \e {Sky View} and \e {RSSI View} tabs also show the current latitude and + longitude. They use \l {PositionSource::position} property to extract this + information. + + The \e {Status} block on top of the tabs shows the current mode or the last + error. + + The \e {Settings} menu allows to switch the application color mode and show + the help information. + + The application operates in three different modes: + + \table + \header + \li Application mode + \li Description + \row + \li Running + \li The application continuously queries the system for satellite + and position updates. When new data is available it will be + displayed. + \row + \li Stopped + \li The application stops updating the satellite and position + information. + \row + \li Single + \li The application makes a single satellite and position update + request. + \endtable + + The application automatically switches into a simulation mode if the + platform does not provide satellite or position information. The simulation + mode uses an \l {Qt Positioning NMEA plugin}{NMEA plugin} with pre-recorded + NMEA data. + + \note Apple does not provide any APIs to retrieve satellite information, so + on \c macOS and \c iOS the satellite information will always be taken from + pre-recorded data. These API limitations do not affect positioning + information, so current position can be displayed correctly. + + \include examples-run.qdocinc + + \section1 Retrieving Current Position + + The current position is retrieved from the \l PositionSource QML object. The + \c {onPositionChanged} handler is used to receive position updates. The + string representations of latitude and longitude are extracted from the + \l {Position::}{coordinate} property. + + \snippet satelliteinfo/ApplicationScreen.qml 3 + \snippet satelliteinfo/ApplicationScreen.qml 4 + \snippet satelliteinfo/ApplicationScreen.qml 5 + + \section1 Retrieving Satellite Information + + Similarly to the position, the current satellite information is retrieved + from the \l SatelliteSource QML object. The \c {onSatellitesInViewChanged} + and \c {onSatellitesInUseChanged} handlers are used to get the updated + satellites in view and satellites in use respectively. In this example, the + data is then forwarded to the \c {C++} model, which is later used in all + views. + + \snippet satelliteinfo/ApplicationScreen.qml 0 + \snippet satelliteinfo/ApplicationScreen.qml 1 + \snippet satelliteinfo/ApplicationScreen.qml 2 + + \note The example shows both the QML Positioning API, and the integration + of C++ model to QML. That is the reason why the satellite information is + first retrieved in \c {QML}, then forwarded to \c {C++}, and then back to + \c {QML} to be used in the model. In practice, if the application is + supposed to use complex \c {C++} models, consider directly using the + \l QGeoSatelliteInfoSource class from \c {C++}. + + \section1 Using Custom C++ Models + + The example makes use of two custom models - \c {SatelliteModel} and + \c {SortFilterModel}. + + \section2 Satellite Model + + The \c {SatelliteModel} class is derived from \l QAbstractListModel and + reimplements the \l {QAbstractListModel::}{rowCount()}, + \l {QAbstractListModel::}{data()}, and + \l {QAbstractListModel::}{roleNames()} methods to represent the + satellite information. Using \l QAbstractListModel as a base class allows + to easily use the model with the \c {QML} \l ListView and \l Repeater types. + A custom \c {size} property is used only in the \e {RSSI View} tab to + dynamically calculate the width of the tab bars. + + \snippet satelliteinfo/satellitemodel.h 0 + \snippet satelliteinfo/satellitemodel.h 1 + + The \c {roleNames()} method is used to map the model's roles to the + property names which can be used to access the model data from \c {QML}. + For example, the \c {id} name is used to extract the satellite identifier, + and the \c {rssi} name is used to get the signal strength. + + \snippet satelliteinfo/satellitemodel.cpp 0 + + On the \c {QML} side, we can use these names to get the actual values. + For example, the implementation of \e {RSSI View} uses the \c {rssi}, + \c {inUse}, and \c {id} role names to draw the bars that represent + individual satellites: + + \snippet satelliteinfo/RssiView.qml 0 + + \section2 Proxy Model + + The \c {SortFilterModel} class is used to provide custom sorting and + filtering of the satellite objects shown in the \e {Table View} tab. + + The model is derived from \l QSortFilterProxyModel and reimplements the + \l {QSortFilterProxyModel::}{filterAcceptsRow()} and + \l {QSortFilterProxyModel::}{lessThan()} methods to provide filtering and + sorting. The model also exposes several \c {slots} to tune the filtering + and sorting behavior. + + \snippet satelliteinfo/sortfiltermodel.h 0 + \snippet satelliteinfo/sortfiltermodel.h 1 + + These slots can be called from both \c {C++} and \c {QML}. For example, the + \e {Satellite Identifier} delegate uses the \c {updateSelectedSystems()} + slot to show or hide the information about satellites belonging to certain + satellite systems. Likewise, the \e {Satellite Status} delegates use the + \c {updateShowInView()} and \c {updateShowInUse()} slots to filter the + satellites with a specific status. + + \snippet satelliteinfo/SatelliteView.qml 0 + \dots + \snippet satelliteinfo/SatelliteView.qml 1 + + \section1 QML Module Registration + + \section2 CMake Build + + For a CMake-based build, we need to add the following to the + \c {CMakeLists.txt}: + + \quotefromfile satelliteinfo/CMakeLists.txt + \skipto qt_add_qml_module(satelliteinfo + \printuntil ) + + \section2 qmake Build + + For a qmake build, we need to modify the \c {satelliteinfo.pro} file in the + following way: + + \quotefromfile satelliteinfo/satelliteinfo.pro + \skipto CONFIG += qmltypes + \printuntil QML_IMPORT_MAJOR_VERSION = 1 + \skipto qml_resources.files + \printuntil RESOURCES += icon_resources +*/ diff --git a/examples/positioning/satelliteinfo/fonts/TitilliumWeb-Regular.ttf b/examples/positioning/satelliteinfo/fonts/TitilliumWeb-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e0e2dc888cfeaa9b7ecd53ffa85d911afd6d9542 GIT binary patch literal 57392 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 X)(&e`ni!Lqm}FBn)$~m-rkLK> zO);8HHQ7{GB^qKGkgjx?dB5l089-z9|KIoXf8UwUkLQ+iPkGvT&U5cvgcL&fitB_) zY@9f5`~=}I9~MG-aWrJ&jNI9u-(LHs5RnUnnDW`g*>lGvd>nE{2#wS7uer06Q`f$5 zE$8GD99X_$ecr~tuckE$VY-WB&#cbdw2|X}Y`Z|+R~KztHRPpRi-cHX5n{_<*A(Qf zbcz4s8_uuceC8SsnBOry&i**|`>a{Nd29Hx>`#R7x?KpjHATfM@?6JS%Y<-Er;W_@ zd0RKi-^FCg_o2LHL*Dv=Wj@yqqbb^OiP~7aY4fu`*zUwuYJGfj(yB#hlUZ|0)kEV{whxB6{hbt3>*>Og{g6(X5U+oE(^|tN&U1_)2 z`?$pGS2<29!quv7DQ=j$_5632`3`Roo+hh0^YxuudMWx-s$YWLV*Al0-enrQ?mCOr z36ngpEfB7B=vF9VFsNK6qGW$n!043P(l=E*`e*Kx`P1p4rSVfo-`2|;EkfL@PEzMy zh(#Zz5FVnhm?gAv6Q<4)K1F$(HwYi0BqrdBNfoD@X+_?q0?}txN!|((fh3AVkbXuL zGZ`iHeHY;-BgBtlr`RA;sK*$$8qZC_LvE2*$jx$-yi#tJ+vHX9YPr2ziAdoo?~}Xb z{qh0%pnOQ)EANqa%Dd#{?IlpIWKu{$hDKIwm?kMvHNa@r?zLLVp7LaP?0eWo3zh3h(7sE=y41X{u@krs>I!VtZM&6evfXu-c*3oD&1 z*nhY0w|`>)$o`>ypZ)LlJ@(P|MBBBt;*LAY4wb!7_H5bRW!IIhD$DB+AXgP82#J^4~IkE8gj^kG!-*mj>_`2h3jxRZ$eLV4a{L%d$-+Fwd zbD2T>|MCeG@gi3|AikH8GEq*DtK}~A_Br{6{D=Hno|PS1w6;(y(H_^n)yhmgO;b(F zOdCx%njSE{VEWl*kjqq;Z7vVFeCYC{i`CWNHPJQ0b&~4}*G;Z>x<2Rnnd?b6Z?}PN zOWlgyZgG3m?E|-;-Oid_%pvADbEbKcd7gQt`C;>?=2Pz8?&}>{^IeZ$GaY1d$fD@@Eqc~kneiWdp-Ag)_H|^ z_4V51b)(n&UKQSM-of5ey%&04;eEIFYu<;wPy3jCVtfYrO!HahbEVHcJ|Fqi`)2y) z``+mLobOkD!Y|Hmp5Ik|Z}@%ZSMBfTpXxusf06&?{t7z=A21|fWx!(rUj+Of z*eh^E;F7>=1D^`~DDZetM9_ku`-6T7?iai+`27&qkdYxpArFUq9byX&2#pUN89FcY z?$B>S&xM7DjS0IZ?76VNhc$#phK~#182)JZ`{BPuXc4gy%Oh@&__?P`&lx?p_I$GE zH$7V;Es;5qnbg!?XOi`AoX;E9E-iZ3Kw_ER_y&vxVqh*+7 zt>vKQeDtj7EzyrfABe7u35*#YlN*yCb6w11F@KNwHKsPEJ+^1;u-GNB*Tn9QeIfSa z*zaS@V>|kU^-1ZI+vkctyZijTPidT6TzuTLxXp17#eEgm7T+&^e*9nJ55`v~cqXJJ z%t+Xt@VA5?`kMP@_r0?3zP|Rv!HLCuUr0Qdc($KwzXAQ0_xoGFef@q<@=h9+v?1xa zq;HZs`p5U5-~YP)FZBPSf5iZg0sRI{7_f4{wF90Suzx_!z{G(&2EH(`BY9-<4w`oCXgVLs_ zU6=Mo+DB<$r~NzablSOeb9zMjfb_BHm!%h_U!VR%`pNY38K#WrjG-AzGj7UwFyl~0 zOJ+!BLgx6)qRbmJpUeC<^F&ri*66G&vmVMiG*}J}8=O3N>fi-~Hw=Dj@X;Z`Lo$ZU z7*aT7=a2`6JTv6GA*DkqhBOZK7@9D2+|YSLR}Xz)=s$IP^c1%$ujbN&y>{(E$F>yx zwIav1CVaGIj%}03)}kESF5SwwiYw$E$8k5&PwsGRdrJ$mgHgYaNEiJa+kPT~D8xAK zui_CgTNH@(qEL(x#iB^86m!_#42t*`iY=V8i20Ps7i&1aS!@(TMKa$_%seHO*vPR> zVjxi045XG4v6}O_VuF}TZEHBbi8>~5W&>p{v{)=wv2~@$qig|3j1sE773^=Id;vYN z(E0{w0i`UIU!#|uEhbT~h59$@WxLlr^@1AuQ)-@mwd$K{-696jLj_B>o?Y0kvp0F- z3i_wUl*ibM^tP{LU-iSnG1cy9F;m~(3{NcoFZpvZw+&to_=8+7HIfwKic~R7%%HSI zWQZ(ArjDg>Yz-sc3_sPlui&g2bqdJR&#q?#>ll+Nvx=jN2l>=BkXjTnL>gD9uTi6F zWv-ZlCQN7Rk2>;ay`DuItC6GPV#y`0bLy7TiVO8{EPdN3wsBP(EIgz>8>%U zT9pl`T1t?U())o}9OiO1!PPk|x_^$(Pp7J{pAS;Pw zKNE?vfGD+H~9vvcyzEx;9igbCeNY+N`=SHY~jyF;6 zCXg<}L^udzCF#R{jy6a1)_LtNVmThjwF9+L$TmtuFvdu&KmB+cxhbAs0;WRYtII*j zpc|yOy&O4sK)(g5U!k2cP;%&w6fsiYS90hMC5O4xI~!iX^Gm@L&T-_R%RtG&0a0f^ zh#X>|KZ3(rGJ58efs#Xaq=-U&A2}#lIHBaA%UMyzuFGA~cI2;UD-<2n_2AE_($C99 zl0JTPMe#`W@shNo+i|7KN}v9WqUZW}_6mQfCphk9^-h27^v(78ZK)&J_VgCv)8efb<<_0_@?Y9hCUh8xj#mio8qOC zXE#cwABb1z0EkU zY+BisvT0qOPTR)5bQ|wZl|4D+Y+5V)lx}JFFlIF_qrdTbf9RL8HBe=MD8Pp8d?yaE ze+C@Fwse1@+IIHANp(G%i~cBitGbbT<$MH2TVvzhAy{!}@Op`>k%;J0&v!SqCuw!2k0D6O95DEN15K!l0fGQUTLLKmj zs`Bc5ApMWj9u;$;DM0yQMSDB8l~2|{Bv=kc0yQ5f-;@JVl#YoPg;~CeKi?=ux~wEe zpymJ%F{N{kQ2rI)s{9;&FpgEZ{;@wPj1{-B+xb^zz*t49T!9NKZa4BO?xF|lca?$g zCa2*`4Czn4Adt0rum};M0&ho**^{+?FY4^g{1%N*h!uTkEnXxrhbO}0B+*|CV5Uo^ z--DRN)9{%YB9rK3uoyx#HB1ag8Y9IheDG*|`dBeej3?rnC~}beWFnEN%)`^Mpc%wq zvxpw%5TDE=K3O0ZibZ0vSR$4Z0beGTi#(}`r^St8m-vUcUs%b${8ij0{w7`!&k%zj z5jT(tsu$=*T>6yQE4~o_6t9SU=AyfppTA<3{#<-1z7=1K zZ_vMTqJkg9cj8~-Rp$Cyaku!Htj|xxEN4ZP_={L83W>GW6BBG8n@}t+7aR4sVGB{k z6-2=mVk=pcZQ^QjF5AU>;z=?uJH&P3dQpikejrWKMY>8iX_oHz3!CgAJ)|eIiJcUW zxAc*|Qc6GRF9T$t43fbzM514M9;GL9R}1TL@+q>nw8&@~BV%PB87Jdqg6zvWy`M}H zt>PEiUk;E1WwJ~mpOPxmWV*}{W#V_4Np@v0*^i-em>e!gkZBnuvyFU>cul-6$I0=m z^(T^lnM8hMikwQs(#8yWQk;_0Wv-kdXUbV}wwxp9%6W3WTp$<9MRKvqSIK4aGPzvl z$$Ys&{9Ue;1#*>KEl!Iw;yLn8g>o%T~yA=k8t9Gc3c zb<3j3Ysdv%E8Y-qig(1j;(&Ndye$rrh1)M~7B7j<#E0S|u}@wnua`UJ4f00v6gSD6 zY49yj|WQ|LVxK-7X#%4~jkFVet@_^sKl?JSv_ScZ&POZt*_ZpnEUK(LF35 zk&nv1$;ZrFHWa3$j7~9+UZ1z3qf#Lr>&$ru^&GpR zuw=!S^{a{swtBAU+V&W`vUqdeiWLPLHhZk-+;khaB9E%wRvKg+?c{AXk9Ra!;An8X z(O`j2JjQok?NQLVX&&$BMu9=y#v3&j=)`kkS4TWocWrx2?5x0Jb?2tn#1+Ns*XJ3X z^;+F+$1|tvTF*6I+b%izc_l7u_~SNdb79fS0=Gh)m?t?#Qs@}TBx59n2J0p{`dsK> z-Q=zsJ=b<^drj%q1+R78cHE}st=O`;z^zCpUQ@fB@+#`K<2KdcMv+0L8&_>GuA1Jh zpx1_OJ8sjB;u~~g8oyz+sbIrubFO1d#f~xM8e=NfiFfXrEgM$nm26pGl(%KGcX9VU zw^>HJWSr@=*Q{<$d6jhAahqkdTVjye##Nhi;yJsEFP@vaw%zBfC|FroRFvnw*|Fg^ z$GCj6PF&_F32jyqnrldCiy@)8j?rv!jApJenk_nUom*14VYTZP_1AlD_px|y>Aq*4 z>yYFYha~5B_003iZrcmHZEx$^c3WhO@hY8oEb3H6kE^;iN2^{K1@byK&7;Tbhs=2e zI`z!mRFt=Ajj>(awe2;#8-u+zb>ErOeP?sG9k=t# z*^SG7mv1T9w7IZ&!^+|-Hw;{nx6z|u!%9SGY_4~12I!1gsr)B=U#ZUe6l`5ll(*h_ zo%hDPl7bCI1*mMIxqn zBAH9yS5h$;G1iKW+#?KHS5TtvIjJM+It6X=N+K^+N(YkL}4)0~eP~7jc zH`*KQE%smRt@cX$H}*Drv%TGZ9(uxl++J!wXRo){a`pfCv3J;;y9!ZDz1_+kiYDhV zT4|!4Ze^TjE=BF<)KUAXOPw>0(Z}<&+45&47*Drzw0zE9W3P1{eKN-D>~b79#fR@b642@GWGpve?g7Ie$f6t^cDN7px%Dk{%?Ct z_bWJe5f8i0I^=$`>&V4h=n?(CbYHs48eCuu%}Spse}Ueq_B%D9lkZ(uU%aKb;4E*P zQ=07HeAAzgMwLYm;g9oUf7AY={Q%$BjU(vfXZm*^7FbW|gZ9_$|FD0Jettt)o*B6G zhgx|)fbti~gyZ@d=%< z^D6E?zDvLN+dnXlQ0LF~BkX^{IIv>-d-jhR_0Mb_wtry%)_L8<6fLU5Z$}s6ciu2agaSdQ`=?lU0X(NU4QN0=(Qd0I`aSB)`gmW>2|Q~cC_TxuCq$t z43FZpHTZSGXuHaGZP^c~ZTkuRZ#RFW_Br0ogBwTw?63U`N_W_Q>V6(gs_o8EXTQ3a zxp12ve?~oZMz5Ub>_^e%4!#aM#_}&3SC<_a*I-kO3;pP(KkR?Xoq9EA>Gi;^3VS(6 zyV<5)f0o7BF6XNCdg|?;b{)HTiyAA)A^snH{x{s_c?0E5k6@?Gs@3ju2z!j@|L*g@ z>5sED`qN^^It;H!E-8>$$KQUu^ZdUZTPc(==6sd)>Sr9qHebc&tL^)oSizYIEwj^N53|`Yt}d(*6clU7)GDmj0yIvz~sp z>YlFYk8L??brGDNDw>s>llbl;!#oY@&_TTise`t-o^97$j_e4C& z)6P7rd&LVb>9&KWU)0lXCmoy0kI^4B-(DidRTe-i)x^XV7hZdD&5nAGVqZ;qJaB>L z>PKp+r-2!}*;$j5Z_a&1_4%~bF^gT)CTI0HqPwr|eyzT(krj63t5!qm2{2zW$C{oc zc4ZaQhum^J*4z9tJgM0`U&bDTI$j&g;l)pLz* z>ghT%tdb|)?x1hZPuEr$y$*98zKHf>99^GaVWA$2{?+uqA&xx@BQ{`U)Onbb%gp4> zyMMwNrx%=1Phj@Y^XD=AjfDph9E;#g1i5uT_#@yU4|S4f|IeSm|9HA*=hGwM((c^}(K%k#ma0?L@yCz4+6l!Y#Y3aE0NtL{-Iy@_o{UpR6%EAZ{_j5O$y38V z;yNqs+KPd9O2U`=C@Ej~G43iUt|{#??kuUT9u(`k!zA=vh`P(v{bSs5Qumt#e6*lB z#@!~Rr_pdYvGY!o(BlJjx9LBBoIJa9sqjl4<|!)VWqei7)mPa=kIt_eiMQix_z{1k z==`b(C&ckpBT!$Vk06>+sILHtj&BmopxPgT&p~j6RJIx<8s22JAK_jr_oo1zVIXQlJG%RzKl^xyMHIt zmHzs8R9mV}RmUGc>S`wxe?lm2)Ru%^M(B4Sjr)+@byVH0{J;D3#M-2`3{DH#FY~U9 zlFYl(Zb{pbIxaOcH8M3b`RC;C_}-tqeBl0p_YKS+I6Uc|q@tvGd~=eb`dQUhzjqQ} z1GgqF=v&tJK%6b^K`Z3)2 zs@DCN`HvfzuX@q-?R&uZ#`gCs@m)h7y1qH|CdctD@%hZ>HJ_bchgDy?eKYA5->{QW z_lKQKULN(ig4e@dn+M((wfzF*d&LjTk182BJSxWt&vs)wsVMTt3otM870)v8x#z>4 z*Lki@n&+A0IndLRG%u>e)6K)06cu@2KWpTz3LeY6;uTHen(pZLPUHe7RC|fHM*4MP zLC@2P-O#tpeP7?Qofk37r=? zkqe9~!%m_jk?xz_C!}WbHz+j|nXNT{U=A~Tm_6JcblK072O4&){EXpQR1Bq_@mF`+ zJ<#w`*v2^ScqekFdIfjORb(`gJI=*KPFwj-(xarw;yR+FDMU%{Qc6WeJBf^j5DgI% zaW9#ei2KXx{%bUMQg?92_)a3DKHTfPkGsbA^Xx&U=T>fH%$05^hN;3jZ0xP`X< zLb+SPZQyor2ly+v6Wj&v2KRt_Y2!Yy8{7{b01ttOY3mX2DEJ$Aj5Z&q{3q1^DL4rJ zNjqPFufR9pTh9Lr`~ZFezkq*(qo9;JkAvU9@8A^2&VX`o7F2;6PzTQ8{TiT6K&=B* zZjY5JKQU>S5}1H1Fx#tS58w&BfiK7WK_CdWx5-ct4tj!E5C;-KB1i%QKr&?q*;{2A z7-nygBfu!?8qK-soSOk=fw>%CK$%7GK}ogQA=QeDq-y;SQnfmyYIR7pwVPDi98zsY zs?A8X8L2iS)n=sHj8vPEYQ=vcRVz}pB2_C=wIWq3QnmgEsWv0kW~ADTR4b5b1yZd* zsull(RINzWid3yg)%rh3)#raHRVz}pB2_C=wO%CER;1dBR9lg1>wl1HTQ{jTBh_Z4 zYDKE8NVN^AwjtFvq}tpm)ktjg9Clfc{ncZ8^>F+g&oadDOiL(sQV&P#;b=V^t%sxa zaI_w7or7EF;MO^~bq+nRha>fHq#lmc^Xy9q`s|Oc)-$SlMpe(K>gi2AbM_E;HjJl| zZYB%Rm-c!33Z#N`kVSn%u$7_c+;H*@w{YxUa39zW?gtNmhrnZ;|0nbd@D=z5l!D{n zH}Jc?gFbZ7hYtGCK_5C~Z~HkJ4U*x?Ap0q7;1vDpkYhPEonte=EUN;Yy+0!c z(AVpsJHZX$Mz9Oq1a2lfu$Q>vRpN=)z$YC06dVK<_~L5(?>VkNFG8@kGsxu(GC0H0 z9@HN|E+`g`+)S=wFLBJPL|L!F|JSko3Tmq)nyMzIJCA?&{I9NXr_OJwvk!H8QfE&` zoxysK&ND;w5MJnh44!TX8NOk(IEtqgv&sEUBeq-46Sh0Z5v{>91q)yM5#eXwPwwpq zeLh7GJ(yWML^k~$51l~HU?Ru?lQ=dRUpa;2Q^7Pa9puvHEY8mX^NGtA68|rv_QlX8 zjBz>V*ON=wP7j`-{Im384`p8fFM^lA%V00(UIDLy*TCy=_f3w!1>OelfOo=5cI3SjhRsV2ORdTncyw zR4%t4k$KP+(AA*O{*7D{J{RU+5#kZY@$1QsH} z<;c94yD3}IyvKM-wYU9utm1d9;sjPviB(i$5x-**C$NYUSi}h|q7sX!mdor1uDxu(jx|!Ze28mR_9KKEJ*e9U{qsTp!qJ=X&TCyc>*qM@-Fej6 zvQgV^p6_O`zsjYVJwRJ)L!2Fal>i=FWQ5i2WSnyRgqn|NY>4 z8#O8W4u&6LjH(4)3PqPp=#o1+!qx%!asB5Ly{W(%ONzF4<6(vHFB4#8eWkwwp@57Xeb>dSICx`T7R zl=_WQRg^kOsUIoT$T*rQnL)`~N;aV@XLXsa;0fm)_EJXOj67O-iqVVwGcgE$p`9K# z>E6VM6xxUq+KBzy1hEGZLK|^k8=ka^*sqP)uZ`HRjo7b^2%(MWpbf44m0r}KwT*bA zlW6WyF#=m0MVysQ4^+PwgC(@QoO0LG%S%TNjYJJ?#DZ5K}#<@mqA58x;83-~uU3QmDDpd6e9RiFmcfpd(p z0m_pI#By!Ka&5$NZNzeI#By!Ka&5$NZOrm*#BOcGZf#iLuUO!(SYRU-cvPmM^=Z&_ zd_g7{42HpVHLH)M+;qy#0JDHGqaT$Exn>d9EQTuit^libId?Dvxa!*Ff_?>~U+VeW zaC9pI-3msRg1YIsvSP!21G^n{Wwv%fUtGD)1E`#%H+sp_=+u);Jt@ot0eJlYynX=s z6M)wb!0UUXuYR;K5Pc2MYkURzD!?<~odfW$0eIH{EFu7l2*4r&@U8)P*8nUd0Ph-r zclE}*dgEQa@vh!7h$pQr{IcOPyi30BVS4gRuq*n4&qb@xp^NS4TN8R!PSn|sZduW- zT69ZAo=4EDO7yBu_llD_HXoZ@$aRa*0eFa>)uCrCX#aVl$adBS?W_&jSsS#YH%HK! zI&`LvxuT7^qK&ztjk!X}zX^GkOAGOHG&BYpiyT-J5sSAIi?t>zQ9KLrN?PZKfX6O8r*BT|voQHS={qrLTLZ#~*ui}uzsx)T>fT5~zJfbvRn zmlLn90IR_cqO#rg8hp(Od`-DyR&dS;yNRZpKKx?u9@TlKoe`gA)lx~Ec@}?Ei9f2u zA5{`_R^XE=@ky0%q!pi3iBGD;CspE;Dv3uc@Jp4%q!sw4O4g%QaBUxYR1W8kz`5Vx z+-W#>03UTmjAMH|oSuNMod|NkB+5?V*iOelfOo_Jt-w`$3bS{hdLXYa;&Z#t5bFUj)j~>JIm3`aiC4qT zb~vdrEN9`wSvb)O7h2(f%C?j<@^VJ0vMc5E{wzH|OU8Z(^N1(yAJN+%uGjrLbseFu zBh>Xfb^XqDN4Vy9uKAs~k#z;$x(aVyM-6+q{z2hM&-*av#S>yaV0^?}HEM>)*jX@DK1Ief=1GLVxyC_ovVU(1Xy=p#P+gpL5+8 z&@Z81LBEE613d)&4tx)O1V4kr;0QPdF3#^&5JgoJ+Y`%U$Bo!f?KWb&RoLzs zY_|&AJ%jC5VY_Fr-70MN40hXy%{F4Mjo51&_S%TOwqdW0G8`HK?Fo&9T8IId&9Tu6 z?6U&ftiUcSu*nMSu>xB>iyc;Df6drlGj`XE<~3n=RcK!mc2|YnRbh8$^qk)q>KsRz zT&|l5W`jALpG(M1|zGk&XW4#f8A2ZIjU_n+&oTEfJ zC2G)zDoUN>H(Y*LX%^2P4B?vLJmWEn6>K(jOn^=VIbbsN&VtSXDgs+iEss%l5Bo2G z7r{&5W$-$+zX^Q{ybay~?}GQi=ip25H8=#m1K)!m!O!3@I0BA=Uup9MP|qlyWaRGl z1|-#hlp2sw1Ge}Xw)h#gSc)x{!o3FU@iREo0EZf|%TnyJlok6aR_v!_A$?{whpq-- zCk9`dy7A>SBRdOUY8gQ@zXMab7++>dKlwh@#wIINQHq z`(}9G4DXxay^{NRc;5`~o8f&kyl;m0&G5b%i>t-rROY-Ei&NS2S}d*wnKUDlW@OTg zOq!8N3o>azCe6sC8JRRAlV)Vnj7*x5Ni#BOMkdX=e|1MwJplYdF3ngzCvu=8c)()d z3)<62X{YwoqLG)%DH&Q}4f|q7miuTZlO7X}f}Gqnb#goG7B6D58!POC2kgI#w)otXS$;vDC3*sb$4d z%ZjCz6-zC1#0Tg_3wqIlUbLVWE$BrHdeDL%w4etq=s^p5(1ISc5FL~g9h4IV)Z>?0 zhyv=-g%+ZKdi0@%D4-slP`;@JU1&iUTF`|SbfJaWzm8Qx9jk;oRta^?@O9`y3p0Ej z`q07*Ux!Y#FvHiO7cI={Eix2@gPx$b{c~pWdgheRna%5ox@(EJYl*gNiL`5pvTG&x z9f+<^Fr!y9?|dLri5b(Nqo^~RI!1%BTtANMRjxLdaw=at6RL8yv!U}SLuLbi_5rha zIX>+JX7X|}2K&es?CXpf8Jq4Zy&wyvabKrTfhkm>OUIZ_Jm%(1Vz-v6WqGqW#=+~PZdkee`-U07| z_rVAB_3vOG_y_oq_CE%n(4YO({VDVS^dR&z=s)S>=Un#%^h@Yh(66E2Ko3E`gBRa} zAKCsH90o_gF;Ggq-R~Y&kbSErn|7Yx==0RI)PM_c17_Ai?nqJH8T5dvyMta(b%)Rg zN~A!{*g(wK;D{L;&@dGTRbv61LO|8$2wOKhHtr3kofySLc z+pK7sm34_)X)Hwg#mqQ+$s@i>=KD2$)@XKQ!Cl~jD_jU*HP!<@c{9HTaEBt6S!5Dk zX(4nmvq>>Lz8Np_1hROB=U|`Z9@oqEkEwMOwfa%(Fyws#`JF^&2dO<7j~zqp16Y$E zpaoCXe9BvY3IC43JJrwM=;vwq0LLGqr@NTDO0fpDf~v+Esftgs_~80#BSC2$7E8n2#is7B+}z3^%@UfmC`MpEjYcr_YtMPlt}d^=KWN243j=teZU z8jY?-qpQ*AYBahUjjl$c&!Ev~(BO8ow;k=RMtiMjZ6jKH1|N9_tv$m^ryY&8qOn#q z;S8E^hB>&DIk;37l0mtPHwfL${c0cdvICtwiTps*PkG}N7OQ}3WDwMbt58RC2ok8!) z(7Q79u1vS3$wZAa@I*7gERM~F&ViCszyp_~ca`W}3wqb&Sh2U@eb1qPr*#|Lj-Fgk zn>)b`;6|_u+yrjMdTyaF_tO4-U^loQJOCa7Ptu>Kz|-Iv@GN)^JP-EJhZn$$;3e=f zF!WP#Y5<%nM?cHa&ocD04E-!aKg-b1GW4?y{j5YkE78wN^s^HEY(YO;@Wdz4QFUKk zS+%;ieiB_hgRVB>iObN{Mm%vDy4r{*E<;xv@x*25Y8kp(hOU;Ot7YhF8M<1Au9l&z zYRz{XU2Q;DkE5#%=<0EFwEDaT7U~+OQ&ZpV*zgd(n4wC%GQ&x1#-RXulQhZ$ta7XurD8q@F5q zCo(kd*z^1hD~%3T8Xahd742w4JFI9&8yr(l{#c0u)m{8bB;SsQYiE`50h0d!$$x<4 z+vRS&;{#}bnu*lbZ+m(cyXj`o))YA@XRTxZ->bV+Ehc>tKCLdq)&W}?5&;aIpA|rgTdP-5=&+gL-kZx#Nd3g6p~@2$c2w&P1`WH>Ye+7lWHwO}>q zIXQ^f zA=c=)$PZhwLUs3|20vVbA8x{rHDQe{SYr#;co1tmh&3L>|F+1x(a#>b2K`UZjwo9t zdd6Oi)xNUTDy+bnfmNA-I)|;E(QVZkl{Y%9&iQOg1e&6rO;OLDsi@ow&ifJNC?BBi zEDYdm7BKwidAwjb?HG3=RNhfNFY@Pi1C1r@WM#b2Do zUzFl6&f+ghiP_HLFHYhss*rS}?kko+RlIgRb?*c>fE&Rsa1*%M{xAGQ)BnpDtrR~| zik~ROPn6;(O7Row?n)mduU5)u@e!r?h*Eq+DL$eUA5n^rD8)xq;UlW>5moqzDttsE zKB5tM9(KfMhaK_RVMlz{gpVl2M>OFhO7Rg*_=r+`L=!%u6dzGad{#<)R*H`(#YdFl zBTDfRrT>fg%z}pcprJu(Cd4Yd6`#*V+?W-8I;6|_u+yriB<*|oyFMt=pOWCTMNgzBSV?F z?9XF=K3L4}gfya%cKlL1Z`8Z^dFOFx;si8#B9ToFRITcbd!o%)s=A9(g{7)HDb-kN zGnU$drK$|2T3t0VqqmULI*&D;!x}IBy!4Z_@f3I(JOiEu&w=N`9_oJqya-+bF9Q{? z7#@dqtg#+ztj8LS)zW_IJpeuf>RIj2DXX5> z{t~L5+5Q@;p4&bI{f=>c4}N6(XK)xC0ms0_&vg?=V{IX7KET?Vv9@Nctr=@;#@gzU zqxx+^J+f54PpC(p>Ng7Y$g~P;YsT7|u{N~=YC*m&$d~sJfI16EIosb>lf!I3uR#6xgHJ+*#Rk1>oV#ndl1)RSWB*Bk0dv3BOG zLvW;xx$+Rcrj4BMVRF8Qi7Ch_5-ohfYOMjE@B=y*iv9OM@4T^p6?J$0R}aZrPdz)K zexH34v&4V@&d%$3)8Y;K+ct0FeT%p7{>xi=+ve@OUGuN}+Tbo`(tCK{rh0?o{rn2) zA>OU{2ya#V8~1r07oYI<&4ava^9$aw`3>*a{1@-l{7L-6+a8bd)<@Ru;&*Y1_d}NJ zZ`Q2gJ)P%xOJ|d4;hmEmybn|Iu1r_nli7pcFM0D`On=^p8O+--!(~r?;S?=ndGlog zZ@o;C19;cvApJd;nY`a}7;m;5#ak`M^4q5wysvVB{#)>Sy1(6#UtDSG|Lcg4_j;hwPE#ke$W@o^xNH?4gB;xPg!(LgaPbR# z7C-o)`u_pL?AOaCQylfhsb7l51-T_jb9_cte6q|63C$WP(=&(3tTc0|IX=N0CF6oP z=oXmHPNr{Ksl@ zIUBw{Zrc079XVRkU;mnule2L~pFT5UZHfBMJ+ZlQeP+g}|GyJ&Z_r-QKIL9O98aN& zfXvj8AUAX9NSPH1F(>%Q*qHc?^i24X5ty2p#ev|Uz@Xl|+B73Q=IYh&R z`ovy2^77~nWA3KLUrRUM2SrN(qfhPn?P+jgSY$^SVZeK-3}IwAQTDfHO(<8>FUH zv*r~6K_R_m>_Ag`<|vuw_H=Ss*lM5tQDK84BUi`B8(;Zp)Tq#Pm;L3r6C*~>Q@_mb zZNEV@awY$(Cx8LE`O4UlS~{{$i_#iH`EN5`t37*XIBJpWue&*QZEA4D{IXYm8$T{$ za{)CB_0T?v?a0QKqL8`2_Bd9l_?Q~vhkE(-iE;Bo!~7m;-F{8WHFC^dqekB` zN_+eX+nougWlmXPefbQ(p?!yZT=^yJ48|3cdN78=L?&~PhLRQYclQLsD zS4j)Of|s*rWQ~;R@v$+!G9fcfDYGxWrP4P4>B+-~ju|;6+?==O+fg&`ko_*(Gj-nT z{yr`XdcBvkcFJFyts~QR?TQpJ| z-T)aKZ8iqz?47e$34!vY?U4VtF+XluH=raY#_NhXL$e1Dn3)zZAwat?|CQdKZQSbb z-eXQs_7&+tW?vrMMoNiD$&0ZY{|72Q#?72%)Q&y+MW^}!6t_1U|S)_orzVTm3;V&$SY$L7TL9y@rB zZTsrN@evV+mn<0`8_T$3Xwj8%2N7?Jtkf*C5_UR6M^9s8l+*)LM@gjZ797<4pcXcD zU{T4n>#w=$FE=u9kGz5*!-KUOhGftC*gazPp)207J@aUQ+k77>Ld;){8M0n+b_Da% z8}cKpLmzuuut~R^En8&rU3c03g#~G>D0cDg6Gs_LF*cAgbGFV{kho=glYCLPvTU+u zN2FD^1aBD}mk}qA*pA3}+ba36+_rt^#!nZ0Y_zvpo|AVv+lvl%)h+lP+hqBU9FU*? zS$;n9m`823Mr{LRhAV~Sc4~XrwyI-$@yClk-AJ!^$AP?GdyfomBwIl~S}z%kcOI!_ zq&w{^MAA`tfAp&81!3{|mbJsjgt{%ATDZbivsnunJ7Gq0&*ERD-*YE9dS&so3h0^`( z>5iLY`d+rvchbB^6lYabFpinRtUPO4U|L{oLbN%MC?n{F(ibssXm%_?Pq1!OCPg#SbEQk+nuLD&M{MV%%kBrV zva&Ppyf=cbwm%kV})BX(sgjgClV@wE9QWR|L|yv? z3gNGZ28MbVgQR~Ma@D6jpN)I;ify|WY>0K)_VL8At0wi4ZuvMKzn5k4o*?rAzarbQ z;vUaCda2DbdKv8>&1^#ZK%TZ8E-sdRH_E=Y!`fckG1;eMwxhiGkn(D_qg-yW5-mLo zB%l7PF@n&H)XWV3w7?*@z>I_qa?!+mOO`gQ;~(oL7$em(DaX4t(o|zvc=*6rlljBq z;#Id_`@(D2-@S_FzH*lXYx!j6O~2#llgWki%o+5l zr%YoQu_nI$xt~1r(Eg3SPi=n6m%`;*Xvb_VwWC4{={V%*%Vk`rO9&J;ysb^)im4rMp&5hV{W5s3&)J#G(@L#eESRSy#LxQi*zx-&$WgX0w_hXEx6j)w z{kLzo)&25ILqw)>Q&D9uWvwH``0Rs4)Lp;~cD$W;_3D=KitF4DmW|r`YL1XhI#HVLvhwd?i^w=b)Z2aY#yYJcl6aQoK zUVUO)Psx51uQXavaRX6LaCC;u=qLBv_REpBk#dAKHE*3QH85|jJj9R{r*_Fytx9oI zD#Zgb_3Eq3wW_?1MR}$*s!VV0x4x%+t}Hvw%zsgM?=stG%e?z)@2lomrR@VU-c*waS8t(_xE>NaP7=C-2XaNd`yB zP;*QIlON&FC{{s)A}X{^4Kcd~r4gEB$hTy0h-qH(jG4P<&bdA|CVRQXW&OJ|PmCXt zIygWsIvEmdnjIJS_|$P`&pv%E?%K47-0$6P^>f=rTPjmmr5(US@s2a;jCtT$W}q{g z^be6qs}~pDlDsOWXuR8ui~(sWDSlbfzR7lMQxB8&>F-gt`BUDS%k0R=33thjpPHVUyTw$HRn>gurPmp=ItfZf)5rA9Xc|% zNDdkuaie^|Rwy4>YFRhKW1*Ii-W%DQ=uMbxl{VtrLA*atxCSve725KLKvUHP-?D-e zl+%kv@?-*{q$@mBzB8GBDH5PB&EbMq z$3~4$2$pUEz2%~$q$NoU)mX>y=M<7)9jj)rVEPsk%%BY|e0BZ$$)i?IS|5{zN@xcv z;x6Aw;L>B}I6w79bgmVzYWo;5mZ;_%759!=zka-pSlcFQeYXC9-s< zW={V6%NX#AR_3GqdN@;6&l{<4gj{j;>KT-2>s&Uuw3x$@>_`ZMy1tL}R6>Z?X; z2W+d|KCQ4d{-E3dPa_NQHsf&2k=t{63$+|dk6*Z4x!%CB>X-8NrcUo>&p{Jx9d znp_mkzohhcFS2B&Ci%+qz55LsRD7c`@*s0ik*!0@h2w%$-cIKq_5T_FiYAR-IjJZ% zGc8%K$H_mgHMG{swHK_L1C&`}QFqs_UfHywjx`=*Rb|3&+%cfW16 z-#7R8N!t=^w*A|E`m)EVFNyk;1?hew)ETBL%QWfcjUV!luUWlx{Y`@kqKn45=VlE` zqskP|%`z4*(UDmZC11{cW3sQSOjBM$@nr$^dFYxEoS7BOGTnbn(cHQ7Muf=o!?XO> z`}gc&ds@k^FV_1C_M+CjYUoj#vI{l$!VBlrEB|)I+Qb3RPbkP6v9!0#*0lqYo}OAb zD|=~gd52$kW=OA*k4^S>UF;VzJhbP~ho_>SQiN0QY;BjCCkewlebfl4ESeOb%)K=r zZkFrV*tw&!vx{z(4;&lO*EHXIdXaVM-ReI*^ScjOD%F#cLPcS^lhWs9m^(_!%ZrL8 zja)rpeNfNvSHX_{CMI#X}*W)4OVXj9(jakC+a`6LoNs%9YgNxa;#y|sz%-TN3B^ca zvjR5fuh_hM_vRJ(o9~wA_wH@9z4TI>>QN9w8NKSr z_(hdXtIX->eLi2_p8RmsWoYF>JGiq>v|A_1@Ny(-qF1d@g zO^cfAJt*PYWz$@ixb&y~9DAa8%dl-U-9M-37tjbIZL&nw-}$0MNUWW zfm^WZ4?VcvoHS-^KXXEcELv#J7_z~tw@(bJX{4NV@w5JVDC-g8Gk=efLnH4Gip}uv5%6|eu&2j@ z^t9d{^AU}*(uv|-cxYq>$k2rb#s@AL+;h*80Ri-RGCK2)t~0vz z`NIPL*vUnFm^f~G$);kXB>Qan4gaSwo_V^{^O)7LU3WfeIvyw!lsNRcTg}=M?|DiF{B5iHqu|=_NzI}IUA%3w_qT+_$ zG1@Zwc|X?$zEff&f@ILB34}G4X?y)#Z9m6N>J{$oo;J9bg&DI#yG+Jv|1xw&&8W&( zg{&!Dqg__QhvVtu5p4#UV>NFuuVs?WQdxH4$moZr>Y<9^?^LSmn};5%y8nLLYgfO& z{hD_R;uGEa3=0g380Ti$GI;1CPgXzvRMq2h%f1_L_{Xj>-Z|#j#eLnz`%QWy2M#6k zAI0*tdx@&lx+pk=Ks7!=tx5=FND-MYh*BrJ`)XN4>X4cCuC%~8l-LW=70T5 zn)SbvXD=&$YUU#w41%VN5F2C_iA`3~fzhZ&^a%M{zU>WpS>0W%J-Tx!QbpMp^C-}{ zV8vr5s}*8;?4gGZE?x89)z`c`c*Zp)f#E50;*t{kC11!R+o=^YV`Y4j-^LZY7pfSF z|23M&@?G6&5&Yxo;2ttU%bPVz+5b&)w|vpL$__BZ6cg`|(@isX&YZc^f57DA*6`tK!w*{pKx(%3FXBc_@H{|EG!7?m=)29558z0G6_7g6D z6^$l~@>hYe8CgUChKy8>Jgu=bH>F>$%h**Z5tc#g<*!pFCiVC%d4RCADBy$_LZ${a;6@6;fu65){XE-WqSDPXBl9lqYBev`(^~&*BdpP$t^*K9AI>Qe~GJ|q^2WJh6Pw;k$ z2~G?Q>7ASuvnt(e8m;yA^(shGSHbtMO(80C8%UslfBbsE;KV{xi0$)V;zv$Go&)7H zS%4*}yKy4G;zwj@#CZc{mhFq}*rr8@FnfX-lGJ~kKM}+-R&7}84y*b9&8xuEeTydX72x(b{CjFo~xI+FV z*>dP;`l;utNj_v){*V}#{+nYikr&t2kry`^8D`T<_-@^@ zRWinrWA-EskZ?hs`L@c)b1IMH%r(o!tEVc>Re7Irm#o9YoNT_Jj)y8^FR0`E>O8c| zS;qr zr8;7!3o4zGvco$(!8?r1YWmflA$@(qR9>@lxbLS%drmh8$3SvPU%NQQeZ7Nsc#iIE zB`6OGE@YT(28GomjmTv_=t7ra;p9!A6 zW%`rk|L0i-M@J9Vj>h-uSc7aH>=mCmYSbs{ZorfM!~UPzt_8fR>Pp{zPTqk$Z*r56 z7kMWnBqX`HBq8qvNeG0HghwC|LIe{M63R=4hf>5k>gX5{I^bif_0fvfsnU*Z$6DJ? z)jB#VT1KYe^x>nlqE$QUn3MU}-uv8p&bjvn=zL=bzi;H8z1QA*?X}ll>;KnID8#l? z$SSEd$|>Fha(|g<8-`o{k0DgY?)ZJd))$pQ?O9ywfMuP$Fz^Dq{dVQl=2JsI*{rl7 zoYo1;Qa+W)GXPnb0G#n2&jdkMc#1q`;zP26X)RQvmk8G^O_2E(-`^kFvcNf+1^ zGN>ZX58V>lX^8Zbb{eAn+K;$$@{qs!DCy;N-$E;m-#*BdQheJ?3aNj44E>Te8v7O6 zX#9M;u8g9E5Uz;O#10tpDfIxCowUQ)iqsBcGq-Z(5N$+q#enzqKH>z$290~{ zyK*avp+a8VYgwY{cQnSar{s21`LNL5EBIZddJOG}n{c!$$1`?OAH`&sDu$qfi)&+< z7ylpSO{AGmT5lEu^4w5_B6o!u@pMj@&91AYo zU!9uZNU3`80=u~#T zY6K}DW{qbxrfCmrWNmLHR?OO-^02g$qCK*bkrY|iDc=LlqCR6ubG*hPcZj7gZ7Hf3j`rmSjt?W#SWFHHSqYVNwGS-(gL zpRp%*@8a{Po`~9)d1%>N-+M$E*sFcwVo!xnPHks_)mk?a5DH-vlm_Spy$x^4u0ZNs zJ;Ra#-7;laG_F_Ee(yvB`u9*J)91&8Z4@LUV-Ae3v#fpxuf zwnc?POq+4}K5{wJWnC1N=Xw6BzG)qvnkL(G9(Sne`eyg?`<34JSw3!xyeoakoxhe)DOA_U&c(y%{J{+eTp48tt>nFj?^Xi zkV`;sFI|oViVXSWAa_JNaau{X)z|koG&CnC&q+?6R-*j6tLq#3>%NgPCk6jUwi>%f z`3RBu3?Nz&Bcse3%r(4F^lwa6Ix6&BTOcro5N>J-8&rW_=8v_G$ylJ)NJX=WU&Hu=S?S_j6AiORt;gJ--p zd=CrT5;4S*=Mc+5Rx+%kc@$RFJZxZ;? zKZjrbI*%pkxki}j#?j}=7E`v-omM2|lJ>EGm z_f)xSds8iIQg*M=4t{&<8#^7ruFmwXy2{9?rIBfkb=u<#o%^r34j~zykwrH5HJs47 z+-Hx2C8dOJ2~T%s1V{Tav5g~kdrJysDaT!(z@qXyd1M&3sPHYLkpB!1i_;tukjYKvep)T&9AZf&wb6WRr=HB>6JU|J!qfX zd$;zh>!Pu*B2r3g+s{ZpaLDFhzhEcPBD7h@kOxDfhnnALd1vIKElZYcd28oRZb2rn z9{sw%&P2*bKo>}n;kgr(1de(va<}l?S!hyDesjUv!96*tbD9cQZ@R8&Zqn|^*!p=1 zyJoVfplcGZah<&J#-O3Zp~@$2_^P&i**|A%Z>ns0`@dwed<15JsHMy+^eKjJU3z?& zuu##+Y9Rc^?W`&P`i?XN#vH7&msHBr8o&1dW9|$VEQAu?Ua2dZqGs&Z*al6>l+WE( z@jFr~%IHGz^_*@JyYVoomEPW2J|l!#_i8U&np0zw+69kUu{7HwbxVx;RkZ8i**hOC z>rpO~v|mc=V`+A?w4EaBi`nED3{T#dc9JLe8!3j2tTgh!B1|t(28138qZ=dl`N=RXuJw!u1w0Hgg1UwmJIu9BVfQ|9;uoDSaCD zHnKHWa3ercXIc;IEUrt_z_8eLlnv5lpWw1%K8>;~aN}HMc(fuXx6Bm5ye7XsU)d1U zdrxoR2IF8@c2-tO!_uVPzD^DlJseMuQ z(9oFfuQvyUr>A9v^#w+DXb;5yO-R6vN^fOLch^Gf5&Kl30sta##|Vc8=($KFwkg_8 zaJtMOL_t;dnLVl~%-L1htPr|-3^416crc>sWbmG?!*^eRNcCs86UJ#>~;$xLZdP z+S(hhP5aFYvwablZ3}K&?T|Naja zbGpaxoZ`gt68E7ItDts7t8^((`JYe92zrZHHDX0DHlsQBdi$MCHJ3wjyu`cxrX3A+ zJ8rVd7<)%!;~j1(rQuhXF&EMN{37Nh&M>+zTCtr<{jhUgwHLngk#k@8L3sZE z#<~R_^(AN-@i$=ZaUt+2_X*|-@sfH=e~4S^y^~)UaH*JaWF$u5W6@b<%16wOGv*@p z(@`Z-5wmbi>G!rLFLmFflgZa@DuX3?U#1#x4C$Gc3CKiekU=J!;S4g$_KxWY5<>3q zoIc|AcZN%v;rH%GkXHAB<4fYK+=d*bJE-gC?x1dO(U0ck&#qgsqRuV<4Zh|SSrQK) zMf-F_pVA20ulk&xy2P9!k>Yz!OGmur%A}UTc)^K8>=>MN#u?3wV1|>=AX`d&p8MPr z%N|+dKJPHb0<=eH%yf!y5HgqoFMwRpR&wK-MIJiXK_p_rH}}dWt5Xu(DCe5a#mP!S z+RXYWj&>HO*!oIU$2U@lC2WhXI(pd<>7?YF$_ZcK(`1&Cqi^PAT;7qF$Yj_ z39;x?eVc?O^PcZ~VapV7hyJ4Et4DE;5n3C$FYfD*nW4jnC{mm~Bo8zp97I8@FeuYgLS=AAqD<&i7r zQ*isKtbmWjaSSF7qBKQ16;ZoNnjZrtQQ`n(98bLk@eevtym=WiaAl%r)Co&rW@)f- zX$NrIRvy3!CGHZy(Gr}SBf$_FB>bEM1oh}fB1yKkjtjb^c7|QNn*XCk6LXSX+_({o zfw2kB2>JTFB|;g{)zZVNK!f3~(Zh#5?2%C=zrUuYzr#Qw(XLaFno>~J#m1_DG@w_^ z326`=*iyxEBNxKVEIH*_L^45^ex%F#?j1Ja`I0c zhR$#AHC2KKM0XF{GwKb-IV4QW7WimbL~_tLXTBH1ej<|3_0#vo$#DLrHoM zA6ISyLCZZXc9Vylt1jgyIA76LH}oi$9+1i>8EzJ(xyatcJ!|B#V`xzLma z>JJUGjbASs{TdXSz=)&%2Lf5N3Xb5o+3Zd2h7#vBV>_LXvgi+I zw=G0*ep^@TZrUomjzTY5hrKHEd=$N-$~iXD?A-lHUfUA3Ub|4z)}uX3>jc?>cyeRk z5T8Rg#G$42jGU;Tr248yRUMT)!%(Xap#MPQx;Q(pAG77P|xt$0U zGvk(rRScD{|Dgn3$rW;gtY{=SpV{wmf8Z8X*EoxbE`{Euj2if9Li332rssM%OHItm zQE{SSTy80(1FuiaX8krW=@vx|mNAV+EXVJ$2mPIAGNb_lo`)`1BcmB6d44YZf4Xs1 z@cH35KOqy)k>Kis-9=P+nw;LP&fE?+^Sx^GLQwakIscu|C^PvCAr59ZUxA$iIngQE zkB^UxbXQ)zxM8T|s@#lu1yy$TaZ=8n>$Sy;H5odw=qKI=OMK&rdNHgP&-zwkz zhLgxk&@;NTkFg7B&**(vr8PS6MyZR8hm}QqB~CxM;0=l~5bnqia*g&CGR{_H-)9?o zN3`D#uHNh={g!X#elrt)g#V3fqnhMt-6}ureQMn(`_2PBU(^18e|gROtB+JZf!stUX$B8rRu1tRrC7=@^Kbx>Qe=;lq8j_niG%^;CK z$B0T_JNa&E$MV$v=7#V&{rmcV@=*BZQ^U`O2D9G;4{N_07IUv=1D`?s9Nh0j-kk_K zQD9~f!iw{svk-fs5J8}TWc-DA&|3?OKDuVpCxylTITS*4=sPC=RD5V|*}hWN@mld% zIRP=2E(PQCz?wDV+X296U$W%nlD4vz${IbAxPV(q?oaxvxImCHOVtJKeb`QO=>_(v zJhA4(LaaipJB)acWIZKgR2WUp8r{Y1rJFe_a#V^*D@91}APY6#^@RYF*^xnFgFNlzwg{iD(fBg}bwUffx^fSKo-0!4{B#FEt zNr^9vlc-i^s!T#f6Nott4#2nx>(shwwz*VE6_qdAv{tiWdO{@g6gWeVb{ql?7eTd!p?_k*X&Ft9xn}Lam=RW_O zvby1eu_SU;DGRh zh>;^SE7<+?HKH4kV0>KX_~++ymj9h=mS=J)mX0`=uYnwx2Z60Vf%!$N5bK6(-O4vEh4g&V2x1%NezNV5IJEG)>617-k`KE4rwy09Y0XUFLy za;D?%o zd*1DX>N9%=5>ht62W}?E(6UL=M~!Z%H{$0x-4UhtFo;9&W5`Xl3oVjoQLQFm+9e)0 zLzkX8z!_V*V;5(PnZ$p6q^@qH?rK38qc<7}@$?}^z$>--8Ut03C7!n%^lQ|NJB=V; z?{TD>p}qQOPH~O!ViSPh$bDXY6eo38+BAZG-HqnbgLRt3H3atzU(%Cf!Owi7)Xi>3 z+FRuPx+{(S-U>7c)y6VtOfZ0x?z|W{`l3$OeKj%(HhO$Uf%!VhL&aDD;sqk2l+0*&edAl9&9*t&CwGYcnI~XX$~iq--F?K;`SLjm4c% zA#ZoB+yP&K}!UKE#m$=AoGnsZdS^#2oL6w;8TfXB*gw7^_Y#Zei-SSp@!Jo z`={mLw~sb2_f=yzho*z0pV zdm{Qgg_s-8U(iBDX_ZV$-?;lcIKn=WJw8F1BC5hcBbAv2V~^7RFm!s8Jhctu{gFJm zMc?|0!ETGrWgB|;UD9Q7S9$rK9(SR9=ns`=Xx{`1I;s~B4j?Z&!b;k@ zv&y6DQfjKI7IY@n#uhcrI(V>j5HSJ#1MFo1jH2*`furK(X>8WX0JNpgB`5#D`rUMI_Sr~Wm z+YXN$tF_ScNO21LVia>R{@w?xI1-a$VHSTu>d(0+%16+C!S8U22*Q;yJm`Xcg)EN; zF$I^!^kCV1^a03X-^3%cf-{(nrMo0+kmLd*ZLUA&;0Pw=GT4L42V$lQrU(U1(cL6@ z1M!c8rmh{+VxhNT21YJ{hgK>u_xD|dk11RR1cF^!=OGWS4Lj{ z`)KhAx_CgwoqBCdo_XMRBb827E|ZtXkK;KvYOd;q`Z}#_4o*=D+=_E5 zUS>|kp~R;CgkQ`RzmPHRVPOw(ZW5G^e$mA8kcmTP!5H6cHaL@tJNZWbi_(P531vkn zV;a{wqBQZ7AXbU7{TW^##Wrm*7PHc2uo_B?*?~iwFT;bmL&VEG2qCbtP?$;ww&vO6 zdg^;U(ACgN$o{U<1BMLULTol)_YH>+ih_4e^kt=*ZHC7uDqBI}$+x>pcjuI^=*}C} z9Qz#A;d!02Y$sy#RG!X>rw{<+k3+BmPFx&9qpWlLtkJa0;)vSrPip2wCRL@)t!*io zaeR_IhA?$?beP&3u1@8quAPxv<@T-~<)?+0cLlnM#kG1~@b^vCP2F66;aAZMM={=> z8rrfrRW}N%f!U+d`A5R*^CK6g$RgKCa!aiKo~#`p{XIW&p)HGC2e_MJ@$^K!9lmei zjUJGvtJjP{DaqTiNOv22E-&ds^#N5%_v$5Dw8*$lNA(-MQ339kOh|QrpT_xARsAx~ zV!4HV-khg9k|)KU|FI8cpZ0WaB+vOR^Zi=*E)4{kc#l;QJpQ&(o%| z|Gw+>&VIx7b~zLaY25a|yIom|YSBGRkyqTeiN_*&c9@@N^pQ$TQ4#Owh(H;Iee`wg9_RulPI$v`3Nu2K@GHED9-{s5Bg;z3->t(JP!ov$d<*Ew`$F#Oe58u zhGLiV#L9f%*UDJ(MC=wHlKADgW9r?viMwGBJhutuPRa8Z_Ze@d46T~GN@9|}|2b2J zZ+r#z*rp_?hjEV)$ZApX*cbGKwT!(%1?*n$@G;wX9p^UfLl&iNQzFvyl0xbt!#GzN z#{+RHP`weBJCs*iBo*V_8DE{~(pGl8=W8B6)^@U6CM$krwd?#{5M>^#LtA6^Uz$Ts|q`relb;%^Gr^R^d6{j*pgwO%OtO1tvpg$wwmn7v?oS$T@L<|+#= z#^10P_}|d0rHAmIHcmuBfmX&>WL0k6%I`VsdA420(Gc>+;R3J;0r@vY+^~;J8(kC(kb8JZ?1@{FVw&MQ?uii z9e;~ASm+<@tl3lVs0ElC`W<jfjZW zANyfPw!OPxF+KAWxySS3kFqv%SytxqjLCbAPyc9zEEP`xy@f}AvO6-{%r5{@J?{eB z|M0qHdObf;$WNB=!%S4$=CK)g3j-dQOVl;{4r-ZcC}OtkfiZX}cpubu22~(2Q@JQy z_BOBKmBMRuVMQa^X%?cUb2}s77s6{slyyLiFS6$PnwtH!_eEw$MP)}SZ!B*AUR&E8 z+1b}-Qp&~_!_G0Pj>eExLVmD#ZrFw`VF6c#R*|m8LFPcn%=3b=NCI=Oou`8Z zR|eOGxcJiYv5c9U>dW@kT$NB66|f++Xm*5MsZqWedaZN8J*!uQsEdNOgtN*P$d%0A zuu(NO(tYR(By%SJ$A*D*%8ysBc_->cgi>&4lrtq`iZRrycxpu;m=QIj;(mB&C9VQ@ z2|TpojQhY5J~OFqPwlK3;f|i>1baebJucj8`pVQ?Rn1Cw6&JbEasmS~(;rWF%#3i{ zH!E&NIK4DsM_&PaggE_TOF2@V;sNgK31Yjha^$FX7b%JH^U78&Hiq@T6UW2 z7{!BgU1zB#-Dz2n4>OpKUreHH-ug>Qj?bYX~>T`BRL zk3xye=0Ih=5XcIxB#RSe# z+Pz~aVPzy(lO5gl&WKg%RxG`Hq1d#NTYqrt*`zI>b}RLh&)~h6Y_5^rN{sR;o$7&sm}pj!#Yujy={)r^f(X-%E6Y8HD}yW{=$*;Xy_ zi!YQ<2V%6>muSz~*Z&P$$ClvBdfSVr5?#nocJxrso_KM9-oa6(_9&HVG+`^Te!^W- zmBS-5p4sy2$G5T716qn&`Q;r|1*RdRan_6tU5MtGuZL+z4zXA&pi#}F$8P3CJ=04Zl0^zo~(h{w|}sxZK9o>|iQ?FKsctdRBQH z|D8M>vV5qV{w%MYt~_q2oIYpj8%%+&Qv7VX7aZ^R@q*(+sFfVezbprer7TsYGRc`0 z`{k>R^6kecuPHIk{VxGQ BF@yjB literal 0 HcmV?d00001 diff --git a/examples/positioning/satelliteinfo/fonts/qt_attribution.json b/examples/positioning/satelliteinfo/fonts/qt_attribution.json new file mode 100644 index 0000000..b434c48 --- /dev/null +++ b/examples/positioning/satelliteinfo/fonts/qt_attribution.json @@ -0,0 +1,16 @@ +[ + { + "Id": "titilliumweb_font", + "Name": "Titillium Web Font", + "QDocModule": "qtpositioning", + "QtUsage": "Used in the \"Satellite Info\" example", + "QtParts": [ "examples" ], + "Description": "Titillium Web font designed by Accademia di Belle Arti di Urbino", + "Homepage": "https://fonts.google.com/specimen/Titillium+Web", + + "License": "SIL OPEN FONT LICENSE Version 1.1", + "LicenseId": "OFL-1.1", + "Copyright": "Copyright (c) 2009-2011 by Accademia di Belle Arti di Urbino and students of MA course of Visual design. Some rights reserved.", + "Files": "TitilliumWeb-Regular.ttf TitilliumWeb-SemiBold.ttf" + } +] diff --git a/examples/positioning/satelliteinfo/icons/checkbox.svg b/examples/positioning/satelliteinfo/icons/checkbox.svg new file mode 100644 index 0000000..a557664 --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/checkbox.svg @@ -0,0 +1 @@ + diff --git a/examples/positioning/satelliteinfo/icons/checkbox_blank.svg b/examples/positioning/satelliteinfo/icons/checkbox_blank.svg new file mode 100644 index 0000000..71826ef --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/checkbox_blank.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/positioning/satelliteinfo/icons/darkmode.svg b/examples/positioning/satelliteinfo/icons/darkmode.svg new file mode 100644 index 0000000..99c691d --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/darkmode.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/positioning/satelliteinfo/icons/filter.svg b/examples/positioning/satelliteinfo/icons/filter.svg new file mode 100644 index 0000000..8a132d5 --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/filter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/positioning/satelliteinfo/icons/help.svg b/examples/positioning/satelliteinfo/icons/help.svg new file mode 100644 index 0000000..b48ec5a --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/help.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/positioning/satelliteinfo/icons/lightmode.svg b/examples/positioning/satelliteinfo/icons/lightmode.svg new file mode 100644 index 0000000..bb6e58b --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/lightmode.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/positioning/satelliteinfo/icons/place.svg b/examples/positioning/satelliteinfo/icons/place.svg new file mode 100644 index 0000000..d8a9ab6 --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/place.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/positioning/satelliteinfo/icons/qt_attribution.json b/examples/positioning/satelliteinfo/icons/qt_attribution.json new file mode 100644 index 0000000..dadbf44 --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/qt_attribution.json @@ -0,0 +1,15 @@ +[ + { + "Id": "material_symbols_and_icons", + "Name": "Material Symbols and Icons", + "QDocModule": "qtpositioning", + "QtUsage": "Used in the \"Satellite Info\" example", + "QtParts": [ "examples" ], + "Description": "Material Symbols and Icons", + "Homepage": "https://fonts.google.com/icons", + "License": "Apache License Version 2.0", + "LicenseId": "Apache-2.0", + "Copyright": "© Google", + "Files": "checkbox.svg checkbox_blank.svg darkmode.svg filter.svg help.svg lightmode.svg rssiview.svg search.svg settings.svg skyview.svg sort.svg tableview.svg" + } +] diff --git a/examples/positioning/satelliteinfo/icons/qtlogo_green.png b/examples/positioning/satelliteinfo/icons/qtlogo_green.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ab120f79fddd6d9aaf36eed512676696883c1b GIT binary patch literal 10836 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 Pw1DvTZgy2R{yYBzug(c$ literal 0 HcmV?d00001 diff --git a/examples/positioning/satelliteinfo/icons/rssiview.svg b/examples/positioning/satelliteinfo/icons/rssiview.svg new file mode 100644 index 0000000..3da09f9 --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/rssiview.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/positioning/satelliteinfo/icons/satellite1.png b/examples/positioning/satelliteinfo/icons/satellite1.png new file mode 100644 index 0000000000000000000000000000000000000000..e653e663eb444321a37f12d06675fbc1984f7959 GIT binary patch literal 2006 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 literal 0 HcmV?d00001 diff --git a/examples/positioning/satelliteinfo/icons/satellite_small.png b/examples/positioning/satelliteinfo/icons/satellite_small.png new file mode 100644 index 0000000000000000000000000000000000000000..398fbb40f07e31c2cf5eff93a7c613f635cf1a9d GIT binary patch literal 1382 zcmV-s1)2JZP)-?0sivcXpgLLD8tiP~YTC=Es>l-+AYI zzk?c9Z2c-X7I%ZgxZ(7Hou9xY3-fv1T{x93QNxLq@IMH1dLBp<3mBtCv)64EV3LJd zng>1202-GFokXsNNfs{RO+fQJ=ya3@i8aF{3+E{kNQSy-^;Gq_r_Zsk-hS|Pm_(rs zyN`OOnx@T9CsRm_h>#waAVx-eWlOf{@b)!+xJlu7KJkQ%ececPy3Kbr!cI>aTv(63<3{}}g2EvIkNDrqWnv6n@QM_CYzp7);3wBPge;Q-# zj3yEXM@L8Z-7uh_mAl`zm6J8ctg5v^6eBQ}8G-TeXhe+kpUuTCmY5BET|S$Iflvqr z2L~aQPP;@=3`_(duDzW9;zaVExz!&G5|j&JYz>Cb{lKIy7-vl{yKUyJ9vfCw7!yT^ zL?Vz(r9hIT&oi0Kl^X^Wm#6lDhJ;GKgx`cK7tarAwEyQ2`pvvV^6Nv=e*Vve!URQ@hp^)-Re?JlM z`G7YV3RTCr@|sig7p$70jAWe>lZUu34st371WkbDcI#mv(YAle3^r(Ef~ILW-PwsF zqNsX29?Y;T_yU2hb7#&R6{ghAYgqi4qZlzx3(tZ{rodWd0;7!swv2)Cv*AaQSK{Ba zzPR`CzXK3%xBF$RSz$JrAeKxbk|cjSnbv}7NtPE4^!*$V8aD0I(_yQX;qTDvNI(h# zWY+;oD4?eDkcr4bW<+{$*5a1h+WQ|m)AQx==2H^O@{Xj!$c{y6K zd^r*XVa@fP9@x6(t-iQ8FQ&^4TCD~!2n-NL>g&1gS|`WQwm6Xnh0Oy9Dlk9;@$j-` z{TW$yFf?6Z(7MK?S!FVtf#o=`n9Vp845G_@eFv_GT=af6Fy+pskFz+}GKSJ8o9E1| zuPbxfjT8$Up@*290u=+~2nC4a?d{#(lPC8tY;F!11)*Lr8hL{TDI{1?6tLUvYWs;3 zZGY{KA3HvcRC^Y^YbiCF^%R;(VA5pfIS9p~z>yU2hy_X^{}^@!wY9YwwPdf=?AoY> zt|}ha`dyaW8=IOYyy>3Vb8IT5CpTJH?g0lUOwo*nXjJ+$;Cgj-bhtpTCxgM@aBFL8 o0{(+G?fqy5t&mSKI_mCU0eeXU+X!R`hX4Qo07*qoM6N<$f@@iO3IG5A literal 0 HcmV?d00001 diff --git a/examples/positioning/satelliteinfo/icons/search.svg b/examples/positioning/satelliteinfo/icons/search.svg new file mode 100644 index 0000000..68447d7 --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/positioning/satelliteinfo/icons/settings.svg b/examples/positioning/satelliteinfo/icons/settings.svg new file mode 100644 index 0000000..ee2aa75 --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/settings.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/positioning/satelliteinfo/icons/skyview.svg b/examples/positioning/satelliteinfo/icons/skyview.svg new file mode 100644 index 0000000..ece9fd7 --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/skyview.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/positioning/satelliteinfo/icons/sort.svg b/examples/positioning/satelliteinfo/icons/sort.svg new file mode 100644 index 0000000..2617b3e --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/sort.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/positioning/satelliteinfo/icons/tableview.svg b/examples/positioning/satelliteinfo/icons/tableview.svg new file mode 100644 index 0000000..aa01ef4 --- /dev/null +++ b/examples/positioning/satelliteinfo/icons/tableview.svg @@ -0,0 +1,3 @@ + + + diff --git a/examples/positioning/satelliteinfo/main.cpp b/examples/positioning/satelliteinfo/main.cpp new file mode 100644 index 0000000..2fe7603 --- /dev/null +++ b/examples/positioning/satelliteinfo/main.cpp @@ -0,0 +1,52 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "satellitemodel.h" +#include "sortfiltermodel.h" + +#include +#include +#include + +#include + +using namespace Qt::StringLiterals; + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + static const std::array fonts { + u":/fonts/TitilliumWeb-Regular.ttf"_s, + u":/fonts/TitilliumWeb-SemiBold.ttf"_s + }; + int fontId{-1}; + for (const auto &font : fonts) { + fontId = QFontDatabase::addApplicationFont(font); + if (fontId == -1) { + qWarning("Failed to load application font. Default system font will be used"); + break; + } + } + if (fontId != -1) { + QFont appFont = app.font(); + appFont.setFamilies(QFontDatabase::applicationFontFamilies(fontId)); + app.setFont(appFont); + } + + SatelliteModel satelliteModel; + SortFilterModel sortFilterModel; + sortFilterModel.setSourceModel(&satelliteModel); + sortFilterModel.sort(0); + + QQmlApplicationEngine engine; + engine.setInitialProperties({ + {u"satellitesModel"_s, QVariant::fromValue(&satelliteModel)}, + {u"sortFilterModel"_s, QVariant::fromValue(&sortFilterModel)} + }); + QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, &app, + []() { QCoreApplication::exit(1); }, Qt::QueuedConnection); + engine.loadFromModule("SatelliteInformation", "Main"); + + return app.exec(); +} diff --git a/examples/positioning/satelliteinfo/nmealog.txt b/examples/positioning/satelliteinfo/nmealog.txt new file mode 100644 index 0000000..8c8286d --- /dev/null +++ b/examples/positioning/satelliteinfo/nmealog.txt @@ -0,0 +1,1403 @@ +$GPGGA,222437.000,2734.33926,S,15305.44310,E,1,07,1.3,50.6,M,39.2,M,,*72 +$GPGLL,2734.33926,S,15305.44310,E,222437.000,A,A*49 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222437.000,13.3,7.4,6.6,85.1,6.0,6.8,13.7*56 +$GPGSV,3,1,10,16,49,115,42,25,39,269,36,23,58,176,29,20,72,335,35*75 +$GPGSV,3,2,10,19,02,028,,04,06,241,22,13,30,223,30,27,19,284,35*78 +$GPGSV,3,3,10,11,06,337,30,03,13,055,25*7C +$GPRMC,222437.000,A,2734.33926,S,15305.44310,E,33.9,157.8,030308,11.2,W,A*0F +$GPVTG,157.8,T,169.0,M,33.9,N,62.9,K,A*22 +$GPGGA,222438.000,2734.34821,S,15305.44697,E,1,07,1.2,50.8,M,39.2,M,,*79 +$GPGLL,2734.34821,S,15305.44697,E,222438.000,A,A*4D +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222438.000,12.4,6.4,9.3,16.2,6.1,8.3,16.4*5F +$GPGSV,3,1,10,16,49,115,41,25,39,269,36,23,58,176,28,20,72,335,36*74 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,28,27,19,284,35*73 +$GPGSV,3,3,10,11,06,337,28,03,13,055,25*75 +$GPRMC,222438.000,A,2734.34821,S,15305.44697,E,33.8,158.3,030308,11.2,W,A*0E +$GPVTG,158.3,T,169.5,M,33.8,N,62.5,K,A*2E +$GPGGA,222439.000,2734.35696,S,15305.45072,E,1,06,1.7,51.2,M,39.2,M,,*78 +$GPGLL,2734.35696,S,15305.45072,E,222439.000,A,A*43 +$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A +$GPGST,222439.000,10.3,9.1,12.2,44.6,9.8,9.9,25.2*62 +$GPGSV,3,1,10,16,49,115,34,25,39,269,36,23,58,175,29,20,72,335,35*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,27,27,19,284,32*7B +$GPGSV,3,3,10,11,06,337,28,03,14,055,25*72 +$GPRMC,222439.000,A,2734.35696,S,15305.45072,E,33.2,158.7,030308,11.2,W,A*0E +$GPVTG,158.7,T,169.9,M,33.2,N,61.5,K,A*2F +$GPGGA,222440.000,2734.36580,S,15305.45446,E,1,07,1.3,52.0,M,39.2,M,,*76 +$GPGLL,2734.36580,S,15305.45446,E,222440.000,A,A*49 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222440.000,13.0,8.0,13.4,6.2,7.4,12.2,20.9*64 +$GPGSV,3,1,10,16,49,115,40,25,39,269,38,23,58,175,31,20,72,335,34*72 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,26,27,19,284,30*78 +$GPGSV,3,3,10,11,06,337,26,03,14,055,25*7C +$GPRMC,222440.000,A,2734.36580,S,15305.45446,E,33.7,159.1,030308,11.2,W,A*06 +$GPVTG,159.1,T,170.3,M,33.7,N,62.4,K,A*2D +$GPGGA,222441.000,2734.37483,S,15305.45825,E,1,07,1.3,52.7,M,39.2,M,,*7A +$GPGLL,2734.37483,S,15305.45825,E,222441.000,A,A*42 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222441.000,14.0,7.6,14.1,17.6,7.7,12.5,21.0*51 +$GPGSV,3,1,10,16,49,115,41,25,39,269,39,23,58,175,29,20,72,335,35*7A +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,24,27,19,284,30*7A +$GPGSV,3,3,10,11,06,337,28,03,14,055,25*72 +$GPRMC,222441.000,A,2734.37483,S,15305.45825,E,34.6,159.4,030308,11.2,W,A*0E +$GPVTG,159.4,T,170.6,M,34.6,N,64.1,K,A*28 +$GPGGA,222442.000,2734.38407,S,15305.46216,E,1,06,1.3,53.3,M,39.2,M,,*77 +$GPGLL,2734.38407,S,15305.46216,E,222442.000,A,A*4B +$GPGSA,A,3,16,25,20,13,27,11,,,,,,,2.3,1.3,1.9*3C +$GPGST,222442.000,16.6,7.0,14.4,14.6,7.0,12.8,21.6*5A +$GPGSV,3,1,10,16,49,115,40,25,39,269,38,23,58,175,22,20,72,335,35*71 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,25,27,19,284,29*73 +$GPGSV,3,3,10,11,06,337,27,03,14,055,25*7D +$GPRMC,222442.000,A,2734.38407,S,15305.46216,E,35.5,159.3,030308,11.2,W,A*02 +$GPVTG,159.3,T,170.5,M,35.5,N,65.8,K,A*26 +$GPGGA,222443.000,2734.39347,S,15305.46609,E,1,05,1.8,53.8,M,39.2,M,,*7D +$GPGLL,2734.39347,S,15305.46609,E,222443.000,A,A*42 +$GPGSA,A,3,16,25,20,27,11,,,,,,,,2.8,1.8,2.1*35 +$GPGST,222443.000,11.3,6.5,14.6,14.5,6.6,13.0,18.4*5A +$GPGSV,3,1,10,16,49,115,40,25,39,269,38,23,58,175,22,20,72,335,36*72 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,26,27,19,284,31*79 +$GPGSV,3,3,10,11,06,337,28,03,14,055,25*72 +$GPRMC,222443.000,A,2734.39347,S,15305.46609,E,36.2,159.4,030308,11.2,W,A*08 +$GPVTG,159.4,T,170.6,M,36.2,N,67.0,K,A*2C +$GPGGA,222444.000,2734.40297,S,15305.47000,E,1,06,1.3,54.1,M,39.2,M,,*70 +$GPGLL,2734.40297,S,15305.47000,E,222444.000,A,A*49 +$GPGSA,A,3,16,25,20,13,27,11,,,,,,,2.3,1.3,1.9*3C +$GPGST,222444.000,17.6,6.3,12.7,14.4,6.3,11.4,16.2*55 +$GPGSV,3,1,10,16,49,115,38,25,39,269,38,23,58,175,22,20,72,335,35*7E +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,25,27,19,284,29*73 +$GPGSV,3,3,10,11,06,337,25,03,14,055,23*79 +$GPRMC,222444.000,A,2734.40297,S,15305.47000,E,36.5,159.5,030308,11.2,W,A*05 +$GPVTG,159.5,T,170.8,M,36.5,N,67.5,K,A*21 +$GPGGA,222445.000,2734.41247,S,15305.47390,E,1,07,1.3,54.2,M,39.2,M,,*75 +$GPGLL,2734.41247,S,15305.47390,E,222445.000,A,A*4E +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222445.000,16.0,7.0,14.4,10.4,6.7,13.0,20.7*52 +$GPGSV,3,1,10,16,49,115,36,25,39,269,36,23,58,175,22,20,72,335,34*7F +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,26,27,19,284,31*79 +$GPGSV,3,3,10,11,06,337,26,03,14,055,23*7A +$GPRMC,222445.000,A,2734.41247,S,15305.47390,E,36.6,159.7,030308,11.2,W,A*03 +$GPVTG,159.7,T,170.9,M,36.6,N,67.8,K,A*2C +$GPGGA,222446.000,2734.42201,S,15305.47790,E,1,07,1.3,54.4,M,39.2,M,,*75 +$GPGLL,2734.42201,S,15305.47790,E,222446.000,A,A*48 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222446.000,13.0,7.4,12.3,6.6,6.9,11.2,17.9*60 +$GPGSV,3,1,10,16,49,115,36,25,39,269,37,23,58,175,27,20,72,335,35*7A +$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,30,223,30,27,19,284,32*7E +$GPGSV,3,3,10,11,06,337,27,03,14,055,23*7B +$GPRMC,222446.000,A,2734.42201,S,15305.47790,E,36.6,159.3,030308,11.2,W,A*01 +$GPVTG,159.3,T,170.5,M,36.6,N,67.7,K,A*2B +$GPGGA,222447.000,2734.43157,S,15305.48195,E,1,07,1.3,54.3,M,39.2,M,,*7E +$GPGLL,2734.43157,S,15305.48195,E,222447.000,A,A*44 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222447.000,10.7,6.7,10.5,6.6,6.2,9.6,15.5*5B +$GPGSV,3,1,11,16,49,115,32,25,39,269,37,23,58,175,28,20,72,335,33*76 +$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,30,223,30,27,19,284,32*7F +$GPGSV,3,3,11,11,06,337,29,01,,,19,03,14,055,23*7D +$GPRMC,222447.000,A,2734.43157,S,15305.48195,E,36.7,159.1,030308,11.2,W,A*0E +$GPVTG,159.1,T,170.3,M,36.7,N,67.9,K,A*20 +$GPGGA,222448.000,2734.44111,S,15305.48610,E,1,08,1.1,54.1,M,39.2,M,,*71 +$GPGLL,2734.44111,S,15305.48610,E,222448.000,A,A*44 +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222448.000,20.4,10.5,8.8,52.5,8.7,9.1,15.2*6C +$GPGSV,3,1,11,16,49,115,27,25,39,269,38,23,58,175,26,20,72,335,31*71 +$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,30,223,37,27,19,284,27*7C +$GPGSV,3,3,11,11,06,337,27,01,,,19,03,14,055,23*73 +$GPRMC,222448.000,A,2734.44111,S,15305.48610,E,36.8,158.7,030308,11.2,W,A*06 +$GPVTG,158.7,T,169.9,M,36.8,N,68.2,K,A*2E +$GPGGA,222449.000,2734.45068,S,15305.49044,E,1,08,1.1,53.6,M,39.2,M,,*78 +$GPGLL,2734.45068,S,15305.49044,E,222449.000,A,A*4D +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222449.000,17.1,8.8,10.2,14.2,8.2,9.3,17.4*6D +$GPGSV,3,1,11,16,49,115,28,25,39,269,37,23,58,175,25,20,72,335,28*7A +$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,30,223,37,27,19,284,32*78 +$GPGSV,3,3,11,11,06,337,27,01,,,19,03,14,055,24*74 +$GPRMC,222449.000,A,2734.45068,S,15305.49044,E,37.2,157.8,030308,11.2,W,A*04 +$GPVTG,157.8,T,169.0,M,37.2,N,68.9,K,A*27 +$GPGGA,222450.000,2734.46041,S,15305.49485,E,1,08,1.1,53.3,M,39.2,M,,*74 +$GPGLL,2734.46041,S,15305.49485,E,222450.000,A,A*44 +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222450.000,17.4,8.9,12.7,10.1,11.5,8.2,16.5*5E +$GPGSV,3,1,11,16,49,115,25,25,39,269,36,23,58,175,30,20,72,336,28*71 +$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,38,27,19,284,34*73 +$GPGSV,3,3,11,11,06,337,27,01,,,19,03,14,055,22*72 +$GPRMC,222450.000,A,2734.46041,S,15305.49485,E,37.7,157.9,030308,11.2,W,A*09 +$GPVTG,157.9,T,169.1,M,37.7,N,69.8,K,A*22 +$GPGGA,222451.000,2734.47033,S,15305.49924,E,1,08,1.1,53.1,M,39.2,M,,*75 +$GPGLL,2734.47033,S,15305.49924,E,222451.000,A,A*47 +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222451.000,14.1,8.0,10.5,14.3,9.5,7.5,15.0*61 +$GPGSV,3,1,11,16,49,115,27,25,39,269,38,23,58,175,28,20,72,336,25*79 +$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,38,27,19,284,34*73 +$GPGSV,3,3,11,11,06,337,24,01,,,19,03,14,055,25*76 +$GPRMC,222451.000,A,2734.47033,S,15305.49924,E,38.1,158.1,030308,11.2,W,A*04 +$GPVTG,158.1,T,169.3,M,38.1,N,70.5,K,A*2B +$GPGGA,222452.000,2734.48022,S,15305.50375,E,1,08,1.1,52.5,M,39.2,M,,*7A +$GPGLL,2734.48022,S,15305.50375,E,222452.000,A,A*4D +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222452.000,24.1,13.9,9.7,80.6,12.7,9.0,21.0*54 +$GPGSV,3,1,11,16,49,115,29,25,39,269,38,23,58,175,27,20,72,336,30*7C +$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,35,27,19,284,34*7E +$GPGSV,3,3,11,11,06,337,22,01,,,19,03,14,055,24*71 +$GPRMC,222452.000,A,2734.48022,S,15305.50375,E,38.3,157.9,030308,11.2,W,A*0B +$GPVTG,157.9,T,169.1,M,38.3,N,70.9,K,A*20 +$GPGGA,222453.000,2734.49019,S,15305.50802,E,1,06,1.7,52.1,M,39.2,M,,*75 +$GPGLL,2734.49019,S,15305.50802,E,222453.000,A,A*4E +$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A +$GPGST,222453.000,10.4,15.4,9.3,66.3,13.4,9.6,24.6*52 +$GPGSV,3,1,11,16,49,115,31,25,39,269,36,23,58,175,28,20,71,336,25*73 +$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,33,27,19,284,31*7D +$GPGSV,3,3,11,11,06,337,22,01,,,19,03,14,055,24*71 +$GPRMC,222453.000,A,2734.49019,S,15305.50802,E,38.3,159.1,030308,11.2,W,A*0E +$GPVTG,159.1,T,170.3,M,38.3,N,70.9,K,A*2C +$GPGGA,222454.000,2734.50008,S,15305.51221,E,1,07,1.3,52.1,M,39.2,M,,*75 +$GPGLL,2734.50008,S,15305.51221,E,222454.000,A,A*4B +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222454.000,12.5,11.7,8.3,70.6,10.4,8.0,19.0*5E +$GPGSV,3,1,11,16,49,115,30,25,39,269,36,23,58,175,26,20,71,336,28*71 +$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,32,27,19,284,30*7D +$GPGSV,3,3,11,11,06,337,24,01,,,18,03,14,055,24*76 +$GPRMC,222454.000,A,2734.50008,S,15305.51221,E,38.1,159.4,030308,11.2,W,A*0C +$GPVTG,159.4,T,170.6,M,38.1,N,70.5,K,A*22 +$GPGGA,222455.000,2734.50992,S,15305.51642,E,1,07,1.3,52.2,M,39.2,M,,*7C +$GPGLL,2734.50992,S,15305.51642,E,222455.000,A,A*41 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222455.000,11.5,10.8,9.3,83.5,9.9,8.6,23.3*65 +$GPGSV,3,1,11,16,49,115,33,25,39,269,36,23,58,175,32,20,71,336,31*7F +$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,29,27,19,284,29*7F +$GPGSV,3,3,11,11,06,337,28,01,,,18,03,14,055,24*7A +$GPRMC,222455.000,A,2734.50992,S,15305.51642,E,37.8,159.0,030308,11.2,W,A*04 +$GPVTG,159.0,T,170.2,M,37.8,N,70.0,K,A*21 +$GPGGA,222456.000,2734.51963,S,15305.52059,E,1,07,1.3,52.5,M,39.2,M,,*78 +$GPGLL,2734.51963,S,15305.52059,E,222456.000,A,A*42 +$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D +$GPGST,222456.000,11.3,9.0,13.1,11.0,8.4,11.9,20.9*55 +$GPGSV,3,1,11,16,49,115,31,25,39,269,37,23,58,175,27,20,71,336,33*7A +$GPGSV,3,2,11,19,02,028,,04,06,241,19,13,30,223,29,27,19,284,32*7E +$GPGSV,3,3,11,11,06,337,30,01,,,18,03,14,055,24*73 +$GPRMC,222456.000,A,2734.51963,S,15305.52059,E,37.3,158.8,030308,11.2,W,A*05 +$GPVTG,158.8,T,170.0,M,37.3,N,69.1,K,A*28 +$GPGGA,222457.000,2734.52908,S,15305.52467,E,1,06,1.3,53.2,M,39.2,M,,*79 +$GPGLL,2734.52908,S,15305.52467,E,222457.000,A,A*44 +$GPGSA,A,3,16,25,20,13,27,11,,,,,,,2.3,1.3,1.9*3C +$GPGST,222457.000,20.4,7.8,12.0,8.1,7.3,10.9,17.9*63 +$GPGSV,3,1,11,16,49,115,37,25,39,269,37,23,58,175,24,20,71,336,35*79 +$GPGSV,3,2,11,19,02,028,,04,06,241,19,13,30,223,29,27,19,284,32*7E +$GPGSV,3,3,11,11,06,337,28,01,,,18,03,14,055,23*7D +$GPRMC,222457.000,A,2734.52908,S,15305.52467,E,36.2,158.7,030308,11.2,W,A*0C +$GPVTG,158.7,T,169.9,M,36.2,N,67.1,K,A*28 +$GPGGA,222458.000,2734.53845,S,15305.52866,E,1,06,1.6,54.2,M,39.2,M,,*70 +$GPGLL,2734.53845,S,15305.52866,E,222458.000,A,A*4F +$GPGSA,A,3,16,25,23,20,27,11,,,,,,,2.6,1.6,2.1*34 +$GPGST,222458.000,16.7,7.3,13.9,11.0,7.0,12.5,17.9*5D +$GPGSV,3,1,11,16,49,115,36,25,39,269,37,23,58,175,24,20,71,336,35*78 +$GPGSV,3,2,11,19,02,028,19,04,06,241,19,13,30,223,26,27,19,284,31*7A +$GPGSV,3,3,11,11,06,337,23,01,,,18,03,14,055,23*76 +$GPRMC,222458.000,A,2734.53845,S,15305.52866,E,35.9,159.1,030308,11.2,W,A*08 +$GPVTG,159.1,T,170.3,M,35.9,N,66.5,K,A*20 +$GPGGA,222459.000,2734.54772,S,15305.53309,E,1,08,1.1,55.6,M,39.2,M,,*72 +$GPGLL,2734.54772,S,15305.53309,E,222459.000,A,A*41 +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222459.000,17.5,6.5,9.3,15.5,6.1,8.3,15.2*5C +$GPGSV,3,1,11,16,49,115,38,25,39,268,36,23,58,175,35,20,71,336,35*76 +$GPGSV,3,2,11,19,02,028,19,04,06,241,19,13,30,223,33,27,19,284,34*7B +$GPGSV,3,3,11,11,06,337,29,01,,,18,03,14,055,22*7D +$GPRMC,222459.000,A,2734.54772,S,15305.53309,E,35.9,156.8,030308,11.2,W,A*00 +$GPVTG,156.8,T,168.0,M,35.9,N,66.4,K,A*2D +$GPGGA,222500.000,2734.55655,S,15305.53845,E,1,08,1.1,56.1,M,39.2,M,,*7D +$GPGLL,2734.55655,S,15305.53845,E,222500.000,A,A*4A +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222500.000,14.5,9.8,7.9,83.3,7.3,9.0,14.3*5C +$GPGSV,3,1,11,16,49,115,36,25,39,268,31,23,58,175,39,20,71,336,33*75 +$GPGSV,3,2,11,19,02,028,21,04,06,241,19,13,30,223,30,27,19,284,29*7F +$GPGSV,3,3,11,11,06,337,25,01,,,18,03,14,055,28*7B +$GPRMC,222500.000,A,2734.55655,S,15305.53845,E,35.9,151.6,030308,11.2,W,A*02 +$GPVTG,151.6,T,162.8,M,35.9,N,66.5,K,A*27 +$GPGGA,222501.000,2734.56495,S,15305.54489,E,1,08,1.1,57.0,M,39.2,M,,*7A +$GPGLL,2734.56495,S,15305.54489,E,222501.000,A,A*4D +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222501.000,14.3,8.0,10.9,27.0,8.0,9.5,15.6*64 +$GPGSV,3,1,11,16,49,115,41,25,39,268,31,23,58,175,36,20,71,336,31*78 +$GPGSV,3,2,11,19,02,028,21,04,06,241,19,13,30,223,27,27,19,284,29*79 +$GPGSV,3,3,11,11,06,337,22,01,,,18,03,14,055,31*74 +$GPRMC,222501.000,A,2734.56495,S,15305.54489,E,36.5,145.7,030308,11.2,W,A*0E +$GPVTG,145.7,T,156.9,M,36.5,N,67.5,K,A*2B +$GPGGA,222502.000,2734.57337,S,15305.55181,E,1,06,1.5,57.9,M,39.2,M,,*78 +$GPGLL,2734.57337,S,15305.55181,E,222502.000,A,A*4C +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222502.000,14.5,7.0,11.9,20.7,7.1,10.5,15.0*5F +$GPGSV,3,1,11,16,49,115,43,25,39,268,35,23,58,175,37,20,71,336,34*7A +$GPGSV,3,2,11,19,02,028,21,04,06,241,19,13,30,223,23,27,19,284,33*76 +$GPGSV,3,3,11,11,06,337,22,01,,,18,03,14,055,34*71 +$GPRMC,222502.000,A,2734.57337,S,15305.55181,E,37.4,143.8,030308,11.2,W,A*06 +$GPVTG,143.8,T,155.0,M,37.4,N,69.3,K,A*20 +$GPGGA,222503.000,2734.58184,S,15305.55887,E,1,08,1.1,58.5,M,39.2,M,,*7A +$GPGLL,2734.58184,S,15305.55887,E,222503.000,A,A*47 +$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30 +$GPGST,222503.000,13.4,6.4,14.1,0.3,5.9,12.9,21.5*60 +$GPGSV,3,1,11,16,49,115,43,25,39,268,35,23,58,175,38,20,71,336,35*74 +$GPGSV,3,2,11,19,02,028,19,04,06,241,19,13,30,223,23,27,19,284,32*7C +$GPGSV,3,3,11,11,06,337,26,01,,,17,03,14,055,34*7A +$GPRMC,222503.000,A,2734.58184,S,15305.55887,E,37.8,143.4,030308,11.2,W,A*0D +$GPVTG,143.4,T,154.6,M,37.8,N,70.0,K,A*2C +$GPGGA,222504.000,2734.59032,S,15305.56580,E,1,07,1.2,58.9,M,39.2,M,,*79 +$GPGLL,2734.59032,S,15305.56580,E,222504.000,A,A*44 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222504.000,24.6,6.2,13.3,3.6,5.7,12.2,20.2*67 +$GPGSV,3,1,11,16,49,115,43,25,39,268,35,23,58,175,39,20,71,336,35*75 +$GPGSV,3,2,11,19,02,028,19,04,06,241,19,13,30,223,22,27,19,284,31*7E +$GPGSV,3,3,11,11,06,337,25,01,,,17,03,14,055,30*7D +$GPRMC,222504.000,A,2734.59032,S,15305.56580,E,37.6,143.6,030308,11.2,W,A*02 +$GPVTG,143.6,T,154.8,M,37.6,N,69.7,K,A*21 +$GPGGA,222505.000,2734.59874,S,15305.57271,E,1,06,1.5,59.4,M,39.2,M,,*70 +$GPGLL,2734.59874,S,15305.57271,E,222505.000,A,A*47 +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222505.000,17.4,5.5,11.8,3.4,5.0,10.8,17.3*61 +$GPGSV,3,1,11,16,49,115,44,25,39,268,35,23,58,175,39,20,71,336,36*71 +$GPGSV,3,2,11,19,02,028,21,04,06,241,19,13,30,223,24,27,19,284,31*73 +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,29*72 +$GPRMC,222505.000,A,2734.59874,S,15305.57271,E,37.3,143.7,030308,11.2,W,A*05 +$GPVTG,143.7,T,154.9,M,37.3,N,69.1,K,A*22 +$GPGGA,222506.000,2734.60703,S,15305.57943,E,1,07,1.2,60.1,M,39.2,M,,*75 +$GPGLL,2734.60703,S,15305.57943,E,222506.000,A,A*4B +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222506.000,16.1,6.2,11.7,15.3,6.1,10.4,17.4*54 +$GPGSV,3,1,11,16,49,115,43,25,39,268,34,23,58,175,37,20,71,336,36*79 +$GPGSV,3,2,11,19,02,028,21,04,06,241,,13,30,223,24,27,19,284,31*7B +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,28*73 +$GPRMC,222506.000,A,2734.60703,S,15305.57943,E,36.5,143.9,030308,11.2,W,A*00 +$GPVTG,143.9,T,155.1,M,36.5,N,67.6,K,A*2B +$GPGGA,222507.000,2734.61507,S,15305.58593,E,1,07,1.2,60.9,M,39.2,M,,*75 +$GPGLL,2734.61507,S,15305.58593,E,222507.000,A,A*43 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222507.000,14.0,6.8,11.8,10.9,6.4,10.7,18.5*54 +$GPGSV,3,1,11,16,49,115,43,25,39,268,34,23,58,175,37,20,71,336,34*7B +$GPGSV,3,2,11,19,02,028,21,04,06,241,,13,30,223,29,27,19,284,34*73 +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,29*72 +$GPRMC,222507.000,A,2734.61507,S,15305.58593,E,35.4,143.9,030308,11.2,W,A*0A +$GPVTG,143.9,T,155.1,M,35.4,N,65.5,K,A*28 +$GPGGA,222508.000,2734.62275,S,15305.59221,E,1,06,1.7,61.8,M,39.2,M,,*70 +$GPGLL,2734.62275,S,15305.59221,E,222508.000,A,A*42 +$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A +$GPGST,222508.000,12.5,9.3,16.3,19.5,9.4,14.4,27.5*51 +$GPGSV,3,1,11,16,49,115,43,25,39,268,33,23,58,175,38,20,71,336,31*76 +$GPGSV,3,2,11,19,02,028,21,04,06,241,,13,30,223,30,27,19,284,35*7A +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,28*73 +$GPRMC,222508.000,A,2734.62275,S,15305.59221,E,33.9,143.9,030308,11.2,W,A*00 +$GPVTG,143.9,T,155.1,M,33.9,N,62.9,K,A*28 +$GPGGA,222509.000,2734.63006,S,15305.59817,E,1,06,1.7,62.7,M,39.2,M,,*75 +$GPGLL,2734.63006,S,15305.59817,E,222509.000,A,A*4B +$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A +$GPGST,222509.000,10.4,8.1,14.2,21.9,8.4,12.3,23.7*52 +$GPGSV,3,1,11,16,49,115,44,25,39,268,32,23,58,175,37,20,71,336,29*76 +$GPGSV,3,2,11,19,02,028,21,04,06,241,,13,30,223,28,27,19,284,35*73 +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,30*7A +$GPRMC,222509.000,A,2734.63006,S,15305.59817,E,32.2,143.9,030308,11.2,W,A*03 +$GPVTG,143.9,T,155.1,M,32.2,N,59.7,K,A*24 +$GPGGA,222510.000,2734.63706,S,15305.60376,E,1,06,1.7,63.5,M,39.2,M,,*7F +$GPGLL,2734.63706,S,15305.60376,E,222510.000,A,A*42 +$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A +$GPGST,222510.000,12.4,8.3,12.9,28.0,8.7,11.0,21.6*57 +$GPGSV,3,1,11,16,48,115,43,25,39,268,32,23,58,175,37,20,71,336,29*70 +$GPGSV,3,2,11,19,02,028,20,04,06,241,,13,30,223,31,27,19,284,35*7A +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,25*7E +$GPRMC,222510.000,A,2734.63706,S,15305.60376,E,30.6,144.3,030308,11.2,W,A*01 +$GPVTG,144.3,T,155.5,M,30.6,N,56.7,K,A*24 +$GPGGA,222511.000,2734.64376,S,15305.60904,E,1,07,1.2,64.4,M,39.2,M,,*77 +$GPGLL,2734.64376,S,15305.60904,E,222511.000,A,A*48 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222511.000,14.6,5.7,10.5,2.7,5.2,9.6,15.0*5C +$GPGSV,3,1,11,16,48,115,44,25,39,268,32,23,58,175,37,20,71,336,28*76 +$GPGSV,3,2,11,19,02,028,20,04,06,241,23,13,30,223,29,27,19,284,36*71 +$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,29*72 +$GPRMC,222511.000,A,2734.64376,S,15305.60904,E,29.1,144.2,030308,11.2,W,A*05 +$GPVTG,144.2,T,155.4,M,29.1,N,53.9,K,A*20 +$GPGGA,222512.000,2734.64992,S,15305.61405,E,1,07,1.2,65.4,M,39.2,M,,*78 +$GPGLL,2734.64992,S,15305.61405,E,222512.000,A,A*46 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222512.000,13.4,17.0,5.7,85.6,5.3,15.5,23.6*5A +$GPGSV,3,1,11,16,48,115,45,25,39,268,33,23,58,175,38,20,71,336,28*79 +$GPGSV,3,2,11,19,02,028,20,04,06,241,23,13,30,223,26,27,19,284,33*7B +$GPGSV,3,3,11,11,06,337,24,01,,,17,03,14,055,27*7A +$GPRMC,222512.000,A,2734.64992,S,15305.61405,E,27.2,143.6,030308,11.2,W,A*05 +$GPVTG,143.6,T,154.8,M,27.2,N,50.5,K,A*2C +$GPGGA,222513.000,2734.65572,S,15305.61884,E,1,07,1.2,66.2,M,39.2,M,,*7A +$GPGLL,2734.65572,S,15305.61884,E,222513.000,A,A*41 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222513.000,12.3,7.0,14.8,2.4,6.5,13.5,21.4*6D +$GPGSV,3,1,10,16,48,115,44,25,39,268,35,23,58,175,38,20,71,336,28*7F +$GPGSV,3,2,10,19,02,028,20,04,06,241,23,13,30,223,23,27,19,284,33*7F +$GPGSV,3,3,10,11,06,337,24,03,14,055,28*73 +$GPRMC,222513.000,A,2734.65572,S,15305.61884,E,25.8,143.6,030308,11.2,W,A*0A +$GPVTG,143.6,T,154.8,M,25.8,N,47.9,K,A*2E +$GPGGA,222514.000,2734.66155,S,15305.62364,E,1,06,1.5,67.0,M,39.2,M,,*7C +$GPGLL,2734.66155,S,15305.62364,E,222514.000,A,A*42 +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222514.000,25.5,6.1,14.4,3.1,5.6,13.2,19.2*6A +$GPGSV,3,1,10,16,48,115,44,25,39,268,33,23,58,175,38,20,71,336,26*77 +$GPGSV,3,2,10,19,02,028,18,04,06,241,23,13,30,223,23,27,19,284,34*73 +$GPGSV,3,3,10,11,06,337,28,03,14,055,29*7E +$GPRMC,222514.000,A,2734.66155,S,15305.62364,E,25.9,143.6,030308,11.2,W,A*08 +$GPVTG,143.6,T,154.8,M,25.9,N,48.0,K,A*29 +$GPGGA,222515.000,2734.66761,S,15305.62860,E,1,06,1.5,67.5,M,39.2,M,,*76 +$GPGLL,2734.66761,S,15305.62860,E,222515.000,A,A*4D +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222515.000,20.1,5.5,13.0,3.0,5.1,11.8,17.4*68 +$GPGSV,3,1,10,16,48,115,44,25,39,268,32,23,58,175,38,20,71,336,26*76 +$GPGSV,3,2,10,19,02,028,18,04,06,241,23,13,30,223,24,27,19,284,34*74 +$GPGSV,3,3,10,11,06,337,28,03,14,055,24*73 +$GPRMC,222515.000,A,2734.66761,S,15305.62860,E,26.9,143.7,030308,11.2,W,A*05 +$GPVTG,143.7,T,154.9,M,26.9,N,49.8,K,A*23 +$GPGGA,222516.000,2734.67384,S,15305.63376,E,1,06,1.5,68.2,M,39.2,M,,*7E +$GPGLL,2734.67384,S,15305.63376,E,222516.000,A,A*4D +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222516.000,16.4,5.8,11.5,4.5,5.3,10.5,17.3*6A +$GPGSV,3,1,10,16,48,115,44,25,39,268,32,23,58,175,38,20,71,336,30*71 +$GPGSV,3,2,10,19,02,028,18,04,06,241,23,13,30,223,24,27,19,284,33*73 +$GPGSV,3,3,10,11,06,337,28,03,14,055,28*7F +$GPRMC,222516.000,A,2734.67384,S,15305.63376,E,27.7,143.8,030308,11.2,W,A*05 +$GPVTG,143.8,T,155.0,M,27.7,N,51.4,K,A*2E +$GPGGA,222517.000,2734.68035,S,15305.63901,E,1,06,1.5,68.8,M,39.2,M,,*79 +$GPGLL,2734.68035,S,15305.63901,E,222517.000,A,A*40 +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222517.000,19.1,6.2,12.1,7.2,5.8,11.0,15.3*66 +$GPGSV,3,1,10,16,48,115,44,25,39,268,34,23,58,175,38,20,71,336,32*75 +$GPGSV,3,2,10,19,02,028,20,04,06,241,23,13,30,223,24,27,19,284,34*7F +$GPGSV,3,3,10,11,06,337,24,03,14,055,29*72 +$GPRMC,222517.000,A,2734.68035,S,15305.63901,E,28.6,144.1,030308,11.2,W,A*08 +$GPVTG,144.1,T,155.3,M,28.6,N,53.0,K,A*2B +$GPGGA,222518.000,2734.68718,S,15305.64446,E,1,07,1.4,69.1,M,39.2,M,,*7F +$GPGLL,2734.68718,S,15305.64446,E,222518.000,A,A*4E +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222518.000,13.8,5.5,10.6,5.8,5.1,9.6,13.4*54 +$GPGSV,3,1,10,16,48,115,43,25,39,268,33,23,58,175,37,20,71,336,35*7D +$GPGSV,3,2,10,19,02,028,20,04,06,241,18,13,30,223,24,27,19,284,33*70 +$GPGSV,3,3,10,11,06,337,22,03,14,055,33*7F +$GPRMC,222518.000,A,2734.68718,S,15305.64446,E,29.9,144.4,030308,11.2,W,A*0D +$GPVTG,144.4,T,155.6,M,29.9,N,55.3,K,A*20 +$GPGGA,222519.000,2734.69424,S,15305.65010,E,1,07,1.4,69.5,M,39.2,M,,*71 +$GPGLL,2734.69424,S,15305.65010,E,222519.000,A,A*44 +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222519.000,14.0,13.4,5.0,89.4,4.6,12.3,18.8*58 +$GPGSV,3,1,10,16,48,115,44,25,39,268,34,23,58,175,37,20,71,336,37*7F +$GPGSV,3,2,10,19,02,028,20,04,06,241,18,13,30,223,23,27,19,284,31*75 +$GPGSV,3,3,10,11,06,337,26,03,14,055,35*7D +$GPRMC,222519.000,A,2734.69424,S,15305.65010,E,31.0,144.4,030308,11.2,W,A*07 +$GPVTG,144.4,T,155.6,M,31.0,N,57.5,K,A*24 +$GPGGA,222520.000,2734.70163,S,15305.65604,E,1,07,1.4,69.6,M,39.2,M,,*75 +$GPGLL,2734.70163,S,15305.65604,E,222520.000,A,A*43 +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222520.000,9.8,11.6,4.7,89.0,4.3,10.6,15.9*6A +$GPGSV,3,1,10,16,48,115,44,25,39,268,35,23,58,175,39,20,71,336,36*71 +$GPGSV,3,2,10,19,02,028,20,04,06,241,19,13,30,223,23,27,19,284,31*74 +$GPGSV,3,3,10,11,06,337,31,03,14,055,37*79 +$GPRMC,222520.000,A,2734.70163,S,15305.65604,E,32.5,144.1,030308,11.2,W,A*03 +$GPVTG,144.1,T,155.3,M,32.5,N,60.2,K,A*21 +$GPGGA,222521.000,2734.70923,S,15305.66218,E,1,07,1.4,69.5,M,39.2,M,,*71 +$GPGLL,2734.70923,S,15305.66218,E,222521.000,A,A*44 +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222521.000,11.1,6.2,10.8,9.6,5.8,9.8,16.8*53 +$GPGSV,3,1,10,16,48,115,44,25,39,268,36,23,58,175,40,20,71,336,38*72 +$GPGSV,3,2,10,19,02,028,20,04,06,241,19,13,30,223,23,27,19,284,26*72 +$GPGSV,3,3,10,11,06,338,31,03,14,055,37*76 +$GPRMC,222521.000,A,2734.70923,S,15305.66218,E,33.5,144.0,030308,11.2,W,A*04 +$GPVTG,144.0,T,155.3,M,33.5,N,62.0,K,A*21 +$GPGGA,222522.000,2734.71700,S,15305.66845,E,1,06,1.5,69.1,M,39.2,M,,*7A +$GPGLL,2734.71700,S,15305.66845,E,222522.000,A,A*4B +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222522.000,15.0,5.7,9.9,5.5,5.2,9.0,15.4*68 +$GPGSV,3,1,10,16,48,115,43,25,39,268,36,23,58,175,40,20,71,336,37*7A +$GPGSV,3,2,10,19,02,028,20,04,06,241,24,13,30,223,23,27,19,284,26*7C +$GPGSV,3,3,10,11,06,338,25,03,14,055,37*73 +$GPRMC,222522.000,A,2734.71700,S,15305.66845,E,34.2,144.1,030308,11.2,W,A*0A +$GPVTG,144.1,T,155.3,M,34.2,N,63.4,K,A*25 +$GPGGA,222523.000,2734.72487,S,15305.67483,E,1,07,1.4,68.6,M,39.2,M,,*75 +$GPGLL,2734.72487,S,15305.67483,E,222523.000,A,A*42 +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222523.000,13.8,5.2,10.1,3.9,4.8,9.2,13.8*5B +$GPGSV,3,1,10,16,48,115,44,25,39,268,37,23,58,175,41,20,71,336,35*7F +$GPGSV,3,2,10,19,02,028,20,04,06,241,24,13,30,223,23,27,19,284,26*7C +$GPGSV,3,3,10,11,06,338,23,03,14,055,31*73 +$GPRMC,222523.000,A,2734.72487,S,15305.67483,E,34.7,144.2,030308,11.2,W,A*05 +$GPVTG,144.2,T,155.4,M,34.7,N,64.3,K,A*24 +$GPGGA,222524.000,2734.73280,S,15305.68126,E,1,07,1.4,68.1,M,39.2,M,,*70 +$GPGLL,2734.73280,S,15305.68126,E,222524.000,A,A*40 +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222524.000,10.5,4.9,9.4,3.5,4.5,8.6,12.8*60 +$GPGSV,3,1,10,16,48,115,44,25,39,268,37,23,58,175,41,20,71,336,35*7F +$GPGSV,3,2,10,19,02,028,20,04,06,241,22,13,30,223,23,27,19,284,26*7A +$GPGSV,3,3,10,11,06,338,25,03,14,055,29*7C +$GPRMC,222524.000,A,2734.73280,S,15305.68126,E,35.0,144.2,030308,11.2,W,A*01 +$GPVTG,144.2,T,155.4,M,35.0,N,64.9,K,A*28 +$GPGGA,222525.000,2734.74083,S,15305.68778,E,1,07,1.4,67.7,M,39.2,M,,*73 +$GPGLL,2734.74083,S,15305.68778,E,222525.000,A,A*4A +$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C +$GPGST,222525.000,10.3,5.2,13.4,3.6,4.8,12.3,20.4*6B +$GPGSV,3,1,10,16,48,115,43,25,39,268,38,23,58,175,40,20,71,336,36*75 +$GPGSV,3,2,10,19,02,028,20,04,06,241,22,13,30,223,23,27,19,284,23*7F +$GPGSV,3,3,10,11,06,338,27,03,14,055,36*70 +$GPRMC,222525.000,A,2734.74083,S,15305.68778,E,35.6,144.2,030308,11.2,W,A*0D +$GPVTG,144.2,T,155.4,M,35.6,N,65.9,K,A*2F +$GPGGA,222526.000,2734.74894,S,15305.69428,E,1,06,1.5,67.2,M,39.2,M,,*7C +$GPGLL,2734.74894,S,15305.69428,E,222526.000,A,A*40 +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222526.000,8.0,5.7,12.0,2.6,5.2,10.9,17.4*54 +$GPGSV,3,1,10,16,48,115,43,25,39,268,37,23,58,175,40,20,71,336,35*79 +$GPGSV,3,2,10,19,02,028,20,04,06,241,22,13,30,223,23,27,19,284,24*78 +$GPGSV,3,3,10,11,06,338,27,03,14,055,39*7F +$GPRMC,222526.000,A,2734.74894,S,15305.69428,E,35.8,144.5,030308,11.2,W,A*0E +$GPVTG,144.5,T,155.7,M,35.8,N,66.3,K,A*2C +$GPGGA,222527.000,2734.75707,S,15305.70075,E,1,05,1.7,66.8,M,39.2,M,,*77 +$GPGLL,2734.75707,S,15305.70075,E,222527.000,A,A*41 +$GPGSA,A,3,16,25,23,20,03,,,,,,,,2.9,1.7,2.4*39 +$GPGST,222527.000,13.9,6.3,10.9,6.3,5.9,10.0,18.2*60 +$GPGSV,3,1,10,16,48,115,44,25,39,268,38,23,58,175,40,20,71,336,33*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,30,223,23,27,19,284,26*7F +$GPGSV,3,3,10,11,06,338,,03,14,055,36*75 +$GPRMC,222527.000,A,2734.75707,S,15305.70075,E,35.8,144.6,030308,11.2,W,A*0C +$GPVTG,144.6,T,155.8,M,35.8,N,66.2,K,A*21 +$GPGGA,222528.000,2734.76518,S,15305.70724,E,1,06,1.5,66.1,M,39.2,M,,*7C +$GPGLL,2734.76518,S,15305.70724,E,222528.000,A,A*42 +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222528.000,11.3,5.6,10.1,4.5,5.2,9.2,16.1*51 +$GPGSV,3,1,10,16,48,115,43,25,39,268,39,23,58,175,39,20,71,336,28*75 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,30,223,23,27,19,284,26*7F +$GPGSV,3,3,10,11,06,338,,03,14,055,36*75 +$GPRMC,222528.000,A,2734.76518,S,15305.70724,E,35.7,144.4,030308,11.2,W,A*02 +$GPVTG,144.4,T,155.6,M,35.7,N,66.2,K,A*22 +$GPGGA,222529.000,2734.77313,S,15305.71385,E,1,06,1.5,66.1,M,39.2,M,,*7F +$GPGLL,2734.77313,S,15305.71385,E,222529.000,A,A*41 +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222529.000,10.9,5.6,12.5,5.4,5.2,11.4,20.9*6F +$GPGSV,3,1,10,16,48,115,41,25,39,268,40,23,58,175,36,20,71,336,28*76 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,30,223,23,27,19,284,24*7D +$GPGSV,3,3,10,11,06,338,27,03,14,055,30*76 +$GPRMC,222529.000,A,2734.77313,S,15305.71385,E,35.6,143.5,030308,11.2,W,A*06 +$GPVTG,143.5,T,154.7,M,35.6,N,65.8,K,A*2C +$GPGGA,222530.000,2734.78106,S,15305.72042,E,1,06,1.5,66.0,M,39.2,M,,*74 +$GPGLL,2734.78106,S,15305.72042,E,222530.000,A,A*4B +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222530.000,9.4,5.4,18.9,2.4,4.9,17.3,30.6*54 +$GPGSV,3,1,10,16,48,115,40,25,39,268,40,23,58,175,36,20,71,336,28*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,30,223,23,27,19,284,26*7F +$GPGSV,3,3,10,11,06,338,27,03,14,055,29*7E +$GPRMC,222530.000,A,2734.78106,S,15305.72042,E,35.5,143.7,030308,11.2,W,A*0D +$GPVTG,143.7,T,155.0,M,35.5,N,65.8,K,A*2B +$GPGGA,222531.000,2734.78918,S,15305.72691,E,1,05,4.4,66.0,M,39.2,M,,*7D +$GPGLL,2734.78918,S,15305.72691,E,222531.000,A,A*45 +$GPGSA,A,3,16,25,23,27,11,,,,,,,,9.3,4.4,8.2*36 +$GPGST,222531.000,9.1,8.5,53.9,3.2,8.2,49.2,81.3*56 +$GPGSV,3,1,10,16,48,115,40,25,39,268,39,23,58,175,37,20,71,336,28*78 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,31,223,23,27,19,284,25*7D +$GPGSV,3,3,10,11,06,338,24,03,14,055,22*76 +$GPRMC,222531.000,A,2734.78918,S,15305.72691,E,35.9,144.5,030308,11.2,W,A*0A +$GPVTG,144.5,T,155.7,M,35.9,N,66.4,K,A*2A +$GPGGA,222532.000,2734.79737,S,15305.73347,E,1,06,1.5,66.0,M,39.2,M,,*74 +$GPGLL,2734.79737,S,15305.73347,E,222532.000,A,A*4B +$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36 +$GPGST,222532.000,11.0,6.8,38.7,1.2,6.3,35.3,58.4*69 +$GPGSV,3,1,10,16,48,115,40,25,39,268,39,23,58,175,36,20,71,336,28*79 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,31,223,24,27,19,284,23*7C +$GPGSV,3,3,10,11,06,338,24,03,14,055,30*75 +$GPRMC,222532.000,A,2734.79737,S,15305.73347,E,36.1,144.5,030308,11.2,W,A*0F +$GPVTG,144.5,T,155.7,M,36.1,N,66.9,K,A*2C +$GPGGA,222533.000,2734.80571,S,15305.74004,E,1,06,4.1,66.1,M,39.2,M,,*70 +$GPGLL,2734.80571,S,15305.74004,E,222533.000,A,A*4F +$GPGSA,A,3,16,25,23,27,11,03,,,,,,,8.3,4.1,7.3*3F +$GPGST,222533.000,9.4,6.1,45.5,0.4,5.6,41.6,69.5*50 +$GPGSV,3,1,10,16,48,115,40,25,39,268,39,23,58,175,37,20,71,336,28*78 +$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,31,223,24,27,19,284,25*7C +$GPGSV,3,3,10,11,06,338,22,03,14,055,25*77 +$GPRMC,222533.000,A,2734.80571,S,15305.74004,E,36.6,145.0,030308,11.2,W,A*08 +$GPVTG,145.0,T,156.2,M,36.6,N,67.7,K,A*26 +$GPGGA,222534.000,2734.81441,S,15305.74656,E,1,06,1.8,65.2,M,39.2,M,,*79 +$GPGLL,2734.81441,S,15305.74656,E,222534.000,A,A*4A +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A +$GPGST,222534.000,20.2,5.8,45.7,1.7,5.4,41.7,71.3*6C +$GPGSV,3,1,10,16,48,115,40,25,39,268,38,23,58,175,37,20,71,336,28*79 +$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,31,223,25,27,19,284,25*7D +$GPGSV,3,3,10,11,06,338,22,03,14,055,31*72 +$GPRMC,222534.000,A,2734.81441,S,15305.74656,E,37.6,146.2,030308,11.2,W,A*0D +$GPVTG,146.2,T,157.5,M,37.6,N,69.7,K,A*2E +$GPGGA,222535.000,2734.82349,S,15305.75307,E,1,05,1.9,63.5,M,39.2,M,,*77 +$GPGLL,2734.82349,S,15305.75307,E,222535.000,A,A*47 +$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.6,1.9,3.1*3D +$GPGST,222535.000,27.6,7.0,40.6,3.1,6.7,37.1,68.4*6C +$GPGSV,3,1,10,16,48,115,40,25,39,268,36,23,58,175,37,20,71,336,28*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,31,223,25,27,19,284,23*78 +$GPGSV,3,3,10,11,06,338,22,03,14,055,26*74 +$GPRMC,222535.000,A,2734.82349,S,15305.75307,E,38.7,147.3,030308,11.2,W,A*0E +$GPVTG,147.3,T,158.6,M,38.7,N,71.7,K,A*25 +$GPGGA,222536.000,2734.83215,S,15305.75969,E,1,05,1.7,63.5,M,39.2,M,,*71 +$GPGLL,2734.83215,S,15305.75969,E,222536.000,A,A*4F +$GPGSA,A,3,16,25,23,20,03,,,,,,,,2.9,1.7,2.4*39 +$GPGST,222536.000,7.9,6.3,97.2,3.9,8.3,88.7,161.0*62 +$GPGSV,3,1,10,16,48,115,40,25,39,268,37,23,58,175,36,20,71,336,28*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,31,223,25,27,19,284,23*78 +$GPGSV,3,3,10,11,06,338,22,03,14,055,26*74 +$GPRMC,222536.000,A,2734.83215,S,15305.75969,E,37.6,145.6,030308,11.2,W,A*0F +$GPVTG,145.6,T,156.8,M,37.6,N,69.7,K,A*25 +$GPGGA,222537.000,2734.84076,S,15305.76655,E,1,05,1.7,63.5,M,39.2,M,,*73 +$GPGLL,2734.84076,S,15305.76655,E,222537.000,A,A*4D +$GPGSA,A,3,16,25,23,20,03,,,,,,,,2.9,1.7,2.4*39 +$GPGST,222537.000,16.0,7.8,110.8,2.1,8.0,101.2,209.1*57 +$GPGSV,3,1,10,16,48,115,39,25,39,268,36,23,58,175,34,20,71,336,28*7A +$GPGSV,3,2,10,19,02,028,,04,06,241,22,13,31,223,25,27,19,284,23*7A +$GPGSV,3,3,10,11,06,338,22,03,14,055,25*77 +$GPRMC,222537.000,A,2734.84076,S,15305.76655,E,37.9,144.6,030308,11.2,W,A*03 +$GPVTG,144.6,T,155.8,M,37.9,N,70.3,K,A*24 +$GPGGA,222538.000,2734.84945,S,15305.77356,E,1,05,1.9,63.5,M,39.2,M,,*7C +$GPGLL,2734.84945,S,15305.77356,E,222538.000,A,A*4C +$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.6,1.9,3.1*3D +$GPGST,222538.000,13.1,8.0,61.7,1.6,7.5,56.4,113.0*51 +$GPGSV,3,1,10,16,48,115,40,25,39,268,37,23,58,175,32,20,71,336,*79 +$GPGSV,3,2,10,19,02,028,,04,06,241,22,13,31,223,25,27,19,284,23*7A +$GPGSV,3,3,10,11,06,338,22,03,14,055,28*7A +$GPRMC,222538.000,A,2734.84945,S,15305.77356,E,38.4,144.2,030308,11.2,W,A*04 +$GPVTG,144.2,T,155.4,M,38.4,N,71.1,K,A*2D +$GPGGA,222539.000,2734.85792,S,15305.78022,E,1,05,1.9,63.5,M,39.2,M,,*77 +$GPGLL,2734.85792,S,15305.78022,E,222539.000,A,A*47 +$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.6,1.9,3.1*3D +$GPGST,222539.000,6.4,7.5,72.7,1.5,7.1,66.5,137.2*68 +$GPGSV,3,1,10,16,48,115,40,25,39,268,38,23,58,175,32,20,71,336,*76 +$GPGSV,3,2,10,19,02,028,,04,06,241,22,13,31,223,25,27,19,284,23*7A +$GPGSV,3,3,10,11,06,338,22,03,14,055,28*7A +$GPRMC,222539.000,A,2734.85792,S,15305.78022,E,37.1,144.9,030308,11.2,W,A*0E +$GPVTG,144.9,T,156.1,M,37.1,N,68.7,K,A*24 +$GPGGA,222540.000,2734.86604,S,15305.78646,E,1,05,4.4,63.5,M,39.2,M,,*78 +$GPGLL,2734.86604,S,15305.78646,E,222540.000,A,A*40 +$GPGSA,A,3,16,25,23,27,11,,,,,,,,9.3,4.4,8.2*36 +$GPGST,222540.000,13.6,8.3,67.7,1.8,7.8,61.9,111.1*55 +$GPGSV,3,1,10,16,48,115,40,25,39,268,38,23,58,175,32,20,71,336,*76 +$GPGSV,3,2,10,19,02,028,,04,06,241,26,13,31,223,22,27,19,284,22*78 +$GPGSV,3,3,10,11,06,338,20,03,14,055,28*78 +$GPRMC,222540.000,A,2734.86604,S,15305.78646,E,35.3,145.6,030308,11.2,W,A*07 +$GPVTG,145.6,T,156.8,M,35.3,N,65.4,K,A*2D +$GPGGA,222541.000,2734.87421,S,15305.79222,E,1,06,1.8,63.5,M,39.2,M,,*70 +$GPGLL,2734.87421,S,15305.79222,E,222541.000,A,A*42 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A +$GPGST,222541.000,11.7,33.3,8.1,87.4,7.5,30.4,54.6*51 +$GPGSV,3,1,10,16,48,115,39,25,39,268,33,23,58,175,36,20,71,336,*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,26,13,31,223,22,27,19,284,22*78 +$GPGSV,3,3,10,11,06,338,20,03,14,055,26*76 +$GPRMC,222541.000,A,2734.87421,S,15305.79222,E,34.6,147.7,030308,11.2,W,A*02 +$GPVTG,147.7,T,158.9,M,34.6,N,64.1,K,A*21 +$GPGGA,222542.000,2734.88135,S,15305.79765,E,1,06,1.8,63.5,M,39.2,M,,*7A +$GPGLL,2734.88135,S,15305.79765,E,222542.000,A,A*48 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A +$GPGST,222542.000,23.5,7.9,53.0,0.2,7.2,48.5,78.4*6F +$GPGSV,3,1,10,16,48,115,40,25,39,268,36,23,58,175,35,20,71,336,*7F +$GPGSV,3,2,10,19,02,028,,04,06,241,27,13,31,223,23,27,19,284,25*7F +$GPGSV,3,3,10,11,06,338,20,03,14,055,26*76 +$GPRMC,222542.000,A,2734.88135,S,15305.79765,E,31.0,145.8,030308,11.2,W,A*06 +$GPVTG,145.8,T,157.0,M,31.0,N,57.4,K,A*2C +$GPGGA,222543.000,2734.88798,S,15305.80287,E,1,07,1.2,63.0,M,39.2,M,,*7B +$GPGLL,2734.88798,S,15305.80287,E,222543.000,A,A*47 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222543.000,18.8,6.7,28.4,0.5,6.1,26.0,41.8*62 +$GPGSV,3,1,10,16,48,115,40,25,39,268,39,23,58,175,35,20,71,336,21*73 +$GPGSV,3,2,10,19,02,028,,04,06,241,37,13,31,223,22,27,19,284,24*7E +$GPGSV,3,3,10,11,06,338,20,03,14,055,32*73 +$GPRMC,222543.000,A,2734.88798,S,15305.80287,E,29.0,144.8,030308,11.2,W,A*01 +$GPVTG,144.8,T,156.0,M,29.0,N,53.8,K,A*2D +$GPGGA,222544.000,2734.89328,S,15305.80767,E,1,06,1.8,62.9,M,39.2,M,,*7A +$GPGLL,2734.89328,S,15305.80767,E,222544.000,A,A*45 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A +$GPGST,222544.000,14.9,35.2,5.8,89.5,5.4,32.2,52.6*52 +$GPGSV,3,1,10,16,48,115,43,25,39,268,40,23,58,175,25,20,71,336,21*7F +$GPGSV,3,2,10,19,02,028,,04,06,241,28,13,31,223,30,27,19,284,29*7E +$GPGSV,3,3,10,11,06,338,20,03,14,055,33*72 +$GPRMC,222544.000,A,2734.89328,S,15305.80767,E,24.5,140.9,030308,11.2,W,A*0E +$GPVTG,140.9,T,152.1,M,24.5,N,45.3,K,A*29 +$GPGGA,222545.000,2734.89633,S,15305.81084,E,1,05,1.9,62.9,M,39.2,M,,*7D +$GPGLL,2734.89633,S,15305.81084,E,222545.000,A,A*40 +$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.6,1.9,3.1*3D +$GPGST,222545.000,19.5,6.0,33.0,1.0,5.5,30.2,52.4*69 +$GPGSV,3,1,10,16,48,115,41,25,39,268,34,23,58,175,29,20,71,336,30*72 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,31,223,29,27,19,284,30*73 +$GPGSV,3,3,10,11,06,338,20,03,14,055,30*71 +$GPRMC,222545.000,A,2734.89633,S,15305.81084,E,14.6,136.6,030308,11.2,W,A*05 +$GPVTG,136.6,T,147.8,M,14.6,N,27.0,K,A*2D +$GPGGA,222546.000,2734.89236,S,15305.81130,E,1,06,1.3,62.6,M,39.2,M,,*77 +$GPGLL,2734.89236,S,15305.81130,E,222546.000,A,A*4C +$GPGSA,A,3,16,25,23,20,13,03,,,,,,,2.3,1.3,1.9*3B +$GPGST,222546.000,11.5,5.6,15.6,0.9,5.2,14.3,26.4*6E +$GPGSV,3,1,10,16,48,115,35,25,39,268,40,23,58,175,41,20,71,336,38*74 +$GPGSV,3,2,10,19,02,028,,04,06,241,26,13,31,223,33,27,19,284,26*7C +$GPGSV,3,3,10,11,06,338,20,03,14,055,28*78 +$GPRMC,222546.000,A,2734.89236,S,15305.81130,E,16.9,2.1,030308,11.2,W,A*05 +$GPVTG,2.1,T,13.3,M,16.9,N,31.2,K,A*1F +$GPGGA,222547.000,2734.89429,S,15305.81239,E,1,05,2.3,62.5,M,39.2,M,,*77 +$GPGLL,2734.89429,S,15305.81239,E,222547.000,A,A*4F +$GPGSA,A,3,16,23,13,27,03,,,,,,,,4.6,2.3,3.9*39 +$GPGST,222547.000,11.4,38.3,9.7,69.8,14.7,33.0,49.2*6B +$GPGSV,3,1,10,16,48,115,32,25,39,268,37,23,58,175,42,20,71,336,37*7F +$GPGSV,3,2,10,19,02,028,,04,06,241,26,13,31,223,36,27,19,284,29*76 +$GPGSV,3,3,10,11,06,338,20,03,14,055,34*75 +$GPRMC,222547.000,A,2734.89429,S,15305.81239,E,8.4,154.5,030308,11.2,W,A*32 +$GPVTG,154.5,T,165.7,M,8.4,N,15.6,K,A*1D +$GPGGA,222548.000,2734.89474,S,15305.81253,E,1,07,1.2,62.0,M,39.2,M,,*79 +$GPGLL,2734.89474,S,15305.81253,E,222548.000,A,A*44 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222548.000,11.0,12.3,7.9,86.0,7.3,11.3,20.6*5F +$GPGSV,3,1,10,16,48,115,34,25,39,268,36,23,58,175,42,20,71,336,38*77 +$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,31,223,36,27,19,284,29*75 +$GPGSV,3,3,10,11,06,338,20,03,14,055,33*72 +$GPRMC,222548.000,A,2734.89474,S,15305.81253,E,0.3,353.0,030308,11.2,W,A*36 +$GPVTG,353.0,T,4.3,M,0.3,N,0.5,K,A*27 +$GPGGA,222549.000,2734.89490,S,15305.81265,E,1,04,2.0,61.8,M,39.2,M,,*7E +$GPGLL,2734.89490,S,15305.81265,E,222549.000,A,A*4A +$GPGSA,A,3,25,23,13,03,,,,,,,,,3.9,2.0,3.3*3D +$GPGST,222549.000,17.0,16.1,8.8,81.3,8.3,14.6,29.3*57 +$GPGSV,3,1,11,16,48,115,33,25,39,268,37,23,58,175,42,20,71,336,36*7E +$GPGSV,3,2,11,19,02,028,,04,06,241,25,13,31,223,35,27,19,284,30*7F +$GPGSV,3,3,11,11,06,338,20,01,,,21,03,14,055,33*71 +$GPRMC,222549.000,A,2734.89490,S,15305.81265,E,0.2,330.7,030308,11.2,W,A*3B +$GPVTG,330.7,T,341.9,M,0.2,N,0.3,K,A*2A +$GPGGA,222550.000,2734.89526,S,15305.81278,E,1,04,2.6,61.7,M,39.2,M,,*7F +$GPGLL,2734.89526,S,15305.81278,E,222550.000,A,A*42 +$GPGSA,A,3,16,25,23,13,,,,,,,,,6.1,2.6,5.6*31 +$GPGST,222550.000,13.4,12.4,27.3,43.1,18.9,19.8,52.9*5A +$GPGSV,3,1,11,16,48,115,30,25,39,268,38,23,58,175,42,20,71,336,37*73 +$GPGSV,3,2,11,19,02,028,,04,06,241,25,13,31,223,36,27,19,284,31*7D +$GPGSV,3,3,11,11,06,338,,01,,,21,03,14,055,32*72 +$GPRMC,222550.000,A,2734.89526,S,15305.81278,E,0.1,350.7,030308,11.2,W,A*36 +$GPVTG,350.7,T,1.9,M,0.1,N,0.2,K,A*29 +$GPGGA,222551.000,2734.89528,S,15305.81279,E,1,05,2.3,61.7,M,39.2,M,,*75 +$GPGLL,2734.89528,S,15305.81279,E,222551.000,A,A*4C +$GPGSA,A,3,16,23,13,27,03,,,,,,,,4.6,2.3,3.9*39 +$GPGST,222551.000,13.7,31.0,11.1,60.5,16.5,25.2,39.3*5F +$GPGSV,3,1,11,16,48,115,30,25,39,268,39,23,58,175,41,20,71,336,35*73 +$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,31,223,36,27,19,284,31*7B +$GPGSV,3,3,11,11,06,338,,01,,,20,03,14,055,30*71 +$GPRMC,222551.000,A,2734.89528,S,15305.81279,E,0.1,345.0,030308,11.2,W,A*3B +$GPVTG,345.0,T,356.2,M,0.1,N,0.2,K,A*20 +$GPGGA,222552.000,2734.89550,S,15305.81288,E,1,05,2.1,61.7,M,39.2,M,,*75 +$GPGLL,2734.89550,S,15305.81288,E,222552.000,A,A*4E +$GPGSA,A,3,16,25,23,13,27,,,,,,,,4.7,2.1,4.2*32 +$GPGST,222552.000,11.7,11.5,20.8,20.0,11.8,18.2,39.1*55 +$GPGSV,3,1,11,16,48,115,31,25,39,268,40,23,58,175,42,20,71,336,35*7F +$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,31,223,38,27,19,284,31*75 +$GPGSV,3,3,11,11,06,338,,01,,,20,03,14,055,30*71 +$GPRMC,222552.000,A,2734.89550,S,15305.81288,E,0.1,11.2,030308,11.2,W,A*09 +$GPVTG,11.2,T,22.5,M,0.1,N,0.2,K,A*27 +$GPGGA,222553.000,2734.89573,S,15305.81294,E,1,05,2.1,61.5,M,39.2,M,,*7A +$GPGLL,2734.89573,S,15305.81294,E,222553.000,A,A*43 +$GPGSA,A,3,16,25,23,13,27,,,,,,,,4.7,2.1,4.2*32 +$GPGST,222553.000,9.8,10.3,17.6,19.1,10.4,15.6,33.7*6C +$GPGSV,3,1,10,16,48,115,29,25,39,268,38,23,58,175,41,20,71,336,37*79 +$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,31,223,39,27,19,284,30*74 +$GPGSV,3,3,10,11,06,338,,03,14,055,29*7B +$GPRMC,222553.000,A,2734.89573,S,15305.81294,E,0.1,351.8,030308,11.2,W,A*39 +$GPVTG,351.8,T,3.0,M,0.1,N,0.2,K,A*2C +$GPGGA,222554.000,2734.89591,S,15305.81298,E,1,04,2.6,61.4,M,39.2,M,,*7A +$GPGLL,2734.89591,S,15305.81298,E,222554.000,A,A*44 +$GPGSA,A,3,16,25,23,13,,,,,,,,,6.1,2.6,5.6*31 +$GPGST,222554.000,16.9,10.4,17.8,12.8,10.0,16.1,37.3*5F +$GPGSV,3,1,10,16,48,115,32,25,39,268,38,23,58,175,41,20,71,336,36*72 +$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,31,223,38,27,19,284,31*74 +$GPGSV,3,3,10,11,06,338,,03,14,055,26*74 +$GPRMC,222554.000,A,2734.89591,S,15305.81298,E,0.1,334.9,030308,11.2,W,A*3C +$GPVTG,334.9,T,346.1,M,0.1,N,0.2,K,A*2D +$GPGGA,222555.000,2734.89607,S,15305.81301,E,1,04,2.6,61.2,M,39.2,M,,*70 +$GPGLL,2734.89607,S,15305.81301,E,222555.000,A,A*48 +$GPGSA,A,3,16,25,23,13,,,,,,,,,6.1,2.6,5.6*31 +$GPGST,222555.000,14.4,11.9,23.3,40.8,16.2,17.6,44.5*56 +$GPGSV,3,1,11,16,48,115,32,25,39,268,37,23,58,175,40,20,71,336,38*73 +$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,31,223,37,27,19,284,30*7B +$GPGSV,3,3,11,11,06,338,,01,,,20,03,14,055,25*75 +$GPRMC,222555.000,A,2734.89607,S,15305.81301,E,0.1,6.2,030308,11.2,W,A*39 +$GPVTG,6.2,T,17.4,M,0.1,N,0.2,K,A*16 +$GPGGA,222556.000,2734.89612,S,15305.81301,E,1,04,2.6,61.1,M,39.2,M,,*74 +$GPGLL,2734.89612,S,15305.81301,E,222556.000,A,A*4F +$GPGSA,A,3,16,25,23,13,,,,,,,,,6.1,2.6,5.6*31 +$GPGST,222556.000,12.4,15.8,24.1,4.1,14.5,22.0,39.9*69 +$GPGSV,3,1,11,16,48,115,33,25,39,268,38,23,58,174,41,20,71,336,38*7D +$GPGSV,3,2,11,19,02,028,,04,06,242,23,13,31,223,38,27,19,284,32*75 +$GPGSV,3,3,11,11,06,338,,01,,,20,03,14,055,28*78 +$GPRMC,222556.000,A,2734.89612,S,15305.81301,E,0.1,21.8,030308,11.2,W,A*01 +$GPVTG,21.8,T,33.0,M,0.1,N,0.2,K,A*2B +$GPGGA,222557.000,2734.89635,S,15305.81337,E,1,05,2.1,61.0,M,39.2,M,,*72 +$GPGLL,2734.89635,S,15305.81337,E,222557.000,A,A*4E +$GPGSA,A,3,16,25,23,13,27,,,,,,,,4.7,2.1,4.2*32 +$GPGST,222557.000,10.3,13.0,15.0,5.2,11.9,13.7,32.7*6B +$GPGSV,3,1,10,16,48,115,33,25,39,268,38,23,58,174,41,20,71,336,36*72 +$GPGSV,3,2,10,19,02,028,,04,06,242,23,13,31,223,39,27,19,284,28*7E +$GPGSV,3,3,10,11,06,338,,03,14,055,31*72 +$GPRMC,222557.000,A,2734.89635,S,15305.81337,E,1.2,96.1,030308,11.2,W,A*07 +$GPVTG,96.1,T,107.3,M,1.2,N,2.2,K,A*1B +$GPGGA,222558.000,2734.89638,S,15305.81517,E,1,06,1.8,60.6,M,39.2,M,,*7A +$GPGLL,2734.89638,S,15305.81517,E,222558.000,A,A*48 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A +$GPGST,222558.000,18.6,12.9,7.5,72.4,7.5,11.4,21.9*57 +$GPGSV,3,1,10,16,48,115,39,25,39,268,38,23,58,174,37,20,71,336,26*78 +$GPGSV,3,2,10,19,02,028,,04,06,242,23,13,31,223,34,27,19,284,29*72 +$GPGSV,3,3,10,11,06,338,,03,14,055,30*73 +$GPRMC,222558.000,A,2734.89638,S,15305.81517,E,5.6,82.0,030308,11.2,W,A*05 +$GPVTG,82.0,T,93.2,M,5.6,N,10.3,K,A*10 +$GPGGA,222559.000,2734.89631,S,15305.81911,E,1,05,2.2,60.5,M,39.2,M,,*71 +$GPGLL,2734.89631,S,15305.81911,E,222559.000,A,A*4A +$GPGSA,A,3,16,25,23,20,27,,,,,,,,3.6,2.2,2.9*3A +$GPGST,222559.000,17.0,15.1,33.1,15.1,15.5,29.4,59.0*59 +$GPGSV,3,1,10,16,48,115,34,25,39,268,35,23,58,174,30,20,71,336,29*70 +$GPGSV,3,2,10,19,02,028,,04,06,242,23,13,31,223,35,27,19,284,28*72 +$GPGSV,3,3,10,11,06,338,,03,14,055,27*75 +$GPRMC,222559.000,A,2734.89631,S,15305.81911,E,12.5,87.6,030308,11.2,W,A*31 +$GPVTG,87.6,T,98.8,M,12.5,N,23.2,K,A*26 +$GPGGA,222600.000,2734.89436,S,15305.82359,E,1,06,1.8,61.2,M,39.2,M,,*72 +$GPGLL,2734.89436,S,15305.82359,E,222600.000,A,A*45 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A +$GPGST,222600.000,14.4,14.9,6.9,79.1,6.7,13.4,28.4*57 +$GPGSV,3,1,10,16,48,115,37,25,39,268,36,23,58,174,29,20,71,336,33*73 +$GPGSV,3,2,10,19,02,028,,04,06,242,23,13,31,223,39,27,19,284,28*7E +$GPGSV,3,3,10,11,06,338,,03,14,055,28*7A +$GPRMC,222600.000,A,2734.89436,S,15305.82359,E,15.9,62.5,030308,11.2,W,A*3D +$GPVTG,62.5,T,73.7,M,15.9,N,29.5,K,A*22 +$GPGGA,222601.000,2734.89190,S,15305.82850,E,1,06,1.8,60.5,M,39.2,M,,*7E +$GPGLL,2734.89190,S,15305.82850,E,222601.000,A,A*4F +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.6,1.8,3.1*39 +$GPGST,222601.000,11.5,13.4,6.1,78.5,6.0,12.0,24.9*56 +$GPGSV,3,1,10,16,48,115,40,25,39,268,27,23,58,174,35,20,71,336,28*74 +$GPGSV,3,2,10,19,02,028,,04,06,242,,13,31,223,39,27,19,284,27*70 +$GPGSV,3,3,10,11,06,338,,03,14,055,23*71 +$GPRMC,222601.000,A,2734.89190,S,15305.82850,E,18.0,58.9,030308,11.2,W,A*36 +$GPVTG,58.9,T,70.1,M,18.0,N,33.4,K,A*2C +$GPGGA,222602.000,2734.88904,S,15305.83361,E,1,05,1.6,60.0,M,39.2,M,,*79 +$GPGLL,2734.88904,S,15305.83361,E,222602.000,A,A*40 +$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F +$GPGST,222602.000,11.3,17.1,6.5,54.9,10.2,13.2,18.6*62 +$GPGSV,3,1,10,16,48,115,27,25,39,268,29,23,58,174,33,20,71,336,33*77 +$GPGSV,3,2,10,19,02,028,,04,06,242,,13,31,223,35,27,19,284,32*78 +$GPGSV,3,3,10,11,06,338,,03,14,055,24*76 +$GPRMC,222602.000,A,2734.88904,S,15305.83361,E,19.8,55.1,030308,11.2,W,A*35 +$GPVTG,55.1,T,66.3,M,19.8,N,36.7,K,A*23 +$GPGGA,222603.000,2734.88556,S,15305.83944,E,1,04,3.8,58.8,M,39.2,M,,*70 +$GPGLL,2734.88556,S,15305.83944,E,222603.000,A,A*47 +$GPGSA,A,3,25,23,20,27,,,,,,,,,6.5,3.8,5.2*3C +$GPGST,222603.000,12.6,48.6,15.6,66.9,41.3,21.9,62.5*59 +$GPGSV,3,1,10,16,48,115,23,25,39,268,29,23,58,174,31,20,71,337,37*74 +$GPGSV,3,2,10,19,02,028,,04,06,242,,13,31,223,34,27,19,284,26*7C +$GPGSV,3,3,10,11,06,338,,03,14,055,28*7A +$GPRMC,222603.000,A,2734.88556,S,15305.83944,E,22.7,54.4,030308,11.2,W,A*31 +$GPVTG,54.4,T,65.6,M,22.7,N,42.1,K,A*23 +$GPGGA,222604.000,2734.88238,S,15305.84546,E,1,04,4.4,57.8,M,39.2,M,,*75 +$GPGLL,2734.88238,S,15305.84546,E,222604.000,A,A*46 +$GPGSA,A,3,25,20,13,27,,,,,,,,,7.2,4.4,5.7*37 +$GPGST,222604.000,10.4,46.8,10.9,81.3,42.4,11.8,57.5*57 +$GPGSV,3,1,10,16,48,115,27,25,39,268,32,23,58,174,32,20,71,337,37*79 +$GPGSV,3,2,10,19,02,028,,04,06,242,,13,31,223,34,27,19,284,34*7F +$GPGSV,3,3,10,11,06,338,,03,14,055,29*7B +$GPRMC,222604.000,A,2734.88238,S,15305.84546,E,23.3,54.5,030308,11.2,W,A*34 +$GPVTG,54.5,T,65.7,M,23.3,N,43.2,K,A*24 +$GPGGA,222605.000,2734.87917,S,15305.85182,E,1,04,4.4,56.6,M,39.2,M,,*7F +$GPGLL,2734.87917,S,15305.85182,E,222605.000,A,A*43 +$GPGSA,A,3,25,20,13,27,,,,,,,,,7.2,4.4,5.7*37 +$GPGST,222605.000,14.3,40.3,10.1,81.5,36.5,10.7,49.8*58 +$GPGSV,3,1,10,16,48,115,24,25,39,268,32,23,58,174,33,20,71,337,37*7B +$GPGSV,3,2,10,19,02,028,,04,06,242,20,13,31,223,35,27,19,284,32*7A +$GPGSV,3,3,10,11,06,338,,03,14,055,26*74 +$GPRMC,222605.000,A,2734.87917,S,15305.85182,E,24.5,55.0,030308,11.2,W,A*34 +$GPVTG,55.0,T,66.2,M,24.5,N,45.3,K,A*20 +$GPGGA,222606.000,2734.87588,S,15305.85846,E,1,05,3.6,55.8,M,39.2,M,,*7E +$GPGLL,2734.87588,S,15305.85846,E,222606.000,A,A*4B +$GPGSA,A,3,25,23,20,13,27,,,,,,,,6.3,3.6,5.2*36 +$GPGST,222606.000,11.7,30.4,8.7,77.7,27.2,9.8,40.6*59 +$GPGSV,3,1,10,16,48,115,24,25,39,268,31,23,58,174,32,20,71,337,34*7A +$GPGSV,3,2,10,19,02,029,,04,06,242,20,13,31,223,35,27,19,284,34*7D +$GPGSV,3,3,10,11,06,338,,03,14,055,24*76 +$GPRMC,222606.000,A,2734.87588,S,15305.85846,E,25.3,55.9,030308,11.2,W,A*32 +$GPVTG,55.9,T,67.1,M,25.3,N,46.9,K,A*25 +$GPGGA,222607.000,2734.87218,S,15305.86543,E,1,06,1.8,55.5,M,39.2,M,,*78 +$GPGLL,2734.87218,S,15305.86543,E,222607.000,A,A*4F +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.6,1.8,3.1*39 +$GPGST,222607.000,11.2,13.8,8.5,86.1,7.8,12.6,27.3*52 +$GPGSV,3,1,10,16,48,115,29,25,39,268,26,23,58,174,34,20,71,337,32*71 +$GPGSV,3,2,10,19,02,029,,04,06,242,27,13,31,223,36,27,19,284,30*7D +$GPGSV,3,3,10,11,06,338,,03,14,055,24*76 +$GPRMC,222607.000,A,2734.87218,S,15305.86543,E,26.0,57.6,030308,11.2,W,A*3B +$GPVTG,57.6,T,68.8,M,26.0,N,48.1,K,A*28 +$GPGGA,222608.000,2734.86867,S,15305.87251,E,1,06,1.8,55.1,M,39.2,M,,*75 +$GPGLL,2734.86867,S,15305.87251,E,222608.000,A,A*46 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.6,1.8,3.1*39 +$GPGST,222608.000,15.1,15.8,7.1,68.8,8.0,13.6,36.7*5C +$GPGSV,3,1,10,16,48,115,39,25,39,268,28,23,58,174,35,20,71,337,30*7D +$GPGSV,3,2,10,19,02,029,,04,06,242,27,13,31,223,40,27,19,284,28*75 +$GPGSV,3,3,10,11,06,338,,03,14,055,28*7A +$GPRMC,222608.000,A,2734.86867,S,15305.87251,E,25.9,60.7,030308,11.2,W,A*3D +$GPVTG,60.7,T,71.9,M,25.9,N,47.9,K,A*29 +$GPGGA,222609.000,2734.86555,S,15305.87973,E,1,06,1.8,54.7,M,39.2,M,,*74 +$GPGLL,2734.86555,S,15305.87973,E,222609.000,A,A*40 +$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.6,1.8,3.1*39 +$GPGST,222609.000,10.9,10.9,5.1,85.4,4.7,10.0,22.0*55 +$GPGSV,3,1,10,16,48,116,34,25,39,268,39,23,58,174,29,20,71,337,33*7D +$GPGSV,3,2,10,19,02,029,,04,06,242,24,13,31,223,42,27,19,284,23*7F +$GPGSV,3,3,10,11,06,338,,03,14,055,26*74 +$GPRMC,222609.000,A,2734.86555,S,15305.87973,E,25.7,64.3,030308,11.2,W,A*35 +$GPVTG,64.3,T,75.6,M,25.7,N,47.5,K,A*20 +$GPGGA,222610.000,2734.86253,S,15305.88695,E,1,05,1.9,54.1,M,39.2,M,,*71 +$GPGLL,2734.86253,S,15305.88695,E,222610.000,A,A*41 +$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.7,1.9,3.1*3C +$GPGST,222610.000,11.1,14.6,7.4,64.7,8.3,12.4,28.7*57 +$GPGSV,3,1,10,16,48,116,29,25,39,268,42,23,58,174,28,20,71,337,32*7D +$GPGSV,3,2,10,19,02,029,,04,06,242,24,13,31,223,42,27,19,284,23*7F +$GPGSV,3,3,10,11,06,338,,03,14,055,24*76 +$GPRMC,222610.000,A,2734.86253,S,15305.88695,E,25.3,65.0,030308,11.2,W,A*32 +$GPVTG,65.0,T,76.3,M,25.3,N,46.8,K,A*2C +$GPGGA,222611.000,2734.85924,S,15305.89387,E,1,05,2.2,53.4,M,39.2,M,,*75 +$GPGLL,2734.85924,S,15305.89387,E,222611.000,A,A*4F +$GPGSA,A,3,16,25,23,20,13,,,,,,,,5.3,2.2,4.8*39 +$GPGST,222611.000,17.7,8.4,21.7,17.4,9.4,19.0,57.8*57 +$GPGSV,3,1,10,16,48,116,39,25,39,268,32,23,58,174,35,20,71,337,26*72 +$GPGSV,3,2,10,19,02,029,,04,06,242,31,13,31,223,39,27,19,284,24*70 +$GPGSV,3,3,10,11,06,338,,03,14,055,26*74 +$GPRMC,222611.000,A,2734.85924,S,15305.89387,E,24.9,61.4,030308,11.2,W,A*37 +$GPVTG,61.4,T,72.6,M,24.9,N,46.1,K,A*2F +$GPGGA,222612.000,2734.85516,S,15305.90007,E,1,07,1.2,53.3,M,39.2,M,,*7E +$GPGLL,2734.85516,S,15305.90007,E,222612.000,A,A*42 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222612.000,15.5,16.3,8.2,77.8,8.0,14.7,27.8*50 +$GPGSV,3,1,10,16,48,116,29,25,39,268,29,23,58,174,30,20,71,337,34*7F +$GPGSV,3,2,10,19,02,029,,04,06,242,27,13,31,223,35,27,19,284,28*77 +$GPGSV,3,3,10,11,06,338,,03,14,055,25*77 +$GPRMC,222612.000,A,2734.85516,S,15305.90007,E,24.5,53.1,030308,11.2,W,A*32 +$GPVTG,53.1,T,64.3,M,24.5,N,45.4,K,A*23 +$GPGGA,222613.000,2734.85043,S,15305.90565,E,1,05,1.9,53.2,M,39.2,M,,*73 +$GPGLL,2734.85043,S,15305.90565,E,222613.000,A,A*47 +$GPGSA,A,3,16,25,20,13,27,,,,,,,,3.7,1.9,3.2*3A +$GPGST,222613.000,21.1,11.0,20.9,21.8,11.7,18.1,48.5*55 +$GPGSV,3,1,10,16,48,116,30,25,39,268,32,23,58,174,24,20,71,337,36*7A +$GPGSV,3,2,10,19,02,029,,04,06,242,22,13,31,223,35,27,19,284,29*73 +$GPGSV,3,3,10,11,06,338,,03,14,055,29*7B +$GPRMC,222613.000,A,2734.85043,S,15305.90565,E,24.9,45.4,030308,11.2,W,A*39 +$GPVTG,45.4,T,56.6,M,24.9,N,46.1,K,A*2F +$GPGGA,222614.000,2734.84523,S,15305.91064,E,1,05,1.9,53.2,M,39.2,M,,*73 +$GPGLL,2734.84523,S,15305.91064,E,222614.000,A,A*47 +$GPGSA,A,3,16,25,20,13,27,,,,,,,,3.7,1.9,3.2*3A +$GPGST,222614.000,18.8,16.8,28.3,28.1,18.2,24.0,43.4*54 +$GPGSV,3,1,10,16,48,116,27,25,39,268,30,23,58,174,32,20,71,337,35*7A +$GPGSV,3,2,10,19,02,029,,04,06,242,28,13,31,223,26,27,19,284,32*71 +$GPGSV,3,3,10,11,06,338,,03,14,055,30*73 +$GPRMC,222614.000,A,2734.84523,S,15305.91064,E,24.7,40.2,030308,11.2,W,A*34 +$GPVTG,40.2,T,51.4,M,24.7,N,45.7,K,A*22 +$GPGGA,222615.000,2734.84002,S,15305.91547,E,1,07,1.2,53.0,M,39.2,M,,*7B +$GPGLL,2734.84002,S,15305.91547,E,222615.000,A,A*44 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222615.000,19.7,18.9,7.9,71.0,8.8,16.5,18.9*52 +$GPGSV,3,1,10,16,48,116,25,25,39,268,26,23,58,174,35,20,71,337,34*79 +$GPGSV,3,2,10,19,02,029,,04,06,242,24,13,31,223,25,27,19,284,30*7C +$GPGSV,3,3,10,11,06,338,,03,14,055,29*7B +$GPRMC,222615.000,A,2734.84002,S,15305.91547,E,24.1,38.7,030308,11.2,W,A*3B +$GPVTG,38.7,T,49.9,M,24.1,N,44.7,K,A*2B +$GPGGA,222616.000,2734.83488,S,15305.92024,E,1,07,1.2,53.1,M,39.2,M,,*7B +$GPGLL,2734.83488,S,15305.92024,E,222616.000,A,A*45 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222616.000,18.1,15.8,11.2,70.8,10.8,14.1,19.9*51 +$GPGSV,3,1,10,16,48,116,27,25,39,268,29,23,58,174,34,20,71,337,30*71 +$GPGSV,3,2,10,19,02,029,,04,06,242,27,13,31,223,24,27,19,284,28*77 +$GPGSV,3,3,10,11,06,338,,03,14,055,32*71 +$GPRMC,222616.000,A,2734.83488,S,15305.92024,E,24.0,39.3,030308,11.2,W,A*3E +$GPVTG,39.3,T,50.5,M,24.0,N,44.5,K,A*29 +$GPGGA,222617.000,2734.82955,S,15305.92505,E,1,07,1.2,53.2,M,39.2,M,,*73 +$GPGLL,2734.82955,S,15305.92505,E,222617.000,A,A*4E +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222617.000,14.7,13.3,9.2,70.7,8.9,11.8,16.8*5B +$GPGSV,3,1,10,16,48,116,23,25,39,268,30,23,58,174,35,20,71,337,33*7F +$GPGSV,3,2,10,19,02,029,,04,06,242,25,13,31,223,25,27,19,284,26*7A +$GPGSV,3,3,10,11,06,338,,03,14,055,32*71 +$GPRMC,222617.000,A,2734.82955,S,15305.92505,E,24.7,38.8,030308,11.2,W,A*38 +$GPVTG,38.8,T,50.0,M,24.7,N,45.7,K,A*22 +$GPGGA,222618.000,2734.82405,S,15305.92991,E,1,07,1.2,53.5,M,39.2,M,,*72 +$GPGLL,2734.82405,S,15305.92991,E,222618.000,A,A*48 +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222618.000,13.7,14.7,7.8,77.2,7.6,13.2,24.3*54 +$GPGSV,3,1,10,16,48,116,27,25,39,268,30,23,58,174,36,20,71,337,32*79 +$GPGSV,3,2,10,19,02,029,,04,06,242,31,13,31,223,25,27,19,283,23*7D +$GPGSV,3,3,10,11,06,338,,03,14,056,32*72 +$GPRMC,222618.000,A,2734.82405,S,15305.92991,E,25.3,38.3,030308,11.2,W,A*30 +$GPVTG,38.3,T,49.5,M,25.3,N,46.8,K,A*2D +$GPGGA,222619.000,2734.81867,S,15305.93485,E,1,07,1.2,53.8,M,39.2,M,,*7C +$GPGLL,2734.81867,S,15305.93485,E,222619.000,A,A*4B +$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33 +$GPGST,222619.000,20.5,18.3,9.9,85.5,9.1,16.7,27.9*5A +$GPGSV,3,1,10,16,48,116,27,25,39,268,30,23,58,174,35,20,71,337,33*7B +$GPGSV,3,2,10,19,02,029,,04,06,242,29,13,31,223,23,27,19,283,23*72 +$GPGSV,3,3,10,11,06,338,,03,14,056,32*72 +$GPRMC,222619.000,A,2734.81867,S,15305.93485,E,25.3,39.2,030308,11.2,W,A*33 +$GPVTG,39.2,T,50.4,M,25.3,N,46.8,K,A*24 +$GPGGA,222620.000,2734.81344,S,15305.93979,E,1,05,1.6,53.8,M,39.2,M,,*74 +$GPGLL,2734.81344,S,15305.93979,E,222620.000,A,A*45 +$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F +$GPGST,222620.000,18.2,14.7,21.1,9.8,19.1,13.7,29.8*64 +$GPGSV,3,1,10,16,48,116,26,25,39,268,30,23,58,174,33,20,71,337,34*7B +$GPGSV,3,2,10,19,02,029,,04,06,242,24,13,31,223,25,27,19,283,29*73 +$GPGSV,3,3,10,11,06,338,,03,14,056,33*73 +$GPRMC,222620.000,A,2734.81344,S,15305.93979,E,24.7,39.5,030308,11.2,W,A*3F +$GPVTG,39.5,T,50.7,M,24.7,N,45.8,K,A*26 +$GPGGA,222621.000,2734.80838,S,15305.94469,E,1,06,1.3,53.5,M,39.2,M,,*74 +$GPGLL,2734.80838,S,15305.94469,E,222621.000,A,A*4E +$GPGSA,A,3,16,25,23,20,13,03,,,,,,,2.3,1.3,1.9*3B +$GPGST,222621.000,14.6,11.8,13.4,39.2,11.7,11.4,21.8*5D +$GPGSV,3,1,10,16,48,116,25,25,39,268,31,23,58,174,33,20,71,337,37*7A +$GPGSV,3,2,10,19,03,029,,04,06,242,24,13,31,223,24,27,19,283,36*7D +$GPGSV,3,3,10,11,06,338,,03,14,056,32*72 +$GPRMC,222621.000,A,2734.80838,S,15305.94469,E,24.1,40.1,030308,11.2,W,A*38 +$GPVTG,40.1,T,51.3,M,24.1,N,44.7,K,A*21 +$GPGGA,222622.000,2734.80354,S,15305.94956,E,1,06,1.7,53.3,M,39.2,M,,*75 +$GPGLL,2734.80354,S,15305.94956,E,222622.000,A,A*4D +$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.9*3B +$GPGST,222622.000,13.2,10.2,17.1,41.6,12.5,13.2,30.8*59 +$GPGSV,3,1,10,16,48,116,26,25,39,268,31,23,58,174,26,20,71,337,39*73 +$GPGSV,3,2,10,19,03,029,,04,06,242,24,13,31,223,28,27,19,283,36*71 +$GPGSV,3,3,10,11,06,338,,03,14,056,35*75 +$GPRMC,222622.000,A,2734.80354,S,15305.94956,E,23.6,41.3,030308,11.2,W,A*38 +$GPVTG,41.3,T,52.5,M,23.6,N,43.7,K,A*20 +$GPGGA,222623.000,2734.79878,S,15305.95470,E,1,05,1.9,52.8,M,39.2,M,,*78 +$GPGLL,2734.79878,S,15305.95470,E,222623.000,A,A*47 +$GPGSA,A,3,16,25,20,13,27,,,,,,,,3.7,1.9,3.2*3A +$GPGST,222623.000,14.7,24.8,16.6,50.3,19.9,18.6,39.3*5E +$GPGSV,3,1,11,16,48,116,24,25,39,268,32,23,58,174,24,20,71,337,38*70 +$GPGSV,3,2,11,19,03,029,,04,06,242,24,13,31,223,32,27,19,283,34*79 +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,34*7D +$GPRMC,222623.000,A,2734.79878,S,15305.95470,E,24.0,43.4,030308,11.2,W,A*36 +$GPVTG,43.4,T,54.6,M,24.0,N,44.4,K,A*25 +$GPGGA,222624.000,2734.79400,S,15305.96019,E,1,05,1.9,52.3,M,39.2,M,,*7F +$GPGLL,2734.79400,S,15305.96019,E,222624.000,A,A*4B +$GPGSA,A,3,16,25,20,27,03,,,,,,,,2.7,1.9,2.0*39 +$GPGST,222624.000,12.3,24.0,7.9,80.2,8.0,21.7,15.3*5C +$GPGSV,3,1,11,16,48,116,23,25,39,268,32,23,58,174,26,20,71,337,37*7A +$GPGSV,3,2,11,19,03,029,,04,06,242,24,13,31,223,35,27,19,283,25*7E +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,31*78 +$GPRMC,222624.000,A,2734.79400,S,15305.96019,E,24.7,45.3,030308,11.2,W,A*3C +$GPVTG,45.3,T,56.6,M,24.7,N,45.7,K,A*23 +$GPGGA,222625.000,2734.78953,S,15305.96595,E,1,05,1.9,51.8,M,39.2,M,,*7D +$GPGLL,2734.78953,S,15305.96595,E,222625.000,A,A*41 +$GPGSA,A,3,16,25,20,13,27,,,,,,,,3.7,1.9,3.2*3A +$GPGST,222625.000,24.0,12.2,19.9,37.5,14.2,16.0,36.1*57 +$GPGSV,3,1,11,16,48,116,30,25,39,268,32,23,58,174,23,20,71,337,37*7D +$GPGSV,3,2,11,19,03,029,,04,06,242,25,13,31,223,36,27,19,283,25*7C +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,24*7C +$GPRMC,222625.000,A,2734.78953,S,15305.96595,E,24.8,47.9,030308,11.2,W,A*31 +$GPVTG,47.9,T,59.1,M,24.8,N,46.0,K,A*28 +$GPGGA,222626.000,2734.78516,S,15305.97172,E,1,05,2.5,51.1,M,39.2,M,,*79 +$GPGLL,2734.78516,S,15305.97172,E,222626.000,A,A*43 +$GPGSA,A,3,16,25,20,04,13,,,,,,,,4.2,2.5,3.3*37 +$GPGST,222626.000,20.2,12.6,23.1,19.8,13.0,20.2,38.4*5F +$GPGSV,3,1,11,16,48,116,31,25,39,268,32,23,58,174,25,20,71,337,38*75 +$GPGSV,3,2,11,19,03,029,,04,06,242,25,13,31,223,36,27,19,283,23*7A +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,24*7C +$GPRMC,222626.000,A,2734.78516,S,15305.97172,E,24.7,48.3,030308,11.2,W,A*39 +$GPVTG,48.3,T,59.5,M,24.7,N,45.7,K,A*22 +$GPGGA,222627.000,2734.78079,S,15305.97737,E,1,04,2.5,50.5,M,39.2,M,,*77 +$GPGLL,2734.78079,S,15305.97737,E,222627.000,A,A*49 +$GPGSA,A,3,16,23,20,13,,,,,,,,,5.8,2.5,5.2*39 +$GPGST,222627.000,16.3,12.4,42.2,11.3,13.5,37.9,90.0*51 +$GPGSV,3,1,11,16,48,116,28,25,39,268,32,23,58,174,25,20,71,337,37*72 +$GPGSV,3,2,11,19,03,029,,04,06,242,29,13,31,223,37,27,19,283,30*75 +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,24*7C +$GPRMC,222627.000,A,2734.78079,S,15305.97737,E,24.3,48.1,030308,11.2,W,A*35 +$GPVTG,48.1,T,59.3,M,24.3,N,45.1,K,A*24 +$GPGGA,222628.000,2734.77637,S,15305.98293,E,1,07,1.3,50.2,M,39.2,M,,*7E +$GPGLL,2734.77637,S,15305.98293,E,222628.000,A,A*41 +$GPGSA,A,3,16,25,23,04,13,27,03,,,,,,2.2,1.3,1.8*38 +$GPGST,222628.000,13.2,14.5,8.8,76.9,8.4,13.0,22.0*5F +$GPGSV,3,1,11,16,48,116,30,25,39,268,32,23,58,174,27,20,71,337,37*79 +$GPGSV,3,2,11,19,03,029,,04,06,242,32,13,31,223,37,27,19,283,28*76 +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,25*7D +$GPRMC,222628.000,A,2734.77637,S,15305.98293,E,23.9,48.5,030308,11.2,W,A*34 +$GPVTG,48.5,T,59.7,M,23.9,N,44.3,K,A*2A +$GPGGA,222629.000,2734.77226,S,15305.98850,E,1,08,1.1,49.5,M,39.2,M,,*7C +$GPGLL,2734.77226,S,15305.98850,E,222629.000,A,A*41 +$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35 +$GPGST,222629.000,11.0,9.5,7.3,89.6,6.7,8.6,14.3*5E +$GPGSV,3,1,11,16,48,116,31,25,39,268,32,23,58,174,25,20,71,337,36*7B +$GPGSV,3,2,11,19,03,029,,04,06,242,30,13,31,223,37,27,19,283,28*74 +$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,27*7F +$GPRMC,222629.000,A,2734.77226,S,15305.98850,E,23.5,49.4,030308,11.2,W,A*38 +$GPVTG,49.4,T,60.6,M,23.5,N,43.5,K,A*2C +$GPGGA,222630.000,2734.76859,S,15305.99361,E,1,04,3.5,49.4,M,39.2,M,,*74 +$GPGLL,2734.76859,S,15305.99361,E,222630.000,A,A*42 +$GPGSA,A,3,16,25,20,27,,,,,,,,,4.9,3.5,3.4*39 +$GPGST,222630.000,13.4,7.9,50.0,19.9,17.0,43.1,69.5*66 +$GPGSV,3,1,11,16,48,116,31,25,39,268,30,23,58,174,22,20,71,337,36*7E +$GPGSV,3,2,11,19,03,029,,04,06,242,32,13,31,223,35,27,19,283,24*78 +$GPGSV,3,3,11,11,06,338,18,01,,,18,03,14,056,29*78 +$GPRMC,222630.000,A,2734.76859,S,15305.99361,E,21.1,50.3,030308,11.2,W,A*32 +$GPVTG,50.3,T,61.5,M,21.1,N,39.1,K,A*2E +$GPGGA,222631.000,2734.76498,S,15305.99809,E,1,08,1.1,48.2,M,39.2,M,,*7C +$GPGLL,2734.76498,S,15305.99809,E,222631.000,A,A*47 +$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35 +$GPGST,222631.000,18.4,10.8,5.8,77.6,5.6,9.7,13.2*63 +$GPGSV,3,1,11,16,48,116,32,25,39,268,31,23,58,174,22,20,71,337,35*7F +$GPGSV,3,2,11,19,03,029,,04,06,242,30,13,31,223,36,27,19,283,25*78 +$GPGSV,3,3,11,11,06,338,18,01,,,18,03,14,056,33*73 +$GPRMC,222631.000,A,2734.76498,S,15305.99809,E,19.4,47.4,030308,11.2,W,A*38 +$GPVTG,47.4,T,58.6,M,19.4,N,35.9,K,A*2C +$GPGGA,222632.000,2734.76359,S,15306.00162,E,1,08,1.1,49.6,M,39.2,M,,*77 +$GPGLL,2734.76359,S,15306.00162,E,222632.000,A,A*49 +$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35 +$GPGST,222632.000,18.1,14.9,6.7,53.4,9.5,11.5,16.1*5A +$GPGSV,3,1,11,16,48,116,30,25,39,268,31,23,58,174,31,20,71,337,31*7B +$GPGSV,3,2,11,19,03,029,,04,06,242,22,13,31,223,37,27,19,283,29*76 +$GPGSV,3,3,11,11,06,338,24,01,,,18,03,14,056,25*7B +$GPRMC,222632.000,A,2734.76359,S,15306.00162,E,12.4,65.5,030308,11.2,W,A*3C +$GPVTG,65.5,T,76.7,M,12.4,N,22.9,K,A*2D +$GPGGA,222633.000,2734.76254,S,15306.00553,E,1,08,1.1,49.0,M,39.2,M,,*7A +$GPGLL,2734.76254,S,15306.00553,E,222633.000,A,A*42 +$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35 +$GPGST,222633.000,13.9,12.3,5.8,55.3,7.8,9.7,13.7*62 +$GPGSV,3,1,10,16,48,116,35,25,39,268,35,23,58,174,30,20,71,337,35*7E +$GPGSV,3,2,10,19,03,029,,04,06,242,26,13,31,223,39,27,19,283,26*72 +$GPGSV,3,3,10,11,06,338,24,03,14,056,30*76 +$GPRMC,222633.000,A,2734.76254,S,15306.00553,E,12.9,72.5,030308,11.2,W,A*3C +$GPVTG,72.5,T,83.7,M,12.9,N,23.9,K,A*2D +$GPGGA,222634.000,2734.76305,S,15306.00850,E,1,08,1.1,48.4,M,39.2,M,,*73 +$GPGLL,2734.76305,S,15306.00850,E,222634.000,A,A*4E +$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35 +$GPGST,222634.000,11.3,10.3,5.3,58.0,6.5,8.4,12.0*62 +$GPGSV,3,1,10,16,48,116,33,25,39,268,38,23,58,174,30,20,71,337,30*70 +$GPGSV,3,2,10,19,03,029,,04,06,242,29,13,31,223,34,27,19,283,30*77 +$GPGSV,3,3,10,11,06,338,23,03,14,056,25*75 +$GPRMC,222634.000,A,2734.76305,S,15306.00850,E,9.4,99.3,030308,11.2,W,A*04 +$GPVTG,99.3,T,110.5,M,9.4,N,17.3,K,A*2D +$GPGGA,222635.000,2734.76418,S,15306.01089,E,1,08,1.1,47.9,M,39.2,M,,*76 +$GPGLL,2734.76418,S,15306.01089,E,222635.000,A,A*49 +$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35 +$GPGST,222635.000,13.4,9.3,7.7,66.3,7.3,8.3,14.0*50 +$GPGSV,3,1,10,16,48,116,36,25,39,268,31,23,58,174,37,20,71,337,36*7D +$GPGSV,3,2,10,19,03,029,,04,06,242,31,13,31,223,34,27,19,283,31*7F +$GPGSV,3,3,10,11,06,338,23,03,14,056,23*73 +$GPRMC,222635.000,A,2734.76418,S,15306.01089,E,8.3,116.7,030308,11.2,W,A*37 +$GPVTG,116.7,T,127.9,M,8.3,N,15.4,K,A*14 +$GPGGA,222636.000,2734.76577,S,15306.01258,E,1,07,1.7,47.9,M,39.2,M,,*7A +$GPGLL,2734.76577,S,15306.01258,E,222636.000,A,A*4C +$GPGSA,A,3,16,25,23,20,04,13,27,,,,,,2.8,1.7,2.3*3F +$GPGST,222636.000,10.6,11.9,8.1,45.4,9.3,9.3,18.8*65 +$GPGSV,3,1,10,16,48,116,41,25,39,268,35,23,58,174,40,20,71,337,33*7C +$GPGSV,3,2,10,19,03,029,,04,06,242,32,13,31,223,28,27,19,283,34*74 +$GPGSV,3,3,10,11,06,338,25,03,14,056,23*75 +$GPRMC,222636.000,A,2734.76577,S,15306.01258,E,7.6,135.7,030308,11.2,W,A*39 +$GPVTG,135.7,T,146.9,M,7.6,N,14.1,K,A*1C +$GPGGA,222637.000,2734.76759,S,15306.01422,E,1,07,1.7,47.8,M,39.2,M,,*7F +$GPGLL,2734.76759,S,15306.01422,E,222637.000,A,A*48 +$GPGSA,A,3,16,25,23,20,04,13,27,,,,,,2.8,1.7,2.3*3F +$GPGST,222637.000,8.9,7.2,10.9,44.4,8.4,8.5,17.1*59 +$GPGSV,3,1,10,16,48,116,44,25,39,268,36,23,58,174,33,20,71,337,33*7E +$GPGSV,3,2,10,19,03,029,,04,06,242,24,13,31,223,29,27,19,283,36*70 +$GPGSV,3,3,10,11,06,338,25,03,14,056,23*75 +$GPRMC,222637.000,A,2734.76759,S,15306.01422,E,8.0,140.6,030308,11.2,W,A*37 +$GPVTG,140.6,T,151.8,M,8.0,N,14.8,K,A*18 +$GPGGA,222638.000,2734.76957,S,15306.01592,E,1,06,2.0,47.6,M,39.2,M,,*71 +$GPGLL,2734.76957,S,15306.01592,E,222638.000,A,A*4D +$GPGSA,A,3,16,25,23,20,04,13,,,,,,,3.2,2.0,2.6*30 +$GPGST,222638.000,10.4,8.9,16.3,14.1,8.7,14.6,19.9*51 +$GPGSV,3,1,10,16,48,116,38,25,39,268,30,23,58,174,29,20,71,337,29*73 +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,29*7B +$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71 +$GPRMC,222638.000,A,2734.76957,S,15306.01592,E,8.8,142.8,030308,11.2,W,A*36 +$GPVTG,142.8,T,154.0,M,8.8,N,16.2,K,A*19 +$GPGGA,222639.000,2734.77109,S,15306.01748,E,1,07,1.7,47.8,M,39.2,M,,*7C +$GPGLL,2734.77109,S,15306.01748,E,222639.000,A,A*4B +$GPGSA,A,3,16,25,23,20,04,13,27,,,,,,2.8,1.7,2.3*3F +$GPGST,222639.000,9.5,9.6,14.7,43.8,11.3,11.5,19.8*51 +$GPGSV,3,1,10,16,48,116,37,25,39,268,32,23,58,174,37,20,71,337,29*71 +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,27*75 +$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71 +$GPRMC,222639.000,A,2734.77109,S,15306.01748,E,7.1,137.2,030308,11.2,W,A*3E +$GPVTG,137.2,T,148.4,M,7.1,N,13.1,K,A*18 +$GPGGA,222640.000,2734.77216,S,15306.02018,E,1,04,2.6,47.8,M,39.2,M,,*7F +$GPGLL,2734.77216,S,15306.02018,E,222640.000,A,A*49 +$GPGSA,A,3,16,25,23,13,,,,,,,,,6.2,2.6,5.6*32 +$GPGST,222640.000,20.0,11.7,22.3,7.0,10.9,20.3,46.8*65 +$GPGSV,3,1,10,16,48,116,32,25,39,268,29,23,58,174,24,20,71,337,25*70 +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,25*77 +$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71 +$GPRMC,222640.000,A,2734.77216,S,15306.02018,E,9.4,114.2,030308,11.2,W,A*36 +$GPVTG,114.2,T,125.4,M,9.4,N,17.4,K,A*18 +$GPGGA,222641.000,2734.77543,S,15306.02149,E,1,04,2.6,47.7,M,39.2,M,,*73 +$GPGLL,2734.77543,S,15306.02149,E,222641.000,A,A*4A +$GPGSA,A,3,16,25,23,13,,,,,,,,,6.2,2.6,5.6*32 +$GPGST,222641.000,18.3,40.3,13.2,79.5,13.7,36.3,59.1*5E +$GPGSV,3,1,10,16,48,116,34,25,39,268,23,23,58,174,26,20,71,337,27*7C +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71 +$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71 +$GPRMC,222641.000,A,2734.77543,S,15306.02149,E,12.5,160.9,030308,11.2,W,A*06 +$GPVTG,160.9,T,172.1,M,12.5,N,23.1,K,A*2E +$GPGGA,222642.000,2734.77709,S,15306.02300,E,1,04,2.6,47.7,M,39.2,M,,*73 +$GPGLL,2734.77709,S,15306.02300,E,222642.000,A,A*4A +$GPGSA,A,3,16,20,04,13,,,,,,,,,4.3,2.6,3.4*35 +$GPGST,222642.000,15.8,14.5,71.8,20.7,26.3,61.6,97.2*58 +$GPGSV,3,1,10,16,48,116,41,25,40,268,23,23,58,174,27,20,71,337,34*73 +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71 +$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71 +$GPRMC,222642.000,A,2734.77709,S,15306.02300,E,7.5,140.7,030308,11.2,W,A*3E +$GPVTG,140.7,T,151.9,M,7.5,N,13.9,K,A*14 +$GPGGA,222643.000,2734.77831,S,15306.02427,E,1,04,2.6,47.5,M,39.2,M,,*76 +$GPGLL,2734.77831,S,15306.02427,E,222643.000,A,A*4D +$GPGSA,A,3,16,20,04,13,,,,,,,,,4.3,2.6,3.4*35 +$GPGST,222643.000,12.9,15.5,112.8,21.4,39.9,96.1,154.3*5C +$GPGSV,3,1,10,16,48,116,41,25,40,268,23,23,58,174,26,20,71,337,35*73 +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71 +$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71 +$GPRMC,222643.000,A,2734.77831,S,15306.02427,E,5.6,136.2,030308,11.2,W,A*3C +$GPVTG,136.2,T,147.4,M,5.6,N,10.4,K,A*15 +$GPGGA,222644.000,2734.77900,S,15306.02522,E,1,04,2.5,47.4,M,39.2,M,,*74 +$GPGLL,2734.77900,S,15306.02522,E,222644.000,A,A*4D +$GPGSA,A,3,16,23,20,13,,,,,,,,,5.8,2.5,5.2*39 +$GPGST,222644.000,11.9,32.3,39.9,23.1,35.5,30.7,165.7*69 +$GPGSV,3,1,10,16,48,116,38,25,40,268,23,23,58,174,25,20,71,337,37*7C +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71 +$GPGSV,3,3,10,11,06,338,21,03,14,056,26*74 +$GPRMC,222644.000,A,2734.77900,S,15306.02522,E,3.7,127.8,030308,11.2,W,A*31 +$GPVTG,127.8,T,139.0,M,3.7,N,6.9,K,A*2F +$GPGGA,222645.000,2734.77991,S,15306.02594,E,1,04,3.4,47.4,M,39.2,M,,*70 +$GPGLL,2734.77991,S,15306.02594,E,222645.000,A,A*49 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.4,5.0*30 +$GPGST,222645.000,15.3,40.1,15.0,66.6,34.1,19.2,69.1*50 +$GPGSV,3,1,10,16,48,116,33,25,40,268,23,23,58,174,23,20,71,337,35*73 +$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71 +$GPGSV,3,3,10,11,06,338,21,03,14,056,30*73 +$GPRMC,222645.000,A,2734.77991,S,15306.02594,E,3.9,145.4,030308,11.2,W,A*33 +$GPVTG,145.4,T,156.6,M,3.9,N,7.2,K,A*2C +$GPGGA,222646.000,2734.78074,S,15306.02652,E,1,04,3.4,47.4,M,39.2,M,,*77 +$GPGLL,2734.78074,S,15306.02652,E,222646.000,A,A*4E +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.4,5.0*30 +$GPGST,222646.000,14.8,53.5,15.6,78.9,48.1,16.9,76.9*50 +$GPGSV,3,1,11,16,48,116,32,25,40,268,23,23,58,174,26,20,71,337,32*71 +$GPGSV,3,2,11,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*70 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,34*4D +$GPRMC,222646.000,A,2734.78074,S,15306.02652,E,3.5,149.5,030308,11.2,W,A*35 +$GPVTG,149.5,T,160.7,M,3.5,N,6.6,K,A*2C +$GPGGA,222647.000,2734.78140,S,15306.02704,E,1,04,3.4,47.3,M,39.2,M,,*75 +$GPGLL,2734.78140,S,15306.02704,E,222647.000,A,A*4B +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.4,5.0*30 +$GPGST,222647.000,11.7,42.4,13.1,77.7,38.0,14.3,60.9*53 +$GPGSV,3,1,11,16,48,116,37,25,40,268,23,23,58,174,31,20,71,337,36*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*70 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,34*4D +$GPRMC,222647.000,A,2734.78140,S,15306.02704,E,2.8,145.4,030308,11.2,W,A*31 +$GPVTG,145.4,T,156.6,M,2.8,N,5.1,K,A*2D +$GPGGA,222648.000,2734.78183,S,15306.02753,E,1,04,3.5,47.2,M,39.2,M,,*77 +$GPGLL,2734.78183,S,15306.02753,E,222648.000,A,A*49 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222648.000,11.3,35.2,16.9,76.3,31.5,16.9,53.8*53 +$GPGSV,3,1,11,16,48,116,35,25,40,267,23,23,58,174,37,20,71,337,35*7E +$GPGSV,3,2,11,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*70 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,35*4C +$GPRMC,222648.000,A,2734.78183,S,15306.02753,E,2.1,135.8,030308,11.2,W,A*31 +$GPVTG,135.8,T,147.1,M,2.1,N,3.9,K,A*26 +$GPGGA,222649.000,2734.78197,S,15306.02773,E,1,04,3.5,46.8,M,39.2,M,,*7A +$GPGLL,2734.78197,S,15306.02773,E,222649.000,A,A*4F +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222649.000,13.9,60.8,14.8,84.0,55.3,14.7,79.7*52 +$GPGSV,3,1,11,16,48,116,31,25,40,267,23,23,58,174,36,20,71,337,31*7F +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,19,283,23*78 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,29*41 +$GPRMC,222649.000,A,2734.78197,S,15306.02773,E,0.6,148.6,030308,11.2,W,A*36 +$GPVTG,148.6,T,159.8,M,0.6,N,1.2,K,A*28 +$GPGGA,222650.000,2734.78195,S,15306.02785,E,1,04,3.5,46.4,M,39.2,M,,*75 +$GPGLL,2734.78195,S,15306.02785,E,222650.000,A,A*4C +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222650.000,11.4,48.0,12.9,83.3,43.6,12.8,63.8*5B +$GPGSV,3,1,11,16,48,116,30,25,40,267,23,23,58,174,33,20,71,337,30*7A +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,19,283,23*78 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,26*4E +$GPRMC,222650.000,A,2734.78195,S,15306.02785,E,0.2,6.4,030308,11.2,W,A*38 +$GPVTG,6.4,T,17.6,M,0.2,N,0.3,K,A*10 +$GPGGA,222651.000,2734.78191,S,15306.02798,E,1,04,3.5,45.9,M,39.2,M,,*72 +$GPGLL,2734.78191,S,15306.02798,E,222651.000,A,A*45 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222651.000,9.8,40.0,12.0,82.4,36.3,11.9,53.8*6E +$GPGSV,3,1,11,16,48,116,28,25,40,267,,23,58,174,35,20,71,337,26*73 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,19,283,*79 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,28*40 +$GPRMC,222651.000,A,2734.78191,S,15306.02798,E,0.1,352.6,030308,11.2,W,A*32 +$GPVTG,352.6,T,3.8,M,0.1,N,0.3,K,A*28 +$GPGGA,222652.000,2734.78198,S,15306.02797,E,1,04,3.5,45.9,M,39.2,M,,*77 +$GPGLL,2734.78198,S,15306.02797,E,222652.000,A,A*40 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222652.000,21.7,41.2,15.0,83.8,37.5,14.2,91.6*58 +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,23,20,71,337,26*78 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,19,283,*79 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,24*4C +$GPRMC,222652.000,A,2734.78198,S,15306.02797,E,0.2,263.5,030308,11.2,W,A*34 +$GPVTG,263.5,T,274.7,M,0.2,N,0.3,K,A*26 +$GPGGA,222653.000,2734.78226,S,15306.02793,E,1,04,3.5,45.9,M,39.2,M,,*74 +$GPGLL,2734.78226,S,15306.02793,E,222653.000,A,A*43 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222653.000,18.8,36.4,20.7,81.4,33.0,19.3,78.6*5F +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,25,20,71,337,25*7D +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,24*4C +$GPRMC,222653.000,A,2734.78226,S,15306.02793,E,0.8,188.1,030308,11.2,W,A*3F +$GPVTG,188.1,T,199.3,M,0.8,N,1.5,K,A*2D +$GPGGA,222654.000,2734.78231,S,15306.02789,E,1,04,3.5,45.9,M,39.2,M,,*7E +$GPGLL,2734.78231,S,15306.02789,E,222654.000,A,A*49 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222654.000,14.4,23.3,16.5,69.8,20.7,16.0,57.9*5D +$GPGSV,3,1,11,16,48,116,34,25,40,267,,23,58,174,34,20,71,337,31*79 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,31*48 +$GPRMC,222654.000,A,2734.78231,S,15306.02789,E,0.1,145.6,030308,11.2,W,A*3A +$GPVTG,145.6,T,156.8,M,0.1,N,0.2,K,A*2C +$GPGGA,222655.000,2734.78251,S,15306.02806,E,1,04,3.5,45.8,M,39.2,M,,*70 +$GPGLL,2734.78251,S,15306.02806,E,222655.000,A,A*46 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222655.000,12.0,28.1,14.0,78.7,25.3,13.6,52.5*54 +$GPGSV,3,1,11,16,48,116,40,25,40,267,,23,58,174,38,20,71,337,35*72 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,36*4F +$GPRMC,222655.000,A,2734.78251,S,15306.02806,E,0.7,135.5,030308,11.2,W,A*37 +$GPVTG,135.5,T,146.8,M,0.7,N,1.2,K,A*2E +$GPGGA,222656.000,2734.78273,S,15306.02823,E,1,04,3.5,45.7,M,39.2,M,,*7B +$GPGLL,2734.78273,S,15306.02823,E,222656.000,A,A*42 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222656.000,9.9,24.8,12.2,76.6,22.2,12.0,44.0*69 +$GPGSV,3,1,11,16,48,116,38,25,40,267,,23,58,174,36,20,71,337,30*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,35*4C +$GPRMC,222656.000,A,2734.78273,S,15306.02823,E,0.5,135.5,030308,11.2,W,A*31 +$GPVTG,135.5,T,146.7,M,0.5,N,1.0,K,A*21 +$GPGGA,222657.000,2734.78312,S,15306.02858,E,1,04,3.5,45.5,M,39.2,M,,*72 +$GPGLL,2734.78312,S,15306.02858,E,222657.000,A,A*49 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222657.000,8.4,22.4,10.9,74.9,19.9,11.0,38.1*60 +$GPGSV,3,1,11,16,48,116,37,25,40,267,,23,58,174,36,20,71,337,30*79 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,34*4D +$GPRMC,222657.000,A,2734.78312,S,15306.02858,E,1.3,137.6,030308,11.2,W,A*3C +$GPVTG,137.6,T,148.8,M,1.3,N,2.4,K,A*21 +$GPGGA,222658.000,2734.78370,S,15306.02910,E,1,04,3.5,45.4,M,39.2,M,,*75 +$GPGLL,2734.78370,S,15306.02910,E,222658.000,A,A*4F +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222658.000,11.5,25.4,19.7,45.8,20.9,20.7,46.1*53 +$GPGSV,3,1,11,16,48,116,34,25,40,267,18,23,58,174,36,20,71,337,32*71 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,32*48 +$GPRMC,222658.000,A,2734.78370,S,15306.02910,E,2.7,141.8,030308,11.2,W,A*32 +$GPVTG,141.8,T,153.0,M,2.7,N,5.0,K,A*28 +$GPGGA,222659.000,2734.78463,S,15306.02956,E,1,04,3.5,45.4,M,39.2,M,,*73 +$GPGLL,2734.78463,S,15306.02956,E,222659.000,A,A*49 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222659.000,10.9,34.8,17.8,79.2,31.4,17.1,52.2*5E +$GPGSV,3,1,11,16,48,116,32,25,40,267,18,23,58,174,37,20,71,337,32*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,26*4D +$GPRMC,222659.000,A,2734.78463,S,15306.02956,E,3.6,157.2,030308,11.2,W,A*39 +$GPVTG,157.2,T,168.4,M,3.6,N,6.7,K,A*2D +$GPGGA,222700.000,2734.78553,S,15306.02974,E,1,04,3.5,45.3,M,39.2,M,,*7B +$GPGLL,2734.78553,S,15306.02974,E,222700.000,A,A*46 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222700.000,13.4,30.5,15.4,80.9,27.6,14.6,58.2*5C +$GPGSV,3,1,11,16,48,116,38,25,40,267,18,23,58,174,42,20,71,337,34*78 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,30*4A +$GPRMC,222700.000,A,2734.78553,S,15306.02974,E,3.1,171.1,030308,11.2,W,A*36 +$GPVTG,171.1,T,182.3,M,3.1,N,5.7,K,A*2D +$GPGGA,222701.000,2734.78678,S,15306.02887,E,1,05,1.6,45.4,M,39.2,M,,*7A +$GPGLL,2734.78678,S,15306.02887,E,222701.000,A,A*40 +$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F +$GPGST,222701.000,18.6,22.3,33.4,25.2,29.0,22.6,46.2*53 +$GPGSV,3,1,11,16,48,116,30,25,40,267,18,23,58,174,33,20,71,337,27*74 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,20,27,20,283,*71 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,27*4C +$GPRMC,222701.000,A,2734.78678,S,15306.02887,E,5.1,212.6,030308,11.2,W,A*37 +$GPVTG,212.6,T,223.8,M,5.1,N,9.5,K,A*27 +$GPGGA,222702.000,2734.78726,S,15306.02769,E,1,04,3.5,45.3,M,39.2,M,,*7B +$GPGLL,2734.78726,S,15306.02769,E,222702.000,A,A*46 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31 +$GPGST,222702.000,14.7,49.5,20.8,84.3,45.1,19.5,72.8*5F +$GPGSV,3,1,11,16,48,116,36,25,40,267,18,23,58,174,40,20,71,337,31*71 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,20,27,20,283,*71 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,28*43 +$GPRMC,222702.000,A,2734.78726,S,15306.02769,E,4.2,246.4,030308,11.2,W,A*30 +$GPVTG,246.4,T,257.6,M,4.2,N,7.7,K,A*27 +$GPGGA,222703.000,2734.78745,S,15306.02617,E,1,05,1.6,45.3,M,39.2,M,,*77 +$GPGLL,2734.78745,S,15306.02617,E,222703.000,A,A*4A +$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F +$GPGST,222703.000,12.3,16.0,23.0,21.5,20.3,15.6,33.1*53 +$GPGSV,3,1,11,16,48,116,31,25,40,267,18,23,58,174,29,20,70,337,23*7B +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,27*4C +$GPRMC,222703.000,A,2734.78745,S,15306.02617,E,4.9,265.5,030308,11.2,W,A*37 +$GPVTG,265.5,T,276.7,M,4.9,N,9.1,K,A*26 +$GPGGA,222704.000,2734.78730,S,15306.02555,E,1,04,3.5,45.3,M,39.2,M,,*77 +$GPGLL,2734.78730,S,15306.02555,E,222704.000,A,A*4A +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.1*30 +$GPGST,222704.000,9.5,34.0,22.1,80.5,30.8,20.6,55.7*69 +$GPGSV,3,1,11,16,48,116,31,25,40,267,18,23,58,174,29,20,70,337,23*7B +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,31*4B +$GPRMC,222704.000,A,2734.78730,S,15306.02555,E,2.1,286.5,030308,11.2,W,A*34 +$GPVTG,286.5,T,297.7,M,2.1,N,3.9,K,A*28 +$GPGGA,222705.000,2734.78698,S,15306.02452,E,1,04,3.5,45.3,M,39.2,M,,*73 +$GPGLL,2734.78698,S,15306.02452,E,222705.000,A,A*4E +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.1*30 +$GPGST,222705.000,93.8,65.1,31.9,84.0,59.3,29.7,94.1*5F +$GPGSV,3,1,11,16,48,116,29,25,40,267,18,23,58,174,29,20,70,337,23*72 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,30*4A +$GPRMC,222705.000,A,2734.78698,S,15306.02452,E,3.6,290.3,030308,11.2,W,A*37 +$GPVTG,290.3,T,301.5,M,3.6,N,6.8,K,A*27 +$GPGGA,222706.000,2734.78686,S,15306.02339,E,1,04,3.5,45.3,M,39.2,M,,*75 +$GPGLL,2734.78686,S,15306.02339,E,222706.000,A,A*48 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.1*30 +$GPGST,222706.000,114.3,62.0,48.3,70.3,55.4,45.7,116.3*5B +$GPGSV,3,1,11,16,48,116,24,25,40,267,18,23,58,174,29,20,70,337,23*7F +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222706.000,A,2734.78686,S,15306.02339,E,3.4,277.7,030308,11.2,W,A*3E +$GPVTG,277.7,T,288.9,M,3.4,N,6.3,K,A*2F +$GPGGA,222707.000,2734.78679,S,15306.02251,E,1,04,3.5,45.3,M,39.2,M,,*7B +$GPGLL,2734.78679,S,15306.02251,E,222707.000,A,A*46 +$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.1*30 +$GPGST,222707.000,128.0,90.0,67.0,53.0,75.4,69.6,158.6*55 +$GPGSV,3,1,11,16,48,116,24,25,40,267,18,23,58,174,29,20,70,337,23*7F +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222707.000,A,2734.78679,S,15306.02251,E,,,030308,,,A*79 +$GPVTG,,T,,M,,N,,K,N*2C +$GPGGA,222708.000,2734.78673,S,15306.02181,E,1,05,1.6,45.3,M,39.2,M,,*70 +$GPGLL,2734.78673,S,15306.02181,E,222708.000,A,A*4D +$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F +$GPGST,222708.000,66.8,93.0,70.5,62.6,69.3,81.1,141.7*6F +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,29,20,70,337,23*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222708.000,A,2734.78673,S,15306.02181,E,,,030308,,,A*72 +$GPVTG,,T,,M,,N,,K,N*2C +$GPGGA,222709.000,2734.78668,S,15306.02124,E,1,05,1.6,45.3,M,39.2,M,,*74 +$GPGLL,2734.78668,S,15306.02124,E,222709.000,A,A*49 +$GPGSA,A,2,16,23,20,13,03,,,,,,,,1.8,1.6,0.9*31 +$GPGST,222709.000,89.5,61.2,117.7,37.9,91.7,79.5,4.3*54 +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,29,20,70,337,23*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222709.000,A,2734.78668,S,15306.02124,E,,,030308,,,A*76 +$GPVTG,,T,,M,,N,,K,N*2C +$GPGGA,222710.000,2734.78664,S,15306.02080,E,1,05,1.6,45.3,M,39.2,M,,*7F +$GPGLL,2734.78664,S,15306.02080,E,222710.000,A,A*42 +$GPGSA,A,2,16,23,20,13,03,,,,,,,,1.8,1.6,0.9*31 +$GPGST,222710.000,117.0,82.3,157.6,39.0,121.7,107.9,3.9*62 +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,29,20,70,337,23*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222710.000,A,2734.78664,S,15306.02080,E,,,030308,,,A*7D +$GPVTG,,T,,M,,N,,K,N*2C +$GPGGA,222711.000,2734.78660,S,15306.02044,E,1,05,1.6,45.3,M,39.2,M,,*72 +$GPGLL,2734.78660,S,15306.02044,E,222711.000,A,A*4F +$GPGSA,A,2,16,23,20,13,03,,,,,,,,1.8,1.6,0.9*31 +$GPGST,222711.000,128.0,107.6,205.2,40.2,156.7,142.6,3.5*58 +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,29,20,70,337,23*76 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222711.000,A,2734.78660,S,15306.02044,E,,,030308,,,A*70 +$GPVTG,,T,,M,,N,,K,N*2C +$GPGGA,222712.000,2734.78658,S,15306.02015,E,1,05,1.6,45.3,M,39.2,M,,*7E +$GPGLL,2734.78658,S,15306.02015,E,222712.000,A,A*43 +$GPGSA,A,2,16,23,20,13,03,,,,,,,,1.8,1.6,0.9*31 +$GPGST,222712.000,128.0,137.2,261.1,41.4,197.4,183.9,3.2*51 +$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,173,29,20,70,337,23*71 +$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72 +$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F +$GPRMC,222712.000,A,2734.78658,S,15306.02015,E,,,030308,,,A*7C \ No newline at end of file diff --git a/examples/positioning/satelliteinfo/qmldir b/examples/positioning/satelliteinfo/qmldir new file mode 100644 index 0000000..8f4e029 --- /dev/null +++ b/examples/positioning/satelliteinfo/qmldir @@ -0,0 +1,17 @@ +module SatelliteInformation +prefer :/qt/qml/SatelliteInformation/ +ApplicationScreen 1.0 ApplicationScreen.qml +Button 1.0 Button.qml +Header 1.0 Header.qml +HelpPopup 1.0 HelpPopup.qml +LegendBox 1.0 LegendBox.qml +Main 1.0 Main.qml +RssiView 1.0 RssiView.qml +PageButton 1.0 PageButton.qml +PermissionsScreen 1.0 PermissionsScreen.qml +PositionBox 1.0 PositionBox.qml +SatelliteView 1.0 SatelliteView.qml +SettingsView 1.0 SettingsView.qml +SkyView 1.0 SkyView.qml +singleton Theme 1.0 Theme.qml +ViewSwitch 1.0 ViewSwitch.qml diff --git a/examples/positioning/satelliteinfo/roles.h b/examples/positioning/satelliteinfo/roles.h new file mode 100644 index 0000000..639ed7c --- /dev/null +++ b/examples/positioning/satelliteinfo/roles.h @@ -0,0 +1,26 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef ROLES_H +#define ROLES_H + +#include +#include + +namespace Roles { + Q_NAMESPACE + enum SatelliteModelRoles { + IdRole = Qt::UserRole + 1, + RssiRole, + AzimuthRole, + ElevationRole, + SystemRole, + SystemIdRole, + InUseRole, + VisibleNameRole + }; + Q_ENUM_NS(SatelliteModelRoles) + QML_NAMED_ELEMENT(Roles) +} + +#endif // ROLES_H diff --git a/examples/positioning/satelliteinfo/satelliteinfo.pro b/examples/positioning/satelliteinfo/satelliteinfo.pro new file mode 100644 index 0000000..609ac68 --- /dev/null +++ b/examples/positioning/satelliteinfo/satelliteinfo.pro @@ -0,0 +1,90 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +TEMPLATE = app +TARGET = satelliteinfo + +QT += quick positioning positioningquick + +CONFIG += qmltypes +QML_IMPORT_NAME = SatelliteInformation +QML_IMPORT_MAJOR_VERSION = 1 + +SOURCES += main.cpp \ + satellitemodel.cpp \ + sortfiltermodel.cpp + +HEADERS += \ + roles.h \ + satellitemodel.h \ + sortfiltermodel.h + +qml_resources.files = \ + qmldir \ + ApplicationScreen.qml \ + Button.qml \ + Header.qml \ + HelpPopup.qml \ + LegendBox.qml \ + Main.qml \ + RssiView.qml \ + PageButton.qml \ + PermissionsScreen.qml \ + PositionBox.qml \ + SatelliteView.qml \ + SettingsView.qml \ + SkyView.qml \ + Theme.qml \ + ViewSwitch.qml + +qml_resources.prefix = /qt/qml/SatelliteInformation + +RESOURCES += qml_resources + +icon_resources.files = \ + icons/checkbox.svg \ + icons/checkbox_blank.svg \ + icons/darkmode.svg \ + icons/filter.svg \ + icons/help.svg \ + icons/lightmode.svg \ + icons/place.svg \ + icons/qtlogo_green.png \ + icons/qtlogo_white.png \ + icons/rssiview.svg \ + icons/satellite_small.png \ + icons/satellite1.png \ + icons/satellite2.png \ + icons/search.svg \ + icons/settings.svg \ + icons/skyview.svg \ + icons/sort.svg \ + icons/tableview.svg + +icon_resources.prefix = /qt/qml/SatelliteInformation + +RESOURCES += icon_resources + +data_resources.files = \ + nmealog.txt \ + fonts/TitilliumWeb-Regular.ttf \ + fonts/TitilliumWeb-SemiBold.ttf + +data_resources.prefix = / + +RESOURCES += data_resources + +ios: QMAKE_INFO_PLIST = ../shared/Info.qmake.ios.plist +macos: QMAKE_INFO_PLIST = ../shared/Info.qmake.macos.plist + +android { + # explicitly link with serialport in order to + # deploy it as a dependecy for nmea plugin + QT += serialport +} + +target.path = $$[QT_INSTALL_EXAMPLES]/positioning/satelliteinfo +INSTALLS += target + +# Sign the app for location permissions to work properly +macos:!macx-xcode: QMAKE_POST_LINK += codesign -s - satelliteinfo.app diff --git a/examples/positioning/satelliteinfo/satellitemodel.cpp b/examples/positioning/satelliteinfo/satellitemodel.cpp new file mode 100644 index 0000000..e37b48b --- /dev/null +++ b/examples/positioning/satelliteinfo/satellitemodel.cpp @@ -0,0 +1,152 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "roles.h" +#include "satellitemodel.h" + +using namespace Qt::StringLiterals; + +static QString systemString(QGeoSatelliteInfo::SatelliteSystem system) +{ + switch (system) { + case QGeoSatelliteInfo::Undefined: + return u"Undefined"_s; + case QGeoSatelliteInfo::GPS: + return u"GPS"_s; + case QGeoSatelliteInfo::GLONASS: + return u"GLONASS"_s; + case QGeoSatelliteInfo::GALILEO: + return u"GALILEO"_s; + case QGeoSatelliteInfo::BEIDOU: + return u"BEIDOU"_s; + case QGeoSatelliteInfo::QZSS: + return u"QZSS"_s; + case QGeoSatelliteInfo::Multiple: + return u"Multiple"_s; + case QGeoSatelliteInfo::CustomType: + return u"CustomType"_s; + } + return u"Undefined"_s; +} + +SatelliteModel::SatelliteModel(QObject *parent) + : QAbstractListModel{parent} +{ +} + +int SatelliteModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return static_cast(m_satellites.size()); +} + +QVariant SatelliteModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() >= rowCount()) + return QVariant(); + + const QGeoSatelliteInfo &info = m_satellites.at(index.row()); + switch (role) { + case Roles::IdRole: + return info.satelliteIdentifier(); + case Roles::RssiRole: + return info.signalStrength(); + case Roles::AzimuthRole: + return info.attribute(QGeoSatelliteInfo::Azimuth); + case Roles::ElevationRole: + return info.attribute(QGeoSatelliteInfo::Elevation); + case Roles::SystemRole: + return systemString(info.satelliteSystem()); + case Roles::SystemIdRole: + return info.satelliteSystem(); + case Roles::InUseRole: + return m_inUseIds.contains(getUid(info)); + case Roles::VisibleNameRole: + return u"%1-%2"_s.arg(systemString(info.satelliteSystem()), + QString::number(info.satelliteIdentifier())); + } + + return QVariant(); +} + +//! [0] +QHash SatelliteModel::roleNames() const +{ + return { + {Roles::IdRole, "id"}, + {Roles::RssiRole, "rssi"}, + {Roles::AzimuthRole, "azimuth"}, + {Roles::ElevationRole, "elevation"}, + {Roles::SystemRole, "system"}, + {Roles::SystemIdRole, "systemId"}, + {Roles::InUseRole, "inUse"}, + {Roles::VisibleNameRole, "name"} + }; +} +//! [0] + +void SatelliteModel::updateSatellitesInView(const QList &inView) +{ + const bool emitSizeChanged = inView.size() != m_satellites.size(); + + QSet idsInUpdate; + for (const QGeoSatelliteInfo &info : inView) + idsInUpdate.insert(getUid(info)); + + // 1. Get the ids of all satellites to be removed. + const auto toBeRemoved = m_allIds - idsInUpdate; + // 2. Remove them and call {begin,end}RemoveRows() for each of them + qsizetype idx = 0; + while (idx < m_satellites.size()) { + const auto &sat = m_satellites.at(idx); + if (toBeRemoved.contains(getUid(sat))) { + beginRemoveRows(QModelIndex(), idx, idx); + m_satellites.removeAt(idx); + endRemoveRows(); + } else { + ++idx; + } + } + // 3. Get ids of all new elements. + const auto toBeAdded = idsInUpdate - m_allIds; + // 4. Sort the input items, so that we always have the same order of + // elements during comparison + auto inViewCopy = inView; + std::sort(inViewCopy.begin(), inViewCopy.end(), + [](const auto &lhs, const auto &rhs) { + if (lhs.satelliteIdentifier() == rhs.satelliteIdentifier()) + return lhs.satelliteSystem() < rhs.satelliteSystem(); + return lhs.satelliteIdentifier() < rhs.satelliteIdentifier(); + }); + // 5. Iterate through the list: + // * if the id of the satellite is new, use {begin,end}InsertRows() + // * otherwise use dataChanged() + for (idx = 0; idx < inViewCopy.size(); ++idx) { + const auto &sat = inViewCopy.at(idx); + if (toBeAdded.contains(getUid(sat))) { + beginInsertRows(QModelIndex(), idx, idx); + m_satellites.insert(idx, inViewCopy.at(idx)); + endInsertRows(); + } else { + m_satellites[idx] = inViewCopy.at(idx); + emit dataChanged(index(idx), index(idx), + {Roles::RssiRole, Roles::AzimuthRole, Roles::ElevationRole}); + } + } + m_allIds = idsInUpdate; + if (emitSizeChanged) + emit sizeChanged(); +} + +void SatelliteModel::updateSatellitesInUse(const QList &inUse) +{ + m_inUseIds.clear(); + for (const QGeoSatelliteInfo &info : inUse) + m_inUseIds.insert(getUid(info)); + emit dataChanged(index(0), index(m_satellites.size() - 1), {Roles::InUseRole}); +} + +SatelliteModel::UniqueId SatelliteModel::getUid(const QGeoSatelliteInfo &info) +{ + return std::make_pair(static_cast(info.satelliteSystem()), info.satelliteIdentifier()); +} diff --git a/examples/positioning/satelliteinfo/satellitemodel.h b/examples/positioning/satelliteinfo/satellitemodel.h new file mode 100644 index 0000000..d9af910 --- /dev/null +++ b/examples/positioning/satelliteinfo/satellitemodel.h @@ -0,0 +1,47 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef SATELLITEMODEL_H +#define SATELLITEMODEL_H + +#include +#include +#include + +#include + +//! [0] +class SatelliteModel : public QAbstractListModel +{ + Q_OBJECT + Q_PROPERTY(int size READ rowCount NOTIFY sizeChanged) + QML_ELEMENT +public: + explicit SatelliteModel(QObject *parent = nullptr); + + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + QHash roleNames() const override; + +public slots: + void updateSatellitesInView(const QList &inView); + void updateSatellitesInUse(const QList &inUse); + +signals: + void sizeChanged(); +//! [0] + +private: + QList m_satellites; + + using SatelliteId = int; + using SystemId = int; + using UniqueId = std::pair; + static UniqueId getUid(const QGeoSatelliteInfo &info); + QSet m_inUseIds; + QSet m_allIds; +//! [1] +}; +//! [1] + +#endif // SATELLITEMODEL_H diff --git a/examples/positioning/satelliteinfo/sortfiltermodel.cpp b/examples/positioning/satelliteinfo/sortfiltermodel.cpp new file mode 100644 index 0000000..41b6e83 --- /dev/null +++ b/examples/positioning/satelliteinfo/sortfiltermodel.cpp @@ -0,0 +1,92 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "roles.h" +#include "sortfiltermodel.h" + +using namespace Qt::StringLiterals; + +SortFilterModel::SortFilterModel(QObject *parent) + : QSortFilterProxyModel{parent} +{ +} + +void SortFilterModel::updateFilterString(const QString &str) +{ + m_filterString = str; + invalidateFilter(); +} + +void SortFilterModel::updateShowInView(bool show) +{ + m_showInView = show; + invalidateFilter(); +} + +void SortFilterModel::updateShowInUse(bool show) +{ + m_showInUse = show; + invalidateFilter(); +} + +void SortFilterModel::updateSelectedSystems(int id, bool show) +{ + if (show) + m_selectedSystems.insert(id); + else + m_selectedSystems.remove(id); + invalidateFilter(); +} + +void SortFilterModel::updateSortRoles(int role, bool use) +{ + if (use) + m_sortRoles.insert(role); + else + m_sortRoles.remove(role); + invalidate(); +} + +bool SortFilterModel::filterAcceptsRow(int row, const QModelIndex &parent) const +{ + Q_UNUSED(parent); + const auto idx = sourceModel()->index(row, 0); + bool result = true; + if (!m_filterString.isEmpty()) { + const QString name = idx.data(Roles::VisibleNameRole).toString(); + result = name.contains(m_filterString, Qt::CaseInsensitive); + } + if (result) { + const int systemId = idx.data(Roles::SystemIdRole).toInt(); + result = m_selectedSystems.contains(systemId); + } + if (result) { + const bool used = idx.data(Roles::InUseRole).toBool(); + if (used) + result = m_showInUse; + else + result = m_showInView; + } + return result; +} + +bool SortFilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) const +{ + // Sort 'By Identifier' can actually be called a sort by satellite system + // name + sort by id. + if (m_sortRoles.contains(Roles::InUseRole)) { + const auto leftVal = left.data(Roles::InUseRole).toBool(); + const auto rightVal = right.data(Roles::InUseRole).toBool(); + if (leftVal != rightVal) + return leftVal < rightVal; + } + if (m_sortRoles.contains(Roles::SystemRole)) { + const auto leftVal = left.data(Roles::SystemRole).toString(); + const auto rightVal = right.data(Roles::SystemRole).toString(); + if (leftVal != rightVal) + return leftVal < rightVal; + } + const auto leftId = left.data(Roles::IdRole).toInt(); + const auto rightId = right.data(Roles::IdRole).toInt(); + return leftId < rightId; +} diff --git a/examples/positioning/satelliteinfo/sortfiltermodel.h b/examples/positioning/satelliteinfo/sortfiltermodel.h new file mode 100644 index 0000000..3d2b7e8 --- /dev/null +++ b/examples/positioning/satelliteinfo/sortfiltermodel.h @@ -0,0 +1,48 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef SORTFILTERMODEL_H +#define SORTFILTERMODEL_H + +#include +#include +#include +#include + +//! [0] +class SortFilterModel : public QSortFilterProxyModel +{ + Q_OBJECT + QML_ELEMENT +public: + explicit SortFilterModel(QObject *parent = nullptr); + +public slots: + void updateFilterString(const QString &str); + void updateShowInView(bool show); + void updateShowInUse(bool show); + void updateSelectedSystems(int id, bool show); + void updateSortRoles(int role, bool use); + +protected: + bool filterAcceptsRow(int row, const QModelIndex &parent) const override; + bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; +//! [0] + +private: + QString m_filterString; + QSet m_selectedSystems = { + QGeoSatelliteInfo::GPS, + QGeoSatelliteInfo::GLONASS, + QGeoSatelliteInfo::GALILEO, + QGeoSatelliteInfo::BEIDOU, + QGeoSatelliteInfo::QZSS + }; + bool m_showInView = true; + bool m_showInUse = true; + QSet m_sortRoles; +//! [1] +}; +//! [1] + +#endif // SORTFILTERMODEL_H diff --git a/examples/positioning/shared/Info.cmake.ios.plist b/examples/positioning/shared/Info.cmake.ios.plist new file mode 100644 index 0000000..d8146a5 --- /dev/null +++ b/examples/positioning/shared/Info.cmake.ios.plist @@ -0,0 +1,39 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleVersion + 0.0.1 + CFBundleShortVersionString + 0.0.1 + CFBundleGetInfoString + + NSHumanReadableCopyright + + CFBundleIconFile + ${MACOSX_BUNDLE_ICON_FILE} + CFBundleDevelopmentRegion + English + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + NSLocationWhenInUseUsageDescription + Qt positioning example wants to access your location + + diff --git a/examples/positioning/shared/Info.cmake.macos.plist b/examples/positioning/shared/Info.cmake.macos.plist new file mode 100644 index 0000000..0137d34 --- /dev/null +++ b/examples/positioning/shared/Info.cmake.macos.plist @@ -0,0 +1,33 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleVersion + ${MACOSX_BUNDLE_BUNDLE_VERSION} + CFBundleShortVersionString + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + LSMinimumSystemVersion + ${CMAKE_OSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + ${MACOSX_BUNDLE_COPYRIGHT} + CFBundleIconFile + ${MACOSX_BUNDLE_ICON_FILE} + CFBundleDevelopmentRegion + English + NSSupportsAutomaticGraphicsSwitching + + NSLocationUsageDescription + For Qt example demonstration purposes + + + diff --git a/examples/positioning/shared/Info.qmake.ios.plist b/examples/positioning/shared/Info.qmake.ios.plist new file mode 100644 index 0000000..3c143b6 --- /dev/null +++ b/examples/positioning/shared/Info.qmake.ios.plist @@ -0,0 +1,39 @@ + + + + + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleVersion + 0.0.1 + CFBundleShortVersionString + 0.0.1 + CFBundleGetInfoString + + NSHumanReadableCopyright + + CFBundleIconFile + + CFBundleDevelopmentRegion + English + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + NSLocationWhenInUseUsageDescription + Qt positioning example wants to access your location + + diff --git a/examples/positioning/shared/Info.qmake.macos.plist b/examples/positioning/shared/Info.qmake.macos.plist new file mode 100644 index 0000000..6aff314 --- /dev/null +++ b/examples/positioning/shared/Info.qmake.macos.plist @@ -0,0 +1,30 @@ + + + + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + ${ASSETCATALOG_COMPILER_APPICON_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleName + ${EXECUTABLE_NAME} + CFBundlePackageType + APPL + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSPrincipalClass + NSApplication + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + NSSupportsAutomaticGraphicsSwitching + + CFBundleDevelopmentRegion + en + CFBundleAllowMixedLocalizations + + NSLocationUsageDescription + For Qt example demonstrative purposes + + diff --git a/examples/positioning/weatherinfo/BigForecastIcon.qml b/examples/positioning/weatherinfo/BigForecastIcon.qml new file mode 100644 index 0000000..e454fa6 --- /dev/null +++ b/examples/positioning/weatherinfo/BigForecastIcon.qml @@ -0,0 +1,64 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Effects + +Item { + id: current + + property string topText: "20*" + property string bottomText: "Mostly cloudy" + property string weatherIcon: "sunny" + property real smallSide: (current.width < current.height ? current.width : current.height) + + Text { + id: text1 + anchors.top: parent.top + anchors.horizontalCenter: parent.horizontalCenter + text: current.topText + font.pixelSize: 64 + color: "white" + } + + MultiEffect { + source: text1 + anchors.fill: text1 + shadowEnabled: true + shadowBlur: 0.5 + shadowHorizontalOffset: 0 + shadowVerticalOffset: 2 + shadowOpacity: 0.6 + } + + WeatherIcon { + id: img + anchors.top: text1.bottom + anchors.topMargin: 5 + anchors.horizontalCenter: parent.horizontalCenter + weatherIcon: current.weatherIcon + width: current.smallSide * 0.5 + height: current.smallSide * 0.5 + } + + Text { + id: text2 + anchors.top: img.bottom + anchors.topMargin: 5 + anchors.horizontalCenter: parent.horizontalCenter + text: current.bottomText + font.pixelSize: 32 + horizontalAlignment: Text.AlignHCenter + color: "white" + } + + MultiEffect { + source: text2 + anchors.fill: text2 + shadowEnabled: true + shadowBlur: 0.5 + shadowHorizontalOffset: 0 + shadowVerticalOffset: 2 + shadowOpacity: 0.6 + } +} diff --git a/examples/positioning/weatherinfo/CMakeLists.txt b/examples/positioning/weatherinfo/CMakeLists.txt new file mode 100644 index 0000000..093f1b3 --- /dev/null +++ b/examples/positioning/weatherinfo/CMakeLists.txt @@ -0,0 +1,91 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) +project(weatherinfo LANGUAGES CXX) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/positioning/weatherinfo") + +find_package(Qt6 REQUIRED COMPONENTS Core Gui Network Positioning Qml Quick) + +qt_standard_project_setup(REQUIRES 6.5) + +qt_add_executable(weatherinfo + main.cpp +) + +set_target_properties(weatherinfo PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE + MACOSX_BUNDLE_GUI_IDENTIFIER "io.qt.examples.weatherinfo" +) + +target_link_libraries(weatherinfo PRIVATE + Qt::Core + Qt::Gui + Qt::Network + Qt::Positioning + Qt::Qml + Qt::Quick +) + +if (APPLE) + # Using absolute path for shared plist files is a Ninja bug workaround + get_filename_component(SHARED_PLIST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../shared ABSOLUTE) + if (IOS) + set_target_properties(weatherinfo PROPERTIES + MACOSX_BUNDLE_INFO_PLIST "${SHARED_PLIST_DIR}/Info.cmake.ios.plist" + ) + else() + set_target_properties(weatherinfo PROPERTIES + MACOSX_BUNDLE_INFO_PLIST "${SHARED_PLIST_DIR}/Info.cmake.macos.plist" + ) + endif() +endif() + +qt_add_qml_module(weatherinfo + URI Weather + VERSION 1.0 + SOURCES + appmodel.cpp appmodel.h + openmeteobackend.cpp openmeteobackend.h + openweathermapbackend.cpp openweathermapbackend.h + providerbackend.cpp providerbackend.h + weatherapibackend.cpp weatherapibackend.h + QML_FILES + BigForecastIcon.qml + ForecastIcon.qml + WeatherIcon.qml + WeatherInfo.qml + RESOURCES + icons/weather-few-clouds.svg + icons/weather-fog.svg + icons/weather-haze.svg + icons/weather-icy.svg + icons/weather-overcast.svg + icons/weather-showers.svg + icons/weather-sleet.svg + icons/weather-snow.svg + icons/weather-storm.svg + icons/weather-sunny-very-few-clouds.svg + icons/weather-sunny.svg + icons/weather-thundershower.svg + icons/weather-showers-scattered.svg + icons/waypoint.svg +) + +install(TARGETS weatherinfo + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) + +if(APPLE AND NOT CMAKE_GENERATOR STREQUAL "Xcode") + # Need to sign application for location permissions to work + add_custom_command(TARGET weatherinfo + POST_BUILD COMMAND codesign -s - weatherinfo.app) +endif() diff --git a/examples/positioning/weatherinfo/ForecastIcon.qml b/examples/positioning/weatherinfo/ForecastIcon.qml new file mode 100644 index 0000000..52cfaf0 --- /dev/null +++ b/examples/positioning/weatherinfo/ForecastIcon.qml @@ -0,0 +1,51 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick + +Item { + id: top + + property string topText: "Mon" + property string middleIcon: "sunny" + property string bottomText: "22*/23*" + + implicitHeight: dayText.implicitHeight + width + tempText.implicitHeight + 20 + Text { + id: dayText + horizontalAlignment: Text.AlignHCenter + width: parent.width + text: top.topText + color: "white" + font.pixelSize: 24 + + anchors.top: parent.top + anchors.margins: 10 + anchors.horizontalCenter: parent.horizontalCenter + } + + WeatherIcon { + id: icon + weatherIcon: top.middleIcon + + width: height + anchors.top: dayText.bottom + anchors.bottom: tempText.top + anchors.margins: 10 + anchors.horizontalCenter: parent.horizontalCenter + } + + Text { + id: tempText + horizontalAlignment: Text.AlignHCenter + width: top.width + text: top.bottomText + font.pixelSize: 16 + + anchors.bottom: parent.bottom + anchors.margins: 10 + anchors.horizontalCenter: parent.horizontalCenter + color: "white" + + } +} diff --git a/examples/positioning/weatherinfo/WeatherIcon.qml b/examples/positioning/weatherinfo/WeatherIcon.qml new file mode 100644 index 0000000..5dda560 --- /dev/null +++ b/examples/positioning/weatherinfo/WeatherIcon.qml @@ -0,0 +1,28 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +import QtQuick +import QtQuick.Effects + +Item { + id: container + + property string weatherIcon: "sunny" + + + Image { + id: mask + source: "icons/weather-" + container.weatherIcon + ".svg" + smooth: true + anchors.fill: parent + sourceSize.width: width + sourceSize.height: height + layer.enabled: true + visible: false + } + MultiEffect { + source: mask + anchors.fill: parent + brightness: 1 // make icons white, remove for dark icons + } +} diff --git a/examples/positioning/weatherinfo/WeatherInfo.qml b/examples/positioning/weatherinfo/WeatherInfo.qml new file mode 100644 index 0000000..bed37a4 --- /dev/null +++ b/examples/positioning/weatherinfo/WeatherInfo.qml @@ -0,0 +1,254 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +pragma ComponentBehavior: Bound +import QtQuick +import QtQuick.Shapes +import QtQuick.Effects +import QtQuick.Layouts + +//! [0] +Window { + id: window +//! [0] + width: 360 + height: 640 + visible: true + + Shape {//Shape because Rectangle does not support diagonal gradient + preferredRendererType: Shape.CurveRenderer + + ShapePath { + strokeWidth: 0 + startX: 0; startY: 0 + + PathLine { x: window.width; y: 0 } + PathLine { x: window.width; y: window.height } + PathLine { x: 0; y: window.height } + fillGradient: LinearGradient { + x1: 0; y1: window.height / 4 + x2: window.width; y2: window.height / 4 * 3 + GradientStop { position: 0.0; color: "#2CDE85" } + GradientStop { position: 1.0; color: "#9747FF" } + } + } + } + + Rectangle { + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + anchors.topMargin: parent.width / 2 + width: window.height > window.width * 1.5 ? window.height : window.width * 1.5 + height: width + radius: width / 2 + color: "#000000" + opacity: 0.15 + } + + Item { + id: statesItem + visible: false + state: "loading" + states: [ + State { + name: "loading" + PropertyChanges { main.opacity: 0 } + PropertyChanges { wait.opacity: 1 } + }, + State { + name: "ready" + PropertyChanges { main.opacity: 1 } + PropertyChanges { wait.opacity: 0 } + } + ] + } + +//! [1] + AppModel { + id: appModel + onReadyChanged: { + if (appModel.ready) + statesItem.state = "ready" + else + statesItem.state = "loading" + } + } +//! [1] + Item { + id: wait + anchors.fill: parent + + Text { + text: "Loading weather data..." + anchors.centerIn: parent + font.pointSize: 18 + } + } + + Item { + id: main + anchors.fill: parent + + ColumnLayout { + id: layout + spacing: 4 + + anchors { + fill: parent + topMargin: 6; bottomMargin: 6; leftMargin: 6; rightMargin: 6 + } + + Item { + Layout.preferredHeight: cityButton.height + Layout.fillWidth: true + + Rectangle { + id: cityButton + property int margins: 10 + anchors.centerIn: parent + width: cityName.contentWidth + cityIcon.width + 3 * margins + height: cityName.contentHeight + 2 * margins + radius: 8 + color: "#3F000000" + visible: false + + Text { + id: cityName + text: (appModel.hasValidCity ? appModel.city : "Unknown location") + + (appModel.useGps ? " (GPS)" : "") + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + anchors.margins: parent.margins + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + font.pixelSize: 24 + color: "white" + } + + Image { + id: cityIcon + source: "icons/waypoint.svg" + height: cityName.font.pixelSize + width: implicitWidth * height / implicitHeight + anchors.left: cityName.right + anchors.margins: parent.margins + anchors.verticalCenter: cityName.verticalCenter + anchors.verticalCenterOffset: 2 + visible: false + } + MultiEffect { + source: cityIcon + anchors.fill: cityIcon + brightness: 1 // make icons white, remove for dark icons + } + + } + + MultiEffect { + source: cityButton + anchors.fill: cityButton + shadowEnabled: true + shadowBlur: 0.5 + shadowHorizontalOffset: 0 + shadowVerticalOffset: 2 + } + + MouseArea { + anchors.fill: cityButton + onClicked: { + if (appModel.useGps) { + appModel.useGps = false + appModel.city = "Brisbane" + } else { + switch (appModel.city) { + case "Brisbane": + appModel.city = "Oslo" + break + case "Oslo": + appModel.city = "Helsinki" + break + case "Helsinki": + appModel.city = "New York" + break + case "New York": + appModel.useGps = true + break + } + } + } + } + } + + //! [3] + BigForecastIcon { + id: current + Layout.fillWidth: true + Layout.fillHeight: true + + weatherIcon: (appModel.hasValidWeather + ? appModel.weather.weatherIcon + : "sunny") + //! [3] + topText: (appModel.hasValidWeather + ? appModel.weather.temperature + : "??") + bottomText: (appModel.hasValidWeather + ? appModel.weather.weatherDescription + : "No weather data") + //! [4] + } + //! [4] + + Item { + implicitWidth: iconRow.implicitWidth + 40 + implicitHeight: iconRow.implicitHeight + 40 + + Layout.fillWidth: true + + Rectangle { + id: forcastFrame + + anchors.fill: parent + color: "#3F000000" + radius: 40 + + Row { + id: iconRow + anchors.centerIn: parent + + property int daysCount: appModel.forecast.length + property real iconWidth: (daysCount > 0) ? ((forcastFrame.width - 20) / daysCount) + : forcastFrame.width + + Repeater { + model: appModel.forecast + ForecastIcon { + required property string dayOfWeek + required property string temperature + required property string weatherIcon + id: forecast1 + width: iconRow.iconWidth + topText: (appModel.hasValidWeather ? dayOfWeek : "??") + bottomText: (appModel.hasValidWeather ? temperature : ("??" + "/??")) + middleIcon: (appModel.hasValidWeather ? weatherIcon : "sunny") + } + } + } + visible: false + } + + MultiEffect { + source: forcastFrame + anchors.fill: forcastFrame + shadowEnabled: true + shadowBlur: 0.5 + shadowHorizontalOffset: 0 + shadowVerticalOffset: 4 + shadowOpacity: 0.6 + } + } + } + } +//! [2] +} +//! [2] diff --git a/examples/positioning/weatherinfo/appmodel.cpp b/examples/positioning/weatherinfo/appmodel.cpp new file mode 100644 index 0000000..1443912 --- /dev/null +++ b/examples/positioning/weatherinfo/appmodel.cpp @@ -0,0 +1,492 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "appmodel.h" +#include "openmeteobackend.h" +#include "openweathermapbackend.h" +#include "weatherapibackend.h" + +#include +#include +#if QT_CONFIG(permissions) +#include +#endif +#include +#include +#include + +Q_LOGGING_CATEGORY(requestsLog, "wapp.requests") + +WeatherData::WeatherData(QObject *parent) : + QObject(parent) +{ +} + +WeatherData::WeatherData(const WeatherData &other) : + QObject(nullptr), + m_dayOfWeek(other.m_dayOfWeek), + m_weather(other.m_weather), + m_weatherDescription(other.m_weatherDescription), + m_temperature(other.m_temperature) +{ +} + +WeatherData::WeatherData(const WeatherInfo &other) + : QObject(nullptr), + m_dayOfWeek(other.m_dayOfWeek), + m_weather(other.m_weatherIconId), + m_weatherDescription(other.m_weatherDescription), + m_temperature(other.m_temperature) +{ +} + +QString WeatherData::dayOfWeek() const +{ + return m_dayOfWeek; +} + +QString WeatherData::weatherIcon() const +{ + return m_weather; +} + +QString WeatherData::weatherDescription() const +{ + return m_weatherDescription; +} + +QString WeatherData::temperature() const +{ + return m_temperature; +} + +void WeatherData::setDayOfWeek(const QString &value) +{ + m_dayOfWeek = value; + emit dataChanged(); +} + +void WeatherData::setWeatherIcon(const QString &value) +{ + m_weather = value; + emit dataChanged(); +} + +void WeatherData::setWeatherDescription(const QString &value) +{ + m_weatherDescription = value; + emit dataChanged(); +} + +void WeatherData::setTemperature(const QString &value) +{ + m_temperature = value; + emit dataChanged(); +} + +/* + The class is used as a cache for the weather information. + It contains a map to cache weather for cities. + The gps location is cached separately. + + For the coordiante search we do not compare the coordinate directly, but + check if it's within a circle of 3 km radius (we assume that the weather + does not really change within that radius). + + The cache returns a pair with empty location and weather data if no data + is found, or if the data is outdated. +*/ +class WeatherDataCache +{ +public: + WeatherDataCache() = default; + + using WeatherDataPair = QPair>; + + WeatherDataPair getWeatherData(const QString &name) const; + WeatherDataPair getWeatherData(const QGeoCoordinate &coordinate) const; + + void addCacheElement(const LocationInfo &location, const QList &info); + + static bool isCacheResultValid(const WeatherDataPair &result); + +private: + struct CacheItem + { + qint64 m_cacheTime; + QList m_weatherData; + }; + + QMap m_cityCache; + + QGeoCoordinate m_gpsLocation; + QString m_gpsName; + CacheItem m_gpsData; + + static const qint64 kCacheTimeoutInterval = 3600; // 1 hour + static const int kCircleRadius = 3000; // 3 km +}; + +WeatherDataCache::WeatherDataPair WeatherDataCache::getWeatherData(const QString &name) const +{ + if (m_cityCache.contains(name)) { + const qint64 currentTime = QDateTime::currentSecsSinceEpoch(); + const auto &item = m_cityCache.value(name); + if (currentTime - item.m_cacheTime < kCacheTimeoutInterval) + return qMakePair(name, item.m_weatherData); + } + return qMakePair(QString(), QList()); +} + +WeatherDataCache::WeatherDataPair +WeatherDataCache::getWeatherData(const QGeoCoordinate &coordinate) const +{ + if (m_gpsLocation.isValid() && !m_gpsName.isEmpty()) { + const QGeoCircle area(m_gpsLocation, kCircleRadius); + if (area.contains(coordinate)) { + const qint64 currentTime = QDateTime::currentSecsSinceEpoch(); + if (currentTime - m_gpsData.m_cacheTime < kCacheTimeoutInterval) + return qMakePair(m_gpsName, m_gpsData.m_weatherData); + } + } + return qMakePair(QString(), QList()); +} + +void WeatherDataCache::addCacheElement(const LocationInfo &location, + const QList &info) +{ + // It it expected that we have valid QGeoCoordinate only when the weather + // is received based on coordinates. + const qint64 currentTime = QDateTime::currentSecsSinceEpoch(); + if (location.m_coordinate.isValid()) { + m_gpsLocation = location.m_coordinate; + m_gpsName = location.m_name; + m_gpsData = { currentTime, info }; + } else { + m_cityCache[location.m_name] = { currentTime, info }; + } +} + +bool WeatherDataCache::isCacheResultValid(const WeatherDataCache::WeatherDataPair &result) +{ + return !result.first.isEmpty() && !result.second.isEmpty(); +} + +class AppModelPrivate +{ +public: + QGeoPositionInfoSource *src = nullptr; + QGeoCoordinate coord; + QString city; + WeatherData now; + QList forecast; + QQmlListProperty *fcProp = nullptr; + bool ready = false; + bool useGps = true; + WeatherDataCache m_dataCache; + ProviderBackend *m_currentBackend = nullptr; + QList m_supportedBackends; + qsizetype m_currentBackendIndex = 0; +}; + +static void forecastAppend(QQmlListProperty *prop, WeatherData *val) +{ + Q_UNUSED(val); + Q_UNUSED(prop); +} + +static WeatherData *forecastAt(QQmlListProperty *prop, qsizetype index) +{ + AppModelPrivate *d = static_cast(prop->data); + return d->forecast.at(index); +} + +static qsizetype forecastCount(QQmlListProperty *prop) +{ + AppModelPrivate *d = static_cast(prop->data); + return d->forecast.size(); +} + +static void forecastClear(QQmlListProperty *prop) +{ + static_cast(prop->data)->forecast.clear(); +} + +//! [0] +AppModel::AppModel(QObject *parent) : + QObject(parent), + d(new AppModelPrivate) +{ +//! [0] + d->fcProp = new QQmlListProperty(this, d, forecastAppend, + forecastCount, + forecastAt, + forecastClear); + + d->m_supportedBackends.push_back(new OpenWeatherMapBackend(this)); + d->m_supportedBackends.push_back(new WeatherApiBackend(this)); + d->m_supportedBackends.push_back(new OpenMeteoBackend(this)); + registerBackend(0); + +//! [1] + d->src = QGeoPositionInfoSource::createDefaultSource(this); + + if (d->src) { + d->useGps = true; + connect(d->src, &QGeoPositionInfoSource::positionUpdated, + this, &AppModel::positionUpdated); + connect(d->src, &QGeoPositionInfoSource::errorOccurred, + this, &AppModel::positionError); +#if QT_CONFIG(permissions) + QLocationPermission permission; + permission.setAccuracy(QLocationPermission::Precise); + permission.setAvailability(QLocationPermission::WhenInUse); + + switch (qApp->checkPermission(permission)) { + case Qt::PermissionStatus::Undetermined: + qApp->requestPermission(permission, [this] (const QPermission& permission) { + if (permission.status() == Qt::PermissionStatus::Granted) + d->src->startUpdates(); + else + positionError(QGeoPositionInfoSource::AccessError); + }); + break; + case Qt::PermissionStatus::Denied: + qWarning("Location permission is denied"); + positionError(QGeoPositionInfoSource::AccessError); + break; + case Qt::PermissionStatus::Granted: + d->src->startUpdates(); + break; + } +#else + d->src->startUpdates(); +#endif + } else { + d->useGps = false; + d->city = "Brisbane"; + emit cityChanged(); + requestWeatherByCity(); + } + + QTimer *refreshTimer = new QTimer(this); + connect(refreshTimer, &QTimer::timeout, this, &AppModel::refreshWeather); + using namespace std::chrono; + refreshTimer->start(60s); +} +//! [1] + +AppModel::~AppModel() +{ + if (d->src) + d->src->stopUpdates(); + if (d->fcProp) + delete d->fcProp; + qDeleteAll(d->forecast); + delete d; +} + +//! [2] +void AppModel::positionUpdated(QGeoPositionInfo gpsPos) +{ + d->coord = gpsPos.coordinate(); + + if (!d->useGps) + return; + + requestWeatherByCoordinates(); +} +//! [2] + +void AppModel::positionError(QGeoPositionInfoSource::Error e) +{ + Q_UNUSED(e); + qWarning() << "Position source error. Falling back to simulation mode."; + + // activate simulation mode + if (d->useGps) { + d->useGps = false; + d->city = "Brisbane"; + emit cityChanged(); + requestWeatherByCity(); + } +} + +void AppModel::refreshWeather() +{ + if (d->city.isEmpty()) { + qCDebug(requestsLog) << "refreshing weather skipped (no city)"; + return; + } + qCDebug(requestsLog) << "refreshing weather"; + requestWeatherByCity(); +} + +void AppModel::handleWeatherData(const LocationInfo &location, + const QList &weatherDetails) +{ + if (applyWeatherData(location.m_name, weatherDetails)) + d->m_dataCache.addCacheElement(location, weatherDetails); +} + +void AppModel::switchToNextBackend() +{ + deregisterCurrentBackend(); + registerBackend(d->m_currentBackendIndex + 1); + if (d->m_currentBackend) { + // repeat the query + if (d->useGps) + requestWeatherByCoordinates(); + else + requestWeatherByCity(); + } else { + qWarning("The application has iterated through all of the weather backends, " + "and none of them seems to respond now. Please wait until any of the " + "backends becomes available again."); + } +} + +bool AppModel::applyWeatherData(const QString &city, const QList &weatherDetails) +{ + // Check that we didn't get outdated weather data. The city should match, + // if only we do not use GPS. + if (city != d->city && !d->useGps) + return false; + + if (city != d->city && d->useGps) { + d->city = city; + emit cityChanged(); + } + + // delete previous forecast + qDeleteAll(d->forecast); + d->forecast.clear(); + + // The first item in the list represents current weather. + if (!weatherDetails.isEmpty()) { + d->now.setTemperature(weatherDetails.first().m_temperature); + d->now.setWeatherIcon(weatherDetails.first().m_weatherIconId); + d->now.setWeatherDescription(weatherDetails.first().m_weatherDescription); + } + + // The other items represent weather forecast. The amount of items depends + // on the provider backend. + for (qsizetype i = 1; i < weatherDetails.size(); ++i) { + WeatherData *forecastEntry = new WeatherData(weatherDetails.at(i)); + d->forecast.append(forecastEntry); + } + + if (!d->ready) { + d->ready = true; + emit readyChanged(); + } + + emit weatherChanged(); + + return true; +} + +void AppModel::requestWeatherByCoordinates() +{ + const auto cacheResult = d->m_dataCache.getWeatherData(d->coord); + if (WeatherDataCache::isCacheResultValid(cacheResult)) + applyWeatherData(cacheResult.first, cacheResult.second); + else if (d->m_currentBackend) + d->m_currentBackend->requestWeatherInfo(d->coord); +} + +void AppModel::requestWeatherByCity() +{ + const auto cacheResult = d->m_dataCache.getWeatherData(d->city); + if (WeatherDataCache::isCacheResultValid(cacheResult)) + applyWeatherData(cacheResult.first, cacheResult.second); + else if (d->m_currentBackend) + d->m_currentBackend->requestWeatherInfo(d->city); +} + +void AppModel::registerBackend(qsizetype index) +{ + if (index >= 0 && index < d->m_supportedBackends.size()) { + d->m_currentBackend = d->m_supportedBackends.at(index); + d->m_currentBackendIndex = index; + connect(d->m_currentBackend, &ProviderBackend::weatherInformation, + this, &AppModel::handleWeatherData); + connect(d->m_currentBackend, &ProviderBackend::errorOccurred, + this, &AppModel::switchToNextBackend); + } +} + +void AppModel::deregisterCurrentBackend() +{ + if (d->m_currentBackend) { + disconnect(d->m_currentBackend, &ProviderBackend::weatherInformation, + this, &AppModel::handleWeatherData); + disconnect(d->m_currentBackend, &ProviderBackend::errorOccurred, + this, &AppModel::switchToNextBackend); + d->m_currentBackend = nullptr; + } +} + +bool AppModel::hasValidCity() const +{ + return (!(d->city.isEmpty()) && d->city.size() > 1 && d->city != ""); +} + +bool AppModel::hasValidWeather() const +{ + return hasValidCity() && (!(d->now.weatherIcon().isEmpty()) && + (d->now.weatherIcon().size() > 1) && + d->now.weatherIcon() != ""); +} + +WeatherData *AppModel::weather() const +{ + return &(d->now); +} + +QQmlListProperty AppModel::forecast() const +{ + return *(d->fcProp); +} + +bool AppModel::ready() const +{ + return d->ready; +} + +bool AppModel::hasSource() const +{ + return (d->src != NULL); +} + +bool AppModel::useGps() const +{ + return d->useGps; +} + +void AppModel::setUseGps(bool value) +{ + d->useGps = value; + if (value) { + d->city = ""; + emit cityChanged(); + emit weatherChanged(); + // if we already have a valid GPS position, do not wait until it + // updates, but query the city immediately + if (d->coord.isValid()) + requestWeatherByCoordinates(); + } + emit useGpsChanged(); +} + +QString AppModel::city() const +{ + return d->city; +} + +void AppModel::setCity(const QString &value) +{ + d->city = value; + emit cityChanged(); + requestWeatherByCity(); +} diff --git a/examples/positioning/weatherinfo/appmodel.h b/examples/positioning/weatherinfo/appmodel.h new file mode 100644 index 0000000..52e4040 --- /dev/null +++ b/examples/positioning/weatherinfo/appmodel.h @@ -0,0 +1,142 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef APPMODEL_H +#define APPMODEL_H + +#include "providerbackend.h" + +#include +#include +#include +#include +#include +#include + +//! [0] +class WeatherData : public QObject { + Q_OBJECT + Q_PROPERTY(QString dayOfWeek + READ dayOfWeek WRITE setDayOfWeek + NOTIFY dataChanged) + Q_PROPERTY(QString weatherIcon + READ weatherIcon WRITE setWeatherIcon + NOTIFY dataChanged) + Q_PROPERTY(QString weatherDescription + READ weatherDescription WRITE setWeatherDescription + NOTIFY dataChanged) + Q_PROPERTY(QString temperature + READ temperature WRITE setTemperature + NOTIFY dataChanged) + QML_ANONYMOUS + +public: + explicit WeatherData(QObject *parent = 0); + WeatherData(const WeatherData &other); + WeatherData(const WeatherInfo &other); + + QString dayOfWeek() const; + QString weatherIcon() const; + QString weatherDescription() const; + QString temperature() const; + + void setDayOfWeek(const QString &value); + void setWeatherIcon(const QString &value); + void setWeatherDescription(const QString &value); + void setTemperature(const QString &value); + +signals: + void dataChanged(); +//! [0] +private: + QString m_dayOfWeek; + QString m_weather; + QString m_weatherDescription; + QString m_temperature; +//! [1] +}; +//! [1] + +Q_DECLARE_METATYPE(WeatherData) + +class AppModelPrivate; +//! [2] +class AppModel : public QObject +{ + Q_OBJECT + Q_PROPERTY(bool ready + READ ready + NOTIFY readyChanged) + Q_PROPERTY(bool hasSource + READ hasSource + NOTIFY readyChanged) + Q_PROPERTY(bool hasValidCity + READ hasValidCity + NOTIFY cityChanged) + Q_PROPERTY(bool hasValidWeather + READ hasValidWeather + NOTIFY weatherChanged) + Q_PROPERTY(bool useGps + READ useGps WRITE setUseGps + NOTIFY useGpsChanged) + Q_PROPERTY(QString city + READ city WRITE setCity + NOTIFY cityChanged) + Q_PROPERTY(WeatherData *weather + READ weather + NOTIFY weatherChanged) + Q_PROPERTY(QQmlListProperty forecast + READ forecast + NOTIFY weatherChanged) + QML_ELEMENT + +public: + explicit AppModel(QObject *parent = 0); + ~AppModel(); + + bool ready() const; + bool hasSource() const; + bool useGps() const; + bool hasValidCity() const; + bool hasValidWeather() const; + void setUseGps(bool value); + + QString city() const; + void setCity(const QString &value); + + WeatherData *weather() const; + QQmlListProperty forecast() const; + +public slots: + Q_INVOKABLE void refreshWeather(); + +//! [2] +private slots: + void positionUpdated(QGeoPositionInfo gpsPos); + void positionError(QGeoPositionInfoSource::Error e); + void handleWeatherData(const LocationInfo &location, const QList &weatherDetails); + void switchToNextBackend(); + +//! [3] +signals: + void readyChanged(); + void useGpsChanged(); + void cityChanged(); + void weatherChanged(); +//! [3] + +private: + bool applyWeatherData(const QString &city, const QList &weatherDetails); + void requestWeatherByCoordinates(); + void requestWeatherByCity(); + void registerBackend(qsizetype index); + void deregisterCurrentBackend(); + + + AppModelPrivate *d; + +//! [4] +}; +//! [4] + +#endif // APPMODEL_H diff --git a/examples/positioning/weatherinfo/doc/images/example-weatherinfo.png b/examples/positioning/weatherinfo/doc/images/example-weatherinfo.png new file mode 100644 index 0000000000000000000000000000000000000000..9fe1fa971f94fadf0c8ea9b42b224d7cd07731aa GIT binary patch literal 105928 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 z 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 + + + diff --git a/examples/positioning/weatherinfo/icons/weather-few-clouds.svg b/examples/positioning/weatherinfo/icons/weather-few-clouds.svg new file mode 100644 index 0000000..db80fff --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-few-clouds.svg @@ -0,0 +1,4 @@ + + + + diff --git a/examples/positioning/weatherinfo/icons/weather-fog.svg b/examples/positioning/weatherinfo/icons/weather-fog.svg new file mode 100644 index 0000000..8bab426 --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-fog.svg @@ -0,0 +1,4 @@ + + + + diff --git a/examples/positioning/weatherinfo/icons/weather-haze.svg b/examples/positioning/weatherinfo/icons/weather-haze.svg new file mode 100644 index 0000000..bc08c30 --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-haze.svg @@ -0,0 +1,4 @@ + + + + diff --git a/examples/positioning/weatherinfo/icons/weather-icy.svg b/examples/positioning/weatherinfo/icons/weather-icy.svg new file mode 100644 index 0000000..85052ad --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-icy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/examples/positioning/weatherinfo/icons/weather-overcast.svg b/examples/positioning/weatherinfo/icons/weather-overcast.svg new file mode 100644 index 0000000..9c2cea4 --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-overcast.svg @@ -0,0 +1,4 @@ + + + + diff --git a/examples/positioning/weatherinfo/icons/weather-showers-scattered.svg b/examples/positioning/weatherinfo/icons/weather-showers-scattered.svg new file mode 100644 index 0000000..91e74eb --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-showers-scattered.svg @@ -0,0 +1,4 @@ + + + + diff --git a/examples/positioning/weatherinfo/icons/weather-showers.svg b/examples/positioning/weatherinfo/icons/weather-showers.svg new file mode 100644 index 0000000..546700c --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-showers.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/examples/positioning/weatherinfo/icons/weather-sleet.svg b/examples/positioning/weatherinfo/icons/weather-sleet.svg new file mode 100644 index 0000000..6f00166 --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-sleet.svg @@ -0,0 +1,4 @@ + + + + diff --git a/examples/positioning/weatherinfo/icons/weather-snow.svg b/examples/positioning/weatherinfo/icons/weather-snow.svg new file mode 100644 index 0000000..f41c680 --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-snow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/examples/positioning/weatherinfo/icons/weather-storm.svg b/examples/positioning/weatherinfo/icons/weather-storm.svg new file mode 100644 index 0000000..d040bac --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-storm.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/examples/positioning/weatherinfo/icons/weather-sunny-very-few-clouds.svg b/examples/positioning/weatherinfo/icons/weather-sunny-very-few-clouds.svg new file mode 100644 index 0000000..aca8550 --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-sunny-very-few-clouds.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/examples/positioning/weatherinfo/icons/weather-sunny.svg b/examples/positioning/weatherinfo/icons/weather-sunny.svg new file mode 100644 index 0000000..0a5fec0 --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-sunny.svg @@ -0,0 +1,4 @@ + + + + diff --git a/examples/positioning/weatherinfo/icons/weather-thundershower.svg b/examples/positioning/weatherinfo/icons/weather-thundershower.svg new file mode 100644 index 0000000..c6566cf --- /dev/null +++ b/examples/positioning/weatherinfo/icons/weather-thundershower.svg @@ -0,0 +1,4 @@ + + + + diff --git a/examples/positioning/weatherinfo/main.cpp b/examples/positioning/weatherinfo/main.cpp new file mode 100644 index 0000000..832f31c --- /dev/null +++ b/examples/positioning/weatherinfo/main.cpp @@ -0,0 +1,19 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QLoggingCategory::setFilterRules("wapp.*.debug=false"); + QGuiApplication application(argc, argv); + + QQmlApplicationEngine engine; + QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, &application, + []() { QCoreApplication::exit(1); }, Qt::QueuedConnection); + engine.loadFromModule("Weather", "WeatherInfo"); + + return application.exec(); +} diff --git a/examples/positioning/weatherinfo/openmeteobackend.cpp b/examples/positioning/weatherinfo/openmeteobackend.cpp new file mode 100644 index 0000000..889dcde --- /dev/null +++ b/examples/positioning/weatherinfo/openmeteobackend.cpp @@ -0,0 +1,293 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "openmeteobackend.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Q_DECLARE_LOGGING_CATEGORY(requestsLog) + +using namespace Qt::StringLiterals; + +static constexpr qsizetype kMaxEntries = 4; + +static QString niceTemperatureString(double t) +{ + return QString::number(qRound(t)) + QChar(0xB0); +} + +/* + Weather codes are taken from the bottom of this page: + https://open-meteo.com/en/docs + + The possible strings are based on the icon names. The icon name is built up + as follows: + weather-[mystring].png +*/ +static QString weatherCodeToIcon(int code) +{ + switch (code) { + case 0: + return "sunny"_L1; + case 1: + return "sunny-very-few-clouds"_L1; + case 2: + return "few-clouds"_L1; + case 3: + return "overcast"_L1; + case 45: + case 48: + return "fog"_L1; + case 51: + case 53: + case 55: + case 56: + case 57: + return "showers-scattered"_L1; + case 61: + case 63: + case 65: + case 80: + case 81: + case 82: + return "showers"_L1; + case 66: + case 67: + return "sleet"_L1; + case 71: + case 73: + case 75: + case 77: + case 85: + case 86: + return "snow"_L1; + case 95: + case 96: + case 99: + return "thundershower"_L1; + } + return "sunny"_L1; // default +} + +/* + Weather codes and descriptions are taken from the bottom of this page: + https://open-meteo.com/en/docs +*/ +static QString weatherCodeToDescription(int code) +{ + switch (code) { + case 0: + return "clear sky"_L1; + case 1: + return "mainly clear"_L1; + case 2: + return "partly cloudy"_L1; + case 3: + return "overcast"_L1; + case 45: + case 48: + return "fog"_L1; + case 51: + case 53: + case 55: + case 56: + case 57: + return "drizzle"_L1; + case 61: + case 63: + case 65: + return "rain"_L1; + case 66: + case 67: + return "freezing rain"_L1; + case 71: + case 73: + case 75: + case 77: + case 85: + case 86: + return "snow"_L1; + case 80: + case 81: + case 82: + return "pouring rain"_L1; + case 95: + case 96: + case 99: + return "thunderstorm"_L1; + } + return QString(); +} + +// The supported cities are taken from WeatherInfo.qml. +// Need to keep in sync with it. +static QGeoCoordinate coordinateForCity(const QString &city) +{ + if (city == "Brisbane"_L1) + return QGeoCoordinate(-27.3818, 152.8531); + else if (city == "Oslo"_L1) + return QGeoCoordinate(59.8939, 10.7151); + else if (city == "Helsinki"_L1) + return QGeoCoordinate(60.1103, 24.8786); + else if (city == "New York"_L1) + return QGeoCoordinate(40.6977, -74.1198); + + return QGeoCoordinate(); +} + +OpenMeteoBackend::OpenMeteoBackend(QObject *parent) + : ProviderBackend{parent}, + m_networkManager{new QNetworkAccessManager(this)} +{ +} + +void OpenMeteoBackend::requestWeatherInfo(const QString &city) +{ + const auto coordinate = coordinateForCity(city); + if (!coordinate.isValid()) { + qCDebug(requestsLog) << "Weather request for unknown city:" << city; + emit errorOccurred(); + return; + } + generateWeatherRequest(city, coordinate); +} + +void OpenMeteoBackend::requestWeatherInfo(const QGeoCoordinate &coordinate) +{ + generateWeatherRequest(QString(), coordinate); +} + +void OpenMeteoBackend::handleWeatherForecastReply(QNetworkReply *reply, + const LocationInfo &location) +{ + Q_UNUSED(reply); + Q_UNUSED(location); + if (!reply) { + emit errorOccurred(); + return; + } + + bool parsed = false; + // first item is current weather, then forecast data + QList weatherData; + if (!reply->error()) { + const QJsonDocument document = QJsonDocument::fromJson(reply->readAll()); + const QJsonObject documentObject = document.object(); + + // utc offset + const QJsonValue offsetVal = documentObject.value("utc_offset_seconds"_L1); + const qint64 utcOffset = !offsetVal.isUndefined() ? offsetVal.toInteger() : -1; + + // current weather + WeatherInfo currentWeather; + const QJsonObject currWeatherObj = documentObject.value("current_weather"_L1).toObject(); + const QJsonValue currTemp = currWeatherObj.value("temperature"_L1); + if (currTemp.isDouble()) + currentWeather.m_temperature = niceTemperatureString(currTemp.toDouble()); + const QJsonValue weatherCode = currWeatherObj.value("weathercode"_L1); + if (weatherCode.isDouble()) { + const int code = weatherCode.toInt(-1); + if (code >= 0) { + currentWeather.m_weatherIconId = weatherCodeToIcon(code); + currentWeather.m_weatherDescription = weatherCodeToDescription(code); + } + } + if (!currentWeather.m_temperature.isEmpty() + && !currentWeather.m_weatherIconId.isEmpty() + && !currentWeather.m_weatherDescription.isEmpty()) { + weatherData.append(currentWeather); + } else { + qCDebug(requestsLog) << "Failed to extract current weather"; + } + + // daily weather + const QJsonObject dailyData = documentObject.value("daily"_L1).toObject(); + const QJsonArray days = dailyData.value("time"_L1).toArray(); + const QJsonArray weatherCodes = dailyData.value("weathercode"_L1).toArray(); + const QJsonArray maxTemperatures = dailyData.value("temperature_2m_max"_L1).toArray(); + const QJsonArray minTemperatures = dailyData.value("temperature_2m_min"_L1).toArray(); + if (days.size() >= kMaxEntries && weatherCodes.size() >= kMaxEntries + && maxTemperatures.size() >= kMaxEntries + && minTemperatures.size() >= kMaxEntries) { + for (qsizetype i = 0; i < kMaxEntries; ++i) { + WeatherInfo info; + const qint64 unixTime = days.at(i).toInteger(-1); + if (unixTime > 0) { + const QDateTime date = QDateTime::fromSecsSinceEpoch(unixTime + utcOffset); + info.m_dayOfWeek = date.toString("ddd"_L1); + } + const int code = weatherCodes.at(i).toInt(-1); + if (code >= 0) + info.m_weatherIconId = weatherCodeToIcon(code); + const double minTemp = minTemperatures.at(i).toDouble(); + const double maxTemp = maxTemperatures.at(i).toDouble(); + info.m_temperature = niceTemperatureString(minTemp) + u'/' + + niceTemperatureString(maxTemp); + + if (!info.m_dayOfWeek.isEmpty() && !info.m_temperature.isEmpty() + && !info.m_weatherIconId.isEmpty()) { + weatherData.append(info); + } else { + qCDebug(requestsLog) << "Failed to extract weather forecast"; + break; + } + } + } + + parsed = (utcOffset != -1) && (weatherData.size() == (kMaxEntries + 1)); + } + + if (parsed) { + emit weatherInformation(location, weatherData); + } else { + emit errorOccurred(); + if (reply->error()) + qCDebug(requestsLog) << reply->errorString(); + else + qCDebug(requestsLog, "Failed to parse weather JSON."); + } + + reply->deleteLater(); +} + +void OpenMeteoBackend::generateWeatherRequest(const QString &city, + const QGeoCoordinate &coordinate) +{ + QUrl url("https://api.open-meteo.com/v1/forecast"_L1); + + QUrlQuery query; + query.addQueryItem("latitude"_L1, QString::number(coordinate.latitude())); + query.addQueryItem("longitude"_L1, QString::number(coordinate.longitude())); + query.addQueryItem("daily"_L1, "weathercode,temperature_2m_max,temperature_2m_min"_L1); + query.addQueryItem("temperature_unit"_L1, "celsius"_L1); + query.addQueryItem("current_weather"_L1, "true"_L1); + query.addQueryItem("timezone"_L1, QString::fromLatin1(QTimeZone::systemTimeZoneId())); + query.addQueryItem("timeformat"_L1, "unixtime"_L1); + + url.setQuery(query); + + // We always need to have a non-empty "city" name to display to the user. + // Other backends provide this information, but here we just use the string + // representation of QGeoCoordinate if the city is unknown. + // If the city is known, we pass an empty QGeoCoordinate object, so that + // the WeatherDataCache is populated correctly. + const LocationInfo info = city.isEmpty() + ? LocationInfo{coordinate.toString(QGeoCoordinate::DegreesMinutesWithHemisphere), + coordinate} + : LocationInfo{city, QGeoCoordinate()}; + + QNetworkReply *reply = m_networkManager->get(QNetworkRequest(url)); + connect(reply, &QNetworkReply::finished, this, [this, reply, info]() { + handleWeatherForecastReply(reply, info); + }); +} diff --git a/examples/positioning/weatherinfo/openmeteobackend.h b/examples/positioning/weatherinfo/openmeteobackend.h new file mode 100644 index 0000000..def72e3 --- /dev/null +++ b/examples/positioning/weatherinfo/openmeteobackend.h @@ -0,0 +1,32 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef OPENMETEOBACKEND_H +#define OPENMETEOBACKEND_H + +#include "providerbackend.h" + +QT_BEGIN_NAMESPACE +class QNetworkAccessManager; +class QNetworkReply; +QT_END_NAMESPACE + +class OpenMeteoBackend : public ProviderBackend +{ + Q_OBJECT +public: + explicit OpenMeteoBackend(QObject *parent = nullptr); + + void requestWeatherInfo(const QString &city) override; + void requestWeatherInfo(const QGeoCoordinate &coordinate) override; + +private slots: + void handleWeatherForecastReply(QNetworkReply *reply, const LocationInfo &location); + +private: + void generateWeatherRequest(const QString &city, const QGeoCoordinate &coordinate); + + QNetworkAccessManager *m_networkManager; +}; + +#endif // OPENMETEOBACKEND_H diff --git a/examples/positioning/weatherinfo/openweathermapbackend.cpp b/examples/positioning/weatherinfo/openweathermapbackend.cpp new file mode 100644 index 0000000..5d3ca07 --- /dev/null +++ b/examples/positioning/weatherinfo/openweathermapbackend.cpp @@ -0,0 +1,218 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "openweathermapbackend.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Q_DECLARE_LOGGING_CATEGORY(requestsLog) + +static constexpr auto kZeroKelvin = 273.15; + +static QString niceTemperatureString(double t) +{ + return QString::number(qRound(t - kZeroKelvin)) + QChar(0xB0); +} + +/* + Converts weather code to a string that will be used to show the icon. + The possible strings are based on the icon names. The icon name is built up + as follows: + weather-[mystring].png + where [mystring] is the value returned by this method. + Check resources for the full list of available icons. +*/ +static QString weatherCodeToString(const QString &code) +{ + if (code == u"01d" || code == u"01n") + return "sunny"; + else if (code == u"02d" || code == u"02n") + return "sunny-very-few-clouds"; + else if (code == u"03d" || code == u"03n") + return "few-clouds"; + else if (code == u"04d" || code == u"04n") + return "overcast"; + else if (code == u"09d" || code == u"09n" || code == u"10d" || code == u"10n") + return "showers"; + else if (code == u"11d" || code == u"11n") + return "thundershower"; + else if (code == u"13d" || code == u"13n") + return "snow"; + else if (code == u"50d" || code == u"50n") + return "fog"; + + return "sunny"; // default choice +} + +static void parseWeatherDescription(const QJsonObject &object, WeatherInfo &info) +{ + const QJsonArray weatherArray = object.value(u"weather").toArray(); + if (!weatherArray.isEmpty()) { + const QJsonObject obj = weatherArray.first().toObject(); + info.m_weatherDescription = obj.value(u"description").toString(); + info.m_weatherIconId = weatherCodeToString(obj.value(u"icon").toString()); + } else { + qCDebug(requestsLog, "An empty weather array is returned."); + } +} + +OpenWeatherMapBackend::OpenWeatherMapBackend(QObject *parent) + : ProviderBackend(parent), + m_networkManager(new QNetworkAccessManager(this)), + m_appId(QStringLiteral("36496bad1955bf3365448965a42b9eac")) +{ +} + +void OpenWeatherMapBackend::requestWeatherInfo(const QString &city) +{ + QUrlQuery query; + query.addQueryItem(QStringLiteral("q"), city); + + requestCurrentWeather(query, QGeoCoordinate()); +} + +void OpenWeatherMapBackend::requestWeatherInfo(const QGeoCoordinate &coordinate) +{ + QUrlQuery query; + query.addQueryItem(QStringLiteral("lat"), QString::number(coordinate.latitude())); + query.addQueryItem(QStringLiteral("lon"), QString::number(coordinate.longitude())); + + requestCurrentWeather(query, coordinate); +} + +void OpenWeatherMapBackend::handleCurrentWeatherReply(QNetworkReply *reply, + const QGeoCoordinate &coordinate) +{ + if (!reply) { + emit errorOccurred(); + return; + } + bool parsed = false; + if (!reply->error()) { + // extract info about current weather + const QJsonDocument document = QJsonDocument::fromJson(reply->readAll()); + const QJsonObject documentObject = document.object(); + + LocationInfo currentLocation; + currentLocation.m_name = documentObject.value(u"name").toString(); + if (coordinate.isValid()) + currentLocation.m_coordinate = coordinate; + qCDebug(requestsLog) << "Got current weather for" << currentLocation.m_name; + + WeatherInfo currentWeather; + + parseWeatherDescription(documentObject, currentWeather); + + const QJsonObject mainObject = documentObject.value(u"main").toObject(); + const QJsonValue tempValue = mainObject.value(u"temp"); + if (tempValue.isDouble()) + currentWeather.m_temperature = niceTemperatureString(tempValue.toDouble()); + else + qCDebug(requestsLog, "Failed to parse current temperature."); + + parsed = !currentLocation.m_name.isEmpty() && !currentWeather.m_temperature.isEmpty(); + + if (parsed) { + // request forecast + requestWeatherForecast(currentLocation, currentWeather); + } + } + if (!parsed) { + emit errorOccurred(); + if (reply->error()) + qCDebug(requestsLog) << reply->errorString(); + else + qCDebug(requestsLog, "Failed to parse current weather JSON."); + } + + reply->deleteLater(); +} + +void OpenWeatherMapBackend::handleWeatherForecastReply(QNetworkReply *reply, + const LocationInfo &location, + const WeatherInfo ¤tWeather) +{ + if (!reply) { + emit errorOccurred(); + return; + } + if (!reply->error()) { + QJsonDocument document = QJsonDocument::fromJson(reply->readAll()); + const QJsonObject documentObject = document.object(); + + QList weatherDetails; + // current weather will be the first in the list + weatherDetails << currentWeather; + + QJsonArray daysList = documentObject.value(u"list").toArray(); + // include current day as well + for (qsizetype i = 0; i < daysList.size(); ++i) { + QJsonObject dayObject = daysList.at(i).toObject(); + WeatherInfo info; + + const QDateTime dt = QDateTime::fromSecsSinceEpoch(dayObject.value(u"dt").toInteger()); + info.m_dayOfWeek = dt.toString(u"ddd"); + + const QJsonObject tempObject = dayObject.value(u"temp").toObject(); + + const QJsonValue minTemp = tempObject.value(u"min"); + const QJsonValue maxTemp = tempObject.value(u"max"); + if (minTemp.isDouble() && maxTemp.isDouble()) { + info.m_temperature = niceTemperatureString(minTemp.toDouble()) + QChar('/') + + niceTemperatureString(maxTemp.toDouble()); + } else { + qCDebug(requestsLog, "Failed to parse min or max temperature."); + } + + parseWeatherDescription(dayObject, info); + + if (!info.m_temperature.isEmpty() && !info.m_weatherIconId.isEmpty()) + weatherDetails.push_back(info); + } + + emit weatherInformation(location, weatherDetails); + } else { + emit errorOccurred(); + qCDebug(requestsLog) << reply->errorString(); + } + + reply->deleteLater(); +} + +void OpenWeatherMapBackend::requestCurrentWeather(QUrlQuery &query, + const QGeoCoordinate &coordinate) +{ + QUrl url("http://api.openweathermap.org/data/2.5/weather"); + query.addQueryItem(QStringLiteral("mode"), QStringLiteral("json")); + query.addQueryItem(QStringLiteral("APPID"), m_appId); + url.setQuery(query); + + QNetworkReply *reply = m_networkManager->get(QNetworkRequest(url)); + connect(reply, &QNetworkReply::finished, this, + [this, reply, coordinate]() { handleCurrentWeatherReply(reply, coordinate); }); +} + +void OpenWeatherMapBackend::requestWeatherForecast(const LocationInfo &location, + const WeatherInfo ¤tWeather) +{ + QUrl url("http://api.openweathermap.org/data/2.5/forecast/daily"); + QUrlQuery query; + query.addQueryItem(QStringLiteral("q"), location.m_name); + query.addQueryItem(QStringLiteral("mode"), QStringLiteral("json")); + query.addQueryItem(QStringLiteral("cnt"), QStringLiteral("4")); + query.addQueryItem(QStringLiteral("APPID"), m_appId); + url.setQuery(query); + + QNetworkReply *reply = m_networkManager->get(QNetworkRequest(url)); + connect(reply, &QNetworkReply::finished, this, [this, reply, location, currentWeather]() { + handleWeatherForecastReply(reply, location, currentWeather); + }); +} diff --git a/examples/positioning/weatherinfo/openweathermapbackend.h b/examples/positioning/weatherinfo/openweathermapbackend.h new file mode 100644 index 0000000..eb25962 --- /dev/null +++ b/examples/positioning/weatherinfo/openweathermapbackend.h @@ -0,0 +1,38 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef OPENWEATHERMAPBACKEND_H +#define OPENWEATHERMAPBACKEND_H + +#include "providerbackend.h" + +QT_BEGIN_NAMESPACE +class QNetworkAccessManager; +class QNetworkReply; +class QUrlQuery; +QT_END_NAMESPACE + +class OpenWeatherMapBackend : public ProviderBackend +{ + Q_OBJECT +public: + explicit OpenWeatherMapBackend(QObject *parent = nullptr); + ~OpenWeatherMapBackend() = default; + + void requestWeatherInfo(const QString &city) override; + void requestWeatherInfo(const QGeoCoordinate &coordinate) override; + +private slots: + void handleCurrentWeatherReply(QNetworkReply *reply, const QGeoCoordinate &coordinate); + void handleWeatherForecastReply(QNetworkReply *reply, const LocationInfo &location, + const WeatherInfo ¤tWeather); + +private: + void requestCurrentWeather(QUrlQuery &query, const QGeoCoordinate &coordinate); + void requestWeatherForecast(const LocationInfo &location, const WeatherInfo ¤tWeather); + + QNetworkAccessManager *m_networkManager; + const QString m_appId; +}; + +#endif // OPENWEATHERMAPBACKEND_H diff --git a/examples/positioning/weatherinfo/providerbackend.cpp b/examples/positioning/weatherinfo/providerbackend.cpp new file mode 100644 index 0000000..0a2a8df --- /dev/null +++ b/examples/positioning/weatherinfo/providerbackend.cpp @@ -0,0 +1,6 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "providerbackend.h" + +ProviderBackend::ProviderBackend(QObject *parent) : QObject(parent) { } diff --git a/examples/positioning/weatherinfo/providerbackend.h b/examples/positioning/weatherinfo/providerbackend.h new file mode 100644 index 0000000..d3a2762 --- /dev/null +++ b/examples/positioning/weatherinfo/providerbackend.h @@ -0,0 +1,43 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef PROVIDERBACKEND_H +#define PROVIDERBACKEND_H + +#include +#include + +struct WeatherInfo +{ + QString m_dayOfWeek; + QString m_weatherIconId; + QString m_weatherDescription; + QString m_temperature; +}; + +struct LocationInfo +{ + QString m_name; + QGeoCoordinate m_coordinate; +}; + +class ProviderBackend : public QObject +{ + Q_OBJECT +public: + explicit ProviderBackend(QObject *parent = nullptr); + + virtual void requestWeatherInfo(const QString &city) = 0; + virtual void requestWeatherInfo(const QGeoCoordinate &coordinate) = 0; + +signals: + // The first element in weatherDetails represents current weather. + // Next are the weather forecast, including the current day. + // The LocationInfo object should contain valid coordinate only when it was + // initially used to request the weather. If the city name was used, an + // empty coordinate is expected to be transferred. + void weatherInformation(const LocationInfo &location, const QList &weatherDetails); + void errorOccurred(); +}; + +#endif // PROVIDERBACKEND_H diff --git a/examples/positioning/weatherinfo/qmldir b/examples/positioning/weatherinfo/qmldir new file mode 100644 index 0000000..36f15e7 --- /dev/null +++ b/examples/positioning/weatherinfo/qmldir @@ -0,0 +1,6 @@ +module Weather +prefer :/qt/qml/Weather/ +WeatherInfo 1.0 WeatherInfo.qml +BigForecastIcon 1.0 BigForecastIcon.qml +ForecastIcon 1.0 ForecastIcon.qml +WeatherIcon 1.0 WeatherIcon.qml diff --git a/examples/positioning/weatherinfo/weatherapibackend.cpp b/examples/positioning/weatherinfo/weatherapibackend.cpp new file mode 100644 index 0000000..ff4eaa5 --- /dev/null +++ b/examples/positioning/weatherinfo/weatherapibackend.cpp @@ -0,0 +1,220 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "weatherapibackend.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Q_DECLARE_LOGGING_CATEGORY(requestsLog) + +static QString niceTemperatureString(double t) +{ + return QString::number(qRound(t)) + QChar(0xB0); +} + +/* + Converts weather code to a string that will be used to show the icon. + The possible strings are based on the icon names. The icon name is built up + as follows: + weather-[mystring].png + where [mystring] is the value returned by this method. + Check resources for the full list of available icons. +*/ +static QString weatherCodeToString(int code) +{ + switch (code) { + case 1000: + return "sunny"; + case 1003: + return "sunny-very-few-clouds"; + case 1006: + return "few-clouds"; + case 1009: + return "overcast"; + case 1030: + case 1135: + case 1147: + return "fog"; + case 1063: + case 1072: + case 1150: + case 1153: + case 1168: + case 1171: + case 1180: + case 1183: + case 1186: + case 1189: + case 1198: + return "showers-scattered"; + case 1066: + case 1069: + case 1114: + case 1117: + case 1210: + case 1213: + case 1216: + case 1219: + case 1222: + case 1225: + case 1237: + case 1255: + case 1258: + case 1261: + case 1264: + case 1279: + case 1282: + return "snow"; + case 1087: + return "storm"; + case 1192: + case 1195: + case 1201: + case 1240: + case 1243: + case 1246: + return "showers"; + case 1204: + case 1207: + case 1249: + case 1252: + return "sleet"; + case 1273: + case 1276: + return "thundershower"; + default: + return "sunny"; + } + + return "sunny"; // default choice +} + +static void parseWeatherDescription(const QJsonObject &object, WeatherInfo &info) +{ + const QJsonObject conditionObject = object.value(u"condition").toObject(); + info.m_weatherDescription = conditionObject.value(u"text").toString(); + info.m_weatherIconId = weatherCodeToString(conditionObject.value(u"code").toInt()); +} + +WeatherApiBackend::WeatherApiBackend(QObject *parent) + : ProviderBackend(parent), + m_networkManager(new QNetworkAccessManager(this)), + m_apiKey(QStringLiteral("8edde160c63c4be6b77101828211208")) +{ +} + +void WeatherApiBackend::requestWeatherInfo(const QString &city) +{ + generateWeatherRequest(city, QGeoCoordinate()); +} + +void WeatherApiBackend::requestWeatherInfo(const QGeoCoordinate &coordinate) +{ + const QString coordinateStr = + QString("%1,%2").arg(coordinate.latitude()).arg(coordinate.longitude()); + generateWeatherRequest(coordinateStr, coordinate); +} + +void WeatherApiBackend::handleWeatherForecastReply(QNetworkReply *reply, + const QGeoCoordinate &coordinate) +{ + if (!reply) { + emit errorOccurred(); + return; + } + bool parsed = false; + if (!reply->error()) { + QJsonDocument document = QJsonDocument::fromJson(reply->readAll()); + const QJsonObject documentObject = document.object(); + const QJsonObject locationObject = documentObject.value(u"location").toObject(); + + // extract location name + LocationInfo location; + location.m_name = locationObject.value(u"name").toString(); + if (coordinate.isValid()) + location.m_coordinate = coordinate; + qCDebug(requestsLog) << "Got weather for" << location.m_name; + + // extract current weather + WeatherInfo currentWeather; + + const QJsonObject currentWeatherObject = documentObject.value(u"current").toObject(); + const QJsonValue temperature = currentWeatherObject.value(u"temp_c"); + if (temperature.isDouble()) + currentWeather.m_temperature = niceTemperatureString(temperature.toDouble()); + + parseWeatherDescription(currentWeatherObject, currentWeather); + + parsed = !location.m_name.isEmpty() && !currentWeather.m_temperature.isEmpty(); + + if (parsed) { + QList weatherDetails; + weatherDetails << currentWeather; + + // extract forecast details + const QJsonObject forecastObject = documentObject.value(u"forecast").toObject(); + const QJsonArray forecastDays = forecastObject.value(u"forecastday").toArray(); + for (qsizetype i = 0; i < forecastDays.size(); ++i) { + const QJsonObject dayInfo = forecastDays.at(i).toObject(); + WeatherInfo info; + + const QDateTime dt = + QDateTime::fromSecsSinceEpoch(dayInfo.value(u"date_epoch").toInteger()); + info.m_dayOfWeek = dt.toString(u"ddd"); + + const QJsonObject dayObject = dayInfo.value(u"day").toObject(); + const QJsonValue minTemp = dayObject.value(u"mintemp_c"); + const QJsonValue maxTemp = dayObject.value(u"maxtemp_c"); + if (minTemp.isDouble() && maxTemp.isDouble()) { + info.m_temperature = niceTemperatureString(minTemp.toDouble()) + QChar('/') + + niceTemperatureString(maxTemp.toDouble()); + } else { + qCDebug(requestsLog, "Failed to parse min or max temperature."); + } + + parseWeatherDescription(dayObject, info); + + if (!info.m_temperature.isEmpty() && !info.m_weatherIconId.isEmpty()) + weatherDetails.push_back(info); + } + + emit weatherInformation(location, weatherDetails); + } + } + if (!parsed) { + emit errorOccurred(); + if (reply->error()) + qCDebug(requestsLog) << reply->errorString(); + else + qCDebug(requestsLog, "Failed to parse weather JSON."); + } + + reply->deleteLater(); +} + +void WeatherApiBackend::generateWeatherRequest(const QString &locationString, + const QGeoCoordinate &coordinate) +{ + QUrl url("https://api.weatherapi.com/v1/forecast.json"); + + QUrlQuery query; + query.addQueryItem(QStringLiteral("key"), m_apiKey); + query.addQueryItem(QStringLiteral("q"), locationString); + query.addQueryItem(QStringLiteral("days"), QStringLiteral("4")); + query.addQueryItem(QStringLiteral("aqi"), QStringLiteral("no")); + query.addQueryItem(QStringLiteral("alerts"), QStringLiteral("no")); + + url.setQuery(query); + + QNetworkReply *reply = m_networkManager->get(QNetworkRequest(url)); + connect(reply, &QNetworkReply::finished, this, + [this, reply, coordinate]() { handleWeatherForecastReply(reply, coordinate); }); +} diff --git a/examples/positioning/weatherinfo/weatherapibackend.h b/examples/positioning/weatherinfo/weatherapibackend.h new file mode 100644 index 0000000..b0d2a58 --- /dev/null +++ b/examples/positioning/weatherinfo/weatherapibackend.h @@ -0,0 +1,33 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef WEATHERAPIBACKEND_H +#define WEATHERAPIBACKEND_H + +#include "providerbackend.h" + +QT_BEGIN_NAMESPACE +class QNetworkAccessManager; +class QNetworkReply; +QT_END_NAMESPACE + +class WeatherApiBackend : public ProviderBackend +{ + Q_OBJECT +public: + explicit WeatherApiBackend(QObject *parent = nullptr); + + void requestWeatherInfo(const QString &city) override; + void requestWeatherInfo(const QGeoCoordinate &coordinate) override; + +private slots: + void handleWeatherForecastReply(QNetworkReply *reply, const QGeoCoordinate &coordinate); + +private: + void generateWeatherRequest(const QString &locationString, const QGeoCoordinate &coordinate); + + QNetworkAccessManager *m_networkManager; + const QString m_apiKey; +}; + +#endif // WEATHERAPIBACKEND_H diff --git a/examples/positioning/weatherinfo/weatherinfo.pro b/examples/positioning/weatherinfo/weatherinfo.pro new file mode 100644 index 0000000..6ad0d5a --- /dev/null +++ b/examples/positioning/weatherinfo/weatherinfo.pro @@ -0,0 +1,58 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +TEMPLATE = app +TARGET = weatherinfo + +QT += core network positioning qml quick + +CONFIG += qmltypes +QML_IMPORT_NAME = Weather +QML_IMPORT_MAJOR_VERSION = 1 + +SOURCES += main.cpp \ + appmodel.cpp \ + openmeteobackend.cpp \ + openweathermapbackend.cpp \ + providerbackend.cpp \ + weatherapibackend.cpp + +HEADERS += appmodel.h \ + openmeteobackend.h \ + openweathermapbackend.h \ + providerbackend.h \ + weatherapibackend.h + +qml_resources.files = \ + qmldir \ + BigForecastIcon.qml \ + ForecastIcon.qml \ + WeatherIcon.qml \ + WeatherInfo.qml \ + icons/weather-few-clouds.svg \ + icons/weather-fog.svg \ + icons/weather-haze.svg \ + icons/weather-icy.svg \ + icons/weather-overcast.svg \ + icons/weather-showers.svg \ + icons/weather-showers-scattered.svg \ + icons/weather-sleet.svg \ + icons/weather-snow.svg \ + icons/weather-storm.svg \ + icons/weather-sunny-very-few-clouds.svg \ + icons/weather-sunny.svg \ + icons/weather-thundershower.svg \ + icons/waypoint.svg + +qml_resources.prefix = /qt/qml/Weather + +RESOURCES += qml_resources + +ios: QMAKE_INFO_PLIST = ../shared/Info.qmake.ios.plist +macos: QMAKE_INFO_PLIST = ../shared/Info.qmake.macos.plist + +target.path = $$[QT_INSTALL_EXAMPLES]/positioning/weatherinfo +INSTALLS += target + +# Sign the app for location permissions to work properly +macos:!macx-xcode: QMAKE_POST_LINK += codesign -s - weatherinfo.app diff --git a/src/3rdparty/clip2tri/CMakeLists.txt b/src/3rdparty/clip2tri/CMakeLists.txt new file mode 100644 index 0000000..9b5a56b --- /dev/null +++ b/src/3rdparty/clip2tri/CMakeLists.txt @@ -0,0 +1,31 @@ +# Generated from clip2tri.pro. + +##################################################################### +## Bundled_Clip2Tri Generic Library: +##################################################################### + +qt_internal_add_3rdparty_library(Bundled_Clip2Tri + QMAKE_LIB_NAME _clip2tri + STATIC + SKIP_AUTOMOC # special case + EXCEPTIONS + SOURCES + clip2tri.cpp clip2tri.h + INCLUDE_DIRECTORIES + ../clipper + ../poly2tri + LIBRARIES + Qt::Bundled_Clipper # special case + Qt::Bundled_Poly2Tri # special case +) +qt_disable_warnings(Bundled_Clip2Tri) +qt_set_symbol_visibility_hidden(Bundled_Clip2Tri) + +## Scopes: +##################################################################### + +#### Keys ignored in scope 3:.:.:clip2tri.pro:GCC: +# QMAKE_CFLAGS_OPTIMIZE_FULL = "-ffast-math" + +#### Keys ignored in scope 4:.:.:clip2tri.pro:NOT CLANG AND NOT ICC AND NOT rim_qcc: +# QMAKE_CXXFLAGS_WARN_ON = "-Wno-error=return-type" diff --git a/src/3rdparty/clip2tri/LICENSE b/src/3rdparty/clip2tri/LICENSE new file mode 100644 index 0000000..9d99b88 --- /dev/null +++ b/src/3rdparty/clip2tri/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Bitfighter developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/3rdparty/clip2tri/clip2tri.cpp b/src/3rdparty/clip2tri/clip2tri.cpp new file mode 100644 index 0000000..db4911c --- /dev/null +++ b/src/3rdparty/clip2tri/clip2tri.cpp @@ -0,0 +1,406 @@ +/* + * Authors: kaen, raptor, sam686, watusimoto + * + * Originally from the bitfighter source code + * + * The MIT License (MIT) + * + * Copyright (c) 2014 Bitfighter developers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "clip2tri.h" +#include + +#include + +static const double clipperScaleFactor = 1073741822.0; +static const double clipperScaleFactorInv = 1.0 / 1073741822.0; + +using namespace p2t; + +namespace c2t +{ + + +static const F32 CLIPPER_SCALE_FACT = 1000.0f; +static const F32 CLIPPER_SCALE_FACT_INVERSE = 0.001f; + +///////////////////////////////// + +Point::Point() +{ + x = 0; + y = 0; +} + +Point::Point(const Point& pt) +{ + x = pt.x; + y = pt.y; +} + + +///////////////////////////////// + +clip2tri::clip2tri() : openSubject(false) +{ + // Do nothing! +} + +clip2tri::~clip2tri() +{ + // Do nothing! +} + + +void clip2tri::triangulate(const vector > &inputPolygons, vector &outputTriangles, + const vector &boundingPolygon) +{ + // Use clipper to clean. This upscales the floating point input + PolyTree solution; + mergePolysToPolyTree(inputPolygons, solution); + + Path bounds = upscaleClipperPoints(boundingPolygon); + + // This will downscale the Clipper output and use poly2tri to triangulate + triangulateComplex(outputTriangles, bounds, solution); +} + +void clip2tri::addClipPolygon(const Path &path) +{ + try // prevent any exception to spill into Qt + { + clipper.AddPath(path, ptClip, true); + } + catch(QtClipperLib::clipperException &e) + { + printf("addClipPolygon: %s\n", e.what()); + } +} + +void clip2tri::addSubjectPath(const Path &path, bool closed) +{ + try // prevent any exception to spill into Qt + { + clipper.AddPath(path, ptSubject, closed); + } + catch(QtClipperLib::clipperException &e) + { + printf("addSubjectPath: %s\n", e.what()); + return; + } + if (!closed) + openSubject = true; +} + +void clip2tri::clearClipper() +{ + // clear doesn't throw + clipper.Clear(); + openSubject = false; +} + +static QtClipperLib::ClipType operation(const clip2tri::Operation &op) +{ + switch (op) { + case clip2tri::Intersection: + return QtClipperLib::ctIntersection; + case clip2tri::Union: + return QtClipperLib::ctUnion; + case clip2tri::Difference: + return QtClipperLib::ctDifference; + case clip2tri::Xor: + return QtClipperLib::ctXor; + } + return ctIntersection; +} + +static std::string operationName(const clip2tri::Operation &op) +{ + switch (op) { + case clip2tri::Intersection: + return std::string("Intersection"); + case clip2tri::Union: + return std::string("Union"); + case clip2tri::Difference: + return std::string("Difference"); + case clip2tri::Xor: + return std::string("Xor"); + } + return std::string("Intersection"); +} + +Paths clip2tri::execute(const clip2tri::Operation op, const PolyFillType subjFillType, const PolyFillType clipFillType) +{ + Paths solution; + try // prevent any exception from spilling into Qt + { + if (!openSubject) { + clipper.Execute(operation(op), solution, subjFillType, clipFillType); + } else { + PolyTree res; + clipper.Execute(operation(op), res, subjFillType, clipFillType); + PolyNode *n = res.GetFirst(); + if (n) { + solution.push_back(n->Contour); + while ((n = n->GetNext())) + solution.push_back(n->Contour); + } + } + } + catch(QtClipperLib::clipperException &e) + { + printf("executing %s: %s\n", operationName(op).c_str(), e.what()); + } + return solution; +} + +int clip2tri::pointInPolygon(const IntPoint &pt, const Path &path) +{ + return PointInPolygon(pt, path); +} + +Path clip2tri::upscaleClipperPoints(const vector &inputPolygon) +{ + Path outputPolygon; + outputPolygon.resize(inputPolygon.size()); + + for(S32 i = 0; i < inputPolygon.size(); i++) + outputPolygon[i] = IntPoint(S64(inputPolygon[i].x * CLIPPER_SCALE_FACT), S64(inputPolygon[i].y * CLIPPER_SCALE_FACT)); + + return outputPolygon; +} + + +Paths clip2tri::upscaleClipperPoints(const vector > &inputPolygons) +{ + Paths outputPolygons; + + outputPolygons.resize(inputPolygons.size()); + + for(S32 i = 0; i < inputPolygons.size(); i++) + { + outputPolygons[i].resize(inputPolygons[i].size()); + + for(S32 j = 0; j < inputPolygons[i].size(); j++) + outputPolygons[i][j] = IntPoint(S64(inputPolygons[i][j].x * CLIPPER_SCALE_FACT), S64(inputPolygons[i][j].y * CLIPPER_SCALE_FACT)); + } + + return outputPolygons; +} + + +vector > clip2tri::downscaleClipperPoints(const Paths &inputPolygons) +{ + vector > outputPolygons; + + outputPolygons.resize(inputPolygons.size()); + + for(U32 i = 0; i < inputPolygons.size(); i++) + { + outputPolygons[i].resize(inputPolygons[i].size()); + + for(U32 j = 0; j < inputPolygons[i].size(); j++) + outputPolygons[i][j] = Point(F32(inputPolygons[i][j].X) * CLIPPER_SCALE_FACT_INVERSE, F32(inputPolygons[i][j].Y) * CLIPPER_SCALE_FACT_INVERSE); + } + + return outputPolygons; +} + + +// Use Clipper to merge inputPolygons, placing the result in a Polytree +// NOTE: this does NOT downscale the Clipper points. You must do this afterwards +// +// Here you add all your non-navigatable objects (e.g. walls, barriers, etc.) +bool clip2tri::mergePolysToPolyTree(const vector > &inputPolygons, PolyTree &solution) +{ + Paths input = upscaleClipperPoints(inputPolygons); + + // Fire up clipper and union! + Clipper clipper; + clipper.StrictlySimple(true); + + try // there is a "throw" in AddPolygon + { + clipper.AddPaths(input, ptSubject, true); + } + catch(QtClipperLib::clipperException &e) + { + printf("mergePolysToPolyTree: %s\n", e.what()); + } + + return clipper.Execute(ctUnion, solution, pftNonZero, pftNonZero); +} + + +// Delete all poly2tri points from a vector and clear the vector +static void deleteAndClear(vector &vec) +{ + for(U32 i = 0; i < vec.size(); i++) + delete vec[i]; + + vec.clear(); +} + + +// Shrink large polygons by reducing each coordinate by 1 in the +// general direction of the last point as we wind around +// +// This normally wouldn't work in every case, but our upscaled-by-1000 polygons +// have little chance to create new duplicate points with this method. +// +// For information on why this was needed, see: +// +// https://code.google.com/p/poly2tri/issues/detail?id=90 +// +static void edgeShrink(Path &path) +{ + U32 prev = path.size() - 1; + for(U32 i = 0; i < path.size(); i++) + { + // Adjust coordinate by 1 depending on the direction + path[i].X - path[prev].X > 0 ? path[i].X-- : path[i].X++; + path[i].Y - path[prev].Y > 0 ? path[i].Y-- : path[i].Y++; + + prev = i; + } +} + + +// This uses poly2tri to triangulate. poly2tri isn't very robust so clipper needs to do +// the cleaning of points before getting here. +// +// A tree structure of polygons is required for doing complex polygons-within-polygons. +// For reference discussion on how this started to be developed, see here: +// +// https://code.google.com/p/poly2tri/issues/detail?id=74 +// +// For assistance with a special case crash, see this utility: +// http://javascript.poly2tri.googlecode.com/hg/index.html +// +// FIXME: what is ignoreFills and ignoreHoles for? kaen? +bool clip2tri::triangulateComplex(vector &outputTriangles, const Path &outline, + const PolyTree &polyTree, bool ignoreFills, bool ignoreHoles) +{ + // Keep track of memory for all the poly2tri objects we create + vector cdtRegistry; + vector > holesRegistry; + vector > polylinesRegistry; + + + // Let's be tricky and add our outline to the root node (it should have none), it'll be + // our first Clipper hole + PolyNode *rootNode = NULL; + + PolyNode tempNode; + if(polyTree.Total() == 0) // Polytree is empty with no root node, e.g. on an empty level + rootNode = &tempNode; + else + rootNode = polyTree.GetFirst()->Parent; + + rootNode->Contour = outline; + + // Now traverse our polyline nodes and triangulate them with only their children holes + PolyNode *currentNode = rootNode; + while(currentNode != NULL) + { + // A Clipper hole is actually what we want to build zones for; they become our bounding + // polylines. poly2tri holes are therefore the inverse + if((!ignoreHoles && currentNode->IsHole()) || + (!ignoreFills && !currentNode->IsHole())) + { + // Build up this polyline in poly2tri's format (downscale Clipper points) + vector polyline; + for(U32 j = 0; j < currentNode->Contour.size(); j++) + polyline.push_back(new p2t::Point(F64(currentNode->Contour[j].X), F64(currentNode->Contour[j].Y))); + + polylinesRegistry.push_back(polyline); // Memory + + // Set our polyline in poly2tri + p2t::CDT* cdt = new p2t::CDT(polyline); + cdtRegistry.push_back(cdt); + + for(U32 j = 0; j < currentNode->Childs.size(); j++) + { + PolyNode *childNode = currentNode->Childs[j]; + + // Slightly modify the polygon to guarantee no duplicate points + edgeShrink(childNode->Contour); + + vector hole; + for(U32 k = 0; k < childNode->Contour.size(); k++) + hole.push_back(new p2t::Point(F64(childNode->Contour[k].X), F64(childNode->Contour[k].Y))); + + holesRegistry.push_back(hole); // Memory + + // Add the holes for this polyline + cdt->AddHole(hole); + } + + cdt->Triangulate(); + + // Add current output triangles to our total + vector currentOutput = cdt->GetTriangles(); + + // Copy our data to TNL::Point and to our output Vector + p2t::Triangle *currentTriangle; + for(U32 j = 0; j < currentOutput.size(); j++) + { + currentTriangle = currentOutput[j]; + outputTriangles.push_back(Point(currentTriangle->GetPoint(0)->x * CLIPPER_SCALE_FACT_INVERSE, currentTriangle->GetPoint(0)->y * CLIPPER_SCALE_FACT_INVERSE)); + outputTriangles.push_back(Point(currentTriangle->GetPoint(1)->x * CLIPPER_SCALE_FACT_INVERSE, currentTriangle->GetPoint(1)->y * CLIPPER_SCALE_FACT_INVERSE)); + outputTriangles.push_back(Point(currentTriangle->GetPoint(2)->x * CLIPPER_SCALE_FACT_INVERSE, currentTriangle->GetPoint(2)->y * CLIPPER_SCALE_FACT_INVERSE)); + } + } + + currentNode = currentNode->GetNext(); + } + + + // Clean up memory used with poly2tri + // + // Clean-up workers + for(S32 i = 0; i < cdtRegistry.size(); i++) + delete cdtRegistry[i]; + + // Free the polylines + for(S32 i = 0; i < polylinesRegistry.size(); i++) + { + vector polyline = polylinesRegistry[i]; + deleteAndClear(polyline); + } + + // Free the holes + for(S32 i = 0; i < holesRegistry.size(); i++) + { + vector hole = holesRegistry[i]; + deleteAndClear(hole); + } + + // Make sure we have output data + if(outputTriangles.size() == 0) + return false; + + return true; +} + + +} /* namespace c2t */ diff --git a/src/3rdparty/clip2tri/clip2tri.h b/src/3rdparty/clip2tri/clip2tri.h new file mode 100644 index 0000000..3848d00 --- /dev/null +++ b/src/3rdparty/clip2tri/clip2tri.h @@ -0,0 +1,102 @@ +/* + * Authors: kaen, raptor, sam686, watusimoto + * + * Originally from the bitfighter source code + * + * The MIT License (MIT) + * + * Copyright (c) 2014 Bitfighter developers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef CLIP2TRI_H_ +#define CLIP2TRI_H_ + +#include +#include + +using namespace std; +using namespace QtClipperLib; + +namespace c2t +{ + +typedef signed int S32; +typedef signed long long S64; +typedef unsigned int U32; +typedef float F32; +typedef double F64; + + +struct Point +{ + F32 x; + F32 y; + + Point(); + Point(const Point &pt); + + template + Point(T in_x, U in_y) { x = static_cast(in_x); y = static_cast(in_y); } +}; + +class clip2tri +{ +private: + // + Path upscaleClipperPoints(const vector &inputPolygon); + + // These operate on a vector of polygons + Paths upscaleClipperPoints(const vector > &inputPolygons); + vector > downscaleClipperPoints(const Paths &inputPolygons); + + bool mergePolysToPolyTree(const vector > &inputPolygons, PolyTree &solution); + + bool triangulateComplex(vector &outputTriangles, const Path &outline, + const PolyTree &polyTree, bool ignoreFills = true, bool ignoreHoles = false); + +public: + enum Operation { Union, Intersection, Difference, Xor }; + clip2tri(); + virtual ~clip2tri(); + + void triangulate(const vector > &inputPolygons, vector &outputTriangles, + const vector &boundingPolygon); + + // Clip polygons are intended as closed, even if the first and last vertex aren't the same. + void addClipPolygon(const Path &path); + // Closed means the path has to be effectively closed. Meaning path[0] == path[path.size()-1] + void addSubjectPath(const Path &path, bool closed); + + void clearClipper(); + + Paths execute(const Operation op, + const PolyFillType subjFillType = pftNonZero, + const PolyFillType clipFillType = pftNonZero); + + static int pointInPolygon(const IntPoint &pt, const Path &path); + + Clipper clipper; + bool openSubject; +}; + +} /* namespace c2t */ + +#endif /* CLIP2TRI_H_ */ diff --git a/src/3rdparty/clip2tri/qt_attribution.json b/src/3rdparty/clip2tri/qt_attribution.json new file mode 100644 index 0000000..a4a1f18 --- /dev/null +++ b/src/3rdparty/clip2tri/qt_attribution.json @@ -0,0 +1,13 @@ +{ + "Id": "clip2tri", + "Name": "Clip2Tri Polygon Triangulation Library", + "QDocModule": "qtpositioning", + "QtUsage": "Used in the QML plugin of Qt Location and in Qt Positioning.", + + "Description": "Clip2Tri can be used together with Clipper for robust triangulation.", + "Homepage": "https://github.com/raptor/clip2tri", + "LicenseId": "MIT", + "License": "MIT License", + "LicenseFile": "LICENSE", + "Copyright": "Copyright (c) 2014 Bitfighter developers" +} diff --git a/src/3rdparty/clipper/CMakeLists.txt b/src/3rdparty/clipper/CMakeLists.txt new file mode 100644 index 0000000..08f2fad --- /dev/null +++ b/src/3rdparty/clipper/CMakeLists.txt @@ -0,0 +1,25 @@ +# Generated from clipper.pro. + +##################################################################### +## Bundled_Clipper Generic Library: +##################################################################### + +qt_internal_add_3rdparty_library(Bundled_Clipper + QMAKE_LIB_NAME _clipper + STATIC + SKIP_AUTOMOC # special case + EXCEPTIONS + SOURCES + clipper.cpp clipper.h +) +qt_disable_warnings(Bundled_Clipper) +qt_set_symbol_visibility_hidden(Bundled_Clipper) + +## Scopes: +##################################################################### + +#### Keys ignored in scope 3:.:.:clipper.pro:GCC: +# QMAKE_CFLAGS_OPTIMIZE_FULL = "-ffast-math" + +#### Keys ignored in scope 4:.:.:clipper.pro:NOT CLANG AND NOT ICC AND NOT rim_qcc: +# QMAKE_CXXFLAGS_WARN_ON = "-Wno-error=return-type" diff --git a/src/3rdparty/clipper/LICENSE b/src/3rdparty/clipper/LICENSE new file mode 100644 index 0000000..2213e37 --- /dev/null +++ b/src/3rdparty/clipper/LICENSE @@ -0,0 +1,48 @@ +Use, modification & distribution is subject to Boost Software License Ver 1. +http://www.boost.org/LICENSE_1_0.txt + +Attributions: +The code in this library is an extension of Bala Vatti's clipping algorithm: +"A generic solution to polygon clipping" +Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. +http://portal.acm.org/citation.cfm?id=129906 + +Computer graphics and geometric modeling: implementation and algorithms +By Max K. Agoston +Springer; 1 edition (January 4, 2005) +http://books.google.com/books?q=vatti+clipping+agoston + +See also: +"Polygon Offsetting by Computing Winding Numbers" +Paper no. DETC2005-85513 pp. 565-575 +ASME 2005 International Design Engineering Technical Conferences +and Computers and Information in Engineering Conference (IDETC/CIE2005) +September 24-28, 2005 , Long Beach, California, USA +http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf + + + +Boost Software License - Version 1.0 - August 17th, 2003 +http://www.boost.org/LICENSE_1_0.txt + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/src/3rdparty/clipper/clipper.cpp b/src/3rdparty/clipper/clipper.cpp new file mode 100644 index 0000000..d973564 --- /dev/null +++ b/src/3rdparty/clipper/clipper.cpp @@ -0,0 +1,4629 @@ +/******************************************************************************* +* * +* Author : Angus Johnson * +* Version : 6.4.2 * +* Date : 27 February 2017 * +* Website : http://www.angusj.com * +* Copyright : Angus Johnson 2010-2017 * +* * +* License: * +* Use, modification & distribution is subject to Boost Software License Ver 1. * +* http://www.boost.org/LICENSE_1_0.txt * +* * +* Attributions: * +* The code in this library is an extension of Bala Vatti's clipping algorithm: * +* "A generic solution to polygon clipping" * +* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * +* http://portal.acm.org/citation.cfm?id=129906 * +* * +* Computer graphics and geometric modeling: implementation and algorithms * +* By Max K. Agoston * +* Springer; 1 edition (January 4, 2005) * +* http://books.google.com/books?q=vatti+clipping+agoston * +* * +* See also: * +* "Polygon Offsetting by Computing Winding Numbers" * +* Paper no. DETC2005-85513 pp. 565-575 * +* ASME 2005 International Design Engineering Technical Conferences * +* and Computers and Information in Engineering Conference (IDETC/CIE2005) * +* September 24-28, 2005 , Long Beach, California, USA * +* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * +* * +*******************************************************************************/ + +/******************************************************************************* +* * +* This is a translation of the Delphi Clipper library and the naming style * +* used has retained a Delphi flavour. * +* * +*******************************************************************************/ + +#include "clipper.h" +#include +#include +#include +#include +#include +#include +#include +#include + +namespace QtClipperLib { + +static double const pi = 3.141592653589793238; +static double const two_pi = pi *2; +static double const def_arc_tolerance = 0.25; + +enum Direction { dRightToLeft, dLeftToRight }; + +static int const Unassigned = -1; //edge not currently 'owning' a solution +static int const Skip = -2; //edge that would otherwise close a path + +#define HORIZONTAL (-1.0E+40) +#define TOLERANCE (1.0e-20) +#define NEAR_ZERO(val) (((val) > -TOLERANCE) && ((val) < TOLERANCE)) + +struct TEdge { + IntPoint Bot; + IntPoint Curr; //current (updated for every new scanbeam) + IntPoint Top; + double Dx; + PolyType PolyTyp; + EdgeSide Side; //side only refers to current side of solution poly + int WindDelta; //1 or -1 depending on winding direction + int WindCnt; + int WindCnt2; //winding count of the opposite polytype + int OutIdx; + TEdge *Next; + TEdge *Prev; + TEdge *NextInLML; + TEdge *NextInAEL; + TEdge *PrevInAEL; + TEdge *NextInSEL; + TEdge *PrevInSEL; +}; + +struct IntersectNode { + TEdge *Edge1; + TEdge *Edge2; + IntPoint Pt; +}; + +struct LocalMinimum { + cInt Y; + TEdge *LeftBound; + TEdge *RightBound; +}; + +struct OutPt; + +//OutRec: contains a path in the clipping solution. Edges in the AEL will +//carry a pointer to an OutRec when they are part of the clipping solution. +struct OutRec { + int Idx; + bool IsHole; + bool IsOpen; + OutRec *FirstLeft; //see comments in clipper.pas + PolyNode *PolyNd; + OutPt *Pts; + OutPt *BottomPt; +}; + +struct OutPt { + int Idx; + IntPoint Pt; + OutPt *Next; + OutPt *Prev; +}; + +struct Join { + OutPt *OutPt1; + OutPt *OutPt2; + IntPoint OffPt; +}; + +struct LocMinSorter +{ + inline bool operator()(const LocalMinimum& locMin1, const LocalMinimum& locMin2) + { + return locMin2.Y < locMin1.Y; + } +}; + +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ + +inline cInt Round(double val) +{ + if ((val < 0)) return static_cast(val - 0.5); + else return static_cast(val + 0.5); +} +//------------------------------------------------------------------------------ + +inline cInt Abs(cInt val) +{ + return val < 0 ? -val : val; +} + +//------------------------------------------------------------------------------ +// PolyTree methods ... +//------------------------------------------------------------------------------ + +void PolyTree::Clear() +{ + for (PolyNodes::size_type i = 0; i < AllNodes.size(); ++i) + delete AllNodes[i]; + AllNodes.resize(0); + Childs.resize(0); +} +//------------------------------------------------------------------------------ + +PolyNode* PolyTree::GetFirst() const +{ + if (!Childs.empty()) + return Childs[0]; + else + return 0; +} +//------------------------------------------------------------------------------ + +int PolyTree::Total() const +{ + int result = (int)AllNodes.size(); + //with negative offsets, ignore the hidden outer polygon ... + if (result > 0 && Childs[0] != AllNodes[0]) result--; + return result; +} + +//------------------------------------------------------------------------------ +// PolyNode methods ... +//------------------------------------------------------------------------------ + +PolyNode::PolyNode(): Parent(0), Index(0), m_IsOpen(false) +{ +} +//------------------------------------------------------------------------------ + +int PolyNode::ChildCount() const +{ + return (int)Childs.size(); +} +//------------------------------------------------------------------------------ + +void PolyNode::AddChild(PolyNode& child) +{ + unsigned cnt = (unsigned)Childs.size(); + Childs.push_back(&child); + child.Parent = this; + child.Index = cnt; +} +//------------------------------------------------------------------------------ + +PolyNode* PolyNode::GetNext() const +{ + if (!Childs.empty()) + return Childs[0]; + else + return GetNextSiblingUp(); +} +//------------------------------------------------------------------------------ + +PolyNode* PolyNode::GetNextSiblingUp() const +{ + if (!Parent) //protects against PolyTree.GetNextSiblingUp() + return 0; + else if (Index == Parent->Childs.size() - 1) + return Parent->GetNextSiblingUp(); + else + return Parent->Childs[Index + 1]; +} +//------------------------------------------------------------------------------ + +bool PolyNode::IsHole() const +{ + bool result = true; + PolyNode* node = Parent; + while (node) + { + result = !result; + node = node->Parent; + } + return result; +} +//------------------------------------------------------------------------------ + +bool PolyNode::IsOpen() const +{ + return m_IsOpen; +} +//------------------------------------------------------------------------------ + +#ifndef use_int32 + +//------------------------------------------------------------------------------ +// Int128 class (enables safe math on signed 64bit integers) +// eg Int128 val1((long64)9223372036854775807); //ie 2^63 -1 +// Int128 val2((long64)9223372036854775807); +// Int128 val3 = val1 * val2; +// val3.AsString => "85070591730234615847396907784232501249" (8.5e+37) +//------------------------------------------------------------------------------ + +class Int128 +{ + public: + ulong64 lo; + long64 hi; + + Int128(long64 _lo = 0) + { + lo = (ulong64)_lo; + if (_lo < 0) hi = -1; else hi = 0; + } + + + Int128(const Int128 &val): lo(val.lo), hi(val.hi){} + + Int128(const long64& _hi, const ulong64& _lo): lo(_lo), hi(_hi){} + + Int128& operator = (const long64 &val) + { + lo = (ulong64)val; + if (val < 0) hi = -1; else hi = 0; + return *this; + } + + bool operator == (const Int128 &val) const + {return (hi == val.hi && lo == val.lo);} + + bool operator != (const Int128 &val) const + { return !(*this == val);} + + bool operator > (const Int128 &val) const + { + if (hi != val.hi) + return hi > val.hi; + else + return lo > val.lo; + } + + bool operator < (const Int128 &val) const + { + if (hi != val.hi) + return hi < val.hi; + else + return lo < val.lo; + } + + bool operator >= (const Int128 &val) const + { return !(*this < val);} + + bool operator <= (const Int128 &val) const + { return !(*this > val);} + + Int128& operator += (const Int128 &rhs) + { + hi += rhs.hi; + lo += rhs.lo; + if (lo < rhs.lo) hi++; + return *this; + } + + Int128 operator + (const Int128 &rhs) const + { + Int128 result(*this); + result+= rhs; + return result; + } + + Int128& operator -= (const Int128 &rhs) + { + *this += -rhs; + return *this; + } + + Int128 operator - (const Int128 &rhs) const + { + Int128 result(*this); + result -= rhs; + return result; + } + + Int128 operator-() const //unary negation + { + if (lo == 0) + return Int128(-hi, 0); + else + return Int128(~hi, ~lo + 1); + } + + operator double() const + { + const double shift64 = 18446744073709551616.0; //2^64 + if (hi < 0) + { + if (lo == 0) return (double)hi * shift64; + else return -(double)(~lo + ~hi * shift64); + } + else + return (double)(lo + hi * shift64); + } + +}; +//------------------------------------------------------------------------------ + +Int128 Int128Mul (long64 lhs, long64 rhs) +{ + bool negate = (lhs < 0) != (rhs < 0); + + if (lhs < 0) lhs = -lhs; + ulong64 int1Hi = ulong64(lhs) >> 32; + ulong64 int1Lo = ulong64(lhs & 0xFFFFFFFF); + + if (rhs < 0) rhs = -rhs; + ulong64 int2Hi = ulong64(rhs) >> 32; + ulong64 int2Lo = ulong64(rhs & 0xFFFFFFFF); + + //nb: see comments in clipper.pas + ulong64 a = int1Hi * int2Hi; + ulong64 b = int1Lo * int2Lo; + ulong64 c = int1Hi * int2Lo + int1Lo * int2Hi; + + Int128 tmp; + tmp.hi = long64(a + (c >> 32)); + tmp.lo = long64(c << 32); + tmp.lo += long64(b); + if (tmp.lo < b) tmp.hi++; + if (negate) tmp = -tmp; + return tmp; +}; +#endif + +//------------------------------------------------------------------------------ +// Miscellaneous global functions +//------------------------------------------------------------------------------ + +bool Orientation(const Path &poly) +{ + return Area(poly) >= 0; +} +//------------------------------------------------------------------------------ + +double Area(const Path &poly) +{ + int size = (int)poly.size(); + if (size < 3) return 0; + + double a = 0; + for (int i = 0, j = size -1; i < size; ++i) + { + a += ((double)poly[j].X + poly[i].X) * ((double)poly[j].Y - poly[i].Y); + j = i; + } + return -a * 0.5; +} +//------------------------------------------------------------------------------ + +double Area(const OutPt *op) +{ + const OutPt *startOp = op; + if (!op) return 0; + double a = 0; + do { + a += (double)(op->Prev->Pt.X + op->Pt.X) * (double)(op->Prev->Pt.Y - op->Pt.Y); + op = op->Next; + } while (op != startOp); + return a * 0.5; +} +//------------------------------------------------------------------------------ + +double Area(const OutRec &outRec) +{ + return Area(outRec.Pts); +} +//------------------------------------------------------------------------------ + +bool PointIsVertex(const IntPoint &Pt, OutPt *pp) +{ + OutPt *pp2 = pp; + do + { + if (pp2->Pt == Pt) return true; + pp2 = pp2->Next; + } + while (pp2 != pp); + return false; +} +//------------------------------------------------------------------------------ + +//See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos +//http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf +int PointInPolygon(const IntPoint &pt, const Path &path) +{ + //returns 0 if false, +1 if true, -1 if pt ON polygon boundary + int result = 0; + size_t cnt = path.size(); + if (cnt < 3) return 0; + IntPoint ip = path[0]; + for(size_t i = 1; i <= cnt; ++i) + { + IntPoint ipNext = (i == cnt ? path[0] : path[i]); + if (ipNext.Y == pt.Y) + { + if ((ipNext.X == pt.X) || (ip.Y == pt.Y && + ((ipNext.X > pt.X) == (ip.X < pt.X)))) return -1; + } + if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y)) + { + if (ip.X >= pt.X) + { + if (ipNext.X > pt.X) result = 1 - result; + else + { + double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - + (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); + if (!d) return -1; + if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; + } + } else + { + if (ipNext.X > pt.X) + { + double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - + (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); + if (!d) return -1; + if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; + } + } + } + ip = ipNext; + } + return result; +} +//------------------------------------------------------------------------------ + +int PointInPolygon (const IntPoint &pt, OutPt *op) +{ + //returns 0 if false, +1 if true, -1 if pt ON polygon boundary + int result = 0; + OutPt* startOp = op; + for(;;) + { + if (op->Next->Pt.Y == pt.Y) + { + if ((op->Next->Pt.X == pt.X) || (op->Pt.Y == pt.Y && + ((op->Next->Pt.X > pt.X) == (op->Pt.X < pt.X)))) return -1; + } + if ((op->Pt.Y < pt.Y) != (op->Next->Pt.Y < pt.Y)) + { + if (op->Pt.X >= pt.X) + { + if (op->Next->Pt.X > pt.X) result = 1 - result; + else + { + double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) - + (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y); + if (!d) return -1; + if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result; + } + } else + { + if (op->Next->Pt.X > pt.X) + { + double d = (double)(op->Pt.X - pt.X) * (op->Next->Pt.Y - pt.Y) - + (double)(op->Next->Pt.X - pt.X) * (op->Pt.Y - pt.Y); + if (!d) return -1; + if ((d > 0) == (op->Next->Pt.Y > op->Pt.Y)) result = 1 - result; + } + } + } + op = op->Next; + if (startOp == op) break; + } + return result; +} +//------------------------------------------------------------------------------ + +bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2) +{ + OutPt* op = OutPt1; + do + { + //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon + int res = PointInPolygon(op->Pt, OutPt2); + if (res >= 0) return res > 0; + op = op->Next; + } + while (op != OutPt1); + return true; +} +//---------------------------------------------------------------------- + +bool SlopesEqual(const TEdge &e1, const TEdge &e2, bool UseFullInt64Range) +{ +#ifndef use_int32 + if (UseFullInt64Range) + return Int128Mul(e1.Top.Y - e1.Bot.Y, e2.Top.X - e2.Bot.X) == + Int128Mul(e1.Top.X - e1.Bot.X, e2.Top.Y - e2.Bot.Y); + else +#endif + return (e1.Top.Y - e1.Bot.Y) * (e2.Top.X - e2.Bot.X) == + (e1.Top.X - e1.Bot.X) * (e2.Top.Y - e2.Bot.Y); +} +//------------------------------------------------------------------------------ + +bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, + const IntPoint pt3, bool UseFullInt64Range) +{ +#ifndef use_int32 + if (UseFullInt64Range) + return Int128Mul(pt1.Y-pt2.Y, pt2.X-pt3.X) == Int128Mul(pt1.X-pt2.X, pt2.Y-pt3.Y); + else +#endif + return (pt1.Y-pt2.Y)*(pt2.X-pt3.X) == (pt1.X-pt2.X)*(pt2.Y-pt3.Y); +} +//------------------------------------------------------------------------------ + +bool SlopesEqual(const IntPoint pt1, const IntPoint pt2, + const IntPoint pt3, const IntPoint pt4, bool UseFullInt64Range) +{ +#ifndef use_int32 + if (UseFullInt64Range) + return Int128Mul(pt1.Y-pt2.Y, pt3.X-pt4.X) == Int128Mul(pt1.X-pt2.X, pt3.Y-pt4.Y); + else +#endif + return (pt1.Y-pt2.Y)*(pt3.X-pt4.X) == (pt1.X-pt2.X)*(pt3.Y-pt4.Y); +} +//------------------------------------------------------------------------------ + +inline bool IsHorizontal(TEdge &e) +{ + return e.Dx == HORIZONTAL; +} +//------------------------------------------------------------------------------ + +inline double GetDx(const IntPoint pt1, const IntPoint pt2) +{ + return (pt1.Y == pt2.Y) ? + HORIZONTAL : (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y); +} +//--------------------------------------------------------------------------- + +inline void SetDx(TEdge &e) +{ + cInt dy = (e.Top.Y - e.Bot.Y); + if (dy == 0) e.Dx = HORIZONTAL; + else e.Dx = (double)(e.Top.X - e.Bot.X) / dy; +} +//--------------------------------------------------------------------------- + +inline void SwapSides(TEdge &Edge1, TEdge &Edge2) +{ + EdgeSide Side = Edge1.Side; + Edge1.Side = Edge2.Side; + Edge2.Side = Side; +} +//------------------------------------------------------------------------------ + +inline void SwapPolyIndexes(TEdge &Edge1, TEdge &Edge2) +{ + int OutIdx = Edge1.OutIdx; + Edge1.OutIdx = Edge2.OutIdx; + Edge2.OutIdx = OutIdx; +} +//------------------------------------------------------------------------------ + +inline cInt TopX(TEdge &edge, const cInt currentY) +{ + return ( currentY == edge.Top.Y ) ? + edge.Top.X : edge.Bot.X + Round(edge.Dx *(currentY - edge.Bot.Y)); +} +//------------------------------------------------------------------------------ + +void IntersectPoint(TEdge &Edge1, TEdge &Edge2, IntPoint &ip) +{ +#ifdef use_xyz + ip.Z = 0; +#endif + + double b1, b2; + if (Edge1.Dx == Edge2.Dx) + { + ip.Y = Edge1.Curr.Y; + ip.X = TopX(Edge1, ip.Y); + return; + } + else if (Edge1.Dx == 0) + { + ip.X = Edge1.Bot.X; + if (IsHorizontal(Edge2)) + ip.Y = Edge2.Bot.Y; + else + { + b2 = Edge2.Bot.Y - (Edge2.Bot.X / Edge2.Dx); + ip.Y = Round(ip.X / Edge2.Dx + b2); + } + } + else if (Edge2.Dx == 0) + { + ip.X = Edge2.Bot.X; + if (IsHorizontal(Edge1)) + ip.Y = Edge1.Bot.Y; + else + { + b1 = Edge1.Bot.Y - (Edge1.Bot.X / Edge1.Dx); + ip.Y = Round(ip.X / Edge1.Dx + b1); + } + } + else + { + b1 = Edge1.Bot.X - Edge1.Bot.Y * Edge1.Dx; + b2 = Edge2.Bot.X - Edge2.Bot.Y * Edge2.Dx; + double q = (b2-b1) / (Edge1.Dx - Edge2.Dx); + ip.Y = Round(q); + if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) + ip.X = Round(Edge1.Dx * q + b1); + else + ip.X = Round(Edge2.Dx * q + b2); + } + + if (ip.Y < Edge1.Top.Y || ip.Y < Edge2.Top.Y) + { + if (Edge1.Top.Y > Edge2.Top.Y) + ip.Y = Edge1.Top.Y; + else + ip.Y = Edge2.Top.Y; + if (std::fabs(Edge1.Dx) < std::fabs(Edge2.Dx)) + ip.X = TopX(Edge1, ip.Y); + else + ip.X = TopX(Edge2, ip.Y); + } + //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ... + if (ip.Y > Edge1.Curr.Y) + { + ip.Y = Edge1.Curr.Y; + //use the more vertical edge to derive X ... + if (std::fabs(Edge1.Dx) > std::fabs(Edge2.Dx)) + ip.X = TopX(Edge2, ip.Y); else + ip.X = TopX(Edge1, ip.Y); + } +} +//------------------------------------------------------------------------------ + +void ReversePolyPtLinks(OutPt *pp) +{ + if (!pp) return; + OutPt *pp1, *pp2; + pp1 = pp; + do { + pp2 = pp1->Next; + pp1->Next = pp1->Prev; + pp1->Prev = pp2; + pp1 = pp2; + } while( pp1 != pp ); +} +//------------------------------------------------------------------------------ + +void DisposeOutPts(OutPt*& pp) +{ + if (pp == 0) return; + pp->Prev->Next = 0; + while( pp ) + { + OutPt *tmpPp = pp; + pp = pp->Next; + delete tmpPp; + } +} +//------------------------------------------------------------------------------ + +inline void InitEdge(TEdge* e, TEdge* eNext, TEdge* ePrev, const IntPoint& Pt) +{ + std::memset(e, 0, sizeof(TEdge)); + e->Next = eNext; + e->Prev = ePrev; + e->Curr = Pt; + e->OutIdx = Unassigned; +} +//------------------------------------------------------------------------------ + +void InitEdge2(TEdge& e, PolyType Pt) +{ + if (e.Curr.Y >= e.Next->Curr.Y) + { + e.Bot = e.Curr; + e.Top = e.Next->Curr; + } else + { + e.Top = e.Curr; + e.Bot = e.Next->Curr; + } + SetDx(e); + e.PolyTyp = Pt; +} +//------------------------------------------------------------------------------ + +TEdge* RemoveEdge(TEdge* e) +{ + //removes e from double_linked_list (but without removing from memory) + e->Prev->Next = e->Next; + e->Next->Prev = e->Prev; + TEdge* result = e->Next; + e->Prev = 0; //flag as removed (see ClipperBase.Clear) + return result; +} +//------------------------------------------------------------------------------ + +inline void ReverseHorizontal(TEdge &e) +{ + //swap horizontal edges' Top and Bottom x's so they follow the natural + //progression of the bounds - ie so their xbots will align with the + //adjoining lower edge. [Helpful in the ProcessHorizontal() method.] + std::swap(e.Top.X, e.Bot.X); +#ifdef use_xyz + std::swap(e.Top.Z, e.Bot.Z); +#endif +} +//------------------------------------------------------------------------------ + +void SwapPoints(IntPoint &pt1, IntPoint &pt2) +{ + IntPoint tmp = pt1; + pt1 = pt2; + pt2 = tmp; +} +//------------------------------------------------------------------------------ + +bool GetOverlapSegment(IntPoint pt1a, IntPoint pt1b, IntPoint pt2a, + IntPoint pt2b, IntPoint &pt1, IntPoint &pt2) +{ + //precondition: segments are Collinear. + if (Abs(pt1a.X - pt1b.X) > Abs(pt1a.Y - pt1b.Y)) + { + if (pt1a.X > pt1b.X) SwapPoints(pt1a, pt1b); + if (pt2a.X > pt2b.X) SwapPoints(pt2a, pt2b); + if (pt1a.X > pt2a.X) pt1 = pt1a; else pt1 = pt2a; + if (pt1b.X < pt2b.X) pt2 = pt1b; else pt2 = pt2b; + return pt1.X < pt2.X; + } else + { + if (pt1a.Y < pt1b.Y) SwapPoints(pt1a, pt1b); + if (pt2a.Y < pt2b.Y) SwapPoints(pt2a, pt2b); + if (pt1a.Y < pt2a.Y) pt1 = pt1a; else pt1 = pt2a; + if (pt1b.Y > pt2b.Y) pt2 = pt1b; else pt2 = pt2b; + return pt1.Y > pt2.Y; + } +} +//------------------------------------------------------------------------------ + +bool FirstIsBottomPt(const OutPt* btmPt1, const OutPt* btmPt2) +{ + OutPt *p = btmPt1->Prev; + while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Prev; + double dx1p = std::fabs(GetDx(btmPt1->Pt, p->Pt)); + p = btmPt1->Next; + while ((p->Pt == btmPt1->Pt) && (p != btmPt1)) p = p->Next; + double dx1n = std::fabs(GetDx(btmPt1->Pt, p->Pt)); + + p = btmPt2->Prev; + while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Prev; + double dx2p = std::fabs(GetDx(btmPt2->Pt, p->Pt)); + p = btmPt2->Next; + while ((p->Pt == btmPt2->Pt) && (p != btmPt2)) p = p->Next; + double dx2n = std::fabs(GetDx(btmPt2->Pt, p->Pt)); + + if (std::max(dx1p, dx1n) == std::max(dx2p, dx2n) && + std::min(dx1p, dx1n) == std::min(dx2p, dx2n)) + return Area(btmPt1) > 0; //if otherwise identical use orientation + else + return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n); +} +//------------------------------------------------------------------------------ + +OutPt* GetBottomPt(OutPt *pp) +{ + OutPt* dups = 0; + OutPt* p = pp->Next; + while (p != pp) + { + if (p->Pt.Y > pp->Pt.Y) + { + pp = p; + dups = 0; + } + else if (p->Pt.Y == pp->Pt.Y && p->Pt.X <= pp->Pt.X) + { + if (p->Pt.X < pp->Pt.X) + { + dups = 0; + pp = p; + } else + { + if (p->Next != pp && p->Prev != pp) dups = p; + } + } + p = p->Next; + } + if (dups) + { + //there appears to be at least 2 vertices at BottomPt so ... + while (dups != p) + { + if (!FirstIsBottomPt(p, dups)) pp = dups; + dups = dups->Next; + while (dups->Pt != pp->Pt) dups = dups->Next; + } + } + return pp; +} +//------------------------------------------------------------------------------ + +bool Pt2IsBetweenPt1AndPt3(const IntPoint pt1, + const IntPoint pt2, const IntPoint pt3) +{ + if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2)) + return false; + else if (pt1.X != pt3.X) + return (pt2.X > pt1.X) == (pt2.X < pt3.X); + else + return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y); +} +//------------------------------------------------------------------------------ + +bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) +{ + if (seg1a > seg1b) std::swap(seg1a, seg1b); + if (seg2a > seg2b) std::swap(seg2a, seg2b); + return (seg1a < seg2b) && (seg2a < seg1b); +} + +//------------------------------------------------------------------------------ +// ClipperBase class methods ... +//------------------------------------------------------------------------------ + +ClipperBase::ClipperBase() //constructor +{ + m_CurrentLM = m_MinimaList.begin(); //begin() == end() here + m_UseFullRange = false; +} +//------------------------------------------------------------------------------ + +ClipperBase::~ClipperBase() //destructor +{ + Clear(); +} +//------------------------------------------------------------------------------ + +void RangeTest(const IntPoint& Pt, bool& useFullRange) +{ + if (useFullRange) + { + if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange) + throw clipperException("Coordinate outside allowed range"); + } + else if (Pt.X > loRange|| Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange) + { + useFullRange = true; + RangeTest(Pt, useFullRange); + } +} +//------------------------------------------------------------------------------ + +TEdge* FindNextLocMin(TEdge* E) +{ + for (;;) + { + while (E->Bot != E->Prev->Bot || E->Curr == E->Top) E = E->Next; + if (!IsHorizontal(*E) && !IsHorizontal(*E->Prev)) break; + while (IsHorizontal(*E->Prev)) E = E->Prev; + TEdge* E2 = E; + while (IsHorizontal(*E)) E = E->Next; + if (E->Top.Y == E->Prev->Bot.Y) continue; //ie just an intermediate horz. + if (E2->Prev->Bot.X < E->Bot.X) E = E2; + break; + } + return E; +} +//------------------------------------------------------------------------------ + +TEdge* ClipperBase::ProcessBound(TEdge* E, bool NextIsForward) +{ + TEdge *Result = E; + TEdge *Horz = 0; + + if (E->OutIdx == Skip) + { + //if edges still remain in the current bound beyond the skip edge then + //create another LocMin and call ProcessBound once more + if (NextIsForward) + { + while (E->Top.Y == E->Next->Bot.Y) E = E->Next; + //don't include top horizontals when parsing a bound a second time, + //they will be contained in the opposite bound ... + while (E != Result && IsHorizontal(*E)) E = E->Prev; + } + else + { + while (E->Top.Y == E->Prev->Bot.Y) E = E->Prev; + while (E != Result && IsHorizontal(*E)) E = E->Next; + } + + if (E == Result) + { + if (NextIsForward) Result = E->Next; + else Result = E->Prev; + } + else + { + //there are more edges in the bound beyond result starting with E + if (NextIsForward) + E = Result->Next; + else + E = Result->Prev; + MinimaList::value_type locMin; + locMin.Y = E->Bot.Y; + locMin.LeftBound = 0; + locMin.RightBound = E; + E->WindDelta = 0; + Result = ProcessBound(E, NextIsForward); + m_MinimaList.push_back(locMin); + } + return Result; + } + + TEdge *EStart; + + if (IsHorizontal(*E)) + { + //We need to be careful with open paths because this may not be a + //true local minima (ie E may be following a skip edge). + //Also, consecutive horz. edges may start heading left before going right. + if (NextIsForward) + EStart = E->Prev; + else + EStart = E->Next; + if (IsHorizontal(*EStart)) //ie an adjoining horizontal skip edge + { + if (EStart->Bot.X != E->Bot.X && EStart->Top.X != E->Bot.X) + ReverseHorizontal(*E); + } + else if (EStart->Bot.X != E->Bot.X) + ReverseHorizontal(*E); + } + + EStart = E; + if (NextIsForward) + { + while (Result->Top.Y == Result->Next->Bot.Y && Result->Next->OutIdx != Skip) + Result = Result->Next; + if (IsHorizontal(*Result) && Result->Next->OutIdx != Skip) + { + //nb: at the top of a bound, horizontals are added to the bound + //only when the preceding edge attaches to the horizontal's left vertex + //unless a Skip edge is encountered when that becomes the top divide + Horz = Result; + while (IsHorizontal(*Horz->Prev)) Horz = Horz->Prev; + if (Horz->Prev->Top.X > Result->Next->Top.X) Result = Horz->Prev; + } + while (E != Result) + { + E->NextInLML = E->Next; + if (IsHorizontal(*E) && E != EStart && + E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); + E = E->Next; + } + if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Prev->Top.X) + ReverseHorizontal(*E); + Result = Result->Next; //move to the edge just beyond current bound + } else + { + while (Result->Top.Y == Result->Prev->Bot.Y && Result->Prev->OutIdx != Skip) + Result = Result->Prev; + if (IsHorizontal(*Result) && Result->Prev->OutIdx != Skip) + { + Horz = Result; + while (IsHorizontal(*Horz->Next)) Horz = Horz->Next; + if (Horz->Next->Top.X == Result->Prev->Top.X || + Horz->Next->Top.X > Result->Prev->Top.X) Result = Horz->Next; + } + + while (E != Result) + { + E->NextInLML = E->Prev; + if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) + ReverseHorizontal(*E); + E = E->Prev; + } + if (IsHorizontal(*E) && E != EStart && E->Bot.X != E->Next->Top.X) + ReverseHorizontal(*E); + Result = Result->Prev; //move to the edge just beyond current bound + } + + return Result; +} +//------------------------------------------------------------------------------ + +bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) +{ +#ifdef use_lines + if (!Closed && PolyTyp == ptClip) + throw clipperException("AddPath: Open paths must be subject."); +#else + if (!Closed) + throw clipperException("AddPath: Open paths have been disabled."); +#endif + + int highI = (int)pg.size() -1; + if (Closed) while (highI > 0 && (pg[highI] == pg[0])) --highI; + while (highI > 0 && (pg[highI] == pg[highI -1])) --highI; + if ((Closed && highI < 2) || (!Closed && highI < 1)) return false; + + //create a new edge array ... + TEdge *edges = new TEdge [highI +1]; + + bool IsFlat = true; + //1. Basic (first) edge initialization ... + try + { + edges[1].Curr = pg[1]; + RangeTest(pg[0], m_UseFullRange); + RangeTest(pg[highI], m_UseFullRange); + InitEdge(&edges[0], &edges[1], &edges[highI], pg[0]); + InitEdge(&edges[highI], &edges[0], &edges[highI-1], pg[highI]); + for (int i = highI - 1; i >= 1; --i) + { + RangeTest(pg[i], m_UseFullRange); + InitEdge(&edges[i], &edges[i+1], &edges[i-1], pg[i]); + } + } + catch(...) + { + delete [] edges; + throw; //range test fails + } + TEdge *eStart = &edges[0]; + + //2. Remove duplicate vertices, and (when closed) collinear edges ... + TEdge *E = eStart, *eLoopStop = eStart; + for (;;) + { + //nb: allows matching start and end points when not Closed ... + if (E->Curr == E->Next->Curr && (Closed || E->Next != eStart)) + { + if (E == E->Next) break; + if (E == eStart) eStart = E->Next; + E = RemoveEdge(E); + eLoopStop = E; + continue; + } + if (E->Prev == E->Next) + break; //only two vertices + else if (Closed && + SlopesEqual(E->Prev->Curr, E->Curr, E->Next->Curr, m_UseFullRange) && + (!m_PreserveCollinear || + !Pt2IsBetweenPt1AndPt3(E->Prev->Curr, E->Curr, E->Next->Curr))) + { + //Collinear edges are allowed for open paths but in closed paths + //the default is to merge adjacent collinear edges into a single edge. + //However, if the PreserveCollinear property is enabled, only overlapping + //collinear edges (ie spikes) will be removed from closed paths. + if (E == eStart) eStart = E->Next; + E = RemoveEdge(E); + E = E->Prev; + eLoopStop = E; + continue; + } + E = E->Next; + if ((E == eLoopStop) || (!Closed && E->Next == eStart)) break; + } + + if ((!Closed && (E == E->Next)) || (Closed && (E->Prev == E->Next))) + { + delete [] edges; + return false; + } + + if (!Closed) + { + m_HasOpenPaths = true; + eStart->Prev->OutIdx = Skip; + } + + //3. Do second stage of edge initialization ... + E = eStart; + do + { + InitEdge2(*E, PolyTyp); + E = E->Next; + if (IsFlat && E->Curr.Y != eStart->Curr.Y) IsFlat = false; + } + while (E != eStart); + + //4. Finally, add edge bounds to LocalMinima list ... + + //Totally flat paths must be handled differently when adding them + //to LocalMinima list to avoid endless loops etc ... + if (IsFlat) + { + if (Closed) + { + delete [] edges; + return false; + } + E->Prev->OutIdx = Skip; + MinimaList::value_type locMin; + locMin.Y = E->Bot.Y; + locMin.LeftBound = 0; + locMin.RightBound = E; + locMin.RightBound->Side = esRight; + locMin.RightBound->WindDelta = 0; + for (;;) + { + if (E->Bot.X != E->Prev->Top.X) ReverseHorizontal(*E); + if (E->Next->OutIdx == Skip) break; + E->NextInLML = E->Next; + E = E->Next; + } + m_MinimaList.push_back(locMin); + m_edges.push_back(edges); + return true; + } + + m_edges.push_back(edges); + bool leftBoundIsForward; + TEdge* EMin = 0; + + //workaround to avoid an endless loop in the while loop below when + //open paths have matching start and end points ... + if (E->Prev->Bot == E->Prev->Top) E = E->Next; + + for (;;) + { + E = FindNextLocMin(E); + if (E == EMin) break; + else if (!EMin) EMin = E; + + //E and E.Prev now share a local minima (left aligned if horizontal). + //Compare their slopes to find which starts which bound ... + MinimaList::value_type locMin; + locMin.Y = E->Bot.Y; + if (E->Dx < E->Prev->Dx) + { + locMin.LeftBound = E->Prev; + locMin.RightBound = E; + leftBoundIsForward = false; //Q.nextInLML = Q.prev + } else + { + locMin.LeftBound = E; + locMin.RightBound = E->Prev; + leftBoundIsForward = true; //Q.nextInLML = Q.next + } + + if (!Closed) locMin.LeftBound->WindDelta = 0; + else if (locMin.LeftBound->Next == locMin.RightBound) + locMin.LeftBound->WindDelta = -1; + else locMin.LeftBound->WindDelta = 1; + locMin.RightBound->WindDelta = -locMin.LeftBound->WindDelta; + + E = ProcessBound(locMin.LeftBound, leftBoundIsForward); + if (E->OutIdx == Skip) E = ProcessBound(E, leftBoundIsForward); + + TEdge* E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward); + if (E2->OutIdx == Skip) E2 = ProcessBound(E2, !leftBoundIsForward); + + if (locMin.LeftBound->OutIdx == Skip) + locMin.LeftBound = 0; + else if (locMin.RightBound->OutIdx == Skip) + locMin.RightBound = 0; + m_MinimaList.push_back(locMin); + if (!leftBoundIsForward) E = E2; + } + return true; +} +//------------------------------------------------------------------------------ + +bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed) +{ + bool result = false; + for (Paths::size_type i = 0; i < ppg.size(); ++i) + if (AddPath(ppg[i], PolyTyp, Closed)) result = true; + return result; +} +//------------------------------------------------------------------------------ + +void ClipperBase::Clear() +{ + DisposeLocalMinimaList(); + for (EdgeList::size_type i = 0; i < m_edges.size(); ++i) + { + TEdge* edges = m_edges[i]; + delete [] edges; + } + m_edges.clear(); + m_UseFullRange = false; + m_HasOpenPaths = false; +} +//------------------------------------------------------------------------------ + +void ClipperBase::Reset() +{ + m_CurrentLM = m_MinimaList.begin(); + if (m_CurrentLM == m_MinimaList.end()) return; //ie nothing to process + std::sort(m_MinimaList.begin(), m_MinimaList.end(), LocMinSorter()); + + m_Scanbeam = ScanbeamList(); //clears/resets priority_queue + //reset all edges ... + for (MinimaList::iterator lm = m_MinimaList.begin(); lm != m_MinimaList.end(); ++lm) + { + InsertScanbeam(lm->Y); + TEdge* e = lm->LeftBound; + if (e) + { + e->Curr = e->Bot; + e->Side = esLeft; + e->OutIdx = Unassigned; + } + + e = lm->RightBound; + if (e) + { + e->Curr = e->Bot; + e->Side = esRight; + e->OutIdx = Unassigned; + } + } + m_ActiveEdges = 0; + m_CurrentLM = m_MinimaList.begin(); +} +//------------------------------------------------------------------------------ + +void ClipperBase::DisposeLocalMinimaList() +{ + m_MinimaList.clear(); + m_CurrentLM = m_MinimaList.begin(); +} +//------------------------------------------------------------------------------ + +bool ClipperBase::PopLocalMinima(cInt Y, const LocalMinimum *&locMin) +{ + if (m_CurrentLM == m_MinimaList.end() || (*m_CurrentLM).Y != Y) return false; + locMin = &(*m_CurrentLM); + ++m_CurrentLM; + return true; +} +//------------------------------------------------------------------------------ + +IntRect ClipperBase::GetBounds() +{ + IntRect result; + MinimaList::iterator lm = m_MinimaList.begin(); + if (lm == m_MinimaList.end()) + { + result.left = result.top = result.right = result.bottom = 0; + return result; + } + result.left = lm->LeftBound->Bot.X; + result.top = lm->LeftBound->Bot.Y; + result.right = lm->LeftBound->Bot.X; + result.bottom = lm->LeftBound->Bot.Y; + while (lm != m_MinimaList.end()) + { + //todo - needs fixing for open paths + result.bottom = std::max(result.bottom, lm->LeftBound->Bot.Y); + TEdge* e = lm->LeftBound; + for (;;) { + TEdge* bottomE = e; + while (e->NextInLML) + { + if (e->Bot.X < result.left) result.left = e->Bot.X; + if (e->Bot.X > result.right) result.right = e->Bot.X; + e = e->NextInLML; + } + result.left = std::min(result.left, e->Bot.X); + result.right = std::max(result.right, e->Bot.X); + result.left = std::min(result.left, e->Top.X); + result.right = std::max(result.right, e->Top.X); + result.top = std::min(result.top, e->Top.Y); + if (bottomE == lm->LeftBound) e = lm->RightBound; + else break; + } + ++lm; + } + return result; +} +//------------------------------------------------------------------------------ + +void ClipperBase::InsertScanbeam(const cInt Y) +{ + m_Scanbeam.push(Y); +} +//------------------------------------------------------------------------------ + +bool ClipperBase::PopScanbeam(cInt &Y) +{ + if (m_Scanbeam.empty()) return false; + Y = m_Scanbeam.top(); + m_Scanbeam.pop(); + while (!m_Scanbeam.empty() && Y == m_Scanbeam.top()) { m_Scanbeam.pop(); } // Pop duplicates. + return true; +} +//------------------------------------------------------------------------------ + +void ClipperBase::DisposeAllOutRecs(){ + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + DisposeOutRec(i); + m_PolyOuts.clear(); +} +//------------------------------------------------------------------------------ + +void ClipperBase::DisposeOutRec(PolyOutList::size_type index) +{ + OutRec *outRec = m_PolyOuts[index]; + if (outRec->Pts) DisposeOutPts(outRec->Pts); + delete outRec; + m_PolyOuts[index] = 0; +} +//------------------------------------------------------------------------------ + +void ClipperBase::DeleteFromAEL(TEdge *e) +{ + TEdge* AelPrev = e->PrevInAEL; + TEdge* AelNext = e->NextInAEL; + if (!AelPrev && !AelNext && (e != m_ActiveEdges)) return; //already deleted + if (AelPrev) AelPrev->NextInAEL = AelNext; + else m_ActiveEdges = AelNext; + if (AelNext) AelNext->PrevInAEL = AelPrev; + e->NextInAEL = 0; + e->PrevInAEL = 0; +} +//------------------------------------------------------------------------------ + +OutRec* ClipperBase::CreateOutRec() +{ + OutRec* result = new OutRec; + result->IsHole = false; + result->IsOpen = false; + result->FirstLeft = 0; + result->Pts = 0; + result->BottomPt = 0; + result->PolyNd = 0; + m_PolyOuts.push_back(result); + result->Idx = (int)m_PolyOuts.size() - 1; + return result; +} +//------------------------------------------------------------------------------ + +void ClipperBase::SwapPositionsInAEL(TEdge *Edge1, TEdge *Edge2) +{ + //check that one or other edge hasn't already been removed from AEL ... + if (Edge1->NextInAEL == Edge1->PrevInAEL || + Edge2->NextInAEL == Edge2->PrevInAEL) return; + + if (Edge1->NextInAEL == Edge2) + { + TEdge* Next = Edge2->NextInAEL; + if (Next) Next->PrevInAEL = Edge1; + TEdge* Prev = Edge1->PrevInAEL; + if (Prev) Prev->NextInAEL = Edge2; + Edge2->PrevInAEL = Prev; + Edge2->NextInAEL = Edge1; + Edge1->PrevInAEL = Edge2; + Edge1->NextInAEL = Next; + } + else if (Edge2->NextInAEL == Edge1) + { + TEdge* Next = Edge1->NextInAEL; + if (Next) Next->PrevInAEL = Edge2; + TEdge* Prev = Edge2->PrevInAEL; + if (Prev) Prev->NextInAEL = Edge1; + Edge1->PrevInAEL = Prev; + Edge1->NextInAEL = Edge2; + Edge2->PrevInAEL = Edge1; + Edge2->NextInAEL = Next; + } + else + { + TEdge* Next = Edge1->NextInAEL; + TEdge* Prev = Edge1->PrevInAEL; + Edge1->NextInAEL = Edge2->NextInAEL; + if (Edge1->NextInAEL) Edge1->NextInAEL->PrevInAEL = Edge1; + Edge1->PrevInAEL = Edge2->PrevInAEL; + if (Edge1->PrevInAEL) Edge1->PrevInAEL->NextInAEL = Edge1; + Edge2->NextInAEL = Next; + if (Edge2->NextInAEL) Edge2->NextInAEL->PrevInAEL = Edge2; + Edge2->PrevInAEL = Prev; + if (Edge2->PrevInAEL) Edge2->PrevInAEL->NextInAEL = Edge2; + } + + if (!Edge1->PrevInAEL) m_ActiveEdges = Edge1; + else if (!Edge2->PrevInAEL) m_ActiveEdges = Edge2; +} +//------------------------------------------------------------------------------ + +void ClipperBase::UpdateEdgeIntoAEL(TEdge *&e) +{ + if (!e->NextInLML) + throw clipperException("UpdateEdgeIntoAEL: invalid call"); + + e->NextInLML->OutIdx = e->OutIdx; + TEdge* AelPrev = e->PrevInAEL; + TEdge* AelNext = e->NextInAEL; + if (AelPrev) AelPrev->NextInAEL = e->NextInLML; + else m_ActiveEdges = e->NextInLML; + if (AelNext) AelNext->PrevInAEL = e->NextInLML; + e->NextInLML->Side = e->Side; + e->NextInLML->WindDelta = e->WindDelta; + e->NextInLML->WindCnt = e->WindCnt; + e->NextInLML->WindCnt2 = e->WindCnt2; + e = e->NextInLML; + e->Curr = e->Bot; + e->PrevInAEL = AelPrev; + e->NextInAEL = AelNext; + if (!IsHorizontal(*e)) InsertScanbeam(e->Top.Y); +} +//------------------------------------------------------------------------------ + +bool ClipperBase::LocalMinimaPending() +{ + return (m_CurrentLM != m_MinimaList.end()); +} + +//------------------------------------------------------------------------------ +// TClipper methods ... +//------------------------------------------------------------------------------ + +Clipper::Clipper(int initOptions) : ClipperBase() //constructor +{ + m_ExecuteLocked = false; + m_UseFullRange = false; + m_ReverseOutput = ((initOptions & ioReverseSolution) != 0); + m_StrictSimple = ((initOptions & ioStrictlySimple) != 0); + m_PreserveCollinear = ((initOptions & ioPreserveCollinear) != 0); + m_HasOpenPaths = false; +#ifdef use_xyz + m_ZFill = 0; +#endif +} +//------------------------------------------------------------------------------ + +#ifdef use_xyz +void Clipper::ZFillFunction(ZFillCallback zFillFunc) +{ + m_ZFill = zFillFunc; +} +//------------------------------------------------------------------------------ +#endif + +bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType fillType) +{ + return Execute(clipType, solution, fillType, fillType); +} +//------------------------------------------------------------------------------ + +bool Clipper::Execute(ClipType clipType, PolyTree &polytree, PolyFillType fillType) +{ + return Execute(clipType, polytree, fillType, fillType); +} +//------------------------------------------------------------------------------ + +bool Clipper::Execute(ClipType clipType, Paths &solution, + PolyFillType subjFillType, PolyFillType clipFillType) +{ + if( m_ExecuteLocked ) return false; + if (m_HasOpenPaths) + throw clipperException("Error: PolyTree struct is needed for open path clipping."); + m_ExecuteLocked = true; + solution.resize(0); + m_SubjFillType = subjFillType; + m_ClipFillType = clipFillType; + m_ClipType = clipType; + m_UsingPolyTree = false; + bool succeeded = ExecuteInternal(); + if (succeeded) BuildResult(solution); + DisposeAllOutRecs(); + m_ExecuteLocked = false; + return succeeded; +} +//------------------------------------------------------------------------------ + +bool Clipper::Execute(ClipType clipType, PolyTree& polytree, + PolyFillType subjFillType, PolyFillType clipFillType) +{ + if( m_ExecuteLocked ) return false; + m_ExecuteLocked = true; + m_SubjFillType = subjFillType; + m_ClipFillType = clipFillType; + m_ClipType = clipType; + m_UsingPolyTree = true; + bool succeeded = ExecuteInternal(); + if (succeeded) BuildResult2(polytree); + DisposeAllOutRecs(); + m_ExecuteLocked = false; + return succeeded; +} +//------------------------------------------------------------------------------ + +void Clipper::FixHoleLinkage(OutRec &outrec) +{ + //skip OutRecs that (a) contain outermost polygons or + //(b) already have the correct owner/child linkage ... + if (!outrec.FirstLeft || + (outrec.IsHole != outrec.FirstLeft->IsHole && + outrec.FirstLeft->Pts)) return; + + OutRec* orfl = outrec.FirstLeft; + while (orfl && ((orfl->IsHole == outrec.IsHole) || !orfl->Pts)) + orfl = orfl->FirstLeft; + outrec.FirstLeft = orfl; +} +//------------------------------------------------------------------------------ + +bool Clipper::ExecuteInternal() +{ + bool succeeded = true; + try { + Reset(); + m_Maxima = MaximaList(); + m_SortedEdges = 0; + + succeeded = true; + cInt botY, topY; + if (!PopScanbeam(botY)) return false; + InsertLocalMinimaIntoAEL(botY); + while (PopScanbeam(topY) || LocalMinimaPending()) + { + ProcessHorizontals(); + ClearGhostJoins(); + if (!ProcessIntersections(topY)) + { + succeeded = false; + break; + } + ProcessEdgesAtTopOfScanbeam(topY); + botY = topY; + InsertLocalMinimaIntoAEL(botY); + } + } + catch(...) + { + succeeded = false; + } + + if (succeeded) + { + //fix orientations ... + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec *outRec = m_PolyOuts[i]; + if (!outRec->Pts || outRec->IsOpen) continue; + if ((outRec->IsHole ^ m_ReverseOutput) == (Area(*outRec) > 0)) + ReversePolyPtLinks(outRec->Pts); + } + + if (!m_Joins.empty()) JoinCommonEdges(); + + //unfortunately FixupOutPolygon() must be done after JoinCommonEdges() + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec *outRec = m_PolyOuts[i]; + if (!outRec->Pts) continue; + if (outRec->IsOpen) + FixupOutPolyline(*outRec); + else + FixupOutPolygon(*outRec); + } + + if (m_StrictSimple) DoSimplePolygons(); + } + + ClearJoins(); + ClearGhostJoins(); + return succeeded; +} +//------------------------------------------------------------------------------ + +void Clipper::SetWindingCount(TEdge &edge) +{ + TEdge *e = edge.PrevInAEL; + //find the edge of the same polytype that immediately preceeds 'edge' in AEL + while (e && ((e->PolyTyp != edge.PolyTyp) || (e->WindDelta == 0))) e = e->PrevInAEL; + if (!e) + { + if (edge.WindDelta == 0) + { + PolyFillType pft = (edge.PolyTyp == ptSubject ? m_SubjFillType : m_ClipFillType); + edge.WindCnt = (pft == pftNegative ? -1 : 1); + } + else + edge.WindCnt = edge.WindDelta; + edge.WindCnt2 = 0; + e = m_ActiveEdges; //ie get ready to calc WindCnt2 + } + else if (edge.WindDelta == 0 && m_ClipType != ctUnion) + { + edge.WindCnt = 1; + edge.WindCnt2 = e->WindCnt2; + e = e->NextInAEL; //ie get ready to calc WindCnt2 + } + else if (IsEvenOddFillType(edge)) + { + //EvenOdd filling ... + if (edge.WindDelta == 0) + { + //are we inside a subj polygon ... + bool Inside = true; + TEdge *e2 = e->PrevInAEL; + while (e2) + { + if (e2->PolyTyp == e->PolyTyp && e2->WindDelta != 0) + Inside = !Inside; + e2 = e2->PrevInAEL; + } + edge.WindCnt = (Inside ? 0 : 1); + } + else + { + edge.WindCnt = edge.WindDelta; + } + edge.WindCnt2 = e->WindCnt2; + e = e->NextInAEL; //ie get ready to calc WindCnt2 + } + else + { + //nonZero, Positive or Negative filling ... + if (e->WindCnt * e->WindDelta < 0) + { + //prev edge is 'decreasing' WindCount (WC) toward zero + //so we're outside the previous polygon ... + if (Abs(e->WindCnt) > 1) + { + //outside prev poly but still inside another. + //when reversing direction of prev poly use the same WC + if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt; + //otherwise continue to 'decrease' WC ... + else edge.WindCnt = e->WindCnt + edge.WindDelta; + } + else + //now outside all polys of same polytype so set own WC ... + edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta); + } else + { + //prev edge is 'increasing' WindCount (WC) away from zero + //so we're inside the previous polygon ... + if (edge.WindDelta == 0) + edge.WindCnt = (e->WindCnt < 0 ? e->WindCnt - 1 : e->WindCnt + 1); + //if wind direction is reversing prev then use same WC + else if (e->WindDelta * edge.WindDelta < 0) edge.WindCnt = e->WindCnt; + //otherwise add to WC ... + else edge.WindCnt = e->WindCnt + edge.WindDelta; + } + edge.WindCnt2 = e->WindCnt2; + e = e->NextInAEL; //ie get ready to calc WindCnt2 + } + + //update WindCnt2 ... + if (IsEvenOddAltFillType(edge)) + { + //EvenOdd filling ... + while (e != &edge) + { + if (e->WindDelta != 0) + edge.WindCnt2 = (edge.WindCnt2 == 0 ? 1 : 0); + e = e->NextInAEL; + } + } else + { + //nonZero, Positive or Negative filling ... + while ( e != &edge ) + { + edge.WindCnt2 += e->WindDelta; + e = e->NextInAEL; + } + } +} +//------------------------------------------------------------------------------ + +bool Clipper::IsEvenOddFillType(const TEdge& edge) const +{ + if (edge.PolyTyp == ptSubject) + return m_SubjFillType == pftEvenOdd; else + return m_ClipFillType == pftEvenOdd; +} +//------------------------------------------------------------------------------ + +bool Clipper::IsEvenOddAltFillType(const TEdge& edge) const +{ + if (edge.PolyTyp == ptSubject) + return m_ClipFillType == pftEvenOdd; else + return m_SubjFillType == pftEvenOdd; +} +//------------------------------------------------------------------------------ + +bool Clipper::IsContributing(const TEdge& edge) const +{ + PolyFillType pft, pft2; + if (edge.PolyTyp == ptSubject) + { + pft = m_SubjFillType; + pft2 = m_ClipFillType; + } else + { + pft = m_ClipFillType; + pft2 = m_SubjFillType; + } + + switch(pft) + { + case pftEvenOdd: + //return false if a subj line has been flagged as inside a subj polygon + if (edge.WindDelta == 0 && edge.WindCnt != 1) return false; + break; + case pftNonZero: + if (Abs(edge.WindCnt) != 1) return false; + break; + case pftPositive: + if (edge.WindCnt != 1) return false; + break; + default: //pftNegative + if (edge.WindCnt != -1) return false; + } + + switch(m_ClipType) + { + case ctIntersection: + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.WindCnt2 != 0); + case pftPositive: + return (edge.WindCnt2 > 0); + default: + return (edge.WindCnt2 < 0); + } + break; + case ctUnion: + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.WindCnt2 == 0); + case pftPositive: + return (edge.WindCnt2 <= 0); + default: + return (edge.WindCnt2 >= 0); + } + break; + case ctDifference: + if (edge.PolyTyp == ptSubject) + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.WindCnt2 == 0); + case pftPositive: + return (edge.WindCnt2 <= 0); + default: + return (edge.WindCnt2 >= 0); + } + else + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.WindCnt2 != 0); + case pftPositive: + return (edge.WindCnt2 > 0); + default: + return (edge.WindCnt2 < 0); + } + break; + case ctXor: + if (edge.WindDelta == 0) //XOr always contributing unless open + switch(pft2) + { + case pftEvenOdd: + case pftNonZero: + return (edge.WindCnt2 == 0); + case pftPositive: + return (edge.WindCnt2 <= 0); + default: + return (edge.WindCnt2 >= 0); + } + else + return true; + break; + default: + return true; + } +} +//------------------------------------------------------------------------------ + +OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) +{ + OutPt* result; + TEdge *e, *prevE; + if (IsHorizontal(*e2) || ( e1->Dx > e2->Dx )) + { + result = AddOutPt(e1, Pt); + e2->OutIdx = e1->OutIdx; + e1->Side = esLeft; + e2->Side = esRight; + e = e1; + if (e->PrevInAEL == e2) + prevE = e2->PrevInAEL; + else + prevE = e->PrevInAEL; + } else + { + result = AddOutPt(e2, Pt); + e1->OutIdx = e2->OutIdx; + e1->Side = esRight; + e2->Side = esLeft; + e = e2; + if (e->PrevInAEL == e1) + prevE = e1->PrevInAEL; + else + prevE = e->PrevInAEL; + } + + if (prevE && prevE->OutIdx >= 0 && prevE->Top.Y < Pt.Y && e->Top.Y < Pt.Y) + { + cInt xPrev = TopX(*prevE, Pt.Y); + cInt xE = TopX(*e, Pt.Y); + if (xPrev == xE && (e->WindDelta != 0) && (prevE->WindDelta != 0) && + SlopesEqual(IntPoint(xPrev, Pt.Y), prevE->Top, IntPoint(xE, Pt.Y), e->Top, m_UseFullRange)) + { + OutPt* outPt = AddOutPt(prevE, Pt); + AddJoin(result, outPt, e->Top); + } + } + return result; +} +//------------------------------------------------------------------------------ + +void Clipper::AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) +{ + AddOutPt( e1, Pt ); + if (e2->WindDelta == 0) AddOutPt(e2, Pt); + if( e1->OutIdx == e2->OutIdx ) + { + e1->OutIdx = Unassigned; + e2->OutIdx = Unassigned; + } + else if (e1->OutIdx < e2->OutIdx) + AppendPolygon(e1, e2); + else + AppendPolygon(e2, e1); +} +//------------------------------------------------------------------------------ + +void Clipper::AddEdgeToSEL(TEdge *edge) +{ + //SEL pointers in PEdge are reused to build a list of horizontal edges. + //However, we don't need to worry about order with horizontal edge processing. + if( !m_SortedEdges ) + { + m_SortedEdges = edge; + edge->PrevInSEL = 0; + edge->NextInSEL = 0; + } + else + { + edge->NextInSEL = m_SortedEdges; + edge->PrevInSEL = 0; + m_SortedEdges->PrevInSEL = edge; + m_SortedEdges = edge; + } +} +//------------------------------------------------------------------------------ + +bool Clipper::PopEdgeFromSEL(TEdge *&edge) +{ + if (!m_SortedEdges) return false; + edge = m_SortedEdges; + DeleteFromSEL(m_SortedEdges); + return true; +} +//------------------------------------------------------------------------------ + +void Clipper::CopyAELToSEL() +{ + TEdge* e = m_ActiveEdges; + m_SortedEdges = e; + while ( e ) + { + e->PrevInSEL = e->PrevInAEL; + e->NextInSEL = e->NextInAEL; + e = e->NextInAEL; + } +} +//------------------------------------------------------------------------------ + +void Clipper::AddJoin(OutPt *op1, OutPt *op2, const IntPoint OffPt) +{ + Join* j = new Join; + j->OutPt1 = op1; + j->OutPt2 = op2; + j->OffPt = OffPt; + m_Joins.push_back(j); +} +//------------------------------------------------------------------------------ + +void Clipper::ClearJoins() +{ + for (JoinList::size_type i = 0; i < m_Joins.size(); i++) + delete m_Joins[i]; + m_Joins.resize(0); +} +//------------------------------------------------------------------------------ + +void Clipper::ClearGhostJoins() +{ + for (JoinList::size_type i = 0; i < m_GhostJoins.size(); i++) + delete m_GhostJoins[i]; + m_GhostJoins.resize(0); +} +//------------------------------------------------------------------------------ + +void Clipper::AddGhostJoin(OutPt *op, const IntPoint OffPt) +{ + Join* j = new Join; + j->OutPt1 = op; + j->OutPt2 = 0; + j->OffPt = OffPt; + m_GhostJoins.push_back(j); +} +//------------------------------------------------------------------------------ + +void Clipper::InsertLocalMinimaIntoAEL(const cInt botY) +{ + const LocalMinimum *lm; + while (PopLocalMinima(botY, lm)) + { + TEdge* lb = lm->LeftBound; + TEdge* rb = lm->RightBound; + + OutPt *Op1 = 0; + if (!lb) + { + //nb: don't insert LB into either AEL or SEL + InsertEdgeIntoAEL(rb, 0); + SetWindingCount(*rb); + if (IsContributing(*rb)) + Op1 = AddOutPt(rb, rb->Bot); + } + else if (!rb) + { + InsertEdgeIntoAEL(lb, 0); + SetWindingCount(*lb); + if (IsContributing(*lb)) + Op1 = AddOutPt(lb, lb->Bot); + InsertScanbeam(lb->Top.Y); + } + else + { + InsertEdgeIntoAEL(lb, 0); + InsertEdgeIntoAEL(rb, lb); + SetWindingCount( *lb ); + rb->WindCnt = lb->WindCnt; + rb->WindCnt2 = lb->WindCnt2; + if (IsContributing(*lb)) + Op1 = AddLocalMinPoly(lb, rb, lb->Bot); + InsertScanbeam(lb->Top.Y); + } + + if (rb) + { + if (IsHorizontal(*rb)) + { + AddEdgeToSEL(rb); + if (rb->NextInLML) + InsertScanbeam(rb->NextInLML->Top.Y); + } + else InsertScanbeam( rb->Top.Y ); + } + + if (!lb || !rb) continue; + + //if any output polygons share an edge, they'll need joining later ... + if (Op1 && IsHorizontal(*rb) && + m_GhostJoins.size() > 0 && (rb->WindDelta != 0)) + { + for (JoinList::size_type i = 0; i < m_GhostJoins.size(); ++i) + { + Join* jr = m_GhostJoins[i]; + //if the horizontal Rb and a 'ghost' horizontal overlap, then convert + //the 'ghost' join to a real join ready for later ... + if (HorzSegmentsOverlap(jr->OutPt1->Pt.X, jr->OffPt.X, rb->Bot.X, rb->Top.X)) + AddJoin(jr->OutPt1, Op1, jr->OffPt); + } + } + + if (lb->OutIdx >= 0 && lb->PrevInAEL && + lb->PrevInAEL->Curr.X == lb->Bot.X && + lb->PrevInAEL->OutIdx >= 0 && + SlopesEqual(lb->PrevInAEL->Bot, lb->PrevInAEL->Top, lb->Curr, lb->Top, m_UseFullRange) && + (lb->WindDelta != 0) && (lb->PrevInAEL->WindDelta != 0)) + { + OutPt *Op2 = AddOutPt(lb->PrevInAEL, lb->Bot); + AddJoin(Op1, Op2, lb->Top); + } + + if(lb->NextInAEL != rb) + { + + if (rb->OutIdx >= 0 && rb->PrevInAEL->OutIdx >= 0 && + SlopesEqual(rb->PrevInAEL->Curr, rb->PrevInAEL->Top, rb->Curr, rb->Top, m_UseFullRange) && + (rb->WindDelta != 0) && (rb->PrevInAEL->WindDelta != 0)) + { + OutPt *Op2 = AddOutPt(rb->PrevInAEL, rb->Bot); + AddJoin(Op1, Op2, rb->Top); + } + + TEdge* e = lb->NextInAEL; + if (e) + { + while( e != rb ) + { + //nb: For calculating winding counts etc, IntersectEdges() assumes + //that param1 will be to the Right of param2 ABOVE the intersection ... + IntersectEdges(rb , e , lb->Curr); //order important here + e = e->NextInAEL; + } + } + } + + } +} +//------------------------------------------------------------------------------ + +void Clipper::DeleteFromSEL(TEdge *e) +{ + TEdge* SelPrev = e->PrevInSEL; + TEdge* SelNext = e->NextInSEL; + if( !SelPrev && !SelNext && (e != m_SortedEdges) ) return; //already deleted + if( SelPrev ) SelPrev->NextInSEL = SelNext; + else m_SortedEdges = SelNext; + if( SelNext ) SelNext->PrevInSEL = SelPrev; + e->NextInSEL = 0; + e->PrevInSEL = 0; +} +//------------------------------------------------------------------------------ + +#ifdef use_xyz +void Clipper::SetZ(IntPoint& pt, TEdge& e1, TEdge& e2) +{ + if (pt.Z != 0 || !m_ZFill) return; + else if (pt == e1.Bot) pt.Z = e1.Bot.Z; + else if (pt == e1.Top) pt.Z = e1.Top.Z; + else if (pt == e2.Bot) pt.Z = e2.Bot.Z; + else if (pt == e2.Top) pt.Z = e2.Top.Z; + else (*m_ZFill)(e1.Bot, e1.Top, e2.Bot, e2.Top, pt); +} +//------------------------------------------------------------------------------ +#endif + +void Clipper::IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &Pt) +{ + bool e1Contributing = ( e1->OutIdx >= 0 ); + bool e2Contributing = ( e2->OutIdx >= 0 ); + +#ifdef use_xyz + SetZ(Pt, *e1, *e2); +#endif + +#ifdef use_lines + //if either edge is on an OPEN path ... + if (e1->WindDelta == 0 || e2->WindDelta == 0) + { + //ignore subject-subject open path intersections UNLESS they + //are both open paths, AND they are both 'contributing maximas' ... + if (e1->WindDelta == 0 && e2->WindDelta == 0) return; + + //if intersecting a subj line with a subj poly ... + else if (e1->PolyTyp == e2->PolyTyp && + e1->WindDelta != e2->WindDelta && m_ClipType == ctUnion) + { + if (e1->WindDelta == 0) + { + if (e2Contributing) + { + AddOutPt(e1, Pt); + if (e1Contributing) e1->OutIdx = Unassigned; + } + } + else + { + if (e1Contributing) + { + AddOutPt(e2, Pt); + if (e2Contributing) e2->OutIdx = Unassigned; + } + } + } + else if (e1->PolyTyp != e2->PolyTyp) + { + //toggle subj open path OutIdx on/off when Abs(clip.WndCnt) == 1 ... + if ((e1->WindDelta == 0) && abs(e2->WindCnt) == 1 && + (m_ClipType != ctUnion || e2->WindCnt2 == 0)) + { + AddOutPt(e1, Pt); + if (e1Contributing) e1->OutIdx = Unassigned; + } + else if ((e2->WindDelta == 0) && (abs(e1->WindCnt) == 1) && + (m_ClipType != ctUnion || e1->WindCnt2 == 0)) + { + AddOutPt(e2, Pt); + if (e2Contributing) e2->OutIdx = Unassigned; + } + } + return; + } +#endif + + //update winding counts... + //assumes that e1 will be to the Right of e2 ABOVE the intersection + if ( e1->PolyTyp == e2->PolyTyp ) + { + if ( IsEvenOddFillType( *e1) ) + { + int oldE1WindCnt = e1->WindCnt; + e1->WindCnt = e2->WindCnt; + e2->WindCnt = oldE1WindCnt; + } else + { + if (e1->WindCnt + e2->WindDelta == 0 ) e1->WindCnt = -e1->WindCnt; + else e1->WindCnt += e2->WindDelta; + if ( e2->WindCnt - e1->WindDelta == 0 ) e2->WindCnt = -e2->WindCnt; + else e2->WindCnt -= e1->WindDelta; + } + } else + { + if (!IsEvenOddFillType(*e2)) e1->WindCnt2 += e2->WindDelta; + else e1->WindCnt2 = ( e1->WindCnt2 == 0 ) ? 1 : 0; + if (!IsEvenOddFillType(*e1)) e2->WindCnt2 -= e1->WindDelta; + else e2->WindCnt2 = ( e2->WindCnt2 == 0 ) ? 1 : 0; + } + + PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2; + if (e1->PolyTyp == ptSubject) + { + e1FillType = m_SubjFillType; + e1FillType2 = m_ClipFillType; + } else + { + e1FillType = m_ClipFillType; + e1FillType2 = m_SubjFillType; + } + if (e2->PolyTyp == ptSubject) + { + e2FillType = m_SubjFillType; + e2FillType2 = m_ClipFillType; + } else + { + e2FillType = m_ClipFillType; + e2FillType2 = m_SubjFillType; + } + + cInt e1Wc, e2Wc; + switch (e1FillType) + { + case pftPositive: e1Wc = e1->WindCnt; break; + case pftNegative: e1Wc = -e1->WindCnt; break; + default: e1Wc = Abs(e1->WindCnt); + } + switch(e2FillType) + { + case pftPositive: e2Wc = e2->WindCnt; break; + case pftNegative: e2Wc = -e2->WindCnt; break; + default: e2Wc = Abs(e2->WindCnt); + } + + if ( e1Contributing && e2Contributing ) + { + if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || + (e1->PolyTyp != e2->PolyTyp && m_ClipType != ctXor) ) + { + AddLocalMaxPoly(e1, e2, Pt); + } + else + { + AddOutPt(e1, Pt); + AddOutPt(e2, Pt); + SwapSides( *e1 , *e2 ); + SwapPolyIndexes( *e1 , *e2 ); + } + } + else if ( e1Contributing ) + { + if (e2Wc == 0 || e2Wc == 1) + { + AddOutPt(e1, Pt); + SwapSides(*e1, *e2); + SwapPolyIndexes(*e1, *e2); + } + } + else if ( e2Contributing ) + { + if (e1Wc == 0 || e1Wc == 1) + { + AddOutPt(e2, Pt); + SwapSides(*e1, *e2); + SwapPolyIndexes(*e1, *e2); + } + } + else if ( (e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1)) + { + //neither edge is currently contributing ... + + cInt e1Wc2, e2Wc2; + switch (e1FillType2) + { + case pftPositive: e1Wc2 = e1->WindCnt2; break; + case pftNegative : e1Wc2 = -e1->WindCnt2; break; + default: e1Wc2 = Abs(e1->WindCnt2); + } + switch (e2FillType2) + { + case pftPositive: e2Wc2 = e2->WindCnt2; break; + case pftNegative: e2Wc2 = -e2->WindCnt2; break; + default: e2Wc2 = Abs(e2->WindCnt2); + } + + if (e1->PolyTyp != e2->PolyTyp) + { + AddLocalMinPoly(e1, e2, Pt); + } + else if (e1Wc == 1 && e2Wc == 1) + switch( m_ClipType ) { + case ctIntersection: + if (e1Wc2 > 0 && e2Wc2 > 0) + AddLocalMinPoly(e1, e2, Pt); + break; + case ctUnion: + if ( e1Wc2 <= 0 && e2Wc2 <= 0 ) + AddLocalMinPoly(e1, e2, Pt); + break; + case ctDifference: + if (((e1->PolyTyp == ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) || + ((e1->PolyTyp == ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0))) + AddLocalMinPoly(e1, e2, Pt); + break; + case ctXor: + AddLocalMinPoly(e1, e2, Pt); + } + else + SwapSides( *e1, *e2 ); + } +} +//------------------------------------------------------------------------------ + +void Clipper::SetHoleState(TEdge *e, OutRec *outrec) +{ + TEdge *e2 = e->PrevInAEL; + TEdge *eTmp = 0; + while (e2) + { + if (e2->OutIdx >= 0 && e2->WindDelta != 0) + { + if (!eTmp) eTmp = e2; + else if (eTmp->OutIdx == e2->OutIdx) eTmp = 0; + } + e2 = e2->PrevInAEL; + } + if (!eTmp) + { + outrec->FirstLeft = 0; + outrec->IsHole = false; + } + else + { + outrec->FirstLeft = m_PolyOuts[eTmp->OutIdx]; + outrec->IsHole = !outrec->FirstLeft->IsHole; + } +} +//------------------------------------------------------------------------------ + +OutRec* GetLowermostRec(OutRec *outRec1, OutRec *outRec2) +{ + //work out which polygon fragment has the correct hole state ... + if (!outRec1->BottomPt) + outRec1->BottomPt = GetBottomPt(outRec1->Pts); + if (!outRec2->BottomPt) + outRec2->BottomPt = GetBottomPt(outRec2->Pts); + OutPt *OutPt1 = outRec1->BottomPt; + OutPt *OutPt2 = outRec2->BottomPt; + if (OutPt1->Pt.Y > OutPt2->Pt.Y) return outRec1; + else if (OutPt1->Pt.Y < OutPt2->Pt.Y) return outRec2; + else if (OutPt1->Pt.X < OutPt2->Pt.X) return outRec1; + else if (OutPt1->Pt.X > OutPt2->Pt.X) return outRec2; + else if (OutPt1->Next == OutPt1) return outRec2; + else if (OutPt2->Next == OutPt2) return outRec1; + else if (FirstIsBottomPt(OutPt1, OutPt2)) return outRec1; + else return outRec2; +} +//------------------------------------------------------------------------------ + +bool OutRec1RightOfOutRec2(OutRec* outRec1, OutRec* outRec2) +{ + do + { + outRec1 = outRec1->FirstLeft; + if (outRec1 == outRec2) return true; + } while (outRec1); + return false; +} +//------------------------------------------------------------------------------ + +OutRec* Clipper::GetOutRec(int Idx) +{ + OutRec* outrec = m_PolyOuts[Idx]; + while (outrec != m_PolyOuts[outrec->Idx]) + outrec = m_PolyOuts[outrec->Idx]; + return outrec; +} +//------------------------------------------------------------------------------ + +void Clipper::AppendPolygon(TEdge *e1, TEdge *e2) +{ + //get the start and ends of both output polygons ... + OutRec *outRec1 = m_PolyOuts[e1->OutIdx]; + OutRec *outRec2 = m_PolyOuts[e2->OutIdx]; + + OutRec *holeStateRec; + if (OutRec1RightOfOutRec2(outRec1, outRec2)) + holeStateRec = outRec2; + else if (OutRec1RightOfOutRec2(outRec2, outRec1)) + holeStateRec = outRec1; + else + holeStateRec = GetLowermostRec(outRec1, outRec2); + + //get the start and ends of both output polygons and + //join e2 poly onto e1 poly and delete pointers to e2 ... + + OutPt* p1_lft = outRec1->Pts; + OutPt* p1_rt = p1_lft->Prev; + OutPt* p2_lft = outRec2->Pts; + OutPt* p2_rt = p2_lft->Prev; + + //join e2 poly onto e1 poly and delete pointers to e2 ... + if( e1->Side == esLeft ) + { + if( e2->Side == esLeft ) + { + //z y x a b c + ReversePolyPtLinks(p2_lft); + p2_lft->Next = p1_lft; + p1_lft->Prev = p2_lft; + p1_rt->Next = p2_rt; + p2_rt->Prev = p1_rt; + outRec1->Pts = p2_rt; + } else + { + //x y z a b c + p2_rt->Next = p1_lft; + p1_lft->Prev = p2_rt; + p2_lft->Prev = p1_rt; + p1_rt->Next = p2_lft; + outRec1->Pts = p2_lft; + } + } else + { + if( e2->Side == esRight ) + { + //a b c z y x + ReversePolyPtLinks(p2_lft); + p1_rt->Next = p2_rt; + p2_rt->Prev = p1_rt; + p2_lft->Next = p1_lft; + p1_lft->Prev = p2_lft; + } else + { + //a b c x y z + p1_rt->Next = p2_lft; + p2_lft->Prev = p1_rt; + p1_lft->Prev = p2_rt; + p2_rt->Next = p1_lft; + } + } + + outRec1->BottomPt = 0; + if (holeStateRec == outRec2) + { + if (outRec2->FirstLeft != outRec1) + outRec1->FirstLeft = outRec2->FirstLeft; + outRec1->IsHole = outRec2->IsHole; + } + outRec2->Pts = 0; + outRec2->BottomPt = 0; + outRec2->FirstLeft = outRec1; + + int OKIdx = e1->OutIdx; + int ObsoleteIdx = e2->OutIdx; + + e1->OutIdx = Unassigned; //nb: safe because we only get here via AddLocalMaxPoly + e2->OutIdx = Unassigned; + + TEdge* e = m_ActiveEdges; + while( e ) + { + if( e->OutIdx == ObsoleteIdx ) + { + e->OutIdx = OKIdx; + e->Side = e1->Side; + break; + } + e = e->NextInAEL; + } + + outRec2->Idx = outRec1->Idx; +} +//------------------------------------------------------------------------------ + +OutPt* Clipper::AddOutPt(TEdge *e, const IntPoint &pt) +{ + if( e->OutIdx < 0 ) + { + OutRec *outRec = CreateOutRec(); + outRec->IsOpen = (e->WindDelta == 0); + OutPt* newOp = new OutPt; + outRec->Pts = newOp; + newOp->Idx = outRec->Idx; + newOp->Pt = pt; + newOp->Next = newOp; + newOp->Prev = newOp; + if (!outRec->IsOpen) + SetHoleState(e, outRec); + e->OutIdx = outRec->Idx; + return newOp; + } else + { + OutRec *outRec = m_PolyOuts[e->OutIdx]; + //OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most' + OutPt* op = outRec->Pts; + + bool ToFront = (e->Side == esLeft); + if (ToFront && (pt == op->Pt)) return op; + else if (!ToFront && (pt == op->Prev->Pt)) return op->Prev; + + OutPt* newOp = new OutPt; + newOp->Idx = outRec->Idx; + newOp->Pt = pt; + newOp->Next = op; + newOp->Prev = op->Prev; + newOp->Prev->Next = newOp; + op->Prev = newOp; + if (ToFront) outRec->Pts = newOp; + return newOp; + } +} +//------------------------------------------------------------------------------ + +OutPt* Clipper::GetLastOutPt(TEdge *e) +{ + OutRec *outRec = m_PolyOuts[e->OutIdx]; + if (e->Side == esLeft) + return outRec->Pts; + else + return outRec->Pts->Prev; +} +//------------------------------------------------------------------------------ + +void Clipper::ProcessHorizontals() +{ + TEdge* horzEdge; + while (PopEdgeFromSEL(horzEdge)) + ProcessHorizontal(horzEdge); +} +//------------------------------------------------------------------------------ + +inline bool IsMinima(TEdge *e) +{ + return e && (e->Prev->NextInLML != e) && (e->Next->NextInLML != e); +} +//------------------------------------------------------------------------------ + +inline bool IsMaxima(TEdge *e, const cInt Y) +{ + return e && e->Top.Y == Y && !e->NextInLML; +} +//------------------------------------------------------------------------------ + +inline bool IsIntermediate(TEdge *e, const cInt Y) +{ + return e->Top.Y == Y && e->NextInLML; +} +//------------------------------------------------------------------------------ + +TEdge *GetMaximaPair(TEdge *e) +{ + if ((e->Next->Top == e->Top) && !e->Next->NextInLML) + return e->Next; + else if ((e->Prev->Top == e->Top) && !e->Prev->NextInLML) + return e->Prev; + else return 0; +} +//------------------------------------------------------------------------------ + +TEdge *GetMaximaPairEx(TEdge *e) +{ + //as GetMaximaPair() but returns 0 if MaxPair isn't in AEL (unless it's horizontal) + TEdge* result = GetMaximaPair(e); + if (result && (result->OutIdx == Skip || + (result->NextInAEL == result->PrevInAEL && !IsHorizontal(*result)))) return 0; + return result; +} +//------------------------------------------------------------------------------ + +void Clipper::SwapPositionsInSEL(TEdge *Edge1, TEdge *Edge2) +{ + if( !( Edge1->NextInSEL ) && !( Edge1->PrevInSEL ) ) return; + if( !( Edge2->NextInSEL ) && !( Edge2->PrevInSEL ) ) return; + + if( Edge1->NextInSEL == Edge2 ) + { + TEdge* Next = Edge2->NextInSEL; + if( Next ) Next->PrevInSEL = Edge1; + TEdge* Prev = Edge1->PrevInSEL; + if( Prev ) Prev->NextInSEL = Edge2; + Edge2->PrevInSEL = Prev; + Edge2->NextInSEL = Edge1; + Edge1->PrevInSEL = Edge2; + Edge1->NextInSEL = Next; + } + else if( Edge2->NextInSEL == Edge1 ) + { + TEdge* Next = Edge1->NextInSEL; + if( Next ) Next->PrevInSEL = Edge2; + TEdge* Prev = Edge2->PrevInSEL; + if( Prev ) Prev->NextInSEL = Edge1; + Edge1->PrevInSEL = Prev; + Edge1->NextInSEL = Edge2; + Edge2->PrevInSEL = Edge1; + Edge2->NextInSEL = Next; + } + else + { + TEdge* Next = Edge1->NextInSEL; + TEdge* Prev = Edge1->PrevInSEL; + Edge1->NextInSEL = Edge2->NextInSEL; + if( Edge1->NextInSEL ) Edge1->NextInSEL->PrevInSEL = Edge1; + Edge1->PrevInSEL = Edge2->PrevInSEL; + if( Edge1->PrevInSEL ) Edge1->PrevInSEL->NextInSEL = Edge1; + Edge2->NextInSEL = Next; + if( Edge2->NextInSEL ) Edge2->NextInSEL->PrevInSEL = Edge2; + Edge2->PrevInSEL = Prev; + if( Edge2->PrevInSEL ) Edge2->PrevInSEL->NextInSEL = Edge2; + } + + if( !Edge1->PrevInSEL ) m_SortedEdges = Edge1; + else if( !Edge2->PrevInSEL ) m_SortedEdges = Edge2; +} +//------------------------------------------------------------------------------ + +TEdge* GetNextInAEL(TEdge *e, Direction dir) +{ + return dir == dLeftToRight ? e->NextInAEL : e->PrevInAEL; +} +//------------------------------------------------------------------------------ + +void GetHorzDirection(TEdge& HorzEdge, Direction& Dir, cInt& Left, cInt& Right) +{ + if (HorzEdge.Bot.X < HorzEdge.Top.X) + { + Left = HorzEdge.Bot.X; + Right = HorzEdge.Top.X; + Dir = dLeftToRight; + } else + { + Left = HorzEdge.Top.X; + Right = HorzEdge.Bot.X; + Dir = dRightToLeft; + } +} +//------------------------------------------------------------------------ + +/******************************************************************************* +* Notes: Horizontal edges (HEs) at scanline intersections (ie at the Top or * +* Bottom of a scanbeam) are processed as if layered. The order in which HEs * +* are processed doesn't matter. HEs intersect with other HE Bot.Xs only [#] * +* (or they could intersect with Top.Xs only, ie EITHER Bot.Xs OR Top.Xs), * +* and with other non-horizontal edges [*]. Once these intersections are * +* processed, intermediate HEs then 'promote' the Edge above (NextInLML) into * +* the AEL. These 'promoted' edges may in turn intersect [%] with other HEs. * +*******************************************************************************/ + +void Clipper::ProcessHorizontal(TEdge *horzEdge) +{ + Direction dir; + cInt horzLeft, horzRight; + bool IsOpen = (horzEdge->WindDelta == 0); + + GetHorzDirection(*horzEdge, dir, horzLeft, horzRight); + + TEdge* eLastHorz = horzEdge, *eMaxPair = 0; + while (eLastHorz->NextInLML && IsHorizontal(*eLastHorz->NextInLML)) + eLastHorz = eLastHorz->NextInLML; + if (!eLastHorz->NextInLML) + eMaxPair = GetMaximaPair(eLastHorz); + + MaximaList::const_iterator maxIt; + MaximaList::const_reverse_iterator maxRit; + if (m_Maxima.size() > 0) + { + //get the first maxima in range (X) ... + if (dir == dLeftToRight) + { + maxIt = m_Maxima.begin(); + while (maxIt != m_Maxima.end() && *maxIt <= horzEdge->Bot.X) maxIt++; + if (maxIt != m_Maxima.end() && *maxIt >= eLastHorz->Top.X) + maxIt = m_Maxima.end(); + } + else + { + maxRit = m_Maxima.rbegin(); + while (maxRit != m_Maxima.rend() && *maxRit > horzEdge->Bot.X) maxRit++; + if (maxRit != m_Maxima.rend() && *maxRit <= eLastHorz->Top.X) + maxRit = m_Maxima.rend(); + } + } + + OutPt* op1 = 0; + + for (;;) //loop through consec. horizontal edges + { + + bool IsLastHorz = (horzEdge == eLastHorz); + TEdge* e = GetNextInAEL(horzEdge, dir); + while(e) + { + + //this code block inserts extra coords into horizontal edges (in output + //polygons) whereever maxima touch these horizontal edges. This helps + //'simplifying' polygons (ie if the Simplify property is set). + if (m_Maxima.size() > 0) + { + if (dir == dLeftToRight) + { + while (maxIt != m_Maxima.end() && *maxIt < e->Curr.X) + { + if (horzEdge->OutIdx >= 0 && !IsOpen) + AddOutPt(horzEdge, IntPoint(*maxIt, horzEdge->Bot.Y)); + maxIt++; + } + } + else + { + while (maxRit != m_Maxima.rend() && *maxRit > e->Curr.X) + { + if (horzEdge->OutIdx >= 0 && !IsOpen) + AddOutPt(horzEdge, IntPoint(*maxRit, horzEdge->Bot.Y)); + maxRit++; + } + } + }; + + if ((dir == dLeftToRight && e->Curr.X > horzRight) || + (dir == dRightToLeft && e->Curr.X < horzLeft)) break; + + //Also break if we've got to the end of an intermediate horizontal edge ... + //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal. + if (e->Curr.X == horzEdge->Top.X && horzEdge->NextInLML && + e->Dx < horzEdge->NextInLML->Dx) break; + + if (horzEdge->OutIdx >= 0 && !IsOpen) //note: may be done multiple times + { +#ifdef use_xyz + if (dir == dLeftToRight) SetZ(e->Curr, *horzEdge, *e); + else SetZ(e->Curr, *e, *horzEdge); +#endif + op1 = AddOutPt(horzEdge, e->Curr); + TEdge* eNextHorz = m_SortedEdges; + while (eNextHorz) + { + if (eNextHorz->OutIdx >= 0 && + HorzSegmentsOverlap(horzEdge->Bot.X, + horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X)) + { + OutPt* op2 = GetLastOutPt(eNextHorz); + AddJoin(op2, op1, eNextHorz->Top); + } + eNextHorz = eNextHorz->NextInSEL; + } + AddGhostJoin(op1, horzEdge->Bot); + } + + //OK, so far we're still in range of the horizontal Edge but make sure + //we're at the last of consec. horizontals when matching with eMaxPair + if(e == eMaxPair && IsLastHorz) + { + if (horzEdge->OutIdx >= 0) + AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge->Top); + DeleteFromAEL(horzEdge); + DeleteFromAEL(eMaxPair); + return; + } + + if(dir == dLeftToRight) + { + IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y); + IntersectEdges(horzEdge, e, Pt); + } + else + { + IntPoint Pt = IntPoint(e->Curr.X, horzEdge->Curr.Y); + IntersectEdges( e, horzEdge, Pt); + } + TEdge* eNext = GetNextInAEL(e, dir); + SwapPositionsInAEL( horzEdge, e ); + e = eNext; + } //end while(e) + + //Break out of loop if HorzEdge.NextInLML is not also horizontal ... + if (!horzEdge->NextInLML || !IsHorizontal(*horzEdge->NextInLML)) break; + + UpdateEdgeIntoAEL(horzEdge); + if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Bot); + GetHorzDirection(*horzEdge, dir, horzLeft, horzRight); + + } //end for (;;) + + if (horzEdge->OutIdx >= 0 && !op1) + { + op1 = GetLastOutPt(horzEdge); + TEdge* eNextHorz = m_SortedEdges; + while (eNextHorz) + { + if (eNextHorz->OutIdx >= 0 && + HorzSegmentsOverlap(horzEdge->Bot.X, + horzEdge->Top.X, eNextHorz->Bot.X, eNextHorz->Top.X)) + { + OutPt* op2 = GetLastOutPt(eNextHorz); + AddJoin(op2, op1, eNextHorz->Top); + } + eNextHorz = eNextHorz->NextInSEL; + } + AddGhostJoin(op1, horzEdge->Top); + } + + if (horzEdge->NextInLML) + { + if(horzEdge->OutIdx >= 0) + { + op1 = AddOutPt( horzEdge, horzEdge->Top); + UpdateEdgeIntoAEL(horzEdge); + if (horzEdge->WindDelta == 0) return; + //nb: HorzEdge is no longer horizontal here + TEdge* ePrev = horzEdge->PrevInAEL; + TEdge* eNext = horzEdge->NextInAEL; + if (ePrev && ePrev->Curr.X == horzEdge->Bot.X && + ePrev->Curr.Y == horzEdge->Bot.Y && ePrev->WindDelta != 0 && + (ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y && + SlopesEqual(*horzEdge, *ePrev, m_UseFullRange))) + { + OutPt* op2 = AddOutPt(ePrev, horzEdge->Bot); + AddJoin(op1, op2, horzEdge->Top); + } + else if (eNext && eNext->Curr.X == horzEdge->Bot.X && + eNext->Curr.Y == horzEdge->Bot.Y && eNext->WindDelta != 0 && + eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y && + SlopesEqual(*horzEdge, *eNext, m_UseFullRange)) + { + OutPt* op2 = AddOutPt(eNext, horzEdge->Bot); + AddJoin(op1, op2, horzEdge->Top); + } + } + else + UpdateEdgeIntoAEL(horzEdge); + } + else + { + if (horzEdge->OutIdx >= 0) AddOutPt(horzEdge, horzEdge->Top); + DeleteFromAEL(horzEdge); + } +} +//------------------------------------------------------------------------------ + +bool Clipper::ProcessIntersections(const cInt topY) +{ + if( !m_ActiveEdges ) return true; + try { + BuildIntersectList(topY); + size_t IlSize = m_IntersectList.size(); + if (IlSize == 0) return true; + if (IlSize == 1 || FixupIntersectionOrder()) ProcessIntersectList(); + else return false; + } + catch(...) + { + m_SortedEdges = 0; + DisposeIntersectNodes(); + throw clipperException("ProcessIntersections error"); + } + m_SortedEdges = 0; + return true; +} +//------------------------------------------------------------------------------ + +void Clipper::DisposeIntersectNodes() +{ + for (size_t i = 0; i < m_IntersectList.size(); ++i ) + delete m_IntersectList[i]; + m_IntersectList.clear(); +} +//------------------------------------------------------------------------------ + +void Clipper::BuildIntersectList(const cInt topY) +{ + if ( !m_ActiveEdges ) return; + + //prepare for sorting ... + TEdge* e = m_ActiveEdges; + m_SortedEdges = e; + while( e ) + { + e->PrevInSEL = e->PrevInAEL; + e->NextInSEL = e->NextInAEL; + e->Curr.X = TopX( *e, topY ); + e = e->NextInAEL; + } + + //bubblesort ... + bool isModified; + do + { + isModified = false; + e = m_SortedEdges; + while( e->NextInSEL ) + { + TEdge *eNext = e->NextInSEL; + IntPoint Pt; + if(e->Curr.X > eNext->Curr.X) + { + IntersectPoint(*e, *eNext, Pt); + if (Pt.Y < topY) Pt = IntPoint(TopX(*e, topY), topY); + IntersectNode * newNode = new IntersectNode; + newNode->Edge1 = e; + newNode->Edge2 = eNext; + newNode->Pt = Pt; + m_IntersectList.push_back(newNode); + + SwapPositionsInSEL(e, eNext); + isModified = true; + } + else + e = eNext; + } + if( e->PrevInSEL ) e->PrevInSEL->NextInSEL = 0; + else break; + } + while ( isModified ); + m_SortedEdges = 0; //important +} +//------------------------------------------------------------------------------ + + +void Clipper::ProcessIntersectList() +{ + for (size_t i = 0; i < m_IntersectList.size(); ++i) + { + IntersectNode* iNode = m_IntersectList[i]; + { + IntersectEdges( iNode->Edge1, iNode->Edge2, iNode->Pt); + SwapPositionsInAEL( iNode->Edge1 , iNode->Edge2 ); + } + delete iNode; + } + m_IntersectList.clear(); +} +//------------------------------------------------------------------------------ + +bool IntersectListSort(IntersectNode* node1, IntersectNode* node2) +{ + return node2->Pt.Y < node1->Pt.Y; +} +//------------------------------------------------------------------------------ + +inline bool EdgesAdjacent(const IntersectNode &inode) +{ + return (inode.Edge1->NextInSEL == inode.Edge2) || + (inode.Edge1->PrevInSEL == inode.Edge2); +} +//------------------------------------------------------------------------------ + +bool Clipper::FixupIntersectionOrder() +{ + //pre-condition: intersections are sorted Bottom-most first. + //Now it's crucial that intersections are made only between adjacent edges, + //so to ensure this the order of intersections may need adjusting ... + CopyAELToSEL(); + std::sort(m_IntersectList.begin(), m_IntersectList.end(), IntersectListSort); + size_t cnt = m_IntersectList.size(); + for (size_t i = 0; i < cnt; ++i) + { + if (!EdgesAdjacent(*m_IntersectList[i])) + { + size_t j = i + 1; + while (j < cnt && !EdgesAdjacent(*m_IntersectList[j])) j++; + if (j == cnt) return false; + std::swap(m_IntersectList[i], m_IntersectList[j]); + } + SwapPositionsInSEL(m_IntersectList[i]->Edge1, m_IntersectList[i]->Edge2); + } + return true; +} +//------------------------------------------------------------------------------ + +void Clipper::DoMaxima(TEdge *e) +{ + TEdge* eMaxPair = GetMaximaPairEx(e); + if (!eMaxPair) + { + if (e->OutIdx >= 0) + AddOutPt(e, e->Top); + DeleteFromAEL(e); + return; + } + + TEdge* eNext = e->NextInAEL; + while(eNext && eNext != eMaxPair) + { + IntersectEdges(e, eNext, e->Top); + SwapPositionsInAEL(e, eNext); + eNext = e->NextInAEL; + } + + if(e->OutIdx == Unassigned && eMaxPair->OutIdx == Unassigned) + { + DeleteFromAEL(e); + DeleteFromAEL(eMaxPair); + } + else if( e->OutIdx >= 0 && eMaxPair->OutIdx >= 0 ) + { + if (e->OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e->Top); + DeleteFromAEL(e); + DeleteFromAEL(eMaxPair); + } +#ifdef use_lines + else if (e->WindDelta == 0) + { + if (e->OutIdx >= 0) + { + AddOutPt(e, e->Top); + e->OutIdx = Unassigned; + } + DeleteFromAEL(e); + + if (eMaxPair->OutIdx >= 0) + { + AddOutPt(eMaxPair, e->Top); + eMaxPair->OutIdx = Unassigned; + } + DeleteFromAEL(eMaxPair); + } +#endif + else throw clipperException("DoMaxima error"); +} +//------------------------------------------------------------------------------ + +void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY) +{ + TEdge* e = m_ActiveEdges; + while( e ) + { + //1. process maxima, treating them as if they're 'bent' horizontal edges, + // but exclude maxima with horizontal edges. nb: e can't be a horizontal. + bool IsMaximaEdge = IsMaxima(e, topY); + + if(IsMaximaEdge) + { + TEdge* eMaxPair = GetMaximaPairEx(e); + IsMaximaEdge = (!eMaxPair || !IsHorizontal(*eMaxPair)); + } + + if(IsMaximaEdge) + { + if (m_StrictSimple) m_Maxima.push_back(e->Top.X); + TEdge* ePrev = e->PrevInAEL; + DoMaxima(e); + if( !ePrev ) e = m_ActiveEdges; + else e = ePrev->NextInAEL; + } + else + { + //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ... + if (IsIntermediate(e, topY) && IsHorizontal(*e->NextInLML)) + { + UpdateEdgeIntoAEL(e); + if (e->OutIdx >= 0) + AddOutPt(e, e->Bot); + AddEdgeToSEL(e); + } + else + { + e->Curr.X = TopX( *e, topY ); + e->Curr.Y = topY; +#ifdef use_xyz + e->Curr.Z = topY == e->Top.Y ? e->Top.Z : (topY == e->Bot.Y ? e->Bot.Z : 0); +#endif + } + + //When StrictlySimple and 'e' is being touched by another edge, then + //make sure both edges have a vertex here ... + if (m_StrictSimple) + { + TEdge* ePrev = e->PrevInAEL; + if ((e->OutIdx >= 0) && (e->WindDelta != 0) && ePrev && (ePrev->OutIdx >= 0) && + (ePrev->Curr.X == e->Curr.X) && (ePrev->WindDelta != 0)) + { + IntPoint pt = e->Curr; +#ifdef use_xyz + SetZ(pt, *ePrev, *e); +#endif + OutPt* op = AddOutPt(ePrev, pt); + OutPt* op2 = AddOutPt(e, pt); + AddJoin(op, op2, pt); //StrictlySimple (type-3) join + } + } + + e = e->NextInAEL; + } + } + + //3. Process horizontals at the Top of the scanbeam ... + m_Maxima.sort(); + ProcessHorizontals(); + m_Maxima.clear(); + + //4. Promote intermediate vertices ... + e = m_ActiveEdges; + while(e) + { + if(IsIntermediate(e, topY)) + { + OutPt* op = 0; + if( e->OutIdx >= 0 ) + op = AddOutPt(e, e->Top); + UpdateEdgeIntoAEL(e); + + //if output polygons share an edge, they'll need joining later ... + TEdge* ePrev = e->PrevInAEL; + TEdge* eNext = e->NextInAEL; + if (ePrev && ePrev->Curr.X == e->Bot.X && + ePrev->Curr.Y == e->Bot.Y && op && + ePrev->OutIdx >= 0 && ePrev->Curr.Y > ePrev->Top.Y && + SlopesEqual(e->Curr, e->Top, ePrev->Curr, ePrev->Top, m_UseFullRange) && + (e->WindDelta != 0) && (ePrev->WindDelta != 0)) + { + OutPt* op2 = AddOutPt(ePrev, e->Bot); + AddJoin(op, op2, e->Top); + } + else if (eNext && eNext->Curr.X == e->Bot.X && + eNext->Curr.Y == e->Bot.Y && op && + eNext->OutIdx >= 0 && eNext->Curr.Y > eNext->Top.Y && + SlopesEqual(e->Curr, e->Top, eNext->Curr, eNext->Top, m_UseFullRange) && + (e->WindDelta != 0) && (eNext->WindDelta != 0)) + { + OutPt* op2 = AddOutPt(eNext, e->Bot); + AddJoin(op, op2, e->Top); + } + } + e = e->NextInAEL; + } +} +//------------------------------------------------------------------------------ + +void Clipper::FixupOutPolyline(OutRec &outrec) +{ + OutPt *pp = outrec.Pts; + OutPt *lastPP = pp->Prev; + while (pp != lastPP) + { + pp = pp->Next; + if (pp->Pt == pp->Prev->Pt) + { + if (pp == lastPP) lastPP = pp->Prev; + OutPt *tmpPP = pp->Prev; + tmpPP->Next = pp->Next; + pp->Next->Prev = tmpPP; + delete pp; + pp = tmpPP; + } + } + + if (pp == pp->Prev) + { + DisposeOutPts(pp); + outrec.Pts = 0; + return; + } +} +//------------------------------------------------------------------------------ + +void Clipper::FixupOutPolygon(OutRec &outrec) +{ + //FixupOutPolygon() - removes duplicate points and simplifies consecutive + //parallel edges by removing the middle vertex. + OutPt *lastOK = 0; + outrec.BottomPt = 0; + OutPt *pp = outrec.Pts; + bool preserveCol = m_PreserveCollinear || m_StrictSimple; + + for (;;) + { + if (pp->Prev == pp || pp->Prev == pp->Next) + { + DisposeOutPts(pp); + outrec.Pts = 0; + return; + } + + //test for duplicate points and collinear edges ... + if ((pp->Pt == pp->Next->Pt) || (pp->Pt == pp->Prev->Pt) || + (SlopesEqual(pp->Prev->Pt, pp->Pt, pp->Next->Pt, m_UseFullRange) && + (!preserveCol || !Pt2IsBetweenPt1AndPt3(pp->Prev->Pt, pp->Pt, pp->Next->Pt)))) + { + lastOK = 0; + OutPt *tmp = pp; + pp->Prev->Next = pp->Next; + pp->Next->Prev = pp->Prev; + pp = pp->Prev; + delete tmp; + } + else if (pp == lastOK) break; + else + { + if (!lastOK) lastOK = pp; + pp = pp->Next; + } + } + outrec.Pts = pp; +} +//------------------------------------------------------------------------------ + +int PointCount(OutPt *Pts) +{ + if (!Pts) return 0; + int result = 0; + OutPt* p = Pts; + do + { + result++; + p = p->Next; + } + while (p != Pts); + return result; +} +//------------------------------------------------------------------------------ + +void Clipper::BuildResult(Paths &polys) +{ + polys.reserve(m_PolyOuts.size()); + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + if (!m_PolyOuts[i]->Pts) continue; + Path pg; + OutPt* p = m_PolyOuts[i]->Pts->Prev; + int cnt = PointCount(p); + if (cnt < 2) continue; + pg.reserve(cnt); + for (int i = 0; i < cnt; ++i) + { + pg.push_back(p->Pt); + p = p->Prev; + } + polys.push_back(pg); + } +} +//------------------------------------------------------------------------------ + +void Clipper::BuildResult2(PolyTree& polytree) +{ + polytree.Clear(); + polytree.AllNodes.reserve(m_PolyOuts.size()); + //add each output polygon/contour to polytree ... + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) + { + OutRec* outRec = m_PolyOuts[i]; + int cnt = PointCount(outRec->Pts); + if ((outRec->IsOpen && cnt < 2) || (!outRec->IsOpen && cnt < 3)) continue; + FixHoleLinkage(*outRec); + PolyNode* pn = new PolyNode(); + //nb: polytree takes ownership of all the PolyNodes + polytree.AllNodes.push_back(pn); + outRec->PolyNd = pn; + pn->Parent = 0; + pn->Index = 0; + pn->Contour.reserve(cnt); + OutPt *op = outRec->Pts->Prev; + for (int j = 0; j < cnt; j++) + { + pn->Contour.push_back(op->Pt); + op = op->Prev; + } + } + + //fixup PolyNode links etc ... + polytree.Childs.reserve(m_PolyOuts.size()); + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); i++) + { + OutRec* outRec = m_PolyOuts[i]; + if (!outRec->PolyNd) continue; + if (outRec->IsOpen) + { + outRec->PolyNd->m_IsOpen = true; + polytree.AddChild(*outRec->PolyNd); + } + else if (outRec->FirstLeft && outRec->FirstLeft->PolyNd) + outRec->FirstLeft->PolyNd->AddChild(*outRec->PolyNd); + else + polytree.AddChild(*outRec->PolyNd); + } +} +//------------------------------------------------------------------------------ + +void SwapIntersectNodes(IntersectNode &int1, IntersectNode &int2) +{ + //just swap the contents (because fIntersectNodes is a single-linked-list) + IntersectNode inode = int1; //gets a copy of Int1 + int1.Edge1 = int2.Edge1; + int1.Edge2 = int2.Edge2; + int1.Pt = int2.Pt; + int2.Edge1 = inode.Edge1; + int2.Edge2 = inode.Edge2; + int2.Pt = inode.Pt; +} +//------------------------------------------------------------------------------ + +inline bool E2InsertsBeforeE1(TEdge &e1, TEdge &e2) +{ + if (e2.Curr.X == e1.Curr.X) + { + if (e2.Top.Y > e1.Top.Y) + return e2.Top.X < TopX(e1, e2.Top.Y); + else return e1.Top.X > TopX(e2, e1.Top.Y); + } + else return e2.Curr.X < e1.Curr.X; +} +//------------------------------------------------------------------------------ + +bool GetOverlap(const cInt a1, const cInt a2, const cInt b1, const cInt b2, + cInt& Left, cInt& Right) +{ + if (a1 < a2) + { + if (b1 < b2) {Left = std::max(a1,b1); Right = std::min(a2,b2);} + else {Left = std::max(a1,b2); Right = std::min(a2,b1);} + } + else + { + if (b1 < b2) {Left = std::max(a2,b1); Right = std::min(a1,b2);} + else {Left = std::max(a2,b2); Right = std::min(a1,b1);} + } + return Left < Right; +} +//------------------------------------------------------------------------------ + +inline void UpdateOutPtIdxs(OutRec& outrec) +{ + OutPt* op = outrec.Pts; + do + { + op->Idx = outrec.Idx; + op = op->Prev; + } + while(op != outrec.Pts); +} +//------------------------------------------------------------------------------ + +void Clipper::InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge) +{ + if(!m_ActiveEdges) + { + edge->PrevInAEL = 0; + edge->NextInAEL = 0; + m_ActiveEdges = edge; + } + else if(!startEdge && E2InsertsBeforeE1(*m_ActiveEdges, *edge)) + { + edge->PrevInAEL = 0; + edge->NextInAEL = m_ActiveEdges; + m_ActiveEdges->PrevInAEL = edge; + m_ActiveEdges = edge; + } + else + { + if(!startEdge) startEdge = m_ActiveEdges; + while(startEdge->NextInAEL && + !E2InsertsBeforeE1(*startEdge->NextInAEL , *edge)) + startEdge = startEdge->NextInAEL; + edge->NextInAEL = startEdge->NextInAEL; + if(startEdge->NextInAEL) startEdge->NextInAEL->PrevInAEL = edge; + edge->PrevInAEL = startEdge; + startEdge->NextInAEL = edge; + } +} +//---------------------------------------------------------------------- + +OutPt* DupOutPt(OutPt* outPt, bool InsertAfter) +{ + OutPt* result = new OutPt; + result->Pt = outPt->Pt; + result->Idx = outPt->Idx; + if (InsertAfter) + { + result->Next = outPt->Next; + result->Prev = outPt; + outPt->Next->Prev = result; + outPt->Next = result; + } + else + { + result->Prev = outPt->Prev; + result->Next = outPt; + outPt->Prev->Next = result; + outPt->Prev = result; + } + return result; +} +//------------------------------------------------------------------------------ + +bool JoinHorz(OutPt* op1, OutPt* op1b, OutPt* op2, OutPt* op2b, + const IntPoint Pt, bool DiscardLeft) +{ + Direction Dir1 = (op1->Pt.X > op1b->Pt.X ? dRightToLeft : dLeftToRight); + Direction Dir2 = (op2->Pt.X > op2b->Pt.X ? dRightToLeft : dLeftToRight); + if (Dir1 == Dir2) return false; + + //When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we + //want Op1b to be on the Right. (And likewise with Op2 and Op2b.) + //So, to facilitate this while inserting Op1b and Op2b ... + //when DiscardLeft, make sure we're AT or RIGHT of Pt before adding Op1b, + //otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.) + if (Dir1 == dLeftToRight) + { + while (op1->Next->Pt.X <= Pt.X && + op1->Next->Pt.X >= op1->Pt.X && op1->Next->Pt.Y == Pt.Y) + op1 = op1->Next; + if (DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next; + op1b = DupOutPt(op1, !DiscardLeft); + if (op1b->Pt != Pt) + { + op1 = op1b; + op1->Pt = Pt; + op1b = DupOutPt(op1, !DiscardLeft); + } + } + else + { + while (op1->Next->Pt.X >= Pt.X && + op1->Next->Pt.X <= op1->Pt.X && op1->Next->Pt.Y == Pt.Y) + op1 = op1->Next; + if (!DiscardLeft && (op1->Pt.X != Pt.X)) op1 = op1->Next; + op1b = DupOutPt(op1, DiscardLeft); + if (op1b->Pt != Pt) + { + op1 = op1b; + op1->Pt = Pt; + op1b = DupOutPt(op1, DiscardLeft); + } + } + + if (Dir2 == dLeftToRight) + { + while (op2->Next->Pt.X <= Pt.X && + op2->Next->Pt.X >= op2->Pt.X && op2->Next->Pt.Y == Pt.Y) + op2 = op2->Next; + if (DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next; + op2b = DupOutPt(op2, !DiscardLeft); + if (op2b->Pt != Pt) + { + op2 = op2b; + op2->Pt = Pt; + op2b = DupOutPt(op2, !DiscardLeft); + }; + } else + { + while (op2->Next->Pt.X >= Pt.X && + op2->Next->Pt.X <= op2->Pt.X && op2->Next->Pt.Y == Pt.Y) + op2 = op2->Next; + if (!DiscardLeft && (op2->Pt.X != Pt.X)) op2 = op2->Next; + op2b = DupOutPt(op2, DiscardLeft); + if (op2b->Pt != Pt) + { + op2 = op2b; + op2->Pt = Pt; + op2b = DupOutPt(op2, DiscardLeft); + }; + }; + + if ((Dir1 == dLeftToRight) == DiscardLeft) + { + op1->Prev = op2; + op2->Next = op1; + op1b->Next = op2b; + op2b->Prev = op1b; + } + else + { + op1->Next = op2; + op2->Prev = op1; + op1b->Prev = op2b; + op2b->Next = op1b; + } + return true; +} +//------------------------------------------------------------------------------ + +bool Clipper::JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2) +{ + OutPt *op1 = j->OutPt1, *op1b; + OutPt *op2 = j->OutPt2, *op2b; + + //There are 3 kinds of joins for output polygons ... + //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are vertices anywhere + //along (horizontal) collinear edges (& Join.OffPt is on the same horizontal). + //2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same + //location at the Bottom of the overlapping segment (& Join.OffPt is above). + //3. StrictSimple joins where edges touch but are not collinear and where + //Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point. + bool isHorizontal = (j->OutPt1->Pt.Y == j->OffPt.Y); + + if (isHorizontal && (j->OffPt == j->OutPt1->Pt) && + (j->OffPt == j->OutPt2->Pt)) + { + //Strictly Simple join ... + if (outRec1 != outRec2) return false; + op1b = j->OutPt1->Next; + while (op1b != op1 && (op1b->Pt == j->OffPt)) + op1b = op1b->Next; + bool reverse1 = (op1b->Pt.Y > j->OffPt.Y); + op2b = j->OutPt2->Next; + while (op2b != op2 && (op2b->Pt == j->OffPt)) + op2b = op2b->Next; + bool reverse2 = (op2b->Pt.Y > j->OffPt.Y); + if (reverse1 == reverse2) return false; + if (reverse1) + { + op1b = DupOutPt(op1, false); + op2b = DupOutPt(op2, true); + op1->Prev = op2; + op2->Next = op1; + op1b->Next = op2b; + op2b->Prev = op1b; + j->OutPt1 = op1; + j->OutPt2 = op1b; + return true; + } else + { + op1b = DupOutPt(op1, true); + op2b = DupOutPt(op2, false); + op1->Next = op2; + op2->Prev = op1; + op1b->Prev = op2b; + op2b->Next = op1b; + j->OutPt1 = op1; + j->OutPt2 = op1b; + return true; + } + } + else if (isHorizontal) + { + //treat horizontal joins differently to non-horizontal joins since with + //them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt + //may be anywhere along the horizontal edge. + op1b = op1; + while (op1->Prev->Pt.Y == op1->Pt.Y && op1->Prev != op1b && op1->Prev != op2) + op1 = op1->Prev; + while (op1b->Next->Pt.Y == op1b->Pt.Y && op1b->Next != op1 && op1b->Next != op2) + op1b = op1b->Next; + if (op1b->Next == op1 || op1b->Next == op2) return false; //a flat 'polygon' + + op2b = op2; + while (op2->Prev->Pt.Y == op2->Pt.Y && op2->Prev != op2b && op2->Prev != op1b) + op2 = op2->Prev; + while (op2b->Next->Pt.Y == op2b->Pt.Y && op2b->Next != op2 && op2b->Next != op1) + op2b = op2b->Next; + if (op2b->Next == op2 || op2b->Next == op1) return false; //a flat 'polygon' + + cInt Left, Right; + //Op1 --> Op1b & Op2 --> Op2b are the extremites of the horizontal edges + if (!GetOverlap(op1->Pt.X, op1b->Pt.X, op2->Pt.X, op2b->Pt.X, Left, Right)) + return false; + + //DiscardLeftSide: when overlapping edges are joined, a spike will created + //which needs to be cleaned up. However, we don't want Op1 or Op2 caught up + //on the discard Side as either may still be needed for other joins ... + IntPoint Pt; + bool DiscardLeftSide; + if (op1->Pt.X >= Left && op1->Pt.X <= Right) + { + Pt = op1->Pt; DiscardLeftSide = (op1->Pt.X > op1b->Pt.X); + } + else if (op2->Pt.X >= Left&& op2->Pt.X <= Right) + { + Pt = op2->Pt; DiscardLeftSide = (op2->Pt.X > op2b->Pt.X); + } + else if (op1b->Pt.X >= Left && op1b->Pt.X <= Right) + { + Pt = op1b->Pt; DiscardLeftSide = op1b->Pt.X > op1->Pt.X; + } + else + { + Pt = op2b->Pt; DiscardLeftSide = (op2b->Pt.X > op2->Pt.X); + } + j->OutPt1 = op1; j->OutPt2 = op2; + return JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide); + } else + { + //nb: For non-horizontal joins ... + // 1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y + // 2. Jr.OutPt1.Pt > Jr.OffPt.Y + + //make sure the polygons are correctly oriented ... + op1b = op1->Next; + while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Next; + bool Reverse1 = ((op1b->Pt.Y > op1->Pt.Y) || + !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)); + if (Reverse1) + { + op1b = op1->Prev; + while ((op1b->Pt == op1->Pt) && (op1b != op1)) op1b = op1b->Prev; + if ((op1b->Pt.Y > op1->Pt.Y) || + !SlopesEqual(op1->Pt, op1b->Pt, j->OffPt, m_UseFullRange)) return false; + }; + op2b = op2->Next; + while ((op2b->Pt == op2->Pt) && (op2b != op2))op2b = op2b->Next; + bool Reverse2 = ((op2b->Pt.Y > op2->Pt.Y) || + !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)); + if (Reverse2) + { + op2b = op2->Prev; + while ((op2b->Pt == op2->Pt) && (op2b != op2)) op2b = op2b->Prev; + if ((op2b->Pt.Y > op2->Pt.Y) || + !SlopesEqual(op2->Pt, op2b->Pt, j->OffPt, m_UseFullRange)) return false; + } + + if ((op1b == op1) || (op2b == op2) || (op1b == op2b) || + ((outRec1 == outRec2) && (Reverse1 == Reverse2))) return false; + + if (Reverse1) + { + op1b = DupOutPt(op1, false); + op2b = DupOutPt(op2, true); + op1->Prev = op2; + op2->Next = op1; + op1b->Next = op2b; + op2b->Prev = op1b; + j->OutPt1 = op1; + j->OutPt2 = op1b; + return true; + } else + { + op1b = DupOutPt(op1, true); + op2b = DupOutPt(op2, false); + op1->Next = op2; + op2->Prev = op1; + op1b->Prev = op2b; + op2b->Next = op1b; + j->OutPt1 = op1; + j->OutPt2 = op1b; + return true; + } + } +} +//---------------------------------------------------------------------- + +static OutRec* ParseFirstLeft(OutRec* FirstLeft) +{ + while (FirstLeft && !FirstLeft->Pts) + FirstLeft = FirstLeft->FirstLeft; + return FirstLeft; +} +//------------------------------------------------------------------------------ + +void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) +{ + //tests if NewOutRec contains the polygon before reassigning FirstLeft + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec* outRec = m_PolyOuts[i]; + OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft); + if (outRec->Pts && firstLeft == OldOutRec) + { + if (Poly2ContainsPoly1(outRec->Pts, NewOutRec->Pts)) + outRec->FirstLeft = NewOutRec; + } + } +} +//---------------------------------------------------------------------- + +void Clipper::FixupFirstLefts2(OutRec* InnerOutRec, OutRec* OuterOutRec) +{ + //A polygon has split into two such that one is now the inner of the other. + //It's possible that these polygons now wrap around other polygons, so check + //every polygon that's also contained by OuterOutRec's FirstLeft container + //(including 0) to see if they've become inner to the new inner polygon ... + OutRec* orfl = OuterOutRec->FirstLeft; + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec* outRec = m_PolyOuts[i]; + + if (!outRec->Pts || outRec == OuterOutRec || outRec == InnerOutRec) + continue; + OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft); + if (firstLeft != orfl && firstLeft != InnerOutRec && firstLeft != OuterOutRec) + continue; + if (Poly2ContainsPoly1(outRec->Pts, InnerOutRec->Pts)) + outRec->FirstLeft = InnerOutRec; + else if (Poly2ContainsPoly1(outRec->Pts, OuterOutRec->Pts)) + outRec->FirstLeft = OuterOutRec; + else if (outRec->FirstLeft == InnerOutRec || outRec->FirstLeft == OuterOutRec) + outRec->FirstLeft = orfl; + } +} +//---------------------------------------------------------------------- +void Clipper::FixupFirstLefts3(OutRec* OldOutRec, OutRec* NewOutRec) +{ + //reassigns FirstLeft WITHOUT testing if NewOutRec contains the polygon + for (PolyOutList::size_type i = 0; i < m_PolyOuts.size(); ++i) + { + OutRec* outRec = m_PolyOuts[i]; + OutRec* firstLeft = ParseFirstLeft(outRec->FirstLeft); + if (outRec->Pts && firstLeft == OldOutRec) + outRec->FirstLeft = NewOutRec; + } +} +//---------------------------------------------------------------------- + +void Clipper::JoinCommonEdges() +{ + for (JoinList::size_type i = 0; i < m_Joins.size(); i++) + { + Join* join = m_Joins[i]; + + OutRec *outRec1 = GetOutRec(join->OutPt1->Idx); + OutRec *outRec2 = GetOutRec(join->OutPt2->Idx); + + if (!outRec1->Pts || !outRec2->Pts) continue; + if (outRec1->IsOpen || outRec2->IsOpen) continue; + + //get the polygon fragment with the correct hole state (FirstLeft) + //before calling JoinPoints() ... + OutRec *holeStateRec; + if (outRec1 == outRec2) holeStateRec = outRec1; + else if (OutRec1RightOfOutRec2(outRec1, outRec2)) holeStateRec = outRec2; + else if (OutRec1RightOfOutRec2(outRec2, outRec1)) holeStateRec = outRec1; + else holeStateRec = GetLowermostRec(outRec1, outRec2); + + if (!JoinPoints(join, outRec1, outRec2)) continue; + + if (outRec1 == outRec2) + { + //instead of joining two polygons, we've just created a new one by + //splitting one polygon into two. + outRec1->Pts = join->OutPt1; + outRec1->BottomPt = 0; + outRec2 = CreateOutRec(); + outRec2->Pts = join->OutPt2; + + //update all OutRec2.Pts Idx's ... + UpdateOutPtIdxs(*outRec2); + + if (Poly2ContainsPoly1(outRec2->Pts, outRec1->Pts)) + { + //outRec1 contains outRec2 ... + outRec2->IsHole = !outRec1->IsHole; + outRec2->FirstLeft = outRec1; + + if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); + + if ((outRec2->IsHole ^ m_ReverseOutput) == (Area(*outRec2) > 0)) + ReversePolyPtLinks(outRec2->Pts); + + } else if (Poly2ContainsPoly1(outRec1->Pts, outRec2->Pts)) + { + //outRec2 contains outRec1 ... + outRec2->IsHole = outRec1->IsHole; + outRec1->IsHole = !outRec2->IsHole; + outRec2->FirstLeft = outRec1->FirstLeft; + outRec1->FirstLeft = outRec2; + + if (m_UsingPolyTree) FixupFirstLefts2(outRec1, outRec2); + + if ((outRec1->IsHole ^ m_ReverseOutput) == (Area(*outRec1) > 0)) + ReversePolyPtLinks(outRec1->Pts); + } + else + { + //the 2 polygons are completely separate ... + outRec2->IsHole = outRec1->IsHole; + outRec2->FirstLeft = outRec1->FirstLeft; + + //fixup FirstLeft pointers that may need reassigning to OutRec2 + if (m_UsingPolyTree) FixupFirstLefts1(outRec1, outRec2); + } + + } else + { + //joined 2 polygons together ... + + outRec2->Pts = 0; + outRec2->BottomPt = 0; + outRec2->Idx = outRec1->Idx; + + outRec1->IsHole = holeStateRec->IsHole; + if (holeStateRec == outRec2) + outRec1->FirstLeft = outRec2->FirstLeft; + outRec2->FirstLeft = outRec1; + + if (m_UsingPolyTree) FixupFirstLefts3(outRec2, outRec1); + } + } +} + +//------------------------------------------------------------------------------ +// ClipperOffset support functions ... +//------------------------------------------------------------------------------ + +DoublePoint GetUnitNormal(const IntPoint &pt1, const IntPoint &pt2) +{ + if(pt2.X == pt1.X && pt2.Y == pt1.Y) + return DoublePoint(0, 0); + + double Dx = (double)(pt2.X - pt1.X); + double dy = (double)(pt2.Y - pt1.Y); + double f = 1 *1.0/ std::sqrt( Dx*Dx + dy*dy ); + Dx *= f; + dy *= f; + return DoublePoint(dy, -Dx); +} + +//------------------------------------------------------------------------------ +// ClipperOffset class +//------------------------------------------------------------------------------ + +ClipperOffset::ClipperOffset(double miterLimit, double arcTolerance) +{ + this->MiterLimit = miterLimit; + this->ArcTolerance = arcTolerance; + m_lowest.X = -1; +} +//------------------------------------------------------------------------------ + +ClipperOffset::~ClipperOffset() +{ + Clear(); +} +//------------------------------------------------------------------------------ + +void ClipperOffset::Clear() +{ + for (int i = 0; i < m_polyNodes.ChildCount(); ++i) + delete m_polyNodes.Childs[i]; + m_polyNodes.Childs.clear(); + m_lowest.X = -1; +} +//------------------------------------------------------------------------------ + +void ClipperOffset::AddPath(const Path& path, JoinType joinType, EndType endType) +{ + int highI = (int)path.size() - 1; + if (highI < 0) return; + PolyNode* newNode = new PolyNode(); + newNode->m_jointype = joinType; + newNode->m_endtype = endType; + + //strip duplicate points from path and also get index to the lowest point ... + if (endType == etClosedLine || endType == etClosedPolygon) + while (highI > 0 && path[0] == path[highI]) highI--; + newNode->Contour.reserve(highI + 1); + newNode->Contour.push_back(path[0]); + int j = 0, k = 0; + for (int i = 1; i <= highI; i++) + if (newNode->Contour[j] != path[i]) + { + j++; + newNode->Contour.push_back(path[i]); + if (path[i].Y > newNode->Contour[k].Y || + (path[i].Y == newNode->Contour[k].Y && + path[i].X < newNode->Contour[k].X)) k = j; + } + if (endType == etClosedPolygon && j < 2) + { + delete newNode; + return; + } + m_polyNodes.AddChild(*newNode); + + //if this path's lowest pt is lower than all the others then update m_lowest + if (endType != etClosedPolygon) return; + if (m_lowest.X < 0) + m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k); + else + { + IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X]->Contour[(int)m_lowest.Y]; + if (newNode->Contour[k].Y > ip.Y || + (newNode->Contour[k].Y == ip.Y && + newNode->Contour[k].X < ip.X)) + m_lowest = IntPoint(m_polyNodes.ChildCount() - 1, k); + } +} +//------------------------------------------------------------------------------ + +void ClipperOffset::AddPaths(const Paths& paths, JoinType joinType, EndType endType) +{ + for (Paths::size_type i = 0; i < paths.size(); ++i) + AddPath(paths[i], joinType, endType); +} +//------------------------------------------------------------------------------ + +void ClipperOffset::FixOrientations() +{ + //fixup orientations of all closed paths if the orientation of the + //closed path with the lowermost vertex is wrong ... + if (m_lowest.X >= 0 && + !Orientation(m_polyNodes.Childs[(int)m_lowest.X]->Contour)) + { + for (int i = 0; i < m_polyNodes.ChildCount(); ++i) + { + PolyNode& node = *m_polyNodes.Childs[i]; + if (node.m_endtype == etClosedPolygon || + (node.m_endtype == etClosedLine && Orientation(node.Contour))) + ReversePath(node.Contour); + } + } else + { + for (int i = 0; i < m_polyNodes.ChildCount(); ++i) + { + PolyNode& node = *m_polyNodes.Childs[i]; + if (node.m_endtype == etClosedLine && !Orientation(node.Contour)) + ReversePath(node.Contour); + } + } +} +//------------------------------------------------------------------------------ + +void ClipperOffset::Execute(Paths& solution, double delta) +{ + solution.clear(); + FixOrientations(); + DoOffset(delta); + + //now clean up 'corners' ... + Clipper clpr; + clpr.AddPaths(m_destPolys, ptSubject, true); + if (delta > 0) + { + clpr.Execute(ctUnion, solution, pftPositive, pftPositive); + } + else + { + IntRect r = clpr.GetBounds(); + Path outer(4); + outer[0] = IntPoint(r.left - 10, r.bottom + 10); + outer[1] = IntPoint(r.right + 10, r.bottom + 10); + outer[2] = IntPoint(r.right + 10, r.top - 10); + outer[3] = IntPoint(r.left - 10, r.top - 10); + + clpr.AddPath(outer, ptSubject, true); + clpr.ReverseSolution(true); + clpr.Execute(ctUnion, solution, pftNegative, pftNegative); + if (solution.size() > 0) solution.erase(solution.begin()); + } +} +//------------------------------------------------------------------------------ + +void ClipperOffset::Execute(PolyTree& solution, double delta) +{ + solution.Clear(); + FixOrientations(); + DoOffset(delta); + + //now clean up 'corners' ... + Clipper clpr; + clpr.AddPaths(m_destPolys, ptSubject, true); + if (delta > 0) + { + clpr.Execute(ctUnion, solution, pftPositive, pftPositive); + } + else + { + IntRect r = clpr.GetBounds(); + Path outer(4); + outer[0] = IntPoint(r.left - 10, r.bottom + 10); + outer[1] = IntPoint(r.right + 10, r.bottom + 10); + outer[2] = IntPoint(r.right + 10, r.top - 10); + outer[3] = IntPoint(r.left - 10, r.top - 10); + + clpr.AddPath(outer, ptSubject, true); + clpr.ReverseSolution(true); + clpr.Execute(ctUnion, solution, pftNegative, pftNegative); + //remove the outer PolyNode rectangle ... + if (solution.ChildCount() == 1 && solution.Childs[0]->ChildCount() > 0) + { + PolyNode* outerNode = solution.Childs[0]; + solution.Childs.reserve(outerNode->ChildCount()); + solution.Childs[0] = outerNode->Childs[0]; + solution.Childs[0]->Parent = outerNode->Parent; + for (int i = 1; i < outerNode->ChildCount(); ++i) + solution.AddChild(*outerNode->Childs[i]); + } + else + solution.Clear(); + } +} +//------------------------------------------------------------------------------ + +void ClipperOffset::DoOffset(double delta) +{ + m_destPolys.clear(); + m_delta = delta; + + //if Zero offset, just copy any CLOSED polygons to m_p and return ... + if (NEAR_ZERO(delta)) + { + m_destPolys.reserve(m_polyNodes.ChildCount()); + for (int i = 0; i < m_polyNodes.ChildCount(); i++) + { + PolyNode& node = *m_polyNodes.Childs[i]; + if (node.m_endtype == etClosedPolygon) + m_destPolys.push_back(node.Contour); + } + return; + } + + //see offset_triginometry3.svg in the documentation folder ... + if (MiterLimit > 2) m_miterLim = 2/(MiterLimit * MiterLimit); + else m_miterLim = 0.5; + + double y; + if (ArcTolerance <= 0.0) y = def_arc_tolerance; + else if (ArcTolerance > std::fabs(delta) * def_arc_tolerance) + y = std::fabs(delta) * def_arc_tolerance; + else y = ArcTolerance; + //see offset_triginometry2.svg in the documentation folder ... + double steps = pi / std::acos(1 - y / std::fabs(delta)); + if (steps > std::fabs(delta) * pi) + steps = std::fabs(delta) * pi; //ie excessive precision check + m_sin = std::sin(two_pi / steps); + m_cos = std::cos(two_pi / steps); + m_StepsPerRad = steps / two_pi; + if (delta < 0.0) m_sin = -m_sin; + + m_destPolys.reserve(m_polyNodes.ChildCount() * 2); + for (int i = 0; i < m_polyNodes.ChildCount(); i++) + { + PolyNode& node = *m_polyNodes.Childs[i]; + m_srcPoly = node.Contour; + + int len = (int)m_srcPoly.size(); + if (len == 0 || (delta <= 0 && (len < 3 || node.m_endtype != etClosedPolygon))) + continue; + + m_destPoly.clear(); + if (len == 1) + { + if (node.m_jointype == jtRound) + { + double X = 1.0, Y = 0.0; + for (cInt j = 1; j <= steps; j++) + { + m_destPoly.push_back(IntPoint( + Round(m_srcPoly[0].X + X * delta), + Round(m_srcPoly[0].Y + Y * delta))); + double X2 = X; + X = X * m_cos - m_sin * Y; + Y = X2 * m_sin + Y * m_cos; + } + } + else + { + double X = -1.0, Y = -1.0; + for (int j = 0; j < 4; ++j) + { + m_destPoly.push_back(IntPoint( + Round(m_srcPoly[0].X + X * delta), + Round(m_srcPoly[0].Y + Y * delta))); + if (X < 0) X = 1; + else if (Y < 0) Y = 1; + else X = -1; + } + } + m_destPolys.push_back(m_destPoly); + continue; + } + //build m_normals ... + m_normals.clear(); + m_normals.reserve(len); + for (int j = 0; j < len - 1; ++j) + m_normals.push_back(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1])); + if (node.m_endtype == etClosedLine || node.m_endtype == etClosedPolygon) + m_normals.push_back(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0])); + else + m_normals.push_back(DoublePoint(m_normals[len - 2])); + + if (node.m_endtype == etClosedPolygon) + { + int k = len - 1; + for (int j = 0; j < len; ++j) + OffsetPoint(j, k, node.m_jointype); + m_destPolys.push_back(m_destPoly); + } + else if (node.m_endtype == etClosedLine) + { + int k = len - 1; + for (int j = 0; j < len; ++j) + OffsetPoint(j, k, node.m_jointype); + m_destPolys.push_back(m_destPoly); + m_destPoly.clear(); + //re-build m_normals ... + DoublePoint n = m_normals[len -1]; + for (int j = len - 1; j > 0; j--) + m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); + m_normals[0] = DoublePoint(-n.X, -n.Y); + k = 0; + for (int j = len - 1; j >= 0; j--) + OffsetPoint(j, k, node.m_jointype); + m_destPolys.push_back(m_destPoly); + } + else + { + int k = 0; + for (int j = 1; j < len - 1; ++j) + OffsetPoint(j, k, node.m_jointype); + + IntPoint pt1; + if (node.m_endtype == etOpenButt) + { + int j = len - 1; + pt1 = IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X * + delta), (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta)); + m_destPoly.push_back(pt1); + pt1 = IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X * + delta), (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta)); + m_destPoly.push_back(pt1); + } + else + { + int j = len - 1; + k = len - 2; + m_sinA = 0; + m_normals[j] = DoublePoint(-m_normals[j].X, -m_normals[j].Y); + if (node.m_endtype == etOpenSquare) + DoSquare(j, k); + else + DoRound(j, k); + } + + //re-build m_normals ... + for (int j = len - 1; j > 0; j--) + m_normals[j] = DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); + m_normals[0] = DoublePoint(-m_normals[1].X, -m_normals[1].Y); + + k = len - 1; + for (int j = k - 1; j > 0; --j) OffsetPoint(j, k, node.m_jointype); + + if (node.m_endtype == etOpenButt) + { + pt1 = IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta), + (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta)); + m_destPoly.push_back(pt1); + pt1 = IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta), + (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta)); + m_destPoly.push_back(pt1); + } + else + { + k = 1; + m_sinA = 0; + if (node.m_endtype == etOpenSquare) + DoSquare(0, 1); + else + DoRound(0, 1); + } + m_destPolys.push_back(m_destPoly); + } + } +} +//------------------------------------------------------------------------------ + +void ClipperOffset::OffsetPoint(int j, int& k, JoinType jointype) +{ + //cross product ... + m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y); + if (std::fabs(m_sinA * m_delta) < 1.0) + { + //dot product ... + double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y ); + if (cosA > 0) // angle => 0 degrees + { + m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); + return; + } + //else angle => 180 degrees + } + else if (m_sinA > 1.0) m_sinA = 1.0; + else if (m_sinA < -1.0) m_sinA = -1.0; + + if (m_sinA * m_delta < 0) + { + m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); + m_destPoly.push_back(m_srcPoly[j]); + m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); + } + else + switch (jointype) + { + case jtMiter: + { + double r = 1 + (m_normals[j].X * m_normals[k].X + + m_normals[j].Y * m_normals[k].Y); + if (r >= m_miterLim) DoMiter(j, k, r); else DoSquare(j, k); + break; + } + case jtSquare: DoSquare(j, k); break; + case jtRound: DoRound(j, k); break; + } + k = j; +} +//------------------------------------------------------------------------------ + +void ClipperOffset::DoSquare(int j, int k) +{ + double dx = std::tan(std::atan2(m_sinA, + m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) / 4); + m_destPoly.push_back(IntPoint( + Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)), + Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx)))); + m_destPoly.push_back(IntPoint( + Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)), + Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx)))); +} +//------------------------------------------------------------------------------ + +void ClipperOffset::DoMiter(int j, int k, double r) +{ + double q = m_delta / r; + m_destPoly.push_back(IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q), + Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q))); +} +//------------------------------------------------------------------------------ + +void ClipperOffset::DoRound(int j, int k) +{ + double a = std::atan2(m_sinA, + m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y); + int steps = std::max((int)Round(m_StepsPerRad * std::fabs(a)), 1); + + double X = m_normals[k].X, Y = m_normals[k].Y, X2; + for (int i = 0; i < steps; ++i) + { + m_destPoly.push_back(IntPoint( + Round(m_srcPoly[j].X + X * m_delta), + Round(m_srcPoly[j].Y + Y * m_delta))); + X2 = X; + X = X * m_cos - m_sin * Y; + Y = X2 * m_sin + Y * m_cos; + } + m_destPoly.push_back(IntPoint( + Round(m_srcPoly[j].X + m_normals[j].X * m_delta), + Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); +} + +//------------------------------------------------------------------------------ +// Miscellaneous public functions +//------------------------------------------------------------------------------ + +void Clipper::DoSimplePolygons() +{ + PolyOutList::size_type i = 0; + while (i < m_PolyOuts.size()) + { + OutRec* outrec = m_PolyOuts[i++]; + OutPt* op = outrec->Pts; + if (!op || outrec->IsOpen) continue; + do //for each Pt in Polygon until duplicate found do ... + { + OutPt* op2 = op->Next; + while (op2 != outrec->Pts) + { + if ((op->Pt == op2->Pt) && op2->Next != op && op2->Prev != op) + { + //split the polygon into two ... + OutPt* op3 = op->Prev; + OutPt* op4 = op2->Prev; + op->Prev = op4; + op4->Next = op; + op2->Prev = op3; + op3->Next = op2; + + outrec->Pts = op; + OutRec* outrec2 = CreateOutRec(); + outrec2->Pts = op2; + UpdateOutPtIdxs(*outrec2); + if (Poly2ContainsPoly1(outrec2->Pts, outrec->Pts)) + { + //OutRec2 is contained by OutRec1 ... + outrec2->IsHole = !outrec->IsHole; + outrec2->FirstLeft = outrec; + if (m_UsingPolyTree) FixupFirstLefts2(outrec2, outrec); + } + else + if (Poly2ContainsPoly1(outrec->Pts, outrec2->Pts)) + { + //OutRec1 is contained by OutRec2 ... + outrec2->IsHole = outrec->IsHole; + outrec->IsHole = !outrec2->IsHole; + outrec2->FirstLeft = outrec->FirstLeft; + outrec->FirstLeft = outrec2; + if (m_UsingPolyTree) FixupFirstLefts2(outrec, outrec2); + } + else + { + //the 2 polygons are separate ... + outrec2->IsHole = outrec->IsHole; + outrec2->FirstLeft = outrec->FirstLeft; + if (m_UsingPolyTree) FixupFirstLefts1(outrec, outrec2); + } + op2 = op; //ie get ready for the Next iteration + } + op2 = op2->Next; + } + op = op->Next; + } + while (op != outrec->Pts); + } +} +//------------------------------------------------------------------------------ + +void ReversePath(Path& p) +{ + std::reverse(p.begin(), p.end()); +} +//------------------------------------------------------------------------------ + +void ReversePaths(Paths& p) +{ + for (Paths::size_type i = 0; i < p.size(); ++i) + ReversePath(p[i]); +} +//------------------------------------------------------------------------------ + +void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType) +{ + Clipper c; + c.StrictlySimple(true); + c.AddPath(in_poly, ptSubject, true); + c.Execute(ctUnion, out_polys, fillType, fillType); +} +//------------------------------------------------------------------------------ + +void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType) +{ + Clipper c; + c.StrictlySimple(true); + c.AddPaths(in_polys, ptSubject, true); + c.Execute(ctUnion, out_polys, fillType, fillType); +} +//------------------------------------------------------------------------------ + +void SimplifyPolygons(Paths &polys, PolyFillType fillType) +{ + SimplifyPolygons(polys, polys, fillType); +} +//------------------------------------------------------------------------------ + +inline double DistanceSqrd(const IntPoint& pt1, const IntPoint& pt2) +{ + double Dx = ((double)pt1.X - pt2.X); + double dy = ((double)pt1.Y - pt2.Y); + return (Dx*Dx + dy*dy); +} +//------------------------------------------------------------------------------ + +double DistanceFromLineSqrd( + const IntPoint& pt, const IntPoint& ln1, const IntPoint& ln2) +{ + //The equation of a line in general form (Ax + By + C = 0) + //given 2 points (x¹,y¹) & (x²,y²) is ... + //(y¹ - y²)x + (x² - x¹)y + (y² - y¹)x¹ - (x² - x¹)y¹ = 0 + //A = (y¹ - y²); B = (x² - x¹); C = (y² - y¹)x¹ - (x² - x¹)y¹ + //perpendicular distance of point (x³,y³) = (Ax³ + By³ + C)/Sqrt(A² + B²) + //see http://en.wikipedia.org/wiki/Perpendicular_distance + double A = double(ln1.Y - ln2.Y); + double B = double(ln2.X - ln1.X); + double C = A * ln1.X + B * ln1.Y; + C = A * pt.X + B * pt.Y - C; + return (C * C) / (A * A + B * B); +} +//--------------------------------------------------------------------------- + +bool SlopesNearCollinear(const IntPoint& pt1, + const IntPoint& pt2, const IntPoint& pt3, double distSqrd) +{ + //this function is more accurate when the point that's geometrically + //between the other 2 points is the one that's tested for distance. + //ie makes it more likely to pick up 'spikes' ... + if (Abs(pt1.X - pt2.X) > Abs(pt1.Y - pt2.Y)) + { + if ((pt1.X > pt2.X) == (pt1.X < pt3.X)) + return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; + else if ((pt2.X > pt1.X) == (pt2.X < pt3.X)) + return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; + else + return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; + } + else + { + if ((pt1.Y > pt2.Y) == (pt1.Y < pt3.Y)) + return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; + else if ((pt2.Y > pt1.Y) == (pt2.Y < pt3.Y)) + return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; + else + return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; + } +} +//------------------------------------------------------------------------------ + +bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd) +{ + double Dx = (double)pt1.X - pt2.X; + double dy = (double)pt1.Y - pt2.Y; + return ((Dx * Dx) + (dy * dy) <= distSqrd); +} +//------------------------------------------------------------------------------ + +OutPt* ExcludeOp(OutPt* op) +{ + OutPt* result = op->Prev; + result->Next = op->Next; + op->Next->Prev = result; + result->Idx = 0; + return result; +} +//------------------------------------------------------------------------------ + +void CleanPolygon(const Path& in_poly, Path& out_poly, double distance) +{ + //distance = proximity in units/pixels below which vertices + //will be stripped. Default ~= sqrt(2). + + size_t size = in_poly.size(); + + if (size == 0) + { + out_poly.clear(); + return; + } + + OutPt* outPts = new OutPt[size]; + for (size_t i = 0; i < size; ++i) + { + outPts[i].Pt = in_poly[i]; + outPts[i].Next = &outPts[(i + 1) % size]; + outPts[i].Next->Prev = &outPts[i]; + outPts[i].Idx = 0; + } + + double distSqrd = distance * distance; + OutPt* op = &outPts[0]; + while (op->Idx == 0 && op->Next != op->Prev) + { + if (PointsAreClose(op->Pt, op->Prev->Pt, distSqrd)) + { + op = ExcludeOp(op); + size--; + } + else if (PointsAreClose(op->Prev->Pt, op->Next->Pt, distSqrd)) + { + ExcludeOp(op->Next); + op = ExcludeOp(op); + size -= 2; + } + else if (SlopesNearCollinear(op->Prev->Pt, op->Pt, op->Next->Pt, distSqrd)) + { + op = ExcludeOp(op); + size--; + } + else + { + op->Idx = 1; + op = op->Next; + } + } + + if (size < 3) size = 0; + out_poly.resize(size); + for (size_t i = 0; i < size; ++i) + { + out_poly[i] = op->Pt; + op = op->Next; + } + delete [] outPts; +} +//------------------------------------------------------------------------------ + +void CleanPolygon(Path& poly, double distance) +{ + CleanPolygon(poly, poly, distance); +} +//------------------------------------------------------------------------------ + +void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance) +{ + out_polys.resize(in_polys.size()); + for (Paths::size_type i = 0; i < in_polys.size(); ++i) + CleanPolygon(in_polys[i], out_polys[i], distance); +} +//------------------------------------------------------------------------------ + +void CleanPolygons(Paths& polys, double distance) +{ + CleanPolygons(polys, polys, distance); +} +//------------------------------------------------------------------------------ + +void Minkowski(const Path& poly, const Path& path, + Paths& solution, bool isSum, bool isClosed) +{ + int delta = (isClosed ? 1 : 0); + size_t polyCnt = poly.size(); + size_t pathCnt = path.size(); + Paths pp; + pp.reserve(pathCnt); + if (isSum) + for (size_t i = 0; i < pathCnt; ++i) + { + Path p; + p.reserve(polyCnt); + for (size_t j = 0; j < poly.size(); ++j) + p.push_back(IntPoint(path[i].X + poly[j].X, path[i].Y + poly[j].Y)); + pp.push_back(p); + } + else + for (size_t i = 0; i < pathCnt; ++i) + { + Path p; + p.reserve(polyCnt); + for (size_t j = 0; j < poly.size(); ++j) + p.push_back(IntPoint(path[i].X - poly[j].X, path[i].Y - poly[j].Y)); + pp.push_back(p); + } + + solution.clear(); + solution.reserve((pathCnt + delta) * (polyCnt + 1)); + for (size_t i = 0; i < pathCnt - 1 + delta; ++i) + for (size_t j = 0; j < polyCnt; ++j) + { + Path quad; + quad.reserve(4); + quad.push_back(pp[i % pathCnt][j % polyCnt]); + quad.push_back(pp[(i + 1) % pathCnt][j % polyCnt]); + quad.push_back(pp[(i + 1) % pathCnt][(j + 1) % polyCnt]); + quad.push_back(pp[i % pathCnt][(j + 1) % polyCnt]); + if (!Orientation(quad)) ReversePath(quad); + solution.push_back(quad); + } +} +//------------------------------------------------------------------------------ + +void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed) +{ + Minkowski(pattern, path, solution, true, pathIsClosed); + Clipper c; + c.AddPaths(solution, ptSubject, true); + c.Execute(ctUnion, solution, pftNonZero, pftNonZero); +} +//------------------------------------------------------------------------------ + +void TranslatePath(const Path& input, Path& output, const IntPoint delta) +{ + //precondition: input != output + output.resize(input.size()); + for (size_t i = 0; i < input.size(); ++i) + output[i] = IntPoint(input[i].X + delta.X, input[i].Y + delta.Y); +} +//------------------------------------------------------------------------------ + +void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed) +{ + Clipper c; + for (size_t i = 0; i < paths.size(); ++i) + { + Paths tmp; + Minkowski(pattern, paths[i], tmp, true, pathIsClosed); + c.AddPaths(tmp, ptSubject, true); + if (pathIsClosed) + { + Path tmp2; + TranslatePath(paths[i], tmp2, pattern[0]); + c.AddPath(tmp2, ptClip, true); + } + } + c.Execute(ctUnion, solution, pftNonZero, pftNonZero); +} +//------------------------------------------------------------------------------ + +void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution) +{ + Minkowski(poly1, poly2, solution, false, true); + Clipper c; + c.AddPaths(solution, ptSubject, true); + c.Execute(ctUnion, solution, pftNonZero, pftNonZero); +} +//------------------------------------------------------------------------------ + +enum NodeType {ntAny, ntOpen, ntClosed}; + +void AddPolyNodeToPaths(const PolyNode& polynode, NodeType nodetype, Paths& paths) +{ + bool match = true; + if (nodetype == ntClosed) match = !polynode.IsOpen(); + else if (nodetype == ntOpen) return; + + if (!polynode.Contour.empty() && match) + paths.push_back(polynode.Contour); + for (int i = 0; i < polynode.ChildCount(); ++i) + AddPolyNodeToPaths(*polynode.Childs[i], nodetype, paths); +} +//------------------------------------------------------------------------------ + +void PolyTreeToPaths(const PolyTree& polytree, Paths& paths) +{ + paths.resize(0); + paths.reserve(polytree.Total()); + AddPolyNodeToPaths(polytree, ntAny, paths); +} +//------------------------------------------------------------------------------ + +void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths) +{ + paths.resize(0); + paths.reserve(polytree.Total()); + AddPolyNodeToPaths(polytree, ntClosed, paths); +} +//------------------------------------------------------------------------------ + +void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths) +{ + paths.resize(0); + paths.reserve(polytree.Total()); + //Open paths are top level only, so ... + for (int i = 0; i < polytree.ChildCount(); ++i) + if (polytree.Childs[i]->IsOpen()) + paths.push_back(polytree.Childs[i]->Contour); +} +//------------------------------------------------------------------------------ + +std::ostream& operator <<(std::ostream &s, const IntPoint &p) +{ + s << "(" << p.X << "," << p.Y << ")"; + return s; +} +//------------------------------------------------------------------------------ + +std::ostream& operator <<(std::ostream &s, const Path &p) +{ + if (p.empty()) return s; + Path::size_type last = p.size() -1; + for (Path::size_type i = 0; i < last; i++) + s << "(" << p[i].X << "," << p[i].Y << "), "; + s << "(" << p[last].X << "," << p[last].Y << ")\n"; + return s; +} +//------------------------------------------------------------------------------ + +std::ostream& operator <<(std::ostream &s, const Paths &p) +{ + for (Paths::size_type i = 0; i < p.size(); i++) + s << p[i]; + s << "\n"; + return s; +} +//------------------------------------------------------------------------------ + +} //QtClipperLib namespace diff --git a/src/3rdparty/clipper/clipper.h b/src/3rdparty/clipper/clipper.h new file mode 100644 index 0000000..de4a540 --- /dev/null +++ b/src/3rdparty/clipper/clipper.h @@ -0,0 +1,404 @@ +/******************************************************************************* +* * +* Author : Angus Johnson * +* Version : 6.4.2 * +* Date : 27 February 2017 * +* Website : http://www.angusj.com * +* Copyright : Angus Johnson 2010-2017 * +* * +* License: * +* Use, modification & distribution is subject to Boost Software License Ver 1. * +* http://www.boost.org/LICENSE_1_0.txt * +* * +* Attributions: * +* The code in this library is an extension of Bala Vatti's clipping algorithm: * +* "A generic solution to polygon clipping" * +* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * +* http://portal.acm.org/citation.cfm?id=129906 * +* * +* Computer graphics and geometric modeling: implementation and algorithms * +* By Max K. Agoston * +* Springer; 1 edition (January 4, 2005) * +* http://books.google.com/books?q=vatti+clipping+agoston * +* * +* See also: * +* "Polygon Offsetting by Computing Winding Numbers" * +* Paper no. DETC2005-85513 pp. 565-575 * +* ASME 2005 International Design Engineering Technical Conferences * +* and Computers and Information in Engineering Conference (IDETC/CIE2005) * +* September 24-28, 2005 , Long Beach, California, USA * +* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * +* * +*******************************************************************************/ + +#ifndef clipper_hpp +#define clipper_hpp + +#define CLIPPER_VERSION "6.4.2" + +//use_int32: When enabled 32bit ints are used instead of 64bit ints. This +//improve performance but coordinate values are limited to the range +/- 46340 +//#define use_int32 + +//use_xyz: adds a Z member to IntPoint. Adds a minor cost to perfomance. +//#define use_xyz + +//use_lines: Enables line clipping. Adds a very minor cost to performance. +#define use_lines + +//use_deprecated: Enables temporary support for the obsolete functions +//#define use_deprecated + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace QtClipperLib { + +enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor }; +enum PolyType { ptSubject, ptClip }; +//By far the most widely used winding rules for polygon filling are +//EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32) +//Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL) +//see http://glprogramming.com/red/chapter11.html +enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative }; + +#ifdef use_int32 + typedef int cInt; + static cInt const loRange = 0x7FFF; + static cInt const hiRange = 0x7FFF; +#else + typedef signed long long cInt; + static cInt const loRange = 0x3FFFFFFF; + static cInt const hiRange = 0x3FFFFFFFFFFFFFFFLL; + typedef signed long long long64; //used by Int128 class + typedef unsigned long long ulong64; + +#endif + +struct IntPoint { + cInt X; + cInt Y; +#ifdef use_xyz + cInt Z; + IntPoint(cInt x = 0, cInt y = 0, cInt z = 0): X(x), Y(y), Z(z) {}; +#else + IntPoint(cInt x = 0, cInt y = 0): X(x), Y(y) {}; +#endif + + friend inline bool operator== (const IntPoint& a, const IntPoint& b) + { + return a.X == b.X && a.Y == b.Y; + } + friend inline bool operator!= (const IntPoint& a, const IntPoint& b) + { + return a.X != b.X || a.Y != b.Y; + } +}; +//------------------------------------------------------------------------------ + +typedef std::vector< IntPoint > Path; +typedef std::vector< Path > Paths; + +inline Path& operator <<(Path& poly, const IntPoint& p) {poly.push_back(p); return poly;} +inline Paths& operator <<(Paths& polys, const Path& p) {polys.push_back(p); return polys;} + +std::ostream& operator <<(std::ostream &s, const IntPoint &p); +std::ostream& operator <<(std::ostream &s, const Path &p); +std::ostream& operator <<(std::ostream &s, const Paths &p); + +struct DoublePoint +{ + double X; + double Y; + DoublePoint(double x = 0, double y = 0) : X(x), Y(y) {} + DoublePoint(IntPoint ip) : X((double)ip.X), Y((double)ip.Y) {} +}; +//------------------------------------------------------------------------------ + +#ifdef use_xyz +typedef void (*ZFillCallback)(IntPoint& e1bot, IntPoint& e1top, IntPoint& e2bot, IntPoint& e2top, IntPoint& pt); +#endif + +enum InitOptions {ioReverseSolution = 1, ioStrictlySimple = 2, ioPreserveCollinear = 4}; +enum JoinType {jtSquare, jtRound, jtMiter}; +enum EndType {etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound}; + +class PolyNode; +typedef std::vector< PolyNode* > PolyNodes; + +class PolyNode +{ +public: + PolyNode(); + virtual ~PolyNode(){}; + Path Contour; + PolyNodes Childs; + PolyNode* Parent; + PolyNode* GetNext() const; + bool IsHole() const; + bool IsOpen() const; + int ChildCount() const; +private: + unsigned Index; //node index in Parent.Childs + bool m_IsOpen; + JoinType m_jointype; + EndType m_endtype; + PolyNode* GetNextSiblingUp() const; + void AddChild(PolyNode& child); + friend class Clipper; //to access Index + friend class ClipperOffset; +}; + +class PolyTree: public PolyNode +{ +public: + ~PolyTree(){ Clear(); }; + PolyNode* GetFirst() const; + void Clear(); + int Total() const; +private: + PolyNodes AllNodes; + friend class Clipper; //to access AllNodes +}; + +bool Orientation(const Path &poly); +double Area(const Path &poly); +int PointInPolygon(const IntPoint &pt, const Path &path); + +void SimplifyPolygon(const Path &in_poly, Paths &out_polys, PolyFillType fillType = pftEvenOdd); +void SimplifyPolygons(const Paths &in_polys, Paths &out_polys, PolyFillType fillType = pftEvenOdd); +void SimplifyPolygons(Paths &polys, PolyFillType fillType = pftEvenOdd); + +void CleanPolygon(const Path& in_poly, Path& out_poly, double distance = 1.415); +void CleanPolygon(Path& poly, double distance = 1.415); +void CleanPolygons(const Paths& in_polys, Paths& out_polys, double distance = 1.415); +void CleanPolygons(Paths& polys, double distance = 1.415); + +void MinkowskiSum(const Path& pattern, const Path& path, Paths& solution, bool pathIsClosed); +void MinkowskiSum(const Path& pattern, const Paths& paths, Paths& solution, bool pathIsClosed); +void MinkowskiDiff(const Path& poly1, const Path& poly2, Paths& solution); + +void PolyTreeToPaths(const PolyTree& polytree, Paths& paths); +void ClosedPathsFromPolyTree(const PolyTree& polytree, Paths& paths); +void OpenPathsFromPolyTree(PolyTree& polytree, Paths& paths); + +void ReversePath(Path& p); +void ReversePaths(Paths& p); + +struct IntRect { cInt left; cInt top; cInt right; cInt bottom; }; + +//enums that are used internally ... +enum EdgeSide { esLeft = 1, esRight = 2}; + +//forward declarations (for stuff used internally) ... +struct TEdge; +struct IntersectNode; +struct LocalMinimum; +struct OutPt; +struct OutRec; +struct Join; + +typedef std::vector < OutRec* > PolyOutList; +typedef std::vector < TEdge* > EdgeList; +typedef std::vector < Join* > JoinList; +typedef std::vector < IntersectNode* > IntersectList; + +//------------------------------------------------------------------------------ + +//ClipperBase is the ancestor to the Clipper class. It should not be +//instantiated directly. This class simply abstracts the conversion of sets of +//polygon coordinates into edge objects that are stored in a LocalMinima list. +class ClipperBase +{ +public: + ClipperBase(); + virtual ~ClipperBase(); + virtual bool AddPath(const Path &pg, PolyType PolyTyp, bool Closed); + bool AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed); + virtual void Clear(); + IntRect GetBounds(); + bool PreserveCollinear() {return m_PreserveCollinear;}; + void PreserveCollinear(bool value) {m_PreserveCollinear = value;}; +protected: + void DisposeLocalMinimaList(); + TEdge* AddBoundsToLML(TEdge *e, bool IsClosed); + virtual void Reset(); + TEdge* ProcessBound(TEdge* E, bool IsClockwise); + void InsertScanbeam(const cInt Y); + bool PopScanbeam(cInt &Y); + bool LocalMinimaPending(); + bool PopLocalMinima(cInt Y, const LocalMinimum *&locMin); + OutRec* CreateOutRec(); + void DisposeAllOutRecs(); + void DisposeOutRec(PolyOutList::size_type index); + void SwapPositionsInAEL(TEdge *edge1, TEdge *edge2); + void DeleteFromAEL(TEdge *e); + void UpdateEdgeIntoAEL(TEdge *&e); + + typedef std::vector MinimaList; + MinimaList::iterator m_CurrentLM; + MinimaList m_MinimaList; + + bool m_UseFullRange; + EdgeList m_edges; + bool m_PreserveCollinear; + bool m_HasOpenPaths; + PolyOutList m_PolyOuts; + TEdge *m_ActiveEdges; + + typedef std::priority_queue ScanbeamList; + ScanbeamList m_Scanbeam; +}; +//------------------------------------------------------------------------------ + +class Clipper : public virtual ClipperBase +{ +public: + Clipper(int initOptions = 0); + bool Execute(ClipType clipType, + Paths &solution, + PolyFillType fillType = pftEvenOdd); + bool Execute(ClipType clipType, + Paths &solution, + PolyFillType subjFillType, + PolyFillType clipFillType); + bool Execute(ClipType clipType, + PolyTree &polytree, + PolyFillType fillType = pftEvenOdd); + bool Execute(ClipType clipType, + PolyTree &polytree, + PolyFillType subjFillType, + PolyFillType clipFillType); + bool ReverseSolution() { return m_ReverseOutput; }; + void ReverseSolution(bool value) {m_ReverseOutput = value;}; + bool StrictlySimple() {return m_StrictSimple;}; + void StrictlySimple(bool value) {m_StrictSimple = value;}; + //set the callback function for z value filling on intersections (otherwise Z is 0) +#ifdef use_xyz + void ZFillFunction(ZFillCallback zFillFunc); +#endif +protected: + virtual bool ExecuteInternal(); +private: + JoinList m_Joins; + JoinList m_GhostJoins; + IntersectList m_IntersectList; + ClipType m_ClipType; + typedef std::list MaximaList; + MaximaList m_Maxima; + TEdge *m_SortedEdges; + bool m_ExecuteLocked; + PolyFillType m_ClipFillType; + PolyFillType m_SubjFillType; + bool m_ReverseOutput; + bool m_UsingPolyTree; + bool m_StrictSimple; +#ifdef use_xyz + ZFillCallback m_ZFill; //custom callback +#endif + void SetWindingCount(TEdge& edge); + bool IsEvenOddFillType(const TEdge& edge) const; + bool IsEvenOddAltFillType(const TEdge& edge) const; + void InsertLocalMinimaIntoAEL(const cInt botY); + void InsertEdgeIntoAEL(TEdge *edge, TEdge* startEdge); + void AddEdgeToSEL(TEdge *edge); + bool PopEdgeFromSEL(TEdge *&edge); + void CopyAELToSEL(); + void DeleteFromSEL(TEdge *e); + void SwapPositionsInSEL(TEdge *edge1, TEdge *edge2); + bool IsContributing(const TEdge& edge) const; + bool IsTopHorz(const cInt XPos); + void DoMaxima(TEdge *e); + void ProcessHorizontals(); + void ProcessHorizontal(TEdge *horzEdge); + void AddLocalMaxPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); + OutPt* AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &pt); + OutRec* GetOutRec(int idx); + void AppendPolygon(TEdge *e1, TEdge *e2); + void IntersectEdges(TEdge *e1, TEdge *e2, IntPoint &pt); + OutPt* AddOutPt(TEdge *e, const IntPoint &pt); + OutPt* GetLastOutPt(TEdge *e); + bool ProcessIntersections(const cInt topY); + void BuildIntersectList(const cInt topY); + void ProcessIntersectList(); + void ProcessEdgesAtTopOfScanbeam(const cInt topY); + void BuildResult(Paths& polys); + void BuildResult2(PolyTree& polytree); + void SetHoleState(TEdge *e, OutRec *outrec); + void DisposeIntersectNodes(); + bool FixupIntersectionOrder(); + void FixupOutPolygon(OutRec &outrec); + void FixupOutPolyline(OutRec &outrec); + bool IsHole(TEdge *e); + bool FindOwnerFromSplitRecs(OutRec &outRec, OutRec *&currOrfl); + void FixHoleLinkage(OutRec &outrec); + void AddJoin(OutPt *op1, OutPt *op2, const IntPoint offPt); + void ClearJoins(); + void ClearGhostJoins(); + void AddGhostJoin(OutPt *op, const IntPoint offPt); + bool JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2); + void JoinCommonEdges(); + void DoSimplePolygons(); + void FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec); + void FixupFirstLefts2(OutRec* InnerOutRec, OutRec* OuterOutRec); + void FixupFirstLefts3(OutRec* OldOutRec, OutRec* NewOutRec); +#ifdef use_xyz + void SetZ(IntPoint& pt, TEdge& e1, TEdge& e2); +#endif +}; +//------------------------------------------------------------------------------ + +class ClipperOffset +{ +public: + ClipperOffset(double miterLimit = 2.0, double roundPrecision = 0.25); + ~ClipperOffset(); + void AddPath(const Path& path, JoinType joinType, EndType endType); + void AddPaths(const Paths& paths, JoinType joinType, EndType endType); + void Execute(Paths& solution, double delta); + void Execute(PolyTree& solution, double delta); + void Clear(); + double MiterLimit; + double ArcTolerance; +private: + Paths m_destPolys; + Path m_srcPoly; + Path m_destPoly; + std::vector m_normals; + double m_delta, m_sinA, m_sin, m_cos; + double m_miterLim, m_StepsPerRad; + IntPoint m_lowest; + PolyNode m_polyNodes; + + void FixOrientations(); + void DoOffset(double delta); + void OffsetPoint(int j, int& k, JoinType jointype); + void DoSquare(int j, int k); + void DoMiter(int j, int k, double r); + void DoRound(int j, int k); +}; +//------------------------------------------------------------------------------ + +class clipperException : public std::exception +{ + public: + clipperException(const char* description): m_descr(description) {} + virtual ~clipperException() throw() {} + const char* what() const throw() override {return m_descr.c_str();} + private: + std::string m_descr; +}; +//------------------------------------------------------------------------------ + +} //QtClipperLib namespace + +#endif //clipper_hpp + + diff --git a/src/3rdparty/clipper/qt_attribution.json b/src/3rdparty/clipper/qt_attribution.json new file mode 100644 index 0000000..e2be5d2 --- /dev/null +++ b/src/3rdparty/clipper/qt_attribution.json @@ -0,0 +1,13 @@ +{ + "Id": "clipper", + "Name": "Clipper Polygon Clipping Library", + "QDocModule": "qtpositioning", + "QtUsage": "Used in the QML plugin of Qt Location and in Qt Positioning.", + "Description": "The Clipper library performs line & polygon clipping - intersection, union, difference & exclusive-or, and line & polygon offsetting.", + "Homepage": "https://sourceforge.net/projects/polyclipping/", + "Version": "6.4.2", + "LicenseId": "BSL-1.0", + "License": "Boost Software License 1.0", + "LicenseFile": "LICENSE", + "Copyright": "Copyright Angus Johnson 2010-2017" +} diff --git a/src/3rdparty/poly2tri/AUTHORS b/src/3rdparty/poly2tri/AUTHORS new file mode 100644 index 0000000..d8f4899 --- /dev/null +++ b/src/3rdparty/poly2tri/AUTHORS @@ -0,0 +1,8 @@ +Primary Contributors: + + Mason Green (C++, Python) + Thomas Åhlén (Java) + +Other Contributors: + + diff --git a/src/3rdparty/poly2tri/CMakeLists.txt b/src/3rdparty/poly2tri/CMakeLists.txt new file mode 100644 index 0000000..167485d --- /dev/null +++ b/src/3rdparty/poly2tri/CMakeLists.txt @@ -0,0 +1,30 @@ +# Generated from poly2tri.pro. + +##################################################################### +## Bundled_Poly2Tri Generic Library: +##################################################################### + +qt_internal_add_3rdparty_library(Bundled_Poly2Tri + QMAKE_LIB_NAME _poly2tri + STATIC + SKIP_AUTOMOC # special case + SOURCES + common/shapes.cpp common/shapes.h + common/utils.h + poly2tri.h + sweep/advancing_front.cpp sweep/advancing_front.h + sweep/cdt.cpp sweep/cdt.h + sweep/sweep.cpp sweep/sweep.h + sweep/sweep_context.cpp sweep/sweep_context.h +) +qt_disable_warnings(Bundled_Poly2Tri) +qt_set_symbol_visibility_hidden(Bundled_Poly2Tri) + +## Scopes: +##################################################################### + +#### Keys ignored in scope 3:.:.:poly2tri.pro:GCC: +# QMAKE_CFLAGS_OPTIMIZE_FULL = "-ffast-math" + +#### Keys ignored in scope 4:.:.:poly2tri.pro:NOT CLANG AND NOT ICC AND NOT rim_qcc: +# QMAKE_CXXFLAGS_WARN_ON = "-Wno-error=return-type" diff --git a/src/3rdparty/poly2tri/LICENSE b/src/3rdparty/poly2tri/LICENSE new file mode 100644 index 0000000..9417c08 --- /dev/null +++ b/src/3rdparty/poly2tri/LICENSE @@ -0,0 +1,27 @@ +Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors +http://code.google.com/p/poly2tri/ + +All rights reserved. +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of Poly2Tri nor the names of its contributors may be + used to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/src/3rdparty/poly2tri/common/shapes.cpp b/src/3rdparty/poly2tri/common/shapes.cpp new file mode 100644 index 0000000..2ac7e97 --- /dev/null +++ b/src/3rdparty/poly2tri/common/shapes.cpp @@ -0,0 +1,363 @@ +/* + * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors + * http://code.google.com/p/poly2tri/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "shapes.h" +#include + +namespace p2t { + +Triangle::Triangle(Point& a, Point& b, Point& c) +{ + points_[0] = &a; points_[1] = &b; points_[2] = &c; + neighbors_[0] = NULL; neighbors_[1] = NULL; neighbors_[2] = NULL; + constrained_edge[0] = constrained_edge[1] = constrained_edge[2] = false; + delaunay_edge[0] = delaunay_edge[1] = delaunay_edge[2] = false; + interior_ = false; +} + +// Update neighbor pointers +void Triangle::MarkNeighbor(Point* p1, Point* p2, Triangle* t) +{ + if ((p1 == points_[2] && p2 == points_[1]) || (p1 == points_[1] && p2 == points_[2])) + neighbors_[0] = t; + else if ((p1 == points_[0] && p2 == points_[2]) || (p1 == points_[2] && p2 == points_[0])) + neighbors_[1] = t; + else if ((p1 == points_[0] && p2 == points_[1]) || (p1 == points_[1] && p2 == points_[0])) + neighbors_[2] = t; + else + assert(0); +} + +// Exhaustive search to update neighbor pointers +void Triangle::MarkNeighbor(Triangle& t) +{ + if (t.Contains(points_[1], points_[2])) { + neighbors_[0] = &t; + t.MarkNeighbor(points_[1], points_[2], this); + } else if (t.Contains(points_[0], points_[2])) { + neighbors_[1] = &t; + t.MarkNeighbor(points_[0], points_[2], this); + } else if (t.Contains(points_[0], points_[1])) { + neighbors_[2] = &t; + t.MarkNeighbor(points_[0], points_[1], this); + } +} + +/** + * Clears all references to all other triangles and points + */ +void Triangle::Clear() +{ + Triangle *t; + for (int i=0; i<3; i++) + { + t = neighbors_[i]; + if (t != NULL) + { + t->ClearNeighbor( this ); + } + } + ClearNeighbors(); + points_[0]=points_[1]=points_[2] = NULL; +} + +void Triangle::ClearNeighbor(Triangle *triangle ) +{ + if (neighbors_[0] == triangle) + { + neighbors_[0] = NULL; + } + else if (neighbors_[1] == triangle) + { + neighbors_[1] = NULL; + } + else + { + neighbors_[2] = NULL; + } +} + +void Triangle::ClearNeighbors() +{ + neighbors_[0] = NULL; + neighbors_[1] = NULL; + neighbors_[2] = NULL; +} + +void Triangle::ClearDelunayEdges() +{ + delaunay_edge[0] = delaunay_edge[1] = delaunay_edge[2] = false; +} + +Point* Triangle::OppositePoint(Triangle& t, Point& p) +{ + Point *cw = t.PointCW(p); + return PointCW(*cw); +} + +// Legalized triangle by rotating clockwise around point(0) +void Triangle::Legalize(Point& point) +{ + points_[1] = points_[0]; + points_[0] = points_[2]; + points_[2] = &point; +} + +// Legalize triagnle by rotating clockwise around oPoint +void Triangle::Legalize(Point& opoint, Point& npoint) +{ + if (&opoint == points_[0]) { + points_[1] = points_[0]; + points_[0] = points_[2]; + points_[2] = &npoint; + } else if (&opoint == points_[1]) { + points_[2] = points_[1]; + points_[1] = points_[0]; + points_[0] = &npoint; + } else if (&opoint == points_[2]) { + points_[0] = points_[2]; + points_[2] = points_[1]; + points_[1] = &npoint; + } else { + assert(0); + } +} + +int Triangle::Index(const Point* p) +{ + if (p == points_[0]) { + return 0; + } else if (p == points_[1]) { + return 1; + } else if (p == points_[2]) { + return 2; + } + assert(0); +} + +int Triangle::EdgeIndex(const Point* p1, const Point* p2) +{ + if (points_[0] == p1) { + if (points_[1] == p2) { + return 2; + } else if (points_[2] == p2) { + return 1; + } + } else if (points_[1] == p1) { + if (points_[2] == p2) { + return 0; + } else if (points_[0] == p2) { + return 2; + } + } else if (points_[2] == p1) { + if (points_[0] == p2) { + return 1; + } else if (points_[1] == p2) { + return 0; + } + } + return -1; +} + +void Triangle::MarkConstrainedEdge(const int index) +{ + constrained_edge[index] = true; +} + +void Triangle::MarkConstrainedEdge(Edge& edge) +{ + MarkConstrainedEdge(edge.p, edge.q); +} + +// Mark edge as constrained +void Triangle::MarkConstrainedEdge(Point* p, Point* q) +{ + if ((q == points_[0] && p == points_[1]) || (q == points_[1] && p == points_[0])) { + constrained_edge[2] = true; + } else if ((q == points_[0] && p == points_[2]) || (q == points_[2] && p == points_[0])) { + constrained_edge[1] = true; + } else if ((q == points_[1] && p == points_[2]) || (q == points_[2] && p == points_[1])) { + constrained_edge[0] = true; + } +} + +// The point counter-clockwise to given point +Point* Triangle::PointCW(Point& point) +{ + if (&point == points_[0]) { + return points_[2]; + } else if (&point == points_[1]) { + return points_[0]; + } else if (&point == points_[2]) { + return points_[1]; + } + assert(0); +} + +// The point counter-clockwise to given point +Point* Triangle::PointCCW(Point& point) +{ + if (&point == points_[0]) { + return points_[1]; + } else if (&point == points_[1]) { + return points_[2]; + } else if (&point == points_[2]) { + return points_[0]; + } + assert(0); +} + +// The neighbor clockwise to given point +Triangle* Triangle::NeighborCW(Point& point) +{ + if (&point == points_[0]) { + return neighbors_[1]; + } else if (&point == points_[1]) { + return neighbors_[2]; + } + return neighbors_[0]; +} + +// The neighbor counter-clockwise to given point +Triangle* Triangle::NeighborCCW(Point& point) +{ + if (&point == points_[0]) { + return neighbors_[2]; + } else if (&point == points_[1]) { + return neighbors_[0]; + } + return neighbors_[1]; +} + +bool Triangle::GetConstrainedEdgeCCW(Point& p) +{ + if (&p == points_[0]) { + return constrained_edge[2]; + } else if (&p == points_[1]) { + return constrained_edge[0]; + } + return constrained_edge[1]; +} + +bool Triangle::GetConstrainedEdgeCW(Point& p) +{ + if (&p == points_[0]) { + return constrained_edge[1]; + } else if (&p == points_[1]) { + return constrained_edge[2]; + } + return constrained_edge[0]; +} + +void Triangle::SetConstrainedEdgeCCW(Point& p, bool ce) +{ + if (&p == points_[0]) { + constrained_edge[2] = ce; + } else if (&p == points_[1]) { + constrained_edge[0] = ce; + } else { + constrained_edge[1] = ce; + } +} + +void Triangle::SetConstrainedEdgeCW(Point& p, bool ce) +{ + if (&p == points_[0]) { + constrained_edge[1] = ce; + } else if (&p == points_[1]) { + constrained_edge[2] = ce; + } else { + constrained_edge[0] = ce; + } +} + +bool Triangle::GetDelunayEdgeCCW(Point& p) +{ + if (&p == points_[0]) { + return delaunay_edge[2]; + } else if (&p == points_[1]) { + return delaunay_edge[0]; + } + return delaunay_edge[1]; +} + +bool Triangle::GetDelunayEdgeCW(Point& p) +{ + if (&p == points_[0]) { + return delaunay_edge[1]; + } else if (&p == points_[1]) { + return delaunay_edge[2]; + } + return delaunay_edge[0]; +} + +void Triangle::SetDelunayEdgeCCW(Point& p, bool e) +{ + if (&p == points_[0]) { + delaunay_edge[2] = e; + } else if (&p == points_[1]) { + delaunay_edge[0] = e; + } else { + delaunay_edge[1] = e; + } +} + +void Triangle::SetDelunayEdgeCW(Point& p, bool e) +{ + if (&p == points_[0]) { + delaunay_edge[1] = e; + } else if (&p == points_[1]) { + delaunay_edge[2] = e; + } else { + delaunay_edge[0] = e; + } +} + +// The neighbor across to given point +Triangle& Triangle::NeighborAcross(Point& opoint) +{ + if (&opoint == points_[0]) { + return *neighbors_[0]; + } else if (&opoint == points_[1]) { + return *neighbors_[1]; + } + return *neighbors_[2]; +} + +void Triangle::DebugPrint() +{ + using namespace std; + cout << points_[0]->x << "," << points_[0]->y << " "; + cout << points_[1]->x << "," << points_[1]->y << " "; + cout << points_[2]->x << "," << points_[2]->y << endl; +} + +} + diff --git a/src/3rdparty/poly2tri/common/shapes.h b/src/3rdparty/poly2tri/common/shapes.h new file mode 100644 index 0000000..de459d1 --- /dev/null +++ b/src/3rdparty/poly2tri/common/shapes.h @@ -0,0 +1,325 @@ +/* + * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors + * http://code.google.com/p/poly2tri/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// Include guard +#ifndef SHAPES_H +#define SHAPES_H + +#include +#include +#include +#include + +namespace p2t { + +struct Edge; + +struct Point { + + double x, y; + + /// Default constructor does nothing (for performance). + Point() + { + x = 0.0; + y = 0.0; + } + + /// The edges this point constitutes an upper ending point + std::vector edge_list; + + /// Construct using coordinates. + Point(double x, double y) : x(x), y(y) {} + + /// Set this point to all zeros. + void set_zero() + { + x = 0.0; + y = 0.0; + } + + /// Set this point to some specified coordinates. + void set(double x_, double y_) + { + x = x_; + y = y_; + } + + /// Negate this point. + Point operator -() const + { + Point v; + v.set(-x, -y); + return v; + } + + /// Add a point to this point. + void operator +=(const Point& v) + { + x += v.x; + y += v.y; + } + + /// Subtract a point from this point. + void operator -=(const Point& v) + { + x -= v.x; + y -= v.y; + } + + /// Multiply this point by a scalar. + void operator *=(double a) + { + x *= a; + y *= a; + } + + /// Get the length of this point (the norm). + double Length() const + { + return std::sqrt(x * x + y * y); + } + + /// Convert this point into a unit point. Returns the Length. + double Normalize() + { + double len = Length(); + x /= len; + y /= len; + return len; + } + +}; + +// Represents a simple polygon's edge +struct Edge { + + Point* p, *q; + + /// Constructor + Edge(Point& p1, Point& p2) : p(&p1), q(&p2) + { + if (p1.y > p2.y) { + q = &p1; + p = &p2; + } else if (p1.y == p2.y) { + if (p1.x > p2.x) { + q = &p1; + p = &p2; + } else if (p1.x == p2.x) { + // Repeat points + assert(false); + } + } + + q->edge_list.push_back(this); + } +}; + +// Triangle-based data structures are know to have better performance than quad-edge structures +// See: J. Shewchuk, "Triangle: Engineering a 2D Quality Mesh Generator and Delaunay Triangulator" +// "Triangulations in CGAL" +class Triangle { +public: + +/// Constructor +Triangle(Point& a, Point& b, Point& c); + +/// Flags to determine if an edge is a Constrained edge +bool constrained_edge[3]; +/// Flags to determine if an edge is a Delauney edge +bool delaunay_edge[3]; + +Point* GetPoint(const int& index); +Point* PointCW(Point& point); +Point* PointCCW(Point& point); +Point* OppositePoint(Triangle& t, Point& p); + +Triangle* GetNeighbor(const int& index); +void MarkNeighbor(Point* p1, Point* p2, Triangle* t); +void MarkNeighbor(Triangle& t); + +void MarkConstrainedEdge(const int index); +void MarkConstrainedEdge(Edge& edge); +void MarkConstrainedEdge(Point* p, Point* q); + +int Index(const Point* p); +int EdgeIndex(const Point* p1, const Point* p2); + +Triangle* NeighborCW(Point& point); +Triangle* NeighborCCW(Point& point); +bool GetConstrainedEdgeCCW(Point& p); +bool GetConstrainedEdgeCW(Point& p); +void SetConstrainedEdgeCCW(Point& p, bool ce); +void SetConstrainedEdgeCW(Point& p, bool ce); +bool GetDelunayEdgeCCW(Point& p); +bool GetDelunayEdgeCW(Point& p); +void SetDelunayEdgeCCW(Point& p, bool e); +void SetDelunayEdgeCW(Point& p, bool e); + +bool Contains(Point* p); +bool Contains(const Edge& e); +bool Contains(Point* p, Point* q); +void Legalize(Point& point); +void Legalize(Point& opoint, Point& npoint); +/** + * Clears all references to all other triangles and points + */ +void Clear(); +void ClearNeighbor(Triangle *triangle ); +void ClearNeighbors(); +void ClearDelunayEdges(); + +inline bool IsInterior(); +inline void IsInterior(bool b); + +Triangle& NeighborAcross(Point& opoint); + +void DebugPrint(); + +private: + +/// Triangle points +Point* points_[3]; +/// Neighbor list +Triangle* neighbors_[3]; + +/// Has this triangle been marked as an interior triangle? +bool interior_; +}; + +inline bool cmp(const Point* a, const Point* b) +{ + if (a->y < b->y) { + return true; + } else if (a->y == b->y) { + // Make sure q is point with greater x value + if (a->x < b->x) { + return true; + } + } + return false; +} + +/// Add two points_ component-wise. +inline Point operator +(const Point& a, const Point& b) +{ + return Point(a.x + b.x, a.y + b.y); +} + +/// Subtract two points_ component-wise. +inline Point operator -(const Point& a, const Point& b) +{ + return Point(a.x - b.x, a.y - b.y); +} + +/// Multiply point by scalar +inline Point operator *(double s, const Point& a) +{ + return Point(s * a.x, s * a.y); +} + +inline bool operator ==(const Point& a, const Point& b) +{ + return a.x == b.x && a.y == b.y; +} + +inline bool operator !=(const Point& a, const Point& b) +{ + return !(a.x == b.x) || !(a.y == b.y); +} + +/// Peform the dot product on two vectors. +inline double Dot(const Point& a, const Point& b) +{ + return a.x * b.x + a.y * b.y; +} + +/// Perform the cross product on two vectors. In 2D this produces a scalar. +inline double Cross(const Point& a, const Point& b) +{ + return a.x * b.y - a.y * b.x; +} + +/// Perform the cross product on a point and a scalar. In 2D this produces +/// a point. +inline Point Cross(const Point& a, double s) +{ + return Point(s * a.y, -s * a.x); +} + +/// Perform the cross product on a scalar and a point. In 2D this produces +/// a point. +inline Point Cross(const double s, const Point& a) +{ + return Point(-s * a.y, s * a.x); +} + +inline Point* Triangle::GetPoint(const int& index) +{ + return points_[index]; +} + +inline Triangle* Triangle::GetNeighbor(const int& index) +{ + return neighbors_[index]; +} + +inline bool Triangle::Contains(Point* p) +{ + return p == points_[0] || p == points_[1] || p == points_[2]; +} + +inline bool Triangle::Contains(const Edge& e) +{ + return Contains(e.p) && Contains(e.q); +} + +inline bool Triangle::Contains(Point* p, Point* q) +{ + return Contains(p) && Contains(q); +} + +inline bool Triangle::IsInterior() +{ + return interior_; +} + +inline void Triangle::IsInterior(bool b) +{ + interior_ = b; +} + +} + +#endif + + diff --git a/src/3rdparty/poly2tri/common/utils.h b/src/3rdparty/poly2tri/common/utils.h new file mode 100644 index 0000000..8744b6d --- /dev/null +++ b/src/3rdparty/poly2tri/common/utils.h @@ -0,0 +1,127 @@ +/* + * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors + * http://code.google.com/p/poly2tri/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef UTILS_H +#define UTILS_H + +// Otherwise #defines like M_PI are undeclared under Visual Studio +#define _USE_MATH_DEFINES + +#include +#include + +#ifndef M_PI +#define M_PI (3.14159265358979323846) +#endif + +namespace p2t { + +const double PI_3div4 = 3 * M_PI / 4; +const double PI_div2 = 1.57079632679489661923; +const double EPSILON = 1e-12; + +enum Orientation { CW, CCW, COLLINEAR }; + +/** + * Forumla to calculate signed area
+ * Positive if CCW
+ * Negative if CW
+ * 0 if collinear
+ *

+ * A[P1,P2,P3]  =  (x1*y2 - y1*x2) + (x2*y3 - y2*x3) + (x3*y1 - y3*x1)
+ *              =  (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3)
+ * 
+ */ +Orientation Orient2d(Point& pa, Point& pb, Point& pc) +{ + double detleft = (pa.x - pc.x) * (pb.y - pc.y); + double detright = (pa.y - pc.y) * (pb.x - pc.x); + double val = detleft - detright; + if (val > -EPSILON && val < EPSILON) { + return COLLINEAR; + } else if (val > 0) { + return CCW; + } + return CW; +} + +/* +bool InScanArea(Point& pa, Point& pb, Point& pc, Point& pd) +{ + double pdx = pd.x; + double pdy = pd.y; + double adx = pa.x - pdx; + double ady = pa.y - pdy; + double bdx = pb.x - pdx; + double bdy = pb.y - pdy; + + double adxbdy = adx * bdy; + double bdxady = bdx * ady; + double oabd = adxbdy - bdxady; + + if (oabd <= EPSILON) { + return false; + } + + double cdx = pc.x - pdx; + double cdy = pc.y - pdy; + + double cdxady = cdx * ady; + double adxcdy = adx * cdy; + double ocad = cdxady - adxcdy; + + if (ocad <= EPSILON) { + return false; + } + + return true; +} + +*/ + +bool InScanArea(Point& pa, Point& pb, Point& pc, Point& pd) +{ + double oadb = (pa.x - pb.x)*(pd.y - pb.y) - (pd.x - pb.x)*(pa.y - pb.y); + if (oadb >= -EPSILON) { + return false; + } + + double oadc = (pa.x - pc.x)*(pd.y - pc.y) - (pd.x - pc.x)*(pa.y - pc.y); + if (oadc <= EPSILON) { + return false; + } + return true; +} + +} + +#endif + diff --git a/src/3rdparty/poly2tri/poly2tri.h b/src/3rdparty/poly2tri/poly2tri.h new file mode 100644 index 0000000..042cb3d --- /dev/null +++ b/src/3rdparty/poly2tri/poly2tri.h @@ -0,0 +1,39 @@ +/* + * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors + * http://code.google.com/p/poly2tri/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef POLY2TRI_H +#define POLY2TRI_H + +#include "common/shapes.h" +#include "sweep/cdt.h" + +#endif + diff --git a/src/3rdparty/poly2tri/qt_attribution.json b/src/3rdparty/poly2tri/qt_attribution.json new file mode 100644 index 0000000..69b6f6e --- /dev/null +++ b/src/3rdparty/poly2tri/qt_attribution.json @@ -0,0 +1,14 @@ +{ + "Id": "poly2tri", + "Name": "Poly2Tri Polygon Triangulation Library", + "QDocModule": "qtpositioning", + "QtUsage": "Used in the QML plugin of Qt Location and in Qt Positioning.", + + "Description": "Poly2Tri is a sweepline constrained Delaunay Polygon Triangulation Library.", + "Homepage": "https://github.com/greenm01/poly2tri", + "Version": "commit 0be213d95f82471b95d96d0248a0490d0a934f9f", + "LicenseId": "BSD-3-Clause", + "License": "BSD 3-clause \"New\" or \"Revised\" License", + "LicenseFile": "LICENSE", + "Copyright": "Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors" +} diff --git a/src/3rdparty/poly2tri/sweep/advancing_front.cpp b/src/3rdparty/poly2tri/sweep/advancing_front.cpp new file mode 100644 index 0000000..0377984 --- /dev/null +++ b/src/3rdparty/poly2tri/sweep/advancing_front.cpp @@ -0,0 +1,109 @@ +/* + * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors + * http://code.google.com/p/poly2tri/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "advancing_front.h" + +namespace p2t { + +AdvancingFront::AdvancingFront(Node& head, Node& tail) +{ + head_ = &head; + tail_ = &tail; + search_node_ = &head; +} + +Node* AdvancingFront::LocateNode(const double& x) +{ + Node* node = search_node_; + + if (x < node->value) { + while ((node = node->prev) != NULL) { + if (x >= node->value) { + search_node_ = node; + return node; + } + } + } else { + while ((node = node->next) != NULL) { + if (x < node->value) { + search_node_ = node->prev; + return node->prev; + } + } + } + return NULL; +} + +Node* AdvancingFront::FindSearchNode(const double& x) +{ + (void)x; // suppress compiler warnings "unused parameter 'x'" + // TODO: implement BST index + return search_node_; +} + +Node* AdvancingFront::LocatePoint(const Point* point) +{ + const double px = point->x; + Node* node = FindSearchNode(px); + const double nx = node->point->x; + + if (px == nx) { + if (point != node->point) { + // We might have two nodes with same x value for a short time + if (point == node->prev->point) { + node = node->prev; + } else if (point == node->next->point) { + node = node->next; + } else { + assert(0); + } + } + } else if (px < nx) { + while ((node = node->prev) != NULL) { + if (point == node->point) { + break; + } + } + } else { + while ((node = node->next) != NULL) { + if (point == node->point) + break; + } + } + if (node) search_node_ = node; + return node; +} + +AdvancingFront::~AdvancingFront() +{ +} + +} + diff --git a/src/3rdparty/poly2tri/sweep/advancing_front.h b/src/3rdparty/poly2tri/sweep/advancing_front.h new file mode 100644 index 0000000..bab73d4 --- /dev/null +++ b/src/3rdparty/poly2tri/sweep/advancing_front.h @@ -0,0 +1,118 @@ +/* + * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors + * http://code.google.com/p/poly2tri/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ADVANCED_FRONT_H +#define ADVANCED_FRONT_H + +#include "../common/shapes.h" + +namespace p2t { + +struct Node; + +// Advancing front node +struct Node { + Point* point; + Triangle* triangle; + + Node* next; + Node* prev; + + double value; + + Node(Point& p) : point(&p), triangle(NULL), next(NULL), prev(NULL), value(p.x) + { + } + + Node(Point& p, Triangle& t) : point(&p), triangle(&t), next(NULL), prev(NULL), value(p.x) + { + } + +}; + +// Advancing front +class AdvancingFront { +public: + +AdvancingFront(Node& head, Node& tail); +// Destructor +~AdvancingFront(); + +Node* head(); +void set_head(Node* node); +Node* tail(); +void set_tail(Node* node); +Node* search(); +void set_search(Node* node); + +/// Locate insertion point along advancing front +Node* LocateNode(const double& x); + +Node* LocatePoint(const Point* point); + +private: + +Node* head_, *tail_, *search_node_; + +Node* FindSearchNode(const double& x); +}; + +inline Node* AdvancingFront::head() +{ + return head_; +} +inline void AdvancingFront::set_head(Node* node) +{ + head_ = node; +} + +inline Node* AdvancingFront::tail() +{ + return tail_; +} +inline void AdvancingFront::set_tail(Node* node) +{ + tail_ = node; +} + +inline Node* AdvancingFront::search() +{ + return search_node_; +} + +inline void AdvancingFront::set_search(Node* node) +{ + search_node_ = node; +} + +} + +#endif diff --git a/src/3rdparty/poly2tri/sweep/cdt.cpp b/src/3rdparty/poly2tri/sweep/cdt.cpp new file mode 100644 index 0000000..e0b3ec7 --- /dev/null +++ b/src/3rdparty/poly2tri/sweep/cdt.cpp @@ -0,0 +1,72 @@ +/* + * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors + * http://code.google.com/p/poly2tri/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "cdt.h" + +namespace p2t { + +CDT::CDT(std::vector polyline) +{ + sweep_context_ = new SweepContext(polyline); + sweep_ = new Sweep; +} + +void CDT::AddHole(std::vector polyline) +{ + sweep_context_->AddHole(polyline); +} + +void CDT::AddPoint(Point* point) { + sweep_context_->AddPoint(point); +} + +void CDT::Triangulate() +{ + sweep_->Triangulate(*sweep_context_); +} + +std::vector CDT::GetTriangles() +{ + return sweep_context_->GetTriangles(); +} + +std::list CDT::GetMap() +{ + return sweep_context_->GetMap(); +} + +CDT::~CDT() +{ + delete sweep_context_; + delete sweep_; +} + +} + diff --git a/src/3rdparty/poly2tri/sweep/cdt.h b/src/3rdparty/poly2tri/sweep/cdt.h new file mode 100644 index 0000000..e7b703d --- /dev/null +++ b/src/3rdparty/poly2tri/sweep/cdt.h @@ -0,0 +1,105 @@ +/* + * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors + * http://code.google.com/p/poly2tri/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef CDT_H +#define CDT_H + +#include "advancing_front.h" +#include "sweep_context.h" +#include "sweep.h" + +/** + * + * @author Mason Green + * + */ + +namespace p2t { + +class CDT +{ +public: + + /** + * Constructor - add polyline with non repeating points + * + * @param polyline + */ + CDT(std::vector polyline); + + /** + * Destructor - clean up memory + */ + ~CDT(); + + /** + * Add a hole + * + * @param polyline + */ + void AddHole(std::vector polyline); + + /** + * Add a steiner point + * + * @param point + */ + void AddPoint(Point* point); + + /** + * Triangulate - do this AFTER you've added the polyline, holes, and Steiner points + */ + void Triangulate(); + + /** + * Get CDT triangles + */ + std::vector GetTriangles(); + + /** + * Get triangle map + */ + std::list GetMap(); + + private: + + /** + * Internals + */ + + SweepContext* sweep_context_; + Sweep* sweep_; + +}; + +} + +#endif diff --git a/src/3rdparty/poly2tri/sweep/sweep.cpp b/src/3rdparty/poly2tri/sweep/sweep.cpp new file mode 100644 index 0000000..954d2db --- /dev/null +++ b/src/3rdparty/poly2tri/sweep/sweep.cpp @@ -0,0 +1,814 @@ +/* + * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors + * http://code.google.com/p/poly2tri/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include "sweep.h" +#include "sweep_context.h" +#include "advancing_front.h" +#include "../common/utils.h" + +namespace p2t { + +// Triangulate simple polygon with holes +void Sweep::Triangulate(SweepContext& tcx) +{ + tcx.InitTriangulation(); + tcx.CreateAdvancingFront(nodes_); + // Sweep points; build mesh + SweepPoints(tcx); + // Clean up + FinalizationPolygon(tcx); +} + +void Sweep::SweepPoints(SweepContext& tcx) +{ + for (int i = 1; i < tcx.point_count(); i++) { + Point& point = *tcx.GetPoint(i); + Node* node = &PointEvent(tcx, point); + for (unsigned int i = 0; i < point.edge_list.size(); i++) { + EdgeEvent(tcx, point.edge_list[i], node); + } + } +} + +void Sweep::FinalizationPolygon(SweepContext& tcx) +{ + // Get an Internal triangle to start with + Triangle* t = tcx.front()->head()->next->triangle; + Point* p = tcx.front()->head()->next->point; + while (!t->GetConstrainedEdgeCW(*p)) { + t = t->NeighborCCW(*p); + } + + // Collect interior triangles constrained by edges + tcx.MeshClean(*t); +} + +Node& Sweep::PointEvent(SweepContext& tcx, Point& point) +{ + Node& node = tcx.LocateNode(point); + Node& new_node = NewFrontTriangle(tcx, point, node); + + // Only need to check +epsilon since point never have smaller + // x value than node due to how we fetch nodes from the front + if (point.x <= node.point->x + EPSILON) { + Fill(tcx, node); + } + + //tcx.AddNode(new_node); + + FillAdvancingFront(tcx, new_node); + return new_node; +} + +void Sweep::EdgeEvent(SweepContext& tcx, Edge* edge, Node* node) +{ + tcx.edge_event.constrained_edge = edge; + tcx.edge_event.right = (edge->p->x > edge->q->x); + + if (IsEdgeSideOfTriangle(*node->triangle, *edge->p, *edge->q)) { + return; + } + + // For now we will do all needed filling + // TODO: integrate with flip process might give some better performance + // but for now this avoid the issue with cases that needs both flips and fills + FillEdgeEvent(tcx, edge, node); + EdgeEvent(tcx, *edge->p, *edge->q, node->triangle, *edge->q); +} + +void Sweep::EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangle, Point& point) +{ + if (IsEdgeSideOfTriangle(*triangle, ep, eq)) { + return; + } + + Point* p1 = triangle->PointCCW(point); + Orientation o1 = Orient2d(eq, *p1, ep); + if (o1 == COLLINEAR) { + if ( triangle->Contains(&eq, p1)) { + triangle->MarkConstrainedEdge(&eq, p1 ); + // We are modifying the constraint maybe it would be better to + // not change the given constraint and just keep a variable for the new constraint + tcx.edge_event.constrained_edge->q = p1; + triangle = &triangle->NeighborAcross(point); + EdgeEvent( tcx, ep, *p1, triangle, *p1 ); + } else { + std::runtime_error("EdgeEvent - collinear points not supported"); + assert(0); + } + return; + } + + Point* p2 = triangle->PointCW(point); + Orientation o2 = Orient2d(eq, *p2, ep); + if (o2 == COLLINEAR) { + if ( triangle->Contains(&eq, p2)) { + triangle->MarkConstrainedEdge(&eq, p2 ); + // We are modifying the constraint maybe it would be better to + // not change the given constraint and just keep a variable for the new constraint + tcx.edge_event.constrained_edge->q = p2; + triangle = &triangle->NeighborAcross(point); + EdgeEvent( tcx, ep, *p2, triangle, *p2 ); + } else { + std::runtime_error("EdgeEvent - collinear points not supported"); + assert(0); + } + return; + } + + if (o1 == o2) { + // Need to decide if we are rotating CW or CCW to get to a triangle + // that will cross edge + if (o1 == CW) { + triangle = triangle->NeighborCCW(point); + } else{ + triangle = triangle->NeighborCW(point); + } + EdgeEvent(tcx, ep, eq, triangle, point); + } else { + // This triangle crosses constraint so lets flippin start! + FlipEdgeEvent(tcx, ep, eq, triangle, point); + } +} + +bool Sweep::IsEdgeSideOfTriangle(Triangle& triangle, Point& ep, Point& eq) +{ + int index = triangle.EdgeIndex(&ep, &eq); + + if (index != -1) { + triangle.MarkConstrainedEdge(index); + Triangle* t = triangle.GetNeighbor(index); + if (t) { + t->MarkConstrainedEdge(&ep, &eq); + } + return true; + } + return false; +} + +Node& Sweep::NewFrontTriangle(SweepContext& tcx, Point& point, Node& node) +{ + Triangle* triangle = new Triangle(point, *node.point, *node.next->point); + + triangle->MarkNeighbor(*node.triangle); + tcx.AddToMap(triangle); + + Node* new_node = new Node(point); + nodes_.push_back(new_node); + + new_node->next = node.next; + new_node->prev = &node; + node.next->prev = new_node; + node.next = new_node; + + if (!Legalize(tcx, *triangle)) { + tcx.MapTriangleToNodes(*triangle); + } + + return *new_node; +} + +void Sweep::Fill(SweepContext& tcx, Node& node) +{ + Triangle* triangle = new Triangle(*node.prev->point, *node.point, *node.next->point); + + // TODO: should copy the constrained_edge value from neighbor triangles + // for now constrained_edge values are copied during the legalize + triangle->MarkNeighbor(*node.prev->triangle); + triangle->MarkNeighbor(*node.triangle); + + tcx.AddToMap(triangle); + + // Update the advancing front + node.prev->next = node.next; + node.next->prev = node.prev; + + // If it was legalized the triangle has already been mapped + if (!Legalize(tcx, *triangle)) { + tcx.MapTriangleToNodes(*triangle); + } + +} + +void Sweep::FillAdvancingFront(SweepContext& tcx, Node& n) +{ + + // Fill right holes + Node* node = n.next; + + while (node->next) { + // if HoleAngle exceeds 90 degrees then break. + if (LargeHole_DontFill(node)) break; + Fill(tcx, *node); + node = node->next; + } + + // Fill left holes + node = n.prev; + + while (node->prev) { + // if HoleAngle exceeds 90 degrees then break. + if (LargeHole_DontFill(node)) break; + Fill(tcx, *node); + node = node->prev; + } + + // Fill right basins + if (n.next && n.next->next) { + double angle = BasinAngle(n); + if (angle < PI_3div4) { + FillBasin(tcx, n); + } + } +} + +// True if HoleAngle exceeds 90 degrees. +bool Sweep::LargeHole_DontFill(Node* node) { + + Node* nextNode = node->next; + Node* prevNode = node->prev; + if (!AngleExceeds90Degrees(node->point, nextNode->point, prevNode->point)) + return false; + + // Check additional points on front. + Node* next2Node = nextNode->next; + // "..Plus.." because only want angles on same side as point being added. + if ((next2Node != NULL) && !AngleExceedsPlus90DegreesOrIsNegative(node->point, next2Node->point, prevNode->point)) + return false; + + Node* prev2Node = prevNode->prev; + // "..Plus.." because only want angles on same side as point being added. + if ((prev2Node != NULL) && !AngleExceedsPlus90DegreesOrIsNegative(node->point, nextNode->point, prev2Node->point)) + return false; + + return true; +} + +bool Sweep::AngleExceeds90Degrees(Point* origin, Point* pa, Point* pb) { + double angle = Angle(*origin, *pa, *pb); + bool exceeds90Degrees = ((angle > PI_div2) || (angle < -PI_div2)); + return exceeds90Degrees; +} + +bool Sweep::AngleExceedsPlus90DegreesOrIsNegative(Point* origin, Point* pa, Point* pb) { + double angle = Angle(*origin, *pa, *pb); + bool exceedsPlus90DegreesOrIsNegative = (angle > PI_div2) || (angle < 0); + return exceedsPlus90DegreesOrIsNegative; +} + +double Sweep::Angle(Point& origin, Point& pa, Point& pb) { + /* Complex plane + * ab = cosA +i*sinA + * ab = (ax + ay*i)(bx + by*i) = (ax*bx + ay*by) + i(ax*by-ay*bx) + * atan2(y,x) computes the principal value of the argument function + * applied to the complex number x+iy + * Where x = ax*bx + ay*by + * y = ax*by - ay*bx + */ + double px = origin.x; + double py = origin.y; + double ax = pa.x- px; + double ay = pa.y - py; + double bx = pb.x - px; + double by = pb.y - py; + double x = ax * by - ay * bx; + double y = ax * bx + ay * by; + double angle = atan2(x, y); + return angle; +} + +double Sweep::BasinAngle(Node& node) +{ + double ax = node.point->x - node.next->next->point->x; + double ay = node.point->y - node.next->next->point->y; + return atan2(ay, ax); +} + +double Sweep::HoleAngle(Node& node) +{ + /* Complex plane + * ab = cosA +i*sinA + * ab = (ax + ay*i)(bx + by*i) = (ax*bx + ay*by) + i(ax*by-ay*bx) + * atan2(y,x) computes the principal value of the argument function + * applied to the complex number x+iy + * Where x = ax*bx + ay*by + * y = ax*by - ay*bx + */ + double ax = node.next->point->x - node.point->x; + double ay = node.next->point->y - node.point->y; + double bx = node.prev->point->x - node.point->x; + double by = node.prev->point->y - node.point->y; + return atan2(ax * by - ay * bx, ax * bx + ay * by); +} + +bool Sweep::Legalize(SweepContext& tcx, Triangle& t) +{ + // To legalize a triangle we start by finding if any of the three edges + // violate the Delaunay condition + for (int i = 0; i < 3; i++) { + if (t.delaunay_edge[i]) + continue; + + Triangle* ot = t.GetNeighbor(i); + + if (ot) { + Point* p = t.GetPoint(i); + Point* op = ot->OppositePoint(t, *p); + int oi = ot->Index(op); + + // If this is a Constrained Edge or a Delaunay Edge(only during recursive legalization) + // then we should not try to legalize + if (ot->constrained_edge[oi] || ot->delaunay_edge[oi]) { + t.constrained_edge[i] = ot->constrained_edge[oi]; + continue; + } + + bool inside = Incircle(*p, *t.PointCCW(*p), *t.PointCW(*p), *op); + + if (inside) { + // Lets mark this shared edge as Delaunay + t.delaunay_edge[i] = true; + ot->delaunay_edge[oi] = true; + + // Lets rotate shared edge one vertex CW to legalize it + RotateTrianglePair(t, *p, *ot, *op); + + // We now got one valid Delaunay Edge shared by two triangles + // This gives us 4 new edges to check for Delaunay + + // Make sure that triangle to node mapping is done only one time for a specific triangle + bool not_legalized = !Legalize(tcx, t); + if (not_legalized) { + tcx.MapTriangleToNodes(t); + } + + not_legalized = !Legalize(tcx, *ot); + if (not_legalized) + tcx.MapTriangleToNodes(*ot); + + // Reset the Delaunay edges, since they only are valid Delaunay edges + // until we add a new triangle or point. + // XXX: need to think about this. Can these edges be tried after we + // return to previous recursive level? + t.delaunay_edge[i] = false; + ot->delaunay_edge[oi] = false; + + // If triangle have been legalized no need to check the other edges since + // the recursive legalization will handles those so we can end here. + return true; + } + } + } + return false; +} + +bool Sweep::Incircle(Point& pa, Point& pb, Point& pc, Point& pd) +{ + double adx = pa.x - pd.x; + double ady = pa.y - pd.y; + double bdx = pb.x - pd.x; + double bdy = pb.y - pd.y; + + double adxbdy = adx * bdy; + double bdxady = bdx * ady; + double oabd = adxbdy - bdxady; + + if (oabd <= 0) + return false; + + double cdx = pc.x - pd.x; + double cdy = pc.y - pd.y; + + double cdxady = cdx * ady; + double adxcdy = adx * cdy; + double ocad = cdxady - adxcdy; + + if (ocad <= 0) + return false; + + double bdxcdy = bdx * cdy; + double cdxbdy = cdx * bdy; + + double alift = adx * adx + ady * ady; + double blift = bdx * bdx + bdy * bdy; + double clift = cdx * cdx + cdy * cdy; + + double det = alift * (bdxcdy - cdxbdy) + blift * ocad + clift * oabd; + + return det > 0; +} + +void Sweep::RotateTrianglePair(Triangle& t, Point& p, Triangle& ot, Point& op) +{ + Triangle* n1, *n2, *n3, *n4; + n1 = t.NeighborCCW(p); + n2 = t.NeighborCW(p); + n3 = ot.NeighborCCW(op); + n4 = ot.NeighborCW(op); + + bool ce1, ce2, ce3, ce4; + ce1 = t.GetConstrainedEdgeCCW(p); + ce2 = t.GetConstrainedEdgeCW(p); + ce3 = ot.GetConstrainedEdgeCCW(op); + ce4 = ot.GetConstrainedEdgeCW(op); + + bool de1, de2, de3, de4; + de1 = t.GetDelunayEdgeCCW(p); + de2 = t.GetDelunayEdgeCW(p); + de3 = ot.GetDelunayEdgeCCW(op); + de4 = ot.GetDelunayEdgeCW(op); + + t.Legalize(p, op); + ot.Legalize(op, p); + + // Remap delaunay_edge + ot.SetDelunayEdgeCCW(p, de1); + t.SetDelunayEdgeCW(p, de2); + t.SetDelunayEdgeCCW(op, de3); + ot.SetDelunayEdgeCW(op, de4); + + // Remap constrained_edge + ot.SetConstrainedEdgeCCW(p, ce1); + t.SetConstrainedEdgeCW(p, ce2); + t.SetConstrainedEdgeCCW(op, ce3); + ot.SetConstrainedEdgeCW(op, ce4); + + // Remap neighbors + // XXX: might optimize the markNeighbor by keeping track of + // what side should be assigned to what neighbor after the + // rotation. Now mark neighbor does lots of testing to find + // the right side. + t.ClearNeighbors(); + ot.ClearNeighbors(); + if (n1) ot.MarkNeighbor(*n1); + if (n2) t.MarkNeighbor(*n2); + if (n3) t.MarkNeighbor(*n3); + if (n4) ot.MarkNeighbor(*n4); + t.MarkNeighbor(ot); +} + +void Sweep::FillBasin(SweepContext& tcx, Node& node) +{ + if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) { + tcx.basin.left_node = node.next->next; + } else { + tcx.basin.left_node = node.next; + } + + // Find the bottom and right node + tcx.basin.bottom_node = tcx.basin.left_node; + while (tcx.basin.bottom_node->next + && tcx.basin.bottom_node->point->y >= tcx.basin.bottom_node->next->point->y) { + tcx.basin.bottom_node = tcx.basin.bottom_node->next; + } + if (tcx.basin.bottom_node == tcx.basin.left_node) { + // No valid basin + return; + } + + tcx.basin.right_node = tcx.basin.bottom_node; + while (tcx.basin.right_node->next + && tcx.basin.right_node->point->y < tcx.basin.right_node->next->point->y) { + tcx.basin.right_node = tcx.basin.right_node->next; + } + if (tcx.basin.right_node == tcx.basin.bottom_node) { + // No valid basins + return; + } + + tcx.basin.width = tcx.basin.right_node->point->x - tcx.basin.left_node->point->x; + tcx.basin.left_highest = tcx.basin.left_node->point->y > tcx.basin.right_node->point->y; + + FillBasinReq(tcx, tcx.basin.bottom_node); +} + +void Sweep::FillBasinReq(SweepContext& tcx, Node* node) +{ + // if shallow stop filling + if (IsShallow(tcx, *node)) { + return; + } + + Fill(tcx, *node); + + if (node->prev == tcx.basin.left_node && node->next == tcx.basin.right_node) { + return; + } else if (node->prev == tcx.basin.left_node) { + Orientation o = Orient2d(*node->point, *node->next->point, *node->next->next->point); + if (o == CW) { + return; + } + node = node->next; + } else if (node->next == tcx.basin.right_node) { + Orientation o = Orient2d(*node->point, *node->prev->point, *node->prev->prev->point); + if (o == CCW) { + return; + } + node = node->prev; + } else { + // Continue with the neighbor node with lowest Y value + if (node->prev->point->y < node->next->point->y) { + node = node->prev; + } else { + node = node->next; + } + } + + FillBasinReq(tcx, node); +} + +bool Sweep::IsShallow(SweepContext& tcx, Node& node) +{ + double height; + + if (tcx.basin.left_highest) { + height = tcx.basin.left_node->point->y - node.point->y; + } else { + height = tcx.basin.right_node->point->y - node.point->y; + } + + // if shallow stop filling + if (tcx.basin.width > height) { + return true; + } + return false; +} + +void Sweep::FillEdgeEvent(SweepContext& tcx, Edge* edge, Node* node) +{ + if (tcx.edge_event.right) { + FillRightAboveEdgeEvent(tcx, edge, node); + } else { + FillLeftAboveEdgeEvent(tcx, edge, node); + } +} + +void Sweep::FillRightAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node) +{ + while (node->next->point->x < edge->p->x) { + // Check if next node is below the edge + if (Orient2d(*edge->q, *node->next->point, *edge->p) == CCW) { + FillRightBelowEdgeEvent(tcx, edge, *node); + } else { + node = node->next; + } + } +} + +void Sweep::FillRightBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) +{ + if (node.point->x < edge->p->x) { + if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) { + // Concave + FillRightConcaveEdgeEvent(tcx, edge, node); + } else{ + // Convex + FillRightConvexEdgeEvent(tcx, edge, node); + // Retry this one + FillRightBelowEdgeEvent(tcx, edge, node); + } + } +} + +void Sweep::FillRightConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) +{ + Fill(tcx, *node.next); + if (node.next->point != edge->p) { + // Next above or below edge? + if (Orient2d(*edge->q, *node.next->point, *edge->p) == CCW) { + // Below + if (Orient2d(*node.point, *node.next->point, *node.next->next->point) == CCW) { + // Next is concave + FillRightConcaveEdgeEvent(tcx, edge, node); + } else { + // Next is convex + } + } + } + +} + +void Sweep::FillRightConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) +{ + // Next concave or convex? + if (Orient2d(*node.next->point, *node.next->next->point, *node.next->next->next->point) == CCW) { + // Concave + FillRightConcaveEdgeEvent(tcx, edge, *node.next); + } else{ + // Convex + // Next above or below edge? + if (Orient2d(*edge->q, *node.next->next->point, *edge->p) == CCW) { + // Below + FillRightConvexEdgeEvent(tcx, edge, *node.next); + } else{ + // Above + } + } +} + +void Sweep::FillLeftAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node) +{ + while (node->prev->point->x > edge->p->x) { + // Check if next node is below the edge + if (Orient2d(*edge->q, *node->prev->point, *edge->p) == CW) { + FillLeftBelowEdgeEvent(tcx, edge, *node); + } else { + node = node->prev; + } + } +} + +void Sweep::FillLeftBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) +{ + if (node.point->x > edge->p->x) { + if (Orient2d(*node.point, *node.prev->point, *node.prev->prev->point) == CW) { + // Concave + FillLeftConcaveEdgeEvent(tcx, edge, node); + } else { + // Convex + FillLeftConvexEdgeEvent(tcx, edge, node); + // Retry this one + FillLeftBelowEdgeEvent(tcx, edge, node); + } + } +} + +void Sweep::FillLeftConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) +{ + // Next concave or convex? + if (Orient2d(*node.prev->point, *node.prev->prev->point, *node.prev->prev->prev->point) == CW) { + // Concave + FillLeftConcaveEdgeEvent(tcx, edge, *node.prev); + } else{ + // Convex + // Next above or below edge? + if (Orient2d(*edge->q, *node.prev->prev->point, *edge->p) == CW) { + // Below + FillLeftConvexEdgeEvent(tcx, edge, *node.prev); + } else{ + // Above + } + } +} + +void Sweep::FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node) +{ + Fill(tcx, *node.prev); + if (node.prev->point != edge->p) { + // Next above or below edge? + if (Orient2d(*edge->q, *node.prev->point, *edge->p) == CW) { + // Below + if (Orient2d(*node.point, *node.prev->point, *node.prev->prev->point) == CW) { + // Next is concave + FillLeftConcaveEdgeEvent(tcx, edge, node); + } else{ + // Next is convex + } + } + } + +} + +void Sweep::FlipEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* t, Point& p) +{ + Triangle& ot = t->NeighborAcross(p); + Point& op = *ot.OppositePoint(*t, p); + + if (&ot == NULL) { + // If we want to integrate the fillEdgeEvent do it here + // With current implementation we should never get here + //throw new RuntimeException( "[BUG:FIXME] FLIP failed due to missing triangle"); + assert(0); + } + + if (InScanArea(p, *t->PointCCW(p), *t->PointCW(p), op)) { + // Lets rotate shared edge one vertex CW + RotateTrianglePair(*t, p, ot, op); + tcx.MapTriangleToNodes(*t); + tcx.MapTriangleToNodes(ot); + + if (p == eq && op == ep) { + if (eq == *tcx.edge_event.constrained_edge->q && ep == *tcx.edge_event.constrained_edge->p) { + t->MarkConstrainedEdge(&ep, &eq); + ot.MarkConstrainedEdge(&ep, &eq); + Legalize(tcx, *t); + Legalize(tcx, ot); + } else { + // XXX: I think one of the triangles should be legalized here? + } + } else { + Orientation o = Orient2d(eq, op, ep); + t = &NextFlipTriangle(tcx, (int)o, *t, ot, p, op); + FlipEdgeEvent(tcx, ep, eq, t, p); + } + } else { + Point& newP = NextFlipPoint(ep, eq, ot, op); + FlipScanEdgeEvent(tcx, ep, eq, *t, ot, newP); + EdgeEvent(tcx, ep, eq, t, p); + } +} + +Triangle& Sweep::NextFlipTriangle(SweepContext& tcx, int o, Triangle& t, Triangle& ot, Point& p, Point& op) +{ + if (o == CCW) { + // ot is not crossing edge after flip + int edge_index = ot.EdgeIndex(&p, &op); + ot.delaunay_edge[edge_index] = true; + Legalize(tcx, ot); + ot.ClearDelunayEdges(); + return t; + } + + // t is not crossing edge after flip + int edge_index = t.EdgeIndex(&p, &op); + + t.delaunay_edge[edge_index] = true; + Legalize(tcx, t); + t.ClearDelunayEdges(); + return ot; +} + +Point& Sweep::NextFlipPoint(Point& ep, Point& eq, Triangle& ot, Point& op) +{ + Orientation o2d = Orient2d(eq, op, ep); + if (o2d == CW) { + // Right + return *ot.PointCCW(op); + } else if (o2d == CCW) { + // Left + return *ot.PointCW(op); + } else{ + //throw new RuntimeException("[Unsupported] Opposing point on constrained edge"); + assert(0); + } +} + +void Sweep::FlipScanEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle& flip_triangle, + Triangle& t, Point& p) +{ + Triangle& ot = t.NeighborAcross(p); + Point& op = *ot.OppositePoint(t, p); + + if (&t.NeighborAcross(p) == NULL) { + // If we want to integrate the fillEdgeEvent do it here + // With current implementation we should never get here + //throw new RuntimeException( "[BUG:FIXME] FLIP failed due to missing triangle"); + assert(0); + } + + if (InScanArea(eq, *flip_triangle.PointCCW(eq), *flip_triangle.PointCW(eq), op)) { + // flip with new edge op->eq + FlipEdgeEvent(tcx, eq, op, &ot, op); + // TODO: Actually I just figured out that it should be possible to + // improve this by getting the next ot and op before the above + // flip and continue the flipScanEdgeEvent here + // set new ot and op here and loop back to inScanArea test + // also need to set a new flip_triangle first + // Turns out at first glance that this is somewhat complicated + // so it will have to wait. + } else{ + Point& newP = NextFlipPoint(ep, eq, ot, op); + FlipScanEdgeEvent(tcx, ep, eq, flip_triangle, ot, newP); + } +} + +Sweep::~Sweep() { + + // Clean up memory + for (size_t i = 0; i < nodes_.size(); i++) { + delete nodes_[i]; + } + +} + +} + diff --git a/src/3rdparty/poly2tri/sweep/sweep.h b/src/3rdparty/poly2tri/sweep/sweep.h new file mode 100644 index 0000000..9bb0b5d --- /dev/null +++ b/src/3rdparty/poly2tri/sweep/sweep.h @@ -0,0 +1,285 @@ +/* + * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors + * http://code.google.com/p/poly2tri/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/** + * Sweep-line, Constrained Delauney Triangulation (CDT) See: Domiter, V. and + * Zalik, B.(2008)'Sweep-line algorithm for constrained Delaunay triangulation', + * International Journal of Geographical Information Science + * + * "FlipScan" Constrained Edge Algorithm invented by Thomas Åhlén, thahlen@gmail.com + */ + +#ifndef SWEEP_H +#define SWEEP_H + +#include + +namespace p2t { + +class SweepContext; +struct Node; +struct Point; +struct Edge; +class Triangle; + +class Sweep +{ +public: + + /** + * Triangulate + * + * @param tcx + */ + void Triangulate(SweepContext& tcx); + + /** + * Destructor - clean up memory + */ + ~Sweep(); + +private: + + /** + * Start sweeping the Y-sorted point set from bottom to top + * + * @param tcx + */ + void SweepPoints(SweepContext& tcx); + + /** + * Find closes node to the left of the new point and + * create a new triangle. If needed new holes and basins + * will be filled to. + * + * @param tcx + * @param point + * @return + */ + Node& PointEvent(SweepContext& tcx, Point& point); + + /** + * + * + * @param tcx + * @param edge + * @param node + */ + void EdgeEvent(SweepContext& tcx, Edge* edge, Node* node); + + void EdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* triangle, Point& point); + + /** + * Creates a new front triangle and legalize it + * + * @param tcx + * @param point + * @param node + * @return + */ + Node& NewFrontTriangle(SweepContext& tcx, Point& point, Node& node); + + /** + * Adds a triangle to the advancing front to fill a hole. + * @param tcx + * @param node - middle node, that is the bottom of the hole + */ + void Fill(SweepContext& tcx, Node& node); + + /** + * Returns true if triangle was legalized + */ + bool Legalize(SweepContext& tcx, Triangle& t); + + /** + * Requirement:
+ * 1. a,b and c form a triangle.
+ * 2. a and d is know to be on opposite side of bc
+ *
+   *                a
+   *                +
+   *               / \
+   *              /   \
+   *            b/     \c
+   *            +-------+
+   *           /    d    \
+   *          /           \
+   * 
+ * Fact: d has to be in area B to have a chance to be inside the circle formed by + * a,b and c
+ * d is outside B if orient2d(a,b,d) or orient2d(c,a,d) is CW
+ * This preknowledge gives us a way to optimize the incircle test + * @param a - triangle point, opposite d + * @param b - triangle point + * @param c - triangle point + * @param d - point opposite a + * @return true if d is inside circle, false if on circle edge + */ + bool Incircle(Point& pa, Point& pb, Point& pc, Point& pd); + + /** + * Rotates a triangle pair one vertex CW + *
+   *       n2                    n2
+   *  P +-----+             P +-----+
+   *    | t  /|               |\  t |
+   *    |   / |               | \   |
+   *  n1|  /  |n3           n1|  \  |n3
+   *    | /   |    after CW   |   \ |
+   *    |/ oT |               | oT \|
+   *    +-----+ oP            +-----+
+   *       n4                    n4
+   * 
+ */ + void RotateTrianglePair(Triangle& t, Point& p, Triangle& ot, Point& op); + + /** + * Fills holes in the Advancing Front + * + * + * @param tcx + * @param n + */ + void FillAdvancingFront(SweepContext& tcx, Node& n); + + // Decision-making about when to Fill hole. + // Contributed by ToolmakerSteve2 + bool LargeHole_DontFill(Node* node); + bool AngleExceeds90Degrees(Point* origin, Point* pa, Point* pb); + bool AngleExceedsPlus90DegreesOrIsNegative(Point* origin, Point* pa, Point* pb); + double Angle(Point& origin, Point& pa, Point& pb); + + /** + * + * @param node - middle node + * @return the angle between 3 front nodes + */ + double HoleAngle(Node& node); + + /** + * The basin angle is decided against the horizontal line [1,0] + */ + double BasinAngle(Node& node); + + /** + * Fills a basin that has formed on the Advancing Front to the right + * of given node.
+ * First we decide a left,bottom and right node that forms the + * boundaries of the basin. Then we do a reqursive fill. + * + * @param tcx + * @param node - starting node, this or next node will be left node + */ + void FillBasin(SweepContext& tcx, Node& node); + + /** + * Recursive algorithm to fill a Basin with triangles + * + * @param tcx + * @param node - bottom_node + * @param cnt - counter used to alternate on even and odd numbers + */ + void FillBasinReq(SweepContext& tcx, Node* node); + + bool IsShallow(SweepContext& tcx, Node& node); + + bool IsEdgeSideOfTriangle(Triangle& triangle, Point& ep, Point& eq); + + void FillEdgeEvent(SweepContext& tcx, Edge* edge, Node* node); + + void FillRightAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node); + + void FillRightBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); + + void FillRightConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); + + void FillRightConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); + + void FillLeftAboveEdgeEvent(SweepContext& tcx, Edge* edge, Node* node); + + void FillLeftBelowEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); + + void FillLeftConcaveEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); + + void FillLeftConvexEdgeEvent(SweepContext& tcx, Edge* edge, Node& node); + + void FlipEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle* t, Point& p); + + /** + * After a flip we have two triangles and know that only one will still be + * intersecting the edge. So decide which to contiune with and legalize the other + * + * @param tcx + * @param o - should be the result of an orient2d( eq, op, ep ) + * @param t - triangle 1 + * @param ot - triangle 2 + * @param p - a point shared by both triangles + * @param op - another point shared by both triangles + * @return returns the triangle still intersecting the edge + */ + Triangle& NextFlipTriangle(SweepContext& tcx, int o, Triangle& t, Triangle& ot, Point& p, Point& op); + + /** + * When we need to traverse from one triangle to the next we need + * the point in current triangle that is the opposite point to the next + * triangle. + * + * @param ep + * @param eq + * @param ot + * @param op + * @return + */ + Point& NextFlipPoint(Point& ep, Point& eq, Triangle& ot, Point& op); + + /** + * Scan part of the FlipScan algorithm
+ * When a triangle pair isn't flippable we will scan for the next + * point that is inside the flip triangle scan area. When found + * we generate a new flipEdgeEvent + * + * @param tcx + * @param ep - last point on the edge we are traversing + * @param eq - first point on the edge we are traversing + * @param flipTriangle - the current triangle sharing the point eq with edge + * @param t + * @param p + */ + void FlipScanEdgeEvent(SweepContext& tcx, Point& ep, Point& eq, Triangle& flip_triangle, Triangle& t, Point& p); + + void FinalizationPolygon(SweepContext& tcx); + + std::vector nodes_; + +}; + +} + +#endif diff --git a/src/3rdparty/poly2tri/sweep/sweep_context.cpp b/src/3rdparty/poly2tri/sweep/sweep_context.cpp new file mode 100644 index 0000000..24dde11 --- /dev/null +++ b/src/3rdparty/poly2tri/sweep/sweep_context.cpp @@ -0,0 +1,216 @@ +/* + * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors + * http://code.google.com/p/poly2tri/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "sweep_context.h" +#include +#include "advancing_front.h" + +namespace p2t { + +SweepContext::SweepContext(std::vector polyline) : + front_(0), + head_(0), + tail_(0), + af_head_(0), + af_middle_(0), + af_tail_(0) +{ + basin = Basin(); + edge_event = EdgeEvent(); + + points_ = polyline; + + InitEdges(points_); +} + +void SweepContext::AddHole(std::vector polyline) +{ + InitEdges(polyline); + for (unsigned int i = 0; i < polyline.size(); i++) { + points_.push_back(polyline[i]); + } +} + +void SweepContext::AddPoint(Point* point) { + points_.push_back(point); +} + +std::vector SweepContext::GetTriangles() +{ + return triangles_; +} + +std::list SweepContext::GetMap() +{ + return map_; +} + +void SweepContext::InitTriangulation() +{ + double xmax(points_[0]->x), xmin(points_[0]->x); + double ymax(points_[0]->y), ymin(points_[0]->y); + + // Calculate bounds. + for (unsigned int i = 0; i < points_.size(); i++) { + Point& p = *points_[i]; + if (p.x > xmax) + xmax = p.x; + if (p.x < xmin) + xmin = p.x; + if (p.y > ymax) + ymax = p.y; + if (p.y < ymin) + ymin = p.y; + } + + double dx = kAlpha * (xmax - xmin); + double dy = kAlpha * (ymax - ymin); + head_ = new Point(xmax + dx, ymin - dy); + tail_ = new Point(xmin - dx, ymin - dy); + + // Sort points along y-axis + std::sort(points_.begin(), points_.end(), cmp); + +} + +void SweepContext::InitEdges(std::vector polyline) +{ + int num_points = polyline.size(); + for (int i = 0; i < num_points; i++) { + int j = i < num_points - 1 ? i + 1 : 0; + edge_list.push_back(new Edge(*polyline[i], *polyline[j])); + } +} + +Point* SweepContext::GetPoint(const int& index) +{ + return points_[index]; +} + +void SweepContext::AddToMap(Triangle* triangle) +{ + map_.push_back(triangle); +} + +Node& SweepContext::LocateNode(Point& point) +{ + // TODO implement search tree + return *front_->LocateNode(point.x); +} + +void SweepContext::CreateAdvancingFront(std::vector nodes) +{ + + (void) nodes; + // Initial triangle + Triangle* triangle = new Triangle(*points_[0], *tail_, *head_); + + map_.push_back(triangle); + + af_head_ = new Node(*triangle->GetPoint(1), *triangle); + af_middle_ = new Node(*triangle->GetPoint(0), *triangle); + af_tail_ = new Node(*triangle->GetPoint(2)); + front_ = new AdvancingFront(*af_head_, *af_tail_); + + // TODO: More intuitive if head is middles next and not previous? + // so swap head and tail + af_head_->next = af_middle_; + af_middle_->next = af_tail_; + af_middle_->prev = af_head_; + af_tail_->prev = af_middle_; +} + +void SweepContext::RemoveNode(Node* node) +{ + delete node; +} + +void SweepContext::MapTriangleToNodes(Triangle& t) +{ + for (int i = 0; i < 3; i++) { + if (!t.GetNeighbor(i)) { + Node* n = front_->LocatePoint(t.PointCW(*t.GetPoint(i))); + if (n) + n->triangle = &t; + } + } +} + +void SweepContext::RemoveFromMap(Triangle* triangle) +{ + map_.remove(triangle); +} + +void SweepContext::MeshClean(Triangle& triangle) +{ + std::vector triangles; + triangles.push_back(&triangle); + + while(!triangles.empty()){ + Triangle *t = triangles.back(); + triangles.pop_back(); + + if (t != NULL && !t->IsInterior()) { + t->IsInterior(true); + triangles_.push_back(t); + for (int i = 0; i < 3; i++) { + if (!t->constrained_edge[i]) + triangles.push_back(t->GetNeighbor(i)); + } + } + } +} + +SweepContext::~SweepContext() +{ + + // Clean up memory + + delete head_; + delete tail_; + delete front_; + delete af_head_; + delete af_middle_; + delete af_tail_; + + typedef std::list type_list; + + for (type_list::iterator iter = map_.begin(); iter != map_.end(); ++iter) { + Triangle* ptr = *iter; + delete ptr; + } + + for (unsigned int i = 0; i < edge_list.size(); i++) { + delete edge_list[i]; + } + +} + +} diff --git a/src/3rdparty/poly2tri/sweep/sweep_context.h b/src/3rdparty/poly2tri/sweep/sweep_context.h new file mode 100644 index 0000000..c110a74 --- /dev/null +++ b/src/3rdparty/poly2tri/sweep/sweep_context.h @@ -0,0 +1,186 @@ +/* + * Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors + * http://code.google.com/p/poly2tri/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of Poly2Tri nor the names of its contributors may be + * used to endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SWEEP_CONTEXT_H +#define SWEEP_CONTEXT_H + +#include +#include +#include + +namespace p2t { + +// Initial triangle factor, seed triangle will extend 30% of +// PointSet width to both left and right. +const double kAlpha = 0.3; + +struct Point; +class Triangle; +struct Node; +struct Edge; +class AdvancingFront; + +class SweepContext { +public: + +/// Constructor +SweepContext(std::vector polyline); +/// Destructor +~SweepContext(); + +void set_head(Point* p1); + +Point* head(); + +void set_tail(Point* p1); + +Point* tail(); + +int point_count(); + +Node& LocateNode(Point& point); + +void RemoveNode(Node* node); + +void CreateAdvancingFront(std::vector nodes); + +/// Try to map a node to all sides of this triangle that don't have a neighbor +void MapTriangleToNodes(Triangle& t); + +void AddToMap(Triangle* triangle); + +Point* GetPoint(const int& index); + +Point* GetPoints(); + +void RemoveFromMap(Triangle* triangle); + +void AddHole(std::vector polyline); + +void AddPoint(Point* point); + +AdvancingFront* front(); + +void MeshClean(Triangle& triangle); + +std::vector GetTriangles(); +std::list GetMap(); + +std::vector edge_list; + +struct Basin { + Node* left_node; + Node* bottom_node; + Node* right_node; + double width; + bool left_highest; + + Basin() : left_node(NULL), bottom_node(NULL), right_node(NULL), width(0.0), left_highest(false) + { + } + + void Clear() + { + left_node = NULL; + bottom_node = NULL; + right_node = NULL; + width = 0.0; + left_highest = false; + } +}; + +struct EdgeEvent { + Edge* constrained_edge; + bool right; + + EdgeEvent() : constrained_edge(NULL), right(false) + { + } +}; + +Basin basin; +EdgeEvent edge_event; + +private: + +friend class Sweep; + +std::vector triangles_; +std::list map_; +std::vector points_; + +// Advancing front +AdvancingFront* front_; +// head point used with advancing front +Point* head_; +// tail point used with advancing front +Point* tail_; + +Node *af_head_, *af_middle_, *af_tail_; + +void InitTriangulation(); +void InitEdges(std::vector polyline); + +}; + +inline AdvancingFront* SweepContext::front() +{ + return front_; +} + +inline int SweepContext::point_count() +{ + return int(points_.size()); +} + +inline void SweepContext::set_head(Point* p1) +{ + head_ = p1; +} + +inline Point* SweepContext::head() +{ + return head_; +} + +inline void SweepContext::set_tail(Point* p1) +{ + tail_ = p1; +} + +inline Point* SweepContext::tail() +{ + return tail_; +} + +} + +#endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..980c492 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,13 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# special case begin +add_subdirectory(3rdparty/poly2tri) +add_subdirectory(3rdparty/clipper) +add_subdirectory(3rdparty/clip2tri) +add_subdirectory(positioning) +add_subdirectory(plugins) +if(TARGET Qt::Quick) + add_subdirectory(positioningquick) +endif() +# special case end diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt new file mode 100644 index 0000000..d2c109e --- /dev/null +++ b/src/plugins/CMakeLists.txt @@ -0,0 +1,8 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from plugins.pro. + +if(TARGET Qt::Positioning) + add_subdirectory(position) +endif() diff --git a/src/plugins/position/CMakeLists.txt b/src/plugins/position/CMakeLists.txt new file mode 100644 index 0000000..a6feec0 --- /dev/null +++ b/src/plugins/position/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from position.pro. + +add_subdirectory(positionpoll) +if(TARGET Qt::DBus AND (FREEBSD OR LINUX OR OPENBSD OR NETBSD OR HURD)) + add_subdirectory(geoclue2) +endif() +if(QT_FEATURE_gypsy) + add_subdirectory(gypsy) +endif() +if(QT_FEATURE_winrt_geolocation) + add_subdirectory(winrt) +endif() +if(IOS OR MACOS) + add_subdirectory(corelocation) +endif() +if(ANDROID) + add_subdirectory(android) +endif() +if(TARGET Qt::Network) + add_subdirectory(nmea) +endif() diff --git a/src/plugins/position/android/CMakeLists.txt b/src/plugins/position/android/CMakeLists.txt new file mode 100644 index 0000000..5b2c932 --- /dev/null +++ b/src/plugins/position/android/CMakeLists.txt @@ -0,0 +1,7 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from android.pro. + +add_subdirectory(jar) +add_subdirectory(src) diff --git a/src/plugins/position/android/jar/AndroidManifest.xml b/src/plugins/position/android/jar/AndroidManifest.xml new file mode 100644 index 0000000..2e847fd --- /dev/null +++ b/src/plugins/position/android/jar/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + diff --git a/src/plugins/position/android/jar/CMakeLists.txt b/src/plugins/position/android/jar/CMakeLists.txt new file mode 100644 index 0000000..39e0521 --- /dev/null +++ b/src/plugins/position/android/jar/CMakeLists.txt @@ -0,0 +1,22 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from jar.pro. + +set(java_sources + src/org/qtproject/qt/android/positioning/QtPositioning.java # special case +) + +qt_internal_add_jar(Qt${QtLocation_VERSION_MAJOR}AndroidPositioning # special case + INCLUDE_JARS ${QT_ANDROID_JAR} + SOURCES ${java_sources} + OUTPUT_DIR "${QT_BUILD_DIR}/jar" +) + +qt_path_join(destination ${INSTALL_DATADIR} "jar") + +install_jar(Qt${QtLocation_VERSION_MAJOR}AndroidPositioning # special case + DESTINATION ${destination} + COMPONENT Devel +) + diff --git a/src/plugins/position/android/jar/src/org/qtproject/qt/android/positioning/QtPositioning.java b/src/plugins/position/android/jar/src/org/qtproject/qt/android/positioning/QtPositioning.java new file mode 100644 index 0000000..fa40864 --- /dev/null +++ b/src/plugins/position/android/jar/src/org/qtproject/qt/android/positioning/QtPositioning.java @@ -0,0 +1,606 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +package org.qtproject.qt.android.positioning; + +import android.content.Context; +import android.location.GpsSatellite; +import android.location.GpsStatus; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.location.GnssStatus; +import android.location.GnssStatus.Callback; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Build; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import android.util.Log; + +public class QtPositioning implements LocationListener +{ + + private static final String TAG = "qt.positioning.android"; + static LocationManager locationManager = null; + static Object m_syncObject = new Object(); + static HashMap runningListeners = new HashMap(); + + /* + The positionInfo instance to which this + QtPositioning instance is attached to. + */ + private int nativeClassReference = 0; + + /* + The provider type requested by Qt + */ + private int expectedProviders = 0; + + public static final int QT_GPS_PROVIDER = 1; + public static final int QT_NETWORK_PROVIDER = 2; + + /* The following values must match the corresponding error enums in the Qt API*/ + public static final int QT_ACCESS_ERROR = 0; + public static final int QT_CLOSED_ERROR = 1; + public static final int QT_POSITION_UNKNOWN_SOURCE_ERROR = 2; + public static final int QT_POSITION_NO_ERROR = 3; + public static final int QT_SATELLITE_NO_ERROR = 2; + public static final int QT_SATELLITE_UNKNOWN_SOURCE_ERROR = -1; + + /* True, if updates were caused by requestUpdate() */ + private boolean isSingleUpdate = false; + /* The length requested for regular intervals in msec. */ + private int updateIntervalTime = 0; + + /* The last received GPS update */ + private Location lastGps = null; + /* The last received network update */ + private Location lastNetwork = null; + /* If true this class acts as satellite signal monitor rather than location monitor */ + private boolean isSatelliteUpdate = false; + + private PositioningLooperBase looperThread; + + private boolean isLocationProvidersDisabledInvoked = false; + + static public void setContext(Context context) + { + try { + locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); + } catch(Exception e) { + e.printStackTrace(); + } + } + + static private int[] providerList() + { + if (locationManager == null) { + Log.w(TAG, "No locationManager available in QtPositioning"); + return new int[0]; + } + List providers = locationManager.getProviders(true); + int retList[] = new int[providers.size()]; + for (int i = 0; i < providers.size(); i++) { + if (providers.get(i).equals(LocationManager.GPS_PROVIDER)) { + //must be in sync with AndroidPositioning::PositionProvider::PROVIDER_GPS + retList[i] = 0; + } else if (providers.get(i).equals(LocationManager.NETWORK_PROVIDER)) { + //must be in sync with AndroidPositioning::PositionProvider::PROVIDER_NETWORK + retList[i] = 1; + } else if (providers.get(i).equals(LocationManager.PASSIVE_PROVIDER)) { + //must be in sync with AndroidPositioning::PositionProvider::PROVIDER_PASSIVE + retList[i] = 2; + } else { + retList[i] = -1; + } + } + return retList; + } + + static public Location lastKnownPosition(boolean fromSatelliteOnly) + { + Location gps = null; + Location network = null; + try { + gps = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); + if (!fromSatelliteOnly) + network = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); + } catch(Exception e) { + e.printStackTrace(); + gps = network = null; + } + + if (gps != null && network != null) { + //we return the most recent location but slightly prefer GPS + //prefer GPS if it is max 4 hrs older than network + long delta = network.getTime() - gps.getTime(); + if (delta < 4*60*60*1000) { + return gps; + } else { + return network; + } + } else if (gps != null ) { + return gps; + } else if (network != null) { + return network; + } + + return null; + } + + /* Returns true if at least on of the given providers is enabled. */ + static private boolean expectedProvidersAvailable(int desiredProviders) + { + List enabledProviders = locationManager.getProviders(true); + if ((desiredProviders & QT_GPS_PROVIDER) > 0) { //gps desired + if (enabledProviders.contains(LocationManager.GPS_PROVIDER)) { + return true; + } + } + if ((desiredProviders & QT_NETWORK_PROVIDER) > 0) { //network desired + if (enabledProviders.contains(LocationManager.NETWORK_PROVIDER)) { + return true; + } + } + + return false; + } + + + static private void addActiveListener(QtPositioning listener, String provider, long minTime, float minDistance) + { + int androidClassKey = listener.nativeClassReference; + //start update thread + listener.setActiveLooper(true); + + if (runningListeners.containsKey(androidClassKey) && runningListeners.get(androidClassKey) != listener) { + removeActiveListener(androidClassKey); + } + + locationManager.requestLocationUpdates(provider, + minTime, minDistance, + listener, + listener.looper()); + + runningListeners.put(androidClassKey, listener); + } + + + static private void removeActiveListener(QtPositioning listener) + { + removeActiveListener(listener.nativeClassReference); + } + + + static private void removeActiveListener(int androidClassKey) + { + QtPositioning listener = runningListeners.remove(androidClassKey); + + if (listener != null) { + locationManager.removeUpdates(listener); + listener.setActiveLooper(false); + } + } + + + static public int startUpdates(int androidClassKey, int locationProvider, int updateInterval) + { + synchronized (m_syncObject) { + try { + boolean exceptionOccurred = false; + QtPositioning positioningListener = new QtPositioning(); + positioningListener.nativeClassReference = androidClassKey; + positioningListener.expectedProviders = locationProvider; + positioningListener.isSatelliteUpdate = false; + + if (updateInterval == 0) + updateInterval = 50; //don't update more often than once per 50ms + + positioningListener.updateIntervalTime = updateInterval; + if ((locationProvider & QT_GPS_PROVIDER) > 0) { + Log.d(TAG, "Regular updates using GPS " + updateInterval); + try { + addActiveListener(positioningListener, + LocationManager.GPS_PROVIDER, + updateInterval, 0); + } catch (SecurityException se) { + se.printStackTrace(); + exceptionOccurred = true; + } + } + + if ((locationProvider & QT_NETWORK_PROVIDER) > 0) { + Log.d(TAG, "Regular updates using network " + updateInterval); + try { + addActiveListener(positioningListener, + LocationManager.NETWORK_PROVIDER, + updateInterval, 0); + } catch (SecurityException se) { + se.printStackTrace(); + exceptionOccurred = true; + } + } + if (exceptionOccurred) { + removeActiveListener(positioningListener); + return QT_ACCESS_ERROR; + } + + if (!expectedProvidersAvailable(locationProvider)) { + //all location providers unavailbe -> when they come back we resume automatically + return QT_CLOSED_ERROR; + } + + } catch(Exception e) { + e.printStackTrace(); + return QT_POSITION_UNKNOWN_SOURCE_ERROR; + } + + return QT_POSITION_NO_ERROR; + } + } + + static public void stopUpdates(int androidClassKey) + { + synchronized (m_syncObject) { + try { + Log.d(TAG, "Stopping updates"); + removeActiveListener(androidClassKey); + } catch(Exception e) { + e.printStackTrace(); + return; + } + } + } + + static public int requestUpdate(int androidClassKey, int locationProvider, int timeout) + { + synchronized (m_syncObject) { + try { + boolean exceptionOccurred = false; + QtPositioning positioningListener = new QtPositioning(); + positioningListener.nativeClassReference = androidClassKey; + positioningListener.isSingleUpdate = true; + positioningListener.expectedProviders = locationProvider; + positioningListener.isSatelliteUpdate = false; + + if ((locationProvider & QT_GPS_PROVIDER) > 0) { + Log.d(TAG, "Single update using GPS"); + try { + addActiveListener(positioningListener, LocationManager.GPS_PROVIDER, + timeout, 0); + } catch (SecurityException se) { + se.printStackTrace(); + exceptionOccurred = true; + } + } + + if ((locationProvider & QT_NETWORK_PROVIDER) > 0) { + Log.d(TAG, "Single update using network"); + try { + addActiveListener(positioningListener, LocationManager.NETWORK_PROVIDER, + timeout, 0); + } catch (SecurityException se) { + se.printStackTrace(); + exceptionOccurred = true; + } + } + if (exceptionOccurred) { + removeActiveListener(positioningListener); + return QT_ACCESS_ERROR; + } + + if (!expectedProvidersAvailable(locationProvider)) { + //all location providers unavailable -> when they come back we resume automatically + //in the mean time return ClosedError + return QT_CLOSED_ERROR; + } + + } catch(Exception e) { + e.printStackTrace(); + return QT_POSITION_UNKNOWN_SOURCE_ERROR; + } + + return QT_POSITION_NO_ERROR; + } + } + + static public int startSatelliteUpdates(int androidClassKey, int updateInterval, boolean isSingleRequest) + { + synchronized (m_syncObject) { + try { + boolean exceptionOccurred = false; + QtPositioning positioningListener = new QtPositioning(); + positioningListener.isSatelliteUpdate = true; + positioningListener.nativeClassReference = androidClassKey; + positioningListener.expectedProviders = 1; //always satellite provider + positioningListener.isSingleUpdate = isSingleRequest; + + if (updateInterval == 0) + updateInterval = 50; //don't update more often than once per 50ms + + if (isSingleRequest) + Log.d(TAG, "Single update for Satellites " + updateInterval); + else + Log.d(TAG, "Regular updates for Satellites " + updateInterval); + try { + addActiveListener(positioningListener, LocationManager.GPS_PROVIDER, + updateInterval, 0); + } catch (SecurityException se) { + se.printStackTrace(); + exceptionOccurred = true; + } + + if (exceptionOccurred) { + removeActiveListener(positioningListener); + return QT_ACCESS_ERROR; + } + + if (!expectedProvidersAvailable(positioningListener.expectedProviders)) { + //all location providers unavailable -> when they come back we resume automatically + //in the mean time return ClosedError + return QT_CLOSED_ERROR; + } + + } catch(Exception e) { + e.printStackTrace(); + return QT_SATELLITE_UNKNOWN_SOURCE_ERROR; + } + + return QT_SATELLITE_NO_ERROR; + } + } + + public QtPositioning() + { + // Use GpsStatus for API Level <= 23 (version M and below) and + // GnssStatus for other API levels. + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) + looperThread = new PositioningLooperGps(); + else + looperThread = new PositioningLooperGnss(); + } + + public Looper looper() + { + return looperThread.looper(); + } + + private void setActiveLooper(boolean setActive) + { + try{ + if (setActive) { + if (looperThread.isAlive()) + return; + + if (isSatelliteUpdate) + looperThread.isSatelliteListener(true); + + long start = System.currentTimeMillis(); + looperThread.start(); + + //busy wait but lasts ~20-30 ms only + while (!looperThread.isReady()); + + long stop = System.currentTimeMillis(); + Log.d(TAG, "Looper Thread startup time in ms: " + (stop-start)); + } else { + looperThread.quitLooper(); + } + } catch(Exception e) { + e.printStackTrace(); + } + } + + private abstract class PositioningLooperBase extends Thread + { + private boolean looperRunning; + private Looper posLooper; + private boolean isSatelliteLooper = false; + + abstract protected void addSatelliteInfoListener(); + abstract protected void removeSatelliteInfoListener(); + + private PositioningLooperBase() + { + looperRunning = false; + } + + public void run() + { + Looper.prepare(); + Handler handler = new Handler(); + + if (isSatelliteLooper) + addSatelliteInfoListener(); + + posLooper = Looper.myLooper(); + synchronized (this) { + looperRunning = true; + } + Looper.loop(); + synchronized (this) { + looperRunning = false; + } + } + + public void quitLooper() + { + if (isSatelliteLooper) + removeSatelliteInfoListener(); + looper().quit(); + } + + public synchronized boolean isReady() + { + return looperRunning; + } + + public void isSatelliteListener(boolean isListener) + { + isSatelliteLooper = isListener; + } + + public Looper looper() + { + return posLooper; + } + + } + + private class PositioningLooperGps extends PositioningLooperBase implements GpsStatus.Listener + { + @Override + protected void addSatelliteInfoListener() + { + try { + locationManager.addGpsStatusListener(this); + } catch(Exception e) { + e.printStackTrace(); + } + } + + @Override + protected void removeSatelliteInfoListener() + { + locationManager.removeGpsStatusListener(this); + } + + @Override + public void onGpsStatusChanged(int event) { + switch (event) { + case GpsStatus.GPS_EVENT_FIRST_FIX: + break; + case GpsStatus.GPS_EVENT_SATELLITE_STATUS: + GpsStatus status = locationManager.getGpsStatus(null); + Iterable iterable = status.getSatellites(); + Iterator it = iterable.iterator(); + + ArrayList list = new ArrayList(); + while (it.hasNext()) { + GpsSatellite sat = (GpsSatellite) it.next(); + list.add(sat); + } + GpsSatellite[] sats = list.toArray(new GpsSatellite[list.size()]); + satelliteGpsUpdated(sats, nativeClassReference, isSingleUpdate); + + break; + case GpsStatus.GPS_EVENT_STARTED: + break; + case GpsStatus.GPS_EVENT_STOPPED: + break; + } + } + } + + private class PositioningGnssListener extends GnssStatus.Callback + { + @Override + public void onSatelliteStatusChanged(GnssStatus status) + { + satelliteGnssUpdated(status, nativeClassReference, isSingleUpdate); + } + } + + private class PositioningLooperGnss extends PositioningLooperBase + { + private PositioningGnssListener gnssListener; + + private PositioningLooperGnss() + { + gnssListener = new PositioningGnssListener(); + } + + @Override + protected void addSatelliteInfoListener() + { + try { + locationManager.registerGnssStatusCallback(gnssListener); + } catch(Exception e) { + e.printStackTrace(); + } + } + + @Override + protected void removeSatelliteInfoListener() + { + locationManager.unregisterGnssStatusCallback(gnssListener); + } + } + + public static native void positionUpdated(Location update, int androidClassKey, boolean isSingleUpdate); + public static native void locationProvidersDisabled(int androidClassKey); + public static native void locationProvidersChanged(int androidClassKey); + public static native void satelliteGpsUpdated(Object[] update, int androidClassKey, boolean isSingleUpdate); + public static native void satelliteGnssUpdated(GnssStatus update, int androidClassKey, boolean isSingleUpdate); + + @Override + public void onLocationChanged(Location location) { + //Log.d(TAG, "**** Position Update ****: " + location.toString() + " " + isSingleUpdate); + if (location == null) + return; + + if (isSatelliteUpdate) //we are a QGeoSatelliteInfoSource -> ignore + return; + + if (isSingleUpdate || expectedProviders < 3) { + positionUpdated(location, nativeClassReference, isSingleUpdate); + return; + } + + /* + We can use GPS and Network, pick the better location provider. + Generally we prefer GPS data due to their higher accurancy but we + let Network data pass until GPS fix is available + */ + + if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) { + lastGps = location; + + // assumption: GPS always better -> pass it on + positionUpdated(location, nativeClassReference, isSingleUpdate); + } else if (location.getProvider().equals(LocationManager.NETWORK_PROVIDER)) { + lastNetwork = location; + + if (lastGps == null) { //no GPS fix yet use network location + positionUpdated(location, nativeClassReference, isSingleUpdate); + return; + } + + long delta = location.getTime() - lastGps.getTime(); + + // Ignore if network update is older than last GPS (delta < 0) + // Ignore if gps update still has time to provide next location (delta < updateInterval) + if (delta < updateIntervalTime) + return; + + // Use network data -> GPS has timed out on updateInterval + positionUpdated(location, nativeClassReference, isSingleUpdate); + } + } + + @Override + public void onStatusChanged(String provider, int status, Bundle extras) {} + + @Override + public void onProviderEnabled(String provider) { + Log.d(TAG, "Enabled provider: " + provider); + locationProvidersChanged(nativeClassReference); + if (isLocationProvidersDisabledInvoked && expectedProvidersAvailable(expectedProviders)) + isLocationProvidersDisabledInvoked = false; + } + + @Override + public void onProviderDisabled(String provider) { + Log.d(TAG, "Disabled provider: " + provider); + locationProvidersChanged(nativeClassReference); + if (!isLocationProvidersDisabledInvoked && !expectedProvidersAvailable(expectedProviders)) { + isLocationProvidersDisabledInvoked = true; + locationProvidersDisabled(nativeClassReference); + } + } +} diff --git a/src/plugins/position/android/src/CMakeLists.txt b/src/plugins/position/android/src/CMakeLists.txt new file mode 100644 index 0000000..6916c84 --- /dev/null +++ b/src/plugins/position/android/src/CMakeLists.txt @@ -0,0 +1,26 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from src.pro. + +##################################################################### +## QGeoPositionInfoSourceFactoryAndroid Plugin: +##################################################################### + +qt_internal_add_plugin(QGeoPositionInfoSourceFactoryAndroidPlugin + OUTPUT_NAME qtposition_android + CLASS_NAME QGeoPositionInfoSourceFactoryAndroid + PLUGIN_TYPE position + SOURCES + jnipositioning.cpp jnipositioning.h + positionfactory_android.cpp positionfactory_android.h + qgeopositioninfosource_android.cpp qgeopositioninfosource_android_p.h + qgeosatelliteinfosource_android.cpp qgeosatelliteinfosource_android_p.h + LIBRARIES + Qt::Core + Qt::CorePrivate + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:src.pro:: +# OTHER_FILES = "plugin.json" diff --git a/src/plugins/position/android/src/jnipositioning.cpp b/src/plugins/position/android/src/jnipositioning.cpp new file mode 100644 index 0000000..e8ba5f7 --- /dev/null +++ b/src/plugins/position/android/src/jnipositioning.cpp @@ -0,0 +1,735 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "jnipositioning.h" +#include "qgeopositioninfosource_android_p.h" +#include "qgeosatelliteinfosource_android_p.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Q_DECLARE_JNI_CLASS(QtPositioning, "org/qtproject/qt/android/positioning/QtPositioning") +Q_DECLARE_JNI_CLASS(GnssStatus, "android/location/GnssStatus") +Q_DECLARE_JNI_CLASS(Location, "android/location/Location") + +using namespace Qt::StringLiterals; + +template +class GlobalClassRefWrapper +{ +public: + GlobalClassRefWrapper() = default; + ~GlobalClassRefWrapper() + { + if (m_classRef) { + QJniEnvironment env; + if (env.jniEnv()) + env->DeleteGlobalRef(m_classRef); + } + } + + bool init() + { + QJniEnvironment env; + if (env.jniEnv()) { + if (m_classRef) { + env->DeleteGlobalRef(m_classRef); + m_classRef = nullptr; + } + + m_classRef = env.findClass(); // it returns global ref! + } + return m_classRef != nullptr; + } + + jclass operator()() { return m_classRef; } + +private: + jclass m_classRef = nullptr; +}; + +static GlobalClassRefWrapper positioningClass; + +static jmethodID providerListMethodId; +static jmethodID lastKnownPositionMethodId; +static jmethodID startUpdatesMethodId; +static jmethodID stopUpdatesMethodId; +static jmethodID requestUpdateMethodId; +static jmethodID startSatelliteUpdatesMethodId; + +static const char logTag[] = "qt.positioning.android"; +static const char methodErrorMsg[] = "Can't find method \"%s%s\""; + +Q_LOGGING_CATEGORY(lcPositioning, logTag) + +namespace { + +/*! + \internal + This class encapsulates satellite system types, as defined by Android + GnssStatus API. Initialize during JNI_OnLoad() by the init() method, from + the Java side, rather than hard-coding. +*/ +class ConstellationMapper +{ +public: + static bool init() + { + m_gnssStatusObject = nullptr; + if (QNativeInterface::QAndroidApplication::sdkVersion() > 23) { + m_gnssStatusObject = QJniEnvironment().findClass(); + if (!m_gnssStatusObject) + return false; + } + // no need to query it for API level <= 23 + return true; + } + + static QGeoSatelliteInfo::SatelliteSystem toSatelliteSystem(int constellationType) + { + if (!m_gnssStatusObject) + return QGeoSatelliteInfo::Undefined; + + static const int gps = + QJniObject::getStaticField(m_gnssStatusObject, "CONSTELLATION_GPS"); + static const int glonass = + QJniObject::getStaticField(m_gnssStatusObject, "CONSTELLATION_GLONASS"); + static const int galileo = + QJniObject::getStaticField(m_gnssStatusObject, "CONSTELLATION_GALILEO"); + static const int beidou = + QJniObject::getStaticField(m_gnssStatusObject, "CONSTELLATION_BEIDOU"); + static const int qzss = + QJniObject::getStaticField(m_gnssStatusObject, "CONSTELLATION_QZSS"); + + if (constellationType == gps) { + return QGeoSatelliteInfo::GPS; + } else if (constellationType == glonass) { + return QGeoSatelliteInfo::GLONASS; + } else if (constellationType == galileo) { + return QGeoSatelliteInfo::GALILEO; + } else if (constellationType == beidou) { + return QGeoSatelliteInfo::BEIDOU; + } else if (constellationType == qzss){ + return QGeoSatelliteInfo::QZSS; + } else { + qCWarning(lcPositioning) << "Unknown satellite system" << constellationType; + return QGeoSatelliteInfo::Undefined; + } + } + +private: + static jclass m_gnssStatusObject; +}; + +jclass ConstellationMapper::m_gnssStatusObject = nullptr; + +} // anonymous namespace + +namespace AndroidPositioning { + typedef QMap PositionSourceMap; + typedef QMap SatelliteSourceMap; + + Q_GLOBAL_STATIC(PositionSourceMap, idToPosSource) + + Q_GLOBAL_STATIC(SatelliteSourceMap, idToSatSource) + + int registerPositionInfoSource(QObject *obj) + { + int key = -1; + if (obj->inherits("QGeoPositionInfoSource")) { + QGeoPositionInfoSourceAndroid *src = qobject_cast(obj); + Q_ASSERT(src); + do { + key = qAbs(int(QRandomGenerator::global()->generate())); + } while (idToPosSource()->contains(key)); + + idToPosSource()->insert(key, src); + } else if (obj->inherits("QGeoSatelliteInfoSource")) { + QGeoSatelliteInfoSourceAndroid *src = qobject_cast(obj); + Q_ASSERT(src); + do { + key = qAbs(int(QRandomGenerator::global()->generate())); + } while (idToSatSource()->contains(key)); + + idToSatSource()->insert(key, src); + } + + return key; + } + + void unregisterPositionInfoSource(int key) + { + if (idToPosSource.exists()) + idToPosSource->remove(key); + + if (idToSatSource.exists()) + idToSatSource->remove(key); + } + + enum PositionProvider + { + PROVIDER_GPS = 0, + PROVIDER_NETWORK = 1, + PROVIDER_PASSIVE = 2 + }; + + + QGeoPositionInfoSource::PositioningMethods availableProviders() + { + QGeoPositionInfoSource::PositioningMethods ret = QGeoPositionInfoSource::NoPositioningMethods; + QJniEnvironment env; + if (!env.jniEnv()) + return ret; + QJniObject jniProvidersObj = + QJniObject::callStaticMethod(positioningClass(), providerListMethodId); + jintArray jProviders = jniProvidersObj.object(); + if (!jProviders) { + // Work-around for QTBUG-116645 + __android_log_print(ANDROID_LOG_INFO, logTag, "Got null providers array!"); + return ret; + } + jint *providers = env->GetIntArrayElements(jProviders, nullptr); + const int size = env->GetArrayLength(jProviders); + for (int i = 0; i < size; i++) { + switch (providers[i]) { + case PROVIDER_GPS: + ret |= QGeoPositionInfoSource::SatellitePositioningMethods; + break; + case PROVIDER_NETWORK: + ret |= QGeoPositionInfoSource::NonSatellitePositioningMethods; + break; + case PROVIDER_PASSIVE: + //we ignore as Qt doesn't have interface for it right now + break; + default: + __android_log_print(ANDROID_LOG_INFO, logTag, "Unknown positioningMethod"); + } + } + + env->ReleaseIntArrayElements(jProviders, providers, 0); + + return ret; + } + + QGeoPositionInfo positionInfoFromJavaLocation(const jobject &location) + { + QGeoPositionInfo info; + + QJniObject jniObject(location); + if (!jniObject.isValid()) + return QGeoPositionInfo(); + + const jdouble latitude = jniObject.callMethod("getLatitude"); + const jdouble longitude = jniObject.callMethod("getLongitude"); + + QGeoCoordinate coordinate(latitude, longitude); + + // altitude + jboolean attributeExists = jniObject.callMethod("hasAltitude"); + if (attributeExists) { + const jdouble value = jniObject.callMethod("getAltitude"); + if (!qFuzzyIsNull(value)) + coordinate.setAltitude(value); + } + + info.setCoordinate(coordinate); + + // time stamp + const jlong timestamp = jniObject.callMethod("getTime"); + info.setTimestamp(QDateTime::fromMSecsSinceEpoch(timestamp, QTimeZone::UTC)); + + // horizontal accuracy + attributeExists = jniObject.callMethod("hasAccuracy"); + if (attributeExists) { + const jfloat accuracy = jniObject.callMethod("getAccuracy"); + if (!qFuzzyIsNull(accuracy)) + info.setAttribute(QGeoPositionInfo::HorizontalAccuracy, qreal(accuracy)); + } + + // vertical accuracy (available in API Level 26+) + if (QNativeInterface::QAndroidApplication::sdkVersion() > 25) { + attributeExists = jniObject.callMethod("hasVerticalAccuracy"); + if (attributeExists) { + const jfloat accuracy = jniObject.callMethod("getVerticalAccuracyMeters"); + if (!qFuzzyIsNull(accuracy)) + info.setAttribute(QGeoPositionInfo::VerticalAccuracy, qreal(accuracy)); + } + } + + // ground speed + attributeExists = jniObject.callMethod("hasSpeed"); + if (attributeExists) { + const jfloat speed = jniObject.callMethod("getSpeed"); + if (!qFuzzyIsNull(speed)) + info.setAttribute(QGeoPositionInfo::GroundSpeed, qreal(speed)); + } + + // bearing + attributeExists = jniObject.callMethod("hasBearing"); + if (attributeExists) { + const jfloat bearing = jniObject.callMethod("getBearing"); + if (!qFuzzyIsNull(bearing)) + info.setAttribute(QGeoPositionInfo::Direction, qreal(bearing)); + + // bearingAccuracy is available in API Level 26+ + if (QNativeInterface::QAndroidApplication::sdkVersion() > 25) { + const jfloat bearingAccuracy = + jniObject.callMethod("getBearingAccuracyDegrees"); + if (!qFuzzyIsNull(bearingAccuracy)) + info.setAttribute(QGeoPositionInfo::DirectionAccuracy, qreal(bearingAccuracy)); + } + } + + return info; + } + + using UniqueId = std::pair; + static UniqueId getUid(const QGeoSatelliteInfo &info) + { + return std::make_pair(static_cast(info.satelliteSystem()), + info.satelliteIdentifier()); + } + + QList satelliteInfoFromJavaLocation(JNIEnv *jniEnv, + jobjectArray satellites, + QList* usedInFix) + { + QSet uids; + QList sats; + jsize length = jniEnv->GetArrayLength(satellites); + for (int i = 0; iGetObjectArrayElement(satellites, i); + if (QJniEnvironment::checkAndClearExceptions(jniEnv)) { + qCWarning(lcPositioning) << "Cannot process all satellite data due to exception."; + break; + } + + QJniObject jniObj = QJniObject::fromLocalRef(element); + if (!jniObj.isValid()) + continue; + + QGeoSatelliteInfo info; + + // signal strength + const jfloat snr = jniObj.callMethod("getSnr"); + info.setSignalStrength(int(snr)); + + // ignore any satellite with no signal whatsoever + if (qFuzzyIsNull(snr)) + continue; + + // prn + const jint prn = jniObj.callMethod("getPrn"); + info.setSatelliteIdentifier(prn); + + if (prn >= 1 && prn <= 32) + info.setSatelliteSystem(QGeoSatelliteInfo::GPS); + else if (prn >= 65 && prn <= 96) + info.setSatelliteSystem(QGeoSatelliteInfo::GLONASS); + else if (prn >= 193 && prn <= 200) + info.setSatelliteSystem(QGeoSatelliteInfo::QZSS); + else if ((prn >= 201 && prn <= 235) || (prn >= 401 && prn <= 437)) + info.setSatelliteSystem(QGeoSatelliteInfo::BEIDOU); + else if (prn >= 301 && prn <= 336) + info.setSatelliteSystem(QGeoSatelliteInfo::GALILEO); + + // azimuth + const jfloat azimuth = jniObj.callMethod("getAzimuth"); + info.setAttribute(QGeoSatelliteInfo::Azimuth, qreal(azimuth)); + + // elevation + const jfloat elevation = jniObj.callMethod("getElevation"); + info.setAttribute(QGeoSatelliteInfo::Elevation, qreal(elevation)); + + // Used in fix - true if this satellite is actually used in + // determining the position. + const jboolean inFix = jniObj.callMethod("usedInFix"); + + const UniqueId id = getUid(info); + if (uids.contains(id)) + continue; + + sats.append(info); + uids.insert(id); + + if (inFix) + usedInFix->append(info); + } + + return sats; + } + + QList satelliteInfoFromJavaGnssStatus(jobject gnssStatus, + QList* usedInFix) + { + QJniObject jniStatus(gnssStatus); + QList sats; + QSet uids; + + const int satellitesCount = jniStatus.callMethod("getSatelliteCount"); + for (int i = 0; i < satellitesCount; ++i) { + QGeoSatelliteInfo info; + + // signal strength - this is actually a carrier-to-noise density, + // but the values are very close to what was previously returned by + // getSnr() method of the GpsSatellite API. + const jfloat cn0 = jniStatus.callMethod("getCn0DbHz", i); + info.setSignalStrength(static_cast(cn0)); + + // satellite system + const jint constellationType = + jniStatus.callMethod("getConstellationType", i); + info.setSatelliteSystem(ConstellationMapper::toSatelliteSystem(constellationType)); + + // satellite identifier + const jint svId = jniStatus.callMethod("getSvid", i); + info.setSatelliteIdentifier(svId); + + // azimuth + const jfloat azimuth = jniStatus.callMethod("getAzimuthDegrees", i); + info.setAttribute(QGeoSatelliteInfo::Azimuth, static_cast(azimuth)); + + // elevation + const jfloat elevation = jniStatus.callMethod("getElevationDegrees", i); + info.setAttribute(QGeoSatelliteInfo::Elevation, static_cast(elevation)); + + // Used in fix - true if this satellite is actually used in + // determining the position. + const jboolean inFix = jniStatus.callMethod("usedInFix", i); + + const UniqueId id = getUid(info); + if (uids.contains(id)) + continue; + + sats.append(info); + uids.insert(id); + + if (inFix) + usedInFix->append(info); + } + + return sats; + } + + QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly) + { + QJniEnvironment env; + if (!env.jniEnv()) + return QGeoPositionInfo(); + + if (!hasPositioningPermissions()) + return {}; + + QJniObject locationObj = QJniObject::callStaticMethod( + positioningClass(), lastKnownPositionMethodId, fromSatellitePositioningMethodsOnly); + jobject location = locationObj.object(); + if (location == nullptr) + return QGeoPositionInfo(); + + const QGeoPositionInfo info = positionInfoFromJavaLocation(location); + + return info; + } + + inline int positioningMethodToInt(QGeoPositionInfoSource::PositioningMethods m) + { + int providerSelection = 0; + if (m & QGeoPositionInfoSource::SatellitePositioningMethods) + providerSelection |= 1; + if (m & QGeoPositionInfoSource::NonSatellitePositioningMethods) + providerSelection |= 2; + + return providerSelection; + } + + QGeoPositionInfoSource::Error startUpdates(int androidClassKey) + { + QJniEnvironment env; + if (!env.jniEnv()) + return QGeoPositionInfoSource::UnknownSourceError; + + QGeoPositionInfoSourceAndroid *source = AndroidPositioning::idToPosSource()->value(androidClassKey); + + if (source) { + if (!hasPositioningPermissions()) + return QGeoPositionInfoSource::AccessError; + + int errorCode = QJniObject::callStaticMethod( + positioningClass(), startUpdatesMethodId, androidClassKey, + positioningMethodToInt(source->preferredPositioningMethods()), + source->updateInterval()); + switch (errorCode) { + case 0: + case 1: + case 2: + case 3: + return static_cast(errorCode); + default: + break; + } + } + + return QGeoPositionInfoSource::UnknownSourceError; + } + + //used for stopping regular and single updates + void stopUpdates(int androidClassKey) + { + QJniObject::callStaticMethod(positioningClass(), stopUpdatesMethodId, + androidClassKey); + } + + QGeoPositionInfoSource::Error requestUpdate(int androidClassKey, int timeout) + { + QJniEnvironment env; + if (!env.jniEnv()) + return QGeoPositionInfoSource::UnknownSourceError; + + QGeoPositionInfoSourceAndroid *source = AndroidPositioning::idToPosSource()->value(androidClassKey); + + if (source) { + if (!hasPositioningPermissions()) + return QGeoPositionInfoSource::AccessError; + + int errorCode = QJniObject::callStaticMethod( + positioningClass(), requestUpdateMethodId, androidClassKey, + positioningMethodToInt(source->preferredPositioningMethods()), + timeout); + switch (errorCode) { + case 0: + case 1: + case 2: + case 3: + return static_cast(errorCode); + default: + break; + } + } + return QGeoPositionInfoSource::UnknownSourceError; + } + + QGeoSatelliteInfoSource::Error startSatelliteUpdates(int androidClassKey, bool isSingleRequest, int requestTimeout) + { + QJniEnvironment env; + if (!env.jniEnv()) + return QGeoSatelliteInfoSource::UnknownSourceError; + + QGeoSatelliteInfoSourceAndroid *source = AndroidPositioning::idToSatSource()->value(androidClassKey); + + if (source) { + if (!hasPositioningPermissions()) + return QGeoSatelliteInfoSource::AccessError; + + int interval = source->updateInterval(); + if (isSingleRequest) + interval = requestTimeout; + int errorCode = QJniObject::callStaticMethod(positioningClass(), + startSatelliteUpdatesMethodId, + androidClassKey, interval, + isSingleRequest); + switch (errorCode) { + case -1: + case 0: + case 1: + case 2: + return static_cast(errorCode); + default: + qCWarning(lcPositioning) + << "startSatelliteUpdates: Unknown error code" << errorCode; + break; + } + } + return QGeoSatelliteInfoSource::UnknownSourceError; + } + + + bool hasPositioningPermissions() + { + QLocationPermission permission; + permission.setAccuracy(QLocationPermission::Precise); // fine location (+ coarse on >= 31) + + // The needed permission depends on whether we run as a service or as an activity + if (!QNativeInterface::QAndroidApplication::isActivityContext()) + permission.setAvailability(QLocationPermission::Always); // background location + + const bool permitted = qApp->checkPermission(permission) == Qt::PermissionStatus::Granted; + + if (!permitted) + qCWarning(lcPositioning) << "Position data not available due to missing permission"; + + return permitted; + } +} + +static void positionUpdated(JNIEnv *env, jobject thiz, QtJniTypes::Location location, + jint androidClassKey, jboolean isSingleUpdate) +{ + Q_UNUSED(env); + Q_UNUSED(thiz); + QGeoPositionInfo info = AndroidPositioning::positionInfoFromJavaLocation(location.object()); + + QGeoPositionInfoSourceAndroid *source = AndroidPositioning::idToPosSource()->value(androidClassKey); + if (!source) { + qCWarning(lcPositioning) << "positionUpdated: source == 0"; + return; + } + + //we need to invoke indirectly as the Looper thread is likely to be not the same thread + if (!isSingleUpdate) + QMetaObject::invokeMethod(source, "processPositionUpdate", Qt::AutoConnection, + Q_ARG(QGeoPositionInfo, info)); + else + QMetaObject::invokeMethod(source, "processSinglePositionUpdate", Qt::AutoConnection, + Q_ARG(QGeoPositionInfo, info)); +} +Q_DECLARE_JNI_NATIVE_METHOD(positionUpdated) + +static void locationProvidersDisabled(JNIEnv *env, jobject thiz, jint androidClassKey) +{ + Q_UNUSED(env); + Q_UNUSED(thiz); + QObject *source = AndroidPositioning::idToPosSource()->value(androidClassKey); + if (!source) + source = AndroidPositioning::idToSatSource()->value(androidClassKey); + if (!source) { + qCWarning(lcPositioning) << "locationProvidersDisabled: source == 0"; + return; + } + + QMetaObject::invokeMethod(source, "locationProviderDisabled", Qt::AutoConnection); +} +Q_DECLARE_JNI_NATIVE_METHOD(locationProvidersDisabled) + +static void locationProvidersChanged(JNIEnv *env, jobject thiz, jint androidClassKey) +{ + Q_UNUSED(env); + Q_UNUSED(thiz); + QObject *source = AndroidPositioning::idToPosSource()->value(androidClassKey); + if (!source) { + qCWarning(lcPositioning) << "locationProvidersChanged: source == 0"; + return; + } + + QMetaObject::invokeMethod(source, "locationProvidersChanged", Qt::AutoConnection); +} +Q_DECLARE_JNI_NATIVE_METHOD(locationProvidersChanged) + +static void notifySatelliteInfoUpdated(const QList &inView, + const QList &inUse, + jint androidClassKey, jboolean isSingleUpdate) +{ + QGeoSatelliteInfoSourceAndroid *source = AndroidPositioning::idToSatSource()->value(androidClassKey); + if (!source) { + qCWarning(lcPositioning) << "notifySatelliteInfoUpdated: source == 0"; + return; + } + + QMetaObject::invokeMethod(source, "processSatelliteUpdate", Qt::AutoConnection, + Q_ARG(QList, inView), + Q_ARG(QList, inUse), + Q_ARG(bool, isSingleUpdate)); +} + +static void satelliteGpsUpdated(JNIEnv *env, jobject thiz, + jobjectArray satellites, + jint androidClassKey, jboolean isSingleUpdate) +{ + Q_UNUSED(thiz); + QList inUse; + QList sats = + AndroidPositioning::satelliteInfoFromJavaLocation(env, satellites, &inUse); + + notifySatelliteInfoUpdated(sats, inUse, androidClassKey, isSingleUpdate); +} +Q_DECLARE_JNI_NATIVE_METHOD(satelliteGpsUpdated) + +static void satelliteGnssUpdated(JNIEnv *env, jobject thiz, QtJniTypes::GnssStatus gnssStatus, + jint androidClassKey, jboolean isSingleUpdate) +{ + Q_UNUSED(env); + Q_UNUSED(thiz); + + QList inUse; + QList sats = + AndroidPositioning::satelliteInfoFromJavaGnssStatus(gnssStatus.object(), &inUse); + + notifySatelliteInfoUpdated(sats, inUse, androidClassKey, isSingleUpdate); +} +Q_DECLARE_JNI_NATIVE_METHOD(satelliteGnssUpdated) + +#define GET_AND_CHECK_STATIC_METHOD(VAR, METHOD_NAME, ...) \ + VAR = env.findStaticMethod<__VA_ARGS__>(positioningClass(), METHOD_NAME); \ + if (!VAR) { \ + __android_log_print(ANDROID_LOG_FATAL, logTag, methodErrorMsg, METHOD_NAME, \ + QtJniTypes::methodSignature<__VA_ARGS__>().data()); \ + return false; \ + } + +static bool registerNatives() +{ + QJniEnvironment env; + if (!env.jniEnv()) { + __android_log_print(ANDROID_LOG_FATAL, logTag, "Failed to create environment"); + return false; + } + + if (!positioningClass.init()) { + __android_log_print(ANDROID_LOG_FATAL, logTag, "Failed to create global class ref"); + return false; + } + + if (!env.registerNativeMethods(positioningClass(), { + Q_JNI_NATIVE_METHOD(positionUpdated), + Q_JNI_NATIVE_METHOD(locationProvidersDisabled), + Q_JNI_NATIVE_METHOD(satelliteGpsUpdated), + Q_JNI_NATIVE_METHOD(locationProvidersChanged), + Q_JNI_NATIVE_METHOD(satelliteGnssUpdated) + })) { + __android_log_print(ANDROID_LOG_FATAL, logTag, "Failed to register native methods"); + return false; + } + + GET_AND_CHECK_STATIC_METHOD(providerListMethodId, "providerList", jintArray); + GET_AND_CHECK_STATIC_METHOD(lastKnownPositionMethodId, "lastKnownPosition", + QtJniTypes::Location, bool); + GET_AND_CHECK_STATIC_METHOD(startUpdatesMethodId, "startUpdates", jint, jint, jint, jint); + GET_AND_CHECK_STATIC_METHOD(stopUpdatesMethodId, "stopUpdates", void, jint); + GET_AND_CHECK_STATIC_METHOD(requestUpdateMethodId, "requestUpdate", jint, jint, jint, jint); + GET_AND_CHECK_STATIC_METHOD(startSatelliteUpdatesMethodId, "startSatelliteUpdates", + jint, jint, jint, bool); + + return true; +} + +Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM * /*vm*/, void * /*reserved*/) +{ + static bool initialized = false; + if (initialized) + return JNI_VERSION_1_6; + initialized = true; + + __android_log_print(ANDROID_LOG_INFO, logTag, "Positioning start"); + + if (!registerNatives()) { + __android_log_print(ANDROID_LOG_FATAL, logTag, "registerNatives() failed"); + return -1; + } + + if (!ConstellationMapper::init()) { + __android_log_print(ANDROID_LOG_ERROR, logTag, + "Failed to extract constellation type constants. " + "Satellite system will be undefined!"); + } + + return JNI_VERSION_1_6; +} + diff --git a/src/plugins/position/android/src/jnipositioning.h b/src/plugins/position/android/src/jnipositioning.h new file mode 100644 index 0000000..221bc80 --- /dev/null +++ b/src/plugins/position/android/src/jnipositioning.h @@ -0,0 +1,28 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef JNIPOSITIONING_H +#define JNIPOSITIONING_H + +#include +#include + +namespace AndroidPositioning +{ + int registerPositionInfoSource(QObject *obj); + void unregisterPositionInfoSource(int key); + + QGeoPositionInfoSource::PositioningMethods availableProviders(); + QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly); + + QGeoPositionInfoSource::Error startUpdates(int androidClassKey); + void stopUpdates(int androidClassKey); + QGeoPositionInfoSource::Error requestUpdate(int androidClassKey, int timeout); + + QGeoSatelliteInfoSource::Error startSatelliteUpdates(int androidClassKey, + bool isSingleRequest, + int updateRequestTimeout); + bool hasPositioningPermissions(); +} + +#endif // JNIPOSITIONING_H diff --git a/src/plugins/position/android/src/plugin.json b/src/plugins/position/android/src/plugin.json new file mode 100644 index 0000000..4fd8789 --- /dev/null +++ b/src/plugins/position/android/src/plugin.json @@ -0,0 +1,9 @@ +{ + "Keys": ["android"], + "Provider": "android", + "Position": true, + "Satellite": true, + "Monitor": false, + "Priority": 1000, + "Testable": false +} diff --git a/src/plugins/position/android/src/positionfactory_android.cpp b/src/plugins/position/android/src/positionfactory_android.cpp new file mode 100644 index 0000000..9ca571f --- /dev/null +++ b/src/plugins/position/android/src/positionfactory_android.cpp @@ -0,0 +1,27 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "positionfactory_android.h" +#include "qgeopositioninfosource_android_p.h" +#include "qgeosatelliteinfosource_android_p.h" + +QGeoPositionInfoSource *QGeoPositionInfoSourceFactoryAndroid::positionInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parameters) + QGeoPositionInfoSourceAndroid *src = new QGeoPositionInfoSourceAndroid(parent); + return src; +} + +QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactoryAndroid::satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parameters) + QGeoSatelliteInfoSourceAndroid *src = new QGeoSatelliteInfoSourceAndroid(parent); + return src; +} + +QGeoAreaMonitorSource *QGeoPositionInfoSourceFactoryAndroid::areaMonitor(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent) + Q_UNUSED(parameters) + return nullptr; +} diff --git a/src/plugins/position/android/src/positionfactory_android.h b/src/plugins/position/android/src/positionfactory_android.h new file mode 100644 index 0000000..001ee5b --- /dev/null +++ b/src/plugins/position/android/src/positionfactory_android.h @@ -0,0 +1,22 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef POSITIONPOLLFACTORY_H +#define POSITIONPOLLFACTORY_H + +#include +#include + +class QGeoPositionInfoSourceFactoryAndroid : public QObject, public QGeoPositionInfoSourceFactory +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0" + FILE "plugin.json") + Q_INTERFACES(QGeoPositionInfoSourceFactory) +public: + QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override; +}; + +#endif // POSITIONPOLLFACTORY_H diff --git a/src/plugins/position/android/src/qgeopositioninfosource_android.cpp b/src/plugins/position/android/src/qgeopositioninfosource_android.cpp new file mode 100644 index 0000000..d2a1168 --- /dev/null +++ b/src/plugins/position/android/src/qgeopositioninfosource_android.cpp @@ -0,0 +1,267 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeopositioninfosource_android_p.h" +#include "jnipositioning.h" +#include + +static constexpr int kUpdateFromColdStart = 2 * 60 * 1000; +static constexpr int kRegularUpdatesTimerInterval = 30 * 1000; + +QGeoPositionInfoSourceAndroid::QGeoPositionInfoSourceAndroid(QObject *parent) : + QGeoPositionInfoSource(parent) +{ + androidClassKeyForUpdate = AndroidPositioning::registerPositionInfoSource(this); + androidClassKeyForSingleRequest = AndroidPositioning::registerPositionInfoSource(this); + + //by default use all methods + setPreferredPositioningMethods(AllPositioningMethods); + + m_requestTimer.setSingleShot(true); + connect(&m_requestTimer, &QTimer::timeout, this, + &QGeoPositionInfoSourceAndroid::requestTimeout); + + m_regularUpdatesTimer.setSingleShot(false); + connect(&m_regularUpdatesTimer, &QTimer::timeout, this, + &QGeoPositionInfoSourceAndroid::regularUpdatesTimeout); +} + +QGeoPositionInfoSourceAndroid::~QGeoPositionInfoSourceAndroid() +{ + stopUpdates(); + + if (m_requestTimer.isActive()) { + m_requestTimer.stop(); + AndroidPositioning::stopUpdates(androidClassKeyForSingleRequest); + } + + AndroidPositioning::unregisterPositionInfoSource(androidClassKeyForUpdate); + AndroidPositioning::unregisterPositionInfoSource(androidClassKeyForSingleRequest); +} + +void QGeoPositionInfoSourceAndroid::setUpdateInterval(int msec) +{ + int previousInterval = updateInterval(); + msec = (((msec > 0) && (msec < minimumUpdateInterval())) || msec < 0)? minimumUpdateInterval() : msec; + + if (msec == previousInterval) + return; + + QGeoPositionInfoSource::setUpdateInterval(msec); + + if (updatesRunning) + reconfigureRunningSystem(); +} + +QGeoPositionInfo QGeoPositionInfoSourceAndroid::lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const +{ + return AndroidPositioning::lastKnownPosition(fromSatellitePositioningMethodsOnly); +} + +QGeoPositionInfoSource::PositioningMethods QGeoPositionInfoSourceAndroid::supportedPositioningMethods() const +{ + return AndroidPositioning::availableProviders(); +} + +void QGeoPositionInfoSourceAndroid::setPreferredPositioningMethods(QGeoPositionInfoSource::PositioningMethods methods) +{ + PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods(); + QGeoPositionInfoSource::setPreferredPositioningMethods(methods); + if (previousPreferredPositioningMethods == preferredPositioningMethods()) + return; + + if (updatesRunning) + reconfigureRunningSystem(); +} + +int QGeoPositionInfoSourceAndroid::minimumUpdateInterval() const +{ + return 50; +} + +QGeoPositionInfoSource::Error QGeoPositionInfoSourceAndroid::error() const +{ + return m_error; +} + +void QGeoPositionInfoSourceAndroid::setError(Error error) +{ + m_error = error; + if (error != QGeoPositionInfoSource::NoError) + emit QGeoPositionInfoSource::errorOccurred(m_error); +} + +void QGeoPositionInfoSourceAndroid::startUpdates() +{ + if (updatesRunning) + return; + + m_error = QGeoPositionInfoSource::NoError; + + if (preferredPositioningMethods() == 0) { + setError(UnknownSourceError); + return; + } + + updatesRunning = true; + // Start calculating updates from now. + m_lastUpdateTime = QDateTime::currentMSecsSinceEpoch(); + m_regularUpdatesErrorRaised = false; + QGeoPositionInfoSource::Error error = AndroidPositioning::startUpdates(androidClassKeyForUpdate); + if (error != QGeoPositionInfoSource::NoError) { + updatesRunning = false; + setError(error); + } else { + m_regularUpdatesTimer.start(kRegularUpdatesTimerInterval); + } +} + +void QGeoPositionInfoSourceAndroid::stopUpdates() +{ + if (!updatesRunning) + return; + + updatesRunning = false; + m_regularUpdatesTimer.stop(); + AndroidPositioning::stopUpdates(androidClassKeyForUpdate); +} + +void QGeoPositionInfoSourceAndroid::requestUpdate(int timeout) +{ + if (m_requestTimer.isActive()) + return; + + m_error = QGeoPositionInfoSource::NoError; + + if (timeout != 0 && timeout < minimumUpdateInterval()) { + setError(QGeoPositionInfoSource::UpdateTimeoutError); + return; + } + + if (timeout == 0) + timeout = kUpdateFromColdStart; + + m_requestTimer.start(timeout); + + // if updates already running with interval equal to timeout + // then we wait for next update coming through + // assume that a single update will not be quicker than regular updates anyway + if (updatesRunning && updateInterval() <= timeout) + return; + + const QGeoPositionInfoSource::Error error = + AndroidPositioning::requestUpdate(androidClassKeyForSingleRequest, timeout); + if (error != QGeoPositionInfoSource::NoError) { + m_requestTimer.stop(); + setError(error); + } +} + +void QGeoPositionInfoSourceAndroid::processPositionUpdate(const QGeoPositionInfo &pInfo) +{ + //single update request and served as part of regular update + if (m_requestTimer.isActive()) + m_requestTimer.stop(); + + m_lastUpdateTime = QDateTime::currentMSecsSinceEpoch(); + m_regularUpdatesErrorRaised = false; + + emit positionUpdated(pInfo); +} + +// Might still be called multiple times (once for each provider) +void QGeoPositionInfoSourceAndroid::processSinglePositionUpdate(const QGeoPositionInfo &pInfo) +{ + //timeout but we received a late update -> ignore + if (!m_requestTimer.isActive()) + return; + + queuedSingleUpdates.append(pInfo); + // Calculate the maximum amount of possibly received updates. It depends on + // preferred positioning methods. Two updates if we have both Satellite and + // Network, and only one otherwise. + const qsizetype maxPossibleUpdates = + (preferredPositioningMethods() == QGeoPositionInfoSource::AllPositioningMethods) + ? 2 : 1; + // If we get the maximum number of updates, we do not need to wait for more + if (queuedSingleUpdates.size() == maxPossibleUpdates) { + m_requestTimer.stop(); + requestTimeout(); + } +} + +void QGeoPositionInfoSourceAndroid::locationProviderDisabled() +{ + if (updatesRunning && !m_regularUpdatesErrorRaised) { + m_regularUpdatesErrorRaised = true; + setError(QGeoPositionInfoSource::UpdateTimeoutError); + } + + setError(QGeoPositionInfoSource::ClosedError); +} + +void QGeoPositionInfoSourceAndroid::locationProvidersChanged() +{ + emit supportedPositioningMethodsChanged(); +} + +void QGeoPositionInfoSourceAndroid::requestTimeout() +{ + AndroidPositioning::stopUpdates(androidClassKeyForSingleRequest); + //no queued update to process -> timeout + + if (queuedSingleUpdates.isEmpty()) { + setError(QGeoPositionInfoSource::UpdateTimeoutError); + return; + } + + auto byAccuracy = [](const QGeoPositionInfo &info, const QGeoPositionInfo &best) { + //anything newer by 20s is always better + const qint64 timeDelta = best.timestamp().secsTo(info.timestamp()); + if (abs(timeDelta) > 20) + return timeDelta > 0; + + //compare accuracy + if (info.hasAttribute(QGeoPositionInfo::HorizontalAccuracy) && + best.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) + { + return info.attribute(QGeoPositionInfo::HorizontalAccuracy) < + best.attribute(QGeoPositionInfo::HorizontalAccuracy); + } + + //prefer info with accuracy information + if (info.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) + return true; + + return false; + }; + + QGeoPositionInfo best = *std::min_element(queuedSingleUpdates.begin(), + queuedSingleUpdates.end(), byAccuracy); + queuedSingleUpdates.clear(); + emit positionUpdated(best); +} + +void QGeoPositionInfoSourceAndroid::regularUpdatesTimeout() +{ + if (!m_regularUpdatesErrorRaised) { + const auto now = QDateTime::currentMSecsSinceEpoch(); + if ((now - m_lastUpdateTime) > (updateInterval() + kUpdateFromColdStart)) { + m_regularUpdatesErrorRaised = true; + setError(QGeoPositionInfoSource::UpdateTimeoutError); + } + } +} + +/* + Updates the system assuming that updateInterval + and/or preferredPositioningMethod have changed. + */ +void QGeoPositionInfoSourceAndroid::reconfigureRunningSystem() +{ + if (!updatesRunning) + return; + + stopUpdates(); + startUpdates(); +} diff --git a/src/plugins/position/android/src/qgeopositioninfosource_android_p.h b/src/plugins/position/android/src/qgeopositioninfosource_android_p.h new file mode 100644 index 0000000..76a5121 --- /dev/null +++ b/src/plugins/position/android/src/qgeopositioninfosource_android_p.h @@ -0,0 +1,66 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOSITIONINFOSOURCE_ANDROID_P_H +#define QGEOPOSITIONINFOSOURCE_ANDROID_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include + +class QGeoPositionInfoSourceAndroid : public QGeoPositionInfoSource +{ + Q_OBJECT +public: + QGeoPositionInfoSourceAndroid(QObject *parent = 0); + ~QGeoPositionInfoSourceAndroid(); + + // From QGeoPositionInfoSource + void setUpdateInterval(int msec) override; + QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const override; + PositioningMethods supportedPositioningMethods() const override; + void setPreferredPositioningMethods(PositioningMethods methods) override; + int minimumUpdateInterval() const override; + Error error() const override; + +public Q_SLOTS: + virtual void startUpdates() override; + virtual void stopUpdates() override; + + virtual void requestUpdate(int timeout = 0) override; + + void processPositionUpdate(const QGeoPositionInfo& pInfo); + void processSinglePositionUpdate(const QGeoPositionInfo& pInfo); + + void locationProviderDisabled(); + void locationProvidersChanged(); +private Q_SLOTS: + void requestTimeout(); + void regularUpdatesTimeout(); + +private: + void reconfigureRunningSystem(); + void setError(Error error); + + bool updatesRunning = false; + int androidClassKeyForUpdate; + int androidClassKeyForSingleRequest; + QList queuedSingleUpdates; + Error m_error = NoError; + QTimer m_requestTimer; + QTimer m_regularUpdatesTimer; + qint64 m_lastUpdateTime = 0; + bool m_regularUpdatesErrorRaised = false; +}; + +#endif // QGEOPOSITIONINFOSOURCE_ANDROID_P_H diff --git a/src/plugins/position/android/src/qgeosatelliteinfosource_android.cpp b/src/plugins/position/android/src/qgeosatelliteinfosource_android.cpp new file mode 100644 index 0000000..e7bd2d5 --- /dev/null +++ b/src/plugins/position/android/src/qgeosatelliteinfosource_android.cpp @@ -0,0 +1,183 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include + +#include "qgeosatelliteinfosource_android_p.h" +#include "jnipositioning.h" + +Q_DECLARE_METATYPE(QList) + +#define UPDATE_FROM_COLD_START 2*60*1000 + +QGeoSatelliteInfoSourceAndroid::QGeoSatelliteInfoSourceAndroid(QObject *parent) : + QGeoSatelliteInfoSource(parent), m_error(NoError), updatesRunning(false) +{ + qRegisterMetaType< QGeoSatelliteInfo >(); + qRegisterMetaType< QList >(); + androidClassKeyForUpdate = AndroidPositioning::registerPositionInfoSource(this); + androidClassKeyForSingleRequest = AndroidPositioning::registerPositionInfoSource(this); + + requestTimer.setSingleShot(true); + QObject::connect(&requestTimer, SIGNAL(timeout()), + this, SLOT(requestTimeout())); +} + +QGeoSatelliteInfoSourceAndroid::~QGeoSatelliteInfoSourceAndroid() +{ + stopUpdates(); + + if (requestTimer.isActive()) { + requestTimer.stop(); + AndroidPositioning::stopUpdates(androidClassKeyForSingleRequest); + } + + AndroidPositioning::unregisterPositionInfoSource(androidClassKeyForUpdate); + AndroidPositioning::unregisterPositionInfoSource(androidClassKeyForSingleRequest); +} + + +void QGeoSatelliteInfoSourceAndroid::setUpdateInterval(int msec) +{ + int previousInterval = updateInterval(); + msec = (((msec > 0) && (msec < minimumUpdateInterval())) || msec < 0)? minimumUpdateInterval() : msec; + + if (msec == previousInterval) + return; + + QGeoSatelliteInfoSource::setUpdateInterval(msec); + + if (updatesRunning) + reconfigureRunningSystem(); +} + +int QGeoSatelliteInfoSourceAndroid::minimumUpdateInterval() const +{ + return 50; +} + +QGeoSatelliteInfoSource::Error QGeoSatelliteInfoSourceAndroid::error() const +{ + return m_error; +} + +void QGeoSatelliteInfoSourceAndroid::startUpdates() +{ + if (updatesRunning) + return; + + updatesRunning = true; + + m_error = QGeoSatelliteInfoSource::NoError; + + QGeoSatelliteInfoSource::Error error = AndroidPositioning::startSatelliteUpdates( + androidClassKeyForUpdate, false, updateInterval()); + if (error != QGeoSatelliteInfoSource::NoError) { + updatesRunning = false; + setError(error); + } +} + +void QGeoSatelliteInfoSourceAndroid::stopUpdates() +{ + if (!updatesRunning) + return; + + updatesRunning = false; + AndroidPositioning::stopUpdates(androidClassKeyForUpdate); +} + +void QGeoSatelliteInfoSourceAndroid::requestUpdate(int timeout) +{ + if (requestTimer.isActive()) + return; + + m_error = QGeoSatelliteInfoSource::NoError; + + if (timeout != 0 && timeout < minimumUpdateInterval()) { + setError(QGeoSatelliteInfoSource::UpdateTimeoutError); + return; + } + + if (timeout == 0) + timeout = UPDATE_FROM_COLD_START; + + requestTimer.start(timeout); + + // if updates already running with interval equal or less then timeout + // then we wait for next update coming through + // assume that a single update will not be quicker than regular updates anyway + if (updatesRunning && updateInterval() <= timeout) + return; + + QGeoSatelliteInfoSource::Error error = AndroidPositioning::startSatelliteUpdates( + androidClassKeyForSingleRequest, true, timeout); + if (error != QGeoSatelliteInfoSource::NoError) { + requestTimer.stop(); + setError(error); + } +} + +void +QGeoSatelliteInfoSourceAndroid::processSatelliteUpdate(const QList &satsInView, + const QList &satsInUse, + bool isSingleUpdate) +{ + if (!isSingleUpdate) { + //if single update is requested while regular updates are running + if (requestTimer.isActive()) + requestTimer.stop(); + emit QGeoSatelliteInfoSource::satellitesInViewUpdated(satsInView); + emit QGeoSatelliteInfoSource::satellitesInUseUpdated(satsInUse); + return; + } + + m_satsInView = satsInView; + m_satsInUse = satsInUse; + + if (!m_satsInView.isEmpty() || !m_satsInUse.isEmpty()) { + requestTimer.stop(); + requestTimeout(); + } +} + +void QGeoSatelliteInfoSourceAndroid::requestTimeout() +{ + AndroidPositioning::stopUpdates(androidClassKeyForSingleRequest); + + if (m_satsInView.isEmpty() && m_satsInUse.isEmpty()) { + setError(QGeoSatelliteInfoSource::UpdateTimeoutError); + return; + } + + emit QGeoSatelliteInfoSource::satellitesInViewUpdated(m_satsInView); + emit QGeoSatelliteInfoSource::satellitesInUseUpdated(m_satsInUse); + + m_satsInUse.clear(); + m_satsInView.clear(); +} + +/* + Updates the system assuming that updateInterval + and/or preferredPositioningMethod have changed. + */ +void QGeoSatelliteInfoSourceAndroid::reconfigureRunningSystem() +{ + if (!updatesRunning) + return; + + stopUpdates(); + startUpdates(); +} + +void QGeoSatelliteInfoSourceAndroid::setError(QGeoSatelliteInfoSource::Error error) +{ + m_error = error; + if (m_error != QGeoSatelliteInfoSource::NoError) + emit QGeoSatelliteInfoSource::errorOccurred(m_error); +} + +void QGeoSatelliteInfoSourceAndroid::locationProviderDisabled() +{ + setError(QGeoSatelliteInfoSource::ClosedError); +} diff --git a/src/plugins/position/android/src/qgeosatelliteinfosource_android_p.h b/src/plugins/position/android/src/qgeosatelliteinfosource_android_p.h new file mode 100644 index 0000000..7071a67 --- /dev/null +++ b/src/plugins/position/android/src/qgeosatelliteinfosource_android_p.h @@ -0,0 +1,63 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + + +#ifndef QGEOSATELLITEINFOSOURCEANDROID_H +#define QGEOSATELLITEINFOSOURCEANDROID_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include + +class QGeoSatelliteInfoSourceAndroid : public QGeoSatelliteInfoSource +{ + Q_OBJECT +public: + explicit QGeoSatelliteInfoSourceAndroid(QObject *parent = 0); + ~QGeoSatelliteInfoSourceAndroid(); + + //From QGeoSatelliteInfoSource + void setUpdateInterval(int msec) override; + int minimumUpdateInterval() const override; + + Error error() const override; + +public Q_SLOTS: + void startUpdates() override; + void stopUpdates() override; + void requestUpdate(int timeout = 0) override; + + void processSatelliteUpdate(const QList &satsInView, + const QList &satsInUse, + bool isSingleUpdate); + + void locationProviderDisabled(); +private Q_SLOTS: + void requestTimeout(); + +private: + void reconfigureRunningSystem(); + void setError(QGeoSatelliteInfoSource::Error error); + + Error m_error; + int androidClassKeyForUpdate; + int androidClassKeyForSingleRequest; + bool updatesRunning; + + QTimer requestTimer; + QList m_satsInUse; + QList m_satsInView; + +}; + +#endif // QGEOSATELLITEINFOSOURCEANDROID_H diff --git a/src/plugins/position/corelocation/CMakeLists.txt b/src/plugins/position/corelocation/CMakeLists.txt new file mode 100644 index 0000000..bdd0cb6 --- /dev/null +++ b/src/plugins/position/corelocation/CMakeLists.txt @@ -0,0 +1,39 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from corelocation.pro. + +##################################################################### +## QGeoPositionInfoSourceFactoryCL Plugin: +##################################################################### + +qt_internal_add_plugin(QGeoPositionInfoSourceFactoryCLPlugin + OUTPUT_NAME qtposition_cl + CLASS_NAME QGeoPositionInfoSourceFactoryCL + PLUGIN_TYPE position + SOURCES + qgeopositioninfosource_cl.mm qgeopositioninfosource_cl_p.h + qgeopositioninfosourcefactory_cl.h qgeopositioninfosourcefactory_cl.mm + LIBRARIES + ${FWCoreLocation} + ${FWFoundation} + Qt::Core + Qt::CorePrivate + Qt::Positioning +) + +# special case begin +set_target_properties(QGeoPositionInfoSourceFactoryCLPlugin + PROPERTIES + DISABLE_PRECOMPILE_HEADERS ON +) +# special case end + +#### Keys ignored in scope 1:.:.:corelocation.pro:: +# OTHER_FILES = "plugin.json" + +## Scopes: +##################################################################### + +#### Keys ignored in scope 2:.:.:corelocation.pro:NOT APPLE: +# DISTFILES = "$$OBJECTIVE_SOURCES" diff --git a/src/plugins/position/corelocation/plugin.json b/src/plugins/position/corelocation/plugin.json new file mode 100644 index 0000000..58e3acd --- /dev/null +++ b/src/plugins/position/corelocation/plugin.json @@ -0,0 +1,9 @@ +{ + "Keys": ["corelocation"], + "Provider": "corelocation", + "Position": true, + "Satellite": false, + "Monitor" : false, + "Priority": 1000, + "Testable": false +} diff --git a/src/plugins/position/corelocation/qgeopositioninfosource_cl.mm b/src/plugins/position/corelocation/qgeopositioninfosource_cl.mm new file mode 100644 index 0000000..95d51a8 --- /dev/null +++ b/src/plugins/position/corelocation/qgeopositioninfosource_cl.mm @@ -0,0 +1,271 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeopositioninfosource_cl_p.h" +#include +#include +#include +#include +#include +#include +#include +#include + + +#define MINIMUM_UPDATE_INTERVAL 1000 + +@interface PositionLocationDelegate : NSObject +@end + +@implementation PositionLocationDelegate +{ + QGeoPositionInfoSourceCL *m_positionInfoSource; +} + +- (instancetype)initWithInfoSource:(QGeoPositionInfoSourceCL*) positionInfoSource +{ + if ((self = [self init])) { + m_positionInfoSource = positionInfoSource; + } + return self; +} + +- (void)locationManagerDidChangeAuthorization: (CLLocationManager *)manager +{ + // Since Qt 6.6 the application requests the desired permissions. + // This delegate method is invoked always upon CLLocationManager + // instantiation, and later if authorization status changes. + m_positionInfoSource->changeAuthorizationStatus([manager authorizationStatus]); +} + +- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation +{ + Q_UNUSED(manager); + Q_UNUSED(oldLocation); + + // Convert location timestamp to QDateTime + NSTimeInterval locationTimeStamp = [newLocation.timestamp timeIntervalSince1970]; + const QDateTime timeStamp = QDateTime::fromMSecsSinceEpoch(qRound64(locationTimeStamp * 1000), + QTimeZone::UTC); + + // Construct position info from location data + QGeoPositionInfo location(QGeoCoordinate(newLocation.coordinate.latitude, + newLocation.coordinate.longitude, + newLocation.altitude), + timeStamp); + if (newLocation.horizontalAccuracy >= 0) + location.setAttribute(QGeoPositionInfo::HorizontalAccuracy, newLocation.horizontalAccuracy); + if (newLocation.verticalAccuracy >= 0) + location.setAttribute(QGeoPositionInfo::VerticalAccuracy, newLocation.verticalAccuracy); + if (newLocation.course >= 0) { + location.setAttribute(QGeoPositionInfo::Direction, newLocation.course); + if (__builtin_available(iOS 13.4, macOS 10.15.4, *)) { + if (newLocation.courseAccuracy >= 0) { + location.setAttribute(QGeoPositionInfo::DirectionAccuracy, + newLocation.courseAccuracy); + } + } + } + if (newLocation.speed >= 0) + location.setAttribute(QGeoPositionInfo::GroundSpeed, newLocation.speed); + + m_positionInfoSource->locationDataAvailable(location); +} + +- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error +{ + Q_UNUSED(manager); + m_positionInfoSource->setError(QGeoPositionInfoSource::AccessError); + + qWarning() << QString::fromNSString([error localizedDescription]); + + if ([error code] == 0 + && QString::fromNSString([error domain]) == QStringLiteral("kCLErrorDomain")) + qWarning() << "(is Wi-Fi turned on?)"; +} +@end + +QT_BEGIN_NAMESPACE + +QGeoPositionInfoSourceCL::QGeoPositionInfoSourceCL(QObject *parent) + : QGeoPositionInfoSource(parent), + m_locationManager(0), + m_updatesWanted(false), + m_updateTimer(0), + m_updateTimeout(0), + m_positionError(QGeoPositionInfoSource::NoError) +{ +} + +QGeoPositionInfoSourceCL::~QGeoPositionInfoSourceCL() +{ + stopUpdates(); + [m_locationManager release]; +} + +void QGeoPositionInfoSourceCL::setUpdateInterval(int msec) +{ + // If msec is 0 we send updates as data becomes available, otherwise we force msec to be equal + // to or larger than the minimum update interval. + if (msec != 0 && msec < minimumUpdateInterval()) + msec = minimumUpdateInterval(); + + QGeoPositionInfoSource::setUpdateInterval(msec); + + // Must timeout if update takes longer than specified interval + m_updateTimeout = msec; + if (m_updatesWanted) + setTimeoutInterval(m_updateTimeout); +} + +bool QGeoPositionInfoSourceCL::enableLocationManager() +{ + if (!m_locationManager) { + m_locationManager = [[CLLocationManager alloc] init]; + +#if defined(Q_OS_IOS) + NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary]; + if (id value = [infoDict objectForKey:@"UIBackgroundModes"]) { + if ([value isKindOfClass:[NSArray class]]) { + NSArray *modes = static_cast(value); + for (id mode in modes) { + if ([@"location" isEqualToString:mode]) { + m_locationManager.allowsBackgroundLocationUpdates = YES; + break; + } + } + } + } +#endif + + m_locationManager.desiredAccuracy = kCLLocationAccuracyBest; + m_locationManager.delegate = [[PositionLocationDelegate alloc] initWithInfoSource:this]; + } + + return qApp->checkPermission(QLocationPermission{}) == Qt::PermissionStatus::Granted; +} + +void QGeoPositionInfoSourceCL::setTimeoutInterval(int msec) +{ + // Start timeout timer + if (m_updateTimer) killTimer(m_updateTimer); + if (msec > 0) m_updateTimer = startTimer(msec); + else m_updateTimer = 0; +} + +void QGeoPositionInfoSourceCL::startUpdates() +{ + m_positionError = QGeoPositionInfoSource::NoError; + m_updatesWanted = true; + if (enableLocationManager()) { + [m_locationManager startUpdatingLocation]; + setTimeoutInterval(m_updateTimeout); + } else { + setError(QGeoPositionInfoSource::AccessError); + } +} + +void QGeoPositionInfoSourceCL::stopUpdates() +{ + if (m_locationManager) { + [m_locationManager stopUpdatingLocation]; + m_updatesWanted = false; + + // Stop timeout timer + setTimeoutInterval(0); + } else { + setError(QGeoPositionInfoSource::AccessError); + } +} + +void QGeoPositionInfoSourceCL::requestUpdate(int timeout) +{ + // Get a single update within timeframe + m_positionError = QGeoPositionInfoSource::NoError; + if (timeout < minimumUpdateInterval() && timeout != 0) + setError(QGeoPositionInfoSource::UpdateTimeoutError); + else if (enableLocationManager()) { + // This will force LM to generate a new update + [m_locationManager stopUpdatingLocation]; + [m_locationManager startUpdatingLocation]; + setTimeoutInterval(timeout); + } else { + setError(QGeoPositionInfoSource::AccessError); + } +} + +void QGeoPositionInfoSourceCL::changeAuthorizationStatus(CLAuthorizationStatus status) +{ +#ifndef Q_OS_MACOS + if (status == kCLAuthorizationStatusAuthorizedAlways + || status == kCLAuthorizationStatusAuthorizedWhenInUse +#else + if (status == kCLAuthorizationStatusAuthorized +#endif + ) { + if (m_updatesWanted) + startUpdates(); + } +} + +void QGeoPositionInfoSourceCL::timerEvent( QTimerEvent * event ) +{ + // Update timed out? + if (event->timerId() == m_updateTimer) { + setError(QGeoPositionInfoSource::UpdateTimeoutError); + + // Only timeout once since last data + setTimeoutInterval(0); + + // Started for single update? + if (!m_updatesWanted) + stopUpdates(); + } +} + +QGeoPositionInfoSource::PositioningMethods QGeoPositionInfoSourceCL::supportedPositioningMethods() const +{ + // CoreLocation doesn't say which positioning method(s) it used + return QGeoPositionInfoSource::AllPositioningMethods; +} + +int QGeoPositionInfoSourceCL::minimumUpdateInterval() const +{ + return MINIMUM_UPDATE_INTERVAL; +} + +void QGeoPositionInfoSourceCL::locationDataAvailable(QGeoPositionInfo location) +{ + // Signal position data available + m_lastUpdate = location; + emit positionUpdated(location); + + // Started for single update? + if (!m_updatesWanted) + stopUpdates(); + // ...otherwise restart timeout timer + else setTimeoutInterval(m_updateTimeout); +} + +QGeoPositionInfo QGeoPositionInfoSourceCL::lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const +{ + Q_UNUSED(fromSatellitePositioningMethodsOnly); + + return m_lastUpdate; +} + +QGeoPositionInfoSource::Error QGeoPositionInfoSourceCL::error() const +{ + return m_positionError; +} + +void QGeoPositionInfoSourceCL::setError(QGeoPositionInfoSource::Error positionError) +{ + m_positionError = positionError; + if (m_positionError != QGeoPositionInfoSource::NoError) + emit QGeoPositionInfoSource::errorOccurred(positionError); +} + +QT_END_NAMESPACE + +#include "moc_qgeopositioninfosource_cl_p.cpp" diff --git a/src/plugins/position/corelocation/qgeopositioninfosource_cl_p.h b/src/plugins/position/corelocation/qgeopositioninfosource_cl_p.h new file mode 100644 index 0000000..f49951d --- /dev/null +++ b/src/plugins/position/corelocation/qgeopositioninfosource_cl_p.h @@ -0,0 +1,71 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOSITIONINFOSOURCECL_H +#define QGEOPOSITIONINFOSOURCECL_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#import + +#include "qgeopositioninfosource.h" +#include "qgeopositioninfo.h" + +QT_BEGIN_NAMESPACE + +class QGeoPositionInfoSourceCL : public QGeoPositionInfoSource +{ + Q_OBJECT +public: + QGeoPositionInfoSourceCL(QObject *parent = 0); + ~QGeoPositionInfoSourceCL(); + + QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const override; + PositioningMethods supportedPositioningMethods() const override; + + void setUpdateInterval(int msec) override; + int minimumUpdateInterval() const override; + Error error() const override; + + void locationDataAvailable(QGeoPositionInfo location); + void setError(QGeoPositionInfoSource::Error positionError); + void changeAuthorizationStatus(CLAuthorizationStatus status); + +private: + bool enableLocationManager(); + void setTimeoutInterval(int msec); + +public Q_SLOTS: + void startUpdates() override; + void stopUpdates() override; + + void requestUpdate(int timeout = 0) override; + +protected: + void timerEvent(QTimerEvent *event) override; + +private: + Q_DISABLE_COPY(QGeoPositionInfoSourceCL); + CLLocationManager *m_locationManager; + bool m_updatesWanted; + + QGeoPositionInfo m_lastUpdate; + + int m_updateTimer; + int m_updateTimeout; + + QGeoPositionInfoSource::Error m_positionError; +}; + +QT_END_NAMESPACE + +#endif // QGEOPOSITIONINFOSOURCECL_H diff --git a/src/plugins/position/corelocation/qgeopositioninfosourcefactory_cl.h b/src/plugins/position/corelocation/qgeopositioninfosourcefactory_cl.h new file mode 100644 index 0000000..fa97977 --- /dev/null +++ b/src/plugins/position/corelocation/qgeopositioninfosourcefactory_cl.h @@ -0,0 +1,22 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOSITIONINFOSOURCEFACTORY_CL_H +#define QGEOPOSITIONINFOSOURCEFACTORY_CL_H + +#include +#include + +class QGeoPositionInfoSourceFactoryCL : public QObject, public QGeoPositionInfoSourceFactory +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0" + FILE "plugin.json") + Q_INTERFACES(QGeoPositionInfoSourceFactory) +public: + QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override; +}; + +#endif // QGEOPOSITIONINFOSOURCEFACTORY_CL_H diff --git a/src/plugins/position/corelocation/qgeopositioninfosourcefactory_cl.mm b/src/plugins/position/corelocation/qgeopositioninfosourcefactory_cl.mm new file mode 100644 index 0000000..0979422 --- /dev/null +++ b/src/plugins/position/corelocation/qgeopositioninfosourcefactory_cl.mm @@ -0,0 +1,25 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeopositioninfosource_cl_p.h" +#include "qgeopositioninfosourcefactory_cl.h" + +QGeoPositionInfoSource *QGeoPositionInfoSourceFactoryCL::positionInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parameters) + return new QGeoPositionInfoSourceCL(parent); +} + +QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactoryCL::satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent) + Q_UNUSED(parameters) + return nullptr; +} + +QGeoAreaMonitorSource *QGeoPositionInfoSourceFactoryCL::areaMonitor(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent) + Q_UNUSED(parameters) + return nullptr; +} diff --git a/src/plugins/position/geoclue2/CMakeLists.txt b/src/plugins/position/geoclue2/CMakeLists.txt new file mode 100644 index 0000000..5d11d07 --- /dev/null +++ b/src/plugins/position/geoclue2/CMakeLists.txt @@ -0,0 +1,34 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from geoclue2.pro. + +##################################################################### +## QGeoPositionInfoSourceFactoryGeoclue2 Plugin: +##################################################################### + +qt_internal_add_plugin(QGeoPositionInfoSourceFactoryGeoclue2Plugin + OUTPUT_NAME qtposition_geoclue2 + CLASS_NAME QGeoPositionInfoSourceFactoryGeoclue2 + PLUGIN_TYPE position + SOURCES + geocluetypes.cpp geocluetypes.h + qgeopositioninfosource_geoclue2.cpp qgeopositioninfosource_geoclue2_p.h + qgeopositioninfosourcefactory_geoclue2.cpp qgeopositioninfosourcefactory_geoclue2.h + DBUS_INTERFACE_SOURCES + org.freedesktop.GeoClue2.Client.xml + org.freedesktop.GeoClue2.Location.xml + org.freedesktop.GeoClue2.Manager.xml + DBUS_INTERFACE_FLAGS + -N -i geocluetypes.h # special case + INCLUDE_DIRECTORIES + ${CMAKE_CURRENT_BINARY_DIR} + core.location.includes + LIBRARIES + Qt::Core + Qt::DBus + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:geoclue2.pro:: +# OTHER_FILES = "plugin.json" diff --git a/src/plugins/position/geoclue2/geocluetypes.cpp b/src/plugins/position/geoclue2/geocluetypes.cpp new file mode 100644 index 0000000..b58842f --- /dev/null +++ b/src/plugins/position/geoclue2/geocluetypes.cpp @@ -0,0 +1,28 @@ +// Copyright (C) 2018 Denis Shienkov +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "geocluetypes.h" + +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN(Timestamp) + +QDBusArgument &operator<<(QDBusArgument &arg, const Timestamp &ts) +{ + arg.beginStructure(); + arg << ts.m_seconds; + arg << ts.m_microseconds; + arg.endStructure(); + return arg; +} + +const QDBusArgument &operator>>(const QDBusArgument &arg, Timestamp &ts) +{ + arg.beginStructure(); + arg >> ts.m_seconds; + arg >> ts.m_microseconds; + arg.endStructure(); + return arg; +} + +QT_END_NAMESPACE diff --git a/src/plugins/position/geoclue2/geocluetypes.h b/src/plugins/position/geoclue2/geocluetypes.h new file mode 100644 index 0000000..374601d --- /dev/null +++ b/src/plugins/position/geoclue2/geocluetypes.h @@ -0,0 +1,27 @@ +// Copyright (C) 2018 Denis Shienkov +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef GEOCLUETYPES_H +#define GEOCLUETYPES_H + +#include + +class Timestamp +{ +public: + quint64 m_seconds = 0; + quint64 m_microseconds = 0; +}; + +QT_BEGIN_NAMESPACE + +Q_DECLARE_TYPEINFO(Timestamp, Q_RELOCATABLE_TYPE); + +QDBusArgument &operator<<(QDBusArgument &arg, const Timestamp &ts); +const QDBusArgument &operator>>(const QDBusArgument &arg, Timestamp &ts); + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN(Timestamp, /* not exported */) + +#endif // GEOCLUETYPES_H diff --git a/src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Client.xml b/src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Client.xml new file mode 100644 index 0000000..4a9399b --- /dev/null +++ b/src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Client.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Location.xml b/src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Location.xml new file mode 100644 index 0000000..ebf2ea6 --- /dev/null +++ b/src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Location.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Manager.xml b/src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Manager.xml new file mode 100644 index 0000000..cf9590f --- /dev/null +++ b/src/plugins/position/geoclue2/org.freedesktop.GeoClue2.Manager.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/plugins/position/geoclue2/plugin.json b/src/plugins/position/geoclue2/plugin.json new file mode 100644 index 0000000..c23d40e --- /dev/null +++ b/src/plugins/position/geoclue2/plugin.json @@ -0,0 +1,9 @@ +{ + "Keys": ["geoclue2"], + "Provider": "geoclue2", + "Position": true, + "Satellite": false, + "Monitor": false, + "Priority": 1000, + "Testable": false +} diff --git a/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp b/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp new file mode 100644 index 0000000..f5a2939 --- /dev/null +++ b/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2.cpp @@ -0,0 +1,429 @@ +// Copyright (C) 2018 Denis Shienkov +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeopositioninfosource_geoclue2_p.h" + +#include +#include +#include +#include +#include + +// Auto-generated D-Bus files. +#include +#include "moc_client_interface.cpp" // includemocs +#include +#include "moc_location_interface.cpp" // includemocs +#include "moc_manager_interface.cpp" // includemocs + +Q_DECLARE_LOGGING_CATEGORY(lcPositioningGeoclue2) + +QT_BEGIN_NAMESPACE + +namespace { + +// NOTE: Copied from the /usr/include/libgeoclue-2.0/gclue-client.h +enum GClueAccuracyLevel { + GCLUE_ACCURACY_LEVEL_NONE = 0, + GCLUE_ACCURACY_LEVEL_COUNTRY = 1, + GCLUE_ACCURACY_LEVEL_CITY = 4, + GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD = 5, + GCLUE_ACCURACY_LEVEL_STREET = 6, + GCLUE_ACCURACY_LEVEL_EXACT = 8 +}; + +const char GEOCLUE2_SERVICE_NAME[] = "org.freedesktop.GeoClue2"; +const int MINIMUM_UPDATE_INTERVAL = 1000; +const int UPDATE_TIMEOUT_COLD_START = 120000; +static const auto desktopIdParameter = "desktopId"; + +static QString lastPositionFilePath() +{ + return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + + QStringLiteral("/qtposition-geoclue2"); +} + +} // namespace + +QGeoPositionInfoSourceGeoclue2::QGeoPositionInfoSourceGeoclue2(const QVariantMap ¶meters, + QObject *parent) + : QGeoPositionInfoSource(parent) + , m_requestTimer(new QTimer(this)) + , m_manager(QLatin1String(GEOCLUE2_SERVICE_NAME), + QStringLiteral("/org/freedesktop/GeoClue2/Manager"), + QDBusConnection::systemBus(), + this) +{ + parseParameters(parameters); + + qDBusRegisterMetaType(); + + restoreLastPosition(); + + m_requestTimer->setSingleShot(true); + connect(m_requestTimer, &QTimer::timeout, + this, &QGeoPositionInfoSourceGeoclue2::requestUpdateTimeout); +} + +QGeoPositionInfoSourceGeoclue2::~QGeoPositionInfoSourceGeoclue2() +{ + saveLastPosition(); +} + +void QGeoPositionInfoSourceGeoclue2::setUpdateInterval(int msec) +{ + QGeoPositionInfoSource::setUpdateInterval(msec); + configureClient(); +} + +QGeoPositionInfo QGeoPositionInfoSourceGeoclue2::lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const +{ + if (fromSatellitePositioningMethodsOnly && !m_lastPositionFromSatellite) + return QGeoPositionInfo(); + return m_lastPosition; +} + +QGeoPositionInfoSourceGeoclue2::PositioningMethods QGeoPositionInfoSourceGeoclue2::supportedPositioningMethods() const +{ + bool ok; + const auto accuracy = m_manager.property("AvailableAccuracyLevel").toUInt(&ok); + if (!ok) { + const_cast(this)->setError(AccessError); + return NoPositioningMethods; + } + + switch (accuracy) { + case GCLUE_ACCURACY_LEVEL_COUNTRY: + case GCLUE_ACCURACY_LEVEL_CITY: + case GCLUE_ACCURACY_LEVEL_NEIGHBORHOOD: + case GCLUE_ACCURACY_LEVEL_STREET: + return NonSatellitePositioningMethods; + case GCLUE_ACCURACY_LEVEL_EXACT: + return AllPositioningMethods; + case GCLUE_ACCURACY_LEVEL_NONE: + default: + return NoPositioningMethods; + } +} + +void QGeoPositionInfoSourceGeoclue2::setPreferredPositioningMethods(PositioningMethods methods) +{ + QGeoPositionInfoSource::setPreferredPositioningMethods(methods); + configureClient(); +} + +int QGeoPositionInfoSourceGeoclue2::minimumUpdateInterval() const +{ + return MINIMUM_UPDATE_INTERVAL; +} + +QGeoPositionInfoSource::Error QGeoPositionInfoSourceGeoclue2::error() const +{ + return m_error; +} + +void QGeoPositionInfoSourceGeoclue2::startUpdates() +{ + if (m_running) { + qCWarning(lcPositioningGeoclue2) << "Already running"; + return; + } + + qCDebug(lcPositioningGeoclue2) << "Starting updates"; + + m_error = QGeoPositionInfoSource::NoError; + + m_running = true; + + startClient(); + + if (m_lastPosition.isValid()) { + QMetaObject::invokeMethod(this, "positionUpdated", Qt::QueuedConnection, + Q_ARG(QGeoPositionInfo, m_lastPosition)); + } +} + +void QGeoPositionInfoSourceGeoclue2::stopUpdates() +{ + if (!m_running) { + qCWarning(lcPositioningGeoclue2) << "Already stopped"; + return; + } + + qCDebug(lcPositioningGeoclue2) << "Stopping updates"; + m_running = false; + + stopClient(); +} + +void QGeoPositionInfoSourceGeoclue2::requestUpdate(int timeout) +{ + if (m_requestTimer->isActive()) { + qCDebug(lcPositioningGeoclue2) << "Request timer was active, ignoring startUpdates"; + return; + } + + m_error = QGeoPositionInfoSource::NoError; + + if (timeout < minimumUpdateInterval() && timeout != 0) { + setError(QGeoPositionInfoSource::UpdateTimeoutError); + return; + } + + m_requestTimer->start(timeout ? timeout : UPDATE_TIMEOUT_COLD_START); + startClient(); +} + +void QGeoPositionInfoSourceGeoclue2::setError(QGeoPositionInfoSource::Error error) +{ + m_error = error; + if (m_error != QGeoPositionInfoSource::NoError) + emit QGeoPositionInfoSource::errorOccurred(m_error); +} + +void QGeoPositionInfoSourceGeoclue2::restoreLastPosition() +{ +#if !defined(QT_NO_DATASTREAM) + const auto filePath = lastPositionFilePath(); + QFile file(filePath); + if (file.open(QIODevice::ReadOnly)) { + QDataStream out(&file); + out >> m_lastPosition; + } +#endif +} + +void QGeoPositionInfoSourceGeoclue2::saveLastPosition() +{ +#if !defined(QT_NO_DATASTREAM) && QT_CONFIG(temporaryfile) + if (!m_lastPosition.isValid()) + return; + + const auto filePath = lastPositionFilePath(); + QSaveFile file(filePath); + if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { + QDataStream out(&file); + // Only save position and timestamp. + out << QGeoPositionInfo(m_lastPosition.coordinate(), m_lastPosition.timestamp()); + file.commit(); + } +#endif +} + +void QGeoPositionInfoSourceGeoclue2::createClient() +{ + const QDBusPendingReply reply = m_manager.GetClient(); + const auto watcher = new QDBusPendingCallWatcher(reply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, this, + [this](QDBusPendingCallWatcher *watcher) { + watcher->deleteLater(); + const QDBusPendingReply reply = *watcher; + if (reply.isError()) { + const auto error = reply.error(); + qCWarning(lcPositioningGeoclue2) << "Unable to obtain the client:" + << error.name() << error.message(); + setError(AccessError); + } else { + const QString clientPath = reply.value().path(); + qCDebug(lcPositioningGeoclue2) << "Client path is:" + << clientPath; + delete m_client; + m_client = new OrgFreedesktopGeoClue2ClientInterface( + QLatin1String(GEOCLUE2_SERVICE_NAME), + clientPath, + QDBusConnection::systemBus(), + this); + if (!m_client->isValid()) { + const auto error = m_client->lastError(); + qCCritical(lcPositioningGeoclue2) << "Unable to create the client object:" + << error.name() << error.message(); + delete m_client; + setError(AccessError); + } else { + connect(m_client.data(), &OrgFreedesktopGeoClue2ClientInterface::LocationUpdated, + this, &QGeoPositionInfoSourceGeoclue2::handleNewLocation); + + if (configureClient()) + startClient(); + } + } + }); +} + +void QGeoPositionInfoSourceGeoclue2::startClient() +{ + // only start the client if someone asked for it already + if (!m_running && !m_requestTimer->isActive()) + return; + + if (!m_client) { + createClient(); + return; + } + + const QDBusPendingReply<> reply = m_client->Start(); + const auto watcher = new QDBusPendingCallWatcher(reply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, this, + [this](QDBusPendingCallWatcher *watcher) { + watcher->deleteLater(); + const QDBusPendingReply<> reply = *watcher; + if (reply.isError()) { + const auto error = reply.error(); + qCCritical(lcPositioningGeoclue2) << "Unable to start the client:" + << error.name() << error.message(); + delete m_client; + // This can potentially lead to calling ~QGeoPositionInfoSourceGeoclue2(), + // so do all the cleanup before. + setError(AccessError); + } else { + qCDebug(lcPositioningGeoclue2) << "Client successfully started"; + + const QDBusObjectPath location = m_client->location(); + const QString path = location.path(); + if (path.isEmpty() || path == QLatin1String("/")) + return; + + handleNewLocation({}, location); + } + }); +} + +void QGeoPositionInfoSourceGeoclue2::stopClient() +{ + // Only stop client if updates are no longer wanted. + if (m_requestTimer->isActive() || m_running || !m_client) + return; + + const QDBusPendingReply<> reply = m_client->Stop(); + const auto watcher = new QDBusPendingCallWatcher(reply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, this, + [this](QDBusPendingCallWatcher *watcher) { + watcher->deleteLater(); + const QDBusPendingReply<> reply = *watcher; + if (reply.isError()) { + const auto error = reply.error(); + qCCritical(lcPositioningGeoclue2) << "Unable to stop the client:" + << error.name() << error.message(); + setError(AccessError); + } else { + qCDebug(lcPositioningGeoclue2) << "Client successfully stopped"; + } + delete m_client; + }); +} + +bool QGeoPositionInfoSourceGeoclue2::configureClient() +{ + if (!m_client) + return false; + + if (m_desktopId.isEmpty()) { + qCCritical(lcPositioningGeoclue2) + << "Unable to configure the client due to the desktop id is not set via" + << desktopIdParameter << "plugin parameter or QCoreApplication::applicationName"; + setError(AccessError); + return false; + } + + m_client->setDesktopId(m_desktopId); + + const auto msecs = updateInterval(); + const uint secs = qMax(uint(msecs), 0u) / 1000u; + m_client->setTimeThreshold(secs); + + const auto methods = preferredPositioningMethods(); + switch (methods) { + case SatellitePositioningMethods: + m_client->setRequestedAccuracyLevel(GCLUE_ACCURACY_LEVEL_EXACT); + break; + case NonSatellitePositioningMethods: + m_client->setRequestedAccuracyLevel(GCLUE_ACCURACY_LEVEL_STREET); + break; + case AllPositioningMethods: + m_client->setRequestedAccuracyLevel(GCLUE_ACCURACY_LEVEL_EXACT); + break; + default: + m_client->setRequestedAccuracyLevel(GCLUE_ACCURACY_LEVEL_NONE); + break; + } + + return true; +} + +void QGeoPositionInfoSourceGeoclue2::requestUpdateTimeout() +{ + qCDebug(lcPositioningGeoclue2) << "Request update timeout occurred"; + + setError(QGeoPositionInfoSource::UpdateTimeoutError); + + stopClient(); +} + +void QGeoPositionInfoSourceGeoclue2::handleNewLocation(const QDBusObjectPath &oldLocation, + const QDBusObjectPath &newLocation) +{ + if (m_requestTimer->isActive()) + m_requestTimer->stop(); + + const auto oldPath = oldLocation.path(); + const auto newPath = newLocation.path(); + qCDebug(lcPositioningGeoclue2) << "Old location object path:" << oldPath; + qCDebug(lcPositioningGeoclue2) << "New location object path:" << newPath; + + OrgFreedesktopGeoClue2LocationInterface location( + QLatin1String(GEOCLUE2_SERVICE_NAME), + newPath, + QDBusConnection::systemBus(), + this); + if (!location.isValid()) { + const auto error = location.lastError(); + qCCritical(lcPositioningGeoclue2) << "Unable to create the location object:" + << error.name() << error.message(); + } else { + QGeoCoordinate coordinate(location.latitude(), + location.longitude()); + const auto altitude = location.altitude(); + if (altitude > std::numeric_limits::lowest()) + coordinate.setAltitude(altitude); + + const Timestamp ts = location.timestamp(); + if (ts.m_seconds == 0 && ts.m_microseconds == 0) { + const auto dt = QDateTime::currentDateTime(); + m_lastPosition = QGeoPositionInfo(coordinate, dt); + } else { + auto dt = QDateTime::fromSecsSinceEpoch(qint64(ts.m_seconds)); + dt = dt.addMSecs(ts.m_microseconds / 1000); + m_lastPosition = QGeoPositionInfo(coordinate, dt); + } + + const auto accuracy = location.accuracy(); + // We assume that an accuracy as 0.0 means that it comes from a sattelite. + m_lastPositionFromSatellite = qFuzzyCompare(accuracy, 0.0); + + m_lastPosition.setAttribute(QGeoPositionInfo::HorizontalAccuracy, accuracy); + const auto speed = location.speed(); + if (speed >= 0.0) + m_lastPosition.setAttribute(QGeoPositionInfo::GroundSpeed, speed); + const auto heading = location.heading(); + if (heading >= 0.0) + m_lastPosition.setAttribute(QGeoPositionInfo::Direction, heading); + + emit positionUpdated(m_lastPosition); + qCDebug(lcPositioningGeoclue2) << "New position:" << m_lastPosition; + } + + stopClient(); +} + +void QGeoPositionInfoSourceGeoclue2::parseParameters(const QVariantMap ¶meters) +{ + if (parameters.contains(desktopIdParameter)) + m_desktopId = parameters.value(desktopIdParameter).toString(); + + if (m_desktopId.isEmpty()) + m_desktopId = QCoreApplication::applicationName(); +} + +QT_END_NAMESPACE + +#include "moc_qgeopositioninfosource_geoclue2_p.cpp" diff --git a/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2_p.h b/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2_p.h new file mode 100644 index 0000000..9ba27af --- /dev/null +++ b/src/plugins/position/geoclue2/qgeopositioninfosource_geoclue2_p.h @@ -0,0 +1,64 @@ +// Copyright (C) 2018 Denis Shienkov +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOSITIONINFOSOURCE_GEOCLUE2_P_H +#define QGEOPOSITIONINFOSOURCE_GEOCLUE2_P_H + +#include +#include +#include + +class OrgFreedesktopGeoClue2ClientInterface; + +QT_BEGIN_NAMESPACE +class QDBusObjectPath; +class QTimer; + +class QGeoPositionInfoSourceGeoclue2 : public QGeoPositionInfoSource +{ + Q_OBJECT + +public: + explicit QGeoPositionInfoSourceGeoclue2(const QVariantMap ¶meters, + QObject *parent = nullptr); + ~QGeoPositionInfoSourceGeoclue2(); + + // From QGeoPositionInfoSource + void setUpdateInterval(int msec) override; + QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const override; + PositioningMethods supportedPositioningMethods() const override; + void setPreferredPositioningMethods(PositioningMethods methods) override; + int minimumUpdateInterval() const override; + + Error error() const override; + + void startUpdates() override; + void stopUpdates() override; + void requestUpdate(int timeout = 5000) override; + +private: + void setError(QGeoPositionInfoSource::Error error); + void restoreLastPosition(); + void saveLastPosition(); + void createClient(); + bool configureClient(); + void startClient(); + void stopClient(); + void requestUpdateTimeout(); + void handleNewLocation(const QDBusObjectPath &oldLocation, + const QDBusObjectPath &newLocation); + void parseParameters(const QVariantMap ¶meters); + + QTimer *m_requestTimer = nullptr; + OrgFreedesktopGeoClue2ManagerInterface m_manager; + QPointer m_client; + bool m_running = false; + bool m_lastPositionFromSatellite = false; + QGeoPositionInfoSource::Error m_error = NoError; + QGeoPositionInfo m_lastPosition; + QString m_desktopId; +}; + +QT_END_NAMESPACE + +#endif // QGEOPOSITIONINFOSOURCE_GEOCLUE2_P_H diff --git a/src/plugins/position/geoclue2/qgeopositioninfosourcefactory_geoclue2.cpp b/src/plugins/position/geoclue2/qgeopositioninfosourcefactory_geoclue2.cpp new file mode 100644 index 0000000..0e85b6c --- /dev/null +++ b/src/plugins/position/geoclue2/qgeopositioninfosourcefactory_geoclue2.cpp @@ -0,0 +1,35 @@ +// Copyright (C) 2018 Denis Shienkov +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeopositioninfosource_geoclue2_p.h" +#include "qgeopositioninfosourcefactory_geoclue2.h" + +#include + +Q_LOGGING_CATEGORY(lcPositioningGeoclue2, "qt.positioning.geoclue2") + +QT_BEGIN_NAMESPACE + +QGeoPositionInfoSource *QGeoPositionInfoSourceFactoryGeoclue2::positionInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parameters) + return new QGeoPositionInfoSourceGeoclue2(parameters, parent); +} + +QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactoryGeoclue2::satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent) + Q_UNUSED(parameters) + return nullptr; +} + +QGeoAreaMonitorSource *QGeoPositionInfoSourceFactoryGeoclue2::areaMonitor(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent) + Q_UNUSED(parameters) + return nullptr; +} + +QT_END_NAMESPACE + +#include "moc_qgeopositioninfosourcefactory_geoclue2.cpp" diff --git a/src/plugins/position/geoclue2/qgeopositioninfosourcefactory_geoclue2.h b/src/plugins/position/geoclue2/qgeopositioninfosourcefactory_geoclue2.h new file mode 100644 index 0000000..b403d10 --- /dev/null +++ b/src/plugins/position/geoclue2/qgeopositioninfosourcefactory_geoclue2.h @@ -0,0 +1,32 @@ +// Copyright (C) 2018 Denis Shienkov +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOSITIONINFOSOURCEFACTORY_GEOCLUE2_H +#define QGEOPOSITIONINFOSOURCEFACTORY_GEOCLUE2_H + +#include +#include + +QT_BEGIN_NAMESPACE + +/* + Qt Positioning plugin for Geoclue. This plugin supports Geoclue version 2.x. +*/ +class QGeoPositionInfoSourceFactoryGeoclue2 : public QObject, public QGeoPositionInfoSourceFactory +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0" + FILE "plugin.json") + + Q_INTERFACES(QGeoPositionInfoSourceFactory) + +public: + QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override; +}; + +QT_END_NAMESPACE + +#endif // QGEOPOSITIONINFOSOURCEFACTORY_GEOCLUE2_H diff --git a/src/plugins/position/gypsy/CMakeLists.txt b/src/plugins/position/gypsy/CMakeLists.txt new file mode 100644 index 0000000..830965c --- /dev/null +++ b/src/plugins/position/gypsy/CMakeLists.txt @@ -0,0 +1,27 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from gypsy.pro. + +##################################################################### +## QGeoPositionInfoSourceFactoryGypsy Plugin: +##################################################################### + +qt_internal_add_plugin(QGeoPositionInfoSourceFactoryGypsyPlugin + OUTPUT_NAME qtposition_gypsy + CLASS_NAME QGeoPositionInfoSourceFactoryGypsy + PLUGIN_TYPE position + SOURCES + qgeopositioninfosourcefactory_gypsy.cpp qgeopositioninfosourcefactory_gypsy.h + qgeosatelliteinfosource_gypsy.cpp qgeosatelliteinfosource_gypsy_p.h +# special case begin + LIBRARIES + Gypsy::Gypsy + Gconf::Gconf + Qt::Core + Qt::Positioning +# special case end +) + +#### Keys ignored in scope 1:.:.:gypsy.pro:: +# OTHER_FILES = "plugin.json" diff --git a/src/plugins/position/gypsy/plugin.json b/src/plugins/position/gypsy/plugin.json new file mode 100644 index 0000000..9cef03f --- /dev/null +++ b/src/plugins/position/gypsy/plugin.json @@ -0,0 +1,9 @@ +{ + "Keys": ["gypsy"], + "Provider": "gypsy", + "Position": false, + "Satellite": true, + "Monitor" : false, + "Priority": 1000, + "Testable": false +} diff --git a/src/plugins/position/gypsy/qgeopositioninfosourcefactory_gypsy.cpp b/src/plugins/position/gypsy/qgeopositioninfosourcefactory_gypsy.cpp new file mode 100644 index 0000000..d467db8 --- /dev/null +++ b/src/plugins/position/gypsy/qgeopositioninfosourcefactory_gypsy.cpp @@ -0,0 +1,30 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeopositioninfosourcefactory_gypsy.h" +#include "qgeosatelliteinfosource_gypsy_p.h" + +QGeoPositionInfoSource *QGeoPositionInfoSourceFactoryGypsy::positionInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent) + Q_UNUSED(parameters) + return nullptr; +} + +QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactoryGypsy::satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parameters) + QGeoSatelliteInfoSourceGypsy *src = new QGeoSatelliteInfoSourceGypsy(parent); + if (src->init(parameters) < 0) { + delete src; + src = nullptr; + } + return src; +} + +QGeoAreaMonitorSource *QGeoPositionInfoSourceFactoryGypsy::areaMonitor(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent) + Q_UNUSED(parameters) + return nullptr; +} diff --git a/src/plugins/position/gypsy/qgeopositioninfosourcefactory_gypsy.h b/src/plugins/position/gypsy/qgeopositioninfosourcefactory_gypsy.h new file mode 100644 index 0000000..86b567f --- /dev/null +++ b/src/plugins/position/gypsy/qgeopositioninfosourcefactory_gypsy.h @@ -0,0 +1,23 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOSITIONINFOSOURCEFACTORY_GYPSY_H +#define QGEOPOSITIONINFOSOURCEFACTORY_GYPSY_H + +#include +#include + +class QGeoPositionInfoSourceFactoryGypsy : public QObject, public QGeoPositionInfoSourceFactory +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0" + FILE "plugin.json") + Q_INTERFACES(QGeoPositionInfoSourceFactory) + +public: + QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override; +}; + +#endif diff --git a/src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy.cpp b/src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy.cpp new file mode 100644 index 0000000..49bbb68 --- /dev/null +++ b/src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy.cpp @@ -0,0 +1,406 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeosatelliteinfosource_gypsy_p.h" + +#ifdef Q_LOCATION_GYPSY_DEBUG +#include +#endif +#include +#include + +QT_BEGIN_NAMESPACE + +#define UPDATE_TIMEOUT_COLD_START 120000 + +static const auto deviceNameParameter = "deviceName"; +static const auto gconfKeyParameter = "gconfKey"; +static const auto defaultGconfKey = "/apps/geoclue/master/org.freedesktop.Geoclue.GPSDevice"; + +// Callback function for 'satellites-changed' -signal +static void satellites_changed (GypsySatellite *satellite, + GPtrArray *satellites, + gpointer userdata) +{ +#ifdef Q_LOCATION_GYPSY_DEBUG + qDebug() << "QGeoSatelliteInfoSourceGypsy Gypsy satellites-changed -signal received."; +#endif + ((QGeoSatelliteInfoSourceGypsy *)userdata)->satellitesChanged(satellite, satellites); +} + +SatelliteGypsyEngine::SatelliteGypsyEngine(QGeoSatelliteInfoSource *parent) : + m_owner(parent) +{ +} +SatelliteGypsyEngine::~SatelliteGypsyEngine() +{ +} + +// Glib symbols +gulong SatelliteGypsyEngine::eng_g_signal_connect(gpointer instance, + const gchar *detailed_signal, + GCallback c_handler, + gpointer data) +{ + return ::g_signal_connect(instance, detailed_signal, c_handler, data); +} +guint SatelliteGypsyEngine::eng_g_signal_handlers_disconnect_by_func (gpointer instance, + gpointer func, + gpointer data) +{ + return ::g_signal_handlers_disconnect_by_func(instance, func, data); +} + +void SatelliteGypsyEngine::eng_g_free(gpointer mem) +{ + return ::g_free(mem); +} +// Gypsy symbols +GypsyControl *SatelliteGypsyEngine::eng_gypsy_control_get_default (void) +{ + return ::gypsy_control_get_default(); +} +char *SatelliteGypsyEngine::eng_gypsy_control_create (GypsyControl *control, const char *device_name, GError **error) +{ + return ::gypsy_control_create(control, device_name, error); +} +GypsyDevice *SatelliteGypsyEngine::eng_gypsy_device_new (const char *object_path) +{ + return ::gypsy_device_new(object_path); +} +GypsySatellite *SatelliteGypsyEngine::eng_gypsy_satellite_new (const char *object_path) +{ + return ::gypsy_satellite_new (object_path); +} +gboolean SatelliteGypsyEngine::eng_gypsy_device_start (GypsyDevice *device, GError **error) +{ + return ::gypsy_device_start(device, error); +} +gboolean SatelliteGypsyEngine::eng_gypsy_device_stop (GypsyDevice *device, GError **error) +{ + // Unfortunately this cannot be done; calling this will stop the GPS device + // (basically makes gypsy-daemon unusable for anyone), regardless of applications + // using it (see bug http://bugs.meego.com/show_bug.cgi?id=11707). + Q_UNUSED(device); + Q_UNUSED(error); + return true; + //return ::gypsy_device_stop (device, error); +} +GypsyDeviceFixStatus SatelliteGypsyEngine::eng_gypsy_device_get_fix_status (GypsyDevice *device, GError **error) +{ + return ::gypsy_device_get_fix_status (device, error); +} +GPtrArray *SatelliteGypsyEngine::eng_gypsy_satellite_get_satellites (GypsySatellite *satellite, GError **error) +{ + return ::gypsy_satellite_get_satellites (satellite, error); +} +void SatelliteGypsyEngine::eng_gypsy_satellite_free_satellite_array (GPtrArray *satellites) +{ + return ::gypsy_satellite_free_satellite_array(satellites); +} +// GConf symbols (mockability due to X11 requirement) +GConfClient *SatelliteGypsyEngine::eng_gconf_client_get_default(void) +{ + return ::gconf_client_get_default(); +} +gchar *SatelliteGypsyEngine::eng_gconf_client_get_string(GConfClient *client, const gchar *key, GError** err) +{ + return ::gconf_client_get_string(client, key, err); +} + +QGeoSatelliteInfoSourceGypsy::QGeoSatelliteInfoSourceGypsy(QObject *parent) + : QGeoSatelliteInfoSource(parent), m_engine(0), m_satellite(0), m_device(0), + m_requestTimer(this), m_updatesOngoing(false), m_requestOngoing(false) +{ + m_requestTimer.setSingleShot(true); + QObject::connect(&m_requestTimer, SIGNAL(timeout()), this, SLOT(requestUpdateTimeout())); +} + +void QGeoSatelliteInfoSourceGypsy::createEngine() +{ + delete m_engine; + m_engine = new SatelliteGypsyEngine(this); +} + +QGeoSatelliteInfoSourceGypsy::~QGeoSatelliteInfoSourceGypsy() +{ + GError *error = NULL; + if (m_device) { + m_engine->eng_gypsy_device_stop (m_device, &error); + g_object_unref(m_device); + } + if (m_satellite) + g_object_unref(m_satellite); + if (m_control) + g_object_unref(m_control); + if (error) + g_error_free(error); + delete m_engine; +} + +static QGeoSatelliteInfo::SatelliteSystem idToSystem(int prn) +{ + if (prn >= 1 && prn <= 32) + return QGeoSatelliteInfo::GPS; + else if (prn >= 65 && prn <= 96) + return QGeoSatelliteInfo::GLONASS; + else if (prn >= 193 && prn <= 200) + return QGeoSatelliteInfo::QZSS; + else if ((prn >= 201 && prn <= 235) || (prn >= 401 && prn <= 437)) + return QGeoSatelliteInfo::BEIDOU; + else if (prn >= 301 && prn <= 336) + return QGeoSatelliteInfo::GALILEO; + return QGeoSatelliteInfo::Undefined; +} + +void QGeoSatelliteInfoSourceGypsy::satellitesChanged(GypsySatellite *satellite, + GPtrArray *satellites) +{ + if (!satellite || !satellites) + return; + // We have satellite data and assume it is valid. + // If a single updateRequest was active, send signals right away. + // If a periodic timer was running (meaning that the client wishes + // to have updates at defined intervals), store the data for later sending. + QList lastSatellitesInView; + QList lastSatellitesInUse; + + unsigned int i; + for (i = 0; i < satellites->len; i++) { + GypsySatelliteDetails *details = (GypsySatelliteDetails *)satellites->pdata[i]; + QGeoSatelliteInfo info; + info.setSatelliteIdentifier(details->satellite_id); + info.setSatelliteSystem(idToSystem(details->satellite_id)); + info.setAttribute(QGeoSatelliteInfo::Elevation, details->elevation); + info.setAttribute(QGeoSatelliteInfo::Azimuth, details->azimuth); + info.setSignalStrength(details->snr); + if (details->in_use) + lastSatellitesInUse.append(info); + lastSatellitesInView.append(info); + } + bool sendUpdates(false); + // If a single updateRequest() has been issued: + if (m_requestOngoing) { + sendUpdates = true; + m_requestTimer.stop(); + m_requestOngoing = false; + // If there is no regular updates ongoing, disconnect now. + if (!m_updatesOngoing) { + m_engine->eng_g_signal_handlers_disconnect_by_func(G_OBJECT(m_satellite), (void *)satellites_changed, this); + } + } + // If regular updates are to be delivered as they come: + if (m_updatesOngoing) + sendUpdates = true; + + if (sendUpdates) { + emit satellitesInUseUpdated(lastSatellitesInUse); + emit satellitesInViewUpdated(lastSatellitesInView); + } +} + +QString QGeoSatelliteInfoSourceGypsy::extractDeviceNameFromParameters(const QVariantMap ¶meters) const +{ + // The logic is as follows: + // 1. If the deviceNameParameter is specified, its value is used to get the + // device name. + // 2. If the gconfKeyParameter is specified, its value is used as a key to + // extract the device name from GConf. + // 3. If nothing is specified, defaultGconfKey is used as a key to extract + // the device name from GConf. + if (parameters.contains(deviceNameParameter)) + return parameters.value(deviceNameParameter).toString(); + + QString gconfKey = parameters.value(gconfKeyParameter).toString(); + if (gconfKey.isEmpty()) + gconfKey = defaultGconfKey; + + if (!m_engine) + return QString(); + + GConfClient *client = m_engine->eng_gconf_client_get_default(); + if (!client) + return QString(); + + gchar *device_name = m_engine->eng_gconf_client_get_string(client, + gconfKey.toLatin1().constData(), + nullptr); + g_object_unref(client); + + const QString deviceName = QString::fromLatin1(device_name); + m_engine->eng_g_free(device_name); + + return deviceName; +} + +int QGeoSatelliteInfoSourceGypsy::init(const QVariantMap parameters) +{ + GError *error = NULL; + char *path; + +#if !GLIB_CHECK_VERSION(2, 36, 0) + g_type_init (); // this function was deprecated in glib 2.36 +#endif + createEngine(); + + const QString deviceName = extractDeviceNameFromParameters(parameters); + + if (deviceName.isEmpty() || + (deviceName.trimmed().at(0) == '/' && !QFile::exists(deviceName.trimmed()))) { + qWarning ("QGeoSatelliteInfoSourceGypsy Empty/nonexistent GPS device name detected."); + qWarning("Use '%s' plugin parameter to specify device name directly", deviceNameParameter); + qWarning("or use '%s' plugin parameter to specify a GConf key to extract the device name.", + gconfKeyParameter); + qWarning ("If the GConf key is used, the gconftool-2 tool can be used to set device name " + "for the selected key, e.g. on terminal:"); + qWarning ("gconftool-2 -t string -s %s /dev/ttyUSB0", gconfKeyParameter); + return -1; + } + m_control = m_engine->eng_gypsy_control_get_default(); + if (!m_control) { + qWarning("QGeoSatelliteInfoSourceGypsy unable to create Gypsy control."); + return -1; + } + // (path is the DBus path) + path = m_engine->eng_gypsy_control_create(m_control, deviceName.toLatin1().constData(), &error); + if (!path) { + qWarning ("QGeoSatelliteInfoSourceGypsy error creating client."); + if (error) { + qWarning ("error message: %s", error->message); + g_error_free (error); + } + return -1; + } + m_device = m_engine->eng_gypsy_device_new (path); + m_satellite = m_engine->eng_gypsy_satellite_new (path); + m_engine->eng_g_free(path); + if (!m_device || !m_satellite) { + qWarning ("QGeoSatelliteInfoSourceGypsy error creating satellite device."); + qWarning ("Please check that the GPS device is specified correctly."); + qWarning("Use '%s' plugin parameter to specify device name directly", deviceNameParameter); + qWarning("or use '%s' plugin parameter to specify a GConf key to extract the device name.", + gconfKeyParameter); + qWarning ("If the GConf key is used, the gconftool-2 tool can be used to set device name " + "for the selected key, e.g. on terminal:"); + qWarning ("gconftool-2 -t string -s %s /dev/ttyUSB0", gconfKeyParameter); + if (m_device) + g_object_unref(m_device); + if (m_satellite) + g_object_unref(m_satellite); + return -1; + } + m_engine->eng_gypsy_device_start (m_device, &error); + if (error) { + qWarning ("QGeoSatelliteInfoSourceGypsy error starting device: %s ", + error->message); + g_error_free(error); + g_object_unref(m_device); + g_object_unref(m_satellite); + return -1; + } + return 0; +} + +int QGeoSatelliteInfoSourceGypsy::minimumUpdateInterval() const +{ + return 1; +} + +QGeoSatelliteInfoSource::Error QGeoSatelliteInfoSourceGypsy::error() const +{ + return m_error; +} + +void QGeoSatelliteInfoSourceGypsy::startUpdates() +{ + if (m_updatesOngoing) + return; + + m_error = QGeoSatelliteInfoSource::NoError; + + // If there is a request timer ongoing, we've connected to the signal already + if (!m_requestTimer.isActive()) { + m_engine->eng_g_signal_connect (m_satellite, "satellites-changed", + G_CALLBACK (satellites_changed), this); + } + m_updatesOngoing = true; +} + +void QGeoSatelliteInfoSourceGypsy::stopUpdates() +{ + if (!m_updatesOngoing) + return; + m_updatesOngoing = false; + // Disconnect only if there is no single update request ongoing. Once single update request + // is completed and it notices that there is no active update ongoing, it will disconnect + // the signal. + if (!m_requestTimer.isActive()) + m_engine->eng_g_signal_handlers_disconnect_by_func(G_OBJECT(m_satellite), (void *)satellites_changed, this); +} + +void QGeoSatelliteInfoSourceGypsy::requestUpdate(int timeout) +{ + if (m_requestOngoing) + return; + + m_error = QGeoSatelliteInfoSource::NoError; + + if (timeout < 0) { + setError(QGeoSatelliteInfoSource::UpdateTimeoutError); + return; + } + m_requestOngoing = true; + GError *error = 0; + // If GPS has a fix a already, request current data. + GypsyDeviceFixStatus fixStatus = m_engine->eng_gypsy_device_get_fix_status(m_device, &error); + if (!error && (fixStatus != GYPSY_DEVICE_FIX_STATUS_INVALID && + fixStatus != GYPSY_DEVICE_FIX_STATUS_NONE)) { +#ifdef Q_LOCATION_GYPSY_DEBUG + qDebug() << "QGeoSatelliteInfoSourceGypsy fix available, requesting current satellite data"; +#endif + GPtrArray *satelliteData = m_engine->eng_gypsy_satellite_get_satellites(m_satellite, &error); + if (!error) { + // The fix was available and we have satellite data to deliver right away. + satellitesChanged(m_satellite, satelliteData); + m_engine->eng_gypsy_satellite_free_satellite_array(satelliteData); + return; + } + } + // No fix is available. If updates are not ongoing already, start them. + m_requestTimer.setInterval(timeout == 0? UPDATE_TIMEOUT_COLD_START: timeout); + if (!m_updatesOngoing) { + m_engine->eng_g_signal_connect (m_satellite, "satellites-changed", + G_CALLBACK (satellites_changed), this); + } + m_requestTimer.start(); + if (error) { +#ifdef Q_LOCATION_GYPSY_DEBUG + qDebug() << "QGeoSatelliteInfoSourceGypsy error asking fix status or satellite data: " << error->message; +#endif + g_error_free(error); + } +} + +void QGeoSatelliteInfoSourceGypsy::requestUpdateTimeout() +{ +#ifdef Q_LOCATION_GYPSY_DEBUG + qDebug("QGeoSatelliteInfoSourceGypsy request update timeout occurred."); +#endif + // If we end up here, there has not been valid satellite update. + // Emit timeout and disconnect from signal if regular updates are not + // ongoing (as we were listening just for one single requestUpdate). + if (!m_updatesOngoing) { + m_engine->eng_g_signal_handlers_disconnect_by_func(G_OBJECT(m_satellite), (void *)satellites_changed, this); + } + m_requestOngoing = false; + setError(QGeoSatelliteInfoSource::UpdateTimeoutError); +} + +void QGeoSatelliteInfoSourceGypsy::setError(QGeoSatelliteInfoSource::Error error) +{ + m_error = error; + if (m_error != QGeoSatelliteInfoSource::NoError) + emit QGeoSatelliteInfoSource::errorOccurred(m_error); +} + +QT_END_NAMESPACE diff --git a/src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy_p.h b/src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy_p.h new file mode 100644 index 0000000..4a836ba --- /dev/null +++ b/src/plugins/position/gypsy/qgeosatelliteinfosource_gypsy_p.h @@ -0,0 +1,107 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOSATELLITEINFOSOURCE_GYPSY_H +#define QGEOSATELLITEINFOSOURCE_GYPSY_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeosatelliteinfosource.h" +#include "qgeosatelliteinfo.h" +#include +#include +#include +#include +#include + +// #define Q_LOCATION_GYPSY_DEBUG + +QT_BEGIN_NAMESPACE + +// An engine that encapsulates all symbols we want +// to be able to mock (for unit/autotest purposes). +class SatelliteGypsyEngine +{ +public: + SatelliteGypsyEngine(QGeoSatelliteInfoSource *parent = 0); + virtual ~SatelliteGypsyEngine(); + // Glib symbols + virtual gulong eng_g_signal_connect(gpointer instance, + const gchar *detailed_signal, + GCallback c_handler, + gpointer data); + virtual guint eng_g_signal_handlers_disconnect_by_func(gpointer instance, + gpointer func, + gpointer data); + virtual void eng_g_free(gpointer mem); + // Gypsy symbols + virtual GypsyControl *eng_gypsy_control_get_default (void); + virtual char *eng_gypsy_control_create (GypsyControl *control, const char *device_name, GError **error); + virtual GypsyDevice *eng_gypsy_device_new (const char *object_path); + virtual GypsySatellite *eng_gypsy_satellite_new (const char *object_path); + virtual gboolean eng_gypsy_device_start (GypsyDevice *device, GError **error); + virtual gboolean eng_gypsy_device_stop (GypsyDevice *device, GError **error); + virtual GypsyDeviceFixStatus eng_gypsy_device_get_fix_status (GypsyDevice *device, GError **error); + virtual GPtrArray *eng_gypsy_satellite_get_satellites (GypsySatellite *satellite, GError **error); + virtual void eng_gypsy_satellite_free_satellite_array (GPtrArray *satellites); + // GConf symbols (mockability due to X11 requirement) + virtual GConfClient *eng_gconf_client_get_default(void); + virtual gchar *eng_gconf_client_get_string(GConfClient *client, const gchar *key, GError** err); +protected: + QGeoSatelliteInfoSource *m_owner; +}; + +class QGeoSatelliteInfoSourceGypsy : public QGeoSatelliteInfoSource + { + Q_OBJECT + +public: + explicit QGeoSatelliteInfoSourceGypsy(QObject *parent = 0); + ~QGeoSatelliteInfoSourceGypsy(); + int init(const QVariantMap parameters); + + int minimumUpdateInterval() const override; + Error error() const override; + +public slots: + virtual void startUpdates() override; + void stopUpdates() override; + void requestUpdate(int timeout = 5000) override; + void satellitesChanged(GypsySatellite *satellite, GPtrArray *satellites); + +private slots: + void requestUpdateTimeout(); + +private: + void setError(QGeoSatelliteInfoSource::Error error); + QString extractDeviceNameFromParameters(const QVariantMap ¶meters) const; + +protected: + // Creates an engine which encapsulates all used symbols + // that we want to be also able to mock. + virtual void createEngine(); + SatelliteGypsyEngine *m_engine; + +private: + Q_DISABLE_COPY(QGeoSatelliteInfoSourceGypsy) + GypsySatellite *m_satellite; + GypsyDevice *m_device; + QTimer m_requestTimer; + bool m_updatesOngoing; + bool m_requestOngoing; + QGeoSatelliteInfoSource::Error m_error = QGeoSatelliteInfoSource::NoError; + GypsyControl *m_control = nullptr; + }; + +QT_END_NAMESPACE + +#endif // QGEOSATELLITEINFOSOURCE_GYPSY_H diff --git a/src/plugins/position/nmea/CMakeLists.txt b/src/plugins/position/nmea/CMakeLists.txt new file mode 100644 index 0000000..76a83db --- /dev/null +++ b/src/plugins/position/nmea/CMakeLists.txt @@ -0,0 +1,32 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from nmea.pro. + +##################################################################### +## QGeoPositionInfoSourceFactoryNmea Plugin: +##################################################################### + +qt_internal_add_plugin(QGeoPositionInfoSourceFactoryNmeaPlugin + OUTPUT_NAME qtposition_nmea + CLASS_NAME QGeoPositionInfoSourceFactoryNmea + PLUGIN_TYPE position + SOURCES + qgeopositioninfosourcefactory_nmea.cpp qgeopositioninfosourcefactory_nmea.h + qiopipe.cpp qiopipe_p.h + LIBRARIES + Qt::CorePrivate + Qt::Positioning + Qt::Network +) + +qt_internal_extend_target(QGeoPositionInfoSourceFactoryNmeaPlugin + CONDITION (TARGET Qt::SerialPort) + LIBRARIES + Qt::SerialPort + DEFINES + QT_NMEA_PLUGIN_HAS_SERIALPORT +) + +#### Keys ignored in scope 1:.:.:serialnmea.pro:: +# OTHER_FILES = "plugin.json" diff --git a/src/plugins/position/nmea/plugin.json b/src/plugins/position/nmea/plugin.json new file mode 100644 index 0000000..a60f947 --- /dev/null +++ b/src/plugins/position/nmea/plugin.json @@ -0,0 +1,9 @@ +{ + "Keys": ["nmea"], + "Provider": "nmea", + "Position": true, + "Satellite": true, + "Monitor" : false, + "Priority": 900, + "Testable": false +} diff --git a/src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.cpp b/src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.cpp new file mode 100644 index 0000000..1645863 --- /dev/null +++ b/src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.cpp @@ -0,0 +1,522 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeopositioninfosourcefactory_nmea.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "qiopipe_p.h" + +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT +# include +# include +#endif + + +Q_LOGGING_CATEGORY(lcNmea, "qt.positioning.nmea") + +QT_BEGIN_NAMESPACE + +static const auto sourceParameterName = QStringLiteral("nmea.source"); +static const auto socketScheme = QStringLiteral("socket:"); +static const auto serialScheme = QStringLiteral("serial:"); + +static const auto baudRateParameterName = QStringLiteral("nmea.baudrate"); +static constexpr auto defaultBaudRate = 4800; + +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT + +// This class is used only for SerialPort devices, because we can't open the +// same serial port twice. +// In case of files and sockets it's easier to explicitly create a QIODevice for +// each new instance of Nmea*InfoSource. +// Also QFile can't be directly used with QIOPipe, because QFile is not a +// sequential device. +// TcpSocket could be used with QIOPipe, but it complicates error handling +// dramatically, as we would need to somehow forward socket errors through +// QIOPipes to the clients. +class IODeviceContainer +{ +public: + IODeviceContainer() {} + IODeviceContainer(IODeviceContainer const&) = delete; + void operator=(IODeviceContainer const&) = delete; + + QSharedPointer serial(const QString &portName, qint32 baudRate) + { + if (m_serialPorts.contains(portName)) { + m_serialPorts[portName].refs++; + QIOPipe *endPipe = new QIOPipe(m_serialPorts[portName].proxy); + m_serialPorts[portName].proxy->addChildPipe(endPipe); + return QSharedPointer(endPipe); + } + IODevice device; + QSerialPort *port = new QSerialPort(portName); + port->setBaudRate(baudRate); + qCDebug(lcNmea) << "Opening serial port" << portName << "with baudrate" << baudRate; + if (!port->open(QIODevice::ReadOnly)) { + qWarning("nmea: Failed to open %s", qPrintable(portName)); + delete port; + return {}; + } + qCDebug(lcNmea) << "Opened successfully"; + device.device = port; + device.refs = 1; + device.proxy = new QIOPipe(port, QIOPipe::ProxyPipe); + m_serialPorts[portName] = device; + QIOPipe *endPipe = new QIOPipe(device.proxy); + device.proxy->addChildPipe(endPipe); + return QSharedPointer(endPipe); + } + + void releaseSerial(const QString &portName, QSharedPointer &pipe) + { + if (!m_serialPorts.contains(portName)) + return; + + pipe.clear(); // make sure to release the pipe returned by getSerial, or else, if there are still refs, data will be leaked through it + IODevice &device = m_serialPorts[portName]; + if (device.refs > 1) { + device.refs--; + return; + } + + IODevice taken = m_serialPorts.take(portName); + taken.device->deleteLater(); + } + +private: + + struct IODevice { + QIODevice *device = nullptr; + QIOPipe *proxy = nullptr; // adding client pipes as children of proxy + // allows to dynamically add clients to one device. + unsigned int refs = 1; + }; + + QMap m_serialPorts; +}; + +Q_GLOBAL_STATIC(IODeviceContainer, deviceContainer) + +#endif // QT_NMEA_PLUGIN_HAS_SERIALPORT + +struct NmeaParameters +{ + explicit NmeaParameters(const QVariantMap ¶meters); + + QString source; + qint32 baudRate = defaultBaudRate; +}; + +NmeaParameters::NmeaParameters(const QVariantMap ¶meters) +{ + source = parameters.value(sourceParameterName).toString(); + bool ok = false; + const auto br = parameters.value(baudRateParameterName).toInt(&ok); + // According to QSerialPort::setBaudRate() documentation, we can pick any + // positive number as a baud rate. + if (ok && br > 0) + baudRate = br; +} + +// We use a string prefix to distinguish between the different data sources. +// "socket:" means that we use a socket connection +// "serial:" means that we use a serial port connection +// "file:///", "qrc:///" and just plain strings mean that we try to use local +// file. +// Note: if we do not specify anything, or specify "serial:" without specifying +// the port name, then we will try to search for a well-known serial port +// device. +class NmeaSource : public QNmeaPositionInfoSource +{ + Q_OBJECT +public: + NmeaSource(QObject *parent, const QVariantMap ¶meters); + NmeaSource(QObject *parent, const QString &fileName); + ~NmeaSource() override; + bool isValid() const + { + return !m_dataSource.isNull() || !m_fileSource.isNull() || !m_socket.isNull(); + } + +private slots: + void onSocketError(QAbstractSocket::SocketError error); + +private: + void processParameters(const NmeaParameters ¶meters); + void addSerialDevice(const QString &requestedPort, quint32 baudRate); + void setFileName(const QString &fileName); + void connectSocket(const QString &source); + + QSharedPointer m_dataSource; + QScopedPointer m_fileSource; + QScopedPointer m_socket; + QString m_sourceName; +}; + +NmeaSource::NmeaSource(QObject *parent, const QVariantMap ¶meters) + : QNmeaPositionInfoSource(RealTimeMode, parent) +{ + processParameters(NmeaParameters(parameters)); +} + +NmeaSource::NmeaSource(QObject *parent, const QString &fileName) + : QNmeaPositionInfoSource(SimulationMode, parent) +{ + setFileName(fileName); +} + +NmeaSource::~NmeaSource() +{ +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT + if (deviceContainer.exists()) + deviceContainer->releaseSerial(m_sourceName, m_dataSource); +#endif +} + +void NmeaSource::onSocketError(QAbstractSocket::SocketError error) +{ + m_socket->close(); + + switch (error) { + case QAbstractSocket::UnknownSocketError: + setError(QGeoPositionInfoSource::UnknownSourceError); + break; + case QAbstractSocket::SocketAccessError: + setError(QGeoPositionInfoSource::AccessError); + break; + case QAbstractSocket::RemoteHostClosedError: + setError(QGeoPositionInfoSource::ClosedError); + break; + default: + qWarning() << "Connection failed! QAbstractSocket::SocketError" << error; + // TODO - introduce new type of error. TransportError? + setError(QGeoPositionInfoSource::UnknownSourceError); + break; + } +} + +void NmeaSource::processParameters(const NmeaParameters ¶meters) +{ + if (parameters.source.startsWith(socketScheme)) { + // This is a socket + connectSocket(parameters.source); + } else { + // Last chance - this can be serial device. + // Note: File is handled in a separate case. + addSerialDevice(parameters.source, parameters.baudRate); + } +} + +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT +static QString tryFindSerialDevice(const QString &requestedPort) +{ + QString portName; + if (requestedPort.isEmpty()) { + const QList ports = QSerialPortInfo::availablePorts(); + qCDebug(lcNmea) << "Found" << ports.size() << "serial ports"; + if (ports.isEmpty()) { + qWarning("nmea: No serial ports found"); + return portName; + } + + // Try to find a well-known device. + QSet supportedDevices; + supportedDevices << 0x67b; // GlobalSat (BU-353S4 and probably others) + supportedDevices << 0xe8d; // Qstarz MTK II + for (const QSerialPortInfo& port : ports) { + if (port.hasVendorIdentifier() && supportedDevices.contains(port.vendorIdentifier())) { + portName = port.portName(); + break; + } + } + + if (portName.isEmpty()) { + qWarning("nmea: No known GPS device found."); + } + } else { + portName = requestedPort; + if (portName.startsWith(serialScheme)) + portName.remove(0, 7); + } + return portName; +} +#endif // QT_NMEA_PLUGIN_HAS_SERIALPORT + +void NmeaSource::addSerialDevice(const QString &requestedPort, quint32 baudRate) +{ +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT + m_sourceName = tryFindSerialDevice(requestedPort); + if (m_sourceName.isEmpty()) + return; + + m_dataSource = deviceContainer->serial(m_sourceName, baudRate); + if (!m_dataSource) + return; + + setDevice(m_dataSource.data()); +#else + Q_UNUSED(baudRate); + // As we are not calling setDevice(), the source will be invalid, so + // the factory methods will return nullptr. + qWarning() << "Plugin was built without serialport support!" + << requestedPort << "cannot be used!"; +#endif +} + +void NmeaSource::setFileName(const QString &fileName) +{ + m_sourceName = fileName; + + m_fileSource.reset(new QFile(fileName)); + qCDebug(lcNmea) << "Opening file" << fileName; + if (!m_fileSource->open(QIODevice::ReadOnly)) { + qWarning("nmea: failed to open file %s", qPrintable(fileName)); + m_fileSource.reset(); + } + + if (!m_fileSource) + return; + + qCDebug(lcNmea) << "Opened successfully"; + + setDevice(m_fileSource.data()); +} + +void NmeaSource::connectSocket(const QString &source) +{ + const QUrl url(source); + const QString host = url.host(); + const int port = url.port(); + if (!host.isEmpty() && (port > 0)) { + m_socket.reset(new QTcpSocket); + // no need to explicitly connect to connected() signal + connect(m_socket.get(), &QTcpSocket::errorOccurred, this, &NmeaSource::onSocketError); + m_socket->connectToHost(host, port, QTcpSocket::ReadOnly); + m_sourceName = source; + + setDevice(m_socket.data()); + } else { + qWarning("nmea: incorrect socket parameters %s:%d", qPrintable(host), port); + } +} + +class NmeaSatelliteSource : public QNmeaSatelliteInfoSource +{ + Q_OBJECT +public: + NmeaSatelliteSource(QObject *parent, const QVariantMap ¶meters); + NmeaSatelliteSource(QObject *parent, const QString &fileName, const QVariantMap ¶meters); + ~NmeaSatelliteSource(); + + bool isValid() const { return !m_port.isNull() || !m_file.isNull() || !m_socket.isNull(); } + +private slots: + void onSocketError(QAbstractSocket::SocketError error); + +private: + void processRealtimeParameters(const NmeaParameters ¶meters); + void parseSimulationSource(const QString &localFileName); + + QSharedPointer m_port; + QScopedPointer m_file; + QScopedPointer m_socket; + QString m_sourceName; +}; + +NmeaSatelliteSource::NmeaSatelliteSource(QObject *parent, const QVariantMap ¶meters) + : QNmeaSatelliteInfoSource(QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode, parent) +{ + processRealtimeParameters(NmeaParameters(parameters)); +} + +// We can use a QNmeaSatelliteInfoSource::SimulationUpdateInterval parameter to +// set the file read frequency in simulation mode. We use setBackendProperty() +// for it. The value can't be smaller than minimumUpdateInterval(). +// This check is done on the QNmeaSatelliteInfoSource level +NmeaSatelliteSource::NmeaSatelliteSource(QObject *parent, const QString &fileName, + const QVariantMap ¶meters) + : QNmeaSatelliteInfoSource(QNmeaSatelliteInfoSource::UpdateMode::SimulationMode, parent) +{ + bool ok = false; + const int interval = + parameters.value(QNmeaSatelliteInfoSource::SimulationUpdateInterval).toInt(&ok); + if (ok) + setBackendProperty(QNmeaSatelliteInfoSource::SimulationUpdateInterval, interval); + parseSimulationSource(fileName); +} + +NmeaSatelliteSource::~NmeaSatelliteSource() +{ +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT + if (deviceContainer.exists()) + deviceContainer->releaseSerial(m_sourceName, m_port); +#endif +} + +void NmeaSatelliteSource::onSocketError(QAbstractSocket::SocketError error) +{ + m_socket->close(); + + switch (error) { + case QAbstractSocket::UnknownSocketError: + setError(QGeoSatelliteInfoSource::UnknownSourceError); + break; + case QAbstractSocket::SocketAccessError: + setError(QGeoSatelliteInfoSource::AccessError); + break; + case QAbstractSocket::RemoteHostClosedError: + setError(QGeoSatelliteInfoSource::ClosedError); + break; + default: + qWarning() << "Connection failed! QAbstractSocket::SocketError" << error; + // TODO - introduce new type of error. TransportError? + setError(QGeoSatelliteInfoSource::UnknownSourceError); + break; + } +} + +void NmeaSatelliteSource::processRealtimeParameters(const NmeaParameters ¶meters) +{ + const QString source = parameters.source; + if (source.startsWith(socketScheme)) { + // This is a socket. + const QUrl url(source); + const QString host = url.host(); + const int port = url.port(); + if (!host.isEmpty() && (port > 0)) { + m_socket.reset(new QTcpSocket); + // no need to explicitly connect to connected() signal + connect(m_socket.get(), &QTcpSocket::errorOccurred, + this, &NmeaSatelliteSource::onSocketError); + m_socket->connectToHost(host, port, QTcpSocket::ReadOnly); + m_sourceName = source; + + setDevice(m_socket.data()); + } else { + qWarning("nmea: incorrect socket parameters %s:%d", qPrintable(host), port); + } + } else { +#ifdef QT_NMEA_PLUGIN_HAS_SERIALPORT + // Last chance - this can be serial device. + m_sourceName = tryFindSerialDevice(source); + if (m_sourceName.isEmpty()) + return; + + m_port = deviceContainer->serial(m_sourceName, parameters.baudRate); + if (!m_port) + return; + + setDevice(m_port.data()); +#else + // As we are not calling setDevice(), the source will be invalid, so + // the factory methods will return nullptr. + qWarning() << "Plugin was built without serialport support!" + << source << "cannot be used!"; +#endif // QT_NMEA_PLUGIN_HAS_SERIALPORT + } +} + +void NmeaSatelliteSource::parseSimulationSource(const QString &localFileName) +{ + // This is a text file. + m_sourceName = localFileName; + + qCDebug(lcNmea) << "Opening file" << localFileName; + m_file.reset(new QFile(localFileName)); + if (!m_file->open(QIODevice::ReadOnly)) { + qWarning("nmea: failed to open file %s", qPrintable(localFileName)); + m_file.reset(); + return; + } + qCDebug(lcNmea) << "Opened successfully"; + + setDevice(m_file.data()); +} + +/*! + \internal + Returns a local file name if \a source represents it. + The returned value can be different from \a source, as the method tries to + modify the path +*/ +static QString checkSourceIsFile(const QString &source) +{ + if (source.isEmpty()) + return QString(); + + QString localFileName = source; + + if (!QFile::exists(localFileName)) { + if (localFileName.startsWith(QStringLiteral("qrc:///"))) + localFileName.remove(0, 7); + else if (localFileName.startsWith(QStringLiteral("file:///"))) + localFileName.remove(0, 7); + else if (localFileName.startsWith(QStringLiteral("qrc:/"))) + localFileName.remove(0, 5); + + if (!QFile::exists(localFileName) && localFileName.startsWith(QLatin1Char('/'))) + localFileName.remove(0, 1); + } + if (!QFile::exists(localFileName)) + localFileName.prepend(QLatin1Char(':')); + + const bool isLocalFile = QFile::exists(localFileName); + return isLocalFile ? localFileName : QString(); +} + +/*! + \internal + Returns a local file name if file exists, or an empty string otherwise +*/ +static QString extractLocalFileName(const QVariantMap ¶meters) +{ + QString localFileName = parameters.value(sourceParameterName).toString(); + return checkSourceIsFile(localFileName); +} + +QGeoPositionInfoSource *QGeoPositionInfoSourceFactoryNmea::positionInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + std::unique_ptr src = nullptr; + + const QString localFileName = extractLocalFileName(parameters); + if (localFileName.isEmpty()) + src = std::make_unique(parent, parameters); // use RealTimeMode + else + src = std::make_unique(parent, localFileName); // use SimulationMode + + return (src && src->isValid()) ? src.release() : nullptr; +} + +QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactoryNmea::satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + std::unique_ptr src = nullptr; + + const QString localFileName = extractLocalFileName(parameters); + if (localFileName.isEmpty()) { + // use RealTimeMode + src = std::make_unique(parent, parameters); + } else { + // use SimulationMode + src = std::make_unique(parent, localFileName, parameters); + } + return (src && src->isValid()) ? src.release() : nullptr; +} + +QGeoAreaMonitorSource *QGeoPositionInfoSourceFactoryNmea::areaMonitor(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent); + Q_UNUSED(parameters); + return nullptr; +} + +QT_END_NAMESPACE + +#include "moc_qgeopositioninfosourcefactory_nmea.cpp" +#include "qgeopositioninfosourcefactory_nmea.moc" diff --git a/src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.h b/src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.h new file mode 100644 index 0000000..d3cae3b --- /dev/null +++ b/src/plugins/position/nmea/qgeopositioninfosourcefactory_nmea.h @@ -0,0 +1,27 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOSITIONINFOSOURCEFACTORY_NMEA_H +#define QGEOPOSITIONINFOSOURCEFACTORY_NMEA_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoPositionInfoSourceFactoryNmea : public QObject, public QGeoPositionInfoSourceFactory +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0" + FILE "plugin.json") + Q_INTERFACES(QGeoPositionInfoSourceFactory) + +public: + QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/plugins/position/nmea/qiopipe.cpp b/src/plugins/position/nmea/qiopipe.cpp new file mode 100644 index 0000000..6d4075c --- /dev/null +++ b/src/plugins/position/nmea/qiopipe.cpp @@ -0,0 +1,164 @@ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qiopipe_p.h" +#include +#include + +QT_BEGIN_NAMESPACE + +/* + proxying means do *not* emit readyRead, and instead pump data + into child pipes directly in a zero-copy fashion. +*/ +QIOPipePrivate::QIOPipePrivate(QIODevice *iodevice, bool proxying) + : m_proxying(proxying), source(iodevice) +{ +} + +QIOPipePrivate::~QIOPipePrivate() +{ +} + +void QIOPipePrivate::initialize() +{ + const QIOPipe *parentPipe = qobject_cast(source); + if (parentPipe && parentPipe->d_func()->m_proxying) // with proxying parent, + return; // don't do anything + + // read available data, does not emit. + readAvailableData(); + // connect readyRead to onReadyRead + QObjectPrivate::connect(source, &QIODevice::readyRead, this, &QIOPipePrivate::_q_onReadyRead); +} + +bool QIOPipePrivate::readAvailableData() { + if (!source) + return false; + QByteArray ba = source->readAll(); + if (ba.isEmpty()) + return false; + + pumpData(ba); + return true; +} + +void QIOPipePrivate::pumpData(const QByteArray &ba) +{ + if (m_proxying) { + auto isNull = [](const auto &cp) { return cp == nullptr; }; + childPipes.removeIf(isNull); + for (const auto &cp : std::as_const(childPipes)) + cp->d_func()->pushData(ba); + } else { + for (auto &buffer : readBuffers) + buffer.append(ba); + } +} + +void QIOPipePrivate::pushData(const QByteArray &ba) +{ + Q_Q(QIOPipe); + if (ba.isEmpty()) + return; + + pumpData(ba); + if (!m_proxying) + emit q->readyRead(); +} + +void QIOPipePrivate::_q_onReadyRead() +{ + Q_Q(QIOPipe); + if (readAvailableData() && !m_proxying) + emit q->readyRead(); +} + +void QIOPipePrivate::addChildPipe(QIOPipe *childPipe) +{ + if (childPipes.contains(childPipe)) + return; + childPipes.append(childPipe); +} + +void QIOPipePrivate::removeChildPipe(QIOPipe *childPipe) +{ + childPipes.removeOne(childPipe); +} + +QIOPipe::QIOPipe(QIODevice *parent, Mode mode) + : QIODevice(*new QIOPipePrivate(parent, mode == ProxyPipe), parent) +{ + this->d_func()->initialize(); + if (!parent->isOpen() && !parent->open(QIODevice::ReadOnly)) { + qWarning() << "QIOPipe: Failed to open " << parent; + return; + } + open(ReadOnly); +} + +QIOPipe::~QIOPipe() +{ + +} + +bool QIOPipe::open(QIODevice::OpenMode mode) +{ + if (isOpen()) + return true; + + static const OpenMode supportedOpenMode = ReadOnly; // Currently limit it to read only + if (!(mode & supportedOpenMode)) { + qFatal("Unsupported open mode"); + return false; + } + + return QIODevice::open(mode); +} + +bool QIOPipe::isSequential() const +{ + return true; +} + +void QIOPipe::setReadChannelCount(int count) +{ + Q_D(QIOPipe); + d->setReadChannelCount(qMax(count, 1)); +} + +void QIOPipe::addChildPipe(QIOPipe *childPipe) +{ + Q_D(QIOPipe); + d->addChildPipe(childPipe); +} + +/*! + \reimp + + \omit + This function does not really read anything, as we use QIODevicePrivate's + buffer. The buffer will be read inside of QIODevice before this + method will be called. + See QIODevicePrivate::read, buffer.read(data, maxSize). + \endomit +*/ +qint64 QIOPipe::readData(char *data, qint64 maxlen) +{ + Q_UNUSED(data); + Q_UNUSED(maxlen); + + // return 0 indicating there may be more data in the future + // Returning -1 means no more data in the future (end of stream). + return qint64(0); +} + +qint64 QIOPipe::writeData(const char * /*data*/, qint64 /*len*/) +{ + qFatal("QIOPipe is a read-only device"); + return qint64(0); +} + +QT_END_NAMESPACE + +#include "moc_qiopipe_p.cpp" diff --git a/src/plugins/position/nmea/qiopipe_p.h b/src/plugins/position/nmea/qiopipe_p.h new file mode 100644 index 0000000..be945f1 --- /dev/null +++ b/src/plugins/position/nmea/qiopipe_p.h @@ -0,0 +1,79 @@ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QIOPIPE_P_H +#define QIOPIPE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QObject; +class QIOPipePrivate; + +class QIOPipe : public QIODevice +{ + Q_OBJECT + +public: + enum Mode { + EndPipe = 0x0000, + ProxyPipe = 0x0001 + }; + + explicit QIOPipe(QIODevice *parent, Mode mode = EndPipe); + ~QIOPipe() override; + + bool open(OpenMode openMode) override; + bool isSequential() const override; + void setReadChannelCount(int count); + void addChildPipe(QIOPipe *childPipe); + +protected: + qint64 readData(char *data, qint64 maxlen) override; + qint64 writeData(const char *data, qint64 len) override; + +private: + Q_DECLARE_PRIVATE(QIOPipe) + Q_DISABLE_COPY(QIOPipe) +}; + +class QIOPipePrivate : public QIODevicePrivate +{ +public: + Q_DECLARE_PUBLIC(QIOPipe) + + explicit QIOPipePrivate(QIODevice *iodevice, bool proxying); + ~QIOPipePrivate() override; + + void initialize(); + bool readAvailableData(); + void pumpData(const QByteArray &ba); + void pushData(const QByteArray &ba); + void _q_onReadyRead(); + void addChildPipe(QIOPipe *childPipe); + void removeChildPipe(QIOPipe *childPipe); + + bool m_proxying = false; + QPointer source; + QList> childPipes; +}; + +QT_END_NAMESPACE + +#endif // QIOPIPE_P_H + diff --git a/src/plugins/position/positionpoll/CMakeLists.txt b/src/plugins/position/positionpoll/CMakeLists.txt new file mode 100644 index 0000000..9b70584 --- /dev/null +++ b/src/plugins/position/positionpoll/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from positionpoll.pro. + +##################################################################### +## QGeoPositionInfoSourceFactoryPoll Plugin: +##################################################################### + +qt_internal_add_plugin(QGeoPositionInfoSourceFactoryPollPlugin + OUTPUT_NAME qtposition_positionpoll + CLASS_NAME QGeoPositionInfoSourceFactoryPoll + PLUGIN_TYPE position + SOURCES + positionpollfactory.cpp positionpollfactory.h + qgeoareamonitor_polling.cpp qgeoareamonitor_polling.h + LIBRARIES + Qt::Core + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:positionpoll.pro:: +# OTHER_FILES = "plugin.json" diff --git a/src/plugins/position/positionpoll/plugin.json b/src/plugins/position/positionpoll/plugin.json new file mode 100644 index 0000000..df1f47d --- /dev/null +++ b/src/plugins/position/positionpoll/plugin.json @@ -0,0 +1,9 @@ +{ + "Keys": ["positionpoll"], + "Provider": "positionpoll", + "Position": false, + "Satellite": false, + "Monitor": true, + "Priority": 1000, + "Testable": true +} diff --git a/src/plugins/position/positionpoll/positionpollfactory.cpp b/src/plugins/position/positionpoll/positionpollfactory.cpp new file mode 100644 index 0000000..d9da674 --- /dev/null +++ b/src/plugins/position/positionpoll/positionpollfactory.cpp @@ -0,0 +1,35 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "positionpollfactory.h" +#include "qgeoareamonitor_polling.h" + +QT_BEGIN_NAMESPACE + +QGeoPositionInfoSource *QGeoPositionInfoSourceFactoryPoll::positionInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent) + Q_UNUSED(parameters) + return nullptr; +} + +QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactoryPoll::satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent) + Q_UNUSED(parameters) + return nullptr; +} + +QGeoAreaMonitorSource *QGeoPositionInfoSourceFactoryPoll::areaMonitor(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parameters) + QGeoAreaMonitorPolling *ret = new QGeoAreaMonitorPolling(parent); + if (ret && ret->isValid()) + return ret; + delete ret; + return nullptr; +} + +QT_END_NAMESPACE + +#include "moc_positionpollfactory.cpp" diff --git a/src/plugins/position/positionpoll/positionpollfactory.h b/src/plugins/position/positionpoll/positionpollfactory.h new file mode 100644 index 0000000..d7eba9a --- /dev/null +++ b/src/plugins/position/positionpoll/positionpollfactory.h @@ -0,0 +1,26 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef POSITIONPOLLFACTORY_H +#define POSITIONPOLLFACTORY_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoPositionInfoSourceFactoryPoll : public QObject, public QGeoPositionInfoSourceFactory +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0" + FILE "plugin.json") + Q_INTERFACES(QGeoPositionInfoSourceFactory) +public: + QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override; +}; + +QT_END_NAMESPACE + +#endif // POSITIONPOLLFACTORY_H diff --git a/src/plugins/position/positionpoll/qgeoareamonitor_polling.cpp b/src/plugins/position/positionpoll/qgeoareamonitor_polling.cpp new file mode 100644 index 0000000..6b67841 --- /dev/null +++ b/src/plugins/position/positionpoll/qgeoareamonitor_polling.cpp @@ -0,0 +1,476 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeoareamonitor_polling.h" +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#define UPDATE_INTERVAL_5S 5000 + +typedef QHash MonitorTable; + + +static QMetaMethod areaEnteredSignal() +{ + static QMetaMethod signal = QMetaMethod::fromSignal(&QGeoAreaMonitorPolling::areaEntered); + return signal; +} + +static QMetaMethod areaExitedSignal() +{ + static QMetaMethod signal = QMetaMethod::fromSignal(&QGeoAreaMonitorPolling::areaExited); + return signal; +} + +static QMetaMethod monitorExpiredSignal() +{ + static QMetaMethod signal = QMetaMethod::fromSignal(&QGeoAreaMonitorPolling::monitorExpired); + return signal; +} + +class QGeoAreaMonitorPollingPrivate : public QObject +{ + Q_OBJECT +public: + QGeoAreaMonitorPollingPrivate() + { + nextExpiryTimer = new QTimer(this); + nextExpiryTimer->setSingleShot(true); + connect(nextExpiryTimer, SIGNAL(timeout()), + this, SLOT(timeout())); + } + + void startMonitoring(const QGeoAreaMonitorInfo &monitor) + { + const std::lock_guard locker(mutex); + + activeMonitorAreas.insert(monitor.identifier(), monitor); + singleShotTrigger.remove(monitor.identifier()); + + checkStartStop(); + setupNextExpiryTimeout(); + } + + void requestUpdate(const QGeoAreaMonitorInfo &monitor, int signalId) + { + const std::lock_guard locker(mutex); + + activeMonitorAreas.insert(monitor.identifier(), monitor); + singleShotTrigger.insert(monitor.identifier(), signalId); + + checkStartStop(); + setupNextExpiryTimeout(); + } + + QGeoAreaMonitorInfo stopMonitoring(const QGeoAreaMonitorInfo &monitor) + { + const std::lock_guard locker(mutex); + + QGeoAreaMonitorInfo mon = activeMonitorAreas.take(monitor.identifier()); + + checkStartStop(); + setupNextExpiryTimeout(); + + return mon; + } + + void registerClient(QGeoAreaMonitorPolling *client) + { + const std::lock_guard locker(mutex); + + connect(this, SIGNAL(timeout(QGeoAreaMonitorInfo)), + client, SLOT(timeout(QGeoAreaMonitorInfo))); + + connect(this, SIGNAL(positionError(QGeoPositionInfoSource::Error)), + client, SLOT(positionError(QGeoPositionInfoSource::Error))); + + connect(this, SIGNAL(areaEventDetected(QGeoAreaMonitorInfo,QGeoPositionInfo,bool)), + client, SLOT(processAreaEvent(QGeoAreaMonitorInfo,QGeoPositionInfo,bool))); + + registeredClients.append(client); + } + + void deregisterClient(QGeoAreaMonitorPolling *client) + { + const std::lock_guard locker(mutex); + + registeredClients.removeAll(client); + if (registeredClients.isEmpty()) + checkStartStop(); + } + + void setPositionSource(QGeoPositionInfoSource *newSource) + { + const std::lock_guard locker(mutex); + + if (newSource == source) + return; + + if (source) + delete source; + + source = newSource; + + if (source) { + source->setParent(this); + source->moveToThread(this->thread()); + if (source->updateInterval() == 0) + source->setUpdateInterval(UPDATE_INTERVAL_5S); + disconnect(source, 0, 0, 0); //disconnect all + connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)), + this, SLOT(positionUpdated(QGeoPositionInfo))); + connect(source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error)), + this, SIGNAL(positionError(QGeoPositionInfoSource::Error))); + checkStartStop(); + } + } + + QGeoPositionInfoSource* positionSource() const + { + const std::lock_guard locker(mutex); + return source; + } + + MonitorTable activeMonitors() const + { + const std::lock_guard locker(mutex); + + return activeMonitorAreas; + } + + void checkStartStop() + { + const std::lock_guard locker(mutex); + + bool signalsConnected = false; + for (const QGeoAreaMonitorPolling *client : std::as_const(registeredClients)) { + if (client->hasConnections()) { + signalsConnected = true; + break; + } + } + + if (signalsConnected && !activeMonitorAreas.isEmpty()) { + if (source) + source->startUpdates(); + else + //translated to InsufficientPositionInfo + emit positionError(QGeoPositionInfoSource::ClosedError); + } else { + if (source) + source->stopUpdates(); + } + } + +private: + void setupNextExpiryTimeout() + { + nextExpiryTimer->stop(); + activeExpiry.first = QDateTime(); + activeExpiry.second = QString(); + + const auto infos = activeMonitors(); + for (const QGeoAreaMonitorInfo &info : infos) { + if (info.expiration().isValid()) { + if (!activeExpiry.first.isValid()) { + activeExpiry.first = info.expiration(); + activeExpiry.second = info.identifier(); + continue; + } + if (info.expiration() < activeExpiry.first) { + activeExpiry.first = info.expiration(); + activeExpiry.second = info.identifier(); + } + } + } + + if (activeExpiry.first.isValid()) + nextExpiryTimer->start(QDateTime::currentDateTime().msecsTo(activeExpiry.first)); + } + + + //returns true if areaEntered should be emitted + bool processInsideArea(const QString &monitorIdent) + { + if (!insideArea.contains(monitorIdent)) { + if (singleShotTrigger.value(monitorIdent, -1) == areaEnteredSignal().methodIndex()) { + //this is the finishing singleshot event + singleShotTrigger.remove(monitorIdent); + activeMonitorAreas.remove(monitorIdent); + setupNextExpiryTimeout(); + } else { + insideArea.insert(monitorIdent); + } + return true; + } + + return false; + } + + //returns true if areaExited should be emitted + bool processOutsideArea(const QString &monitorIdent) + { + if (insideArea.contains(monitorIdent)) { + if (singleShotTrigger.value(monitorIdent, -1) == areaExitedSignal().methodIndex()) { + //this is the finishing singleShot event + singleShotTrigger.remove(monitorIdent); + activeMonitorAreas.remove(monitorIdent); + setupNextExpiryTimeout(); + } else { + insideArea.remove(monitorIdent); + } + return true; + } + return false; + } + + + +Q_SIGNALS: + void timeout(const QGeoAreaMonitorInfo &info); + void positionError(const QGeoPositionInfoSource::Error error); + void areaEventDetected(const QGeoAreaMonitorInfo &minfo, + const QGeoPositionInfo &pinfo, bool isEnteredEvent); +private Q_SLOTS: + void timeout() + { + /* + * Don't block timer firing even if monitorExpiredSignal is not connected. + * This allows us to continue to remove the existing monitors as they expire. + **/ + const QGeoAreaMonitorInfo info = activeMonitorAreas.take(activeExpiry.second); + setupNextExpiryTimeout(); + emit timeout(info); + + } + + void positionUpdated(const QGeoPositionInfo &info) + { + const auto monInfos = activeMonitors(); + for (const QGeoAreaMonitorInfo &monInfo : monInfos) { + const QString identifier = monInfo.identifier(); + if (monInfo.area().contains(info.coordinate())) { + if (processInsideArea(identifier)) + emit areaEventDetected(monInfo, info, true); + } else { + if (processOutsideArea(identifier)) + emit areaEventDetected(monInfo, info, false); + } + } + } + +private: + QPair activeExpiry; + QHash singleShotTrigger; + QTimer* nextExpiryTimer; + QSet insideArea; + + MonitorTable activeMonitorAreas; + + QGeoPositionInfoSource* source = nullptr; + QList registeredClients; + mutable QRecursiveMutex mutex; +}; + +Q_GLOBAL_STATIC(QGeoAreaMonitorPollingPrivate, pollingPrivate) + +QGeoAreaMonitorPolling::QGeoAreaMonitorPolling(QObject *parent) : QGeoAreaMonitorSource(parent) +{ + d = pollingPrivate(); + d->registerClient(this); + //hookup to default source if existing + if (!positionInfoSource()) + setPositionInfoSource(QGeoPositionInfoSource::createDefaultSource(this)); +} + +QGeoAreaMonitorPolling::~QGeoAreaMonitorPolling() +{ + d->deregisterClient(this); +} + +QGeoPositionInfoSource* QGeoAreaMonitorPolling::positionInfoSource() const +{ + return d->positionSource(); +} + +void QGeoAreaMonitorPolling::setPositionInfoSource(QGeoPositionInfoSource *source) +{ + d->setPositionSource(source); +} + +QGeoAreaMonitorSource::Error QGeoAreaMonitorPolling::error() const +{ + return lastError; +} + +bool QGeoAreaMonitorPolling::startMonitoring(const QGeoAreaMonitorInfo &monitor) +{ + if (!monitor.isValid()) + return false; + + //reject an expiry in the past + if (monitor.expiration().isValid() && + (monitor.expiration() < QDateTime::currentDateTime())) + return false; + + //don't accept persistent monitor since we don't support it + if (monitor.isPersistent()) + return false; + + lastError = QGeoAreaMonitorSource::NoError; + + //update or insert + d->startMonitoring(monitor); + + return true; +} + +int QGeoAreaMonitorPolling::idForSignal(const char *signal) +{ + const QByteArray sig = QMetaObject::normalizedSignature(signal + 1); + const QMetaObject * const mo = metaObject(); + + return mo->indexOfSignal(sig.constData()); +} + +bool QGeoAreaMonitorPolling::hasConnections() const +{ + // This method is internal and requires the mutex to be already locked. + return signalConnections > 0; +} + +bool QGeoAreaMonitorPolling::requestUpdate(const QGeoAreaMonitorInfo &monitor, const char *signal) +{ + if (!monitor.isValid()) + return false; + //reject an expiry in the past + if (monitor.expiration().isValid() && + (monitor.expiration() < QDateTime::currentDateTime())) + return false; + + //don't accept persistent monitor since we don't support it + if (monitor.isPersistent()) + return false; + + if (!signal) + return false; + + const int signalId = idForSignal(signal); + if (signalId < 0) + return false; + + //only accept area entered or exit signal + if (signalId != areaEnteredSignal().methodIndex() && + signalId != areaExitedSignal().methodIndex()) + { + return false; + } + + lastError = QGeoAreaMonitorSource::NoError; + + d->requestUpdate(monitor, signalId); + + return true; +} + +bool QGeoAreaMonitorPolling::stopMonitoring(const QGeoAreaMonitorInfo &monitor) +{ + QGeoAreaMonitorInfo info = d->stopMonitoring(monitor); + + return info.isValid(); +} + +QList QGeoAreaMonitorPolling::activeMonitors() const +{ + return d->activeMonitors().values(); +} + +QList QGeoAreaMonitorPolling::activeMonitors(const QGeoShape ®ion) const +{ + QList results; + if (region.isEmpty()) + return results; + + const MonitorTable list = d->activeMonitors(); + for (const QGeoAreaMonitorInfo &monitor : list) { + if (region.contains(monitor.area().center())) + results.append(monitor); + } + + return results; +} + +QGeoAreaMonitorSource::AreaMonitorFeatures QGeoAreaMonitorPolling::supportedAreaMonitorFeatures() const +{ + return {}; +} + +void QGeoAreaMonitorPolling::connectNotify(const QMetaMethod &signal) +{ + QMutexLocker locker(&connectionMutex); + if (signal == areaEnteredSignal() || signal == areaExitedSignal()) { + const bool alreadyConnected = hasConnections(); + signalConnections++; + if (!alreadyConnected) + d->checkStartStop(); + } +} + +void QGeoAreaMonitorPolling::disconnectNotify(const QMetaMethod &signal) +{ + QMutexLocker locker(&connectionMutex); + if (signal == areaEnteredSignal() || signal == areaExitedSignal()) { + if (hasConnections()) + signalConnections--; + if (!hasConnections()) + d->checkStartStop(); + } +} + +void QGeoAreaMonitorPolling::positionError(const QGeoPositionInfoSource::Error error) +{ + switch (error) { + case QGeoPositionInfoSource::AccessError: + lastError = QGeoAreaMonitorSource::AccessError; + break; + case QGeoPositionInfoSource::UnknownSourceError: + lastError = QGeoAreaMonitorSource::UnknownSourceError; + break; + case QGeoPositionInfoSource::ClosedError: + case QGeoPositionInfoSource::UpdateTimeoutError: + lastError = QGeoAreaMonitorSource::InsufficientPositionInfo; + break; + case QGeoPositionInfoSource::NoError: + return; + } + + emit QGeoAreaMonitorSource::errorOccurred(lastError); +} + +void QGeoAreaMonitorPolling::timeout(const QGeoAreaMonitorInfo& monitor) +{ + if (isSignalConnected(monitorExpiredSignal())) + emit monitorExpired(monitor); +} + +void QGeoAreaMonitorPolling::processAreaEvent(const QGeoAreaMonitorInfo &minfo, + const QGeoPositionInfo &pinfo, bool isEnteredEvent) +{ + if (isEnteredEvent) + emit areaEntered(minfo, pinfo); + else + emit areaExited(minfo, pinfo); +} + +#include "qgeoareamonitor_polling.moc" +#include "moc_qgeoareamonitor_polling.cpp" diff --git a/src/plugins/position/positionpoll/qgeoareamonitor_polling.h b/src/plugins/position/positionpoll/qgeoareamonitor_polling.h new file mode 100644 index 0000000..3bee9d8 --- /dev/null +++ b/src/plugins/position/positionpoll/qgeoareamonitor_polling.h @@ -0,0 +1,64 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOAREAMONITORPOLLING_H +#define QGEOAREAMONITORPOLLING_H + +#include +#include +#include + +/** + * QGeoAreaMonitorPolling + * + */ + +class QGeoAreaMonitorPollingPrivate; +class QGeoAreaMonitorPolling : public QGeoAreaMonitorSource +{ + Q_OBJECT +public : + explicit QGeoAreaMonitorPolling(QObject *parent = 0); + ~QGeoAreaMonitorPolling(); + + void setPositionInfoSource(QGeoPositionInfoSource *source) override; + QGeoPositionInfoSource* positionInfoSource() const override; + + Error error() const override; + + bool startMonitoring(const QGeoAreaMonitorInfo &monitor) override; + bool requestUpdate(const QGeoAreaMonitorInfo &monitor, + const char *signal) override; + bool stopMonitoring(const QGeoAreaMonitorInfo &monitor) override; + + QList activeMonitors() const override; + QList activeMonitors(const QGeoShape ®ion) const override; + + QGeoAreaMonitorSource::AreaMonitorFeatures supportedAreaMonitorFeatures() const override; + + inline bool isValid() { return positionInfoSource(); } + +private Q_SLOTS: + void positionError(QGeoPositionInfoSource::Error error); + void timeout(const QGeoAreaMonitorInfo &monitor); + void processAreaEvent(const QGeoAreaMonitorInfo &minfo, const QGeoPositionInfo &pinfo, bool isEnteredEvent); + +private: + QGeoAreaMonitorPollingPrivate* d; + QGeoAreaMonitorSource::Error lastError = QGeoAreaMonitorSource::NoError; + friend class QGeoAreaMonitorPollingPrivate; + + int signalConnections = 0; + // connectNotify() and disconnectNotify() can be called from a different + // thread, so we need to synchronize the access to signalConnections + QMutex connectionMutex; + + void connectNotify(const QMetaMethod &signal) override; + void disconnectNotify(const QMetaMethod &signal) override; + + int idForSignal(const char *signal); + + bool hasConnections() const; +}; + +#endif // QGEOAREAMONITORPOLLING_H diff --git a/src/plugins/position/winrt/CMakeLists.txt b/src/plugins/position/winrt/CMakeLists.txt new file mode 100644 index 0000000..d41fb1c --- /dev/null +++ b/src/plugins/position/winrt/CMakeLists.txt @@ -0,0 +1,32 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from winrt.pro. + +##################################################################### +## QGeoPositionInfoSourceFactoryWinRT Plugin: +##################################################################### + +qt_internal_add_plugin(QGeoPositionInfoSourceFactoryWinRTPlugin + OUTPUT_NAME qtposition_winrt + CLASS_NAME QGeoPositionInfoSourceFactoryWinRT + PLUGIN_TYPE position + SOURCES + qgeopositioninfosource_winrt.cpp qgeopositioninfosource_winrt_p.h + qgeopositioninfosourcefactory_winrt.cpp qgeopositioninfosourcefactory_winrt.h + LIBRARIES + Qt::Core + Qt::CorePrivate + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:winrt.pro:: +# OTHER_FILES = "plugin.json" + +## Scopes: +##################################################################### + +qt_internal_extend_target(QGeoPositionInfoSourceFactoryWinRTPlugin CONDITION MSVC AND NOT WINRT + LIBRARIES + runtimeobject +) diff --git a/src/plugins/position/winrt/plugin.json b/src/plugins/position/winrt/plugin.json new file mode 100644 index 0000000..0696cb0 --- /dev/null +++ b/src/plugins/position/winrt/plugin.json @@ -0,0 +1,9 @@ +{ + "Keys": ["winrt"], + "Provider": "winrt", + "Position": true, + "Satellite": false, + "Monitor" : false, + "Priority": 1000, + "Testable": false +} diff --git a/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp b/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp new file mode 100644 index 0000000..06eb080 --- /dev/null +++ b/src/plugins/position/winrt/qgeopositioninfosource_winrt.cpp @@ -0,0 +1,622 @@ +// Copyright (C) 2015 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeopositioninfosource_winrt_p.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace Microsoft::WRL; +using namespace Microsoft::WRL::Wrappers; +using namespace ABI::Windows::Devices::Geolocation; +using namespace ABI::Windows::Foundation; +using namespace ABI::Windows::Foundation::Collections; + +typedef ITypedEventHandler GeoLocatorPositionHandler; +typedef ITypedEventHandler GeoLocatorStatusHandler; +typedef IAsyncOperationCompletedHandler PositionHandler; +typedef IAsyncOperationCompletedHandler AccessHandler; + +Q_DECLARE_LOGGING_CATEGORY(lcPositioningWinRT) + +Q_DECLARE_METATYPE(QGeoPositionInfoSource::Error) + +QT_BEGIN_NAMESPACE + +static inline HRESULT await(const ComPtr> &asyncOp, + GeolocationAccessStatus *result) +{ + ComPtr asyncInfo; + HRESULT hr = asyncOp.As(&asyncInfo); + if (FAILED(hr)) + return hr; + + AsyncStatus status; + while (SUCCEEDED(hr = asyncInfo->get_Status(&status)) && status == AsyncStatus::Started) + QThread::yieldCurrentThread(); + + if (FAILED(hr) || status != AsyncStatus::Completed) { + HRESULT ec; + hr = asyncInfo->get_ErrorCode(&ec); + if (FAILED(hr)) + return hr; + hr = asyncInfo->Close(); + if (FAILED(hr)) + return hr; + return ec; + } + + if (FAILED(hr)) + return hr; + + return asyncOp->GetResults(result); +} + +enum class InitializationState { + Uninitialized, + Initializing, + Initialized +}; + +class QGeoPositionInfoSourceWinRTPrivate { +public: + ComPtr locator; + mutable ComPtr statics; + QTimer periodicTimer; + QTimer singleUpdateTimer; + QGeoPositionInfo lastPosition; + QGeoPositionInfoSource::Error positionError = QGeoPositionInfoSource::NoError; + EventRegistrationToken statusToken; + EventRegistrationToken positionToken; + QMutex mutex; + bool updatesOngoing = false; + int minimumUpdateInterval = -1; + int updateInterval = -1; + InitializationState initState = InitializationState::Uninitialized; + + PositionStatus positionStatus = PositionStatus_NotInitialized; +}; + +QGeoPositionInfoSourceWinRT::QGeoPositionInfoSourceWinRT(QObject *parent) + : QGeoPositionInfoSource(parent) + , d_ptr(new QGeoPositionInfoSourceWinRTPrivate) +{ + qRegisterMetaType(); + qCDebug(lcPositioningWinRT) << __FUNCTION__; + CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + Q_D(QGeoPositionInfoSourceWinRT); + d->positionError = QGeoPositionInfoSource::NoError; + d->updatesOngoing = false; + d->positionToken.value = 0; + d->statusToken.value = 0; +} + +QGeoPositionInfoSourceWinRT::~QGeoPositionInfoSourceWinRT() +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__; + CoUninitialize(); +} + +int QGeoPositionInfoSourceWinRT::init() +{ + Q_D(QGeoPositionInfoSourceWinRT); + Q_ASSERT(d->initState != InitializationState::Initializing); + if (d->initState == InitializationState::Initialized) + return 0; + + qCDebug(lcPositioningWinRT) << __FUNCTION__; + d->initState = InitializationState::Initializing; + if (!requestAccess()) { + d->initState = InitializationState::Uninitialized; + setError(QGeoPositionInfoSource::AccessError); + qWarning ("Location access failed."); + return -1; + } + HRESULT hr = [this, d]() { + HRESULT hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Devices_Geolocation_Geolocator).Get(), + &d->locator); + RETURN_HR_IF_FAILED("Could not initialize native location services."); + + if (d->minimumUpdateInterval == -1) { + UINT32 interval; + hr = d->locator->get_ReportInterval(&interval); + RETURN_HR_IF_FAILED("Could not retrieve report interval."); + d->minimumUpdateInterval = static_cast(interval); + } + if (d->updateInterval == -1) + d->updateInterval = d->minimumUpdateInterval; + setUpdateInterval(d->updateInterval); + + return hr; + }(); + if (FAILED(hr)) { + d->initState = InitializationState::Uninitialized; + setError(QGeoPositionInfoSource::UnknownSourceError); + return -1; + } + + d->periodicTimer.setSingleShot(true); + connect(&d->periodicTimer, &QTimer::timeout, this, &QGeoPositionInfoSourceWinRT::virtualPositionUpdate); + + d->singleUpdateTimer.setSingleShot(true); + connect(&d->singleUpdateTimer, &QTimer::timeout, this, &QGeoPositionInfoSourceWinRT::singleUpdateTimeOut); + + QGeoPositionInfoSource::PositioningMethods preferredMethods = preferredPositioningMethods(); + if (preferredMethods == QGeoPositionInfoSource::NoPositioningMethods) + preferredMethods = QGeoPositionInfoSource::AllPositioningMethods; + setPreferredPositioningMethods(preferredMethods); + + connect(this, &QGeoPositionInfoSourceWinRT::nativePositionUpdate, this, &QGeoPositionInfoSourceWinRT::updateSynchronized); + d->initState = InitializationState::Initialized; + return 0; +} + +QGeoPositionInfo QGeoPositionInfoSourceWinRT::lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__; + Q_D(const QGeoPositionInfoSourceWinRT); + Q_UNUSED(fromSatellitePositioningMethodsOnly); + return d->lastPosition; +} + +QGeoPositionInfoSource::PositioningMethods QGeoPositionInfoSourceWinRT::supportedPositioningMethods() const +{ + return requestAccess() ? QGeoPositionInfoSource::AllPositioningMethods + : QGeoPositionInfoSource::NoPositioningMethods; +} + +void QGeoPositionInfoSourceWinRT::setPreferredPositioningMethods(QGeoPositionInfoSource::PositioningMethods methods) +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__ << methods; + Q_D(QGeoPositionInfoSourceWinRT); + + PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods(); + QGeoPositionInfoSource::setPreferredPositioningMethods(methods); + if (previousPreferredPositioningMethods == preferredPositioningMethods() + || d->initState == InitializationState::Uninitialized) { + return; + } + + const bool needsRestart = d->positionToken.value != 0 || d->statusToken.value != 0; + + if (needsRestart) + stopHandler(); + + PositionAccuracy acc = methods & PositioningMethod::SatellitePositioningMethods ? + PositionAccuracy::PositionAccuracy_High : + PositionAccuracy::PositionAccuracy_Default; + HRESULT hr = [d, acc]() { + return d->locator->put_DesiredAccuracy(acc); + }(); + RETURN_VOID_IF_FAILED("Could not set positioning accuracy."); + + if (needsRestart) + startHandler(); +} + +void QGeoPositionInfoSourceWinRT::setUpdateInterval(int msec) +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__ << msec; + Q_D(QGeoPositionInfoSourceWinRT); + if (d->initState == InitializationState::Uninitialized) { + d->updateInterval = msec; + return; + } + + // minimumUpdateInterval is initialized to the lowest possible update interval in init(). + // Passing 0 will cause an error on Windows 10. + // See https://docs.microsoft.com/en-us/uwp/api/windows.devices.geolocation.geolocator.reportinterval + if (msec < minimumUpdateInterval()) + msec = minimumUpdateInterval(); + + const bool needsRestart = d->positionToken.value != 0 || d->statusToken.value != 0; + + if (needsRestart) + stopHandler(); + + HRESULT hr = d->locator->put_ReportInterval(static_cast(msec)); + if (FAILED(hr)) { + setError(QGeoPositionInfoSource::UnknownSourceError); + qErrnoWarning(hr, "Failed to set update interval"); + return; + } + + d->updateInterval = msec; + d->periodicTimer.setInterval(d->updateInterval); + + QGeoPositionInfoSource::setUpdateInterval(d->updateInterval); + + if (needsRestart) + startHandler(); +} + +int QGeoPositionInfoSourceWinRT::minimumUpdateInterval() const +{ + Q_D(const QGeoPositionInfoSourceWinRT); + return d->minimumUpdateInterval == -1 ? 1000 : d->minimumUpdateInterval; +} + +void QGeoPositionInfoSourceWinRT::startUpdates() +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__; + Q_D(QGeoPositionInfoSourceWinRT); + + setError(QGeoPositionInfoSource::NoError); + if (init() < 0) + return; + + if (d->updatesOngoing) + return; + + if (!startHandler()) + return; + d->updatesOngoing = true; + d->periodicTimer.start(); +} + +void QGeoPositionInfoSourceWinRT::stopUpdates() +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__; + Q_D(QGeoPositionInfoSourceWinRT); + + if (init() < 0) + return; + + stopHandler(); + d->updatesOngoing = false; + d->periodicTimer.stop(); +} + +bool QGeoPositionInfoSourceWinRT::startHandler() +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__; + Q_D(QGeoPositionInfoSourceWinRT); + + // Check if already attached + if (d->positionToken.value != 0) + return true; + + if (preferredPositioningMethods() == QGeoPositionInfoSource::NoPositioningMethods) { + setError(QGeoPositionInfoSource::UnknownSourceError); + return false; + } + + if (!requestAccess()) { + setError(QGeoPositionInfoSource::AccessError); + return false; + } + + HRESULT hr = [this, d]() { + HRESULT hr; + + // We need to call this at least once on Windows 10 Mobile. + // Unfortunately this operation does not have a completion handler + // registered. That could have helped in the single update case + ComPtr> op; + hr = d->locator->GetGeopositionAsync(&op); + RETURN_HR_IF_FAILED("Could not start position operation"); + + hr = d->locator->add_PositionChanged(Callback(this, + &QGeoPositionInfoSourceWinRT::onPositionChanged).Get(), + &d->positionToken); + RETURN_HR_IF_FAILED("Could not add position handler"); + + hr = d->locator->add_StatusChanged(Callback(this, + &QGeoPositionInfoSourceWinRT::onStatusChanged).Get(), + &d->statusToken); + RETURN_HR_IF_FAILED("Could not add status handler"); + return hr; + }(); + if (FAILED(hr)) { + setError(QGeoPositionInfoSource::UnknownSourceError); + return false; + } + + return true; +} + +void QGeoPositionInfoSourceWinRT::stopHandler() +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__; + Q_D(QGeoPositionInfoSourceWinRT); + + if (!d->positionToken.value) + return; + d->locator->remove_PositionChanged(d->positionToken); + d->locator->remove_StatusChanged(d->statusToken); + d->positionToken.value = 0; + d->statusToken.value = 0; +} + +void QGeoPositionInfoSourceWinRT::requestUpdate(int timeout) +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__ << timeout; + Q_D(QGeoPositionInfoSourceWinRT); + + if (init() < 0) + return; + + setError(QGeoPositionInfoSource::NoError); + if (timeout != 0 && timeout < minimumUpdateInterval()) { + d->positionError = QGeoPositionInfoSource::UpdateTimeoutError; + emit QGeoPositionInfoSource::errorOccurred(d->positionError); + return; + } + + if (timeout == 0) + timeout = 2*60*1000; // Maximum time for cold start (see Android) + + if (startHandler()) + d->singleUpdateTimer.start(timeout); +} + +void QGeoPositionInfoSourceWinRT::virtualPositionUpdate() +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__; + Q_D(QGeoPositionInfoSourceWinRT); + QMutexLocker locker(&d->mutex); + + // The operating system did not provide information in time + // Hence we send a virtual position update to keep same behavior + // between backends. + // This only applies to the periodic timer, not for single requests + // We can only do this if we received a valid position before + if (d->lastPosition.isValid()) { + QGeoPositionInfo sent = d->lastPosition; + sent.setTimestamp(sent.timestamp().addMSecs(updateInterval())); + d->lastPosition = sent; + emit positionUpdated(sent); + } + d->periodicTimer.start(); +} + +void QGeoPositionInfoSourceWinRT::singleUpdateTimeOut() +{ + Q_D(QGeoPositionInfoSourceWinRT); + QMutexLocker locker(&d->mutex); + + if (d->singleUpdateTimer.isActive()) { + d->positionError = QGeoPositionInfoSource::UpdateTimeoutError; + emit QGeoPositionInfoSource::errorOccurred(d->positionError); + if (!d->updatesOngoing) + stopHandler(); + } +} + +void QGeoPositionInfoSourceWinRT::updateSynchronized(QGeoPositionInfo currentInfo) +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__ << currentInfo; + Q_D(QGeoPositionInfoSourceWinRT); + QMutexLocker locker(&d->mutex); + + d->periodicTimer.stop(); + d->lastPosition = currentInfo; + + if (d->updatesOngoing) + d->periodicTimer.start(); + + if (d->singleUpdateTimer.isActive()) { + d->singleUpdateTimer.stop(); + if (!d->updatesOngoing) + stopHandler(); + } + + emit positionUpdated(currentInfo); +} + +QGeoPositionInfoSource::Error QGeoPositionInfoSourceWinRT::error() const +{ + Q_D(const QGeoPositionInfoSourceWinRT); + qCDebug(lcPositioningWinRT) << __FUNCTION__ << d->positionError; + + // If the last encountered error was "Access denied", it is possible that the location service + // has been enabled by now so that we are clear again. + if ((d->positionError == QGeoPositionInfoSource::AccessError + || d->positionError == QGeoPositionInfoSource::UnknownSourceError) && requestAccess()) + return QGeoPositionInfoSource::NoError; + + return d->positionError; +} + +void QGeoPositionInfoSourceWinRT::setError(QGeoPositionInfoSource::Error positionError) +{ + Q_D(QGeoPositionInfoSourceWinRT); + + if (positionError == d->positionError) + return; + + qCDebug(lcPositioningWinRT) << __FUNCTION__ << positionError; + d->positionError = positionError; + if (positionError != QGeoPositionInfoSource::NoError) + emit QGeoPositionInfoSource::errorOccurred(positionError); +} + +void QGeoPositionInfoSourceWinRT::reactOnError(QGeoPositionInfoSource::Error positionError) +{ + setError(positionError); + stopUpdates(); +} + +HRESULT QGeoPositionInfoSourceWinRT::onPositionChanged(IGeolocator *locator, IPositionChangedEventArgs *args) +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__; + Q_UNUSED(locator); + + HRESULT hr; + ComPtr position; + hr = args->get_Position(&position); + RETURN_HR_IF_FAILED("Could not access position object."); + + QGeoPositionInfo currentInfo; + + ComPtr coord; + hr = position->get_Coordinate(&coord); + if (FAILED(hr)) + qErrnoWarning(hr, "Could not access coordinate"); + + ComPtr pointCoordinate; + hr = coord.As(&pointCoordinate); + if (FAILED(hr)) + qErrnoWarning(hr, "Could not cast coordinate."); + + ComPtr point; + hr = pointCoordinate->get_Point(&point); + if (FAILED(hr)) + qErrnoWarning(hr, "Could not obtain coordinate's point."); + + BasicGeoposition pos; + hr = point->get_Position(&pos); + if (FAILED(hr)) + qErrnoWarning(hr, "Could not obtain point's position."); + + DOUBLE lat = pos.Latitude; + DOUBLE lon = pos.Longitude; + DOUBLE alt = pos.Altitude; + + bool altitudeAvailable = false; + ComPtr shape; + hr = point.As(&shape); + if (SUCCEEDED(hr) && shape) { + AltitudeReferenceSystem altitudeSystem; + hr = shape->get_AltitudeReferenceSystem(&altitudeSystem); + if (SUCCEEDED(hr) && altitudeSystem == AltitudeReferenceSystem_Geoid) + altitudeAvailable = true; + } + if (altitudeAvailable) + currentInfo.setCoordinate(QGeoCoordinate(lat, lon, alt)); + else + currentInfo.setCoordinate(QGeoCoordinate(lat, lon)); + + DOUBLE accuracy; + hr = coord->get_Accuracy(&accuracy); + if (SUCCEEDED(hr)) + currentInfo.setAttribute(QGeoPositionInfo::HorizontalAccuracy, accuracy); + + IReference *altAccuracy; + hr = coord->get_AltitudeAccuracy(&altAccuracy); + if (SUCCEEDED(hr) && altAccuracy) { + double value; + hr = altAccuracy->get_Value(&value); + currentInfo.setAttribute(QGeoPositionInfo::VerticalAccuracy, value); + } + + IReference *speed; + hr = coord->get_Speed(&speed); + if (SUCCEEDED(hr) && speed) { + double value; + hr = speed->get_Value(&value); + currentInfo.setAttribute(QGeoPositionInfo::GroundSpeed, value); + } + + IReference *heading; + hr = coord->get_Heading(&heading); + if (SUCCEEDED(hr) && heading) { + double value; + hr = heading->get_Value(&value); + double mod = 0; + value = modf(value, &mod); + value += static_cast(mod) % 360; + if (value >=0 && value <= 359) // get_Value might return nan/-nan + currentInfo.setAttribute(QGeoPositionInfo::Direction, value); + } + + DateTime dateTime; + hr = coord->get_Timestamp(&dateTime); + + if (dateTime.UniversalTime > 0) { + ULARGE_INTEGER uLarge; + uLarge.QuadPart = dateTime.UniversalTime; + FILETIME fileTime; + fileTime.dwHighDateTime = uLarge.HighPart; + fileTime.dwLowDateTime = uLarge.LowPart; + SYSTEMTIME systemTime; + if (FileTimeToSystemTime(&fileTime, &systemTime)) { + currentInfo.setTimestamp(QDateTime(QDate(systemTime.wYear, systemTime.wMonth, + systemTime.wDay), + QTime(systemTime.wHour, systemTime.wMinute, + systemTime.wSecond, systemTime.wMilliseconds), + QTimeZone::UTC)); + } + } + + emit nativePositionUpdate(currentInfo); + + return S_OK; +} + +static inline bool isDisabledStatus(PositionStatus status) +{ + return status == PositionStatus_NoData || status == PositionStatus_Disabled + || status == PositionStatus_NotAvailable; +} + +HRESULT QGeoPositionInfoSourceWinRT::onStatusChanged(IGeolocator *, IStatusChangedEventArgs *args) +{ + Q_D(QGeoPositionInfoSourceWinRT); + + const PositionStatus oldStatus = d->positionStatus; + HRESULT hr = args->get_Status(&d->positionStatus); + RETURN_HR_IF_FAILED("Could not obtain position status"); + qCDebug(lcPositioningWinRT) << __FUNCTION__ << d->positionStatus; + QGeoPositionInfoSource::Error error = QGeoPositionInfoSource::NoError; + switch (d->positionStatus) { + case PositionStatus::PositionStatus_NotAvailable: + error = QGeoPositionInfoSource::UnknownSourceError; + break; + case PositionStatus::PositionStatus_Disabled: + error = QGeoPositionInfoSource::AccessError; + break; + case PositionStatus::PositionStatus_NoData: + error = QGeoPositionInfoSource::ClosedError; + break; + } + if (error != QGeoPositionInfoSource::NoError) { + QMetaObject::invokeMethod(this, "reactOnError", Qt::QueuedConnection, + Q_ARG(QGeoPositionInfoSource::Error, + QGeoPositionInfoSource::UnknownSourceError)); + } + + if (isDisabledStatus(oldStatus) != isDisabledStatus(d->positionStatus)) + emit supportedPositioningMethodsChanged(); + + return S_OK; +} + +bool QGeoPositionInfoSourceWinRT::requestAccess() const +{ + Q_D(const QGeoPositionInfoSourceWinRT); + qCDebug(lcPositioningWinRT) << __FUNCTION__; + GeolocationAccessStatus accessStatus; + + ComPtr> op; + HRESULT hr = [&op, d]() { + HRESULT hr; + if (!d->statics) { + hr = RoGetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Devices_Geolocation_Geolocator).Get(), + IID_PPV_ARGS(&d->statics)); + RETURN_HR_IF_FAILED("Could not access Geolocation Statics."); + } + + hr = d->statics->RequestAccessAsync(&op); + return hr; + }(); + if (FAILED(hr)) { + qCDebug(lcPositioningWinRT) << __FUNCTION__ << "Requesting access from Xaml thread failed"; + return false; + } + + await(op, &accessStatus); + return accessStatus == GeolocationAccessStatus_Allowed; +} + +QT_END_NAMESPACE diff --git a/src/plugins/position/winrt/qgeopositioninfosource_winrt_p.h b/src/plugins/position/winrt/qgeopositioninfosource_winrt_p.h new file mode 100644 index 0000000..f4467f1 --- /dev/null +++ b/src/plugins/position/winrt/qgeopositioninfosource_winrt_p.h @@ -0,0 +1,91 @@ +// Copyright (C) 2015 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOSITIONINFOSOURCEWINRT_H +#define QGEOPOSITIONINFOSOURCEWINRT_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeopositioninfosource.h" +#include "qgeopositioninfo.h" + +#include + +#include +#include + +namespace ABI { + namespace Windows { + namespace Devices { + namespace Geolocation{ + struct IGeolocator; + struct IPositionChangedEventArgs; + struct IStatusChangedEventArgs; + } + } + } +} + +QT_BEGIN_NAMESPACE + +class QGeoPositionInfoSourceWinRTPrivate; + +class QGeoPositionInfoSourceWinRT : public QGeoPositionInfoSource +{ + Q_OBJECT +public: + QGeoPositionInfoSourceWinRT(QObject *parent = nullptr); + ~QGeoPositionInfoSourceWinRT() override; + int init(); + + QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const override; + PositioningMethods supportedPositioningMethods() const override; + + void setPreferredPositioningMethods(PositioningMethods methods) override; + + void setUpdateInterval(int msec) override; + int minimumUpdateInterval() const override; + Error error() const override; + + HRESULT onPositionChanged(ABI::Windows::Devices::Geolocation::IGeolocator *locator, + ABI::Windows::Devices::Geolocation::IPositionChangedEventArgs *args); + HRESULT onStatusChanged(ABI::Windows::Devices::Geolocation::IGeolocator *locator, + ABI::Windows::Devices::Geolocation::IStatusChangedEventArgs *args); + + bool requestAccess() const; +Q_SIGNALS: + void nativePositionUpdate(const QGeoPositionInfo); +public slots: + void startUpdates() override; + void stopUpdates() override; + + void requestUpdate(int timeout = 0) override; + +private slots: + void stopHandler(); + void virtualPositionUpdate(); + void singleUpdateTimeOut(); + void updateSynchronized(const QGeoPositionInfo info); + void reactOnError(QGeoPositionInfoSource::Error positionError); +private: + bool startHandler(); + + Q_DISABLE_COPY(QGeoPositionInfoSourceWinRT) + void setError(QGeoPositionInfoSource::Error positionError); + + QScopedPointer d_ptr; + Q_DECLARE_PRIVATE(QGeoPositionInfoSourceWinRT) +}; + +QT_END_NAMESPACE + +#endif // QGEOPOSITIONINFOSOURCEWINRT_H diff --git a/src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.cpp b/src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.cpp new file mode 100644 index 0000000..fe9bcaf --- /dev/null +++ b/src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.cpp @@ -0,0 +1,37 @@ +// Copyright (C) 2015 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeopositioninfosourcefactory_winrt.h" +#include "qgeopositioninfosource_winrt_p.h" + +#include + +Q_LOGGING_CATEGORY(lcPositioningWinRT, "qt.positioning.winrt") + +QT_BEGIN_NAMESPACE + +QGeoPositionInfoSource *QGeoPositionInfoSourceFactoryWinRT::positionInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__; + Q_UNUSED(parameters) + QGeoPositionInfoSourceWinRT *src = new QGeoPositionInfoSourceWinRT(parent); + return src; +} + +QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactoryWinRT::satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__; + Q_UNUSED(parent) + Q_UNUSED(parameters) + return nullptr; +} + +QGeoAreaMonitorSource *QGeoPositionInfoSourceFactoryWinRT::areaMonitor(QObject *parent, const QVariantMap ¶meters) +{ + qCDebug(lcPositioningWinRT) << __FUNCTION__; + Q_UNUSED(parent) + Q_UNUSED(parameters) + return nullptr; +} + +QT_END_NAMESPACE diff --git a/src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.h b/src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.h new file mode 100644 index 0000000..2a24781 --- /dev/null +++ b/src/plugins/position/winrt/qgeopositioninfosourcefactory_winrt.h @@ -0,0 +1,26 @@ +// Copyright (C) 2015 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOSITIONINFOSOURCEFACTORY_WINRT_H +#define QGEOPOSITIONINFOSOURCEFACTORY_WINRT_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoPositionInfoSourceFactoryWinRT : public QObject, public QGeoPositionInfoSourceFactory +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0" + FILE "plugin.json") + Q_INTERFACES(QGeoPositionInfoSourceFactory) +public: + QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override; +}; + +QT_END_NAMESPACE + +#endif // QGEOPOSITIONINFOSOURCEFACTORY_WINRT_H diff --git a/src/positioning/CMakeLists.txt b/src/positioning/CMakeLists.txt new file mode 100644 index 0000000..f72bb46 --- /dev/null +++ b/src/positioning/CMakeLists.txt @@ -0,0 +1,73 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from positioning.pro. + +##################################################################### +## Positioning Module: +##################################################################### + +qt_internal_add_module(Positioning + PLUGIN_TYPES position + SOURCES + qclipperutils.cpp qclipperutils_p.h + qdoublematrix4x4.cpp qdoublematrix4x4_p.h + qdoublevector2d.cpp qdoublevector2d_p.h + qdoublevector3d.cpp qdoublevector3d_p.h + qgeoaddress.cpp qgeoaddress.h qgeoaddress_p.h + qgeoareamonitorinfo.cpp qgeoareamonitorinfo.h + qgeoareamonitorsource.cpp qgeoareamonitorsource.h + qgeocircle.cpp qgeocircle.h qgeocircle_p.h + qgeocoordinate.cpp qgeocoordinate.h qgeocoordinate_p.h + qgeocoordinateobject.cpp qgeocoordinateobject_p.h + qgeolocation.cpp qgeolocation.h qgeolocation_p.h + qgeopath.cpp qgeopath.h qgeopath_p.h + qgeopolygon.cpp qgeopolygon.h qgeopolygon_p.h + qgeopositioninfo.cpp qgeopositioninfo.h qgeopositioninfo_p.h + qgeopositioninfosource.cpp qgeopositioninfosource.h qgeopositioninfosource_p.h + qgeopositioninfosourcefactory.cpp qgeopositioninfosourcefactory.h + qgeorectangle.cpp qgeorectangle.h qgeorectangle_p.h + qgeosatelliteinfo.cpp qgeosatelliteinfo.h qgeosatelliteinfo_p.h + qgeosatelliteinfosource.cpp qgeosatelliteinfosource.h qgeosatelliteinfosource_p.h + qgeoshape.cpp qgeoshape.h qgeoshape_p.h + qlocationutils.cpp qlocationutils_p.h + qnmeapositioninfosource.cpp qnmeapositioninfosource.h qnmeapositioninfosource_p.h + qnmeasatelliteinfosource.cpp qnmeasatelliteinfosource.h qnmeasatelliteinfosource_p.h + qpositioningglobal.h qpositioningglobal_p.h + qwebmercator.cpp qwebmercator_p.h + INCLUDE_DIRECTORIES + ../3rdparty/clip2tri + ../3rdparty/clipper + LIBRARIES + Qt::CorePrivate + Qt::Bundled_Clip2Tri + PUBLIC_LIBRARIES + Qt::Core + PRIVATE_MODULE_INTERFACE + Qt::CorePrivate + GENERATE_CPP_EXPORTS + GENERATE_PRIVATE_CPP_EXPORTS + DEFINES + QT_NO_CONTEXTLESS_CONNECT +) + +if(ANDROID) + set_property(TARGET Positioning APPEND PROPERTY QT_ANDROID_BUNDLED_JAR_DEPENDENCIES + jar/Qt${QtLocation_VERSION_MAJOR}AndroidPositioning.jar:org.qtproject.qt.android.positioning.QtPositioning # special case + ) + set_property(TARGET Positioning APPEND PROPERTY QT_ANDROID_LIB_DEPENDENCIES + ${INSTALL_PLUGINSDIR}/position/libplugins_position_qtposition_android.so + ) + set_property(TARGET Positioning APPEND PROPERTY QT_ANDROID_PERMISSIONS + android.permission.ACCESS_FINE_LOCATION + ) +endif() + +#### Keys ignored in scope 1:.:.:positioning.pro:: +# ANDROID_FEATURES = "android.hardware.location.gps" +# MODULE_WINRT_CAPABILITIES_DEVICE = "location" +# OTHER_FILES = "configure.json" "doc/src/*.qdoc" "doc/src/plugins/*.qdoc" +qt_internal_add_docs(Positioning + doc/qtpositioning.qdocconf +) + diff --git a/src/positioning/configure.cmake b/src/positioning/configure.cmake new file mode 100644 index 0000000..32f3ccf --- /dev/null +++ b/src/positioning/configure.cmake @@ -0,0 +1,31 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# begin special case + +#### Libraries + +qt_find_package(Gypsy PROVIDED_TARGETS Gypsy::Gypsy) +qt_find_package(Gconf PROVIDED_TARGETS Gconf::Gconf) + +#### Tests + +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../../config.tests/winrt/CMakeLists.txt") + qt_config_compile_test("winrt_geolocation" + LABEL "WinRT geolocation" + PROJECT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../config.tests/winrt") +endif() + +#### Features + +qt_feature("gypsy" PUBLIC + LABEL "Gypsy - A GPS Multiplexing Daemon" + CONDITION Gypsy_FOUND AND Gconf_FOUND +) + +qt_feature("winrt_geolocation" PRIVATE + LABEL "WinRT geolocation API" + CONDITION WIN32 AND TEST_winrt_geolocation +) + +# end special case diff --git a/src/positioning/configure.json b/src/positioning/configure.json new file mode 100644 index 0000000..49e32be --- /dev/null +++ b/src/positioning/configure.json @@ -0,0 +1,48 @@ +{ + "module": "positioning", + "testDir": "../../config.tests", + + "libraries": { + "gypsy": { + "label": "Gypsy", + "test": "gypsy", + "sources": [ + { "type": "pkgConfig", "args": "gypsy gconf-2.0" } + ] + } + }, + + "tests": { + "winrt_geolocation": { + "label": "WinRT Geolocation API", + "type": "compile", + "test": "winrt" + } + }, + + "features": { + "gypsy": { + "label": "Gypsy GPS Daemon", + "condition": "libs.gypsy", + "output": [ "privateFeature" ] + }, + "winrt_geolocation": { + "label": "WinRT Geolocation API", + "condition": "tests.winrt_geolocation", + "output": [ "privateFeature" ] + } + }, + + "report": [ + ], + + "summary": [ + { + "section": "Qt Positioning", + "entries": [ + "gypsy", + "winrt_geolocation" + ] + } + ] +} diff --git a/src/positioning/doc/images/permissions.png b/src/positioning/doc/images/permissions.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8c48501ef0d4bdb151794479f8e0f870e581ab GIT binary patch literal 19306 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 V31msa!?REiWtHw1N*lcUKLA@?{zCu& literal 0 HcmV?d00001 diff --git a/src/positioning/doc/qtpositioning.qdocconf b/src/positioning/doc/qtpositioning.qdocconf new file mode 100644 index 0000000..2056da6 --- /dev/null +++ b/src/positioning/doc/qtpositioning.qdocconf @@ -0,0 +1,63 @@ +include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf) +include($QT_INSTALL_DOCS/config/exampleurl-qtpositioning.qdocconf) + +project = QtPositioning +description = Qt Positioning Reference Documentation +version = $QT_VERSION + +qhp.projects = QtPositioning + +qhp.QtPositioning.file = qtpositioning.qhp +qhp.QtPositioning.namespace = org.qt-project.qtpositioning.$QT_VERSION_TAG +qhp.QtPositioning.virtualFolder = qtpositioning +qhp.QtPositioning.indexTitle = Qt Positioning +qhp.QtPositioning.indexRoot = + +qhp.QtPositioning.subprojects = classes qml examples +qhp.QtPositioning.subprojects.classes.title = C++ Classes +qhp.QtPositioning.subprojects.classes.indexTitle = Qt Positioning C++ Classes +qhp.QtPositioning.subprojects.classes.selectors = class fake:headerfile +qhp.QtPositioning.subprojects.classes.sortPages = true +qhp.QtPositioning.subprojects.qml.title = QML Types +qhp.QtPositioning.subprojects.qml.indexTitle = Qt Positioning QML Types +qhp.QtPositioning.subprojects.qml.selectors = qmlclass +qhp.QtPositioning.subprojects.qml.sortPages = true +qhp.QtPositioning.subprojects.examples.title = Qt Positioning Examples +qhp.QtPositioning.subprojects.examples.indexTitle = Qt Positioning Examples +qhp.QtPositioning.subprojects.examples.selectors = fake:example + +tagfile = ../../../doc/qtpositioning/qtpositioning.tags + +depends += qtcore \ + qtdoc \ + qtquick \ + qtqml \ + qtnetwork \ + qtqmlxmllistmodel \ + qmake \ + qtcmake \ + qtserialport \ + qtlocation + +headerdirs += .. \ + ../../positioningquick + +sourcedirs += .. \ + ../../positioningquick + +examplesinstallpath = positioning + +exampledirs += ../../../examples/positioning \ + snippets/ + + +imagedirs += images + +navigation.landingpage = "Qt Positioning" +navigation.cppclassespage = "Qt Positioning C++ Classes" +navigation.qmltypespage = "Qt Positioning QML Types" + +manifestmeta.thumbnail.names += "QtPositioning/Log File*" +manifestmeta.highlighted.names = \ + "QtPositioning/Satellite Info" \ + "QtPositioning/Weather Info" diff --git a/src/positioning/doc/snippets/CMakeLists.txt b/src/positioning/doc/snippets/CMakeLists.txt new file mode 100644 index 0000000..2322a85 --- /dev/null +++ b/src/positioning/doc/snippets/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(cpp) diff --git a/src/positioning/doc/snippets/cpp/CMakeLists.txt b/src/positioning/doc/snippets/cpp/CMakeLists.txt new file mode 100644 index 0000000..891a5ef --- /dev/null +++ b/src/positioning/doc/snippets/cpp/CMakeLists.txt @@ -0,0 +1,23 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) +project(positioning_cppsnippet LANGUAGES CXX) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +find_package(Qt6 COMPONENTS Core) +find_package(Qt6 COMPONENTS Positioning) + +qt_add_executable(positioning_cppsnippet + cppqml.cpp + main.cpp +) +set_target_properties(positioning_cppsnippet PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) +target_link_libraries(positioning_cppsnippet PRIVATE + Qt::Core + Qt::Positioning +) diff --git a/src/positioning/doc/snippets/cpp/cppqml.cpp b/src/positioning/doc/snippets/cpp/cppqml.cpp new file mode 100644 index 0000000..19dd718 --- /dev/null +++ b/src/positioning/doc/snippets/cpp/cppqml.cpp @@ -0,0 +1,71 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include +#include +#include +#include +#include +#include +#include + +void cppQmlInterface(QObject *qmlObject) +{ + //! [Address get] + QGeoAddress geoAddress = qmlObject->property("address").value(); + //! [Address get] + + //! [Address set] + qmlObject->setProperty("address", QVariant::fromValue(geoAddress)); + //! [Address set] + + //! [Location get] + QGeoLocation geoLocation = qmlObject->property("location").value(); + //! [Location get] + + //! [Location set] + qmlObject->setProperty("location", QVariant::fromValue(geoLocation)); + //! [Location set] +} + +class MyClass : public QObject +{ + Q_OBJECT +//! [BigBen] +public: + MyClass() : QObject() + { + QGeoAreaMonitorSource *monitor = QGeoAreaMonitorSource::createDefaultSource(this); + if (monitor) { + connect(monitor, SIGNAL(areaEntered(QGeoAreaMonitorInfo,QGeoPositionInfo)), + this, SLOT(areaEntered(QGeoAreaMonitorInfo,QGeoPositionInfo))); + connect(monitor, SIGNAL(areaExited(QGeoAreaMonitorInfo,QGeoPositionInfo)), + this, SLOT(areaExited(QGeoAreaMonitorInfo,QGeoPositionInfo))); + + QGeoAreaMonitorInfo bigBen("Big Ben"); + QGeoCoordinate position(51.50104, -0.124632); + bigBen.setArea(QGeoCircle(position, 100)); + + monitor->startMonitoring(bigBen); + + } else { + qDebug() << "Could not create default area monitor"; + } + } + +public Q_SLOTS: + void areaEntered(const QGeoAreaMonitorInfo &mon, const QGeoPositionInfo &update) + { + Q_UNUSED(mon); + + qDebug() << "Now within 100 meters, current position is" << update.coordinate(); + } + + void areaExited(const QGeoAreaMonitorInfo &mon, const QGeoPositionInfo &update) + { + Q_UNUSED(mon); + + qDebug() << "No longer within 100 meters, current position is" << update.coordinate(); + } +//! [BigBen] +}; diff --git a/src/positioning/doc/snippets/cpp/main.cpp b/src/positioning/doc/snippets/cpp/main.cpp new file mode 100644 index 0000000..fb6724d --- /dev/null +++ b/src/positioning/doc/snippets/cpp/main.cpp @@ -0,0 +1,8 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +int main(int /*argc*/, char ** /*argv*/) +{ + return 0; +} + diff --git a/src/positioning/doc/snippets/doc_src_qtpositioning.qml b/src/positioning/doc/snippets/doc_src_qtpositioning.qml new file mode 100644 index 0000000..8dac7dc --- /dev/null +++ b/src/positioning/doc/snippets/doc_src_qtpositioning.qml @@ -0,0 +1,10 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +//! [import] +import QtPositioning +//! [import] + +Item { +} + diff --git a/src/positioning/doc/src/cpp-position.qdoc b/src/positioning/doc/src/cpp-position.qdoc new file mode 100644 index 0000000..05f80e6 --- /dev/null +++ b/src/positioning/doc/src/cpp-position.qdoc @@ -0,0 +1,172 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! +\page location-positioning-cpp.html + +\title Positioning (C++) + +\brief The Location Positioning API enables location positioning by means of +GPS or an NMEA data source. + +\section1 Positioning + +The Positioning component of the Qt Location API is about the geographical +position, size, and address of some place. Positioning contains a +\l QGeoCoordinate class, containing latitude, longitude and altitude in meters. +\l QGeoLocation contains a \l QGeoCoordinate plus address and size information +(a bounding box) so that positions can be more than mathematical points. +Movement into or out of the defined bounding box areas can be monitored. The API +also allows the developer to control the source of the positional information +as well. + +Location data involves a precisely specified position on the Earth's +surface \unicode {0x2014} as provided by a latitude-longitude coordinate +\unicode {0x2014} along with associated data, such as: + + \list + \li The date and time at which the position was reported + \li The velocity of the device that reported the position + \li The altitude of the reported position (height above sea level) + \li The bearing of the device in degrees, relative to true north + \endlist + +This data can be extracted through a variety of methods. One of the most +well known methods of positioning is GPS (Global Positioning System), a +publicly available system that uses radiowave signals received from +Earth-orbiting satellites to calculate the precise position and time of +the receiver. Another popular method is 'Cell Identifier Positioning', which uses +the cell identifier of the cell site that is currently serving the receiving +device to calculate its approximate location. These and other positioning +methods can all be used with the Location API; the only requirement for a +location data source within the API is that it provides a +latitude-longitude coordinate with a date/time value, with the option of +providing the other attributes listed above. + + +Location data sources are created by subclassing \l QGeoPositionInfoSource and +providing \l QGeoPositionInfo objects through the +\l {QGeoPositionInfoSource::positionUpdated()} signal. Clients that require +location data can connect to the +\l{QGeoPositionInfoSource::positionUpdated()}{positionUpdated()} signal and +call \l{QGeoPositionInfoSource::startUpdates()}{startUpdates()} or +\l{QGeoPositionInfoSource::requestUpdate()}{requestUpdate()} to trigger the +distribution of location data. The location data distribution can be stopped by +calling the \l {QGeoPositionInfoSource::stopUpdates()}{stopUpdates()} function. + +A default position source may be available on some platforms. Call +\l {QGeoPositionInfoSource::createDefaultSource()} to create an instance of the +default position source. The method returns \c nullptr if no default source is +available for the platform. + +If a problem occurs with access to the information source then an +\l {QGeoPositionInfoSource::errorOccurred()}{errorOccurred()} signal is emitted. + +The \l QGeoAreaMonitorSource class enables client applications to be notified +when the receiving device has moved into or out of a particular area, as +specified by a coordinate and radius. If the platform provides built-in support +for area monitoring, the \l {QGeoAreaMonitorSource::createDefaultSource()} +method returns an instance of the default area monitor. + +Satellite information can also be distributed through the +\l QGeoSatelliteInfoSource class. Call +\l {QGeoSatelliteInfoSource::createDefaultSource()} to create an instance of the +default satellite data source for the platform if one is available. +Alternatively, clients can subclass it to provide a custom satellite data +source. + + + +\section2 Requesting Location Data from Data Sources + +To receive data from a source, connect to its +\l{QGeoPositionInfoSource::positionUpdated()}{positionUpdated()} signal, +then call either \l{QGeoPositionInfoSource::startUpdates()}{startUpdates()} +or \l{QGeoPositionInfoSource::requestUpdate()}{requestUpdate()} to begin. + +Here is an example of a client that receives data from the default location +data source, as returned by \l {QGeoPositionInfoSource::createDefaultSource()}: + +\code +class MyClass : public QObject +{ + Q_OBJECT +public: + MyClass(QObject *parent = 0) + : QObject(parent) + { + QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(this); + if (source) { + connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)), + this, SLOT(positionUpdated(QGeoPositionInfo))); + source->startUpdates(); + } + } + +private slots: + void positionUpdated(const QGeoPositionInfo &info) + { + qDebug() << "Position updated:" << info; + } +}; + +\endcode + +\section2 Controlling Aspects of Data Sources + +The \l {QGeoPositionInfoSource::setUpdateInterval()} method can be used to +control the rate at which position updates are received. For example, if +the client application only requires updates once every 30 seconds, it can +call \c setUpdateInterval(30000). If no update interval is set, or +\l {QGeoPositionInfoSource::}{setUpdateInterval()} is called with a value of 0, +the source uses a default interval or some other internal logic to determine +when updates should be provided. + +\l {QGeoPositionInfoSource::setPreferredPositioningMethods()} enables client +applications to request that a certain type of positioning method be used. +For example, if the application prefers to use only satellite positioning, +which offers fairly precise outdoor positioning but can be a heavy user of +power resources, it can call this method with the +\l {QGeoPositionInfoSource::SatellitePositioningMethods} value. However, this +method should only be used in specialized client applications; in most +cases, the default positioning methods should not be changed, as a source +may internally use a variety of positioning methods that can be useful to +the application. + +\section2 NMEA Data + +\l {http://en.wikipedia.org/wiki/NMEA_0183}{NMEA} is a common text-based +protocol for specifying navigational data. For convenience, the +\l QNmeaPositionInfoSource is provided to enable client applications to read +and distribute NMEA data in either real-time mode (for example, when +streaming from a GPS device) or simulation mode (for example, when reading +from a NMEA log file). In simulation mode, the source will emit updates +according to the time stamp of each NMEA sentence to produce a "replay" +of the recorded data. + +Generally, the capabilities provided by the default position source as +returned by \l {QGeoPositionInfoSource::createDefaultSource()}, along with the +\l QNmeaPositionInfoSource class, are sufficient for retrieving location +data. However, in some cases developers may wish to write their own custom +location data source. + +The \l {Log File Position Source (C++)} example demonstrates how to subclass +\l QGeoPositionInfoSource to create a custom positioning source. + +\section1 Examples + +\section3 \b{Log File Position Source Example} + +The \l{Log File Position Source (C++)}{Log File Position Source} Example demonstrates +how to subclass \l QGeoPositionInfoSource to create a custom positioning source. + +\section3 \b{Weather Info Example} + +The \l{Weather Info} example shows how to use the user's current +position to retrieve local content from a web service in a C++ plugin for QML. + +\section1 Positioning Classes + +\annotatedlist QtPositioning-positioning + +*/ diff --git a/src/positioning/doc/src/cpp-qml-positioning.qdoc b/src/positioning/doc/src/cpp-qml-positioning.qdoc new file mode 100644 index 0000000..905ea3d --- /dev/null +++ b/src/positioning/doc/src/cpp-qml-positioning.qdoc @@ -0,0 +1,90 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! +\page positioning-cpp-qml.html +\title Interfaces between C++ and QML Code in Qt Positioning + +\brief Describes the methods used to exchange position data between C++ and QML +code. + +\section1 Overview + +Qt Positioning utilizes two methods to simplify exchange of position data +between C++ and QML code. + +\target Cpp_value_integration_positioning +\section1 Direct C++ Value Integration in QtPositioning + +Starting with Qt 5.5, it has become much easier to integrate non-QObject based +data types into QML. This is achieved by adding \l Q_GADGET support to \l QtQml. +The macro converts classes into a light-weight version of a \l QObject without +the required \l QObject inheritance. At the same time, it retains the reflection +capabilities of \l QMetaObject. As a result, they can be directly exposed to +QML. + +A significant number of Position related data types were converted to +\l {Q_GADGET}s. They retain their API and value type character but have become +introspectable via \l QMetaObject. + +The \l QML_ANONYMOUS macro is used to expose these types to the QML environment. +See the \l QQmlEngine documentation for more details and the full list of +available macros. + +The classes, however, are not directly extended with this macro, because we do +not want Qt Positioning to depend on \l QtQml. So a helper class is created for +each of them, and the \l QML_FOREIGN macro is used: + +\code +struct QGeoCoordinateForeign +{ + Q_GADGET + QML_FOREIGN(QGeoCoordinate) + QML_ANONYMOUS + QML_ADDED_IN_VERSION(5, 0) +}; +\endcode + +The above registration of Positioning types is automatically done once by the +QtPositioning QML plugin. + +\section1 QVariant Based integration + +This section provides information on how to integrate QGeoAddress and +QGeoLocation. + +\section2 Address - QGeoAddress + +The \l {QtPositioning::Address::address} {Address.address} property is used to +provide an interface between C++ and QML code. First a pointer to an +\l {QtPositioning::}{Address} object must be obtained from C++, then the +\l {QObject::}{property()} and \l {QObject::}{setProperty()} functions must be +used to get and set the \c address property. + +The following piece of code gets the \l QGeoAddress object from C++: + +\snippet cpp/cppqml.cpp Address get + +The following piece of code sets the address property of the QML object based +on a \l QGeoAddress object from C++: + +\snippet cpp/cppqml.cpp Address set + + +\section2 Location - QGeoLocation +The \l {Location::location} {Location.location} property is used to provide an +interface between C++ and QML code. First a pointer to a \l Location object +must be obtained from C++, then the \l {QObject::}{property()} and +\l {QObject::}{setProperty()} functions must be used to get and set the +\c location property. + +The following piece of code gets the \l QGeoLocation object from C++: + +\snippet cpp/cppqml.cpp Location get + +The following piece of code sets the location property of the QML object based +on a \l QGeoLocation object from C++: + +\snippet cpp/cppqml.cpp Location set + +*/ diff --git a/src/positioning/doc/src/external-resources.qdoc b/src/positioning/doc/src/external-resources.qdoc new file mode 100644 index 0000000..9a136b0 --- /dev/null +++ b/src/positioning/doc/src/external-resources.qdoc @@ -0,0 +1,47 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! +\externalpage https://developer.android.com/about/versions/oreo/background-location-limits +\title Background Location Limits +*/ + +/*! +\externalpage https://developer.android.com/guide/components/foreground-services +\title Foreground Service +*/ + +/*! +\externalpage https://developer.android.com/reference/android/Manifest.permission#ACCESS_BACKGROUND_LOCATION +\title ACCESS_BACKGROUND_LOCATION +*/ + +/*! +\externalpage https://developer.android.com/training/location/background +\title Access Location in the Background +*/ + +/*! +\externalpage https://gitlab.freedesktop.org/geoclue/geoclue/-/wikis/home +\title GeoClue service +*/ + +/*! +\externalpage https://www.freedesktop.org/software/geoclue/docs/gdbus-org.freedesktop.GeoClue2.Client.html#gdbus-property-org-freedesktop-GeoClue2-Client.DesktopId +\title GeoClue DesktopId property +*/ + +/*! +\externalpage https://gypsy.freedesktop.org/wiki/ +\title Gypsy daemon +*/ + +/*! +\externalpage https://developer.android.com/reference/android/location/Location.html#getBearingAccuracyDegrees%28%29 +\title Android getBearingAccuracyDegrees +*/ + +/*! +\externalpage https://developer.apple.com/documentation/corelocation/cllocation/3524338-courseaccuracy?language=objc +\title iOS courseAccuracy +*/ diff --git a/src/positioning/doc/src/plugins/geoclue2.qdoc b/src/positioning/doc/src/plugins/geoclue2.qdoc new file mode 100644 index 0000000..035d0a6 --- /dev/null +++ b/src/positioning/doc/src/plugins/geoclue2.qdoc @@ -0,0 +1,62 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! +\page position-plugin-geoclue2.html +\title Qt Positioning GeoClue v2 plugin +\ingroup QtPositioning-plugins + +\brief Uses the GeoClue v2 library to provide positioning updates + +\section1 Overview + +This plugin is an interface to the \l {GeoClue service}{GeoClue v2} library. +It requires this library to be installed on the system to function. + +The plugin uses D-Bus to establish communication with the GeoClue v2 D-Bus +service and to provide positioning information. + +The plugin can be used to receive only the positioning information. +It \e {does not} provide satellite information. + +The plugin can be loaded by using the provider name \b geoclue2. + +\section1 Parameters + +The following table lists parameters that \e can be passed to the geoclue2 +plugin. + +\table +\header + \li Parameter + \li Description +\row + \li desktopId + \li The \l {GeoClue DesktopId property}{Desktop Id} property used by the + D-Bus service. If the parameter is not specified, the application name + provided by \l QCoreApplication::applicationName() is used. +\endtable + +\section1 Examples + +The following examples show how to create a \b geoclue2 PositionSource from +C++ and QML. + +\section2 QML + +\code +PositionSource { + name: "geoclue2" + PluginParameter { name: "desktopId"; value: "SomeIdentifierString" } +} +\endcode + +\section2 C++ + +\code +QVariantMap params; +params["desktopId"] = "SomeIdentifierString"; +QGeoPositionInfoSource *positionSource = QGeoPositionInfoSource::createSource("geoclue2", params, this); +\endcode + +*/ diff --git a/src/positioning/doc/src/plugins/gypsy.qdoc b/src/positioning/doc/src/plugins/gypsy.qdoc new file mode 100644 index 0000000..bb4c33e --- /dev/null +++ b/src/positioning/doc/src/plugins/gypsy.qdoc @@ -0,0 +1,91 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! +\page position-plugin-gypsy.html +\title Qt Positioning Gypsy plugin +\ingroup QtPositioning-plugins + +\brief Uses the Gypsy daemon to provide satellite information + +\section1 Overview + +The plugin is an interface to the \l {Gypsy daemon}. It requires the daemon +to be installed and running on the system to function. + +The plugin uses D-Bus and GLib to connect to GPS device and provide satellite +information. + +Currently the plugin \e {does not} provide positioning information. + +The plugin can be loaded using provider name \b gypsy. + +\section1 Parameters + +The following table lists parameters that \e can be passed to the gypsy +plugin. + +\table +\header + \li Parameter + \li Description +\row + \li deviceName + \li The name of the device (or path to the device file) that will be used + to provide satellite information. The typical values can be + \c {/dev/ttyUSB0} or \c {/dev/ttyACM0}. +\row + \li gconfKey + \li The key that will be used to extract device name from the GConf + configuration system. +\endtable + +The plugin supports two ways of specifying the device name: +\list + \li Specify the device name directly with the \e deviceName plugin + parameter. + \li Specify the configuration key using \e gconfKey plugin parameter and + extract the device name from the GConf configuration system. This + approach is useful when the device name is already specified for some + other GConf-based application. +\endlist + +By default, when none of the parameters is specified, the plugin will try to +extract the device name from the GConf configuration system using the following +hardcoded key: + +\badcode +/apps/geoclue/master/org.freedesktop.Geoclue.GPSDevice +\endcode + +\section2 Using GConf to set parameters + +To specify a value for a key in the GConf configuration system, use +\e {gconftool-2} as follows: + +\badcode +gconftool-2 -t string -s /apps/geoclue/master/org.freedesktop.Geoclue.GPSDevice /dev/ttyUSB0 +\endcode + +\section1 Examples + +The following examples show how to create a \b gypsy satellite info source +from C++. + +Specifying device name directly: + +\code +QVariantMap parameters; +parameters["deviceName"] = "/dev/ttyACM0"; +QGeoSatelliteInfoSource *source = QGeoSatelliteInfoSource::createSource("gypsy", parameters, this); +\endcode + +Using GConf key: + +\code +QVariantMap parameters; +parameters["gconfKey"] = "/apps/myapp/mykey"; +QGeoSatelliteInfoSource *source = QGeoSatelliteInfoSource::createSource("gypsy", parameters, this); +\endcode + +*/ diff --git a/src/positioning/doc/src/plugins/nmea.qdoc b/src/positioning/doc/src/plugins/nmea.qdoc new file mode 100644 index 0000000..182cfc7 --- /dev/null +++ b/src/positioning/doc/src/plugins/nmea.qdoc @@ -0,0 +1,209 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! +\page position-plugin-nmea.html +\title Qt Positioning NMEA plugin +\ingroup QtPositioning-plugins + +\brief Reads the NMEA stream to provide position updates. + +\section1 Overview + +Included with Qt Positioning is a position plugin which parses NMEA sentences +into position updates. This plugin can use serial port, socket or file as a +source. + +This plugin can be loaded by using the provider name \b nmea. + +\section1 Parameters + +The following table lists parameters that \e can be passed to the nmea plugin. + +\table +\header + \li Parameter + \li Description +\row + \li nmea.source + \li The source that will be used to get NMEA data. +\row + \li nmea.baudrate + \li The baud rate to be used by the serial port connection, expressed with + a positive integer number. Typically it should be one of the values + from the \l QSerialPort::BaudRate enum. If the parameter is not + specified or does not contain a positive integer, the default value + of \c 4800 is used. +\row + \li nmea.satellite_info_simulation_interval + \li The interval for reading satellite information data from the file in + simulation mode. +\endtable + +Different sources require different ways of providing the data. The following +table lists different ways of providing \c {nmea.source} parameter for socket, +serial port and file inputs. + +\table +\header + \li Scheme + \li Example + \li Description +\row + \li socket://hostname:port + \li \c {socket://localhost:12345} + \li Use \b {socket:} keyword to specify that you want to get the nmea data + from the socket. A TCP socket will be created, which will try to connect + to host \c hostname using port \c port. Upon successful connection + a text NMEA stream is expected to be received from the server. +\row + \li {1, 3} serial:portname + \li \c {serial:/dev/ttyUSB0} + \li {1, 3} Use \b {serial:} keyword to specify that you want to get the nmea + data from the serial port. The plugin will try to establish a connection + to port \c portname with a default baudrate = 4800 Bd (the baudrate + value can be specified using \b {nmea.baudrate} parameter). Upon + successful connection + a text NMEA stream is expected to be received from the serial port. + If you use \b {serial:} without any port name, the plugin will try to + find one of the well known serial devices using vendor identifier. Note + however that this is not a recommended way of using the serial port + connection, as the list of well-known devices is small and most probably + does not include your hardware. +\row + \li \c {serial:COM1} +\row + \li \c {serial:} +\row + \li filepath + \li \c {/home/user/nmealog.txt} + \li {1, 2} Use \b {file:///} or just full file path to specify a path to a + local file. +\row + \li file:///filepath + \li \c {file:///home/user/nmealog.txt} +\row + \li qrc:///filepath + \li \c {qrc:///nmealog.txt} + \li Use \b {qrc:///} prefix to specify a path to a file in the application + resources. +\endtable + +\note If \c {nmea.source} parameter is not specified, the plugin will try to +locate one of the well-known serial devices (as if \c {nmea.source = serial:} +was specified). + +\section1 Position source usage example + +The following examples show how to create a \b nmea PositionSource +using different data sources. + +\section2 QML + +\code +// text file +PositionSource { + name: "nmea" + PluginParameter { name: "nmea.source"; value: "qrc:///nmealog.txt" } +} + +// socket +PositionSource { + name: "nmea" + PluginParameter { name: "nmea.source"; value: "socket://localhost:22222" } +} + +// serial port +PositionSource { + name: "nmea" + PluginParameter { name: "nmea.source"; value: "serial:/dev/ttyACM0" } + PluginParameter { name: "nmea.baudrate"; value: 4800 } +} +\endcode + +\section2 C++ + +\code +// text file +QVariantMap params; +params["nmea.source"] = "qrc:///nmealog.txt"; +QGeoPositionInfoSource *textPositionSource = QGeoPositionInfoSource::createSource("nmea", params, this); + +// socket +params["nmea.source"] = "socket://localhost:22222"; +QGeoPositionInfoSource *socketPositionSource = QGeoPositionInfoSource::createSource("nmea", params, this); + +// serial port +params["nmea.source"] = "serial:/dev/ttyACM0"; +params["nmea.baudrate"] = 4800; +QGeoPositionInfoSource *serialPositionSource = QGeoPositionInfoSource::createSource("nmea", params, this); +\endcode + +\note Once a PositionSource is created, it can't be reconfigured to use other +type of source data. + +\section1 Satellite information source usage example + +Apart from the position information, \b nmea plugin is also capable of providing +satellite information. + +\section2 QML + +\code +// serial port +SatelliteSource { + name: "nmea" + PluginParameter { name: "nmea.source"; value: "serial:/dev/ttyUSB0" } + PluginParameter { name: "nmea.baudrate"; value: 9600 } +} + +// socket +SatelliteSource { + name: "nmea" + PluginParameter { name: "nmea.source"; value: "socket://localhost:22222" } +} +\endcode + +\section2 C++ + +\code +// serial port +QVariantMap parameters; +parameters["nmea.source"] = "serial:/dev/ttyUSB0"; +params["nmea.baudrate"] = 9600; +QGeoSatelliteInfoSource *serialSource = QGeoSatelliteInfoSource::createSource("nmea", parameters, this); + +// socket +parameters["nmea.source"] = "socket://localhost:22222"; +QGeoSatelliteInfoSource *socketSource = QGeoSatelliteInfoSource::createSource("nmea", parameters, this); +\endcode + +\section2 Settings custom simulation speed + +If you want to use \l QGeoSatelliteInfoSource to read file with NMEA stream, you +can also use additional parameter \c "nmea.satellite_info_simulation_interval". +This parameter is used to specify the playback rate (in milliseconds) for the +satellite info messages. The minimum allowed frequency is specified by +\l {QGeoSatelliteInfoSource::}{minimumUpdateInterval()}. If you specify a +smaller value, it will be ignored. If no value is specified, the default value +is \c {qMax(100, minimumUpdateInterval())}. +At runtime \l {QNmeaSatelliteInfoSource::setBackendProperty()} method can be +used to update this parameter. + +\code +// file +QVariantMap parameters; +parameters["nmea.source"] = "qrc:///nmealog.txt"; +parameters["nmea.satellite_info_simulation_interval"] = 1000; +QGeoSatelliteInfoSource *fileSource = QGeoSatelliteInfoSource::createSource("nmea", parameters, this); +\endcode + +This parameter is not applicable to position source because NMEA protocol +already has timestamps in position messages. These timestamps are used to +simulate the correct message rate while using \l QGeoPositionInfoSource with +file as a data source. + +\note Once a \l QGeoSatelliteInfoSource is created, it can't be reconfigured to +use other type of source data. + +*/ diff --git a/src/positioning/doc/src/qml-position.qdoc b/src/positioning/doc/src/qml-position.qdoc new file mode 100644 index 0000000..0dde787 --- /dev/null +++ b/src/positioning/doc/src/qml-position.qdoc @@ -0,0 +1,90 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! +\page location-positioning-qml.html + +\title Positioning (QML) +\ingroup explanations-positioning +\brief The Location Positioning API enables location positioning by means of +GPS or an NMEA data source. + +\section1 Location Positioning + +Location data involves a precisely specified position on the Earth's +surface \unicode {0x2014} as provided by a latitude-longitude coordinate +\unicode {0x2014} along with associated data, such as: + + \list + \li The date and time at which the position was reported + \li The velocity of the device that reported the position + \li The altitude of the reported position (height above sea level) + \li The bearing of the device in degrees, relative to true north + \endlist + +For more information see +\l {http://en.wikipedia.org/wiki/Geographic_coordinate}{Geographic Coordinate}. + +This data can be extracted through a variety of methods. One of the most +well known methods of positioning is GPS (Global Positioning System), a +publicly available system that uses radiowave signals received from +Earth-orbiting satellites to calculate the precise position and time of +the receiver. Another popular method is 'Cell Identifier Positioning', which uses +the cell identifier of the cell site that is currently serving the receiving +device to calculate its approximate location. These and other positioning +methods can all be used with the Location API; the only requirement for a +location data source within the API is that it provides a +latitude-longitude coordinate with a date/time value, with the option of +providing the other attributes listed above. + +\section2 Coordinates + +The \l coordinate is a basic unit of geographical information. The +\l coordinate type has attributes to hold the \c latitude, +\c longitude and \c altitude. The \l {QtPositioning::}{Location} contains this +\l coordinate in addition to a physical address and a bounding box. +\b {See also}: \l {Place::location}{retrieving a location} + +\section2 Positions + +In addition to the \l coordinate type, which holds the three-dimensional +position of an object, \l Position provides \l {Position::speed}{speed} and a +\l {Position::timestamp}{timestamp} to compute future positions. +\l Position validates sensible values for these properties, which are +exposed as the following properties: +\list + \li \l {Position::latitudeValid}{latitudeValid} + \li \l {Position::longitudeValid}{longitudeValid} + \li \l {Position::altitudeValid}{altitudeValid} + \li \l {Position::speedValid}{speedValid} + \li \l {Position::horizontalAccuracyValid}{horizontalAccuracyValid} + \li \l {Position::verticalAccuracyValid}{verticalAccuracyValid} +\endlist + +\section2 PositionSource Type + +We have a \l Position type, a \l {coordinate} type but where does the data come +from? Also it is a good idea to be able to indicate alternative sources. +Perhaps instead of directly picking up GPS satellites it might be desirable to +do some testing using a datafile. + +The \l PositionSource type provides the developer with control, within the +limits allowed by the platform, of the source of the geographical data. +\l PositionSource supports multiple plugins, including an +\l {Qt Positioning NMEA plugin}{NMEA} plugin. + +\l {http://en.wikipedia.org/wiki/NMEA}{NMEA} is a common text-based +protocol for specifying navigational data. The \l PositionSource +\l {Qt Positioning NMEA plugin}{NMEA} plugin supports multiple data sources, +including raw file or TCP socket. The source will emit updates according to the +time stamp of each NMEA sentence to produce a "replay" of the recorded data. + +See the \l {Qt Positioning NMEA plugin}{plugin description} for usage examples. + +\section2 Satellite Info Example + +The \l {Satellite Info} example uses the \l PositionSource +and \l SatelliteSource QML types to get the satellite information relevant to +the current location. + +*/ diff --git a/src/positioning/doc/src/qt6-changes.qdoc b/src/positioning/doc/src/qt6-changes.qdoc new file mode 100644 index 0000000..fa3fd68 --- /dev/null +++ b/src/positioning/doc/src/qt6-changes.qdoc @@ -0,0 +1,209 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \page qtpositioning-changes-qt6.html + \title Changes to Qt Positioning + \ingroup changes-qt-5-to-6 + \brief Migrate Qt Positioning to Qt 6. + + Qt 6 is a result of the conscious effort to make the framework more + efficient and easy to use. + + We try to maintain binary and source compatibility for all the public + APIs in each release. But some changes were inevitable in an effort to + make Qt a better framework. + + In this topic we summarize those changes in Qt Positioning, and provide + guidance to handle them. + + \section1 Breaking public API changes + + This section contains information about API changes that break source + compatibility. + + \section2 Rename QGeoPolygon::path() + + The \c QGeoPolygon::path() and \c QGeoPolygon::setPath() methods are renamed + to \l QGeoPolygon::perimeter() and \l QGeoPolygon::setPerimeter() + respectively. On the QML side the \l QGeoPolygon::perimeter property can be + used without any changes. + + \section2 Use \l QGeoShape for \l QGeoLocation bounding area + + The \l QGeoLocation class and its \l [QML] Location QML counterpart are + updated to use \l QGeoShape instead of \l QGeoRectangle for a bounding area. + + \section3 C++ + + The \c QGeoLocation::boundingBox() and \c QGeoLocation::setBoundingBox() + are replaced by \l QGeoLocation::boundingShape() and + \l QGeoLocation::setBoundingShape() respectively. A \l QGeoShape object + is now used as an underlying data storage. + + \section3 QML + + The \c QGeoLocation::boundingBox property is replaced by + \l QGeoLocation::boundingShape. This property is available since + QtPositioning 6.2, so make sure to update the import version in the QML + files. + + \code + import QtPositioning 6.2 + \endcode + + \section2 Remove QGeoShape::extendShape() + + The \c QGeoShape::extendShape() method was deprecated in Qt 5.9 and finally + removed in Qt 6. Use \l QGeoRectangle::extendRectangle() and + \l QGeoCircle::extendCircle() if you need this functionality for these + classes. + + \section2 Rename signal error to errorOccurred + + In Qt 5 multiple Qt Positioning classes had the \c error() signal, which was + clashing with the \c error() method. In Qt 6 we renamed these signals to + \c errorOccurred(). Specifically: + + \list + + \li \c QGeoAreaMonitorSource::error() is renamed to + \l QGeoAreaMonitorSource::errorOccurred(). + + \li \c QGeoPositionInfoSource::error() is renamed to + \l QGeoPositionInfoSource::errorOccurred(). + + \li \c QGeoSatelliteInfoSource::error() is renamed to + \l QGeoSatelliteInfoSource::errorOccurred(). + + \endlist + + \section2 Remove update timeout signals + + In Qt 5 \c {QGeoPositionInfoSource::updateTimeout()} and + \c {QGeoSatelliteInfoSource::requestTimeout()} signals were used to notify + about the cases when the current position or satellite information could + not be retrieved within specified timeout. These signals were removed in + Qt 6. The \c {errorOccurred()} signals with the new error types are + used instead. Specifically: + + \list + + \li \l QGeoPositionInfoSource uses an \l {QGeoPositionInfoSource::} + {errorOccurred()} signal with a new + \l QGeoPositionInfoSource::UpdateTimeoutError error code. + + \li \l QGeoSatelliteInfoSource uses an \l {QGeoSatelliteInfoSource::} + {errorOccurred()} signal with a new + \l QGeoSatelliteInfoSource::UpdateTimeoutError error code. + + \endlist + + Same changes apply to \l [QML] PositionSource QML object. The + \c {PositionSource::updateTimeout()} signal is removed. + \l [QML] {PositionSource::sourceError} property with a + \c {PositionSource.UpdateTimeoutError} is used instead. + + \section2 Redesign NMEA support + + In Qt 5 we had a \b serialnmea positioning plugin and a \c nmeaSource + property in \l [QML] {PositionSource} object. + + The plugin provided access to NMEA streams via serial port, while the QML + object was responsible for reading NMEA stream from TCP socket or local + file. + + In Qt 6 we joined all these features in the plugin, which is now renamed to + \b nmea. It is now capable of working with all three NMEA data sources: + serial port, TCP socket and local file. See \l {Qt Positioning NMEA plugin} + {plugin description} for more details. + + The \c nmeaSource property of \l [QML] {PositionSource} object is now + removed. + + \section1 Other API changes + + This section contains API improvements that do not break source + compatibility. However they might have an impact on the application logic, + so it is still useful to know about them. + + \section2 Reset errors properly + + In Qt 5 the errors for \l QGeoAreaMonitorSource, \l QGeoPositionInfoSource + and \l QGeoSatelliteInfoSource classes were never reset. This behavior is + not logical, as calling \c {startUpdates()}, \c {startMonitoring()} or + \c {requestUpdates()} on one of these classes or their subclasses + effectively means starting a new work sessions, which means that we should + not care about previous errors. Since Qt 6 we reset the error to \c NoError + once one of the aforementioned methods is called. + + \section2 Add \l QGeoAddress::streetNumber + + The \l QGeoAddress class is extended with \l {QGeoAddress::}{streetNumber} + property, which holds the information about street number, building name, or + anything else that might be used to distinguish one address from another. + Use \l {QGeoAddress::}{streetNumber()} and \l {QGeoAddress::} + {setStreetNumber()} to access this property from C++ code. + + The \l QGeoAddress::street now holds only the street name. + + Same applies to \l [QML] {Address} QML counterpart. The \l [QML] + {Address::street} property is now used only for street name, while the + \l [QML] {Address::streetNumber} property is used for other important + address details. + + \section2 Add timeout argument to \l [QML] {PositionSource::update()} + + The \c timeout is specified in milliseconds. If the \c timeout is zero + (the default value), it defaults to a reasonable timeout period as + appropriate for the source. + + \section2 Refactor \l QGeoSatelliteInfo, \l QGeoPositionInfo and \l QGeoAreaMonitorInfo classes + + These classes now use \l QExplicitlySharedDataPointer in their + implementation. It means that the classes implement copy-on-write. It makes + them cheap to copy, so that they can be passed by value. + + Another improvement is the addition of support for the efficient move + operations. + + \section1 Changes in Qt Positioning plugin implementation + + This section provides information about the changes in plugin interface. + + In Qt 5 for we had two versions of plugin interface: + + \list + + \li \c QGeoPositionInfoSourceFactory which provided the basic features. + \li \c QGeoPositionInfoSourceFactoryV2 which extended the base class with + the possibility to provide custom parameters for the created objects. + + \endlist + + In Qt 6 we merged these two implementations into one, leaving only the + \l QGeoPositionInfoSourceFactory class. Its methods now allow to pass + custom parameters. + + \note The interface \e identifier is updated to reflect the major version + update. Use \c {"org.qt-project.qt.position.sourcefactory/6.0"} in your + Qt Positioning plugins. + + Here is an example of plugin class declaration: + + \code + class MyPlugin : public QObject, public QGeoPositionInfoSourceFactory + { + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0" + FILE "plugin.json") + Q_INTERFACES(QGeoPositionInfoSourceFactory) + + public: + QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override; + }; + \endcode + +*/ diff --git a/src/positioning/doc/src/qtpositioning-android.qdoc b/src/positioning/doc/src/qtpositioning-android.qdoc new file mode 100644 index 0000000..4644e65 --- /dev/null +++ b/src/positioning/doc/src/qtpositioning-android.qdoc @@ -0,0 +1,58 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! +\page qtpositioning-android.html +\inmodule QtPositioning +\title Qt Positioning on Android +\brief Notes on using Qt Positioning on Android + +\section1 Using Qt Positioning from Android Services + +Using Qt Positioning from a service requires several extra actions to be taken, +depending on the Android version. The sections below give more details on +these actions. + +\note Since Android 8 (API level 26), the OS limits how frequently an +application can retrieve the user's current location while running in the +background. The application will normally be able to receive location updates +only a few times each hour. For more information, see +\l {Background Location Limits}. + +\section2 Using Foreground Service + +Since Android 8 (API level 26), the background service can be killed by the +Android OS when the application goes to the background. This normally happens +after around a minute of running in the background. To keep the location service +running, the service should be implemented as a \l {Foreground Service}. Such +service shows a status bar notification, which cannot be dismissed until the +service is stopped or removed from the foreground. This allows the user to be +always aware of the important background activities. + +\note Since Android 9 (API level 28), foreground services require a special +\c FOREGROUND_SERVICE permission. See the Android documentation for more +details on implementing foreground services. + +\section2 Use Background Location Permission + +Since Android 10 (API level 29), the service \e must request the +\l {ACCESS_BACKGROUND_LOCATION} permission. It should be added to the +\c AndroidManifest.xml file as follows: + +\badcode + +\endcode + +\note Once the permission is added to \c {AndroidManifest.xml}, it is still +required to explicitly allow the constant access to the location services +for the application. To do it, one should navigate to \uicontrol Settings -> +\uicontrol {Apps}, select a proper application, open its permissions, and +specify the \uicontrol {Allow all the time} permission for Location +(see the screenshot below). + +\image permissions.png + +Check \l {Access Location in the Background} Android documentation for more +details. + +*/ diff --git a/src/positioning/doc/src/qtpositioning-examples.qdoc b/src/positioning/doc/src/qtpositioning-examples.qdoc new file mode 100644 index 0000000..aba0b9b --- /dev/null +++ b/src/positioning/doc/src/qtpositioning-examples.qdoc @@ -0,0 +1,13 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \group qtpositioning-examples + \title Qt Positioning Examples + \brief Examples for the Qt Positioning module + \ingroup qtpositioning + + The list of \l {Qt Positioning} examples demonstrating how to use + Positioning API from C++ and QML. + +*/ diff --git a/src/positioning/doc/src/qtpositioning-ios.qdoc b/src/positioning/doc/src/qtpositioning-ios.qdoc new file mode 100644 index 0000000..6c4d38b --- /dev/null +++ b/src/positioning/doc/src/qtpositioning-ios.qdoc @@ -0,0 +1,53 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! +\page qtpositioning-ios.html +\inmodule QtPositioning +\title Qt Positioning on iOS +\brief Notes on using Qt Positioning on iOS + +\section1 Using Qt Positioning Services from an iOS App + +To enable an app to use positioning services on an iOS device, entries must +be added to the Info.plist file based on whether the positioning services +are needed when the app is in use or when the app is running in the +background. + +Once the permission is added, the user needs to grant the permission for the +positioning services to be available when the app requests the positioning +service. The user can change this by going into Settings > Privacy > +Location Services, scrolling down to find the app, and selecting an option. +The location services must be on for the positioning services to work. + +\section2 Using Foreground Location Services Permission + +If an app makes use of the positioning services when it is running, the +Info.plist file needs to have an entry with the key \c +NSLocationWhenInUseUsageDescription and a value with a text string giving the +user the reason the app makes use of it. + +\badcode +NSLocationWhenInUseUsageDescription +The reason why the app needs location services +\endcode + +\section2 Use Background Location Services Permission + +If the app makes use of location services even when it is running in the +background, there needs to be an entry with the key \c +NSLocationAlwaysAndWhenInUseUsageDescription and the reason as string value +as well as \c NSLocationWhenInUseUsageDescription. + +\badcode +NSLocationWhenInUseUsageDescription +The reason why the app needs location services +NSLocationAlwaysAndWhenInUseUsageDescription +The reason why the app needs location services +\endcode + +\note The Info.plist file is automatically generated, and changes made can be +overwritten by qmake or CMake unless measures are taken. See +\l {Platform Notes - iOS} for more information. + +*/ diff --git a/src/positioning/doc/src/qtpositioning-plugins.qdoc b/src/positioning/doc/src/qtpositioning-plugins.qdoc new file mode 100644 index 0000000..f650e3c --- /dev/null +++ b/src/positioning/doc/src/qtpositioning-plugins.qdoc @@ -0,0 +1,90 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! +\page qtpositioning-plugins.html +\title Qt Positioning Plugins +\brief Default Plugins and Implementing Qt Positioning plugins + +Qt Positioning provides the majority of its functionality through plugins. +This document outlines how to develop a new position plugin. + +\section1 Default plugins +Some plugins already ship with Qt. These are: + +\table + \row + \li \b android + \li Wraps Android positioning subsystem. Available only on Android. + \row + \li \b corelocation + \li Wraps iOS and macOS positioning subsystems. Available only on Apple platforms supporting corelocation. + \row + \li \b geoclue2 + \li A \l {Qt Positioning GeoClue v2 plugin}{GeoClue v2} backend that + provides an interface to the GeoClue v2 D-Bus service. + \row + \li \b gypsy + \li A \l {Qt Positioning Gypsy plugin}{Gypsy} backend that provides + an interface to the Gypsy daemon. + \row + \li \b winrt + \li Wraps WinRT positioning subsystem. Available only on WinRT and Windows10. + \row + \li \b nmea + \li An \l {Qt Positioning NMEA plugin}{NMEA} backend that parses NMEA + streams from a GPS receiver to provide position updates. This plugin can + use serial port, socket or file as a source. + \row + \li \b positionpoll + \li A backend providing only area monitoring functionalities via polling on position updates. +\endtable + + +\section1 Plugin Description + +Each plugin is described by a json file. The json describes the plugins capabilities and +version. Below is an example of a json file used by the postionpoll plugin: + +\quotefile ../../../plugins/position/positionpoll/plugin.json + +The entries have the following meaning: + +\table + \header + \li Key + \li Description + \row + \li Keys + \li The unique name/key of the plugin. Each position plugin must have a unique name. + \row + \li Provider + \li The provider name of the services. Multiple plugins may have the same name. + In such cases the Version string will be used to further distinguish the plugins. + \row + \li Position + \li Set to \c true if the plugin implements a \l QGeoPositionInfoSource. + \row + \li Satellite + \li Set to \c true if the plugin implements a \l QGeoSatelliteInfoSource. + \row + \li Monitor + \li Set to \c true if the plugin implements a \l QGeoAreaMonitorSource. + \row + \li Priority + \li The plugin priority. If multiple plugins have the same provider name, the plugin + with the higest priority will be used. +\endtable + +\section1 Implementing Plugins + +A plugin implementer needs to subclass \l QGeoPositionInfoSourceFactory and override one or more of +its functions. If a plugin does not support a specific feature the function should return 0 or +utilize the default implementation. + +\list + \li \l QGeoPositionInfoSourceFactory::areaMonitor() + \li \l QGeoPositionInfoSourceFactory::positionInfoSource() + \li \l QGeoPositionInfoSourceFactory::satelliteInfoSource() +\endlist +*/ diff --git a/src/positioning/doc/src/qtpositioning-qml.qdoc b/src/positioning/doc/src/qtpositioning-qml.qdoc new file mode 100644 index 0000000..da462dd --- /dev/null +++ b/src/positioning/doc/src/qtpositioning-qml.qdoc @@ -0,0 +1,25 @@ +// Copyright (C) 2018 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \qmlmodule QtPositioning + \title Qt Positioning QML Types + \ingroup qmlmodules + \brief Provides QML types for position information. + + The identifying string for this module is \e QtPositioning. To use the QML + from this module, include the following import statement in the QML file: + + \qml + import QtPositioning + \endqml + + \section1 Value Types + + \generatelist qmlvaluetypesbymodule QtPositioning + + \section1 Object Types + + \generatelist qmltypesbymodule QtPositioning + \noautolist +*/ diff --git a/src/positioning/doc/src/qtpositioning.qdoc b/src/positioning/doc/src/qtpositioning.qdoc new file mode 100644 index 0000000..cbc1392 --- /dev/null +++ b/src/positioning/doc/src/qtpositioning.qdoc @@ -0,0 +1,129 @@ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \module QtPositioning + \title Qt Positioning C++ Classes + \ingroup modules + \qtcmakepackage Positioning + \qtvariable positioning + + \brief The Positioning module provides positioning information via QML and C++ interfaces. + + To load the Qt Positioning module, add the following statement to your .qml files + + \snippet doc_src_qtpositioning.qml import + + For C++ projects include the header appropriate for the current use case, + for example applications using routes may use + + \code + #include + \endcode + + \include module-use.qdocinc using qt module + + \badcode + find_package(Qt6 REQUIRED COMPONENTS Positioning) + target_link_libraries(mytarget PRIVATE Qt6::Positioning) + \endcode + + \include module-use.qdocinc building with qmake + + \badcode + QT += positioning + \endcode + + See more in the \l{Qt Positioning}{Qt Positioning Overview}. + +*/ + + + +/*! +\page qtpositioning-index.html +\title Qt Positioning +\brief The Qt Positioning API provides positioning information via QML and C++ interfaces. +\ingroup technology-apis + +The Qt Positioning API provides positioning information via QML and C++ interfaces. + +Currently, the API is supported on \l {Qt for Android}{Android}, +\l {Qt for iOS}{iOS}, \l {Qt for macOS}{\macos}, \l {Qt for Linux/X11}{Linux}, +and \l {Qt for Windows}{Windows} (with GPS receivers exposed as a serial port +providing NMEA sentences or using \c {Windows.Devices.Geolocation}). + +\section1 Overview + +The Qt Positioning API lets you to determine a position by using a variety of +possible sources, including satellite, wifi, or text files. That information can +then be used to, for example, determine a position on a map. In addition, you +can use to the API to retrieve satellite information and perform area based +monitoring. + +\section1 Using the Module + +\section2 QML API + +\include {module-use.qdocinc} {using the qml api} {QtPositioning} + +\section2 C++ API + +\include {module-use.qdocinc} {using the c++ api} + +\section3 Building with CMake + +\include {module-use.qdocinc} {building with cmake} {Positioning} + +\section3 Building with qmake + +\include {module-use.qdocinc} {building_with_qmake} {positioning} + +\section1 Permissions + +Starting from Qt 6.6, the Qt Positioning module uses new \l QPermission API +to handle \l {QLocationPermission}{location} permissions. This means that Qt +itself no longer queries for these permissions, so this needs to be done +directly from the client application. + +Please refer to the \l {Application Permissions} page for an example of how +to integrate the new \l QPermission API into the application. + +\section1 Articles and Guides + +\list + \li \l {Positioning (C++)} {Positioning introduction for C++} + \li \l {Positioning (QML)} {Positioning introduction for QML} + \li \l {Qt Positioning Plugins} + \li \l {Interfaces between C++ and QML Code in Qt Positioning} + \li \l {Qt Positioning on Android} + \li \l {Qt Positioning on iOS} +\endlist + +\section1 Examples + +\list + \li \l {Qt Positioning Examples} +\endlist + +\section1 Reference + +\list + \li \l {Qt Positioning C++ Classes} + \li \l {Qt Positioning QML Types} +\endlist + +\section1 Module Evolution + +\l {Changes to Qt Positioning} lists important changes in the module API and +functionality that were done for the Qt 6 series of Qt. + +\section1 Licenses + +Qt Positioning is available under commercial licenses from \l{The Qt Company}. +In addition, it is available under free software licenses. Since Qt 5.4, +these free software licenses are +\l{GNU Lesser General Public License, version 3}, or +the \l{GNU General Public License, version 2}. +See \l{Qt Licensing} for further details. +*/ diff --git a/src/positioning/qclipperutils.cpp b/src/positioning/qclipperutils.cpp new file mode 100644 index 0000000..7d36024 --- /dev/null +++ b/src/positioning/qclipperutils.cpp @@ -0,0 +1,120 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qclipperutils_p.h" +#include + +QT_BEGIN_NAMESPACE + +class QClipperUtilsPrivate +{ +public: + c2t::clip2tri m_clipper; + Path m_cachedPolygon; +}; + +static const double kClipperScaleFactor = 281474976710656.0; // 48 bits of precision +static const double kClipperScaleFactorInv = 1.0 / kClipperScaleFactor; + +static IntPoint toIntPoint(const QDoubleVector2D &p) +{ + return IntPoint(cInt(p.x() * kClipperScaleFactor), cInt(p.y() * kClipperScaleFactor)); +} + +static QDoubleVector2D toVector2D(const IntPoint &p) +{ + return QDoubleVector2D(double(p.X) * kClipperScaleFactorInv, double(p.Y) * kClipperScaleFactorInv); +} + +static QList pathToQList(const Path &path) +{ + QList res; + res.reserve(int(path.size())); + for (const IntPoint &ip: path) + res.append(toVector2D(ip)); + return res; +} + +static QList> pathsToQList(const Paths &paths) +{ + QList > res; + res.reserve(int(paths.size())); + for (const Path &p: paths) { + res.append(pathToQList(p)); + } + return res; +} + +static Path qListToPath(const QList &list) +{ + Path res; + res.reserve(list.size()); + for (const QDoubleVector2D &p: list) + res.push_back(toIntPoint(p)); + return res; +} + +QClipperUtils::QClipperUtils() : d_ptr(new QClipperUtilsPrivate) +{ +} + +QClipperUtils::QClipperUtils(const QClipperUtils &other) : d_ptr(new QClipperUtilsPrivate) +{ + d_ptr->m_cachedPolygon = other.d_ptr->m_cachedPolygon; +} + +QClipperUtils::~QClipperUtils() +{ + delete d_ptr; +} + +double QClipperUtils::clipperScaleFactor() +{ + return kClipperScaleFactor; +} + +int QClipperUtils::pointInPolygon(const QDoubleVector2D &point, const QList &polygon) +{ + if (polygon.isEmpty()) + qWarning("No vertices are specified for the polygon!"); + return c2t::clip2tri::pointInPolygon(toIntPoint(point), qListToPath(polygon)); +} + +void QClipperUtils::clearClipper() +{ + d_ptr->m_clipper.clearClipper(); +} + +void QClipperUtils::addSubjectPath(const QList &path, bool closed) +{ + d_ptr->m_clipper.addSubjectPath(qListToPath(path), closed); +} + +void QClipperUtils::addClipPolygon(const QList &path) +{ + d_ptr->m_clipper.addClipPolygon(qListToPath(path)); +} + +QList> QClipperUtils::execute(QClipperUtils::Operation op, + QClipperUtils::PolyFillType subjFillType, + QClipperUtils::PolyFillType clipFillType) +{ + auto result = d_ptr->m_clipper.execute(static_cast(op), + static_cast(subjFillType), + static_cast(clipFillType)); + return pathsToQList(result); +} + +void QClipperUtils::setPolygon(const QList &polygon) +{ + d_ptr->m_cachedPolygon = qListToPath(polygon); +} + +int QClipperUtils::pointInPolygon(const QDoubleVector2D &point) const +{ + if (d_ptr->m_cachedPolygon.empty()) + qWarning("No vertices are specified for the polygon!"); + return c2t::clip2tri::pointInPolygon(toIntPoint(point), d_ptr->m_cachedPolygon); +} + +QT_END_NAMESPACE diff --git a/src/positioning/qclipperutils_p.h b/src/positioning/qclipperutils_p.h new file mode 100644 index 0000000..fd67704 --- /dev/null +++ b/src/positioning/qclipperutils_p.h @@ -0,0 +1,85 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QCLIPPERUTILS_P_H +#define QCLIPPERUTILS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +/* + * This file is intended to be include only in source files of + * QtPositioning/QtLocation. It is in QtPositioning to enable manipulation + * of geo polygons + */ + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +/* + * This class provides a wrapper around the clip2tri library, so that + * we do not need to export any of the internal types. That is needed + * because after QtLocation and QtPositioning are moved to different + * repos, we need to use the features of the library in QtLocation without + * explicitly linking to it. +*/ + +class QClipperUtilsPrivate; +class Q_POSITIONING_PRIVATE_EXPORT QClipperUtils +{ +public: + QClipperUtils(); + QClipperUtils(const QClipperUtils &other); + ~QClipperUtils(); + + // Must be in sync with c2t::clip2tri::Operation + enum Operation { + Union, + Intersection, + Difference, + Xor + }; + + // Must be in sync with QtClipperLib::PolyFillType + enum PolyFillType { + pftEvenOdd, + pftNonZero, + pftPositive, + pftNegative + }; + + static double clipperScaleFactor(); + + static int pointInPolygon(const QDoubleVector2D &point, const QList &polygon); + + // wrap some useful non-static methods of c2t::clip2tri + void clearClipper(); + void addSubjectPath(const QList &path, bool closed); + void addClipPolygon(const QList &path); + QList> execute(Operation op, PolyFillType subjFillType = pftNonZero, + PolyFillType clipFillType = pftNonZero); + + // For optimization purposes. Set the polygon once and check for multiple + // points. Without the need to convert between Qt and clip2tri types + // every time + void setPolygon(const QList &polygon); + int pointInPolygon(const QDoubleVector2D &point) const; + +private: + QClipperUtilsPrivate *d_ptr; +}; + +QT_END_NAMESPACE + +#endif // QCLIPPERUTILS_P_H diff --git a/src/positioning/qdoublematrix4x4.cpp b/src/positioning/qdoublematrix4x4.cpp new file mode 100644 index 0000000..23f5229 --- /dev/null +++ b/src/positioning/qdoublematrix4x4.cpp @@ -0,0 +1,1081 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qdoublematrix4x4_p.h" +#include +//#include +#include +#include + +QT_BEGIN_NAMESPACE + +QDoubleMatrix4x4::QDoubleMatrix4x4(const double *values) +{ + for (int row = 0; row < 4; ++row) + for (int col = 0; col < 4; ++col) + m[col][row] = values[row * 4 + col]; + flagBits = General; +} + +QDoubleMatrix4x4::QDoubleMatrix4x4(const double *values, int cols, int rows) +{ + for (int col = 0; col < 4; ++col) { + for (int row = 0; row < 4; ++row) { + if (col < cols && row < rows) + m[col][row] = values[col * rows + row]; + else if (col == row) + m[col][row] = 1.0; + else + m[col][row] = 0.0; + } + } + flagBits = General; +} + +static inline double matrixDet2(const double m[4][4], int col0, int col1, int row0, int row1) +{ + return m[col0][row0] * m[col1][row1] - m[col0][row1] * m[col1][row0]; +} + +static inline double matrixDet3 + (const double m[4][4], int col0, int col1, int col2, + int row0, int row1, int row2) +{ + return m[col0][row0] * matrixDet2(m, col1, col2, row1, row2) + - m[col1][row0] * matrixDet2(m, col0, col2, row1, row2) + + m[col2][row0] * matrixDet2(m, col0, col1, row1, row2); +} + +static inline double matrixDet4(const double m[4][4]) +{ + double det; + det = m[0][0] * matrixDet3(m, 1, 2, 3, 1, 2, 3); + det -= m[1][0] * matrixDet3(m, 0, 2, 3, 1, 2, 3); + det += m[2][0] * matrixDet3(m, 0, 1, 3, 1, 2, 3); + det -= m[3][0] * matrixDet3(m, 0, 1, 2, 1, 2, 3); + return det; +} + +double QDoubleMatrix4x4::determinant() const +{ + if ((flagBits & ~(Translation | Rotation2D | Rotation)) == Identity) + return 1.0; + + if (flagBits < Rotation2D) + return m[0][0] * m[1][1] * m[2][2]; // Translation | Scale + if (flagBits < Perspective) + return matrixDet3(m, 0, 1, 2, 0, 1, 2); + return matrixDet4(m); +} + +QDoubleMatrix4x4 QDoubleMatrix4x4::inverted(bool *invertible) const +{ + // Handle some of the easy cases first. + if (flagBits == Identity) { + if (invertible) + *invertible = true; + return QDoubleMatrix4x4(); + } else if (flagBits == Translation) { + QDoubleMatrix4x4 inv; + inv.m[3][0] = -m[3][0]; + inv.m[3][1] = -m[3][1]; + inv.m[3][2] = -m[3][2]; + inv.flagBits = Translation; + if (invertible) + *invertible = true; + return inv; + } else if (flagBits < Rotation2D) { + // Translation | Scale + if (m[0][0] == 0 || m[1][1] == 0 || m[2][2] == 0) { + if (invertible) + *invertible = false; + return QDoubleMatrix4x4(); + } + QDoubleMatrix4x4 inv; + inv.m[0][0] = 1.0 / m[0][0]; + inv.m[1][1] = 1.0 / m[1][1]; + inv.m[2][2] = 1.0 / m[2][2]; + inv.m[3][0] = -m[3][0] * inv.m[0][0]; + inv.m[3][1] = -m[3][1] * inv.m[1][1]; + inv.m[3][2] = -m[3][2] * inv.m[2][2]; + inv.flagBits = flagBits; + + if (invertible) + *invertible = true; + return inv; + } else if ((flagBits & ~(Translation | Rotation2D | Rotation)) == Identity) { + if (invertible) + *invertible = true; + return orthonormalInverse(); + } else if (flagBits < Perspective) { + QDoubleMatrix4x4 inv(1); // The "1" says to not load the identity. + + double det = matrixDet3(m, 0, 1, 2, 0, 1, 2); + if (det == 0.0) { + if (invertible) + *invertible = false; + return QDoubleMatrix4x4(); + } + det = 1.0 / det; + + inv.m[0][0] = matrixDet2(m, 1, 2, 1, 2) * det; + inv.m[0][1] = -matrixDet2(m, 0, 2, 1, 2) * det; + inv.m[0][2] = matrixDet2(m, 0, 1, 1, 2) * det; + inv.m[0][3] = 0; + inv.m[1][0] = -matrixDet2(m, 1, 2, 0, 2) * det; + inv.m[1][1] = matrixDet2(m, 0, 2, 0, 2) * det; + inv.m[1][2] = -matrixDet2(m, 0, 1, 0, 2) * det; + inv.m[1][3] = 0; + inv.m[2][0] = matrixDet2(m, 1, 2, 0, 1) * det; + inv.m[2][1] = -matrixDet2(m, 0, 2, 0, 1) * det; + inv.m[2][2] = matrixDet2(m, 0, 1, 0, 1) * det; + inv.m[2][3] = 0; + inv.m[3][0] = -inv.m[0][0] * m[3][0] - inv.m[1][0] * m[3][1] - inv.m[2][0] * m[3][2]; + inv.m[3][1] = -inv.m[0][1] * m[3][0] - inv.m[1][1] * m[3][1] - inv.m[2][1] * m[3][2]; + inv.m[3][2] = -inv.m[0][2] * m[3][0] - inv.m[1][2] * m[3][1] - inv.m[2][2] * m[3][2]; + inv.m[3][3] = 1; + inv.flagBits = flagBits; + + if (invertible) + *invertible = true; + return inv; + } + + QDoubleMatrix4x4 inv(1); // The "1" says to not load the identity. + + double det = matrixDet4(m); + if (det == 0.0) { + if (invertible) + *invertible = false; + return QDoubleMatrix4x4(); + } + det = 1.0 / det; + + inv.m[0][0] = matrixDet3(m, 1, 2, 3, 1, 2, 3) * det; + inv.m[0][1] = -matrixDet3(m, 0, 2, 3, 1, 2, 3) * det; + inv.m[0][2] = matrixDet3(m, 0, 1, 3, 1, 2, 3) * det; + inv.m[0][3] = -matrixDet3(m, 0, 1, 2, 1, 2, 3) * det; + inv.m[1][0] = -matrixDet3(m, 1, 2, 3, 0, 2, 3) * det; + inv.m[1][1] = matrixDet3(m, 0, 2, 3, 0, 2, 3) * det; + inv.m[1][2] = -matrixDet3(m, 0, 1, 3, 0, 2, 3) * det; + inv.m[1][3] = matrixDet3(m, 0, 1, 2, 0, 2, 3) * det; + inv.m[2][0] = matrixDet3(m, 1, 2, 3, 0, 1, 3) * det; + inv.m[2][1] = -matrixDet3(m, 0, 2, 3, 0, 1, 3) * det; + inv.m[2][2] = matrixDet3(m, 0, 1, 3, 0, 1, 3) * det; + inv.m[2][3] = -matrixDet3(m, 0, 1, 2, 0, 1, 3) * det; + inv.m[3][0] = -matrixDet3(m, 1, 2, 3, 0, 1, 2) * det; + inv.m[3][1] = matrixDet3(m, 0, 2, 3, 0, 1, 2) * det; + inv.m[3][2] = -matrixDet3(m, 0, 1, 3, 0, 1, 2) * det; + inv.m[3][3] = matrixDet3(m, 0, 1, 2, 0, 1, 2) * det; + inv.flagBits = flagBits; + + if (invertible) + *invertible = true; + return inv; +} + +QDoubleMatrix4x4 QDoubleMatrix4x4::transposed() const +{ + QDoubleMatrix4x4 result(1); // The "1" says to not load the identity. + for (int row = 0; row < 4; ++row) { + for (int col = 0; col < 4; ++col) { + result.m[col][row] = m[row][col]; + } + } + // When a translation is transposed, it becomes a perspective transformation. + result.flagBits = (flagBits & Translation ? General : flagBits); + return result; +} + +QDoubleMatrix4x4& QDoubleMatrix4x4::operator/=(double divisor) +{ + m[0][0] /= divisor; + m[0][1] /= divisor; + m[0][2] /= divisor; + m[0][3] /= divisor; + m[1][0] /= divisor; + m[1][1] /= divisor; + m[1][2] /= divisor; + m[1][3] /= divisor; + m[2][0] /= divisor; + m[2][1] /= divisor; + m[2][2] /= divisor; + m[2][3] /= divisor; + m[3][0] /= divisor; + m[3][1] /= divisor; + m[3][2] /= divisor; + m[3][3] /= divisor; + flagBits = General; + return *this; +} + +QDoubleMatrix4x4 operator/(const QDoubleMatrix4x4& matrix, double divisor) +{ + QDoubleMatrix4x4 m(1); // The "1" says to not load the identity. + m.m[0][0] = matrix.m[0][0] / divisor; + m.m[0][1] = matrix.m[0][1] / divisor; + m.m[0][2] = matrix.m[0][2] / divisor; + m.m[0][3] = matrix.m[0][3] / divisor; + m.m[1][0] = matrix.m[1][0] / divisor; + m.m[1][1] = matrix.m[1][1] / divisor; + m.m[1][2] = matrix.m[1][2] / divisor; + m.m[1][3] = matrix.m[1][3] / divisor; + m.m[2][0] = matrix.m[2][0] / divisor; + m.m[2][1] = matrix.m[2][1] / divisor; + m.m[2][2] = matrix.m[2][2] / divisor; + m.m[2][3] = matrix.m[2][3] / divisor; + m.m[3][0] = matrix.m[3][0] / divisor; + m.m[3][1] = matrix.m[3][1] / divisor; + m.m[3][2] = matrix.m[3][2] / divisor; + m.m[3][3] = matrix.m[3][3] / divisor; + m.flagBits = QDoubleMatrix4x4::General; + return m; +} + +void QDoubleMatrix4x4::scale(const QDoubleVector3D& vector) +{ + double vx = vector.x(); + double vy = vector.y(); + double vz = vector.z(); + if (flagBits < Scale) { + m[0][0] = vx; + m[1][1] = vy; + m[2][2] = vz; + } else if (flagBits < Rotation2D) { + m[0][0] *= vx; + m[1][1] *= vy; + m[2][2] *= vz; + } else if (flagBits < Rotation) { + m[0][0] *= vx; + m[0][1] *= vx; + m[1][0] *= vy; + m[1][1] *= vy; + m[2][2] *= vz; + } else { + m[0][0] *= vx; + m[0][1] *= vx; + m[0][2] *= vx; + m[0][3] *= vx; + m[1][0] *= vy; + m[1][1] *= vy; + m[1][2] *= vy; + m[1][3] *= vy; + m[2][0] *= vz; + m[2][1] *= vz; + m[2][2] *= vz; + m[2][3] *= vz; + } + flagBits |= Scale; +} + +void QDoubleMatrix4x4::scale(double x, double y) +{ + if (flagBits < Scale) { + m[0][0] = x; + m[1][1] = y; + } else if (flagBits < Rotation2D) { + m[0][0] *= x; + m[1][1] *= y; + } else if (flagBits < Rotation) { + m[0][0] *= x; + m[0][1] *= x; + m[1][0] *= y; + m[1][1] *= y; + } else { + m[0][0] *= x; + m[0][1] *= x; + m[0][2] *= x; + m[0][3] *= x; + m[1][0] *= y; + m[1][1] *= y; + m[1][2] *= y; + m[1][3] *= y; + } + flagBits |= Scale; +} + +void QDoubleMatrix4x4::scale(double x, double y, double z) +{ + if (flagBits < Scale) { + m[0][0] = x; + m[1][1] = y; + m[2][2] = z; + } else if (flagBits < Rotation2D) { + m[0][0] *= x; + m[1][1] *= y; + m[2][2] *= z; + } else if (flagBits < Rotation) { + m[0][0] *= x; + m[0][1] *= x; + m[1][0] *= y; + m[1][1] *= y; + m[2][2] *= z; + } else { + m[0][0] *= x; + m[0][1] *= x; + m[0][2] *= x; + m[0][3] *= x; + m[1][0] *= y; + m[1][1] *= y; + m[1][2] *= y; + m[1][3] *= y; + m[2][0] *= z; + m[2][1] *= z; + m[2][2] *= z; + m[2][3] *= z; + } + flagBits |= Scale; +} + +void QDoubleMatrix4x4::scale(double factor) +{ + if (flagBits < Scale) { + m[0][0] = factor; + m[1][1] = factor; + m[2][2] = factor; + } else if (flagBits < Rotation2D) { + m[0][0] *= factor; + m[1][1] *= factor; + m[2][2] *= factor; + } else if (flagBits < Rotation) { + m[0][0] *= factor; + m[0][1] *= factor; + m[1][0] *= factor; + m[1][1] *= factor; + m[2][2] *= factor; + } else { + m[0][0] *= factor; + m[0][1] *= factor; + m[0][2] *= factor; + m[0][3] *= factor; + m[1][0] *= factor; + m[1][1] *= factor; + m[1][2] *= factor; + m[1][3] *= factor; + m[2][0] *= factor; + m[2][1] *= factor; + m[2][2] *= factor; + m[2][3] *= factor; + } + flagBits |= Scale; +} + +void QDoubleMatrix4x4::translate(const QDoubleVector3D& vector) +{ + double vx = vector.x(); + double vy = vector.y(); + double vz = vector.z(); + if (flagBits == Identity) { + m[3][0] = vx; + m[3][1] = vy; + m[3][2] = vz; + } else if (flagBits == Translation) { + m[3][0] += vx; + m[3][1] += vy; + m[3][2] += vz; + } else if (flagBits == Scale) { + m[3][0] = m[0][0] * vx; + m[3][1] = m[1][1] * vy; + m[3][2] = m[2][2] * vz; + } else if (flagBits == (Translation | Scale)) { + m[3][0] += m[0][0] * vx; + m[3][1] += m[1][1] * vy; + m[3][2] += m[2][2] * vz; + } else if (flagBits < Rotation) { + m[3][0] += m[0][0] * vx + m[1][0] * vy; + m[3][1] += m[0][1] * vx + m[1][1] * vy; + m[3][2] += m[2][2] * vz; + } else { + m[3][0] += m[0][0] * vx + m[1][0] * vy + m[2][0] * vz; + m[3][1] += m[0][1] * vx + m[1][1] * vy + m[2][1] * vz; + m[3][2] += m[0][2] * vx + m[1][2] * vy + m[2][2] * vz; + m[3][3] += m[0][3] * vx + m[1][3] * vy + m[2][3] * vz; + } + flagBits |= Translation; +} + +void QDoubleMatrix4x4::translate(double x, double y) +{ + if (flagBits == Identity) { + m[3][0] = x; + m[3][1] = y; + } else if (flagBits == Translation) { + m[3][0] += x; + m[3][1] += y; + } else if (flagBits == Scale) { + m[3][0] = m[0][0] * x; + m[3][1] = m[1][1] * y; + } else if (flagBits == (Translation | Scale)) { + m[3][0] += m[0][0] * x; + m[3][1] += m[1][1] * y; + } else if (flagBits < Rotation) { + m[3][0] += m[0][0] * x + m[1][0] * y; + m[3][1] += m[0][1] * x + m[1][1] * y; + } else { + m[3][0] += m[0][0] * x + m[1][0] * y; + m[3][1] += m[0][1] * x + m[1][1] * y; + m[3][2] += m[0][2] * x + m[1][2] * y; + m[3][3] += m[0][3] * x + m[1][3] * y; + } + flagBits |= Translation; +} + +void QDoubleMatrix4x4::translate(double x, double y, double z) +{ + if (flagBits == Identity) { + m[3][0] = x; + m[3][1] = y; + m[3][2] = z; + } else if (flagBits == Translation) { + m[3][0] += x; + m[3][1] += y; + m[3][2] += z; + } else if (flagBits == Scale) { + m[3][0] = m[0][0] * x; + m[3][1] = m[1][1] * y; + m[3][2] = m[2][2] * z; + } else if (flagBits == (Translation | Scale)) { + m[3][0] += m[0][0] * x; + m[3][1] += m[1][1] * y; + m[3][2] += m[2][2] * z; + } else if (flagBits < Rotation) { + m[3][0] += m[0][0] * x + m[1][0] * y; + m[3][1] += m[0][1] * x + m[1][1] * y; + m[3][2] += m[2][2] * z; + } else { + m[3][0] += m[0][0] * x + m[1][0] * y + m[2][0] * z; + m[3][1] += m[0][1] * x + m[1][1] * y + m[2][1] * z; + m[3][2] += m[0][2] * x + m[1][2] * y + m[2][2] * z; + m[3][3] += m[0][3] * x + m[1][3] * y + m[2][3] * z; + } + flagBits |= Translation; +} + +void QDoubleMatrix4x4::rotate(double angle, const QDoubleVector3D& vector) +{ + rotate(angle, vector.x(), vector.y(), vector.z()); +} + +void QDoubleMatrix4x4::rotate(double angle, double x, double y, double z) +{ + if (angle == 0.0) + return; + double c, s; + if (angle == 90.0 || angle == -270.0) { + s = 1.0; + c = 0.0; + } else if (angle == -90.0 || angle == 270.0) { + s = -1.0; + c = 0.0; + } else if (angle == 180.0 || angle == -180.0) { + s = 0.0; + c = -1.0; + } else { + double a = qDegreesToRadians(angle); + c = std::cos(a); + s = std::sin(a); + } + if (x == 0.0) { + if (y == 0.0) { + if (z != 0.0) { + // Rotate around the Z axis. + if (z < 0) + s = -s; + double tmp; + m[0][0] = (tmp = m[0][0]) * c + m[1][0] * s; + m[1][0] = m[1][0] * c - tmp * s; + m[0][1] = (tmp = m[0][1]) * c + m[1][1] * s; + m[1][1] = m[1][1] * c - tmp * s; + m[0][2] = (tmp = m[0][2]) * c + m[1][2] * s; + m[1][2] = m[1][2] * c - tmp * s; + m[0][3] = (tmp = m[0][3]) * c + m[1][3] * s; + m[1][3] = m[1][3] * c - tmp * s; + + flagBits |= Rotation2D; + return; + } + } else if (z == 0.0) { + // Rotate around the Y axis. + if (y < 0) + s = -s; + double tmp; + m[2][0] = (tmp = m[2][0]) * c + m[0][0] * s; + m[0][0] = m[0][0] * c - tmp * s; + m[2][1] = (tmp = m[2][1]) * c + m[0][1] * s; + m[0][1] = m[0][1] * c - tmp * s; + m[2][2] = (tmp = m[2][2]) * c + m[0][2] * s; + m[0][2] = m[0][2] * c - tmp * s; + m[2][3] = (tmp = m[2][3]) * c + m[0][3] * s; + m[0][3] = m[0][3] * c - tmp * s; + + flagBits |= Rotation; + return; + } + } else if (y == 0.0 && z == 0.0) { + // Rotate around the X axis. + if (x < 0) + s = -s; + double tmp; + m[1][0] = (tmp = m[1][0]) * c + m[2][0] * s; + m[2][0] = m[2][0] * c - tmp * s; + m[1][1] = (tmp = m[1][1]) * c + m[2][1] * s; + m[2][1] = m[2][1] * c - tmp * s; + m[1][2] = (tmp = m[1][2]) * c + m[2][2] * s; + m[2][2] = m[2][2] * c - tmp * s; + m[1][3] = (tmp = m[1][3]) * c + m[2][3] * s; + m[2][3] = m[2][3] * c - tmp * s; + + flagBits |= Rotation; + return; + } + + double len = double(x) * double(x) + + double(y) * double(y) + + double(z) * double(z); + if (!qFuzzyCompare(len, 1.0) && !qFuzzyIsNull(len)) { + len = std::sqrt(len); + x = double(double(x) / len); + y = double(double(y) / len); + z = double(double(z) / len); + } + double ic = 1.0 - c; + QDoubleMatrix4x4 rot(1); // The "1" says to not load the identity. + rot.m[0][0] = x * x * ic + c; + rot.m[1][0] = x * y * ic - z * s; + rot.m[2][0] = x * z * ic + y * s; + rot.m[3][0] = 0.0; + rot.m[0][1] = y * x * ic + z * s; + rot.m[1][1] = y * y * ic + c; + rot.m[2][1] = y * z * ic - x * s; + rot.m[3][1] = 0.0; + rot.m[0][2] = x * z * ic - y * s; + rot.m[1][2] = y * z * ic + x * s; + rot.m[2][2] = z * z * ic + c; + rot.m[3][2] = 0.0; + rot.m[0][3] = 0.0; + rot.m[1][3] = 0.0; + rot.m[2][3] = 0.0; + rot.m[3][3] = 1.0; + rot.flagBits = Rotation; + *this *= rot; +} + +void QDoubleMatrix4x4::projectedRotate(double angle, double x, double y, double z, + double distanceToPlane) +{ + // Used by QGraphicsRotation::applyTo() to perform a rotation + // and projection back to 2D in a single step. + if (qIsNull(distanceToPlane)) + return rotate(angle, x, y, z); + if (angle == 0.0) + return; + double c, s; + if (angle == 90.0 || angle == -270.0) { + s = 1.0; + c = 0.0; + } else if (angle == -90.0 || angle == 270.0) { + s = -1.0; + c = 0.0; + } else if (angle == 180.0 || angle == -180.0) { + s = 0.0; + c = -1.0; + } else { + double a = qDegreesToRadians(angle); + c = std::cos(a); + s = std::sin(a); + } + + const double d = 1.0 / distanceToPlane; + if (x == 0.0) { + if (y == 0.0) { + if (z != 0.0) { + // Rotate around the Z axis. + if (z < 0) + s = -s; + double tmp; + m[0][0] = (tmp = m[0][0]) * c + m[1][0] * s; + m[1][0] = m[1][0] * c - tmp * s; + m[0][1] = (tmp = m[0][1]) * c + m[1][1] * s; + m[1][1] = m[1][1] * c - tmp * s; + m[0][2] = (tmp = m[0][2]) * c + m[1][2] * s; + m[1][2] = m[1][2] * c - tmp * s; + m[0][3] = (tmp = m[0][3]) * c + m[1][3] * s; + m[1][3] = m[1][3] * c - tmp * s; + + flagBits |= Rotation2D; + return; + } + } else if (z == 0.0) { + // Rotate around the Y axis. + if (y < 0) + s = -s; + s *= d; + m[0][0] = m[0][0] * c + m[3][0] * s; + m[0][1] = m[0][1] * c + m[3][1] * s; + m[0][2] = m[0][2] * c + m[3][2] * s; + m[0][3] = m[0][3] * c + m[3][3] * s; + flagBits = General; + return; + } + } else if (y == 0.0 && z == 0.0) { + // Rotate around the X axis. + if (x < 0) + s = -s; + s *= d; + m[1][0] = m[1][0] * c - m[3][0] * s; + m[1][1] = m[1][1] * c - m[3][1] * s; + m[1][2] = m[1][2] * c - m[3][2] * s; + m[1][3] = m[1][3] * c - m[3][3] * s; + flagBits = General; + return; + } + double len = double(x) * double(x) + + double(y) * double(y) + + double(z) * double(z); + if (!qFuzzyCompare(len, 1.0) && !qFuzzyIsNull(len)) { + len = std::sqrt(len); + x = double(double(x) / len); + y = double(double(y) / len); + z = double(double(z) / len); + } + double ic = 1.0 - c; + QDoubleMatrix4x4 rot(1); // The "1" says to not load the identity. + rot.m[0][0] = x * x * ic + c; + rot.m[1][0] = x * y * ic - z * s; + rot.m[2][0] = 0.0; + rot.m[3][0] = 0.0; + rot.m[0][1] = y * x * ic + z * s; + rot.m[1][1] = y * y * ic + c; + rot.m[2][1] = 0.0; + rot.m[3][1] = 0.0; + rot.m[0][2] = 0.0; + rot.m[1][2] = 0.0; + rot.m[2][2] = 1.0; + rot.m[3][2] = 0.0; + rot.m[0][3] = (x * z * ic - y * s) * -d; + rot.m[1][3] = (y * z * ic + x * s) * -d; + rot.m[2][3] = 0.0; + rot.m[3][3] = 1.0; + rot.flagBits = General; + *this *= rot; +} + +void QDoubleMatrix4x4::ortho(const QRect& rect) +{ + // Note: rect.right() and rect.bottom() subtract 1 in QRect, + // which gives the location of a pixel within the rectangle, + // instead of the extent of the rectangle. We want the extent. + // QRectF expresses the extent properly. + ortho(rect.x(), rect.x() + rect.width(), rect.y() + rect.height(), rect.y(), -1.0, 1.0); +} + +void QDoubleMatrix4x4::ortho(const QRectF& rect) +{ + ortho(rect.left(), rect.right(), rect.bottom(), rect.top(), -1.0, 1.0); +} + +void QDoubleMatrix4x4::ortho(double left, double right, double bottom, double top, double nearPlane, double farPlane) +{ + // Bail out if the projection volume is zero-sized. + if (left == right || bottom == top || nearPlane == farPlane) + return; + + // Construct the projection. + double width = right - left; + double invheight = top - bottom; + double clip = farPlane - nearPlane; + QDoubleMatrix4x4 m(1); + m.m[0][0] = 2.0 / width; + m.m[1][0] = 0.0; + m.m[2][0] = 0.0; + m.m[3][0] = -(left + right) / width; + m.m[0][1] = 0.0; + m.m[1][1] = 2.0 / invheight; + m.m[2][1] = 0.0; + m.m[3][1] = -(top + bottom) / invheight; + m.m[0][2] = 0.0; + m.m[1][2] = 0.0; + m.m[2][2] = -2.0 / clip; + m.m[3][2] = -(nearPlane + farPlane) / clip; + m.m[0][3] = 0.0; + m.m[1][3] = 0.0; + m.m[2][3] = 0.0; + m.m[3][3] = 1.0; + m.flagBits = Translation | Scale; + + // Apply the projection. + *this *= m; +} + +void QDoubleMatrix4x4::frustum(double left, double right, double bottom, double top, double nearPlane, double farPlane) +{ + // Bail out if the projection volume is zero-sized. + if (left == right || bottom == top || nearPlane == farPlane) + return; + + // Construct the projection. + QDoubleMatrix4x4 m(1); + double width = right - left; + double invheight = top - bottom; + double clip = farPlane - nearPlane; + m.m[0][0] = 2.0 * nearPlane / width; + m.m[1][0] = 0.0; + m.m[2][0] = (left + right) / width; + m.m[3][0] = 0.0; + m.m[0][1] = 0.0; + m.m[1][1] = 2.0 * nearPlane / invheight; + m.m[2][1] = (top + bottom) / invheight; + m.m[3][1] = 0.0; + m.m[0][2] = 0.0; + m.m[1][2] = 0.0; + m.m[2][2] = -(nearPlane + farPlane) / clip; + m.m[3][2] = -2.0 * nearPlane * farPlane / clip; + m.m[0][3] = 0.0; + m.m[1][3] = 0.0; + m.m[2][3] = -1.0; + m.m[3][3] = 0.0; + m.flagBits = General; + + // Apply the projection. + *this *= m; +} + +void QDoubleMatrix4x4::perspective(double verticalAngle, double aspectRatio, double nearPlane, double farPlane) +{ + // Bail out if the projection volume is zero-sized. + if (nearPlane == farPlane || aspectRatio == 0.0) + return; + + // Construct the projection. + QDoubleMatrix4x4 m(1); + double radians = qDegreesToRadians(verticalAngle / 2.0); + double sine = std::sin(radians); + if (sine == 0.0) + return; + double cotan = std::cos(radians) / sine; + double clip = farPlane - nearPlane; + m.m[0][0] = cotan / aspectRatio; + m.m[1][0] = 0.0; + m.m[2][0] = 0.0; + m.m[3][0] = 0.0; + m.m[0][1] = 0.0; + m.m[1][1] = cotan; + m.m[2][1] = 0.0; + m.m[3][1] = 0.0; + m.m[0][2] = 0.0; + m.m[1][2] = 0.0; + m.m[2][2] = -(nearPlane + farPlane) / clip; + m.m[3][2] = -(2.0 * nearPlane * farPlane) / clip; + m.m[0][3] = 0.0; + m.m[1][3] = 0.0; + m.m[2][3] = -1.0; + m.m[3][3] = 0.0; + m.flagBits = General; + + // Apply the projection. + *this *= m; +} + +void QDoubleMatrix4x4::lookAt(const QDoubleVector3D& eye, const QDoubleVector3D& center, const QDoubleVector3D& up) +{ + QDoubleVector3D forward = center - eye; + if (qFuzzyIsNull(forward.x()) && qFuzzyIsNull(forward.y()) && qFuzzyIsNull(forward.z())) + return; + + forward.normalize(); + QDoubleVector3D side = QDoubleVector3D::crossProduct(forward, up).normalized(); + QDoubleVector3D upVector = QDoubleVector3D::crossProduct(side, forward); + + QDoubleMatrix4x4 m(1); + m.m[0][0] = side.x(); + m.m[1][0] = side.y(); + m.m[2][0] = side.z(); + m.m[3][0] = 0.0; + m.m[0][1] = upVector.x(); + m.m[1][1] = upVector.y(); + m.m[2][1] = upVector.z(); + m.m[3][1] = 0.0; + m.m[0][2] = -forward.x(); + m.m[1][2] = -forward.y(); + m.m[2][2] = -forward.z(); + m.m[3][2] = 0.0; + m.m[0][3] = 0.0; + m.m[1][3] = 0.0; + m.m[2][3] = 0.0; + m.m[3][3] = 1.0; + m.flagBits = Rotation; + + *this *= m; + translate(-eye); +} + +void QDoubleMatrix4x4::viewport(double left, double bottom, double width, double height, double nearPlane, double farPlane) +{ + const double w2 = width / 2.0; + const double h2 = height / 2.0; + + QDoubleMatrix4x4 m(1); + m.m[0][0] = w2; + m.m[1][0] = 0.0; + m.m[2][0] = 0.0; + m.m[3][0] = left + w2; + m.m[0][1] = 0.0; + m.m[1][1] = h2; + m.m[2][1] = 0.0; + m.m[3][1] = bottom + h2; + m.m[0][2] = 0.0; + m.m[1][2] = 0.0; + m.m[2][2] = (farPlane - nearPlane) / 2.0; + m.m[3][2] = (nearPlane + farPlane) / 2.0; + m.m[0][3] = 0.0; + m.m[1][3] = 0.0; + m.m[2][3] = 0.0; + m.m[3][3] = 1.0; + m.flagBits = General; + + *this *= m; +} + +void QDoubleMatrix4x4::flipCoordinates() +{ + // Multiplying the y and z coordinates with -1 does NOT flip between right-handed and + // left-handed coordinate systems, it just rotates 180 degrees around the x axis, so + // I'm deprecating this function. + if (flagBits < Rotation2D) { + // Translation | Scale + m[1][1] = -m[1][1]; + m[2][2] = -m[2][2]; + } else { + m[1][0] = -m[1][0]; + m[1][1] = -m[1][1]; + m[1][2] = -m[1][2]; + m[1][3] = -m[1][3]; + m[2][0] = -m[2][0]; + m[2][1] = -m[2][1]; + m[2][2] = -m[2][2]; + m[2][3] = -m[2][3]; + } + flagBits |= Scale; +} + +void QDoubleMatrix4x4::copyDataTo(double *values) const +{ + for (int row = 0; row < 4; ++row) + for (int col = 0; col < 4; ++col) + values[row * 4 + col] = double(m[col][row]); +} + +QRect QDoubleMatrix4x4::mapRect(const QRect& rect) const +{ + if (flagBits < Scale) { + // Translation + return QRect(qRound(rect.x() + m[3][0]), + qRound(rect.y() + m[3][1]), + rect.width(), rect.height()); + } else if (flagBits < Rotation2D) { + // Translation | Scale + double x = rect.x() * m[0][0] + m[3][0]; + double y = rect.y() * m[1][1] + m[3][1]; + double w = rect.width() * m[0][0]; + double h = rect.height() * m[1][1]; + if (w < 0) { + w = -w; + x -= w; + } + if (h < 0) { + h = -h; + y -= h; + } + return QRect(qRound(x), qRound(y), qRound(w), qRound(h)); + } + + QPoint tl = map(rect.topLeft()); + QPoint tr = map(QPoint(rect.x() + rect.width(), rect.y())); + QPoint bl = map(QPoint(rect.x(), rect.y() + rect.height())); + QPoint br = map(QPoint(rect.x() + rect.width(), + rect.y() + rect.height())); + + int xmin = qMin(qMin(tl.x(), tr.x()), qMin(bl.x(), br.x())); + int xmax = qMax(qMax(tl.x(), tr.x()), qMax(bl.x(), br.x())); + int ymin = qMin(qMin(tl.y(), tr.y()), qMin(bl.y(), br.y())); + int ymax = qMax(qMax(tl.y(), tr.y()), qMax(bl.y(), br.y())); + + return QRect(xmin, ymin, xmax - xmin, ymax - ymin); +} + +QRectF QDoubleMatrix4x4::mapRect(const QRectF& rect) const +{ + if (flagBits < Scale) { + // Translation + return rect.translated(m[3][0], m[3][1]); + } else if (flagBits < Rotation2D) { + // Translation | Scale + double x = rect.x() * m[0][0] + m[3][0]; + double y = rect.y() * m[1][1] + m[3][1]; + double w = rect.width() * m[0][0]; + double h = rect.height() * m[1][1]; + if (w < 0) { + w = -w; + x -= w; + } + if (h < 0) { + h = -h; + y -= h; + } + return QRectF(x, y, w, h); + } + + QPointF tl = map(rect.topLeft()); QPointF tr = map(rect.topRight()); + QPointF bl = map(rect.bottomLeft()); QPointF br = map(rect.bottomRight()); + + double xmin = qMin(qMin(tl.x(), tr.x()), qMin(bl.x(), br.x())); + double xmax = qMax(qMax(tl.x(), tr.x()), qMax(bl.x(), br.x())); + double ymin = qMin(qMin(tl.y(), tr.y()), qMin(bl.y(), br.y())); + double ymax = qMax(qMax(tl.y(), tr.y()), qMax(bl.y(), br.y())); + + return QRectF(QPointF(xmin, ymin), QPointF(xmax, ymax)); +} + +QDoubleMatrix4x4 QDoubleMatrix4x4::orthonormalInverse() const +{ + QDoubleMatrix4x4 result(1); // The '1' says not to load identity + + result.m[0][0] = m[0][0]; + result.m[1][0] = m[0][1]; + result.m[2][0] = m[0][2]; + + result.m[0][1] = m[1][0]; + result.m[1][1] = m[1][1]; + result.m[2][1] = m[1][2]; + + result.m[0][2] = m[2][0]; + result.m[1][2] = m[2][1]; + result.m[2][2] = m[2][2]; + + result.m[0][3] = 0.0; + result.m[1][3] = 0.0; + result.m[2][3] = 0.0; + + result.m[3][0] = -(result.m[0][0] * m[3][0] + result.m[1][0] * m[3][1] + result.m[2][0] * m[3][2]); + result.m[3][1] = -(result.m[0][1] * m[3][0] + result.m[1][1] * m[3][1] + result.m[2][1] * m[3][2]); + result.m[3][2] = -(result.m[0][2] * m[3][0] + result.m[1][2] * m[3][1] + result.m[2][2] * m[3][2]); + result.m[3][3] = 1.0; + + result.flagBits = flagBits; + + return result; +} + +void QDoubleMatrix4x4::optimize() +{ + // If the last row is not (0, 0, 0, 1), the matrix is not a special type. + flagBits = General; + if (m[0][3] != 0 || m[1][3] != 0 || m[2][3] != 0 || m[3][3] != 1) + return; + + flagBits &= ~Perspective; + + // If the last column is (0, 0, 0, 1), then there is no translation. + if (m[3][0] == 0 && m[3][1] == 0 && m[3][2] == 0) + flagBits &= ~Translation; + + // If the two first elements of row 3 and column 3 are 0, then any rotation must be about Z. + if (!m[0][2] && !m[1][2] && !m[2][0] && !m[2][1]) { + flagBits &= ~Rotation; + // If the six non-diagonal elements in the top left 3x3 matrix are 0, there is no rotation. + if (!m[0][1] && !m[1][0]) { + flagBits &= ~Rotation2D; + // Check for identity. + if (m[0][0] == 1 && m[1][1] == 1 && m[2][2] == 1) + flagBits &= ~Scale; + } else { + // If the columns are orthonormal and form a right-handed system, then there is no scale. + double det = matrixDet2(m, 0, 1, 0, 1); + double lenX = m[0][0] * m[0][0] + m[0][1] * m[0][1]; + double lenY = m[1][0] * m[1][0] + m[1][1] * m[1][1]; + double lenZ = m[2][2]; + if (qFuzzyCompare(det, 1.0) && qFuzzyCompare(lenX, 1.0) + && qFuzzyCompare(lenY, 1.0) && qFuzzyCompare(lenZ, 1.0)) + { + flagBits &= ~Scale; + } + } + } else { + // If the columns are orthonormal and form a right-handed system, then there is no scale. + double det = matrixDet3(m, 0, 1, 2, 0, 1, 2); + double lenX = m[0][0] * m[0][0] + m[0][1] * m[0][1] + m[0][2] * m[0][2]; + double lenY = m[1][0] * m[1][0] + m[1][1] * m[1][1] + m[1][2] * m[1][2]; + double lenZ = m[2][0] * m[2][0] + m[2][1] * m[2][1] + m[2][2] * m[2][2]; + if (qFuzzyCompare(det, 1.0) && qFuzzyCompare(lenX, 1.0) + && qFuzzyCompare(lenY, 1.0) && qFuzzyCompare(lenZ, 1.0)) + { + flagBits &= ~Scale; + } + } +} + +#ifndef QT_NO_DEBUG_STREAM + +QDebug operator<<(QDebug dbg, const QDoubleMatrix4x4 &m) +{ + QDebugStateSaver saver(dbg); + // Create a string that represents the matrix type. + QByteArray bits; + if (m.flagBits == QDoubleMatrix4x4::Identity) { + bits = "Identity"; + } else if (m.flagBits == QDoubleMatrix4x4::General) { + bits = "General"; + } else { + if ((m.flagBits & QDoubleMatrix4x4::Translation) != 0) + bits += "Translation,"; + if ((m.flagBits & QDoubleMatrix4x4::Scale) != 0) + bits += "Scale,"; + if ((m.flagBits & QDoubleMatrix4x4::Rotation2D) != 0) + bits += "Rotation2D,"; + if ((m.flagBits & QDoubleMatrix4x4::Rotation) != 0) + bits += "Rotation,"; + if ((m.flagBits & QDoubleMatrix4x4::Perspective) != 0) + bits += "Perspective,"; + if (!bits.isEmpty()) + bits = bits.left(bits.size() - 1); + } + + // Output in row-major order because it is more human-readable. + dbg.nospace() << "QDoubleMatrix4x4(type:" << bits.constData() << Qt::endl + << qSetFieldWidth(10) + << m(0, 0) << m(0, 1) << m(0, 2) << m(0, 3) << Qt::endl + << m(1, 0) << m(1, 1) << m(1, 2) << m(1, 3) << Qt::endl + << m(2, 0) << m(2, 1) << m(2, 2) << m(2, 3) << Qt::endl + << m(3, 0) << m(3, 1) << m(3, 2) << m(3, 3) << Qt::endl + << qSetFieldWidth(0) << ')'; + return dbg; +} + +#endif + +#ifndef QT_NO_DATASTREAM + +QDataStream &operator<<(QDataStream &stream, const QDoubleMatrix4x4 &matrix) +{ + for (int row = 0; row < 4; ++row) + for (int col = 0; col < 4; ++col) + stream << matrix(row, col); + return stream; +} + +QDataStream &operator>>(QDataStream &stream, QDoubleMatrix4x4 &matrix) +{ + double x; + for (int row = 0; row < 4; ++row) { + for (int col = 0; col < 4; ++col) { + stream >> x; + matrix(row, col) = x; + } + } + matrix.optimize(); + return stream; +} + +#endif // QT_NO_DATASTREAM + +QT_END_NAMESPACE diff --git a/src/positioning/qdoublematrix4x4_p.h b/src/positioning/qdoublematrix4x4_p.h new file mode 100644 index 0000000..ffeaab7 --- /dev/null +++ b/src/positioning/qdoublematrix4x4_p.h @@ -0,0 +1,911 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QDOUBLEMATRIX4X4_H +#define QDOUBLEMATRIX4X4_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +/* + * This class is a copy/paste/replace of QMatrix4x4 + * No algorithm has been changed. + * Some methods have been removed. + */ + +class Q_POSITIONING_PRIVATE_EXPORT QDoubleMatrix4x4 +{ +public: + inline QDoubleMatrix4x4() { setToIdentity(); } + explicit QDoubleMatrix4x4(Qt::Initialization) : flagBits(General) {} + explicit QDoubleMatrix4x4(const double *values); + inline QDoubleMatrix4x4(double m11, double m12, double m13, double m14, + double m21, double m22, double m23, double m24, + double m31, double m32, double m33, double m34, + double m41, double m42, double m43, double m44); + + QDoubleMatrix4x4(const double *values, int cols, int rows); + + inline const double& operator()(int row, int column) const; + inline double& operator()(int row, int column); + + inline bool isAffine() const; + + inline bool isIdentity() const; + inline void setToIdentity(); + + inline void fill(double value); + + double determinant() const; + QDoubleMatrix4x4 inverted(bool *invertible = nullptr) const; + QDoubleMatrix4x4 transposed() const; + + inline QDoubleMatrix4x4& operator+=(const QDoubleMatrix4x4& other); + inline QDoubleMatrix4x4& operator-=(const QDoubleMatrix4x4& other); + inline QDoubleMatrix4x4& operator*=(const QDoubleMatrix4x4& other); + inline QDoubleMatrix4x4& operator*=(double factor); + QDoubleMatrix4x4& operator/=(double divisor); + inline bool operator==(const QDoubleMatrix4x4& other) const; + inline bool operator!=(const QDoubleMatrix4x4& other) const; + + friend QDoubleMatrix4x4 operator+(const QDoubleMatrix4x4& m1, const QDoubleMatrix4x4& m2); + friend QDoubleMatrix4x4 operator-(const QDoubleMatrix4x4& m1, const QDoubleMatrix4x4& m2); + friend QDoubleMatrix4x4 operator*(const QDoubleMatrix4x4& m1, const QDoubleMatrix4x4& m2); + + friend QDoubleVector3D operator*(const QDoubleMatrix4x4& matrix, const QDoubleVector3D& vector); + friend QDoubleVector3D operator*(const QDoubleVector3D& vector, const QDoubleMatrix4x4& matrix); + + friend QPoint operator*(const QPoint& point, const QDoubleMatrix4x4& matrix); + friend QPointF operator*(const QPointF& point, const QDoubleMatrix4x4& matrix); + friend QDoubleMatrix4x4 operator-(const QDoubleMatrix4x4& matrix); + friend QPoint operator*(const QDoubleMatrix4x4& matrix, const QPoint& point); + friend QPointF operator*(const QDoubleMatrix4x4& matrix, const QPointF& point); + friend QDoubleMatrix4x4 operator*(double factor, const QDoubleMatrix4x4& matrix); + friend QDoubleMatrix4x4 operator*(const QDoubleMatrix4x4& matrix, double factor); + friend Q_POSITIONING_PRIVATE_EXPORT QDoubleMatrix4x4 operator/(const QDoubleMatrix4x4& matrix, double divisor); + + friend inline bool qFuzzyCompare(const QDoubleMatrix4x4& m1, const QDoubleMatrix4x4& m2); + + + void scale(const QDoubleVector3D& vector); + void translate(const QDoubleVector3D& vector); + void rotate(double angle, const QDoubleVector3D& vector); + + void scale(double x, double y); + void scale(double x, double y, double z); + void scale(double factor); + void translate(double x, double y); + void translate(double x, double y, double z); + void rotate(double angle, double x, double y, double z = 0.0f); + + void ortho(const QRect& rect); + void ortho(const QRectF& rect); + void ortho(double left, double right, double bottom, double top, double nearPlane, double farPlane); + void frustum(double left, double right, double bottom, double top, double nearPlane, double farPlane); + void perspective(double verticalAngle, double aspectRatio, double nearPlane, double farPlane); + + void lookAt(const QDoubleVector3D& eye, const QDoubleVector3D& center, const QDoubleVector3D& up); + + void viewport(const QRectF &rect); + void viewport(double left, double bottom, double width, double height, double nearPlane = 0.0f, double farPlane = 1.0f); + void flipCoordinates(); + + void copyDataTo(double *values) const; + + QPoint map(const QPoint& point) const; + QPointF map(const QPointF& point) const; + + QDoubleVector3D map(const QDoubleVector3D& point) const; + QDoubleVector3D mapVector(const QDoubleVector3D& vector) const; + + QRect mapRect(const QRect& rect) const; + QRectF mapRect(const QRectF& rect) const; + + inline double *data(); + inline const double *data() const { return *m; } + inline const double *constData() const { return *m; } + + void optimize(); + +#ifndef QT_NO_DEBUG_STREAM + friend Q_POSITIONING_PRIVATE_EXPORT QDebug operator<<(QDebug dbg, const QDoubleMatrix4x4 &m); +#endif + +private: + double m[4][4]; // Column-major order to match OpenGL. + int flagBits; // Flag bits from the enum below. + + // When matrices are multiplied, the flag bits are or-ed together. + enum { + Identity = 0x0000, // Identity matrix + Translation = 0x0001, // Contains a translation + Scale = 0x0002, // Contains a scale + Rotation2D = 0x0004, // Contains a rotation about the Z axis + Rotation = 0x0008, // Contains an arbitrary rotation + Perspective = 0x0010, // Last row is different from (0, 0, 0, 1) + General = 0x001f // General matrix, unknown contents + }; + + // Construct without initializing identity matrix. + explicit QDoubleMatrix4x4(int) { } + + QDoubleMatrix4x4 orthonormalInverse() const; + + void projectedRotate(double angle, double x, double y, double z, + double distanceToPlane = 1024.0); +}; + +Q_DECLARE_TYPEINFO(QDoubleMatrix4x4, Q_RELOCATABLE_TYPE); + +inline QDoubleMatrix4x4::QDoubleMatrix4x4 + (double m11, double m12, double m13, double m14, + double m21, double m22, double m23, double m24, + double m31, double m32, double m33, double m34, + double m41, double m42, double m43, double m44) +{ + m[0][0] = m11; m[0][1] = m21; m[0][2] = m31; m[0][3] = m41; + m[1][0] = m12; m[1][1] = m22; m[1][2] = m32; m[1][3] = m42; + m[2][0] = m13; m[2][1] = m23; m[2][2] = m33; m[2][3] = m43; + m[3][0] = m14; m[3][1] = m24; m[3][2] = m34; m[3][3] = m44; + flagBits = General; +} + +inline const double& QDoubleMatrix4x4::operator()(int aRow, int aColumn) const +{ + Q_ASSERT(aRow >= 0 && aRow < 4 && aColumn >= 0 && aColumn < 4); + return m[aColumn][aRow]; +} + +inline double& QDoubleMatrix4x4::operator()(int aRow, int aColumn) +{ + Q_ASSERT(aRow >= 0 && aRow < 4 && aColumn >= 0 && aColumn < 4); + flagBits = General; + return m[aColumn][aRow]; +} + +Q_POSITIONING_PRIVATE_EXPORT QDoubleMatrix4x4 operator/(const QDoubleMatrix4x4& matrix, double divisor); + +inline bool QDoubleMatrix4x4::isAffine() const +{ + return m[0][3] == 0.0f && m[1][3] == 0.0f && m[2][3] == 0.0f && m[3][3] == 1.0f; +} + +inline bool QDoubleMatrix4x4::isIdentity() const +{ + if (flagBits == Identity) + return true; + if (m[0][0] != 1.0f || m[0][1] != 0.0f || m[0][2] != 0.0f) + return false; + if (m[0][3] != 0.0f || m[1][0] != 0.0f || m[1][1] != 1.0f) + return false; + if (m[1][2] != 0.0f || m[1][3] != 0.0f || m[2][0] != 0.0f) + return false; + if (m[2][1] != 0.0f || m[2][2] != 1.0f || m[2][3] != 0.0f) + return false; + if (m[3][0] != 0.0f || m[3][1] != 0.0f || m[3][2] != 0.0f) + return false; + return (m[3][3] == 1.0f); +} + +inline void QDoubleMatrix4x4::setToIdentity() +{ + m[0][0] = 1.0f; + m[0][1] = 0.0f; + m[0][2] = 0.0f; + m[0][3] = 0.0f; + m[1][0] = 0.0f; + m[1][1] = 1.0f; + m[1][2] = 0.0f; + m[1][3] = 0.0f; + m[2][0] = 0.0f; + m[2][1] = 0.0f; + m[2][2] = 1.0f; + m[2][3] = 0.0f; + m[3][0] = 0.0f; + m[3][1] = 0.0f; + m[3][2] = 0.0f; + m[3][3] = 1.0f; + flagBits = Identity; +} + +inline void QDoubleMatrix4x4::fill(double value) +{ + m[0][0] = value; + m[0][1] = value; + m[0][2] = value; + m[0][3] = value; + m[1][0] = value; + m[1][1] = value; + m[1][2] = value; + m[1][3] = value; + m[2][0] = value; + m[2][1] = value; + m[2][2] = value; + m[2][3] = value; + m[3][0] = value; + m[3][1] = value; + m[3][2] = value; + m[3][3] = value; + flagBits = General; +} + +inline QDoubleMatrix4x4& QDoubleMatrix4x4::operator+=(const QDoubleMatrix4x4& other) +{ + m[0][0] += other.m[0][0]; + m[0][1] += other.m[0][1]; + m[0][2] += other.m[0][2]; + m[0][3] += other.m[0][3]; + m[1][0] += other.m[1][0]; + m[1][1] += other.m[1][1]; + m[1][2] += other.m[1][2]; + m[1][3] += other.m[1][3]; + m[2][0] += other.m[2][0]; + m[2][1] += other.m[2][1]; + m[2][2] += other.m[2][2]; + m[2][3] += other.m[2][3]; + m[3][0] += other.m[3][0]; + m[3][1] += other.m[3][1]; + m[3][2] += other.m[3][2]; + m[3][3] += other.m[3][3]; + flagBits = General; + return *this; +} + +inline QDoubleMatrix4x4& QDoubleMatrix4x4::operator-=(const QDoubleMatrix4x4& other) +{ + m[0][0] -= other.m[0][0]; + m[0][1] -= other.m[0][1]; + m[0][2] -= other.m[0][2]; + m[0][3] -= other.m[0][3]; + m[1][0] -= other.m[1][0]; + m[1][1] -= other.m[1][1]; + m[1][2] -= other.m[1][2]; + m[1][3] -= other.m[1][3]; + m[2][0] -= other.m[2][0]; + m[2][1] -= other.m[2][1]; + m[2][2] -= other.m[2][2]; + m[2][3] -= other.m[2][3]; + m[3][0] -= other.m[3][0]; + m[3][1] -= other.m[3][1]; + m[3][2] -= other.m[3][2]; + m[3][3] -= other.m[3][3]; + flagBits = General; + return *this; +} + +inline QDoubleMatrix4x4& QDoubleMatrix4x4::operator*=(const QDoubleMatrix4x4& other) +{ + flagBits |= other.flagBits; + + if (flagBits < Rotation2D) { + m[3][0] += m[0][0] * other.m[3][0]; + m[3][1] += m[1][1] * other.m[3][1]; + m[3][2] += m[2][2] * other.m[3][2]; + + m[0][0] *= other.m[0][0]; + m[1][1] *= other.m[1][1]; + m[2][2] *= other.m[2][2]; + return *this; + } + + double m0, m1, m2; + m0 = m[0][0] * other.m[0][0] + + m[1][0] * other.m[0][1] + + m[2][0] * other.m[0][2] + + m[3][0] * other.m[0][3]; + m1 = m[0][0] * other.m[1][0] + + m[1][0] * other.m[1][1] + + m[2][0] * other.m[1][2] + + m[3][0] * other.m[1][3]; + m2 = m[0][0] * other.m[2][0] + + m[1][0] * other.m[2][1] + + m[2][0] * other.m[2][2] + + m[3][0] * other.m[2][3]; + m[3][0] = m[0][0] * other.m[3][0] + + m[1][0] * other.m[3][1] + + m[2][0] * other.m[3][2] + + m[3][0] * other.m[3][3]; + m[0][0] = m0; + m[1][0] = m1; + m[2][0] = m2; + + m0 = m[0][1] * other.m[0][0] + + m[1][1] * other.m[0][1] + + m[2][1] * other.m[0][2] + + m[3][1] * other.m[0][3]; + m1 = m[0][1] * other.m[1][0] + + m[1][1] * other.m[1][1] + + m[2][1] * other.m[1][2] + + m[3][1] * other.m[1][3]; + m2 = m[0][1] * other.m[2][0] + + m[1][1] * other.m[2][1] + + m[2][1] * other.m[2][2] + + m[3][1] * other.m[2][3]; + m[3][1] = m[0][1] * other.m[3][0] + + m[1][1] * other.m[3][1] + + m[2][1] * other.m[3][2] + + m[3][1] * other.m[3][3]; + m[0][1] = m0; + m[1][1] = m1; + m[2][1] = m2; + + m0 = m[0][2] * other.m[0][0] + + m[1][2] * other.m[0][1] + + m[2][2] * other.m[0][2] + + m[3][2] * other.m[0][3]; + m1 = m[0][2] * other.m[1][0] + + m[1][2] * other.m[1][1] + + m[2][2] * other.m[1][2] + + m[3][2] * other.m[1][3]; + m2 = m[0][2] * other.m[2][0] + + m[1][2] * other.m[2][1] + + m[2][2] * other.m[2][2] + + m[3][2] * other.m[2][3]; + m[3][2] = m[0][2] * other.m[3][0] + + m[1][2] * other.m[3][1] + + m[2][2] * other.m[3][2] + + m[3][2] * other.m[3][3]; + m[0][2] = m0; + m[1][2] = m1; + m[2][2] = m2; + + m0 = m[0][3] * other.m[0][0] + + m[1][3] * other.m[0][1] + + m[2][3] * other.m[0][2] + + m[3][3] * other.m[0][3]; + m1 = m[0][3] * other.m[1][0] + + m[1][3] * other.m[1][1] + + m[2][3] * other.m[1][2] + + m[3][3] * other.m[1][3]; + m2 = m[0][3] * other.m[2][0] + + m[1][3] * other.m[2][1] + + m[2][3] * other.m[2][2] + + m[3][3] * other.m[2][3]; + m[3][3] = m[0][3] * other.m[3][0] + + m[1][3] * other.m[3][1] + + m[2][3] * other.m[3][2] + + m[3][3] * other.m[3][3]; + m[0][3] = m0; + m[1][3] = m1; + m[2][3] = m2; + return *this; +} + +inline QDoubleMatrix4x4& QDoubleMatrix4x4::operator*=(double factor) +{ + m[0][0] *= factor; + m[0][1] *= factor; + m[0][2] *= factor; + m[0][3] *= factor; + m[1][0] *= factor; + m[1][1] *= factor; + m[1][2] *= factor; + m[1][3] *= factor; + m[2][0] *= factor; + m[2][1] *= factor; + m[2][2] *= factor; + m[2][3] *= factor; + m[3][0] *= factor; + m[3][1] *= factor; + m[3][2] *= factor; + m[3][3] *= factor; + flagBits = General; + return *this; +} + +inline bool QDoubleMatrix4x4::operator==(const QDoubleMatrix4x4& other) const +{ + return m[0][0] == other.m[0][0] && + m[0][1] == other.m[0][1] && + m[0][2] == other.m[0][2] && + m[0][3] == other.m[0][3] && + m[1][0] == other.m[1][0] && + m[1][1] == other.m[1][1] && + m[1][2] == other.m[1][2] && + m[1][3] == other.m[1][3] && + m[2][0] == other.m[2][0] && + m[2][1] == other.m[2][1] && + m[2][2] == other.m[2][2] && + m[2][3] == other.m[2][3] && + m[3][0] == other.m[3][0] && + m[3][1] == other.m[3][1] && + m[3][2] == other.m[3][2] && + m[3][3] == other.m[3][3]; +} + +inline bool QDoubleMatrix4x4::operator!=(const QDoubleMatrix4x4& other) const +{ + return m[0][0] != other.m[0][0] || + m[0][1] != other.m[0][1] || + m[0][2] != other.m[0][2] || + m[0][3] != other.m[0][3] || + m[1][0] != other.m[1][0] || + m[1][1] != other.m[1][1] || + m[1][2] != other.m[1][2] || + m[1][3] != other.m[1][3] || + m[2][0] != other.m[2][0] || + m[2][1] != other.m[2][1] || + m[2][2] != other.m[2][2] || + m[2][3] != other.m[2][3] || + m[3][0] != other.m[3][0] || + m[3][1] != other.m[3][1] || + m[3][2] != other.m[3][2] || + m[3][3] != other.m[3][3]; +} + +inline QDoubleMatrix4x4 operator+(const QDoubleMatrix4x4& m1, const QDoubleMatrix4x4& m2) +{ + QDoubleMatrix4x4 m(1); + m.m[0][0] = m1.m[0][0] + m2.m[0][0]; + m.m[0][1] = m1.m[0][1] + m2.m[0][1]; + m.m[0][2] = m1.m[0][2] + m2.m[0][2]; + m.m[0][3] = m1.m[0][3] + m2.m[0][3]; + m.m[1][0] = m1.m[1][0] + m2.m[1][0]; + m.m[1][1] = m1.m[1][1] + m2.m[1][1]; + m.m[1][2] = m1.m[1][2] + m2.m[1][2]; + m.m[1][3] = m1.m[1][3] + m2.m[1][3]; + m.m[2][0] = m1.m[2][0] + m2.m[2][0]; + m.m[2][1] = m1.m[2][1] + m2.m[2][1]; + m.m[2][2] = m1.m[2][2] + m2.m[2][2]; + m.m[2][3] = m1.m[2][3] + m2.m[2][3]; + m.m[3][0] = m1.m[3][0] + m2.m[3][0]; + m.m[3][1] = m1.m[3][1] + m2.m[3][1]; + m.m[3][2] = m1.m[3][2] + m2.m[3][2]; + m.m[3][3] = m1.m[3][3] + m2.m[3][3]; + m.flagBits = QDoubleMatrix4x4::General; + return m; +} + +inline QDoubleMatrix4x4 operator-(const QDoubleMatrix4x4& m1, const QDoubleMatrix4x4& m2) +{ + QDoubleMatrix4x4 m(1); + m.m[0][0] = m1.m[0][0] - m2.m[0][0]; + m.m[0][1] = m1.m[0][1] - m2.m[0][1]; + m.m[0][2] = m1.m[0][2] - m2.m[0][2]; + m.m[0][3] = m1.m[0][3] - m2.m[0][3]; + m.m[1][0] = m1.m[1][0] - m2.m[1][0]; + m.m[1][1] = m1.m[1][1] - m2.m[1][1]; + m.m[1][2] = m1.m[1][2] - m2.m[1][2]; + m.m[1][3] = m1.m[1][3] - m2.m[1][3]; + m.m[2][0] = m1.m[2][0] - m2.m[2][0]; + m.m[2][1] = m1.m[2][1] - m2.m[2][1]; + m.m[2][2] = m1.m[2][2] - m2.m[2][2]; + m.m[2][3] = m1.m[2][3] - m2.m[2][3]; + m.m[3][0] = m1.m[3][0] - m2.m[3][0]; + m.m[3][1] = m1.m[3][1] - m2.m[3][1]; + m.m[3][2] = m1.m[3][2] - m2.m[3][2]; + m.m[3][3] = m1.m[3][3] - m2.m[3][3]; + m.flagBits = QDoubleMatrix4x4::General; + return m; +} + +inline QDoubleMatrix4x4 operator*(const QDoubleMatrix4x4& m1, const QDoubleMatrix4x4& m2) +{ + int flagBits = m1.flagBits | m2.flagBits; + if (flagBits < QDoubleMatrix4x4::Rotation2D) { + QDoubleMatrix4x4 m = m1; + m.m[3][0] += m.m[0][0] * m2.m[3][0]; + m.m[3][1] += m.m[1][1] * m2.m[3][1]; + m.m[3][2] += m.m[2][2] * m2.m[3][2]; + + m.m[0][0] *= m2.m[0][0]; + m.m[1][1] *= m2.m[1][1]; + m.m[2][2] *= m2.m[2][2]; + m.flagBits = flagBits; + return m; + } + + QDoubleMatrix4x4 m(1); + m.m[0][0] = m1.m[0][0] * m2.m[0][0] + + m1.m[1][0] * m2.m[0][1] + + m1.m[2][0] * m2.m[0][2] + + m1.m[3][0] * m2.m[0][3]; + m.m[0][1] = m1.m[0][1] * m2.m[0][0] + + m1.m[1][1] * m2.m[0][1] + + m1.m[2][1] * m2.m[0][2] + + m1.m[3][1] * m2.m[0][3]; + m.m[0][2] = m1.m[0][2] * m2.m[0][0] + + m1.m[1][2] * m2.m[0][1] + + m1.m[2][2] * m2.m[0][2] + + m1.m[3][2] * m2.m[0][3]; + m.m[0][3] = m1.m[0][3] * m2.m[0][0] + + m1.m[1][3] * m2.m[0][1] + + m1.m[2][3] * m2.m[0][2] + + m1.m[3][3] * m2.m[0][3]; + + m.m[1][0] = m1.m[0][0] * m2.m[1][0] + + m1.m[1][0] * m2.m[1][1] + + m1.m[2][0] * m2.m[1][2] + + m1.m[3][0] * m2.m[1][3]; + m.m[1][1] = m1.m[0][1] * m2.m[1][0] + + m1.m[1][1] * m2.m[1][1] + + m1.m[2][1] * m2.m[1][2] + + m1.m[3][1] * m2.m[1][3]; + m.m[1][2] = m1.m[0][2] * m2.m[1][0] + + m1.m[1][2] * m2.m[1][1] + + m1.m[2][2] * m2.m[1][2] + + m1.m[3][2] * m2.m[1][3]; + m.m[1][3] = m1.m[0][3] * m2.m[1][0] + + m1.m[1][3] * m2.m[1][1] + + m1.m[2][3] * m2.m[1][2] + + m1.m[3][3] * m2.m[1][3]; + + m.m[2][0] = m1.m[0][0] * m2.m[2][0] + + m1.m[1][0] * m2.m[2][1] + + m1.m[2][0] * m2.m[2][2] + + m1.m[3][0] * m2.m[2][3]; + m.m[2][1] = m1.m[0][1] * m2.m[2][0] + + m1.m[1][1] * m2.m[2][1] + + m1.m[2][1] * m2.m[2][2] + + m1.m[3][1] * m2.m[2][3]; + m.m[2][2] = m1.m[0][2] * m2.m[2][0] + + m1.m[1][2] * m2.m[2][1] + + m1.m[2][2] * m2.m[2][2] + + m1.m[3][2] * m2.m[2][3]; + m.m[2][3] = m1.m[0][3] * m2.m[2][0] + + m1.m[1][3] * m2.m[2][1] + + m1.m[2][3] * m2.m[2][2] + + m1.m[3][3] * m2.m[2][3]; + + m.m[3][0] = m1.m[0][0] * m2.m[3][0] + + m1.m[1][0] * m2.m[3][1] + + m1.m[2][0] * m2.m[3][2] + + m1.m[3][0] * m2.m[3][3]; + m.m[3][1] = m1.m[0][1] * m2.m[3][0] + + m1.m[1][1] * m2.m[3][1] + + m1.m[2][1] * m2.m[3][2] + + m1.m[3][1] * m2.m[3][3]; + m.m[3][2] = m1.m[0][2] * m2.m[3][0] + + m1.m[1][2] * m2.m[3][1] + + m1.m[2][2] * m2.m[3][2] + + m1.m[3][2] * m2.m[3][3]; + m.m[3][3] = m1.m[0][3] * m2.m[3][0] + + m1.m[1][3] * m2.m[3][1] + + m1.m[2][3] * m2.m[3][2] + + m1.m[3][3] * m2.m[3][3]; + m.flagBits = flagBits; + return m; +} + +inline QDoubleVector3D operator*(const QDoubleVector3D& vector, const QDoubleMatrix4x4& matrix) +{ + double x, y, z, w; + x = vector.x() * matrix.m[0][0] + + vector.y() * matrix.m[0][1] + + vector.z() * matrix.m[0][2] + + matrix.m[0][3]; + y = vector.x() * matrix.m[1][0] + + vector.y() * matrix.m[1][1] + + vector.z() * matrix.m[1][2] + + matrix.m[1][3]; + z = vector.x() * matrix.m[2][0] + + vector.y() * matrix.m[2][1] + + vector.z() * matrix.m[2][2] + + matrix.m[2][3]; + w = vector.x() * matrix.m[3][0] + + vector.y() * matrix.m[3][1] + + vector.z() * matrix.m[3][2] + + matrix.m[3][3]; + if (w == 1.0f) + return QDoubleVector3D(x, y, z); + else + return QDoubleVector3D(x / w, y / w, z / w); +} + +inline QDoubleVector3D operator*(const QDoubleMatrix4x4& matrix, const QDoubleVector3D& vector) +{ + double x, y, z, w; + if (matrix.flagBits == QDoubleMatrix4x4::Identity) { + return vector; + } else if (matrix.flagBits < QDoubleMatrix4x4::Rotation2D) { + // Translation | Scale + return QDoubleVector3D(vector.x() * matrix.m[0][0] + matrix.m[3][0], + vector.y() * matrix.m[1][1] + matrix.m[3][1], + vector.z() * matrix.m[2][2] + matrix.m[3][2]); + } else if (matrix.flagBits < QDoubleMatrix4x4::Rotation) { + // Translation | Scale | Rotation2D + return QDoubleVector3D(vector.x() * matrix.m[0][0] + vector.y() * matrix.m[1][0] + matrix.m[3][0], + vector.x() * matrix.m[0][1] + vector.y() * matrix.m[1][1] + matrix.m[3][1], + vector.z() * matrix.m[2][2] + matrix.m[3][2]); + } else { + x = vector.x() * matrix.m[0][0] + + vector.y() * matrix.m[1][0] + + vector.z() * matrix.m[2][0] + + matrix.m[3][0]; + y = vector.x() * matrix.m[0][1] + + vector.y() * matrix.m[1][1] + + vector.z() * matrix.m[2][1] + + matrix.m[3][1]; + z = vector.x() * matrix.m[0][2] + + vector.y() * matrix.m[1][2] + + vector.z() * matrix.m[2][2] + + matrix.m[3][2]; + w = vector.x() * matrix.m[0][3] + + vector.y() * matrix.m[1][3] + + vector.z() * matrix.m[2][3] + + matrix.m[3][3]; + if (w == 1.0f) + return QDoubleVector3D(x, y, z); + else + return QDoubleVector3D(x / w, y / w, z / w); + } +} + +inline QPoint operator*(const QPoint& point, const QDoubleMatrix4x4& matrix) +{ + double xin, yin; + double x, y, w; + xin = point.x(); + yin = point.y(); + x = xin * matrix.m[0][0] + + yin * matrix.m[0][1] + + matrix.m[0][3]; + y = xin * matrix.m[1][0] + + yin * matrix.m[1][1] + + matrix.m[1][3]; + w = xin * matrix.m[3][0] + + yin * matrix.m[3][1] + + matrix.m[3][3]; + if (w == 1.0f) + return QPoint(qRound(x), qRound(y)); + else + return QPoint(qRound(x / w), qRound(y / w)); +} + +inline QPointF operator*(const QPointF& point, const QDoubleMatrix4x4& matrix) +{ + double xin, yin; + double x, y, w; + xin = point.x(); + yin = point.y(); + x = xin * matrix.m[0][0] + + yin * matrix.m[0][1] + + matrix.m[0][3]; + y = xin * matrix.m[1][0] + + yin * matrix.m[1][1] + + matrix.m[1][3]; + w = xin * matrix.m[3][0] + + yin * matrix.m[3][1] + + matrix.m[3][3]; + if (w == 1.0f) { + return QPointF(double(x), double(y)); + } else { + return QPointF(double(x / w), double(y / w)); + } +} + +inline QPoint operator*(const QDoubleMatrix4x4& matrix, const QPoint& point) +{ + double xin, yin; + double x, y, w; + xin = point.x(); + yin = point.y(); + if (matrix.flagBits == QDoubleMatrix4x4::Identity) { + return point; + } else if (matrix.flagBits < QDoubleMatrix4x4::Rotation2D) { + // Translation | Scale + return QPoint(qRound(xin * matrix.m[0][0] + matrix.m[3][0]), + qRound(yin * matrix.m[1][1] + matrix.m[3][1])); + } else if (matrix.flagBits < QDoubleMatrix4x4::Perspective) { + return QPoint(qRound(xin * matrix.m[0][0] + yin * matrix.m[1][0] + matrix.m[3][0]), + qRound(xin * matrix.m[0][1] + yin * matrix.m[1][1] + matrix.m[3][1])); + } else { + x = xin * matrix.m[0][0] + + yin * matrix.m[1][0] + + matrix.m[3][0]; + y = xin * matrix.m[0][1] + + yin * matrix.m[1][1] + + matrix.m[3][1]; + w = xin * matrix.m[0][3] + + yin * matrix.m[1][3] + + matrix.m[3][3]; + if (w == 1.0f) + return QPoint(qRound(x), qRound(y)); + else + return QPoint(qRound(x / w), qRound(y / w)); + } +} + +inline QPointF operator*(const QDoubleMatrix4x4& matrix, const QPointF& point) +{ + double xin, yin; + double x, y, w; + xin = point.x(); + yin = point.y(); + if (matrix.flagBits == QDoubleMatrix4x4::Identity) { + return point; + } else if (matrix.flagBits < QDoubleMatrix4x4::Rotation2D) { + // Translation | Scale + return QPointF(xin * matrix.m[0][0] + matrix.m[3][0], + yin * matrix.m[1][1] + matrix.m[3][1]); + } else if (matrix.flagBits < QDoubleMatrix4x4::Perspective) { + return QPointF(xin * matrix.m[0][0] + yin * matrix.m[1][0] + matrix.m[3][0], + xin * matrix.m[0][1] + yin * matrix.m[1][1] + matrix.m[3][1]); + } else { + x = xin * matrix.m[0][0] + + yin * matrix.m[1][0] + + matrix.m[3][0]; + y = xin * matrix.m[0][1] + + yin * matrix.m[1][1] + + matrix.m[3][1]; + w = xin * matrix.m[0][3] + + yin * matrix.m[1][3] + + matrix.m[3][3]; + if (w == 1.0f) { + return QPointF(double(x), double(y)); + } else { + return QPointF(double(x / w), double(y / w)); + } + } +} + +inline QDoubleMatrix4x4 operator-(const QDoubleMatrix4x4& matrix) +{ + QDoubleMatrix4x4 m(1); + m.m[0][0] = -matrix.m[0][0]; + m.m[0][1] = -matrix.m[0][1]; + m.m[0][2] = -matrix.m[0][2]; + m.m[0][3] = -matrix.m[0][3]; + m.m[1][0] = -matrix.m[1][0]; + m.m[1][1] = -matrix.m[1][1]; + m.m[1][2] = -matrix.m[1][2]; + m.m[1][3] = -matrix.m[1][3]; + m.m[2][0] = -matrix.m[2][0]; + m.m[2][1] = -matrix.m[2][1]; + m.m[2][2] = -matrix.m[2][2]; + m.m[2][3] = -matrix.m[2][3]; + m.m[3][0] = -matrix.m[3][0]; + m.m[3][1] = -matrix.m[3][1]; + m.m[3][2] = -matrix.m[3][2]; + m.m[3][3] = -matrix.m[3][3]; + m.flagBits = QDoubleMatrix4x4::General; + return m; +} + +inline QDoubleMatrix4x4 operator*(double factor, const QDoubleMatrix4x4& matrix) +{ + QDoubleMatrix4x4 m(1); + m.m[0][0] = matrix.m[0][0] * factor; + m.m[0][1] = matrix.m[0][1] * factor; + m.m[0][2] = matrix.m[0][2] * factor; + m.m[0][3] = matrix.m[0][3] * factor; + m.m[1][0] = matrix.m[1][0] * factor; + m.m[1][1] = matrix.m[1][1] * factor; + m.m[1][2] = matrix.m[1][2] * factor; + m.m[1][3] = matrix.m[1][3] * factor; + m.m[2][0] = matrix.m[2][0] * factor; + m.m[2][1] = matrix.m[2][1] * factor; + m.m[2][2] = matrix.m[2][2] * factor; + m.m[2][3] = matrix.m[2][3] * factor; + m.m[3][0] = matrix.m[3][0] * factor; + m.m[3][1] = matrix.m[3][1] * factor; + m.m[3][2] = matrix.m[3][2] * factor; + m.m[3][3] = matrix.m[3][3] * factor; + m.flagBits = QDoubleMatrix4x4::General; + return m; +} + +inline QDoubleMatrix4x4 operator*(const QDoubleMatrix4x4& matrix, double factor) +{ + QDoubleMatrix4x4 m(1); + m.m[0][0] = matrix.m[0][0] * factor; + m.m[0][1] = matrix.m[0][1] * factor; + m.m[0][2] = matrix.m[0][2] * factor; + m.m[0][3] = matrix.m[0][3] * factor; + m.m[1][0] = matrix.m[1][0] * factor; + m.m[1][1] = matrix.m[1][1] * factor; + m.m[1][2] = matrix.m[1][2] * factor; + m.m[1][3] = matrix.m[1][3] * factor; + m.m[2][0] = matrix.m[2][0] * factor; + m.m[2][1] = matrix.m[2][1] * factor; + m.m[2][2] = matrix.m[2][2] * factor; + m.m[2][3] = matrix.m[2][3] * factor; + m.m[3][0] = matrix.m[3][0] * factor; + m.m[3][1] = matrix.m[3][1] * factor; + m.m[3][2] = matrix.m[3][2] * factor; + m.m[3][3] = matrix.m[3][3] * factor; + m.flagBits = QDoubleMatrix4x4::General; + return m; +} + +inline bool qFuzzyCompare(const QDoubleMatrix4x4& m1, const QDoubleMatrix4x4& m2) +{ + return qFuzzyCompare(m1.m[0][0], m2.m[0][0]) && + qFuzzyCompare(m1.m[0][1], m2.m[0][1]) && + qFuzzyCompare(m1.m[0][2], m2.m[0][2]) && + qFuzzyCompare(m1.m[0][3], m2.m[0][3]) && + qFuzzyCompare(m1.m[1][0], m2.m[1][0]) && + qFuzzyCompare(m1.m[1][1], m2.m[1][1]) && + qFuzzyCompare(m1.m[1][2], m2.m[1][2]) && + qFuzzyCompare(m1.m[1][3], m2.m[1][3]) && + qFuzzyCompare(m1.m[2][0], m2.m[2][0]) && + qFuzzyCompare(m1.m[2][1], m2.m[2][1]) && + qFuzzyCompare(m1.m[2][2], m2.m[2][2]) && + qFuzzyCompare(m1.m[2][3], m2.m[2][3]) && + qFuzzyCompare(m1.m[3][0], m2.m[3][0]) && + qFuzzyCompare(m1.m[3][1], m2.m[3][1]) && + qFuzzyCompare(m1.m[3][2], m2.m[3][2]) && + qFuzzyCompare(m1.m[3][3], m2.m[3][3]); +} + +inline QPoint QDoubleMatrix4x4::map(const QPoint& point) const +{ + return *this * point; +} + +inline QPointF QDoubleMatrix4x4::map(const QPointF& point) const +{ + return *this * point; +} + +inline QDoubleVector3D QDoubleMatrix4x4::map(const QDoubleVector3D& point) const +{ + return *this * point; +} + +inline QDoubleVector3D QDoubleMatrix4x4::mapVector(const QDoubleVector3D& vector) const +{ + if (flagBits < Scale) { + // Translation + return vector; + } else if (flagBits < Rotation2D) { + // Translation | Scale + return QDoubleVector3D(vector.x() * m[0][0], + vector.y() * m[1][1], + vector.z() * m[2][2]); + } else { + return QDoubleVector3D(vector.x() * m[0][0] + + vector.y() * m[1][0] + + vector.z() * m[2][0], + vector.x() * m[0][1] + + vector.y() * m[1][1] + + vector.z() * m[2][1], + vector.x() * m[0][2] + + vector.y() * m[1][2] + + vector.z() * m[2][2]); + } +} + +inline double *QDoubleMatrix4x4::data() +{ + // We have to assume that the caller will modify the matrix elements, + // so we flip it over to "General" mode. + flagBits = General; + return *m; +} + +inline void QDoubleMatrix4x4::viewport(const QRectF &rect) +{ + viewport(rect.x(), rect.y(), rect.width(), rect.height()); +} + +#ifndef QT_NO_DEBUG_STREAM +Q_POSITIONING_PRIVATE_EXPORT QDebug operator<<(QDebug dbg, const QDoubleMatrix4x4 &m); +#endif + +#ifndef QT_NO_DATASTREAM +Q_POSITIONING_PRIVATE_EXPORT QDataStream &operator<<(QDataStream &, const QDoubleMatrix4x4 &); +Q_POSITIONING_PRIVATE_EXPORT QDataStream &operator>>(QDataStream &, QDoubleMatrix4x4 &); +#endif + + +QT_END_NAMESPACE + + +#endif // QDOUBLEMATRIX4X4_H diff --git a/src/positioning/qdoublevector2d.cpp b/src/positioning/qdoublevector2d.cpp new file mode 100644 index 0000000..59d3b53 --- /dev/null +++ b/src/positioning/qdoublevector2d.cpp @@ -0,0 +1,85 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qdoublevector2d_p.h" +#include "qdoublevector3d_p.h" +#include +#include +#include + +QT_BEGIN_NAMESPACE + +QDoubleVector2D::QDoubleVector2D(const QDoubleVector3D &vector) : + xp(vector.xp), yp(vector.yp) +{ +} + +double QDoubleVector2D::length() const +{ + return qSqrt(xp * xp + yp * yp); +} + +QDoubleVector2D QDoubleVector2D::normalized() const +{ + // Need some extra precision if the length is very small. + double len = double(xp) * double(xp) + + double(yp) * double(yp); + if (qFuzzyIsNull(len - 1.0)) + return *this; + else if (!qFuzzyIsNull(len)) + return *this / (double)qSqrt(len); + else + return QDoubleVector2D(); +} + +void QDoubleVector2D::normalize() +{ + // Need some extra precision if the length is very small. + double len = double(xp) * double(xp) + + double(yp) * double(yp); + if (qFuzzyIsNull(len - 1.0) || qFuzzyIsNull(len)) + return; + + len = qSqrt(len); + + xp /= len; + yp /= len; +} + +QDoubleVector3D QDoubleVector2D::toVector3D() const +{ + return QDoubleVector3D(xp, yp, 0.0); +} + +#ifndef QT_NO_DEBUG_STREAM + +QDebug operator<<(QDebug dbg, const QDoubleVector2D &vector) +{ + QDebugStateSaver saver(dbg); + dbg.nospace() << "QDoubleVector2D(" << vector.x() << ", " << vector.y() << ')'; + return dbg; +} + +#endif + +#ifndef QT_NO_DATASTREAM + +QDataStream &operator<<(QDataStream &stream, const QDoubleVector2D &vector) +{ + stream << double(vector.x()) << double(vector.y()); + return stream; +} + +QDataStream &operator>>(QDataStream &stream, QDoubleVector2D &vector) +{ + double x, y; + stream >> x; + stream >> y; + vector.setX(double(x)); + vector.setY(double(y)); + return stream; +} + +#endif // QT_NO_DATASTREAM + +QT_END_NAMESPACE diff --git a/src/positioning/qdoublevector2d_p.h b/src/positioning/qdoublevector2d_p.h new file mode 100644 index 0000000..a01e152 --- /dev/null +++ b/src/positioning/qdoublevector2d_p.h @@ -0,0 +1,226 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QDOUBLEVECTOR2D_P_H +#define QDOUBLEVECTOR2D_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#ifdef QT_BUILD_LOCATION_LIB +#include +#endif + +#include "qpositioningglobal_p.h" +#include +#include + +QT_BEGIN_NAMESPACE + +class QDoubleVector3D; + +class Q_POSITIONING_PRIVATE_EXPORT QDoubleVector2D +{ +public: + Q_DECL_CONSTEXPR inline QDoubleVector2D(); + Q_DECL_CONSTEXPR inline QDoubleVector2D(double xpos, double ypos); + Q_DECL_CONSTEXPR explicit inline QDoubleVector2D(const QPointF &p); + explicit QDoubleVector2D(const QDoubleVector3D &vector); + + Q_DECL_CONSTEXPR inline double manhattanLength() const; + inline bool isNull() const; + inline bool isFinite() const; + + Q_DECL_CONSTEXPR inline double x() const; + Q_DECL_CONSTEXPR inline double y() const; + + inline void setX(double x); + inline void setY(double y); + + double length() const; + Q_DECL_CONSTEXPR inline double lengthSquared() const; + + QDoubleVector2D normalized() const; + void normalize(); + + inline QDoubleVector2D &operator+=(const QDoubleVector2D &vector); + inline QDoubleVector2D &operator-=(const QDoubleVector2D &vector); + inline QDoubleVector2D &operator*=(double factor); + inline QDoubleVector2D &operator*=(const QDoubleVector2D &vector); + inline QDoubleVector2D &operator/=(double divisor); + inline QDoubleVector2D &operator/=(const QDoubleVector2D &vector); + + Q_DECL_CONSTEXPR static inline double dotProduct(const QDoubleVector2D &v1, const QDoubleVector2D &v2) + { return v1.xp * v2.xp + v1.yp * v2.yp; } + + + friend Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector2D &v1, const QDoubleVector2D &v2); + friend Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector2D &v1, const QDoubleVector2D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator+(const QDoubleVector2D &v1, const QDoubleVector2D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &v1, const QDoubleVector2D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(double factor, const QDoubleVector2D &vector); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &vector, double factor); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &v1, const QDoubleVector2D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &vector); + friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator/(const QDoubleVector2D &vector, double divisor); + + friend Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector2D &v1, const QDoubleVector2D &v2); + + QDoubleVector3D toVector3D() const; + Q_DECL_CONSTEXPR inline QPointF toPointF() const; + +private: + double xp, yp; + + friend class QDoubleVector3D; +}; + +Q_DECLARE_TYPEINFO(QDoubleVector2D, Q_RELOCATABLE_TYPE); + +Q_DECL_CONSTEXPR inline QDoubleVector2D::QDoubleVector2D() : xp(0.0), yp(0.0) {} + +Q_DECL_CONSTEXPR inline QDoubleVector2D::QDoubleVector2D(double xpos, double ypos) : xp(xpos), yp(ypos) {} + +Q_DECL_CONSTEXPR inline QDoubleVector2D::QDoubleVector2D(const QPointF &p) : xp(p.x()), yp(p.y()) { } + +Q_DECL_CONSTEXPR inline double QDoubleVector2D::manhattanLength() const +{ + return qAbs(x())+qAbs(y()); +} + +inline bool QDoubleVector2D::isNull() const +{ + return qIsNull(xp) && qIsNull(yp); +} + +inline bool QDoubleVector2D::isFinite() const +{ + return qIsFinite(xp) && qIsFinite(yp); +} + +Q_DECL_CONSTEXPR inline double QDoubleVector2D::x() const { return xp; } +Q_DECL_CONSTEXPR inline double QDoubleVector2D::y() const { return yp; } + +inline void QDoubleVector2D::setX(double aX) { xp = aX; } +inline void QDoubleVector2D::setY(double aY) { yp = aY; } + +Q_DECL_CONSTEXPR inline double QDoubleVector2D::lengthSquared() const +{ return xp * xp + yp * yp; } + +inline QDoubleVector2D &QDoubleVector2D::operator+=(const QDoubleVector2D &vector) +{ + xp += vector.xp; + yp += vector.yp; + return *this; +} + +inline QDoubleVector2D &QDoubleVector2D::operator-=(const QDoubleVector2D &vector) +{ + xp -= vector.xp; + yp -= vector.yp; + return *this; +} + +inline QDoubleVector2D &QDoubleVector2D::operator*=(double factor) +{ + xp *= factor; + yp *= factor; + return *this; +} + +inline QDoubleVector2D &QDoubleVector2D::operator*=(const QDoubleVector2D &vector) +{ + xp *= vector.xp; + yp *= vector.yp; + return *this; +} + +inline QDoubleVector2D &QDoubleVector2D::operator/=(double divisor) +{ + xp /= divisor; + yp /= divisor; + return *this; +} + +inline QDoubleVector2D &QDoubleVector2D::operator/=(const QDoubleVector2D &vector) +{ + xp /= vector.xp; + yp /= vector.yp; + return *this; +} + +Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector2D &v1, const QDoubleVector2D &v2) +{ + return v1.xp == v2.xp && v1.yp == v2.yp; +} + +Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector2D &v1, const QDoubleVector2D &v2) +{ + return v1.xp != v2.xp || v1.yp != v2.yp; +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator+(const QDoubleVector2D &v1, const QDoubleVector2D &v2) +{ + return QDoubleVector2D(v1.xp + v2.xp, v1.yp + v2.yp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &v1, const QDoubleVector2D &v2) +{ + return QDoubleVector2D(v1.xp - v2.xp, v1.yp - v2.yp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(double factor, const QDoubleVector2D &vector) +{ + return QDoubleVector2D(vector.xp * factor, vector.yp * factor); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &vector, double factor) +{ + return QDoubleVector2D(vector.xp * factor, vector.yp * factor); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &v1, const QDoubleVector2D &v2) +{ + return QDoubleVector2D(v1.xp * v2.xp, v1.yp * v2.yp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &vector) +{ + return QDoubleVector2D(-vector.xp, -vector.yp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector2D operator/(const QDoubleVector2D &vector, double divisor) +{ + return QDoubleVector2D(vector.xp / divisor, vector.yp / divisor); +} + +Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector2D &v1, const QDoubleVector2D &v2) +{ + return qFuzzyCompare(v1.xp, v2.xp) && qFuzzyCompare(v1.yp, v2.yp); +} + +Q_DECL_CONSTEXPR inline QPointF QDoubleVector2D::toPointF() const +{ + return QPointF(qreal(xp), qreal(yp)); +} + +#ifndef QT_NO_DEBUG_STREAM +Q_POSITIONING_EXPORT QDebug operator<<(QDebug dbg, const QDoubleVector2D &vector); +#endif + +#ifndef QT_NO_DATASTREAM +Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &, const QDoubleVector2D &); +Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &, QDoubleVector2D &); +#endif + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qdoublevector3d.cpp b/src/positioning/qdoublevector3d.cpp new file mode 100644 index 0000000..92ae8bc --- /dev/null +++ b/src/positioning/qdoublevector3d.cpp @@ -0,0 +1,108 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qdoublevector3d_p.h" +#include +#include +#include + +QT_BEGIN_NAMESPACE + +QDoubleVector3D QDoubleVector3D::normalized() const +{ + // Need some extra precision if the length is very small. + double len = double(xp) * double(xp) + + double(yp) * double(yp) + + double(zp) * double(zp); + if (qFuzzyIsNull(len - 1.0)) + return *this; + else if (!qFuzzyIsNull(len)) + return *this / (double)qSqrt(len); + else + return QDoubleVector3D(); +} + +void QDoubleVector3D::normalize() +{ + // Need some extra precision if the length is very small. + double len = double(xp) * double(xp) + + double(yp) * double(yp) + + double(zp) * double(zp); + if (qFuzzyIsNull(len - 1.0) || qFuzzyIsNull(len)) + return; + + len = qSqrt(len); + + xp /= len; + yp /= len; + zp /= len; +} + +QDoubleVector3D QDoubleVector3D::normal(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return crossProduct(v1, v2).normalized(); +} + +QDoubleVector3D QDoubleVector3D::normal + (const QDoubleVector3D &v1, const QDoubleVector3D &v2, const QDoubleVector3D &v3) +{ + return crossProduct((v2 - v1), (v3 - v1)).normalized(); +} + +double QDoubleVector3D::distanceToPlane + (const QDoubleVector3D &plane1, const QDoubleVector3D &plane2, const QDoubleVector3D &plane3) const +{ + QDoubleVector3D n = normal(plane2 - plane1, plane3 - plane1); + return dotProduct(*this - plane1, n); +} + +double QDoubleVector3D::distanceToLine + (const QDoubleVector3D &point, const QDoubleVector3D &direction) const +{ + if (direction.isNull()) + return (*this - point).length(); + QDoubleVector3D p = point + dotProduct(*this - point, direction) * direction; + return (*this - p).length(); +} + +double QDoubleVector3D::length() const +{ + return qSqrt(xp * xp + yp * yp + zp * zp); +} + +#ifndef QT_NO_DEBUG_STREAM + +QDebug operator<<(QDebug dbg, const QDoubleVector3D &vector) +{ + QDebugStateSaver saver(dbg); + dbg.nospace() << "QDoubleVector3D(" + << vector.x() << ", " << vector.y() << ", " << vector.z() << ')'; + return dbg; +} + +#endif + +#ifndef QT_NO_DATASTREAM + +QDataStream &operator<<(QDataStream &stream, const QDoubleVector3D &vector) +{ + stream << double(vector.x()) << double(vector.y()) + << double(vector.z()); + return stream; +} + +QDataStream &operator>>(QDataStream &stream, QDoubleVector3D &vector) +{ + double x, y, z; + stream >> x; + stream >> y; + stream >> z; + vector.setX(double(x)); + vector.setY(double(y)); + vector.setZ(double(z)); + return stream; +} + +#endif // QT_NO_DATASTREAM + +QT_END_NAMESPACE diff --git a/src/positioning/qdoublevector3d_p.h b/src/positioning/qdoublevector3d_p.h new file mode 100644 index 0000000..d19e236 --- /dev/null +++ b/src/positioning/qdoublevector3d_p.h @@ -0,0 +1,266 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QDOUBLEVECTOR3D_P_H +#define QDOUBLEVECTOR3D_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#ifdef QT_BUILD_LOCATION_LIB +#include +#endif + +#include "qpositioningglobal_p.h" +#include "qdoublevector2d_p.h" +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONING_PRIVATE_EXPORT QDoubleVector3D +{ +public: + Q_DECL_CONSTEXPR inline QDoubleVector3D(); + Q_DECL_CONSTEXPR inline QDoubleVector3D(double xpos, double ypos, double zpos); + Q_DECL_CONSTEXPR inline QDoubleVector3D(const QDoubleVector2D &vector); + Q_DECL_CONSTEXPR inline QDoubleVector3D(const QDoubleVector2D &vector, double zpos); + + inline bool isNull() const; + + Q_DECL_CONSTEXPR inline double x() const; + Q_DECL_CONSTEXPR inline double y() const; + Q_DECL_CONSTEXPR inline double z() const; + + inline void setX(double x); + inline void setY(double y); + inline void setZ(double z); + + inline double get(int i) const; + inline void set(int i, double value); + + double length() const; + Q_DECL_CONSTEXPR inline double lengthSquared() const; + + QDoubleVector3D normalized() const; + void normalize(); + + inline QDoubleVector3D &operator+=(const QDoubleVector3D &vector); + inline QDoubleVector3D &operator-=(const QDoubleVector3D &vector); + inline QDoubleVector3D &operator*=(double factor); + inline QDoubleVector3D &operator*=(const QDoubleVector3D &vector); + inline QDoubleVector3D &operator/=(double divisor); + + Q_DECL_CONSTEXPR static inline double dotProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2) + { return v1.xp * v2.xp + v1.yp * v2.yp + v1.zp * v2.zp; } + + Q_DECL_CONSTEXPR static inline QDoubleVector3D crossProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2) + { return QDoubleVector3D(v1.yp * v2.zp - v1.zp * v2.yp, + v1.zp * v2.xp - v1.xp * v2.zp, + v1.xp * v2.yp - v1.yp * v2.xp); } + + static QDoubleVector3D normal(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + static QDoubleVector3D normal + (const QDoubleVector3D &v1, const QDoubleVector3D &v2, const QDoubleVector3D &v3); + + double distanceToPlane(const QDoubleVector3D &plane, const QDoubleVector3D &normal) const; + double distanceToPlane(const QDoubleVector3D &plane1, const QDoubleVector3D &plane2, const QDoubleVector3D &plane3) const; + double distanceToLine(const QDoubleVector3D &point, const QDoubleVector3D &direction) const; + + friend Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + friend Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator+(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(double factor, const QDoubleVector3D &vector); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &vector, double factor); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &vector); + friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator/(const QDoubleVector3D &vector, double divisor); + + friend Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector3D &v1, const QDoubleVector3D &v2); + + Q_DECL_CONSTEXPR inline QDoubleVector2D toVector2D() const; + +private: + double xp, yp, zp; + + friend class QDoubleVector2D; +}; + +Q_DECLARE_TYPEINFO(QDoubleVector3D, Q_RELOCATABLE_TYPE); + +Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D() : xp(0.0), yp(0.0), zp(0.0) {} + +Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D(double xpos, double ypos, double zpos) : xp(xpos), yp(ypos), zp(zpos) {} + +Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D(const QDoubleVector2D &v) + : xp(v.xp), yp(v.yp), zp(0.0) {} + +Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D(const QDoubleVector2D &v, double zpos) + : xp(v.xp), yp(v.yp), zp(zpos) {} + +inline bool QDoubleVector3D::isNull() const +{ + return qIsNull(xp) && qIsNull(yp) && qIsNull(zp); +} + +Q_DECL_CONSTEXPR inline double QDoubleVector3D::x() const { return xp; } +Q_DECL_CONSTEXPR inline double QDoubleVector3D::y() const { return yp; } +Q_DECL_CONSTEXPR inline double QDoubleVector3D::z() const { return zp; } + +Q_DECL_CONSTEXPR inline double QDoubleVector3D::lengthSquared() const +{ return xp * xp + yp * yp + zp * zp; } + + +inline void QDoubleVector3D::setX(double aX) { xp = aX; } +inline void QDoubleVector3D::setY(double aY) { yp = aY; } +inline void QDoubleVector3D::setZ(double aZ) { zp = aZ; } + +inline double QDoubleVector3D::get(int i) const +{ + switch (i) { + case 0: + return xp; + case 1: + return yp; + case 2: + return zp; + default: + return 0.0; + } +} + +inline void QDoubleVector3D::set(int i, double value) +{ + switch (i) { + case 0: + xp = value; + break; + case 1: + yp = value; + break; + case 2: + zp = value; + break; + default: + break; + } +} + +inline QDoubleVector3D &QDoubleVector3D::operator+=(const QDoubleVector3D &vector) +{ + xp += vector.xp; + yp += vector.yp; + zp += vector.zp; + return *this; +} + +inline QDoubleVector3D &QDoubleVector3D::operator-=(const QDoubleVector3D &vector) +{ + xp -= vector.xp; + yp -= vector.yp; + zp -= vector.zp; + return *this; +} + +inline QDoubleVector3D &QDoubleVector3D::operator*=(double factor) +{ + xp *= factor; + yp *= factor; + zp *= factor; + return *this; +} + +inline QDoubleVector3D &QDoubleVector3D::operator*=(const QDoubleVector3D &vector) +{ + xp *= vector.xp; + yp *= vector.yp; + zp *= vector.zp; + return *this; +} + +inline QDoubleVector3D &QDoubleVector3D::operator/=(double divisor) +{ + xp /= divisor; + yp /= divisor; + zp /= divisor; + return *this; +} + +Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return v1.xp == v2.xp && v1.yp == v2.yp && v1.zp == v2.zp; +} + +Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return v1.xp != v2.xp || v1.yp != v2.yp || v1.zp != v2.zp; +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator+(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return QDoubleVector3D(v1.xp + v2.xp, v1.yp + v2.yp, v1.zp + v2.zp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return QDoubleVector3D(v1.xp - v2.xp, v1.yp - v2.yp, v1.zp - v2.zp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(double factor, const QDoubleVector3D &vector) +{ + return QDoubleVector3D(vector.xp * factor, vector.yp * factor, vector.zp * factor); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &vector, double factor) +{ + return QDoubleVector3D(vector.xp * factor, vector.yp * factor, vector.zp * factor); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return QDoubleVector3D(v1.xp * v2.xp, v1.yp * v2.yp, v1.zp * v2.zp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &vector) +{ + return QDoubleVector3D(-vector.xp, -vector.yp, -vector.zp); +} + +Q_DECL_CONSTEXPR inline const QDoubleVector3D operator/(const QDoubleVector3D &vector, double divisor) +{ + return QDoubleVector3D(vector.xp / divisor, vector.yp / divisor, vector.zp / divisor); +} + +Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector3D &v1, const QDoubleVector3D &v2) +{ + return qFuzzyCompare(v1.xp, v2.xp) && + qFuzzyCompare(v1.yp, v2.yp) && + qFuzzyCompare(v1.zp, v2.zp); +} + +Q_DECL_CONSTEXPR inline QDoubleVector2D QDoubleVector3D::toVector2D() const +{ + return QDoubleVector2D(xp, yp); +} + + +#ifndef QT_NO_DEBUG_STREAM +Q_POSITIONING_EXPORT QDebug operator<<(QDebug dbg, const QDoubleVector3D &vector); +#endif + +#ifndef QT_NO_DATASTREAM +Q_POSITIONING_EXPORT QDataStream &operator<<(QDataStream &, const QDoubleVector3D &); +Q_POSITIONING_EXPORT QDataStream &operator>>(QDataStream &, QDoubleVector3D &); +#endif + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qgeoaddress.cpp b/src/positioning/qgeoaddress.cpp new file mode 100644 index 0000000..ce28317 --- /dev/null +++ b/src/positioning/qgeoaddress.cpp @@ -0,0 +1,742 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeoaddress.h" +#include "qgeoaddress_p.h" + +#include + +#ifdef QGEOADDRESS_DEBUG +#include +#endif + +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN(QGeoAddress) + +/* + Combines a list of address parts into a single line. + + The parts parameter contains both address elements such as city, state and so on + as well as separators such as spaces and commas. + + It is expected that an element is always followed by a separator and the last + sepator is usually a new line delimeter. + + For example: Springfield, 8900 + would have four parts + ["Springfield", ", ", "8900", "
"] + + The addressLine takes care of putting in separators appropriately or leaving + them out depending on whether the adjacent elements are present or not. + For example if city were empty in the above scenario the returned string is "8900
" + If the postal code was empty, returned string is "Springfield
" + If both city and postal code were empty, the returned string is "". +*/ +static QString addressLine(const QStringList &parts) +{ + QString line; + Q_ASSERT(parts.size() % 2 == 0); + + //iterate until just before the last pair + QString penultimateSeparator; + for (qsizetype i = 0; i < parts.size() - 2; i += 2) { + if (!parts.at(i).isEmpty()) { + line.append(parts.at(i) + parts.at(i + 1)); + penultimateSeparator = parts.at(i + 1); + } + } + + if (parts.at(parts.size() - 2).isEmpty()) { + line.chop(penultimateSeparator.size()); + + if (!line.isEmpty()) + line.append(parts.at(parts.size() - 1)); + } else { + line.append(parts.at(parts.size() - 2)); + line.append(parts.at(parts.size() - 1)); + } + + return line; +} + +/* + Returns a single formatted string representing the \a address. Lines of the address + are delimited by \a newLine. By default lines are delimited by
. The \l + {QGeoAddress::countryCode} {countryCode} of the \a address determines the format of + the resultant string. +*/ +static QString formattedAddress(const QGeoAddress &address, + const QString &newLine = QLatin1String("
")) +{ + const QString Comma(QStringLiteral(", ")); + const QString Dash(QStringLiteral("-")); + const QString Space(QStringLiteral(" ")); + + QString text; + + // We have 2 main approaches here: + // 1. street number goes after street name + // 2. street number goes before street name + // We need to take it into account while generating the formatted address. + // Currently these pages were used to check the formats: + // https://en.wikipedia.org/wiki/Address + // https://www.grcdi.nl/gsb/world%20address%20formats.html + // We do not take into account such address extensions as apartment number, + // because this is not what you can usually get from map providers (like + // openstreetmap). + + if (address.countryCode() == QLatin1String("ALB") + || address.countryCode() == QLatin1String("MTQ")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.postalCode() << Comma + << address.city() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("AND") + || address.countryCode() == QLatin1String("AUT") + || address.countryCode() == QLatin1String("GLP") + || address.countryCode() == QLatin1String("ITA") + || address.countryCode() == QLatin1String("RUS") + || address.countryCode() == QLatin1String("SMR") + || address.countryCode() == QLatin1String("VAT")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.postalCode() << Space + << address.city() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + }else if (address.countryCode() == QLatin1String("FRA") + || address.countryCode() == QLatin1String("GUF") + || address.countryCode() == QLatin1String("LUX") + || address.countryCode() == QLatin1String("MCO") + || address.countryCode() == QLatin1String("REU")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << address.postalCode() << Space + << address.city() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + + } else if (address.countryCode() == QLatin1String("ARE") + || address.countryCode() == QLatin1String("BHS")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.district() << Space + << address.city() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("AUS")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << (address.district().isEmpty() ? address.city() : address.district()) + << Space << address.state() << Space << address.postalCode() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("BHR")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.district() << Comma + << address.city() << Comma << address.state() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("BRA")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.district() << Space + << address.city() << Dash << address.state() << Space << address.postalCode() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("BRN") + || address.countryCode() == QLatin1String("JOR") + || address.countryCode() == QLatin1String("LBN") + || address.countryCode() == QLatin1String("NZL")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << address.district() << Space + << address.city() << Space << address.postalCode() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("CAN") + || address.countryCode() == QLatin1String("USA") + || address.countryCode() == QLatin1String("VIR")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << address.city() << Comma << address.state() << Space + << address.postalCode() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("CHN")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << Comma + << address.city() << newLine); + text += addressLine(QStringList() << address.postalCode() << Space << address.state() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("CHL")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.postalCode() << Space + << address.district() << Comma << address.city() << Comma + << address.state() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("CYM")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << address.state() << Space + << address.postalCode() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("GBR")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << address.district() << Comma + << address.city() << Comma << address.postalCode() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("GIB")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << address.city() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("HKG")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << address.district() << newLine); + text += addressLine(QStringList() << address.city() << newLine); + } else if (address.countryCode() == QLatin1String("IND")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << address.city() << Space << address.postalCode() << Space + << address.state() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("IDN") + || address.countryCode() == QLatin1String("JEY") + || address.countryCode() == QLatin1String("LVA")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.city() << Comma << address.postalCode() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("IRL")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << address.district() << Comma << address.state() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("KWT")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.postalCode() << Comma + << address.district() << Comma << address.city() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("MLT") + || address.countryCode() == QLatin1String("SGP")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << address.city() << Space << address.postalCode() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("UKR")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.city() << Space << address.postalCode() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("MEX")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.district() << newLine); + text += addressLine(QStringList() << address.postalCode() << Space << address.city() << Comma + << address.state() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("MYS")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << address.postalCode() << Space << address.city() << newLine); + text += addressLine(QStringList() << address.state() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("OMN")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << newLine); + text += addressLine(QStringList() << address.district() << Comma + << address.postalCode() << Comma + << address.city() << Comma + << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("PRI")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.district() << Comma << address.city() << Comma + << address.state() << Comma << address.postalCode() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("QAT")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.district() << Space << address.city() << Comma + << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("SAU")) { + text += addressLine(QStringList() << address.streetNumber() << Space + << address.street() << Space + << address.district() << newLine); + text += addressLine(QStringList() << address.city() << Space << address.postalCode() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("TWN")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << Comma + << address.district() << Comma + << address.city() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("THA")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.district() << Comma << address.city() << Space + << address.postalCode() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("TUR")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.postalCode() << Space << address.district() << Comma + << address.city() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("VEN")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.city() << Space << address.postalCode() << Comma + << address.state() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else if (address.countryCode() == QLatin1String("ZAF")) { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.district() << Comma << address.city() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } else { + text += addressLine(QStringList() << address.street() << Space + << address.streetNumber() << newLine); + text += addressLine(QStringList() << address.postalCode() << Space << address.city() << newLine); + text += addressLine(QStringList() << address.country() << newLine); + } + + text.chop(newLine.size()); + return text; +} + +QGeoAddressPrivate::QGeoAddressPrivate() + : QSharedData(), + m_autoGeneratedText(false) +{ +} + +QGeoAddressPrivate::QGeoAddressPrivate(const QGeoAddressPrivate &other) + : QSharedData(other), + sCountry(other.sCountry), + sCountryCode(other.sCountryCode), + sState(other.sState), + sCounty(other.sCounty), + sCity(other.sCity), + sDistrict(other.sDistrict), + sStreet(other.sStreet), + sStreetNumber(other.sStreetNumber), + sPostalCode(other.sPostalCode), + sText(other.sText), + m_autoGeneratedText(false) +{ +} + +QGeoAddressPrivate::~QGeoAddressPrivate() +{ +} + +/*! + \class QGeoAddress + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \ingroup QtLocation-places-data + \ingroup QtLocation-places + \since 5.2 + + \brief The QGeoAddress class represents an address of a \l QGeoLocation. + + The address' attributes are normalized to US feature names and can be mapped + to the local feature levels (for example State matches "Bundesland" in Germany). + + The address contains a \l text() for displaying purposes and additional + properties to access the components of an address: + + \list + \li QGeoAddress::country() + \li QGeoAddress::countryCode() + \li QGeoAddress::state() + \li QGeoAddress::city() + \li QGeoAddress::district() + \li QGeoAddress::street() + \li QGeoAddress::postalCode() + \endlist +*/ + +/*! + Default constructor. +*/ +QGeoAddress::QGeoAddress() + : d(new QGeoAddressPrivate) +{ +} + +/*! + Constructs a copy of \a other. +*/ +QGeoAddress::QGeoAddress(const QGeoAddress &other) + : d(other.d) +{ +} + +/*! + \fn QGeoAddress::QGeoAddress(QGeoAddress &&other) noexcept + \since 6.2 + + Constructs a geo address object by moving from \a other. + + \note The moved-from QGeoAddress object can only be destroyed or + assigned to. The effect of calling other functions than the destructor + or one of the assignment operators is undefined. +*/ + +/*! + \fn QGeoAddress &QGeoAddress::operator=(QGeoAddress &other) + \since 6.2 + + Move-assigns the \a other to this address and returns a reference to this + address. + + \note The moved-from QGeoAddress object can only be destroyed or + assigned to. The effect of calling other functions than the destructor + or one of the assignment operators is undefined. +*/ + +/*! + Destroys this address. +*/ +QGeoAddress::~QGeoAddress() +{ +} + +QT_DEFINE_QSDP_SPECIALIZATION_DTOR(QGeoAddressPrivate) + +/*! + Assigns the given \a address to this address and + returns a reference to this address. +*/ +QGeoAddress &QGeoAddress::operator=(const QGeoAddress & address) +{ + if (this == &address) + return *this; + + d = address.d; + return *this; +} + +/*! + \fn bool QGeoAddress::operator==(const QGeoAddress &lhs, const QGeoAddress &rhs) + + Returns \c true if \a lhs address is equal to \a rhs, otherwise returns + \c false. +*/ + +/*! + \fn bool QGeoAddress::operator!=(const QGeoAddress &lhs, const QGeoAddress &rhs) + + Returns \c true if \a lhs address is not equal to \a rhs, otherwise returns + \c false. +*/ + +/*! + Returns the address as a single formatted string. It is the recommended string + to use to display the address to the user. It typically takes the format of + an address as found on an envelope, but this is not always necessarily the case. + + The address text is either automatically generated or explicitly assigned. + This can be determined by checking \l {QGeoAddress::isTextGenerated()} {isTextGenerated}. + + If an empty string is provided to setText(), then isTextGenerated() will be set + to \c true and text() will return a string which is locally formatted according to + countryCode() and based on the elements of the address such as street, city and so on. + Because the text string is generated from the address elements, a sequence + of calls such as text(), setStreet(), text() may return different strings for each + invocation of text(). + + If a non-empty string is provided to setText(), then isTextGenerated() will be + set to \c false and text() will always return the explicitly assigned string. + Calls to modify other elements such as setStreet(), setCity() and so on will not + affect the resultant string from text(). +*/ +QString QGeoAddress::text() const +{ + if (d->sText.isEmpty()) + return formattedAddress(*this); + else + return d->sText; +} + +/*! + If \a text is not empty, explicitly assigns \a text as the string to be returned by + text(). isTextGenerated() will return false. + + If \a text is empty, indicates that text() should be automatically generated + from the address elements. isTextGenerated() will return true. +*/ +void QGeoAddress::setText(const QString &text) +{ + d->sText = text; +} + +/*! + Returns the country name. +*/ +QString QGeoAddress::country() const +{ + return d->sCountry; +} + +/*! + Sets the \a country name. +*/ +void QGeoAddress::setCountry(const QString &country) +{ + d->sCountry = country; +} + +/*! + Returns the country code according to ISO 3166-1 alpha-3 +*/ +QString QGeoAddress::countryCode() const +{ + return d->sCountryCode; +} + +/*! + Sets the \a countryCode according to ISO 3166-1 alpha-3 +*/ +void QGeoAddress::setCountryCode(const QString &countryCode) +{ + d->sCountryCode = countryCode; +} + +/*! + Returns the state. The state is considered the first subdivision below country. +*/ +QString QGeoAddress::state() const +{ + return d->sState; +} + +/*! + Sets the \a state. +*/ +void QGeoAddress::setState(const QString &state) +{ + d->sState = state; +} + +/*! + Returns the county. The county is considered the second subdivision below country. +*/ +QString QGeoAddress::county() const +{ + return d->sCounty; +} + +/*! + Sets the \a county. +*/ +void QGeoAddress::setCounty(const QString &county) +{ + d->sCounty = county; +} + +/*! + Returns the city. +*/ +QString QGeoAddress::city() const +{ + return d->sCity; +} + +/*! + Sets the \a city. +*/ +void QGeoAddress::setCity(const QString &city) +{ + d->sCity = city; +} + +/*! + Returns the district. The district is considered the subdivison below city. +*/ +QString QGeoAddress::district() const +{ + return d->sDistrict; +} + +/*! + Sets the \a district. +*/ +void QGeoAddress::setDistrict(const QString &district) +{ + d->sDistrict = district; +} + +/*! + Returns the street name. + + \note Before Qt6 this could also contain things like a unit number, + a building name, or anything else that might be used to distinguish + one address from another. Use streetNumber() to obtain this data now. + + \sa streetNumber() +*/ +QString QGeoAddress::street() const +{ + return d->sStreet; +} + +/*! + Sets the street name to \a street. + + \note Before Qt6 this could also contain things like a unit number, + a building name, or anything else that might be used to distinguish + one address from another. Use setStreetNumber() to set this data now. + + \sa setStreetNumber() +*/ +void QGeoAddress::setStreet(const QString &street) +{ + d->sStreet = street; +} + +/*! + \since 6.2 + Returns the street number. + + This may also contain things like a unit number, a building name, or + anything else that might be used to distinguish one address from another. + + \note Before Qt6 this information was returned by street() method. + + \sa street() +*/ +QString QGeoAddress::streetNumber() const +{ + return d->sStreetNumber; +} + +/*! + \since 6.2 + Sets the street number to \a streetNumber. + + This may also contain things like a unit number, a building name, or + anything else that might be used to distinguish one address from another. + + \note Before Qt6 this information was set by setStreet() method. + + \sa setStreet() +*/ +void QGeoAddress::setStreetNumber(const QString &streetNumber) +{ + d->sStreetNumber = streetNumber; +} + +/*! + Returns the postal code. +*/ +QString QGeoAddress::postalCode() const +{ + return d->sPostalCode; +} + +/*! + Sets the \a postalCode. +*/ +void QGeoAddress::setPostalCode(const QString &postalCode) +{ + d->sPostalCode = postalCode; +} + +/*! + Returns whether this address is empty. An address is considered empty + if \e all of its fields are empty. +*/ +bool QGeoAddress::isEmpty() const +{ + return d->sCountry.isEmpty() && + d->sCountryCode.isEmpty() && + d->sState.isEmpty() && + d->sCounty.isEmpty() && + d->sCity.isEmpty() && + d->sDistrict.isEmpty() && + d->sStreet.isEmpty() && + d->sStreetNumber.isEmpty() && + d->sPostalCode.isEmpty() && + d->sText.isEmpty(); + +} + +/*! + Clears all of the address' data fields. +*/ +void QGeoAddress::clear() +{ + d->sCountry.clear(); + d->sCountryCode.clear(); + d->sState.clear(); + d->sCounty.clear(); + d->sCity.clear(); + d->sDistrict.clear(); + d->sStreet.clear(); + d->sStreetNumber.clear(); + d->sPostalCode.clear(); + d->sText.clear(); +} + +/*! + Returns true if QGeoAddress::text() is automatically generated from address elements, + otherwise returns false if text() has been explicitly assigned. + + \sa text(), setText() +*/ +bool QGeoAddress::isTextGenerated() const +{ + return d->sText.isEmpty(); +} + +bool QGeoAddress::equals(const QGeoAddress &lhs, const QGeoAddress &rhs) +{ +#ifdef QGEOADDRESS_DEBUG + qDebug() << "country" << (lhs.d->sCountry == rhs.d->sCountry); + qDebug() << "countryCode" << (lhs.d->sCountryCode == rhs.d->sCountryCode); + qDebug() << "state:" << (lhs.d->sState == rhs.d->sState); + qDebug() << "county:" << (lhs.d->sCounty == rhs.d->sCounty); + qDebug() << "city:" << (lhs.d->sCity == rhs.d->sCity); + qDebug() << "district:" << (lhs.d->sDistrict == rhs.d->sDistrict); + qDebug() << "street:" << (lhs.d->sStreet == rhs.d->sStreet); + qDebug() << "street number:" << (lhs.d->sStreetNumber == rhs.d->sStreetNumber); + qDebug() << "postalCode:" << (lhs.d->sPostalCode == rhs.d->sPostalCode); + qDebug() << "text:" << (lhs.text() == rhs.text()); +#endif + + return lhs.d->sCountry == rhs.d->sCountry && + lhs.d->sCountryCode == rhs.d->sCountryCode && + lhs.d->sState == rhs.d->sState && + lhs.d->sCounty == rhs.d->sCounty && + lhs.d->sCity == rhs.d->sCity && + lhs.d->sDistrict == rhs.d->sDistrict && + lhs.d->sStreet == rhs.d->sStreet && + lhs.d->sStreetNumber == rhs.d->sStreetNumber && + lhs.d->sPostalCode == rhs.d->sPostalCode && + lhs.text() == rhs.text(); +} + +/*! + \relates QGeoAddress + + Returns the hash value for the \a address, using \a seed for the + calculation. +*/ +size_t qHash(const QGeoAddress &address, size_t seed) noexcept +{ + size_t hash = qHashMulti(seed, address.country(), address.countryCode(), address.state(), + address.county(), address.city(), address.district(), + address.street(), address.streetNumber(), address.postalCode()); + + // If the text is generated from all fields, there is no need to use the + // resulting string in the hash. However, when the text is specified + // explicitly, we need to use it as well. + if (!address.isTextGenerated()) + hash = qHashMulti(seed, hash, address.text()); + return hash; +} + +QT_END_NAMESPACE diff --git a/src/positioning/qgeoaddress.h b/src/positioning/qgeoaddress.h new file mode 100644 index 0000000..ca651f7 --- /dev/null +++ b/src/positioning/qgeoaddress.h @@ -0,0 +1,87 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOADDRESS_H +#define QGEOADDRESS_H + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QString; +class QGeoAddressPrivate; +QT_DECLARE_QSDP_SPECIALIZATION_DTOR_WITH_EXPORT(QGeoAddressPrivate, Q_POSITIONING_EXPORT) + +class Q_POSITIONING_EXPORT QGeoAddress +{ +public: + QGeoAddress(); + QGeoAddress(const QGeoAddress &other); + QGeoAddress(QGeoAddress &&other) noexcept = default; + ~QGeoAddress(); + + QGeoAddress &operator=(const QGeoAddress &other); + QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QGeoAddress) + + void swap(QGeoAddress &other) noexcept { d.swap(other.d); } + + friend bool operator==(const QGeoAddress &lhs, const QGeoAddress &rhs) + { + return equals(lhs, rhs); + } + friend bool operator!=(const QGeoAddress &lhs, const QGeoAddress &rhs) + { + return !equals(lhs, rhs); + } + + QString text() const; + void setText(const QString &text); + + QString country() const; + void setCountry(const QString &country); + + QString countryCode() const; + void setCountryCode(const QString &countryCode); + + QString state() const; + void setState(const QString &state); + + QString county() const; + void setCounty(const QString &county); + + QString city() const; + void setCity(const QString &city); + + QString district() const; + void setDistrict(const QString &district); + + QString postalCode() const; + void setPostalCode(const QString &postalCode); + + QString street() const; + void setStreet(const QString &street); + + QString streetNumber() const; + void setStreetNumber(const QString &streetNumber); + + bool isEmpty() const; + void clear(); + + bool isTextGenerated() const; + +private: + static bool equals(const QGeoAddress &lhs, const QGeoAddress &rhs); + QSharedDataPointer d; +}; + +Q_POSITIONING_EXPORT size_t qHash(const QGeoAddress &address, size_t seed = 0) noexcept; + +Q_DECLARE_SHARED(QGeoAddress) + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN(QGeoAddress, Q_POSITIONING_EXPORT) + +#endif diff --git a/src/positioning/qgeoaddress_p.h b/src/positioning/qgeoaddress_p.h new file mode 100644 index 0000000..01cfe87 --- /dev/null +++ b/src/positioning/qgeoaddress_p.h @@ -0,0 +1,50 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QLOCATION_GEOADDRESS_P_H +#define QLOCATION_GEOADDRESS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +// The fields for the class are based on the nominatim openstreetmap API: +// https://nominatim.org/release-docs/latest/api/Output/#addressdetails +// It might not reflect all the address levels, but can be used to provide a +// more or less well-formed address. +class QGeoAddressPrivate : public QSharedData +{ +public: + QGeoAddressPrivate(); + QGeoAddressPrivate(const QGeoAddressPrivate &other); + ~QGeoAddressPrivate(); + + QString sCountry; //!< country field + QString sCountryCode; //!< country code field + QString sState; //!< state field + QString sCounty; //!< county field + QString sCity; //!< city field + QString sDistrict; //!< district field + QString sStreet; //!< street name field + QString sStreetNumber; //!< street number field + QString sPostalCode; //!< postal code field + QString sText; + bool m_autoGeneratedText; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qgeoareamonitorinfo.cpp b/src/positioning/qgeoareamonitorinfo.cpp new file mode 100644 index 0000000..c6e6a44 --- /dev/null +++ b/src/positioning/qgeoareamonitorinfo.cpp @@ -0,0 +1,406 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include +#include +#include +#include +#include + +#ifndef QT_NO_DEBUG_STREAM +#include +#endif + +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN(QGeoAreaMonitorInfo) + +/*! + \class QGeoAreaMonitorInfo + \inmodule QtPositioning + \since 5.2 + \ingroup QtPositioning-positioning + \ingroup shared + + \brief The QGeoAreaMonitorInfo class describes the parameters of an area or region + to be monitored for proximity. + + The purpose of area monitoring is to inform a user when he/she comes close to an area of + interest. In general such an area is described by a \l QGeoCircle. The circle's center + represents the place of interest and the area around it identifies the geographical region + within which notifications are sent. + + A QGeoAreaMonitorInfo object is valid if it has a non-empty name and a valid \l area(). + Such objects must be registered with a \l QGeoAreaMonitorSource to start and stop the + monitoring process. Note that extensive monitoring can be very resource consuming + because the positioning engine must remain active and has to match the current position + with each QGeoAreaMonitorInfo instance. + + To further reduce the burden on the system there are optional attributes which can + set. Each monitored area can have an expiry date which automatically removes the + to-be-monitored area from the monitoring source once the expiry date has been reached. + Another option is to adjust the persistence of a monitored area. A QGeoAreaMonitorInfo + that \l isPersistent() will remain active beyond + the current applications lifetime. If an area is entered while the monitoring + application is not running the application will be started. Note that this feature is + not available on all platforms. Its availability can be checked via + \l QGeoAreaMonitorSource::supportedAreaMonitorFeatures(). + + \sa QGeoAreaMonitorSource + + */ + +class QGeoAreaMonitorInfoPrivate : public QSharedData +{ +public: + QGeoAreaMonitorInfoPrivate() : QSharedData(), persistent(false) {} + QGeoAreaMonitorInfoPrivate(const QGeoAreaMonitorInfoPrivate &other) + : QSharedData(other) + { + uid = other.uid; + name = other.name; + shape = other.shape; + persistent = other.persistent; + notificationParameters = other.notificationParameters; + expiry = other.expiry; + } + ~QGeoAreaMonitorInfoPrivate() {} + + QUuid uid; + QString name; + QGeoShape shape; + bool persistent; + QVariantMap notificationParameters; + QDateTime expiry; +}; + +/*! + Constructs a QGeoAreaMonitorInfo object with the specified \a name. + + \sa name() + */ +QGeoAreaMonitorInfo::QGeoAreaMonitorInfo(const QString &name) +{ + d = new QGeoAreaMonitorInfoPrivate; + d->name = name; + d->uid = QUuid::createUuid(); +} + +/*! + Constructs a QGeoAreaMonitorInfo object as a copy of \a other. + */ +QGeoAreaMonitorInfo::QGeoAreaMonitorInfo(const QGeoAreaMonitorInfo &other) + : d(other.d) +{ +} + +/*! + \fn QGeoAreaMonitorInfo::QGeoAreaMonitorInfo(QGeoAreaMonitorInfo &&other) noexcept + \since 6.2 + + Constructs a QGeoAreaMonitorInfo object by moving from \a other. + + Note that a moved-from QGeoAreaMonitorInfo can only be destroyed or + assigned to. The effect of calling other functions than the destructor + or one of the assignment operators is undefined. +*/ + +/*! + Destructor + */ +QGeoAreaMonitorInfo::~QGeoAreaMonitorInfo() +{ +} + +QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QGeoAreaMonitorInfoPrivate) + +/*! + Assigns \a other to this QGeoAreaMonitorInfo object and returns a reference + to this QGeoAreaMonitorInfo object. + */ +QGeoAreaMonitorInfo &QGeoAreaMonitorInfo::operator=(const QGeoAreaMonitorInfo &other) +{ + d = other.d; + return *this; +} + +/*! + \fn QGeoAreaMonitorInfo &QGeoAreaMonitorInfo::operator=(QGeoAreaMonitorInfo &&other) noexcept + \since 6.2 + + Move-assigns \a other to this QGeoAreaMonitorInfo object and returns a + reference to this QGeoAreaMonitorInfo object. + + Note that a moved-from QGeoAreaMonitorInfo can only be destroyed or + assigned to. The effect of calling other functions than the destructor + or one of the assignment operators is undefined. +*/ + +/*! + \fn bool QGeoAreaMonitorInfo::operator==(const QGeoAreaMonitorInfo &lhs, const QGeoAreaMonitorInfo &rhs) + + Returns \c true if all of the \a lhs object's values are the same as those + of \a rhs object. Otherwise returns \c false. +*/ + +/*! + \fn bool QGeoAreaMonitorInfo::operator!=(const QGeoAreaMonitorInfo &lhs, const QGeoAreaMonitorInfo &rhs) + + Returns \c true if any of the \a lhs object's values are not the same as + those of \a rhs object. Otherwise returns \c false. +*/ + +/*! + Returns the name of the QGeoAreaMonitorInfo object. The name should be used + for user-visibility purposes. + */ +QString QGeoAreaMonitorInfo::name() const +{ + return d->name; +} + +/*! + Sets the user visibile \a name. + */ +void QGeoAreaMonitorInfo::setName(const QString &name) +{ + if (d->name != name) { + d.detach(); + d->name = name; + } +} + +/*! + Returns the identifier of the QGeoAreaMonitorInfo object. + The identifier is automatically generated upon construction of a new + QGeoAreaMonitorInfo object. +*/ + +QString QGeoAreaMonitorInfo::identifier() const +{ + return d->uid.toString(); +} + +/*! + Returns true, if the monitor is valid. A valid QGeoAreaMonitorInfo has a non-empty name() + and the monitored area is not \l {QGeoShape::isEmpty()}{empty()}. + Otherwise this function returns false. + */ +bool QGeoAreaMonitorInfo::isValid() const +{ + return (!d->name.isEmpty() && !d->shape.isEmpty()); +} + +/*! + Returns the boundaries of the to-be-monitored area. This area must not be empty. + + \sa setArea() + */ +QGeoShape QGeoAreaMonitorInfo::area() const +{ + return d->shape; +} + +/*! + Sets the to-be-monitored area to \a newShape. + + \sa area() + */ +void QGeoAreaMonitorInfo::setArea(const QGeoShape &newShape) +{ + d.detach(); + d->shape = newShape; +} + +/*! + Returns the expiry date. + + After an active QGeoAreaMonitorInfo has expired the region is no longer monitored + and the QGeoAreaMonitorInfo object is removed from the list of + \l {QGeoAreaMonitorSource::activeMonitors()}{active monitors}. + + If the expiry \l QDateTime is invalid the QGeoAreaMonitorInfo object is treated as not having + an expiry date. This implies an indefinite monitoring period if the object is persistent or + until the current application closes if the object is non-persistent. + + \sa QGeoAreaMonitorSource::activeMonitors() + */ +QDateTime QGeoAreaMonitorInfo::expiration() const +{ + return d->expiry; +} + +/*! + Sets the expiry date and time to \a expiry. + */ +void QGeoAreaMonitorInfo::setExpiration(const QDateTime &expiry) +{ + d.detach(); + d->expiry = expiry; +} + +/*! + Returns true if the QGeoAreaMonitorInfo is persistent. + The default value for this property is false. + + A non-persistent QGeoAreaMonitorInfo will be removed by the system once + the application owning the monitor object stops. Persistent objects remain + active and can be retrieved once the application restarts. + + If the system triggers an event associated to a persistent QGeoAreaMonitorInfo + the relevant application will be re-started and the appropriate signal emitted. + + \sa setPersistent() + */ +bool QGeoAreaMonitorInfo::isPersistent() const +{ + return d->persistent; +} + +/*! + Sets the QGeoAreaMonitorInfo object's persistence to \a isPersistent. + + Note that setting this flag does not imply that \l QGeoAreaMonitorSource + supports persistent monitoring. + \l QGeoAreaMonitorSource::supportedAreaMonitorFeatures() can be used to + check for this feature's availability. + + \sa isPersistent() + */ +void QGeoAreaMonitorInfo::setPersistent(bool isPersistent) +{ + d.detach(); + d->persistent = isPersistent; +} + + +/*! + Returns the set of platform specific parameters used by this + QGeoAreaMonitorInfo. + + \sa setNotificationParameters() + */ +QVariantMap QGeoAreaMonitorInfo::notificationParameters() const +{ + return d->notificationParameters; +} + +/*! + Sets the set of platform specific \a parameters used by QGeoAreaMonitorInfo. + + \sa notificationParameters() + */ +void QGeoAreaMonitorInfo::setNotificationParameters(const QVariantMap ¶meters) +{ + d.detach(); + d->notificationParameters = parameters; +} + +/*! + \internal +*/ +void QGeoAreaMonitorInfo::detach() +{ + if (d) + d.detach(); + else + d = new QGeoAreaMonitorInfoPrivate; +} + +bool QGeoAreaMonitorInfo::equals(const QGeoAreaMonitorInfo &lhs, const QGeoAreaMonitorInfo &rhs) +{ + return (lhs.d->name == rhs.d->name && + lhs.d->uid == rhs.d->uid && + lhs.d->shape == rhs.d->shape && + lhs.d->persistent == rhs.d->persistent && + lhs.d->expiry == rhs.d->expiry && + lhs.d->notificationParameters == rhs.d->notificationParameters); +} + +#ifndef QT_NO_DATASTREAM + +/*! + \fn QDataStream &QGeoAreaMonitorInfo::operator<<(QDataStream &stream, const QGeoAreaMonitorInfo &monitor) + + Writes the given \a monitor to the specified \a stream. + + \sa {Serializing Qt Data Types} +*/ +QDataStream &QGeoAreaMonitorInfo::dataStreamOut(QDataStream &ds, const QGeoAreaMonitorInfo &monitor) +{ + ds << monitor.name() << monitor.d->uid << monitor.area() + << monitor.isPersistent() << monitor.notificationParameters() << monitor.expiration(); + return ds; +} + +/*! + \fn QDataStream &QGeoAreaMonitorInfo::operator>>(QDataStream &stream, QGeoAreaMonitorInfo &monitor) + + Reads a area monitoring data from the specified \a stream into the given + \a monitor. + + \sa {Serializing Qt Data Types} +*/ +QDataStream &QGeoAreaMonitorInfo::dataStreamIn(QDataStream &ds, QGeoAreaMonitorInfo &monitor) +{ + QString s; + ds >> s; + monitor = QGeoAreaMonitorInfo(s); + + QUuid id; + ds >> id; + monitor.d->uid = id; + + QGeoShape shape; + ds >> shape; + monitor.setArea(shape); + + bool persistent; + ds >> persistent; + monitor.setPersistent(persistent); + + QVariantMap map; + ds >> map; + monitor.setNotificationParameters(map); + + QDateTime dt; + ds >> dt; + monitor.setExpiration(dt); + + return ds; +} + +#endif + +#ifndef QT_NO_DEBUG_STREAM +QDebug QGeoAreaMonitorInfo::debugStreaming(QDebug dbg, const QGeoAreaMonitorInfo &monitor) +{ + QDebugStateSaver saver(dbg); + dbg.nospace() << "QGeoAreaMonitorInfo(\"" << qPrintable(monitor.name()) + << "\", " << monitor.area() + << ", persistent: " << monitor.isPersistent() + << ", expiry: " << monitor.expiration() << ")"; + return dbg; +} + +#endif + +size_t qHash(const QGeoAreaMonitorInfo &key, size_t seed) noexcept +{ + return qHashMulti(seed, key.d->uid); +} + +namespace QTest +{ + +char *toString(const QGeoAreaMonitorInfo &info) +{ + QString result; + QDebug dbg(&result); + dbg << info; + return qstrdup(qPrintable(result)); +} + +} // namespace QTest + +QT_END_NAMESPACE diff --git a/src/positioning/qgeoareamonitorinfo.h b/src/positioning/qgeoareamonitorinfo.h new file mode 100644 index 0000000..c0f5afc --- /dev/null +++ b/src/positioning/qgeoareamonitorinfo.h @@ -0,0 +1,103 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOAREAMONITORINFO_H +#define QGEOAREAMONITORINFO_H + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QDataStream; +class QGeoAreaMonitorInfo; + +Q_POSITIONING_EXPORT size_t qHash(const QGeoAreaMonitorInfo &key, size_t seed = 0) noexcept; +namespace QTest +{ +Q_POSITIONING_EXPORT char *toString(const QGeoAreaMonitorInfo &info); +} // namespace QTest + +class QGeoAreaMonitorInfoPrivate; +QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QGeoAreaMonitorInfoPrivate, Q_POSITIONING_EXPORT) + +class Q_POSITIONING_EXPORT QGeoAreaMonitorInfo +{ +public: + explicit QGeoAreaMonitorInfo(const QString &name = QString()); + QGeoAreaMonitorInfo(const QGeoAreaMonitorInfo &other); + QGeoAreaMonitorInfo(QGeoAreaMonitorInfo &&other) noexcept = default; + ~QGeoAreaMonitorInfo(); + + QGeoAreaMonitorInfo &operator=(const QGeoAreaMonitorInfo &other); + QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QGeoAreaMonitorInfo) + + void swap(QGeoAreaMonitorInfo &other) noexcept { d.swap(other.d); } + + friend bool operator==(const QGeoAreaMonitorInfo &lhs, const QGeoAreaMonitorInfo &rhs) + { + return equals(lhs, rhs); + } + friend bool operator!=(const QGeoAreaMonitorInfo &lhs, const QGeoAreaMonitorInfo &rhs) + { + return !equals(lhs, rhs); + } + + QString name() const; + void setName(const QString &name); + + QString identifier() const; + bool isValid() const; + + QGeoShape area() const; + void setArea(const QGeoShape &newShape); + + QDateTime expiration() const; + void setExpiration(const QDateTime &expiry); + + bool isPersistent() const; + void setPersistent(bool isPersistent); + + QVariantMap notificationParameters() const; + void setNotificationParameters(const QVariantMap ¶meters); + + void detach(); + +private: + static bool equals(const QGeoAreaMonitorInfo &lhs, const QGeoAreaMonitorInfo &rhs); + QExplicitlySharedDataPointer d; + friend class QGeoAreaMonitorInfoPrivate; + +#ifndef QT_NO_DATASTREAM + friend QDataStream &operator<<(QDataStream &ds, const QGeoAreaMonitorInfo &monitor) + { + return dataStreamOut(ds, monitor); + } + friend QDataStream &operator>>(QDataStream &ds, QGeoAreaMonitorInfo &monitor) + { + return dataStreamIn(ds, monitor); + } + static QDataStream &dataStreamOut(QDataStream &ds, const QGeoAreaMonitorInfo &monitor); + static QDataStream &dataStreamIn(QDataStream &ds, QGeoAreaMonitorInfo &monitor); +#endif + friend Q_POSITIONING_EXPORT size_t qHash(const QGeoAreaMonitorInfo &key, size_t seed) noexcept; + friend Q_POSITIONING_EXPORT char *QTest::toString(const QGeoAreaMonitorInfo& info); +#ifndef QT_NO_DEBUG_STREAM + friend QDebug operator<<(QDebug dbg, const QGeoAreaMonitorInfo &monitor) + { + return debugStreaming(dbg, monitor); + } + static QDebug debugStreaming(QDebug dbg, const QGeoAreaMonitorInfo &monitor); +#endif +}; + +Q_DECLARE_SHARED(QGeoAreaMonitorInfo) + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN(QGeoAreaMonitorInfo, Q_POSITIONING_EXPORT) + +#endif // QGEOAREAMONITORINFO_H diff --git a/src/positioning/qgeoareamonitorsource.cpp b/src/positioning/qgeoareamonitorsource.cpp new file mode 100644 index 0000000..ce166cc --- /dev/null +++ b/src/positioning/qgeoareamonitorsource.cpp @@ -0,0 +1,398 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include +#include +#include "qgeopositioninfosourcefactory.h" +#include "qgeopositioninfosource_p.h" + +/*! + \class QGeoAreaMonitorSource + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \since 5.2 + + \brief The QGeoAreaMonitorSource class enables the detection of proximity + changes for a specified set of coordinates. + + A QGeoAreaMonitorSource emits signals when the current position is in + range, or has moved out of range, of a specified area. + Each area is specified by a \l QGeoAreaMonitorInfo object. + For example: + + \snippet cpp/cppqml.cpp BigBen + + \c QGeoAreaMonitorSource follows a singleton pattern. Each instance of + the class with the same \l sourceName() shares the same area monitoring backend. + If a new \l QGeoAreaMonitorInfo object is added via \l startMonitoring() + or \l requestUpdate() it can be retrieved by another instance of this class + (provided that they are sourced from the same area monitor provider plug-in). + The same singleton pattern applies to the \l QGeoPositionInfoSource instance + used by this class. The following code snippet emphasizes the behavior: + + \code + QGeoAreaMonitorSource *s1 = QGeoAreaMonitorSource::createSource("blah", this); + QGeoAreaMonitorSource *s2 = QGeoAreaMonitorSource::createSource("blah", this); + QVERIFY(s1->positionInfoSource() == s2->positionInfoSource); + \endcode +*/ + +QT_BEGIN_NAMESPACE + + + +class QGeoAreaMonitorSourcePrivate : public QObjectPrivate +{ +public: + QGeoPositionInfoSource *source; + QString providerName; +}; + +/*! + \enum QGeoAreaMonitorSource::Error + Defines the types of positioning methods. + + The Error enumeration represents the errors which can occur. + + \value AccessError The connection setup to the remote area monitoring backend failed because the + application lacked the required privileges. + \value InsufficientPositionInfo The area monitoring source could not retrieve a location fix or + the accuracy of the fix is not high enough to provide an effective area monitoring. + \value NoError No error has occurred. + \value UnknownSourceError An unidentified error occurred. +*/ + +/*! + \enum QGeoAreaMonitorSource::AreaMonitorFeature + Defines the types of area monitoring capabilities. + + \value PersistentAreaMonitorFeature QGeoAreaMonitorInfo instances can be made persistent. + A persistent monitor continues to be active even when the application managing the monitor is + not running. + \value AnyAreaMonitorFeature Matches all possible area monitoring features. +*/ + +/*! + \fn virtual AreaMonitoringFeatures QGeoAreaMonitorSource::supportedAreaMonitorFeatures() const = 0; + + Returns the area monitoring features available to this source. +*/ + +/*! + \fn virtual QGeoAreaMonitorSource::Error QGeoAreaMonitorSource::error() const + + Returns the type of error that last occurred. + + \note Since Qt6 the last error is always reset when calling + startMonitoring() or requestUpdate(). +*/ + +/*! + Creates a monitor source with the given \a parent. +*/ +QGeoAreaMonitorSource::QGeoAreaMonitorSource(QObject *parent) + : QObject(*new QGeoAreaMonitorSourcePrivate, parent) +{ + Q_D(QGeoAreaMonitorSource); + d->source = nullptr; +} + +/*! + Destroys the monitor source. +*/ +QGeoAreaMonitorSource::~QGeoAreaMonitorSource() +{ +} + +/*! + Creates and returns a monitor source with the given \a parent that + monitors areas using resources on the underlying system. + + Returns \c nullptr if the system has no support for position monitoring. +*/ +QGeoAreaMonitorSource *QGeoAreaMonitorSource::createDefaultSource(QObject *parent) +{ + const QList plugins = QGeoPositionInfoSourcePrivate::pluginsSorted(); + for (const QCborMap &obj : plugins) { + if (obj.value(QStringLiteral("Monitor")).isBool() + && obj.value(QStringLiteral("Monitor")).toBool()) + { + QGeoAreaMonitorSource *s = nullptr; + auto factory = QGeoPositionInfoSourcePrivate::loadFactory(obj); + if (factory) + s = factory->areaMonitor(parent, QVariantMap()); + if (s) + s->d_func()->providerName = obj.value(QStringLiteral("Provider")).toString(); + return s; + } + } + return nullptr; +} + +/*! + Creates and returns a monitor source with the given \a parent, + by loading the plugin named \a sourceName. + + Returns \c nullptr if the plugin cannot be found. +*/ +QGeoAreaMonitorSource *QGeoAreaMonitorSource::createSource(const QString &sourceName, QObject *parent) +{ + auto plugins = QGeoPositionInfoSourcePrivate::plugins(); + if (plugins.contains(sourceName)) { + const auto metaData = plugins.value(sourceName); + QGeoAreaMonitorSource *s = nullptr; + auto factory = QGeoPositionInfoSourcePrivate::loadFactory(metaData); + if (factory) + s = factory->areaMonitor(parent, QVariantMap()); + if (s) + s->d_func()->providerName = metaData.value(QStringLiteral("Provider")).toString(); + return s; + } + + return nullptr; +} + +/*! + Returns a list of available monitor plugins, including the default system + backend if one is available. +*/ +QStringList QGeoAreaMonitorSource::availableSources() +{ + QStringList plugins; + const auto meta = QGeoPositionInfoSourcePrivate::plugins(); + for (auto it = meta.cbegin(), end = meta.cend(); it != end; ++it) { + if (it.value().value(QStringLiteral("Monitor")).isBool() + && it.value().value(QStringLiteral("Monitor")).toBool()) { + plugins << it.key(); + } + } + + return plugins; +} + +/*! + Returns the unique name of the area monitor source implementation in use. + + This is the same name that can be passed to createSource() in order to + create a new instance of a particular area monitor source implementation. +*/ +QString QGeoAreaMonitorSource::sourceName() const +{ + Q_D(const QGeoAreaMonitorSource); + return d->providerName; +} + +/*! + \since 6.2 + + Sets the backend-specific property named \a name to \a value. + Returns \c true on success, otherwise returns \c false. + Backend-specific properties can be used to configure the area monitoring + subsystem behavior at runtime. + + \sa backendProperty() +*/ +bool QGeoAreaMonitorSource::setBackendProperty(const QString &name, const QVariant &value) +{ + Q_UNUSED(name); + Q_UNUSED(value); + return false; +} + +/*! + \since 6.2 + + Returns the value of the backend-specific property named \a name, + if present. Otherwise the returned value will be invalid. + + \sa setBackendProperty() +*/ +QVariant QGeoAreaMonitorSource::backendProperty(const QString &name) const +{ + Q_UNUSED(name); + return QVariant(); +} + +/*! + Returns the current QGeoPositionInfoSource used by this QGeoAreaMonitorSource + object. The function will return \l QGeoPositionInfoSource::createDefaultSource() + if no other object has been set. + + The function returns \c nullptr if not even a default QGeoPositionInfoSource + exists. + + Any usage of the returned \l QGeoPositionInfoSource instance should account + for the fact that it may reside in a different thread. + + \sa QGeoPositionInfoSource, setPositionInfoSource() +*/ +QGeoPositionInfoSource* QGeoAreaMonitorSource::positionInfoSource() const +{ + Q_D(const QGeoAreaMonitorSource); + return d->source; +} + +/*! + Sets the new \l QGeoPositionInfoSource to be used by this QGeoAreaMonitorSource object. + The area monitoring backend becomes the new QObject parent for \a newSource. + The previous \l QGeoPositionInfoSource object will be deleted. All QGeoAreaMonitorSource + instances based on the same \l sourceName() share the same QGeoPositionInfoSource + instance. + + This may be useful when it is desirable to manipulate the positioning system + used by the area monitoring engine. + + Note that ownership must be taken care of by subclasses of QGeoAreaMonitorSource. + Due to the singleton pattern behind this class \a newSource may be moved to a + new thread. + + \sa positionInfoSource() + */ +void QGeoAreaMonitorSource::setPositionInfoSource(QGeoPositionInfoSource *newSource) +{ + Q_D(QGeoAreaMonitorSource); + d->source = newSource; +} + + +/*! + \fn virtual bool QGeoAreaMonitorSource::startMonitoring(const QGeoAreaMonitorInfo &monitor) + + Returns \c true if the monitoring of \a monitor could be successfully started; otherwise + returns \c false. A reason for not being able to start monitoring could be the unavailability + of an appropriate default position info source while no alternative QGeoPositionInfoSource + has been set via \l setPositionInfoSource(). + + If \a monitor is already active, the existing monitor object will be replaced by the new \a monitor reference. + The identification of QGeoAreaMonitorInfo instances happens via \l QGeoAreaMonitorInfo::identifier(). + Therefore this function can also be used to update active monitors. + + If \a monitor has an expiry date that has been passed this function returns false. Calling + this function for an already via \l requestUpdate() registered single shot monitor + switches the monitor to a permanent monitoring mode. + + Requesting persistent monitoring on a QGeoAreaMonitorSource instance fails if the area monitoring + backend doesn't support \l QGeoAreaMonitorSource::PersistentAreaMonitorFeature. + + \note Since Qt6 this method always resets the last error to + \l {QGeoAreaMonitorSource::}{NoError} before starting monitoring. + + \sa stopMonitoring() +*/ + +/*! + \fn virtual bool QGeoAreaMonitorSource::requestUpdate(const QGeoAreaMonitorInfo &monitor, const char *signal) + + Enables single shot area monitoring. Area monitoring for \a monitor will be performed + until this QGeoAreaMonitorSource instance emits \a signal for the first time. Once + the signal was emitted, \a monitor is automatically removed from the list of + \l activeMonitors(). If \a monitor is invalid or has an expiry date that has + been passed, this function returns \c false. + + \code + QGeoAreaMonitor singleShotMonitor; + QGeoAreaMonitorSource * source = QGeoAreaMonitorSource::createDefaultSource(this); + //... + bool ret = source->requestUpdate(singleShotMonitor, + SIGNAL(areaExited(QGeoAreaMonitor,QGeoPositionInfo))); + \endcode + + The above \c singleShotMonitor object will cease to send updates once the \l areaExited() signal + was emitted for the first time. Until this point in time any other signal may be emitted + zero or more times depending on the area context. + + It is not possible to simultanously request updates for more than one signal of the same monitor object. + The last call to this function determines the signal upon which the updates cease to continue. + At this stage only the \l areaEntered() and \l areaExited() signals can be used to + terminate the monitoring process. + + Requesting persistent monitoring on a QGeoAreaMonitorSource instance fails if the area monitoring + backend doesn't support \l QGeoAreaMonitorSource::PersistentAreaMonitorFeature. + + If \a monitor was already registered via \l startMonitoring() it is converted to a single + shot behavior. + + \note Since Qt6 this method always resets the last error to + \l {QGeoAreaMonitorSource::}{NoError} before starting monitoring. + + \sa startMonitoring(), stopMonitoring() + */ + +/*! + \fn virtual bool QGeoAreaMonitorSource::stopMonitoring(const QGeoAreaMonitorInfo &monitor) + + Returns true if \a monitor was successfully removed from the list of \l activeMonitors(); + otherwise returns false. This behavior is independent on whether \a monitor was registered + via \l startMonitoring() or \l requestUpdate(). +*/ + +/*! + \fn virtual QList QGeoAreaMonitorSource::activeMonitors() const + + Returns the list of all active monitors known to the QGeoAreaMonitorSource object. + + An active monitor was started via startMonitoring(). For every active + monitor the source object will emit the required signals, such as + areaEntered() or areaExited(). Multiple \l QGeoAreaMonitorSource instances + within the same application share the same active monitor objects. + + Unless an active QGeoAreaMonitorInfo \l {QGeoAreaMonitorInfo::isPersistent()}{isPersistent()} an active QGeoAreaMonitorInfo + will be stopped once the current application terminates. +*/ + +/*! + \fn virtual QList QGeoAreaMonitorSource::activeMonitors(const QGeoShape &lookupArea) const + + Returns the list of all active monitors known to the QGeoAreaMonitorSource object whose + center lies within \a lookupArea. If \a lookupArea is empty the returned list will be empty. + + An active monitor was started via startMonitoring(). For every active + monitor the source object will emit the required signals, such as + areaEntered() or areaExited(). Multiple \l QGeoAreaMonitorSource instances + within the same application share the same active monitor objects. + + Unless an active QGeoAreaMonitorInfo \l {QGeoAreaMonitorInfo::isPersistent()}{isPersistent()} an active QGeoAreaMonitorInfo + will be stopped once the current application terminates. + + \sa QGeoShape +*/ + + +/*! + \fn void QGeoAreaMonitorSource::monitorExpired(const QGeoAreaMonitorInfo &monitor) + + Emitted when \a monitor has expired. An expired area monitor is automatically + removed from the list of \l activeMonitors(). + + \sa activeMonitors() +*/ + +/*! + \fn void QGeoAreaMonitorSource::areaEntered(const QGeoAreaMonitorInfo &monitor, const QGeoPositionInfo &update) + + Emitted when the current position has moved from a position outside of the active \a monitor + to a position within the monitored area. + + The \a update holds the new position. +*/ + +/*! + \fn void QGeoAreaMonitorSource::areaExited(const QGeoAreaMonitorInfo &monitor, const QGeoPositionInfo &update) + + Emitted when the current position has moved from a position within the active \a monitor + to a position outside the monitored area. + + The \a update holds the new position. +*/ + +/*! + \fn void QGeoAreaMonitorSource::errorOccurred(QGeoAreaMonitorSource::Error areaMonitoringError) + + This signal is emitted after an error occurred. The \a areaMonitoringError + parameter describes the type of error that occurred. + +*/ + +QT_END_NAMESPACE + +#include "moc_qgeoareamonitorsource.cpp" diff --git a/src/positioning/qgeoareamonitorsource.h b/src/positioning/qgeoareamonitorsource.h new file mode 100644 index 0000000..b9af93a --- /dev/null +++ b/src/positioning/qgeoareamonitorsource.h @@ -0,0 +1,75 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QGEOAREAMONITORSOURCE_H +#define QGEOAREAMONITORSOURCE_H + +#include +#include +#include + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoPositionInfo; +class QGeoAreaMonitorSourcePrivate; +class Q_POSITIONING_EXPORT QGeoAreaMonitorSource : public QObject +{ + Q_OBJECT + +public: + enum Error { + AccessError = 0, + InsufficientPositionInfo = 1, + UnknownSourceError = 2, + NoError = 3 + }; + Q_ENUMS(Error) + + enum AreaMonitorFeature { + PersistentAreaMonitorFeature = 0x00000001, + AnyAreaMonitorFeature = 0xffffffff + }; + Q_DECLARE_FLAGS(AreaMonitorFeatures, AreaMonitorFeature) + + explicit QGeoAreaMonitorSource(QObject *parent); + virtual ~QGeoAreaMonitorSource(); + + static QGeoAreaMonitorSource *createDefaultSource(QObject *parent); + static QGeoAreaMonitorSource *createSource(const QString& sourceName, QObject *parent); + static QStringList availableSources(); + + virtual void setPositionInfoSource(QGeoPositionInfoSource *source); + virtual QGeoPositionInfoSource* positionInfoSource() const; + + QString sourceName() const; + + virtual Error error() const = 0; + virtual AreaMonitorFeatures supportedAreaMonitorFeatures() const = 0; + + virtual bool startMonitoring(const QGeoAreaMonitorInfo &monitor) = 0; + virtual bool stopMonitoring(const QGeoAreaMonitorInfo &monitor) = 0; + virtual bool requestUpdate(const QGeoAreaMonitorInfo &monitor, const char *signal) = 0; + + virtual QList activeMonitors() const = 0; + virtual QList activeMonitors(const QGeoShape &lookupArea) const = 0; + + virtual bool setBackendProperty(const QString &name, const QVariant &value); + virtual QVariant backendProperty(const QString &name) const; + +Q_SIGNALS: + void areaEntered(const QGeoAreaMonitorInfo &monitor, const QGeoPositionInfo &update); + void areaExited(const QGeoAreaMonitorInfo &monitor, const QGeoPositionInfo &update); + void monitorExpired(const QGeoAreaMonitorInfo &monitor); + void errorOccurred(QGeoAreaMonitorSource::Error error); + +private: + Q_DISABLE_COPY(QGeoAreaMonitorSource) + Q_DECLARE_PRIVATE(QGeoAreaMonitorSource) +}; + + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qgeocircle.cpp b/src/positioning/qgeocircle.cpp new file mode 100644 index 0000000..b69deac --- /dev/null +++ b/src/positioning/qgeocircle.cpp @@ -0,0 +1,430 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeocircle.h" +#include "qgeocircle_p.h" + +#include "qgeocoordinate.h" +#include "qnumeric.h" +#include "qlocationutils_p.h" + +#include "qdoublevector2d_p.h" +#include "qdoublevector3d_p.h" +#include +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN(QGeoCircle) + +/*! + \class QGeoCircle + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \since 5.2 + + \brief The QGeoCircle class defines a circular geographic area. + + The circle is defined in terms of a QGeoCoordinate which specifies the + center of the circle and a qreal which specifies the radius of the circle + in meters. + + The circle is considered invalid if the center coordinate is invalid + or if the radius is less than zero. + + This class is a \l Q_GADGET since Qt 5.5. It can be + \l{Cpp_value_integration_positioning}{directly used from C++ and QML}. +*/ + +/*! + \property QGeoCircle::center + \brief This property holds the center coordinate for the geo circle. + + The circle is considered invalid if this property contains an invalid + coordinate. + + A default constructed QGeoCircle uses an invalid \l QGeoCoordinate + as center. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +/*! + \property QGeoCircle::radius + \brief This property holds the circle radius in meters. + + The circle is considered invalid if this property is negative. + + By default, the radius is initialized with \c -1. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +inline QGeoCirclePrivate *QGeoCircle::d_func() +{ + return static_cast(d_ptr.data()); +} + +inline const QGeoCirclePrivate *QGeoCircle::d_func() const +{ + return static_cast(d_ptr.constData()); +} + +/*! + Constructs a new, invalid geo circle. +*/ +QGeoCircle::QGeoCircle() +: QGeoShape(new QGeoCirclePrivate) +{ +} + +/*! + Constructs a new geo circle centered at \a center and with a radius of \a radius meters. +*/ +QGeoCircle::QGeoCircle(const QGeoCoordinate ¢er, qreal radius) +{ + d_ptr = new QGeoCirclePrivate(center, radius); +} + +/*! + Constructs a new geo circle from the contents of \a other. +*/ +QGeoCircle::QGeoCircle(const QGeoCircle &other) +: QGeoShape(other) +{ +} + +/*! + Constructs a new geo circle from the contents of \a other. +*/ +QGeoCircle::QGeoCircle(const QGeoShape &other) +: QGeoShape(other) +{ + if (type() != QGeoShape::CircleType) + d_ptr = new QGeoCirclePrivate; +} + +/*! + Destroys this geo circle. +*/ +QGeoCircle::~QGeoCircle() {} + +/*! + Assigns \a other to this geo circle and returns a reference to this geo circle. +*/ +QGeoCircle &QGeoCircle::operator=(const QGeoCircle &other) +{ + QGeoShape::operator=(other); + return *this; +} + +bool QGeoCirclePrivate::isValid() const +{ + return m_center.isValid() && !qIsNaN(m_radius) && m_radius >= -1e-7; +} + +bool QGeoCirclePrivate::isEmpty() const +{ + return !isValid() || m_radius <= 1e-7; +} + +/*! + Sets the center coordinate of this geo circle to \a center. +*/ +void QGeoCircle::setCenter(const QGeoCoordinate ¢er) +{ + Q_D(QGeoCircle); + + d->setCenter(center); +} + +/*! + Returns the center coordinate of this geo circle. Equivalent to QGeoShape::center(). +*/ +QGeoCoordinate QGeoCircle::center() const +{ + Q_D(const QGeoCircle); + + return d->center(); +} + +/*! + Sets the radius in meters of this geo circle to \a radius. +*/ +void QGeoCircle::setRadius(qreal radius) +{ + Q_D(QGeoCircle); + + d->setRadius(radius); +} + +/*! + Returns the radius in meters of this geo circle. +*/ +qreal QGeoCircle::radius() const +{ + Q_D(const QGeoCircle); + + return d->m_radius; +} + +bool QGeoCirclePrivate::contains(const QGeoCoordinate &coordinate) const +{ + if (!isValid() || !coordinate.isValid()) + return false; + + // see QTBUG-41447 for details + qreal distance = m_center.distanceTo(coordinate); + if (qFuzzyCompare(distance, m_radius) || distance <= m_radius) + return true; + + return false; +} + +QGeoCoordinate QGeoCirclePrivate::center() const +{ + return m_center; +} + +QGeoRectangle QGeoCirclePrivate::boundingGeoRectangle() const +{ + return m_bbox; +} + +void QGeoCirclePrivate::updateBoundingBox() +{ + if (isEmpty()) { + if (m_center.isValid()) { + m_bbox.setTopLeft(m_center); + m_bbox.setBottomRight(m_center); + } + return; + } + + bool crossNorth = crossNorthPole(); + bool crossSouth = crossSouthPole(); + + if (crossNorth && crossSouth) { + // Circle crossing both poles fills the whole map + m_bbox = QGeoRectangle(QGeoCoordinate(90.0, -180.0), QGeoCoordinate(-90.0, 180.0)); + } else if (crossNorth) { + // Circle crossing one pole fills the map in the longitudinal direction + m_bbox = QGeoRectangle(QGeoCoordinate(90.0, -180.0), QGeoCoordinate(m_center.atDistanceAndAzimuth(m_radius, 180.0).latitude(), 180.0)); + } else if (crossSouth) { + m_bbox = QGeoRectangle(QGeoCoordinate(m_center.atDistanceAndAzimuth(m_radius, 0.0).latitude(), -180.0), QGeoCoordinate(-90, 180.0)); + } else { + // Regular circle not crossing anything + + // Calculate geo bounding box of the circle + // + // A circle tangential point with a meridian, together with pole and + // the circle center create a spherical triangle. + // Finding the tangential point with the spherical law of sines: + // + // * lon_delta_in_rad : delta between the circle center and a tangential + // point (absolute value). + // * r_in_rad : angular radius of the circle + // * lat_in_rad : latitude of the circle center + // * alpha_in_rad : angle between meridian and radius of the circle. + // At the tangential point, sin(alpha_in_rad) == 1. + // * lat_delta_in_rad - absolute delta of latitudes between the circle center and + // any of the two points where the great circle going through the circle + // center and the pole crosses the circle. In other words, the points + // on the circle with azimuth 0 or 180. + // + // Using: + // sin(lon_delta_in_rad)/sin(r_in_rad) = sin(alpha_in_rad)/sin(pi/2 - lat_in_rad) + + double r_in_rad = m_radius / QLocationUtils::earthMeanRadius(); // angular r + double lat_delta_in_deg = QLocationUtils::degrees(r_in_rad); + double lon_delta_in_deg = QLocationUtils::degrees(std::asin( + std::sin(r_in_rad) / + std::cos(QLocationUtils::radians(m_center.latitude())) + )); + + QGeoCoordinate topLeft; + topLeft.setLatitude(QLocationUtils::clipLat(m_center.latitude() + lat_delta_in_deg)); + topLeft.setLongitude(QLocationUtils::wrapLong(m_center.longitude() - lon_delta_in_deg)); + QGeoCoordinate bottomRight; + bottomRight.setLatitude(QLocationUtils::clipLat(m_center.latitude() - lat_delta_in_deg)); + bottomRight.setLongitude(QLocationUtils::wrapLong(m_center.longitude() + lon_delta_in_deg)); + + m_bbox = QGeoRectangle(topLeft, bottomRight); + } +} + +void QGeoCirclePrivate::setCenter(const QGeoCoordinate &c) +{ + m_center = c; + updateBoundingBox(); +} + +void QGeoCirclePrivate::setRadius(const qreal r) +{ + m_radius = r; + updateBoundingBox(); +} + +bool QGeoCirclePrivate::crossNorthPole() const +{ + const QGeoCoordinate northPole(90.0, m_center.longitude()); + qreal distanceToPole = m_center.distanceTo(northPole); + if (distanceToPole < m_radius) + return true; + return false; +} + +bool QGeoCirclePrivate::crossSouthPole() const +{ + const QGeoCoordinate southPole(-90.0, m_center.longitude()); + qreal distanceToPole = m_center.distanceTo(southPole); + if (distanceToPole < m_radius) + return true; + return false; +} + +/* + Extends the circle to include \a coordinate. +*/ +void QGeoCirclePrivate::extendCircle(const QGeoCoordinate &coordinate) +{ + if (!isValid() || !coordinate.isValid() || contains(coordinate)) + return; + + setRadius(m_center.distanceTo(coordinate)); +} + +/*! + Translates this geo circle by \a degreesLatitude northwards and \a degreesLongitude eastwards. + + Negative values of \a degreesLatitude and \a degreesLongitude correspond to + southward and westward translation respectively. +*/ +void QGeoCircle::translate(double degreesLatitude, double degreesLongitude) +{ + // TODO handle dlat, dlon larger than 360 degrees + + Q_D(QGeoCircle); + + double lat = d->m_center.latitude(); + double lon = d->m_center.longitude(); + + lat += degreesLatitude; + lon += degreesLongitude; + lon = QLocationUtils::wrapLong(lon); + + // TODO: remove this and simply clip latitude. + if (lat > 90.0) { + lat = 180.0 - lat; + if (lon < 0.0) + lon = 180.0; + else + lon -= 180; + } + + if (lat < -90.0) { + lat = 180.0 + lat; + if (lon < 0.0) + lon = 180.0; + else + lon -= 180; + } + + d->setCenter(QGeoCoordinate(lat, lon)); +} + +/*! + Returns a copy of this geo circle translated by \a degreesLatitude northwards and + \a degreesLongitude eastwards. + + Negative values of \a degreesLatitude and \a degreesLongitude correspond to + southward and westward translation respectively. + + \sa translate() +*/ +QGeoCircle QGeoCircle::translated(double degreesLatitude, double degreesLongitude) const +{ + QGeoCircle result(*this); + result.translate(degreesLatitude, degreesLongitude); + return result; +} + +/*! + Extends the geo circle to also cover the coordinate \a coordinate + + \since 5.9 +*/ +void QGeoCircle::extendCircle(const QGeoCoordinate &coordinate) +{ + Q_D(QGeoCircle); + d->extendCircle(coordinate); +} + +/*! + Returns the geo circle properties as a string. + + \since 5.5 +*/ + +QString QGeoCircle::toString() const +{ + if (type() != QGeoShape::CircleType) { + qWarning("Not a circle"); + return QStringLiteral("QGeoCircle(not a circle)"); + } + + return QStringLiteral("QGeoCircle({%1, %2}, %3)") + .arg(center().latitude()) + .arg(center().longitude()) + .arg(radius()); +} + +/******************************************************************************* +*******************************************************************************/ + +QGeoCirclePrivate::QGeoCirclePrivate() +: QGeoShapePrivate(QGeoShape::CircleType), m_radius(-1.0) +{ +} + +QGeoCirclePrivate::QGeoCirclePrivate(const QGeoCoordinate ¢er, qreal radius) +: QGeoShapePrivate(QGeoShape::CircleType), m_center(center), m_radius(radius) +{ + updateBoundingBox(); +} + +QGeoCirclePrivate::QGeoCirclePrivate(const QGeoCirclePrivate &other) +: QGeoShapePrivate(QGeoShape::CircleType), m_center(other.m_center), + m_radius(other.m_radius), m_bbox(other.m_bbox) +{ +} + +QGeoCirclePrivate::~QGeoCirclePrivate() {} + +QGeoShapePrivate *QGeoCirclePrivate::clone() const +{ + return new QGeoCirclePrivate(*this); +} + +bool QGeoCirclePrivate::operator==(const QGeoShapePrivate &other) const +{ + if (!QGeoShapePrivate::operator==(other)) + return false; + + const QGeoCirclePrivate &otherCircle = static_cast(other); + + return m_radius == otherCircle.m_radius && m_center == otherCircle.m_center; +} + +size_t QGeoCirclePrivate::hash(size_t seed) const +{ + return qHashMulti(seed, m_center, m_radius); +} + +QT_END_NAMESPACE + +#include "moc_qgeocircle.cpp" diff --git a/src/positioning/qgeocircle.h b/src/positioning/qgeocircle.h new file mode 100644 index 0000000..8038a88 --- /dev/null +++ b/src/positioning/qgeocircle.h @@ -0,0 +1,65 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOCIRCLE_H +#define QGEOCIRCLE_H + +#include + +QT_BEGIN_NAMESPACE + +class QGeoCoordinate; +class QGeoCirclePrivate; + +class Q_POSITIONING_EXPORT QGeoCircle : public QGeoShape +{ + Q_GADGET + Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter) + Q_PROPERTY(qreal radius READ radius WRITE setRadius) + +public: + QGeoCircle(); + QGeoCircle(const QGeoCoordinate ¢er, qreal radius = -1.0); + QGeoCircle(const QGeoCircle &other); + QGeoCircle(const QGeoShape &other); + + ~QGeoCircle(); + + QGeoCircle &operator=(const QGeoCircle &other); + + void setCenter(const QGeoCoordinate ¢er); + QGeoCoordinate center() const; + + void setRadius(qreal radius); + qreal radius() const; + + Q_INVOKABLE void translate(double degreesLatitude, double degreesLongitude); + Q_INVOKABLE QGeoCircle translated(double degreesLatitude, double degreesLongitude) const; + Q_INVOKABLE void extendCircle(const QGeoCoordinate &coordinate); + + Q_INVOKABLE QString toString() const; + +private: + inline QGeoCirclePrivate *d_func(); + inline const QGeoCirclePrivate *d_func() const; + +#ifndef QT_NO_DATASTREAM + friend QDataStream &operator<<(QDataStream &stream, const QGeoCircle &circle) + { + return stream << static_cast(circle); + } + friend QDataStream &operator>>(QDataStream &stream, QGeoCircle &circle) + { + return stream >> static_cast(circle); + } +#endif +}; + +Q_DECLARE_TYPEINFO(QGeoCircle, Q_RELOCATABLE_TYPE); + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN(QGeoCircle, Q_POSITIONING_EXPORT) + +#endif + diff --git a/src/positioning/qgeocircle_p.h b/src/positioning/qgeocircle_p.h new file mode 100644 index 0000000..8ce01b0 --- /dev/null +++ b/src/positioning/qgeocircle_p.h @@ -0,0 +1,60 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOCIRCLE_P_H +#define QGEOCIRCLE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeoshape_p.h" +#include "qgeocoordinate.h" + +QT_BEGIN_NAMESPACE + +class QGeoCirclePrivate : public QGeoShapePrivate +{ +public: + QGeoCirclePrivate(); + QGeoCirclePrivate(const QGeoCoordinate ¢er, qreal radius); + QGeoCirclePrivate(const QGeoCirclePrivate &other); + ~QGeoCirclePrivate(); + + bool isValid() const override; + bool isEmpty() const override; + bool contains(const QGeoCoordinate &coordinate) const override; + + QGeoCoordinate center() const override; + + QGeoRectangle boundingGeoRectangle() const override; + + bool crossNorthPole() const; + bool crossSouthPole() const; + void updateBoundingBox(); + void setCenter(const QGeoCoordinate &c); + void setRadius(const qreal r); + + void extendCircle(const QGeoCoordinate &coordinate); + + QGeoShapePrivate *clone() const override; + + bool operator==(const QGeoShapePrivate &other) const override; + + size_t hash(size_t seed) const override; + + QGeoCoordinate m_center; + qreal m_radius; + QGeoRectangle m_bbox; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qgeocoordinate.cpp b/src/positioning/qgeocoordinate.cpp new file mode 100644 index 0000000..02fb730 --- /dev/null +++ b/src/positioning/qgeocoordinate.cpp @@ -0,0 +1,759 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#include "qgeocoordinate.h" +#include "qgeocoordinate_p.h" +#include "qlocationutils_p.h" + +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN(QGeoCoordinate) + +static const double qgeocoordinate_EARTH_MEAN_RADIUS = 6371.0072; + + +QGeoCoordinatePrivate::QGeoCoordinatePrivate(): + lat(qQNaN()), + lng(qQNaN()), + alt(qQNaN()) +{} + +QGeoCoordinatePrivate::QGeoCoordinatePrivate(const QGeoCoordinatePrivate &other) + : QSharedData(other), + lat(other.lat), + lng(other.lng), + alt(other.alt) +{} + +QGeoCoordinatePrivate::~QGeoCoordinatePrivate() +{} + + +QGeoMercatorCoordinatePrivate::QGeoMercatorCoordinatePrivate(): + QGeoCoordinatePrivate(), + m_mercatorX(qQNaN()), + m_mercatorY(qQNaN()) +{} + +QGeoMercatorCoordinatePrivate::QGeoMercatorCoordinatePrivate(const QGeoMercatorCoordinatePrivate &other) + : QGeoCoordinatePrivate(other), + m_mercatorX(other.m_mercatorX), + m_mercatorY(other.m_mercatorY) +{} + +QGeoMercatorCoordinatePrivate::~QGeoMercatorCoordinatePrivate() +{} + +/*! + \class QGeoCoordinate + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \since 5.2 + + \brief The QGeoCoordinate class defines a geographical position on the surface of the Earth. + + A QGeoCoordinate is defined by latitude, longitude, and optionally, altitude. + + Use type() to determine whether a coordinate is a 2D coordinate (has + latitude and longitude only) or 3D coordinate (has latitude, longitude + and altitude). Use distanceTo() and azimuthTo() to calculate the distance + and bearing between coordinates. + + The coordinate values should be specified using the WGS84 datum. For more information + on geographical terms see this article on \l {http://en.wikipedia.org/wiki/Geographic_coordinate_system}{coordinates} and + another on \l {http://en.wikipedia.org/wiki/Geodetic_system}{geodetic systems} + including WGS84. + + Azimuth in this context is equivalent to a compass bearing based on true north. + + This class is a \l Q_GADGET since Qt 5.5. It can be + \l{Cpp_value_integration_positioning}{directly used from C++ and QML}. +*/ + +/*! + \enum QGeoCoordinate::CoordinateType + Defines the types of a coordinate. + + \value InvalidCoordinate An invalid coordinate. A coordinate is invalid if its latitude or longitude values are invalid. + \value Coordinate2D A coordinate with valid latitude and longitude values. + \value Coordinate3D A coordinate with valid latitude and longitude values, and also an altitude value. +*/ + +/*! + \enum QGeoCoordinate::CoordinateFormat + Defines the possible formatting options for toString(). + + \value Degrees Returns a string representation of the coordinates in decimal degrees format. + \value DegreesWithHemisphere Returns a string representation of the coordinates in decimal degrees format, using 'N', 'S', 'E' or 'W' to indicate the hemispheres of the coordinates. + \value DegreesMinutes Returns a string representation of the coordinates in degrees-minutes format. + \value DegreesMinutesWithHemisphere Returns a string representation of the coordinates in degrees-minutes format, using 'N', 'S', 'E' or 'W' to indicate the hemispheres of the coordinates. + \value DegreesMinutesSeconds Returns a string representation of the coordinates in degrees-minutes-seconds format. + \value DegreesMinutesSecondsWithHemisphere Returns a string representation of the coordinates in degrees-minutes-seconds format, using 'N', 'S', 'E' or 'W' to indicate the hemispheres of the coordinates. + + \sa toString() +*/ + +/*! + \property QGeoCoordinate::latitude + \brief This property holds the latitude in decimal degrees. + + The property is undefined (\l {qQNaN()}) if the latitude has not been set. + A positive latitude indicates the Northern Hemisphere, and a negative + latitude indicates the Southern Hemisphere. When setting the latitude the + new value should be in the + \l {http://en.wikipedia.org/wiki/World_Geodetic_System}{WGS84} datum format. + + To be valid, the latitude must be between -90 to 90 inclusive. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +/*! + \property QGeoCoordinate::longitude + \brief This property holds the longitude in decimal degrees. + + The property is undefined (\l {qQNaN()}) if the longitude has not been set. + A positive longitude indicates the Eastern Hemisphere, and a negative + longitude indicates the Western Hemisphere. When setting the longitude the + new value should be in the + \l {http://en.wikipedia.org/wiki/World_Geodetic_System}{WGS84} datum format. + + To be valid, the longitude must be between -180 to 180 inclusive. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +/*! + \property QGeoCoordinate::altitude + \brief This property holds the altitude in meters above sea level. + + The property is undefined (\l {qQNaN()}) if the altitude has not been set. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +/*! + \property QGeoCoordinate::isValid + \brief This property holds the validity of this geo coordinate. + + The geo coordinate is valid if the \l [CPP]{longitude} and \l [CPP]{latitude} + properties have been set to valid values. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +/*! + Constructs a coordinate. The coordinate will be invalid until + setLatitude() and setLongitude() have been called. +*/ +QGeoCoordinate::QGeoCoordinate() + : d(new QGeoCoordinatePrivate) +{ +} + +/*! + Constructs a coordinate with the given \a latitude and \a longitude. + + If the latitude is not between -90 to 90 inclusive, or the longitude + is not between -180 to 180 inclusive, none of the values are set and + the type() will be QGeoCoordinate::InvalidCoordinate. + + \sa isValid() +*/ +QGeoCoordinate::QGeoCoordinate(double latitude, double longitude) + : d(new QGeoCoordinatePrivate) +{ + if (QLocationUtils::isValidLat(latitude) && QLocationUtils::isValidLong(longitude)) { + d->lat = latitude; + d->lng = longitude; + } +} + +/*! + Constructs a coordinate with the given \a latitude, \a longitude + and \a altitude. + + If the latitude is not between -90 to 90 inclusive, or the longitude + is not between -180 to 180 inclusive, none of the values are set and + the type() will be QGeoCoordinate::InvalidCoordinate. + + Note that \a altitude specifies the meters above sea level. + + \sa isValid() +*/ +QGeoCoordinate::QGeoCoordinate(double latitude, double longitude, double altitude) + : d(new QGeoCoordinatePrivate) +{ + if (QLocationUtils::isValidLat(latitude) && QLocationUtils::isValidLong(longitude)) { + d->lat = latitude; + d->lng = longitude; + d->alt = altitude; + } +} + +/*! + Constructs a coordinate from the contents of \a other. +*/ +QGeoCoordinate::QGeoCoordinate(const QGeoCoordinate &other) + : d(other.d) +{} + +/*! + \fn QGeoCoordinate::QGeoCoordinate(QGeoCoordinate &&other) + \since 6.2 + + Constructs a coordinate by moving from \a other. + + \note The moved-from QGeoCoordinate object can only be destroyed or + assigned to. The effect of calling other functions than the destructor + or one of the assignment operators is undefined. +*/ + +/*! + Assigns \a other to this coordinate and returns a reference to this coordinate. +*/ +QGeoCoordinate &QGeoCoordinate::operator=(const QGeoCoordinate &other) +{ + if (this == &other) + return *this; + + d = other.d; + return (*this); +} + +/*! + \fn QGeoCoordinate &QGeoCoordinate::operator=(QGeoCoordinate &&other) + \since 6.2 + + Move-assigns \a other to this coordinate and returns a reference to this + coordinate. + + \note The moved-from QGeoCoordinate object can only be destroyed or + assigned to. The effect of calling other functions than the destructor + or one of the assignment operators is undefined. +*/ + +/*! + Destroys the coordinate object. +*/ +QGeoCoordinate::~QGeoCoordinate() +{ +} + +QT_DEFINE_QSDP_SPECIALIZATION_DTOR(QGeoCoordinatePrivate) + +/*! + \fn bool QGeoCoordinate::operator==(const QGeoCoordinate &lhs, const QGeoCoordinate &rhs) + + Returns \c true if the latitude, longitude and altitude of the \a lhs + coordinate are the same as those of the \a rhs coordinate. Otherwise + returns \c false. + + The longitude will be ignored if the latitude is +/- 90 degrees. +*/ + +/*! + \fn bool QGeoCoordinate::operator!=(const QGeoCoordinate &lhs, const QGeoCoordinate &rhs) + + Returns \c true if latitude, longitude, or altitude of the \a lhs + coordinate are not identical to those of the \a rhs coordinate. Otherwise + returns \c false. +*/ + +/*! + Returns \c true if the \l longitude and \l latitude are valid. +*/ +bool QGeoCoordinate::isValid() const +{ + CoordinateType t = type(); + return t == Coordinate2D || t == Coordinate3D; +} + +/*! + Returns the type of this coordinate. +*/ +QGeoCoordinate::CoordinateType QGeoCoordinate::type() const +{ + if (QLocationUtils::isValidLat(d->lat) + && QLocationUtils::isValidLong(d->lng)) { + if (qIsNaN(d->alt)) + return Coordinate2D; + return Coordinate3D; + } + return InvalidCoordinate; +} + + +/*! + Returns the latitude, in decimal degrees. The return value is undefined + if the latitude has not been set. + + A positive latitude indicates the Northern Hemisphere, and a negative + latitude indicates the Southern Hemisphere. + + \sa setLatitude(), type() +*/ +double QGeoCoordinate::latitude() const +{ + return d->lat; +} + +/*! + Sets the latitude (in decimal degrees) to \a latitude. The value should + be in the WGS84 datum. + + To be valid, the latitude must be between -90 to 90 inclusive. + + \sa latitude() +*/ +void QGeoCoordinate::setLatitude(double latitude) +{ + d->lat = latitude; +} + +/*! + Returns the longitude, in decimal degrees. The return value is undefined + if the longitude has not been set. + + A positive longitude indicates the Eastern Hemisphere, and a negative + longitude indicates the Western Hemisphere. + + \sa setLongitude(), type() +*/ +double QGeoCoordinate::longitude() const +{ + return d->lng; +} + +/*! + Sets the longitude (in decimal degrees) to \a longitude. The value should + be in the WGS84 datum. + + To be valid, the longitude must be between -180 to 180 inclusive. + + \sa longitude() +*/ +void QGeoCoordinate::setLongitude(double longitude) +{ + d->lng = longitude; +} + +/*! + Returns the altitude (meters above sea level). + + The return value is undefined if the altitude has not been set. + + \sa setAltitude(), type() +*/ +double QGeoCoordinate::altitude() const +{ + return d->alt; +} + +/*! + Sets the altitude (meters above sea level) to \a altitude. + + \sa altitude() +*/ +void QGeoCoordinate::setAltitude(double altitude) +{ + d->alt = altitude; +} + +/*! + Returns the distance (in meters) from this coordinate to the coordinate + specified by \a other. Altitude is not used in the calculation. + + This calculation returns the great-circle distance between the two + coordinates, with an assumption that the Earth is spherical for the + purpose of this calculation. + + Returns 0 if the type of this coordinate or the type of \a other is + QGeoCoordinate::InvalidCoordinate. +*/ +qreal QGeoCoordinate::distanceTo(const QGeoCoordinate &other) const +{ + if (type() == QGeoCoordinate::InvalidCoordinate + || other.type() == QGeoCoordinate::InvalidCoordinate) { + return 0; + } + + // Haversine formula + double dlat = qDegreesToRadians(other.d->lat - d->lat); + double dlon = qDegreesToRadians(other.d->lng - d->lng); + double haversine_dlat = sin(dlat / 2.0); + haversine_dlat *= haversine_dlat; + double haversine_dlon = sin(dlon / 2.0); + haversine_dlon *= haversine_dlon; + double y = haversine_dlat + + cos(qDegreesToRadians(d->lat)) + * cos(qDegreesToRadians(other.d->lat)) + * haversine_dlon; + double x = 2 * asin(sqrt(y)); + return qreal(x * qgeocoordinate_EARTH_MEAN_RADIUS * 1000); +} + +/*! + Returns the azimuth (or bearing) in degrees from this coordinate to the + coordinate specified by \a other. Altitude is not used in the calculation. + + The bearing returned is the bearing from the origin to \a other along the + great-circle between the two coordinates. There is an assumption that the + Earth is spherical for the purpose of this calculation. + + Returns 0 if the type of this coordinate or the type of \a other is + QGeoCoordinate::InvalidCoordinate. +*/ +qreal QGeoCoordinate::azimuthTo(const QGeoCoordinate &other) const +{ + if (type() == QGeoCoordinate::InvalidCoordinate + || other.type() == QGeoCoordinate::InvalidCoordinate) { + return 0; + } + + double dlon = qDegreesToRadians(other.d->lng - d->lng); + double lat1Rad = qDegreesToRadians(d->lat); + double lat2Rad = qDegreesToRadians(other.d->lat); + + double y = sin(dlon) * cos(lat2Rad); + double x = cos(lat1Rad) * sin(lat2Rad) - sin(lat1Rad) * cos(lat2Rad) * cos(dlon); + + double azimuth = qRadiansToDegrees(atan2(y, x)) + 360.0; + double whole; + double fraction = modf(azimuth, &whole); + return qreal((int(whole + 360) % 360) + fraction); +} + +void QGeoCoordinatePrivate::atDistanceAndAzimuth(const QGeoCoordinate &coord, + qreal distance, qreal azimuth, + double *lon, double *lat) +{ + double latRad = qDegreesToRadians(coord.d->lat); + double lonRad = qDegreesToRadians(coord.d->lng); + double cosLatRad = cos(latRad); + double sinLatRad = sin(latRad); + + double azimuthRad = qDegreesToRadians(azimuth); + + double ratio = (distance / (qgeocoordinate_EARTH_MEAN_RADIUS * 1000.0)); + double cosRatio = cos(ratio); + double sinRatio = sin(ratio); + + double resultLatRad = asin(sinLatRad * cosRatio + + cosLatRad * sinRatio * cos(azimuthRad)); + double resultLonRad = lonRad + atan2(sin(azimuthRad) * sinRatio * cosLatRad, + cosRatio - sinLatRad * sin(resultLatRad)); + + *lat = qRadiansToDegrees(resultLatRad); + *lon = qRadiansToDegrees(resultLonRad); +} + +/*! + Returns the coordinate that is reached by traveling \a distance meters + from the current coordinate at \a azimuth (or bearing) along a great-circle. + There is an assumption that the Earth is spherical for the purpose of this + calculation. + + The altitude will have \a distanceUp added to it. + + Returns an invalid coordinate if this coordinate is invalid. +*/ +QGeoCoordinate QGeoCoordinate::atDistanceAndAzimuth(qreal distance, qreal azimuth, qreal distanceUp) const +{ + if (!isValid()) + return QGeoCoordinate(); + + double resultLon, resultLat; + QGeoCoordinatePrivate::atDistanceAndAzimuth(*this, distance, azimuth, + &resultLon, &resultLat); + double resultAlt = d->alt + distanceUp; + return QGeoCoordinate(resultLat, QLocationUtils::wrapLong(resultLon), resultAlt); +} + +/*! + Returns this coordinate as a string in the specified \a format. + + For example, if this coordinate has a latitude of -27.46758, a longitude + of 153.027892 and an altitude of 28.1, these are the strings + returned depending on \a format: + + \table + \header + \li \a format value + \li Returned string + \row + \li \l Degrees + \li -27.46758\unicode{0xB0}, 153.02789\unicode{0xB0}, 28.1m + \row + \li \l DegreesWithHemisphere + \li 27.46758\unicode{0xB0} S, 153.02789\unicode{0xB0} E, 28.1m + \row + \li \l DegreesMinutes + \li -27\unicode{0xB0} 28.054', 153\unicode{0xB0} 1.673', 28.1m + \row + \li \l DegreesMinutesWithHemisphere + \li 27\unicode{0xB0} 28.054 S', 153\unicode{0xB0} 1.673' E, 28.1m + \row + \li \l DegreesMinutesSeconds + \li -27\unicode{0xB0} 28' 3.2", 153\unicode{0xB0} 1' 40.4", 28.1m + \row + \li \l DegreesMinutesSecondsWithHemisphere + \li 27\unicode{0xB0} 28' 3.2" S, 153\unicode{0xB0} 1' 40.4" E, 28.1m + \endtable + + The altitude field is omitted if no altitude is set. + + If the coordinate is invalid, an empty string is returned. +*/ +QString QGeoCoordinate::toString(CoordinateFormat format) const +{ + if (type() == QGeoCoordinate::InvalidCoordinate) + return QString(); + + QString latStr; + QString longStr; + + double absLat = qAbs(d->lat); + double absLng = qAbs(d->lng); + QChar symbol(0x00B0); // degrees symbol + + switch (format) { + case Degrees: + case DegreesWithHemisphere: { + latStr = QString::number(absLat, 'f', 5) + symbol; + longStr = QString::number(absLng, 'f', 5) + symbol; + break; + } + case DegreesMinutes: + case DegreesMinutesWithHemisphere: { + double latMin = (absLat - int(absLat)) * 60; + double lngMin = (absLng - int(absLng)) * 60; + + // We use QString::number(val, 'f', 3) to represent minutes. + // It rounds up to the next integer in case the fraction > 0.9995. + // Such behavior should be handled specifically when the rounded + // value is 60, so that we overflow to degrees correctly. + // If we overflow, the minutes should unconditionally be 0.0. + if (latMin > 59.9995) { + absLat++; + latMin = 0.0f; + } + if (lngMin > 59.9995) { + absLng++; + lngMin = 0.0f; + } + + latStr = QString::fromLatin1("%1%2 %3'") + .arg(QString::number(int(absLat))) + .arg(symbol) + .arg(QString::number(latMin, 'f', 3)); + longStr = QString::fromLatin1("%1%2 %3'") + .arg(QString::number(int(absLng))) + .arg(symbol) + .arg(QString::number(lngMin, 'f', 3)); + break; + } + case DegreesMinutesSeconds: + case DegreesMinutesSecondsWithHemisphere: { + double latMin = (absLat - int(absLat)) * 60; + double lngMin = (absLng - int(absLng)) * 60; + double latSec = (latMin - int(latMin)) * 60; + double lngSec = (lngMin - int(lngMin)) * 60; + + // We use QString::number(val, 'f', 1) to represent seconds. + // It rounds up to the next integer in case the fraction >= 0.95. + // Such behavior should be handled specifically when the rounded + // value is 60, so that we overflow to minutes correctly. + // If we overflow, the seconds should unconditionally be 0.0. + if (latSec >= 59.95) { + latMin++; + latSec = 0.0f; + // We cast to int to represent minutes, so we can use qRound() + // to determine if we need to overflow to full degrees. + // If we overflow, the minutes will unconditionally be 0.0. + if (qRound(latMin) >= 60) { + absLat++; + latMin = 0.0f; + } + } + if (lngSec >= 59.95) { + lngMin++; + lngSec = 0.0f; + if (qRound(lngMin) >= 60) { + absLng++; + lngMin = 0.0f; + } + } + + latStr = QString::fromLatin1("%1%2 %3' %4\"") + .arg(QString::number(int(absLat))) + .arg(symbol) + .arg(QString::number(int(latMin))) + .arg(QString::number(latSec, 'f', 1)); + longStr = QString::fromLatin1("%1%2 %3' %4\"") + .arg(QString::number(int(absLng))) + .arg(symbol) + .arg(QString::number(int(lngMin))) + .arg(QString::number(lngSec, 'f', 1)); + break; + } + } + + // now add the "-" to the start, or append the hemisphere char + switch (format) { + case Degrees: + case DegreesMinutes: + case DegreesMinutesSeconds: { + if (d->lat < 0) + latStr.insert(0, QStringLiteral("-")); + if (d->lng < 0) + longStr.insert(0, QStringLiteral("-")); + break; + } + case DegreesWithHemisphere: + case DegreesMinutesWithHemisphere: + case DegreesMinutesSecondsWithHemisphere: { + if (d->lat < 0) + latStr.append(QString::fromLatin1(" S")); + else if (d->lat > 0) + latStr.append(QString::fromLatin1(" N")); + if (d->lng < 0) + longStr.append(QString::fromLatin1(" W")); + else if (d->lng > 0) + longStr.append(QString::fromLatin1(" E")); + break; + } + } + + if (qIsNaN(d->alt)) + return QString::fromLatin1("%1, %2").arg(latStr, longStr); + return QString::fromLatin1("%1, %2, %3m").arg(latStr, longStr, QString::number(d->alt)); +} + +bool QGeoCoordinate::equals(const QGeoCoordinate &lhs, const QGeoCoordinate &rhs) +{ + bool latEqual = (qIsNaN(lhs.d->lat) && qIsNaN(rhs.d->lat)) + || qFuzzyCompare(lhs.d->lat, rhs.d->lat); + bool lngEqual = (qIsNaN(lhs.d->lng) && qIsNaN(rhs.d->lng)) + || qFuzzyCompare(lhs.d->lng, rhs.d->lng); + bool altEqual = (qIsNaN(lhs.d->alt) && qIsNaN(rhs.d->alt)) + || qFuzzyCompare(lhs.d->alt, rhs.d->alt); + + if (!qIsNaN(lhs.d->lat) && ((lhs.d->lat == 90.0) || (lhs.d->lat == -90.0))) + lngEqual = true; + + return (latEqual && lngEqual && altEqual); +} + +QGeoCoordinate::QGeoCoordinate(QGeoCoordinatePrivate &dd): + d(&dd) +{ +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug QGeoCoordinate::debugStreaming(QDebug dbg, const QGeoCoordinate &coord) +{ + QDebugStateSaver saver(dbg); + double lat = coord.latitude(); + double lng = coord.longitude(); + + QTextStreamManipulator tsm = qSetRealNumberPrecision(11); + dbg << tsm; + dbg.nospace() << "QGeoCoordinate("; + if (qIsNaN(lat)) + dbg << '?'; + else + dbg << lat; + dbg << ", "; + if (qIsNaN(lng)) + dbg << '?'; + else + dbg << lng; + if (coord.type() == QGeoCoordinate::Coordinate3D) { + dbg << ", "; + dbg << coord.altitude(); + } + dbg << ')'; + return dbg; +} +#endif + +#ifndef QT_NO_DATASTREAM +/*! + \fn QDataStream &QGeoCoordinate::operator<<(QDataStream &stream, const QGeoCoordinate &coordinate) + + Writes the given \a coordinate to the specified \a stream. + + \sa {Serializing Qt Data Types} +*/ + +QDataStream &QGeoCoordinate::dataStreamOut(QDataStream &stream, const QGeoCoordinate &coordinate) +{ + stream << coordinate.latitude(); + stream << coordinate.longitude(); + stream << coordinate.altitude(); + return stream; +} +#endif + +#ifndef QT_NO_DATASTREAM +/*! + \fn QDataStream &QGeoCoordinate::operator>>(QDataStream &stream, QGeoCoordinate &coordinate) + + Reads a coordinate from the specified \a stream into the given + \a coordinate. + + \sa {Serializing Qt Data Types} +*/ + +QDataStream &QGeoCoordinate::dataStreamIn(QDataStream &stream, QGeoCoordinate &coordinate) +{ + double value; + stream >> value; + coordinate.setLatitude(value); + stream >> value; + coordinate.setLongitude(value); + stream >> value; + coordinate.setAltitude(value); + return stream; +} +#endif + +/*! \fn size_t qHash(const QGeoCoordinate &coordinate, size_t seed = 0) + \relates QHash + + Returns a hash value for \a coordinate, using \a seed to seed the calculation. +*/ +size_t qHash(const QGeoCoordinate &coordinate, size_t seed) +{ + QtPrivate::QHashCombine hash; + // north and south pole are geographically equivalent (no matter the longitude) + if (coordinate.latitude() != 90.0 && coordinate.latitude() != -90.0) + seed = hash(seed, coordinate.longitude()); + seed = hash(seed, coordinate.latitude()); + seed = hash(seed, coordinate.altitude()); + return seed; +} + +QT_END_NAMESPACE + +#include "moc_qgeocoordinate.cpp" diff --git a/src/positioning/qgeocoordinate.h b/src/positioning/qgeocoordinate.h new file mode 100644 index 0000000..8ff52bd --- /dev/null +++ b/src/positioning/qgeocoordinate.h @@ -0,0 +1,125 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOCOORDINATE_H +#define QGEOCOORDINATE_H + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QDebug; +class QDataStream; + +class QGeoCoordinatePrivate; +QT_DECLARE_QSDP_SPECIALIZATION_DTOR_WITH_EXPORT(QGeoCoordinatePrivate, Q_POSITIONING_EXPORT) + +class Q_POSITIONING_EXPORT QGeoCoordinate +{ + Q_GADGET + Q_ENUMS(CoordinateFormat) + + Q_PROPERTY(double latitude READ latitude WRITE setLatitude) + Q_PROPERTY(double longitude READ longitude WRITE setLongitude) + Q_PROPERTY(double altitude READ altitude WRITE setAltitude) + Q_PROPERTY(bool isValid READ isValid) + +public: + + enum CoordinateType { + InvalidCoordinate, + Coordinate2D, + Coordinate3D + }; + + enum CoordinateFormat { + Degrees, + DegreesWithHemisphere, + DegreesMinutes, + DegreesMinutesWithHemisphere, + DegreesMinutesSeconds, + DegreesMinutesSecondsWithHemisphere + }; + + QGeoCoordinate(); + QGeoCoordinate(double latitude, double longitude); + QGeoCoordinate(double latitude, double longitude, double altitude); + QGeoCoordinate(const QGeoCoordinate &other); + QGeoCoordinate(QGeoCoordinate &&other) noexcept = default; + ~QGeoCoordinate(); + + QGeoCoordinate &operator=(const QGeoCoordinate &other); + QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QGeoCoordinate) + + void swap(QGeoCoordinate &other) noexcept { d.swap(other.d); } + + friend bool operator==(const QGeoCoordinate &lhs, const QGeoCoordinate &rhs) + { + return equals(lhs, rhs); + } + friend bool operator!=(const QGeoCoordinate &lhs, const QGeoCoordinate &rhs) + { + return !equals(lhs, rhs); + } + + bool isValid() const; + CoordinateType type() const; + + void setLatitude(double latitude); + double latitude() const; + + void setLongitude(double longitude); + double longitude() const; + + void setAltitude(double altitude); + double altitude() const; + + Q_INVOKABLE qreal distanceTo(const QGeoCoordinate &other) const; + Q_INVOKABLE qreal azimuthTo(const QGeoCoordinate &other) const; + + Q_INVOKABLE QGeoCoordinate atDistanceAndAzimuth(qreal distance, qreal azimuth, qreal distanceUp = 0.0) const; + + Q_INVOKABLE QString toString(CoordinateFormat format = DegreesMinutesSecondsWithHemisphere) const; + +private: + static bool equals(const QGeoCoordinate &lhs, const QGeoCoordinate &rhs); + QGeoCoordinate(QGeoCoordinatePrivate &dd); + QSharedDataPointer d; + friend class QGeoCoordinatePrivate; + friend class QQuickGeoCoordinateAnimation; +#ifndef QT_NO_DEBUG_STREAM + friend QDebug operator<<(QDebug dbg, const QGeoCoordinate &coord) + { + return debugStreaming(dbg, coord); + } + static QDebug debugStreaming(QDebug dbg, const QGeoCoordinate &coord); +#endif +#ifndef QT_NO_DATASTREAM + friend QDataStream &operator<<(QDataStream &stream, const QGeoCoordinate &coordinate) + { + return dataStreamOut(stream, coordinate); + } + friend QDataStream &operator>>(QDataStream &stream, QGeoCoordinate &coordinate) + { + return dataStreamIn(stream, coordinate); + } + static QDataStream &dataStreamOut(QDataStream &stream, const QGeoCoordinate &coordinate); + static QDataStream &dataStreamIn(QDataStream &stream, QGeoCoordinate &coordinate); +#endif +}; + +Q_DECLARE_SHARED(QGeoCoordinate) + + +Q_POSITIONING_EXPORT size_t qHash(const QGeoCoordinate &coordinate, size_t seed = 0); + + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN(QGeoCoordinate, Q_POSITIONING_EXPORT) + +#endif diff --git a/src/positioning/qgeocoordinate_p.h b/src/positioning/qgeocoordinate_p.h new file mode 100644 index 0000000..598c287 --- /dev/null +++ b/src/positioning/qgeocoordinate_p.h @@ -0,0 +1,60 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOCOORDINATE_P_H +#define QGEOCOORDINATE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include "qgeocoordinate.h" +#include "private/qglobal_p.h" + +QT_BEGIN_NAMESPACE + +class QGeoCoordinatePrivate : public QSharedData +{ +public: + QGeoCoordinatePrivate(); + QGeoCoordinatePrivate(const QGeoCoordinatePrivate &other); + // The destructor needs to be virtual because we have a derived class + // QGeoMercatorCoordinatePrivate, which is used by + // QQuickGeoCoordinateAnimation to create QGeoCoordinate. + virtual ~QGeoCoordinatePrivate(); + + double lat; + double lng; + double alt; + + static void atDistanceAndAzimuth(const QGeoCoordinate &coord, + qreal distance, qreal azimuth, + double *lon, double *lat); + static const QGeoCoordinatePrivate *get(const QGeoCoordinate *c) { + return c->d.constData(); + } +}; + +class Q_POSITIONING_EXPORT QGeoMercatorCoordinatePrivate : public QGeoCoordinatePrivate +{ +public: + QGeoMercatorCoordinatePrivate(); + QGeoMercatorCoordinatePrivate(const QGeoMercatorCoordinatePrivate &other); + ~QGeoMercatorCoordinatePrivate(); + + double m_mercatorX; + double m_mercatorY; +}; + + +QT_END_NAMESPACE + +#endif // QGEOCOORDINATE_P_H diff --git a/src/positioning/qgeocoordinateobject.cpp b/src/positioning/qgeocoordinateobject.cpp new file mode 100644 index 0000000..b7560cf --- /dev/null +++ b/src/positioning/qgeocoordinateobject.cpp @@ -0,0 +1,60 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeocoordinateobject_p.h" + +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN_TAGGED(QGeoCoordinateObject*, QGeoCoordinateObject_ptr) + +/* + + Note: This class only purpose is to enable conversion between QGeoCoordinate and QDeclarativeGeoWaypoint. + Since QGeoCoordinate lives in the QtPositioning module, this class acts as a base for QDeclarativeGeoWaypoint, + and contains the bare minimum to convert/compare to a QGeoCoordinate + +*/ + +QGeoCoordinateObject::QGeoCoordinateObject(QObject *parent) : QObject(parent) +{ +} + +QGeoCoordinateObject::QGeoCoordinateObject(const QGeoCoordinate &c, QObject *parent) : QObject(parent) +{ + setCoordinate(c); +} + +QGeoCoordinateObject::~QGeoCoordinateObject() +{ + +} + +bool QGeoCoordinateObject::operator==(const QGeoCoordinateObject &other) const +{ + return m_coordinate.value() == other.m_coordinate.value(); +} + +bool QGeoCoordinateObject::operator==(const QGeoCoordinate &other) const +{ + return m_coordinate.value() == other; +} + +QGeoCoordinate QGeoCoordinateObject::coordinate() const +{ + return m_coordinate; +} + +void QGeoCoordinateObject::setCoordinate(const QGeoCoordinate &c) +{ + m_coordinate = c; // The signal is emitted automatically if needed +} + +QBindable QGeoCoordinateObject::bindableCoordinate() +{ + return QBindable(&m_coordinate); +} + +QT_END_NAMESPACE + +#include "moc_qgeocoordinateobject_p.cpp" + diff --git a/src/positioning/qgeocoordinateobject_p.h b/src/positioning/qgeocoordinateobject_p.h new file mode 100644 index 0000000..e83ba63 --- /dev/null +++ b/src/positioning/qgeocoordinateobject_p.h @@ -0,0 +1,63 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOCOORDINATEOBJECT_P_H +#define QGEOCOORDINATEOBJECT_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONING_PRIVATE_EXPORT QGeoCoordinateObject : public QObject +{ + Q_OBJECT + Q_PROPERTY(QGeoCoordinate coordinate READ coordinate WRITE setCoordinate NOTIFY + coordinateChanged BINDABLE bindableCoordinate) + +public: + QGeoCoordinateObject(QObject *parent = 0); + QGeoCoordinateObject(const QGeoCoordinate &c, QObject *parent = 0); + virtual ~QGeoCoordinateObject(); + + bool operator==(const QGeoCoordinate &other) const; + bool operator==(const QGeoCoordinateObject &other) const; + inline bool operator!=(const QGeoCoordinate &other) const { + return !operator==(other); + } + inline bool operator!=(const QGeoCoordinateObject &other) const { + return !operator==(other); + } + + QGeoCoordinate coordinate() const; + void setCoordinate(const QGeoCoordinate &c); + QBindable bindableCoordinate(); + +Q_SIGNALS: + void coordinateChanged(); + +protected: + Q_OBJECT_BINDABLE_PROPERTY(QGeoCoordinateObject, QGeoCoordinate, m_coordinate, + &QGeoCoordinateObject::coordinateChanged) +}; + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN_TAGGED(QGeoCoordinateObject*, QGeoCoordinateObject_ptr, + Q_POSITIONING_PRIVATE_EXPORT) + +#endif // QGEOCOORDINATEOBJECT_P_H diff --git a/src/positioning/qgeolocation.cpp b/src/positioning/qgeolocation.cpp new file mode 100644 index 0000000..feab088 --- /dev/null +++ b/src/positioning/qgeolocation.cpp @@ -0,0 +1,248 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeolocation.h" +#include "qgeolocation_p.h" + +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN(QGeoLocation) + +QGeoLocationPrivate::QGeoLocationPrivate() + : QSharedData() +{ +} + +QGeoLocationPrivate::QGeoLocationPrivate(const QGeoLocationPrivate &other) + : QSharedData() +{ + this->address = other.address; + this->coordinate = other.coordinate; + this->viewport = other.viewport; + this->extendedAttributes = other.extendedAttributes; +} + +QGeoLocationPrivate::~QGeoLocationPrivate() +{ +} + +bool QGeoLocationPrivate::operator==(const QGeoLocationPrivate &other) const +{ + return (this->address == other.address + && this->coordinate == other.coordinate + && this->viewport == other.viewport + && this->extendedAttributes == other.extendedAttributes); + +} + +bool QGeoLocationPrivate::isEmpty() const +{ + return (address.isEmpty() + && !coordinate.isValid() + && viewport.isEmpty() + && extendedAttributes.isEmpty()); +} + +/*! + \class QGeoLocation + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \ingroup QtLocation-places + \ingroup QtLocation-places-data + \since 5.2 + + \brief The QGeoLocation class represents basic information about a location. + + A QGeoLocation consists of a coordinate and corresponding address, along with an optional + bounding shape, which is the recommended region to be displayed when viewing the location. +*/ + +/*! + Constructs an new location object. +*/ +QGeoLocation::QGeoLocation() + : d(new QGeoLocationPrivate) +{ +} + +/*! + Constructs a copy of \a other +*/ +QGeoLocation::QGeoLocation(const QGeoLocation &other) + :d(other.d) +{ +} + +/*! + \fn QGeoLocation::QGeoLocation(QGeoLocation &&other) + \since 6.2 + + Constructs a geo location object by moving from \a other. + + \note The moved-from QGeoLocation object can only be destroyed or + assigned to. The effect of calling other functions than the destructor + or one of the assignment operators is undefined. +*/ + +/*! + Destroys the location object. +*/ +QGeoLocation::~QGeoLocation() +{ +} + +QT_DEFINE_QSDP_SPECIALIZATION_DTOR(QGeoLocationPrivate) + +/*! + Assigns \a other to this location and returns a reference to this location. +*/ +QGeoLocation &QGeoLocation::operator =(const QGeoLocation &other) +{ + if (this == &other) + return *this; + + d = other.d; + return *this; +} + +/*! + \fn QGeoLocation &QGeoLocation::operator=(QGeoLocation &&other) + \since 6.2 + + Move-assings \a other to this location and returns a reference to this + location. + + \note The moved-from QGeoLocation object can only be destroyed or + assigned to. The effect of calling other functions than the destructor + or one of the assignment operators is undefined. +*/ + +/*! + \fn bool QGeoLocation::operator==(const QGeoLocation &lhs, const QGeoLocation &rhs) + + Returns \c true if the \a lhs location is equal to \a rhs, otherwise + returns \c false. +*/ + +/*! + \fn bool QGeoLocation::operator!=(const QGeoLocation &lhs, const QGeoLocation &rhs) + + Returns \c true if the \a lhs location is not equal to \a rhs, otherwise + returns \c false. +*/ + +/*! + Returns the address of the location. +*/ +QGeoAddress QGeoLocation::address() const +{ + return d->address; +} + +/*! + Sets the \a address of the location. +*/ +void QGeoLocation::setAddress(const QGeoAddress &address) +{ + d->address = address; +} + +/*! + Returns the coordinate of the location. +*/ +QGeoCoordinate QGeoLocation::coordinate() const +{ + return d->coordinate; +} + +/*! + Sets the \a coordinate of the location. +*/ +void QGeoLocation::setCoordinate(const QGeoCoordinate &coordinate) +{ + d->coordinate = coordinate; +} + +/*! + \since 6.2 + + Returns a bounding shape which represents the recommended region + to display when viewing this location. + + For example, a building's location may have a region centered around the + building, but the region is large enough to show it's immediate surrounding + geographical context. + + \note This method was introduced in Qt6 instead of boundingBox() method. + It returns a QGeoShape instead of a QGeoRectangle. + Use \l QGeoShape::boundingGeoRectangle() to obtain a bounding QGeoRectangle + for the shape. +*/ +QGeoShape QGeoLocation::boundingShape() const +{ + return d->viewport; +} + +/*! + \since 6.2 + + Sets the \a boundingShape of the location. +*/ +void QGeoLocation::setBoundingShape(const QGeoShape &boundingShape) +{ + d->viewport = boundingShape; +} + +/*! + Returns the extended attributes associated to this location. + Extended attributes are backend-dependent and can be location-dependent. + + \since 5.13 +*/ +QVariantMap QGeoLocation::extendedAttributes() const +{ + return d->extendedAttributes; +} + +/*! + Sets the extended attributes of the location with the + parameters specified in \a data. + + \since 5.13 +*/ +void QGeoLocation::setExtendedAttributes(const QVariantMap &data) +{ + d->extendedAttributes = data; +} + +/*! + Returns \c true if the location coordinate is \l {QGeoCoordinate::isValid} + {invalid}, and all the other location fields are empty. Otherwise returns + \c false. +*/ +bool QGeoLocation::isEmpty() const +{ + return d->isEmpty(); +} + +bool QGeoLocation::equals(const QGeoLocation &lhs, const QGeoLocation &rhs) +{ + return (*(lhs.d.constData()) == *(rhs.d.constData())); +} + +/*! + \relates QGeoLocation + + Returns the hash value for the \a location, using \a seed for the + calculation. + + \note The hash does not take extended attributes into account. This means + that two geo location objects that differ only in the extended attributes + will provide similar hashes. +*/ +size_t qHash(const QGeoLocation &location, size_t seed) noexcept +{ + return qHashMulti(seed, location.coordinate(), location.boundingShape(), location.address()); +} + +QT_END_NAMESPACE diff --git a/src/positioning/qgeolocation.h b/src/positioning/qgeolocation.h new file mode 100644 index 0000000..2f08d60 --- /dev/null +++ b/src/positioning/qgeolocation.h @@ -0,0 +1,65 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOLOCATION_H +#define QGEOLOCATION_H + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoAddress; +class QGeoCoordinate; +class QGeoShape; +class QGeoLocationPrivate; +QT_DECLARE_QSDP_SPECIALIZATION_DTOR_WITH_EXPORT(QGeoLocationPrivate, Q_POSITIONING_EXPORT) + +class Q_POSITIONING_EXPORT QGeoLocation +{ +public: + QGeoLocation(); + QGeoLocation(const QGeoLocation &other); + QGeoLocation(QGeoLocation &&other) noexcept = default; + ~QGeoLocation(); + + QGeoLocation &operator=(const QGeoLocation &other); + QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QGeoLocation) + + void swap(QGeoLocation &other) noexcept { d.swap(other.d); } + + friend bool operator==(const QGeoLocation &lhs, const QGeoLocation &rhs) + { + return equals(lhs, rhs); + } + friend bool operator!=(const QGeoLocation &lhs, const QGeoLocation &rhs) + { + return !equals(lhs, rhs); + } + + QGeoAddress address() const; + void setAddress(const QGeoAddress &address); + QGeoCoordinate coordinate() const; + void setCoordinate(const QGeoCoordinate &position); + QGeoShape boundingShape() const; + void setBoundingShape(const QGeoShape &shape); + QVariantMap extendedAttributes() const; + void setExtendedAttributes(const QVariantMap &data); + + bool isEmpty() const; + +private: + static bool equals(const QGeoLocation &lhs, const QGeoLocation &rhs); + QSharedDataPointer d; +}; + +Q_POSITIONING_EXPORT size_t qHash(const QGeoLocation &location, size_t seed = 0) noexcept; + +Q_DECLARE_SHARED(QGeoLocation) + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN(QGeoLocation, Q_POSITIONING_EXPORT) + +#endif diff --git a/src/positioning/qgeolocation_p.h b/src/positioning/qgeolocation_p.h new file mode 100644 index 0000000..4e3aa92 --- /dev/null +++ b/src/positioning/qgeolocation_p.h @@ -0,0 +1,47 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOLOCATION_P_H +#define QGEOLOCATION_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoLocationPrivate : public QSharedData +{ +public: + QGeoLocationPrivate(); + QGeoLocationPrivate(const QGeoLocationPrivate &other); + + ~QGeoLocationPrivate(); + + bool operator==(const QGeoLocationPrivate &other) const; + + bool isEmpty() const; + + QGeoAddress address; + QGeoCoordinate coordinate; + QGeoShape viewport; + QVariantMap extendedAttributes; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qgeopath.cpp b/src/positioning/qgeopath.cpp new file mode 100644 index 0000000..795f6f9 --- /dev/null +++ b/src/positioning/qgeopath.cpp @@ -0,0 +1,722 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeopath.h" +#include "qgeopolygon.h" +#include "qgeopath_p.h" + +#include "qgeocoordinate.h" +#include "qnumeric.h" +#include "qlocationutils_p.h" +#include "qwebmercator_p.h" + +#include "qdoublevector2d_p.h" +#include "qdoublevector3d_p.h" +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN(QGeoPath) + +constexpr auto kWarningString = u"The path has more elements than fit into an int. " + "This can cause errors while querying elements from QML"; + +/*! + \class QGeoPath + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \since 5.9 + + \brief The QGeoPath class defines a geographic path. + + The path is defined by an ordered list of \l QGeoCoordinate objects. + + Each two adjacent elements in the path are intended to be connected + together by the shortest line segment of constant bearing passing + through both elements. + This type of connection can cross the dateline in the longitudinal direction, + but never crosses the poles. + + This is relevant for the calculation of the bounding box returned by + \l QGeoShape::boundingGeoRectangle() for this shape, which will have the latitude of + the top left corner set to the maximum latitude in the path point set. + Similarly, the latitude of the bottom right corner will be the minimum latitude + in the path point set. + + This class is a \l Q_GADGET. + It can be \l{Cpp_value_integration_positioning}{directly used from C++ and QML}. + + A QGeoPath is both invalid and empty if it contains no coordinate. + + \note A default constructed QGeoPath is both invalid and empty as it does not contain any coordinates. +*/ + +/*! + \property QGeoPath::path + \brief This property holds the list of coordinates for the geo path. + + \note The coordinates cannot be processed in place. To change the value + of this property, retrieve the complete list of coordinates, process them, + and assign the new value to the property. +*/ + +inline QGeoPathPrivate *QGeoPath::d_func() +{ + return static_cast(d_ptr.data()); +} + +inline const QGeoPathPrivate *QGeoPath::d_func() const +{ + return static_cast(d_ptr.constData()); +} + +/*! + Constructs a new, empty geo path. +*/ +QGeoPath::QGeoPath() +: QGeoShape(new QGeoPathPrivate()) +{ +} + +/*! + Constructs a new geo path from a list of coordinates + (\a path and \a width). +*/ +QGeoPath::QGeoPath(const QList &path, const qreal &width) +: QGeoShape(new QGeoPathPrivate(path, width)) +{ +} + +/*! + Constructs a new geo path from the contents of \a other. +*/ +QGeoPath::QGeoPath(const QGeoPath &other) +: QGeoShape(other) +{ +} + +/*! + Constructs a new geo path from the contents of \a other. +*/ +QGeoPath::QGeoPath(const QGeoShape &other) +: QGeoShape(other) +{ + if (type() != QGeoShape::PathType) + d_ptr = new QGeoPathPrivate(); +} + +/*! + Destroys this path. +*/ +QGeoPath::~QGeoPath() {} + +/*! + Assigns \a other to this geo path and returns a reference to this geo path. +*/ +QGeoPath &QGeoPath::operator=(const QGeoPath &other) +{ + QGeoShape::operator=(other); + return *this; +} + +/*! + Sets all the elements of the \a path. +*/ +void QGeoPath::setPath(const QList &path) +{ + Q_D(QGeoPath); + return d->setPath(path); +} + +/*! + Returns all the elements of the path. +*/ +const QList &QGeoPath::path() const +{ + Q_D(const QGeoPath); + return d->path(); +} + +/*! + Clears the path. + + \since 5.12 +*/ +void QGeoPath::clearPath() +{ + Q_D(QGeoPath); + d->clearPath(); +} + +/*! + Sets all the elements of the path. + + \internal +*/ +void QGeoPath::setVariantPath(const QVariantList &path) +{ + Q_D(QGeoPath); + QList p; + for (const auto &c: path) { + if (c.canConvert()) + p << c.value(); + } + d->setPath(p); +} +/*! + Returns all the elements of the path. + + \internal +*/ +QVariantList QGeoPath::variantPath() const +{ + Q_D(const QGeoPath); + QVariantList p; + for (const auto &c: d->path()) + p << QVariant::fromValue(c); + return p; +} + + +/*! + \property QGeoPath::width + + \brief the width of the path in meters. +*/ +void QGeoPath::setWidth(const qreal &width) +{ + Q_D(QGeoPath); + d->setWidth(width); +} + +/*! + Returns the width of the path, in meters. This information is used in the \l contains method. + The default value is 0. +*/ +qreal QGeoPath::width() const +{ + Q_D(const QGeoPath); + return d->width(); +} + +/*! + Translates this geo path by \a degreesLatitude northwards and \a degreesLongitude eastwards. + + Negative values of \a degreesLatitude and \a degreesLongitude correspond to + southward and westward translation respectively. +*/ +void QGeoPath::translate(double degreesLatitude, double degreesLongitude) +{ + Q_D(QGeoPath); + d->translate(degreesLatitude, degreesLongitude); +} + +/*! + Returns a copy of this geo path translated by \a degreesLatitude northwards and + \a degreesLongitude eastwards. + + Negative values of \a degreesLatitude and \a degreesLongitude correspond to + southward and westward translation respectively. + + \sa translate() +*/ +QGeoPath QGeoPath::translated(double degreesLatitude, double degreesLongitude) const +{ + QGeoPath result(*this); + result.translate(degreesLatitude, degreesLongitude); + return result; +} + +/*! + Returns the length of the path, in meters, from the element \a indexFrom to the element \a indexTo. + The length is intended to be the sum of the shortest distances for each pair of adjacent points. + + If \a indexTo is -1 (the default value), the length will be including the distance between last coordinate + and the first (closed loop). + To retrieve the length for the path, use 0 for \a indexFrom and \l QGeoPath::size() - 1 for \a indexTo. +*/ +double QGeoPath::length(qsizetype indexFrom, qsizetype indexTo) const +{ + Q_D(const QGeoPath); + return d->length(indexFrom, indexTo); +} + +/*! + Returns the number of elements in the path. + + \since 5.10 +*/ +qsizetype QGeoPath::size() const +{ + Q_D(const QGeoPath); + const qsizetype result = d->size(); + if (result > std::numeric_limits::max()) + qWarning() << kWarningString; + return result; +} + +/*! + Appends \a coordinate to the path. +*/ +void QGeoPath::addCoordinate(const QGeoCoordinate &coordinate) +{ + Q_D(QGeoPath); + d->addCoordinate(coordinate); + if (d->size() > std::numeric_limits::max()) + qWarning() << kWarningString; +} + +/*! + Inserts \a coordinate at the specified \a index. +*/ +void QGeoPath::insertCoordinate(qsizetype index, const QGeoCoordinate &coordinate) +{ + Q_D(QGeoPath); + d->insertCoordinate(index, coordinate); +} + +/*! + Replaces the path element at the specified \a index with \a coordinate. +*/ +void QGeoPath::replaceCoordinate(qsizetype index, const QGeoCoordinate &coordinate) +{ + Q_D(QGeoPath); + d->replaceCoordinate(index, coordinate); +} + +/*! + Returns the coordinate at \a index . +*/ +QGeoCoordinate QGeoPath::coordinateAt(qsizetype index) const +{ + Q_D(const QGeoPath); + return d->coordinateAt(index); +} + +/*! + Returns true if the path contains \a coordinate as one of the elements. +*/ +bool QGeoPath::containsCoordinate(const QGeoCoordinate &coordinate) const +{ + Q_D(const QGeoPath); + return d->containsCoordinate(coordinate); +} + +/*! + Removes the last occurrence of \a coordinate from the path. +*/ +void QGeoPath::removeCoordinate(const QGeoCoordinate &coordinate) +{ + Q_D(QGeoPath); + d->removeCoordinate(coordinate); +} + +/*! + Removes element at position \a index from the path. +*/ +void QGeoPath::removeCoordinate(qsizetype index) +{ + Q_D(QGeoPath); + d->removeCoordinate(index); +} + +/*! + Returns the geo path properties as a string. +*/ +QString QGeoPath::toString() const +{ + if (type() != QGeoShape::PathType) { + qWarning("Not a path"); + return QStringLiteral("QGeoPath(not a path)"); + } + + QString pathString; + for (const auto &p : path()) + pathString += p.toString() + QLatin1Char(','); + + return QStringLiteral("QGeoPath([ %1 ])").arg(pathString); +} + +/******************************************************************************* + * + * QGeoPathPrivate & friends + * +*******************************************************************************/ + +QGeoPathPrivate::QGeoPathPrivate() +: QGeoShapePrivate(QGeoShape::PathType) +{ + +} + +QGeoPathPrivate::QGeoPathPrivate(const QList &path, const qreal width) +: QGeoShapePrivate(QGeoShape::PathType) +{ + setPath(path); + setWidth(width); +} + +QGeoPathPrivate::~QGeoPathPrivate() +{ + +} + +QGeoShapePrivate *QGeoPathPrivate::clone() const +{ + return new QGeoPathPrivate(*this); +} + +bool QGeoPathPrivate::isValid() const +{ + return !isEmpty(); +} + +bool QGeoPathPrivate::isEmpty() const +{ + return path().isEmpty(); // this should perhaps return geometric emptiness, less than 2 points for line, or empty polygon for polygons +} + +QGeoCoordinate QGeoPathPrivate::center() const +{ + return boundingGeoRectangle().center(); +} + +bool QGeoPathPrivate::operator==(const QGeoShapePrivate &other) const +{ + if (!QGeoShapePrivate::operator==(other)) + return false; + + const QGeoPathPrivate &otherPath = static_cast(other); + if (m_path.size() != otherPath.m_path.size()) + return false; + return m_width == otherPath.m_width && m_path == otherPath.m_path; +} + +const QList &QGeoPathPrivate::path() const +{ + return m_path; +} + +bool QGeoPathPrivate::lineContains(const QGeoCoordinate &coordinate) const +{ + // Unoptimized approach: + // - consider each segment of the path + // - project it into mercator space (rhumb lines are straight in mercator space) + // - find closest point to coordinate + // - unproject the closest point + // - calculate coordinate to closest point distance with distanceTo() + // - if not within lineRadius, advance + // + // To keep wrapping into the equation: + // If the mercator x value of a coordinate of the line, or the coordinate parameter, is less + // than mercator(m_bbox).x, add that to the conversion. + + if (m_bboxDirty) + const_cast(*this).computeBoundingBox(); + + double lineRadius = qMax(width() * 0.5, 0.2); // minimum radius: 20cm + + if (m_path.isEmpty()) + return false; + else if (m_path.size() == 1) + return (m_path[0].distanceTo(coordinate) <= lineRadius); + + QDoubleVector2D p = QWebMercator::coordToMercator(coordinate); + if (p.x() < m_leftBoundWrapped) + p.setX(p.x() + m_leftBoundWrapped); // unwrap X + + QDoubleVector2D a; + QDoubleVector2D b; + if (!m_path.isEmpty()) { + a = QWebMercator::coordToMercator(m_path[0]); + if (a.x() < m_leftBoundWrapped) + a.setX(a.x() + m_leftBoundWrapped); // unwrap X + } + for (qsizetype i = 1; i < m_path.size(); i++) { + b = QWebMercator::coordToMercator(m_path[i]); + if (b.x() < m_leftBoundWrapped) + b.setX(b.x() + m_leftBoundWrapped); // unwrap X + if (b == a) + continue; + + double u = ((p.x() - a.x()) * (b.x() - a.x()) + (p.y() - a.y()) * (b.y() - a.y()) ) / (b - a).lengthSquared(); + QDoubleVector2D intersection(a.x() + u * (b.x() - a.x()) , a.y() + u * (b.y() - a.y()) ); + + QDoubleVector2D candidate = ( (p-a).length() < (p-b).length() ) ? a : b; + + if (u > 0 && u < 1 + && (p-intersection).length() < (p-candidate).length() ) // And it falls in the segment + candidate = intersection; + + + if (candidate.x() > 1.0) + candidate.setX(candidate.x() - m_leftBoundWrapped); // wrap X + + QGeoCoordinate closest = QWebMercator::mercatorToCoord(candidate); + + double distanceMeters = coordinate.distanceTo(closest); + if (distanceMeters <= lineRadius) + return true; + + // swap + a = b; + } + + // Last check if the coordinate is on the left of leftBoundMercator, but close enough to + // m_path[0] + return (m_path[0].distanceTo(coordinate) <= lineRadius); +} + +bool QGeoPathPrivate::contains(const QGeoCoordinate &coordinate) const +{ + return lineContains(coordinate); +} + +qreal QGeoPathPrivate::width() const +{ + return m_width; +} + +void QGeoPathPrivate::setWidth(const qreal &width) +{ + if (qIsNaN(width) || width < 0.0) + return; + m_width = width; +} + +double QGeoPathPrivate::length(qsizetype indexFrom, qsizetype indexTo) const +{ + if (path().isEmpty()) + return 0.0; + + bool wrap = indexTo == -1; + if (indexTo < 0 || indexTo >= path().size()) + indexTo = path().size() - 1; + double len = 0.0; + // TODO: consider calculating the length of the actual rhumb line segments + // instead of the shortest path from A to B. + for (qsizetype i = indexFrom; i < indexTo; i++) + len += m_path[i].distanceTo(m_path[i+1]); + if (wrap) + len += m_path.last().distanceTo(m_path.first()); + return len; +} + +qsizetype QGeoPathPrivate::size() const +{ + return m_path.size(); +} + +QGeoCoordinate QGeoPathPrivate::coordinateAt(qsizetype index) const +{ + if (index < 0 || index >= m_path.size()) + return QGeoCoordinate(); + + return m_path.at(index); +} + +bool QGeoPathPrivate::containsCoordinate(const QGeoCoordinate &coordinate) const +{ + return m_path.indexOf(coordinate) > -1; +} + +void QGeoPathPrivate::translate(double degreesLatitude, double degreesLongitude) +{ + // Need min/maxLati, so update bbox + QList m_deltaXs; + double m_minX, m_maxX, m_minLati, m_maxLati; + m_bboxDirty = false; + computeBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati, m_bbox); + + if (degreesLatitude > 0.0) + degreesLatitude = qMin(degreesLatitude, 90.0 - m_maxLati); + else + degreesLatitude = qMax(degreesLatitude, -90.0 - m_minLati); + for (QGeoCoordinate &p: m_path) { + p.setLatitude(p.latitude() + degreesLatitude); + p.setLongitude(QLocationUtils::wrapLong(p.longitude() + degreesLongitude)); + } + m_bbox.translate(degreesLatitude, degreesLongitude); + m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x(); +} + +QGeoRectangle QGeoPathPrivate::boundingGeoRectangle() const +{ + if (m_bboxDirty) + const_cast(*this).computeBoundingBox(); + return m_bbox; +} + +size_t QGeoPathPrivate::hash(size_t seed) const +{ + const size_t res = qHashRange(m_path.cbegin(), m_path.cend(), seed); + return qHashMulti(seed, res, m_width); +} + +void QGeoPathPrivate::setPath(const QList &path) +{ + for (const QGeoCoordinate &c: path) + if (!c.isValid()) + return; + m_path = path; + markDirty(); +} + +void QGeoPathPrivate::clearPath() +{ + m_path.clear(); + markDirty(); +} + +void QGeoPathPrivate::addCoordinate(const QGeoCoordinate &coordinate) +{ + if (!coordinate.isValid()) + return; + m_path.append(coordinate); + markDirty(); +} + +void QGeoPathPrivate::insertCoordinate(qsizetype index, const QGeoCoordinate &coordinate) +{ + if (index < 0 || index > m_path.size() || !coordinate.isValid()) + return; + m_path.insert(index, coordinate); + markDirty(); +} + +void QGeoPathPrivate::replaceCoordinate(qsizetype index, const QGeoCoordinate &coordinate) +{ + if (index < 0 || index >= m_path.size() || !coordinate.isValid()) + return; + m_path[index] = coordinate; + markDirty(); +} + +void QGeoPathPrivate::removeCoordinate(const QGeoCoordinate &coordinate) +{ + qsizetype index = m_path.lastIndexOf(coordinate); + removeCoordinate(index); +} + +void QGeoPathPrivate::removeCoordinate(qsizetype index) +{ + if (index < 0 || index >= m_path.size()) + return; + m_path.removeAt(index); + markDirty(); +} + +void QGeoPathPrivate::markDirty() +{ + m_bboxDirty = true; +} + +void QGeoPathPrivate::computeBoundingBox() +{ + QList m_deltaXs; + double m_minX, m_maxX, m_minLati, m_maxLati; + m_bboxDirty = false; + computeBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati, m_bbox); + m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x(); +} + +QGeoPathPrivateEager::QGeoPathPrivateEager() +: QGeoPathPrivate() +{ + m_bboxDirty = false; // never dirty on the eager version +} + +QGeoPathPrivateEager::QGeoPathPrivateEager(const QList &path, const qreal width) +: QGeoPathPrivate(path, width) +{ + m_bboxDirty = false; // never dirty on the eager version +} + +QGeoPathPrivateEager::~QGeoPathPrivateEager() +{ + +} + +QGeoShapePrivate *QGeoPathPrivateEager::clone() const +{ + return new QGeoPathPrivateEager(*this); +} + +void QGeoPathPrivateEager::markDirty() +{ + computeBoundingBox(); +} + +void QGeoPathPrivateEager::translate(double degreesLatitude, double degreesLongitude) +{ + if (degreesLatitude > 0.0) + degreesLatitude = qMin(degreesLatitude, 90.0 - m_maxLati); + else + degreesLatitude = qMax(degreesLatitude, -90.0 - m_minLati); + for (QGeoCoordinate &p: m_path) { + p.setLatitude(p.latitude() + degreesLatitude); + p.setLongitude(QLocationUtils::wrapLong(p.longitude() + degreesLongitude)); + } + m_bbox.translate(degreesLatitude, degreesLongitude); + m_minLati += degreesLatitude; + m_maxLati += degreesLatitude; + m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x(); +} + +void QGeoPathPrivateEager::addCoordinate(const QGeoCoordinate &coordinate) +{ + if (!coordinate.isValid()) + return; + m_path.append(coordinate); + //m_clipperDirty = true; // clipper not used in polylines + updateBoundingBox(); +} + +void QGeoPathPrivateEager::QGeoPathPrivateEager::computeBoundingBox() +{ + computeBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati, m_bbox); + m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x(); +} + +void QGeoPathPrivateEager::QGeoPathPrivateEager::updateBoundingBox() +{ + updateBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati, m_bbox); + m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x(); +} + +QGeoPathEager::QGeoPathEager() : QGeoPath() +{ + d_ptr = new QGeoPathPrivateEager; +} + +QGeoPathEager::QGeoPathEager(const QList &path, const qreal &width) : QGeoPath() +{ + d_ptr = new QGeoPathPrivateEager(path, width); +} + +QGeoPathEager::QGeoPathEager(const QGeoPath &other) : QGeoPath() +{ + d_ptr = new QGeoPathPrivateEager; + setPath(other.path()); + setWidth(other.width()); +} + +QGeoPathEager::QGeoPathEager(const QGeoShape &other) : QGeoPath() +{ + if (other.type() == QGeoShape::PathType) + *this = QGeoPathEager(QGeoPath(other)); + else + d_ptr = new QGeoPathPrivateEager; +} + +QGeoPathEager::~QGeoPathEager() {} + +QT_END_NAMESPACE + +#include "moc_qgeopath_p.cpp" +#include "moc_qgeopath.cpp" + + + + + + + diff --git a/src/positioning/qgeopath.h b/src/positioning/qgeopath.h new file mode 100644 index 0000000..d16dc9e --- /dev/null +++ b/src/positioning/qgeopath.h @@ -0,0 +1,76 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPATH_H +#define QGEOPATH_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoCoordinate; +class QGeoPathPrivate; + +class Q_POSITIONING_EXPORT QGeoPath : public QGeoShape +{ + Q_GADGET + Q_PROPERTY(QVariantList path READ variantPath WRITE setVariantPath) + Q_PROPERTY(qreal width READ width WRITE setWidth) + +public: + QGeoPath(); + QGeoPath(const QList &path, const qreal &width = 0.0); + QGeoPath(const QGeoPath &other); + QGeoPath(const QGeoShape &other); + + ~QGeoPath(); + + QGeoPath &operator=(const QGeoPath &other); + + void setPath(const QList &path); + const QList &path() const; + void clearPath(); + void setVariantPath(const QVariantList &path); + QVariantList variantPath() const; + + void setWidth(const qreal &width); + qreal width() const; + + Q_INVOKABLE void translate(double degreesLatitude, double degreesLongitude); + Q_INVOKABLE QGeoPath translated(double degreesLatitude, double degreesLongitude) const; + Q_INVOKABLE double length(qsizetype indexFrom = 0, qsizetype indexTo = -1) const; + Q_INVOKABLE qsizetype size() const; + Q_INVOKABLE void addCoordinate(const QGeoCoordinate &coordinate); + Q_INVOKABLE void insertCoordinate(qsizetype index, const QGeoCoordinate &coordinate); + Q_INVOKABLE void replaceCoordinate(qsizetype index, const QGeoCoordinate &coordinate); + Q_INVOKABLE QGeoCoordinate coordinateAt(qsizetype index) const; + Q_INVOKABLE bool containsCoordinate(const QGeoCoordinate &coordinate) const; + Q_INVOKABLE void removeCoordinate(const QGeoCoordinate &coordinate); + Q_INVOKABLE void removeCoordinate(qsizetype index); + + Q_INVOKABLE QString toString() const; + +private: + inline QGeoPathPrivate *d_func(); + inline const QGeoPathPrivate *d_func() const; + +#ifndef QT_NO_DATASTREAM + friend QDataStream &operator<<(QDataStream &stream, const QGeoPath &path) + { + return stream << static_cast(path); + } + friend QDataStream &operator>>(QDataStream &stream, QGeoPath &path) + { + return stream >> static_cast(path); + } +#endif +}; + +Q_DECLARE_TYPEINFO(QGeoPath, Q_RELOCATABLE_TYPE); + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN(QGeoPath, Q_POSITIONING_EXPORT) + +#endif // QGEOPATH_H diff --git a/src/positioning/qgeopath_p.h b/src/positioning/qgeopath_p.h new file mode 100644 index 0000000..a492a9f --- /dev/null +++ b/src/positioning/qgeopath_p.h @@ -0,0 +1,224 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPATH_P_H +#define QGEOPATH_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include "qgeoshape_p.h" +#include "qgeocoordinate.h" +#include "qlocationutils_p.h" +#include +#include + +QT_BEGIN_NAMESPACE + +inline static void computeBBox(const QList &m_path, QList &m_deltaXs, + double &m_minX, double &m_maxX, double &m_minLati, double &m_maxLati, + QGeoRectangle &m_bbox) +{ + if (m_path.isEmpty()) { + m_deltaXs.clear(); + m_minX = qInf(); + m_maxX = -qInf(); + m_minLati = qInf(); + m_maxLati = -qInf(); + m_bbox = QGeoRectangle(); + return; + } + + m_minLati = m_maxLati = m_path.at(0).latitude(); + qsizetype minId = 0; + qsizetype maxId = 0; + m_deltaXs.resize(m_path.size()); + m_deltaXs[0] = m_minX = m_maxX = 0.0; + + for (qsizetype i = 1; i < m_path.size(); i++) { + const QGeoCoordinate &geoFrom = m_path.at(i-1); + const QGeoCoordinate &geoTo = m_path.at(i); + double longiFrom = geoFrom.longitude(); + double longiTo = geoTo.longitude(); + double deltaLongi = longiTo - longiFrom; + if (qAbs(deltaLongi) > 180.0) { + if (longiTo > 0.0) + longiTo -= 360.0; + else + longiTo += 360.0; + deltaLongi = longiTo - longiFrom; + } + m_deltaXs[i] = m_deltaXs[i-1] + deltaLongi; + if (m_deltaXs[i] < m_minX) { + m_minX = m_deltaXs[i]; + minId = i; + } + if (m_deltaXs[i] > m_maxX) { + m_maxX = m_deltaXs[i]; + maxId = i; + } + if (geoTo.latitude() > m_maxLati) + m_maxLati = geoTo.latitude(); + if (geoTo.latitude() < m_minLati) + m_minLati = geoTo.latitude(); + } + + m_bbox = QGeoRectangle(QGeoCoordinate(m_maxLati, m_path.at(minId).longitude()), + QGeoCoordinate(m_minLati, m_path.at(maxId).longitude())); +} + +inline static void updateBBox(const QList &m_path, QList &m_deltaXs, + double &m_minX, double &m_maxX, double &m_minLati, double &m_maxLati, + QGeoRectangle &m_bbox) +{ + if (m_path.isEmpty()) { + m_deltaXs.clear(); + m_minX = qInf(); + m_maxX = -qInf(); + m_minLati = qInf(); + m_maxLati = -qInf(); + m_bbox = QGeoRectangle(); + return; + } else if (m_path.size() == 1) { // was 0 now is 1 + m_deltaXs.resize(1); + m_deltaXs[0] = m_minX = m_maxX = 0.0; + m_minLati = m_maxLati = m_path.at(0).latitude(); + m_bbox = QGeoRectangle(QGeoCoordinate(m_maxLati, m_path.at(0).longitude()), + QGeoCoordinate(m_minLati, m_path.at(0).longitude())); + return; + } else if ( m_path.size() != m_deltaXs.size() + 1 ) { // this case should not happen + computeBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati, m_bbox); // something went wrong + return; + } + + const QGeoCoordinate &geoFrom = m_path.at(m_path.size()-2); + const QGeoCoordinate &geoTo = m_path.last(); + double longiFrom = geoFrom.longitude(); + double longiTo = geoTo.longitude(); + double deltaLongi = longiTo - longiFrom; + if (qAbs(deltaLongi) > 180.0) { + if (longiTo > 0.0) + longiTo -= 360.0; + else + longiTo += 360.0; + deltaLongi = longiTo - longiFrom; + } + + m_deltaXs.push_back(m_deltaXs.last() + deltaLongi); + double currentMinLongi = m_bbox.topLeft().longitude(); + double currentMaxLongi = m_bbox.bottomRight().longitude(); + if (m_deltaXs.last() < m_minX) { + m_minX = m_deltaXs.last(); + currentMinLongi = geoTo.longitude(); + } + if (m_deltaXs.last() > m_maxX) { + m_maxX = m_deltaXs.last(); + currentMaxLongi = geoTo.longitude(); + } + if (geoTo.latitude() > m_maxLati) + m_maxLati = geoTo.latitude(); + if (geoTo.latitude() < m_minLati) + m_minLati = geoTo.latitude(); + m_bbox = QGeoRectangle(QGeoCoordinate(m_maxLati, currentMinLongi), + QGeoCoordinate(m_minLati, currentMaxLongi)); +} + +// Lazy by default. Eager, within the module, used only in MapItems/MapObjectsQSG +class Q_POSITIONING_PRIVATE_EXPORT QGeoPathPrivate : public QGeoShapePrivate +{ +public: + QGeoPathPrivate(); + QGeoPathPrivate(const QList &path, const qreal width = 0.0); + ~QGeoPathPrivate(); + +// QGeoShape API + virtual QGeoShapePrivate *clone() const override; + virtual bool isValid() const override; + virtual bool isEmpty() const override; + virtual QGeoCoordinate center() const override; + virtual bool operator==(const QGeoShapePrivate &other) const override; + virtual bool contains(const QGeoCoordinate &coordinate) const override; + virtual QGeoRectangle boundingGeoRectangle() const override; + size_t hash(size_t seed) const override; + +// QGeoPathPrivate API + virtual const QList &path() const; + virtual bool lineContains(const QGeoCoordinate &coordinate) const; + virtual qreal width() const; + virtual double length(qsizetype indexFrom, qsizetype indexTo) const; + virtual qsizetype size() const; + virtual QGeoCoordinate coordinateAt(qsizetype index) const; + virtual bool containsCoordinate(const QGeoCoordinate &coordinate) const; + + virtual void setWidth(const qreal &width); + virtual void translate(double degreesLatitude, double degreesLongitude); + virtual void setPath(const QList &path); + virtual void clearPath(); + virtual void addCoordinate(const QGeoCoordinate &coordinate); + virtual void insertCoordinate(qsizetype index, const QGeoCoordinate &coordinate); + virtual void replaceCoordinate(qsizetype index, const QGeoCoordinate &coordinate); + virtual void removeCoordinate(const QGeoCoordinate &coordinate); + virtual void removeCoordinate(qsizetype index); + virtual void computeBoundingBox(); + virtual void markDirty(); + +// data members + QList m_path; + qreal m_width = 0; + QGeoRectangle m_bbox; // cached + double m_leftBoundWrapped; // cached + bool m_bboxDirty = false; +}; + +class Q_POSITIONING_PRIVATE_EXPORT QGeoPathPrivateEager : public QGeoPathPrivate +{ +public: + QGeoPathPrivateEager(); + QGeoPathPrivateEager(const QList &path, const qreal width = 0.0); + ~QGeoPathPrivateEager(); + +// QGeoShapePrivate API + virtual QGeoShapePrivate *clone() const override; + virtual void translate(double degreesLatitude, double degreesLongitude) override; + +// QGeoShapePrivate API + virtual void markDirty() override; + virtual void addCoordinate(const QGeoCoordinate &coordinate) override; + virtual void computeBoundingBox() override; + +// *Eager API + void updateBoundingBox(); + +// data members + QList m_deltaXs; // longitude deltas from m_path[0] + double m_minX = 0; // minimum value inside deltaXs + double m_maxX = 0; // maximum value inside deltaXs + double m_minLati = 0; // minimum latitude. paths do not wrap around through the poles + double m_maxLati = 0; // minimum latitude. paths do not wrap around through the poles +}; + +// This is a mean of creating a QGeoPathPrivateEager and injecting it into QGeoPaths via operator= +class Q_POSITIONING_PRIVATE_EXPORT QGeoPathEager : public QGeoPath +{ + Q_GADGET +public: + + QGeoPathEager(); + QGeoPathEager(const QList &path, const qreal &width = 0.0); + QGeoPathEager(const QGeoPath &other); + QGeoPathEager(const QGeoShape &other); + ~QGeoPathEager(); +}; + +QT_END_NAMESPACE + +#endif // QGEOPATH_P_H diff --git a/src/positioning/qgeopolygon.cpp b/src/positioning/qgeopolygon.cpp new file mode 100644 index 0000000..cbc3f2d --- /dev/null +++ b/src/positioning/qgeopolygon.cpp @@ -0,0 +1,667 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeopolygon.h" +#include "qgeopolygon_p.h" +#include "qgeopath_p.h" +#include "qgeocircle.h" + +#include "qgeocoordinate.h" +#include "qnumeric.h" +#include "qlocationutils_p.h" +#include "qwebmercator_p.h" + +#include "qdoublevector2d_p.h" +#include "qdoublevector3d_p.h" +#include "qwebmercator_p.h" + +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN(QGeoPolygon) + +constexpr int kMaxInt = std::numeric_limits::max(); +constexpr auto kTooManyHoles = u"The polygon has more holes than fit into an int. " + "This can cause errors while querying holes from QML"; +constexpr auto kTooManyElements = u"The polygon has more elements than fit into an int. " + "This can cause errors while querying elements from QML"; + +/*! + \class QGeoPolygon + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \since 5.10 + + \brief The QGeoPolygon class defines a geographic polygon. + + The polygon is defined by an ordered list of \l QGeoCoordinate objects + representing its perimeter. + + Each two adjacent elements in this list are intended to be connected + together by the shortest line segment of constant bearing passing + through both elements. + This type of connection can cross the date line in the longitudinal direction, + but never crosses the poles. + + This is relevant for the calculation of the bounding box returned by + \l QGeoShape::boundingGeoRectangle() for this shape, which will have the latitude of + the top left corner set to the maximum latitude in the path point set. + Similarly, the latitude of the bottom right corner will be the minimum latitude + in the path point set. + + This class is a \l Q_GADGET. + It can be \l{Cpp_value_integration_positioning}{directly used from C++ and QML}. +*/ + +/* + \property QGeoPolygon::path + \brief This property holds the list of coordinates for the geo polygon. + + The polygon is both invalid and empty if it contains no coordinate. + + A default constructed QGeoPolygon is therefore invalid. +*/ + +inline QGeoPolygonPrivate *QGeoPolygon::d_func() +{ + return static_cast(d_ptr.data()); +} + +inline const QGeoPolygonPrivate *QGeoPolygon::d_func() const +{ + return static_cast(d_ptr.constData()); +} + +/*! + Constructs a new, empty geo polygon. +*/ +QGeoPolygon::QGeoPolygon() +: QGeoShape(new QGeoPolygonPrivate()) +{ +} + +/*! + Constructs a new geo polygon from the coordinates specified + in \a path. +*/ +QGeoPolygon::QGeoPolygon(const QList &path) +: QGeoShape(new QGeoPolygonPrivate(path)) +{ +} + +/*! + Constructs a new geo polygon from the contents of \a other. +*/ +QGeoPolygon::QGeoPolygon(const QGeoPolygon &other) +: QGeoShape(other) +{ +} + +static void calculatePeripheralPoints(QList &path, + const QGeoCircle &circle, + int steps) +{ + const QGeoCoordinate ¢er = circle.center(); + const qreal distance = circle.radius(); + // Calculate points based on great-circle distance + // Calculation is the same as GeoCoordinate's atDistanceAndAzimuth function + // but tweaked here for computing multiple points + + // pre-calculations + steps = qMax(steps, 3); + qreal centerLon = center.longitude(); + qreal latRad = QLocationUtils::radians(center.latitude()); + qreal lonRad = QLocationUtils::radians(centerLon); + qreal cosLatRad = std::cos(latRad); + qreal sinLatRad = std::sin(latRad); + qreal ratio = (distance / QLocationUtils::earthMeanRadius()); + qreal cosRatio = std::cos(ratio); + qreal sinRatio = std::sin(ratio); + qreal sinLatRad_x_cosRatio = sinLatRad * cosRatio; + qreal cosLatRad_x_sinRatio = cosLatRad * sinRatio; + for (int i = 0; i < steps; ++i) { + qreal azimuthRad = 2 * M_PI * i / steps; + qreal resultLatRad = std::asin(sinLatRad_x_cosRatio + + cosLatRad_x_sinRatio * std::cos(azimuthRad)); + qreal resultLonRad = lonRad + std::atan2(std::sin(azimuthRad) * cosLatRad_x_sinRatio, + cosRatio - sinLatRad * std::sin(resultLatRad)); + qreal lat2 = QLocationUtils::degrees(resultLatRad); + qreal lon2 = QLocationUtils::wrapLong(QLocationUtils::degrees(resultLonRad)); + + path << QGeoCoordinate(lat2, lon2, center.altitude()); + } +} + +/*! + Constructs a new geo polygon from the contents of \a other. +*/ +QGeoPolygon::QGeoPolygon(const QGeoShape &other) +: QGeoShape(other) +{ + if (type() != QGeoShape::PolygonType) { + QGeoPolygonPrivate *poly = new QGeoPolygonPrivate(); + if (type() == QGeoShape::CircleType) { + const QGeoCircle &circle = static_cast(other); + QList perimeter; + calculatePeripheralPoints(perimeter, circle, 128); + poly->setPath(perimeter); + } else if (type() == QGeoShape::RectangleType) { + const QGeoRectangle &rect = static_cast(other); + QList perimeter; + perimeter << rect.topLeft() << rect.topRight() + << rect.bottomRight() << rect.bottomLeft(); + poly->setPath(perimeter); + } + d_ptr = poly; + } +} + +/*! + Destroys this polygon. +*/ +QGeoPolygon::~QGeoPolygon() {} + +/*! + Assigns \a other to this geo polygon and returns a reference to this geo polygon. +*/ +QGeoPolygon &QGeoPolygon::operator=(const QGeoPolygon &other) +{ + QGeoShape::operator=(other); + return *this; +} + +/*! + Sets the perimeter of the polygon based on a list of coordinates \a path. + + \since QtPositioning 5.12 +*/ +void QGeoPolygon::setPerimeter(const QList &path) +{ + Q_D(QGeoPolygon); + return d->setPath(path); +} + +/*! + Returns all the elements of the polygon's perimeter. + + \since QtPositioning 5.12 +*/ +const QList &QGeoPolygon::perimeter() const +{ + Q_D(const QGeoPolygon); + return d->path(); +} + +/*! + Translates this geo polygon by \a degreesLatitude northwards and \a degreesLongitude eastwards. + + Negative values of \a degreesLatitude and \a degreesLongitude correspond to + southward and westward translation respectively. +*/ +void QGeoPolygon::translate(double degreesLatitude, double degreesLongitude) +{ + Q_D(QGeoPolygon); + d->translate(degreesLatitude, degreesLongitude); +} + +/*! + Returns a copy of this geo polygon translated by \a degreesLatitude northwards and + \a degreesLongitude eastwards. + + Negative values of \a degreesLatitude and \a degreesLongitude correspond to + southward and westward translation respectively. + + \sa translate() +*/ +QGeoPolygon QGeoPolygon::translated(double degreesLatitude, double degreesLongitude) const +{ + QGeoPolygon result(*this); + result.translate(degreesLatitude, degreesLongitude); + return result; +} + +/*! + Returns the length of the polygon's perimeter, in meters, from the element \a indexFrom to the element \a indexTo. + The length is intended to be the sum of the shortest distances for each pair of adjacent points. +*/ +double QGeoPolygon::length(qsizetype indexFrom, qsizetype indexTo) const +{ + Q_D(const QGeoPolygon); + return d->length(indexFrom, indexTo); +} + +/*! + Returns the number of elements in the polygon. + + \since 5.10 +*/ +qsizetype QGeoPolygon::size() const +{ + Q_D(const QGeoPolygon); + const qsizetype result = d->size(); + if (result > kMaxInt) + qWarning() << kTooManyElements; + return result; +} + +/*! + Appends \a coordinate to the polygon. +*/ +void QGeoPolygon::addCoordinate(const QGeoCoordinate &coordinate) +{ + Q_D(QGeoPolygon); + d->addCoordinate(coordinate); + if (d->size() > kMaxInt) + qWarning() << kTooManyElements; +} + +/*! + Inserts \a coordinate at the specified \a index. +*/ +void QGeoPolygon::insertCoordinate(qsizetype index, const QGeoCoordinate &coordinate) +{ + Q_D(QGeoPolygon); + d->insertCoordinate(index, coordinate); +} + +/*! + Replaces the path element at the specified \a index with \a coordinate. +*/ +void QGeoPolygon::replaceCoordinate(qsizetype index, const QGeoCoordinate &coordinate) +{ + Q_D(QGeoPolygon); + d->replaceCoordinate(index, coordinate); +} + +/*! + Returns the coordinate at \a index . +*/ +QGeoCoordinate QGeoPolygon::coordinateAt(qsizetype index) const +{ + Q_D(const QGeoPolygon); + return d->coordinateAt(index); +} + +/*! + Returns true if the polygon's perimeter contains \a coordinate as one of the elements. +*/ +bool QGeoPolygon::containsCoordinate(const QGeoCoordinate &coordinate) const +{ + Q_D(const QGeoPolygon); + return d->containsCoordinate(coordinate); +} + +/*! + Removes the last occurrence of \a coordinate from the polygon. +*/ +void QGeoPolygon::removeCoordinate(const QGeoCoordinate &coordinate) +{ + Q_D(QGeoPolygon); + d->removeCoordinate(coordinate); +} + +/*! + Removes element at position \a index from the polygon. +*/ +void QGeoPolygon::removeCoordinate(qsizetype index) +{ + Q_D(QGeoPolygon); + d->removeCoordinate(index); +} + +/*! + Returns the geo polygon properties as a string. +*/ +QString QGeoPolygon::toString() const +{ + if (type() != QGeoShape::PolygonType) { + qWarning("Not a polygon"); + return QStringLiteral("QGeoPolygon(not a polygon)"); + } + + QString pathString; + for (const auto &p : perimeter()) + pathString += p.toString() + QLatin1Char(','); + + return QStringLiteral("QGeoPolygon([ %1 ])").arg(pathString); +} + +/*! + Sets the \a holePath for a hole inside the polygon. The hole is a + QVariant containing a QList. + + \since 5.12 +*/ +void QGeoPolygon::addHole(const QVariant &holePath) +{ + QList qgcHolePath; + if (holePath.canConvert()) { + const QVariantList qvlHolePath = holePath.toList(); + for (const QVariant &vertex : qvlHolePath) { + if (vertex.canConvert()) + qgcHolePath << vertex.value(); + } + } + //ToDo: add QGeoShape support + addHole(qgcHolePath); +} + +/*! + Overloaded method. Sets the \a holePath for a hole inside the polygon. The hole is a QList. + + \since 5.12 +*/ +void QGeoPolygon::addHole(const QList &holePath) +{ + Q_D(QGeoPolygon); + d->addHole(holePath); + if (d->holesCount() > kMaxInt) + qDebug() << kTooManyHoles; +} + +/*! + Returns a QVariant containing a QList + which represents the hole at \a index. + + \since 5.12 +*/ +const QVariantList QGeoPolygon::hole(qsizetype index) const +{ + Q_D(const QGeoPolygon); + QVariantList holeCoordinates; + for (const QGeoCoordinate &coords: d->holePath(index)) + holeCoordinates << QVariant::fromValue(coords); + return holeCoordinates; +} + +/*! + Returns a QList which represents the hole at \a index. + + \since 5.12 +*/ +const QList QGeoPolygon::holePath(qsizetype index) const +{ + Q_D(const QGeoPolygon); + return d->holePath(index); +} + +/*! + Removes element at position \a index from the list of holes. + + \since 5.12 +*/ +void QGeoPolygon::removeHole(qsizetype index) +{ + Q_D(QGeoPolygon); + return d->removeHole(index); +} + +/*! + Returns the number of holes. + + \since 5.12 +*/ +qsizetype QGeoPolygon::holesCount() const +{ + Q_D(const QGeoPolygon); + const qsizetype result = d->holesCount(); + if (result > kMaxInt) + qWarning() << kTooManyHoles; + return result; +} + +/******************************************************************************* + * + * QGeoPathPrivate & friends + * +*******************************************************************************/ + +QGeoPolygonPrivate::QGeoPolygonPrivate() +: QGeoPathPrivate() +{ + type = QGeoShape::PolygonType; +} + +QGeoPolygonPrivate::QGeoPolygonPrivate(const QList &path) +: QGeoPathPrivate(path) +{ + type = QGeoShape::PolygonType; +} + +QGeoPolygonPrivate::~QGeoPolygonPrivate() {} + +QGeoShapePrivate *QGeoPolygonPrivate::clone() const +{ + return new QGeoPolygonPrivate(*this); +} + +bool QGeoPolygonPrivate::isValid() const +{ + return path().size() > 2; +} + +bool QGeoPolygonPrivate::contains(const QGeoCoordinate &coordinate) const +{ + return polygonContains(coordinate); +} + +inline static void translatePoly( QList &m_path, + QList> &m_holesList, + QGeoRectangle &m_bbox, + double degreesLatitude, + double degreesLongitude, + double m_maxLati, + double m_minLati) +{ + if (degreesLatitude > 0.0) + degreesLatitude = qMin(degreesLatitude, 90.0 - m_maxLati); + else + degreesLatitude = qMax(degreesLatitude, -90.0 - m_minLati); + for (QGeoCoordinate &p: m_path) { + p.setLatitude(p.latitude() + degreesLatitude); + p.setLongitude(QLocationUtils::wrapLong(p.longitude() + degreesLongitude)); + } + if (!m_holesList.isEmpty()){ + for (QList &hole: m_holesList){ + for (QGeoCoordinate &holeVertex: hole){ + holeVertex.setLatitude(holeVertex.latitude() + degreesLatitude); + holeVertex.setLongitude(QLocationUtils::wrapLong(holeVertex.longitude() + degreesLongitude)); + } + } + } + m_bbox.translate(degreesLatitude, degreesLongitude); +} + +void QGeoPolygonPrivate::translate(double degreesLatitude, double degreesLongitude) +{ + // Need min/maxLati, so update bbox + QList m_deltaXs; + double m_minX, m_maxX, m_minLati, m_maxLati; + m_bboxDirty = false; // Updated in translatePoly + computeBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati, m_bbox); + translatePoly(m_path, m_holesList, m_bbox, degreesLatitude, degreesLongitude, m_maxLati, m_minLati); + m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x(); + m_clipperDirty = true; +} + +bool QGeoPolygonPrivate::operator==(const QGeoShapePrivate &other) const +{ + if (!QGeoShapePrivate::operator==(other)) // checks type + return false; + + const QGeoPolygonPrivate &otherPath = static_cast(other); + if (m_path.size() != otherPath.m_path.size() + || m_holesList.size() != otherPath.m_holesList.size()) + return false; + return m_path == otherPath.m_path && m_holesList == otherPath.m_holesList; +} + +size_t QGeoPolygonPrivate::hash(size_t seed) const +{ + const size_t pointsHash = qHashRange(m_path.cbegin(), m_path.cend(), seed); + const size_t holesHash = qHashRange(m_holesList.cbegin(), m_holesList.cend(), seed); + return qHashMulti(seed, pointsHash, holesHash); +} + +void QGeoPolygonPrivate::addHole(const QList &holePath) +{ + for (const QGeoCoordinate &holeVertex: holePath) + if (!holeVertex.isValid()) + return; + + m_holesList << holePath; + // ToDo: mark clipper dirty when hole caching gets added +} + +const QList QGeoPolygonPrivate::holePath(qsizetype index) const +{ + return m_holesList.at(index); +} + +void QGeoPolygonPrivate::removeHole(qsizetype index) +{ + if (index < 0 || index >= m_holesList.size()) + return; + + m_holesList.removeAt(index); + // ToDo: mark clipper dirty when hole caching gets added +} + +qsizetype QGeoPolygonPrivate::holesCount() const +{ + return m_holesList.size(); +} + +bool QGeoPolygonPrivate::polygonContains(const QGeoCoordinate &coordinate) const +{ + if (m_clipperDirty) + const_cast(this)->updateClipperPath(); // this one updates bbox too if needed + + QDoubleVector2D coord = QWebMercator::coordToMercator(coordinate); + + if (coord.x() < m_leftBoundWrapped) + coord.setX(coord.x() + 1.0); + + if (!m_clipperWrapper.pointInPolygon(coord)) + return false; + + // else iterates the holes List checking whether the point is contained inside the holes + for (const QList &holePath : std::as_const(m_holesList)) { + // ToDo: cache these + QGeoPolygon holePolygon; + holePolygon.setPerimeter(holePath); + if (holePolygon.contains(coordinate)) + return false; + } + return true; +} + +void QGeoPolygonPrivate::markDirty() +{ + m_bboxDirty = m_clipperDirty = true; +} + +void QGeoPolygonPrivate::updateClipperPath() +{ + if (m_bboxDirty) + computeBoundingBox(); + m_clipperDirty = false; + + QList preservedPath; + for (const QGeoCoordinate &c : m_path) { + QDoubleVector2D crd = QWebMercator::coordToMercator(c); + if (crd.x() < m_leftBoundWrapped) + crd.setX(crd.x() + 1.0); + preservedPath << crd; + } + m_clipperWrapper.setPolygon(preservedPath); +} + +QGeoPolygonPrivateEager::QGeoPolygonPrivateEager() : QGeoPolygonPrivate() +{ + m_bboxDirty = false; // never dirty on the eager version +} + +QGeoPolygonPrivateEager::QGeoPolygonPrivateEager(const QList &path) : QGeoPolygonPrivate(path) +{ + m_bboxDirty = false; // never dirty on the eager version +} + +QGeoPolygonPrivateEager::~QGeoPolygonPrivateEager() +{ + +} + +QGeoShapePrivate *QGeoPolygonPrivateEager::clone() const +{ + return new QGeoPolygonPrivate(*this); +} + +void QGeoPolygonPrivateEager::translate(double degreesLatitude, double degreesLongitude) +{ + translatePoly(m_path, m_holesList, m_bbox, degreesLatitude, degreesLongitude, m_maxLati, m_minLati); + m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x(); + m_clipperDirty = true; +} + +void QGeoPolygonPrivateEager::markDirty() +{ + m_clipperDirty = true; + computeBoundingBox(); +} + +void QGeoPolygonPrivateEager::addCoordinate(const QGeoCoordinate &coordinate) +{ + if (!coordinate.isValid()) + return; + m_path.append(coordinate); + m_clipperDirty = true; + updateBoundingBox(); // do not markDirty as it uses computeBoundingBox instead +} + +void QGeoPolygonPrivateEager::computeBoundingBox() +{ + computeBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati, m_bbox); + m_leftBoundWrapped = QWebMercator::coordToMercator(m_bbox.topLeft()).x(); +} + +void QGeoPolygonPrivateEager::updateBoundingBox() +{ + updateBBox(m_path, m_deltaXs, m_minX, m_maxX, m_minLati, m_maxLati, m_bbox); +} + +QGeoPolygonEager::QGeoPolygonEager() : QGeoPolygon() +{ + d_ptr = new QGeoPolygonPrivateEager; +} + +QGeoPolygonEager::QGeoPolygonEager(const QList &path) : QGeoPolygon() +{ + d_ptr = new QGeoPolygonPrivateEager(path); +} + +QGeoPolygonEager::QGeoPolygonEager(const QGeoPolygon &other) : QGeoPolygon() +{ + // without being able to dynamic_cast the d_ptr, only way to be sure is to reconstruct a new QGeoPolygonPrivateEager + d_ptr = new QGeoPolygonPrivateEager; + setPerimeter(other.perimeter()); + for (qsizetype i = 0; i < other.holesCount(); i++) + addHole(other.holePath(i)); +} + +QGeoPolygonEager::QGeoPolygonEager(const QGeoShape &other) : QGeoPolygon() +{ + if (other.type() == QGeoShape::PolygonType) + *this = QGeoPolygonEager(QGeoPolygon(other)); + else + d_ptr = new QGeoPolygonPrivateEager; +} + +QGeoPolygonEager::~QGeoPolygonEager() +{ + +} + +QT_END_NAMESPACE + +#include "moc_qgeopolygon_p.cpp" +#include "moc_qgeopolygon.cpp" diff --git a/src/positioning/qgeopolygon.h b/src/positioning/qgeopolygon.h new file mode 100644 index 0000000..0b483b9 --- /dev/null +++ b/src/positioning/qgeopolygon.h @@ -0,0 +1,75 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOLYGON_H +#define QGEOPOLYGON_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoCoordinate; +class QGeoPolygonPrivate; + +class Q_POSITIONING_EXPORT QGeoPolygon : public QGeoShape +{ + Q_GADGET + Q_PROPERTY(QList perimeter READ perimeter WRITE setPerimeter REVISION(5, 12)) + +public: + QGeoPolygon(); + QGeoPolygon(const QList &path); + QGeoPolygon(const QGeoPolygon &other); + QGeoPolygon(const QGeoShape &other); + + ~QGeoPolygon(); + + QGeoPolygon &operator=(const QGeoPolygon &other); + + void setPerimeter(const QList &path); + const QList &perimeter() const; + + Q_INVOKABLE void addHole(const QVariant &holePath); + void addHole(const QList &holePath); + Q_INVOKABLE const QVariantList hole(qsizetype index) const; + const QList holePath(qsizetype index) const; + Q_INVOKABLE void removeHole(qsizetype index); + Q_INVOKABLE qsizetype holesCount() const; + Q_INVOKABLE void translate(double degreesLatitude, double degreesLongitude); + Q_INVOKABLE QGeoPolygon translated(double degreesLatitude, double degreesLongitude) const; + Q_INVOKABLE double length(qsizetype indexFrom = 0, qsizetype indexTo = -1) const; + Q_INVOKABLE qsizetype size() const; + Q_INVOKABLE void addCoordinate(const QGeoCoordinate &coordinate); + Q_INVOKABLE void insertCoordinate(qsizetype index, const QGeoCoordinate &coordinate); + Q_INVOKABLE void replaceCoordinate(qsizetype index, const QGeoCoordinate &coordinate); + Q_INVOKABLE QGeoCoordinate coordinateAt(qsizetype index) const; + Q_INVOKABLE bool containsCoordinate(const QGeoCoordinate &coordinate) const; + Q_INVOKABLE void removeCoordinate(const QGeoCoordinate &coordinate); + Q_INVOKABLE void removeCoordinate(qsizetype index); + + Q_INVOKABLE QString toString() const; + +private: + inline QGeoPolygonPrivate *d_func(); + inline const QGeoPolygonPrivate *d_func() const; + +#ifndef QT_NO_DATASTREAM + friend QDataStream &operator<<(QDataStream &stream, const QGeoPolygon &polygon) + { + return stream << static_cast(polygon); + } + friend QDataStream &operator>>(QDataStream &stream, QGeoPolygon &polygon) + { + return stream >> static_cast(polygon); + } +#endif +}; + +Q_DECLARE_TYPEINFO(QGeoPolygon, Q_RELOCATABLE_TYPE); + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN(QGeoPolygon, Q_POSITIONING_EXPORT) + +#endif // QGEOPOLYGON_H diff --git a/src/positioning/qgeopolygon_p.h b/src/positioning/qgeopolygon_p.h new file mode 100644 index 0000000..c99d318 --- /dev/null +++ b/src/positioning/qgeopolygon_p.h @@ -0,0 +1,101 @@ +// Copyright (C) 2018 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOLYGON_P_H +#define QGEOPOLYGON_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONING_PRIVATE_EXPORT QGeoPolygonPrivate : public QGeoPathPrivate +{ +public: + QGeoPolygonPrivate(); + QGeoPolygonPrivate(const QList &path); + ~QGeoPolygonPrivate(); + +// QGeoShape API + virtual QGeoShapePrivate *clone() const override; + virtual bool isValid() const override; + virtual bool contains(const QGeoCoordinate &coordinate) const override; + virtual void translate(double degreesLatitude, double degreesLongitude) override; + virtual bool operator==(const QGeoShapePrivate &other) const override; + size_t hash(size_t seed) const override; + +// QGeoPath API + virtual void markDirty() override; + +// QGeoPolygonPrivate API + qsizetype holesCount() const; + bool polygonContains(const QGeoCoordinate &coordinate) const; + const QList holePath(qsizetype index) const; + + virtual void addHole(const QList &holePath); + virtual void removeHole(qsizetype index); + virtual void updateClipperPath(); + +// data members + bool m_clipperDirty = true; + QList> m_holesList; + QClipperUtils m_clipperWrapper; +}; + +class Q_POSITIONING_PRIVATE_EXPORT QGeoPolygonPrivateEager : public QGeoPolygonPrivate +{ +public: + QGeoPolygonPrivateEager(); + QGeoPolygonPrivateEager(const QList &path); + ~QGeoPolygonPrivateEager(); + +// QGeoShape API + virtual QGeoShapePrivate *clone() const override; + virtual void translate(double degreesLatitude, double degreesLongitude) override; + +// QGeoPath API + virtual void markDirty() override; + virtual void addCoordinate(const QGeoCoordinate &coordinate) override; + virtual void computeBoundingBox() override; + +// QGeoPolygonPrivate API + +// *Eager API + void updateBoundingBox(); + +// data members + QList m_deltaXs; // longitude deltas from m_path[0] + double m_minX = 0; // minimum value inside deltaXs + double m_maxX = 0; // maximum value inside deltaXs + double m_minLati = 0; // minimum latitude. paths do not wrap around through the poles + double m_maxLati = 0; // minimum latitude. paths do not wrap around through the poles +}; + +// This is a mean of creating a QGeoPolygonPrivateEager and injecting it into QGeoPolygons via operator= +class Q_POSITIONING_PRIVATE_EXPORT QGeoPolygonEager : public QGeoPolygon +{ + Q_GADGET +public: + + QGeoPolygonEager(); + QGeoPolygonEager(const QList &path); + QGeoPolygonEager(const QGeoPolygon &other); + QGeoPolygonEager(const QGeoShape &other); + ~QGeoPolygonEager(); +}; + +QT_END_NAMESPACE + +#endif // QGEOPOLYGON_P_H diff --git a/src/positioning/qgeopositioninfo.cpp b/src/positioning/qgeopositioninfo.cpp new file mode 100644 index 0000000..a1f6ec0 --- /dev/null +++ b/src/positioning/qgeopositioninfo.cpp @@ -0,0 +1,418 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#include "qgeopositioninfo.h" +#include "private/qgeopositioninfo_p.h" +#include +#include +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN(QGeoPositionInfo) + +/*! + \class QGeoPositionInfo + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \ingroup shared + \since 5.2 + + \brief The QGeoPositionInfo class contains information gathered on a global position, direction and velocity at a particular point in time. + + A QGeoPositionInfo contains, at a minimum, a geographical coordinate and + a timestamp. It may also have heading and speed measurements as well as + estimates of the accuracy of the provided data. + + \sa QGeoPositionInfoSource +*/ + +/*! + \enum QGeoPositionInfo::Attribute + Defines the attributes for positional information. + + \value Direction The bearing measured in degrees clockwise from true north to the direction of travel. + \value GroundSpeed The ground speed, in meters/sec. + \value VerticalSpeed The vertical speed, in meters/sec. + \value MagneticVariation The angle between the horizontal component of the magnetic field and true north, in degrees. Also known as magnetic declination. A positive value indicates a clockwise direction from true north and a negative value indicates a counter-clockwise direction. + \value HorizontalAccuracy The accuracy of the provided latitude-longitude value, in meters. + \value VerticalAccuracy The accuracy of the provided altitude value, in meters. + \value DirectionAccuracy The accuracy of the provided bearing, in degrees. + This attribute is available only on Android (API level 26 or above) and + macOS/iOS. See corresponding \l {Android getBearingAccuracyDegrees} + {Android} and \l {iOS courseAccuracy}{Apple} documentation for more details. + + NMEA protocol also suggests another type of accuracy - PositionAccuracy, + which is a 3D accuracy value. Qt does not provide a separate attribute for + it. If you need this value, you can calculate it based on the following + formula: + + \c {PositionAccuracy} \sup 2 \c {= HorizontalAccuracy} \sup 2 \c { + + VerticalAccuracy} \sup 2 +*/ + +/*! + Creates an invalid QGeoPositionInfo object. + + \sa isValid() +*/ +QGeoPositionInfo::QGeoPositionInfo() + : d(new QGeoPositionInfoPrivate) +{ +} + +/*! + Creates a QGeoPositionInfo for the given \a coordinate and \a timestamp. +*/ +QGeoPositionInfo::QGeoPositionInfo(const QGeoCoordinate &coordinate, const QDateTime ×tamp) + : d(new QGeoPositionInfoPrivate) +{ + d->timestamp = timestamp; + d->coord = coordinate; +} + +/*! + Creates a QGeoPositionInfo with the values of \a other. +*/ +QGeoPositionInfo::QGeoPositionInfo(const QGeoPositionInfo &other) + : d(other.d) +{ +} + +/*! + \fn QGeoPositionInfo::QGeoPositionInfo(QGeoPositionInfo &&other) noexcept + \since 6.2 + + Creates a QGeoPositionInfo object by moving from \a other. + + Note that a moved-from QGeoPositionInfo can only be destroyed or + assigned to. The effect of calling other functions than the destructor + or one of the assignment operators is undefined. +*/ + +QGeoPositionInfo::QGeoPositionInfo(QGeoPositionInfoPrivate &dd) : d(&dd) +{ +} + +/*! + Destroys a QGeoPositionInfo object. +*/ +QGeoPositionInfo::~QGeoPositionInfo() +{ +} + +QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QGeoPositionInfoPrivate) + +/*! + Assigns the values from \a other to this QGeoPositionInfo. +*/ +QGeoPositionInfo &QGeoPositionInfo::operator=(const QGeoPositionInfo & other) +{ + if (this == &other) + return *this; + + d = other.d; + return *this; +} + +/*! + \fn QGeoPositionInfo &QGeoPositionInfo::operator=(QGeoPositionInfo &&other) noexcept + \since 6.2 + + Move-assigns the values from \a other to this object. + + Note that a moved-from QGeoPositionInfo can only be destroyed or + assigned to. The effect of calling other functions than the destructor + or one of the assignment operators is undefined. +*/ + +/*! + \fn bool QGeoPositionInfo::operator==(const QGeoPositionInfo &lhs, const QGeoPositionInfo &rhs) + + Returns \c true if all of the \a lhs object's values are the same as those + of \a rhs. Otherwise returns \c false. +*/ + +/*! + \fn bool QGeoPositionInfo::operator!=(const QGeoPositionInfo &lhs, const QGeoPositionInfo &rhs) + + Returns \c true if any of the \a lhs object's values are not the same as + those of \a rhs. Otherwise returns \c false. +*/ + +/*! + Returns true if the timestamp() and coordinate() values are both valid. + + \sa QGeoCoordinate::isValid(), QDateTime::isValid() +*/ +bool QGeoPositionInfo::isValid() const +{ + return d->timestamp.isValid() && d->coord.isValid(); +} + +/*! + Sets the date and time at which this position was reported to \a timestamp. + + The \a timestamp must be in UTC time. + + \sa timestamp() +*/ +void QGeoPositionInfo::setTimestamp(const QDateTime ×tamp) +{ + d.detach(); + d->timestamp = timestamp; +} + +/*! + Returns the date and time at which this position was reported, in UTC time. + + Returns an invalid QDateTime if no date/time value has been set. + + \sa setTimestamp() +*/ +QDateTime QGeoPositionInfo::timestamp() const +{ + return d->timestamp; +} + +/*! + Sets the coordinate for this position to \a coordinate. + + \sa coordinate() +*/ +void QGeoPositionInfo::setCoordinate(const QGeoCoordinate &coordinate) +{ + d.detach(); + d->coord = coordinate; +} + +/*! + Returns the coordinate for this position. + + Returns an invalid coordinate if no coordinate has been set. + + \sa setCoordinate() +*/ +QGeoCoordinate QGeoPositionInfo::coordinate() const +{ + return d->coord; +} + +/*! + Sets the value for \a attribute to \a value. + + \sa attribute() +*/ +void QGeoPositionInfo::setAttribute(Attribute attribute, qreal value) +{ + d.detach(); + d->doubleAttribs[attribute] = value; +} + +/*! + Returns the value of the specified \a attribute as a qreal value. + + Returns NaN if the value has not been set. + + The function hasAttribute() should be used to determine whether or + not a value has been set for an attribute. + + \sa hasAttribute(), setAttribute() +*/ +qreal QGeoPositionInfo::attribute(Attribute attribute) const +{ + if (d->doubleAttribs.contains(attribute)) + return d->doubleAttribs[attribute]; + return qQNaN(); +} + +/*! + Removes the specified \a attribute and its value. +*/ +void QGeoPositionInfo::removeAttribute(Attribute attribute) +{ + d.detach(); + d->doubleAttribs.remove(attribute); +} + +/*! + Returns true if the specified \a attribute is present for this + QGeoPositionInfo object. +*/ +bool QGeoPositionInfo::hasAttribute(Attribute attribute) const +{ + return d->doubleAttribs.contains(attribute); +} + +/*! + \internal +*/ +void QGeoPositionInfo::detach() +{ + if (d) + d.detach(); + else + d = new QGeoPositionInfoPrivate; +} + +bool QGeoPositionInfo::equals(const QGeoPositionInfo &lhs, const QGeoPositionInfo &rhs) +{ + return *lhs.d == *rhs.d; +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug QGeoPositionInfo::debugStreaming(QDebug dbg, const QGeoPositionInfo &info) +{ + QDebugStateSaver saver(dbg); + dbg.nospace() << "QGeoPositionInfo(" << info.d->timestamp; + dbg.nospace() << ", "; // timestamp force dbg.space() -> reverting here + dbg << info.d->coord; + + QList attribs = info.d->doubleAttribs.keys(); + std::stable_sort(attribs.begin(), attribs.end()); // Output a sorted list from an unsorted hash. + for (int i = 0; i < attribs.size(); ++i) { + dbg << ", "; + switch (attribs[i]) { + case QGeoPositionInfo::Direction: + dbg << "Direction="; + break; + case QGeoPositionInfo::GroundSpeed: + dbg << "GroundSpeed="; + break; + case QGeoPositionInfo::VerticalSpeed: + dbg << "VerticalSpeed="; + break; + case QGeoPositionInfo::MagneticVariation: + dbg << "MagneticVariation="; + break; + case QGeoPositionInfo::HorizontalAccuracy: + dbg << "HorizontalAccuracy="; + break; + case QGeoPositionInfo::VerticalAccuracy: + dbg << "VerticalAccuracy="; + break; + case QGeoPositionInfo::DirectionAccuracy: + dbg << "DirectionAccuracy="; + break; + } + dbg << info.d->doubleAttribs[attribs[i]]; + } + dbg << ')'; + return dbg; +} +#endif + + +#ifndef QT_NO_DATASTREAM +/*! + \fn QDataStream &QGeoPositionInfo::operator<<(QDataStream &stream, QGeoPositionInfo::Attribute attr) + + Writes the given \a attr enumeration to the specified \a stream. + + \sa {Serializing Qt Data Types} +*/ +QDataStream &QGeoPositionInfo::dataStreamOut(QDataStream &stream, QGeoPositionInfo::Attribute attr) +{ + return stream << qint32(attr); +} + +/*! + \fn QDataStream &QGeoPositionInfo::operator>>(QDataStream &stream, QGeoPositionInfo::Attribute &attr) + + Reads an attribute enumeration from the specified \a stream info the given \a attr. + + \sa {Serializing Qt Data Types} +*/ +QDataStream &QGeoPositionInfo::dataStreamIn(QDataStream &stream, QGeoPositionInfo::Attribute &attr) +{ + qint32 a; + stream >> a; + attr = static_cast(a); + return stream; +} + +/*! + \fn QDataStream &QGeoPositionInfo::operator<<(QDataStream &stream, const QGeoPositionInfo &info) + + Writes the given \a info to the specified \a stream. + + \sa {Serializing Qt Data Types} +*/ + +QDataStream &QGeoPositionInfo::dataStreamOut(QDataStream &stream, const QGeoPositionInfo &info) +{ + stream << info.d->timestamp; + stream << info.d->coord; + stream << info.d->doubleAttribs; + return stream; +} + +/*! + \fn QDataStream &QGeoPositionInfo::operator>>(QDataStream &stream, QGeoPositionInfo &info) + + Reads a coordinate from the specified \a stream into the given + \a info. + + \sa {Serializing Qt Data Types} +*/ + +QDataStream &QGeoPositionInfo::dataStreamIn(QDataStream &stream, QGeoPositionInfo &info) +{ + stream >> info.d->timestamp; + stream >> info.d->coord; + stream >> info.d->doubleAttribs; + return stream; +} +#endif + +QGeoPositionInfoPrivate::QGeoPositionInfoPrivate() : QSharedData() +{ +} + +QGeoPositionInfoPrivate::QGeoPositionInfoPrivate(const QGeoPositionInfoPrivate &other) + : QSharedData(other), + timestamp(other.timestamp), + coord(other.coord), + doubleAttribs(other.doubleAttribs) +{ +} + +QGeoPositionInfoPrivate::~QGeoPositionInfoPrivate() +{ + +} + +bool QGeoPositionInfoPrivate::operator==(const QGeoPositionInfoPrivate &other) const +{ + return timestamp == other.timestamp + && coord == other.coord + && doubleAttribs == other.doubleAttribs; +} + +QGeoPositionInfoPrivate *QGeoPositionInfoPrivate::get(const QGeoPositionInfo &info) +{ + return info.d.data(); +} + +size_t qHash(const QGeoPositionInfo &key, size_t seed) noexcept +{ + return qHashMulti(seed, key.d->coord); +} + +namespace QTest +{ + +char *toString(const QGeoPositionInfo &info) +{ + QString result; + QDebug dbg(&result); + dbg << info; + + return qstrdup(qPrintable(result)); +} + +} // namespace QTest + +QT_END_NAMESPACE diff --git a/src/positioning/qgeopositioninfo.h b/src/positioning/qgeopositioninfo.h new file mode 100644 index 0000000..c37fc33 --- /dev/null +++ b/src/positioning/qgeopositioninfo.h @@ -0,0 +1,122 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QGEOPOSITIONINFO_H +#define QGEOPOSITIONINFO_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QDebug; +class QDataStream; + +class QGeoPositionInfo; +Q_POSITIONING_EXPORT size_t qHash(const QGeoPositionInfo &key, size_t seed = 0) noexcept; +namespace QTest +{ + +Q_POSITIONING_EXPORT char *toString(const QGeoPositionInfo &info); + +} // namespace QTest + +class QGeoPositionInfoPrivate; +QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QGeoPositionInfoPrivate, Q_POSITIONING_EXPORT) + +class Q_POSITIONING_EXPORT QGeoPositionInfo +{ +public: + enum Attribute { + Direction, + GroundSpeed, + VerticalSpeed, + MagneticVariation, + HorizontalAccuracy, + VerticalAccuracy, + DirectionAccuracy + }; + + QGeoPositionInfo(); + QGeoPositionInfo(const QGeoCoordinate &coordinate, const QDateTime &updateTime); + QGeoPositionInfo(const QGeoPositionInfo &other); + QGeoPositionInfo(QGeoPositionInfo &&other) noexcept = default; + QGeoPositionInfo(QGeoPositionInfoPrivate &dd); + ~QGeoPositionInfo(); + + QGeoPositionInfo &operator=(const QGeoPositionInfo &other); + QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QGeoPositionInfo) + + void swap(QGeoPositionInfo &other) noexcept { d.swap(other.d); } + + friend bool operator==(const QGeoPositionInfo &lhs, const QGeoPositionInfo &rhs) + { + return equals(lhs, rhs); + } + friend bool operator!=(const QGeoPositionInfo &lhs, const QGeoPositionInfo &rhs) + { + return !equals(lhs, rhs); + } + + bool isValid() const; + + void setTimestamp(const QDateTime ×tamp); + QDateTime timestamp() const; + + void setCoordinate(const QGeoCoordinate &coordinate); + QGeoCoordinate coordinate() const; + + void setAttribute(Attribute attribute, qreal value); + qreal attribute(Attribute attribute) const; + void removeAttribute(Attribute attribute); + bool hasAttribute(Attribute attribute) const; + + void detach(); + +private: + static bool equals(const QGeoPositionInfo &lhs, const QGeoPositionInfo &rhs); +#ifndef QT_NO_DEBUG_STREAM + friend QDebug operator<<(QDebug dbg, const QGeoPositionInfo &info) + { + return debugStreaming(dbg, info); + } + static QDebug debugStreaming(QDebug dbg, const QGeoPositionInfo &info); +#endif +#ifndef QT_NO_DATASTREAM + friend QDataStream &operator<<(QDataStream &stream, const QGeoPositionInfo &info) + { + return dataStreamOut(stream, info); + } + friend QDataStream &operator>>(QDataStream &stream, QGeoPositionInfo &info) + { + return dataStreamIn(stream, info); + } + static QDataStream &dataStreamOut(QDataStream &stream, const QGeoPositionInfo &info); + static QDataStream &dataStreamIn(QDataStream &stream, QGeoPositionInfo &info); + + friend QDataStream &operator<<(QDataStream &stream, QGeoPositionInfo::Attribute attr) + { + return dataStreamOut(stream, attr); + } + friend QDataStream &operator>>(QDataStream &stream, QGeoPositionInfo::Attribute &attr) + { + return dataStreamIn(stream, attr); + } + static QDataStream &dataStreamOut(QDataStream &stream, QGeoPositionInfo::Attribute attr); + static QDataStream &dataStreamIn(QDataStream &stream, QGeoPositionInfo::Attribute &attr); +#endif + QExplicitlySharedDataPointer d; + friend class QGeoPositionInfoPrivate; + + friend Q_POSITIONING_EXPORT size_t qHash(const QGeoPositionInfo &key, size_t seed) noexcept; + friend Q_POSITIONING_EXPORT char *QTest::toString(const QGeoPositionInfo &info); +}; + +Q_DECLARE_SHARED(QGeoPositionInfo) + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN(QGeoPositionInfo, Q_POSITIONING_EXPORT) + +#endif // QGEOPOSITIONINFO_H diff --git a/src/positioning/qgeopositioninfo_p.h b/src/positioning/qgeopositioninfo_p.h new file mode 100644 index 0000000..e5ef4bd --- /dev/null +++ b/src/positioning/qgeopositioninfo_p.h @@ -0,0 +1,42 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QGEOPOSITIONINFO_P_H +#define QGEOPOSITIONINFO_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include "qgeopositioninfo.h" +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoPositionInfoPrivate : public QSharedData +{ +public: + QGeoPositionInfoPrivate(); + QGeoPositionInfoPrivate(const QGeoPositionInfoPrivate &other); + virtual ~QGeoPositionInfoPrivate(); + bool operator==(const QGeoPositionInfoPrivate &other) const; + + QDateTime timestamp; + QGeoCoordinate coord; + QHash doubleAttribs; + + static QGeoPositionInfoPrivate *get(const QGeoPositionInfo &info); +}; + +QT_END_NAMESPACE + +#endif // QGEOPOSITIONINFO_P_H diff --git a/src/positioning/qgeopositioninfosource.cpp b/src/positioning/qgeopositioninfosource.cpp new file mode 100644 index 0000000..4e38a6a --- /dev/null +++ b/src/positioning/qgeopositioninfosource.cpp @@ -0,0 +1,605 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#include +#include "qgeopositioninfosource_p.h" +#include "qgeopositioninfosourcefactory.h" + +#include +#include +#include +#include +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader, + ("org.qt-project.qt.position.sourcefactory/6.0", + QLatin1String("/position"))) + +/*! + \class QGeoPositionInfoSource + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \since 5.2 + + \brief The QGeoPositionInfoSource class is an abstract base class for the distribution of positional updates. + + The static function QGeoPositionInfoSource::createDefaultSource() creates a default + position source that is appropriate for the platform, if one is available. + Otherwise, QGeoPositionInfoSource will check for available plugins that + implement the QGeoPositionInfoSourceFactory interface. + + Users of a QGeoPositionInfoSource subclass can request the current position using + requestUpdate(), or start and stop regular position updates using + startUpdates() and stopUpdates(). When an update is available, + positionUpdated() is emitted. The last known position can be accessed with + lastKnownPosition(). + + If regular position updates are required, setUpdateInterval() can be used + to specify how often these updates should be emitted. If no interval is + specified, updates are simply provided whenever they are available. + For example: + + \code + // Emit updates every 10 seconds if available + QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(0); + if (source) + source->setUpdateInterval(10000); + \endcode + + To remove an update interval that was previously set, call + setUpdateInterval() with a value of 0. + + \note The position source may have a minimum value requirement for + update intervals, as returned by minimumUpdateInterval(). + + \note To use this class from Android service, see + \l {Qt Positioning on Android}. +*/ + +/*! + \enum QGeoPositionInfoSource::PositioningMethod + Defines the types of positioning methods. + + \value NoPositioningMethods None of the positioning methods. + \value SatellitePositioningMethods Satellite-based positioning methods such as GPS or GLONASS. + \value NonSatellitePositioningMethods Other positioning methods such as 3GPP cell identifier or WiFi based positioning. + \value AllPositioningMethods Satellite-based positioning methods as soon as available. Otherwise non-satellite based methods. +*/ + +QGeoPositionInfoSourcePrivate::~QGeoPositionInfoSourcePrivate() +{ + +} + +QGeoPositionInfoSourceFactory *QGeoPositionInfoSourcePrivate::loadFactory(const QCborMap &meta) +{ + const int idx = static_cast(meta.value(QStringLiteral("index")).toDouble()); + if (idx < 0) + return nullptr; + QObject *instance = loader()->instance(idx); + if (!instance) + return nullptr; + return qobject_cast(instance); +} + +QMultiHash QGeoPositionInfoSourcePrivate::plugins(bool reload) +{ + static QMultiHash plugins; + static bool alreadyDiscovered = false; + + if (reload == true) + alreadyDiscovered = false; + + if (!alreadyDiscovered) { + loadPluginMetadata(plugins); + alreadyDiscovered = true; + } + return plugins; +} + +static bool pluginComparator(const QCborMap &p1, const QCborMap &p2) +{ + const QString prio = QStringLiteral("Priority"); + if (p1.contains(prio) && !p2.contains(prio)) + return true; + if (!p1.contains(prio) && p2.contains(prio)) + return false; + if (p1.value(prio).isDouble() && !p2.value(prio).isDouble()) + return true; + if (!p1.value(prio).isDouble() && p2.value(prio).isDouble()) + return false; + return (p1.value(prio).toDouble() > p2.value(prio).toDouble()); +} + +QList QGeoPositionInfoSourcePrivate::pluginsSorted() +{ + QList list = plugins().values(); + std::stable_sort(list.begin(), list.end(), pluginComparator); + return list; +} + +void QGeoPositionInfoSourcePrivate::loadPluginMetadata(QMultiHash &plugins) +{ + QFactoryLoader *l = loader(); + QList meta = l->metaData(); + for (qsizetype i = 0; i < meta.size(); ++i) { + QCborMap obj = meta.at(i).value(QtPluginMetaDataKeys::MetaData).toMap(); + const QLatin1String testableKey("Testable"); + if (!obj.value(testableKey).toBool(true)) { + static bool inTest = qEnvironmentVariableIsSet("QT_QTESTLIB_RUNNING"); + if (inTest) + continue; + } + obj.insert(QLatin1String("index"), static_cast(i)); + plugins.insert(obj.value(QStringLiteral("Provider")).toString(), obj); + } +} + +/*! + Creates a position source with the specified \a parent. +*/ + +QGeoPositionInfoSource::QGeoPositionInfoSource(QObject *parent) + : QObject(*new QGeoPositionInfoSourcePrivate, parent) +{ + qRegisterMetaType(); +} + +/*! + Destroys the position source. +*/ +QGeoPositionInfoSource::~QGeoPositionInfoSource() +{ +} + +/*! + \property QGeoPositionInfoSource::sourceName + \brief This property holds the unique name of the position source + implementation in use. + + This is the same name that can be passed to createSource() in order to + create a new instance of a particular position source implementation. +*/ +QString QGeoPositionInfoSource::sourceName() const +{ + Q_D(const QGeoPositionInfoSource); + return d->sourceName; +} + +/*! + Sets the backend-specific property named \a name to \a value. + Returns \c true on success, \c false otherwise. + Backend-specific properties can be used to configure the positioning subsystem behavior + at runtime. + Supported backend-specific properties are listed and described in + \l {Qt Positioning plugins#Default plugins}. + + \sa backendProperty + \since Qt 5.14 +*/ +bool QGeoPositionInfoSource::setBackendProperty(const QString &name, const QVariant &value) +{ + Q_UNUSED(name) + Q_UNUSED(value) + return false; +} + +/*! + Returns the value of the backend-specific property named \a name, if present. + Otherwise, the returned value will be invalid. + Supported backend-specific properties are listed and described in + \l {Qt Positioning plugins#Default plugins}. + + \sa setBackendProperty + \since Qt 5.14 +*/ +QVariant QGeoPositionInfoSource::backendProperty(const QString &name) const +{ + Q_UNUSED(name) + return QVariant(); +} + +/*! + \property QGeoPositionInfoSource::updateInterval + \brief This property holds the requested interval in milliseconds between each update. + + If the update interval is not set (or is set to 0) the + source will provide updates as often as necessary. + + If the update interval is set, the source will provide updates at an + interval as close to the requested interval as possible. If the requested + interval is less than the minimumUpdateInterval(), + the minimum interval is used instead. + + Changes to the update interval will happen as soon as is practical, however the + time the change takes may vary between implementations. Whether or not the elapsed + time from the previous interval is counted as part of the new interval is also + implementation dependent. + + The default value for this property is 0. + + \note Subclass implementations must call the base implementation of + \c {setUpdateInterval()} so that \c {updateInterval()} returns the correct + value. + + \note This property can't be used to tune update frequency on iOS and macOS, + because their APIs do not provide such possibility. On these systems this + parameter is only used to set \l UpdateTimeoutError and trigger an + \l errorOccurred signal if the update is not received within the desired + interval. +*/ +void QGeoPositionInfoSource::setUpdateInterval(int msec) +{ + Q_D(QGeoPositionInfoSource); + d->interval = msec; +} + +int QGeoPositionInfoSource::updateInterval() const +{ + Q_D(const QGeoPositionInfoSource); + return d->interval.value(); +} + +QBindable QGeoPositionInfoSource::bindableUpdateInterval() +{ + Q_D(QGeoPositionInfoSource); + return QBindable(&d->interval); +} + +/*! + \property QGeoPositionInfoSource::preferredPositioningMethods + + \brief Sets the preferred positioning methods for this source. + + If new methods include a method that is not supported by the source, the + unsupported method will be ignored. + + If new methods do not include a single method available/supported by the + source, the preferred methods will be set to the set of methods which the + source has available. If the source has no method availabe (e.g. because its + Location service is turned off or it does not offer a Location service), + the passed methods are accepted as they are. + + The default value for this property is \l {QGeoPositionInfoSource::} + {NoPositioningMethods}. + + \note Subclass implementations must call the base implementation of + \c {setPreferredPositioningMethods()} to ensure + \c {preferredPositioningMethods()} returns the correct value. + + \sa supportedPositioningMethods() +*/ +void QGeoPositionInfoSource::setPreferredPositioningMethods(PositioningMethods methods) +{ + Q_D(QGeoPositionInfoSource); + d->methods.removeBindingUnlessInWrapper(); + // The supported positioning methods can change during the calls to this + // method, so we can't have a simple check like: + // if (currentMethods == methods) return; + // Instead we need to save the current value and compare it afterwards + const auto prevMethods = d->methods.valueBypassingBindings(); + + if (supportedPositioningMethods() != QGeoPositionInfoSource::NoPositioningMethods) { + d->methods.setValueBypassingBindings(methods & supportedPositioningMethods()); + if (d->methods.valueBypassingBindings() == 0) { + d->methods.setValueBypassingBindings(supportedPositioningMethods()); + } + } else { // avoid that turned of Location service blocks any changes to d->methods + d->methods.setValueBypassingBindings(methods); + } + if (prevMethods != d->methods.valueBypassingBindings()) + d->methods.notify(); +} + +QGeoPositionInfoSource::PositioningMethods QGeoPositionInfoSource::preferredPositioningMethods() const +{ + Q_D(const QGeoPositionInfoSource); + return d->methods.value(); +} + +QBindable +QGeoPositionInfoSource::bindablePreferredPositioningMethods() +{ + Q_D(QGeoPositionInfoSource); + return QBindable(&d->methods); +} + +QGeoPositionInfoSource *QGeoPositionInfoSourcePrivate::createSourceReal(const QCborMap &meta, const QVariantMap ¶meters, QObject *parent) +{ + QGeoPositionInfoSource *s = nullptr; + auto factory = QGeoPositionInfoSourcePrivate::loadFactory(meta); + if (factory) + s = factory->positionInfoSource(parent, parameters); + if (s) + s->d_func()->sourceName = meta.value(QStringLiteral("Provider")).toString(); + + return s; +} + +/*! + Creates and returns a position source with the given \a parent that + reads from the system's default sources of location data, or the plugin + with the highest available priority. + + Returns \c nullptr if the system has no default position source, no valid + plugins could be found or the user does not have the permission to access + the current position. +*/ +QGeoPositionInfoSource *QGeoPositionInfoSource::createDefaultSource(QObject *parent) +{ + return createDefaultSource(QVariantMap(), parent); +} + +/*! + Creates and returns a position source with the given \a parent that + reads from the system's default sources of location data, or the plugin + with the highest available priority. + + Returns \c nullptr if the system has no default position source, no valid plugins + could be found or the user does not have the permission to access the current position. + + This method passes \a parameters to the factory to configure the source. + + \since Qt 5.14 +*/ +QGeoPositionInfoSource *QGeoPositionInfoSource::createDefaultSource(const QVariantMap ¶meters, QObject *parent) +{ + const QList plugins = QGeoPositionInfoSourcePrivate::pluginsSorted(); + for (const QCborMap &obj : plugins) { + if (obj.value(QStringLiteral("Position")).isBool() + && obj.value(QStringLiteral("Position")).toBool()) { + QGeoPositionInfoSource *source = QGeoPositionInfoSourcePrivate::createSourceReal(obj, parameters, parent); + if (source) + return source; + } + } + return nullptr; +} + +/*! + Creates and returns a position source with the given \a parent, + by loading the plugin named \a sourceName. + + Returns \c nullptr if the plugin cannot be found. +*/ +QGeoPositionInfoSource *QGeoPositionInfoSource::createSource(const QString &sourceName, QObject *parent) +{ + return createSource(sourceName, QVariantMap(), parent); +} + +/*! + Creates and returns a position source with the given \a parent, + by loading the plugin named \a sourceName. + + Returns \c nullptr if the plugin cannot be found. + + This method passes \a parameters to the factory to configure the source. + + \since Qt 5.14 +*/ +QGeoPositionInfoSource *QGeoPositionInfoSource::createSource(const QString &sourceName, const QVariantMap ¶meters, QObject *parent) +{ + auto plugins = QGeoPositionInfoSourcePrivate::plugins(); + if (plugins.contains(sourceName)) + return QGeoPositionInfoSourcePrivate::createSourceReal(plugins.value(sourceName), parameters, parent); + return nullptr; +} + +/*! + Returns a list of available source plugins. This includes any default backend + plugin for the current platform. +*/ +QStringList QGeoPositionInfoSource::availableSources() +{ + QStringList plugins; + const auto meta = QGeoPositionInfoSourcePrivate::plugins(); + for (auto it = meta.cbegin(), end = meta.cend(); it != end; ++it) { + if (it.value().value(QStringLiteral("Position")).isBool() + && it.value().value(QStringLiteral("Position")).toBool()) { + plugins << it.key(); + } + } + + return plugins; +} + +QGeoPositionInfoSource::QGeoPositionInfoSource(QGeoPositionInfoSourcePrivate &dd, QObject *parent) + : QObject(dd, parent) +{ + qRegisterMetaType(); + Q_D(QGeoPositionInfoSource); + d->interval.setValueBypassingBindings(0); + d->methods.setValueBypassingBindings(NoPositioningMethods); +} + +/*! + \fn QGeoPositionInfo QGeoPositionInfoSource::lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const = 0; + + Returns an update containing the last known position, or a null update + if none is available. + + If \a fromSatellitePositioningMethodsOnly is true, this returns the last + known position received from a satellite positioning method; if none + is available, a null update is returned. +*/ + +/*! + \fn virtual PositioningMethods QGeoPositionInfoSource::supportedPositioningMethods() const = 0; + + Returns the positioning methods available to this source. Availability is defined as being usable + at the time of calling this function. Therefore user settings like turned off location service or + limitations to Satellite-based position providers are reflected by this function. Runtime notifications + when the status changes can be obtained via \l supportedPositioningMethodsChanged(). + + Not all platforms distinguish the different positioning methods or communicate the current user + configuration of the device. The following table provides an overview of the current platform situation: + + \table + \header + \li Platform + \li Brief Description + \row + \li Android + \li Individual provider status and general Location service state are known and communicated + when location service is active. + \row + \li GeoClue + \li Hardcoced to always return AllPositioningMethods. + \row + \li GeoClue2 + \li Individual providers are not distinguishable but disabled Location services reflected. + \row + \li iOS + \li Hardcoced to always return AllPositioningMethods. + \row + \li macOS + \li Hardcoced to always return AllPositioningMethods. + \row + \li Windows (UWP) + \li Individual providers are not distinguishable but disabled Location services reflected. + \endtable + + \sa supportedPositioningMethodsChanged(), setPreferredPositioningMethods() +*/ + + +/*! + \property QGeoPositionInfoSource::minimumUpdateInterval + \brief This property holds the minimum time (in milliseconds) required to retrieve a position update. + + This is the minimum value accepted by setUpdateInterval() and + requestUpdate(). +*/ + + +/*! + \fn virtual void QGeoPositionInfoSource::startUpdates() = 0; + + Starts emitting updates at regular intervals as specified by setUpdateInterval(). + + If setUpdateInterval() has not been called, the source will emit updates + as soon as they become available. + + An errorOccurred() signal with the \l {QGeoPositionInfoSource::} + {UpdateTimeoutError} will be emitted if this QGeoPositionInfoSource subclass + determines that it will not be able to provide regular updates. This could + happen if a satellite fix is lost or if a hardware error is detected. + Position updates will recommence if the data becomes available later on. + The \l {QGeoPositionInfoSource::}{UpdateTimeoutError} error will not + be emitted again until after the periodic updates resume. + + \note Since Qt6 this method always resets the last error to + \l {QGeoPositionInfoSource::}{NoError} before starting the updates. + + \note To understand how to use this method from an Android service, see + \l {Qt Positioning on Android}. + + On iOS, starting from version 8, Core Location framework requires additional + entries in the application's Info.plist with keys NSLocationAlwaysUsageDescription or + NSLocationWhenInUseUsageDescription and a string to be displayed in the authorization prompt. + The key NSLocationWhenInUseUsageDescription is used when requesting permission + to use location services while the app is in the foreground. + The key NSLocationAlwaysUsageDescription is used when requesting permission + to use location services whenever the app is running (both the foreground and the background). + If both entries are defined, NSLocationWhenInUseUsageDescription has a priority in the + foreground mode. +*/ + +/*! + \fn virtual void QGeoPositionInfoSource::stopUpdates() = 0; + + Stops emitting updates at regular intervals. +*/ + +/*! + \fn virtual void QGeoPositionInfoSource::requestUpdate(int timeout = 0); + + Attempts to get the current position and emit positionUpdated() with + this information. If the current position cannot be found within the given \a timeout + (in milliseconds) or if \a timeout is less than the value returned by + minimumUpdateInterval(), an errorOccurred() signal with the + \l {QGeoPositionInfoSource::}{UpdateTimeoutError} is emitted. + + If the timeout is zero, the timeout defaults to a reasonable timeout + period as appropriate for the source. + + This does nothing if another update request is in progress. However + it can be called even if startUpdates() has already been called and + regular updates are in progress. + + If the source uses multiple positioning methods, it tries to get the + current position from the most accurate positioning method within the + given timeout. + + \note Since Qt6 this method always resets the last error to + \l {QGeoPositionInfoSource::}{NoError} before requesting + the position. + + \note To understand how to use this method from an Android service, see + \l {Qt Positioning on Android}. +*/ + +/*! + \fn virtual QGeoPositionInfoSource::Error QGeoPositionInfoSource::error() const; + + Returns the type of error that last occurred. + + \note Since Qt6 the last error is always reset when calling startUpdates() + or requestUpdate(). +*/ + +/*! + \fn void QGeoPositionInfoSource::positionUpdated(const QGeoPositionInfo &update); + + If startUpdates() or requestUpdate() is called, this signal is emitted + when an update becomes available. + + The \a update value holds the value of the new update. +*/ + +/*! + \fn void QGeoPositionInfoSource::errorOccurred(QGeoPositionInfoSource::Error positioningError) + + This signal is emitted after an error occurred. The \a positioningError + parameter describes the type of error that occurred. +*/ + +/*! + \enum QGeoPositionInfoSource::Error + + The Error enumeration represents the errors which can occur. + + \value AccessError The connection setup to the remote positioning backend failed because the + application lacked the required privileges. + \value ClosedError The remote positioning backend closed the connection, which happens for example in case + the user is switching location services to off. As soon as the location service is re-enabled + regular updates will resume. + \value NoError No error has occurred. + \value UnknownSourceError An unidentified error occurred. + \value [since 6.2] UpdateTimeoutError If requestUpdate() was called, this + error indicates that the current position could not be retrieved within + the specified timeout. If startUpdates() was called, this error + indicates that this QGeoPositionInfoSource subclass determined that it + will not be able to provide further regular updates. In the latter case + the error would not be emitted again until after the regular updates + resume. + */ + +/*! + \fn void QGeoPositionInfoSource::supportedPositioningMethodsChanged() + + This signal is emitted when the supported positioning methods changed. The cause for a change could be + a user turning Location services on/off or restricting Location services to certain types (e.g. GPS only). + Note that changes to the supported positioning methods cannot be detected on all platforms. + \l supportedPositioningMethods() provides an overview of the current platform support. + + \since Qt 5.12 +*/ + +QT_END_NAMESPACE + +#include "moc_qgeopositioninfosource.cpp" diff --git a/src/positioning/qgeopositioninfosource.h b/src/positioning/qgeopositioninfosource.h new file mode 100644 index 0000000..df49301 --- /dev/null +++ b/src/positioning/qgeopositioninfosource.h @@ -0,0 +1,93 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOSITIONINFOSOURCE_H +#define QGEOPOSITIONINFOSOURCE_H + +#include + +#include + +QT_BEGIN_NAMESPACE + +class QGeoPositionInfoSourcePrivate; +class Q_POSITIONING_EXPORT QGeoPositionInfoSource : public QObject +{ + Q_OBJECT + Q_PROPERTY(int updateInterval READ updateInterval WRITE setUpdateInterval BINDABLE + bindableUpdateInterval) + Q_PROPERTY(int minimumUpdateInterval READ minimumUpdateInterval) + Q_PROPERTY(QString sourceName READ sourceName) + Q_PROPERTY(PositioningMethods preferredPositioningMethods READ preferredPositioningMethods WRITE + setPreferredPositioningMethods BINDABLE bindablePreferredPositioningMethods) + +public: + enum Error { + AccessError = 0, + ClosedError = 1, + UnknownSourceError = 2, + NoError = 3, + UpdateTimeoutError = 4 + }; + Q_ENUM(Error) + + enum PositioningMethod { + NoPositioningMethods = 0x00000000, + SatellitePositioningMethods = 0x000000ff, + NonSatellitePositioningMethods = 0xffffff00, + AllPositioningMethods = 0xffffffff + }; + Q_DECLARE_FLAGS(PositioningMethods, PositioningMethod) + + explicit QGeoPositionInfoSource(QObject *parent); + virtual ~QGeoPositionInfoSource(); + + virtual void setUpdateInterval(int msec); + int updateInterval() const; + QBindable bindableUpdateInterval(); + + virtual void setPreferredPositioningMethods(PositioningMethods methods); + PositioningMethods preferredPositioningMethods() const; + QBindable bindablePreferredPositioningMethods(); + + virtual QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const = 0; + + virtual PositioningMethods supportedPositioningMethods() const = 0; + virtual int minimumUpdateInterval() const = 0; + + QString sourceName() const; + + virtual bool setBackendProperty(const QString &name, const QVariant &value); + virtual QVariant backendProperty(const QString &name) const; + + static QGeoPositionInfoSource *createDefaultSource(QObject *parent); + static QGeoPositionInfoSource *createDefaultSource(const QVariantMap ¶meters, QObject *parent); + static QGeoPositionInfoSource *createSource(const QString &sourceName, QObject *parent); + static QGeoPositionInfoSource *createSource(const QString &sourceName, const QVariantMap ¶meters, QObject *parent); + static QStringList availableSources(); + virtual Error error() const = 0; + +public Q_SLOTS: + virtual void startUpdates() = 0; + virtual void stopUpdates() = 0; + + virtual void requestUpdate(int timeout = 0) = 0; + +Q_SIGNALS: + void positionUpdated(const QGeoPositionInfo &update); + void errorOccurred(QGeoPositionInfoSource::Error); + void supportedPositioningMethodsChanged(); + +protected: + explicit QGeoPositionInfoSource(QGeoPositionInfoSourcePrivate &dd, QObject *parent); + +private: + Q_DISABLE_COPY(QGeoPositionInfoSource) + Q_DECLARE_PRIVATE(QGeoPositionInfoSource) +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoPositionInfoSource::PositioningMethods) + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qgeopositioninfosource_p.h b/src/positioning/qgeopositioninfosource_p.h new file mode 100644 index 0000000..39fdbbd --- /dev/null +++ b/src/positioning/qgeopositioninfosource_p.h @@ -0,0 +1,60 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOSITIONINFOSOURCE_P_H +#define QGEOPOSITIONINFOSOURCE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include "qgeopositioninfosource.h" +#include "qgeopositioninfosourcefactory.h" +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoPositionInfoSourcePrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QGeoPositionInfoSource) +public: + virtual ~QGeoPositionInfoSourcePrivate(); + + static QGeoPositionInfoSourceFactory *loadFactory(const QCborMap &meta); + static QGeoPositionInfoSource *createSourceReal(const QCborMap &meta, + const QVariantMap ¶meters, + QObject *parent); + + void setPositioningMethods(QGeoPositionInfoSource::PositioningMethods methods) + { + q_func()->setPreferredPositioningMethods(methods); + } + + Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(QGeoPositionInfoSourcePrivate, int, interval, 0) + Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QGeoPositionInfoSourcePrivate, + QGeoPositionInfoSource::PositioningMethods, methods, + &QGeoPositionInfoSourcePrivate::setPositioningMethods, + QGeoPositionInfoSource::NoPositioningMethods) + QString sourceName; + + static QMultiHash plugins(bool reload = false); + static void loadPluginMetadata(QMultiHash &list); + static QList pluginsSorted(); +}; + +QT_END_NAMESPACE + +#endif // QGEOPOSITIONINFOSOURCE_P_H diff --git a/src/positioning/qgeopositioninfosourcefactory.cpp b/src/positioning/qgeopositioninfosourcefactory.cpp new file mode 100644 index 0000000..2cfba01 --- /dev/null +++ b/src/positioning/qgeopositioninfosourcefactory.cpp @@ -0,0 +1,54 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeopositioninfosourcefactory.h" + +QT_BEGIN_NAMESPACE + +/*! + \class QGeoPositionInfoSourceFactory + \inmodule QtPositioning + \since 5.2 + + \brief The QGeoPositionInfoSourceFactory class is a factory class used + as the plugin interface for external providers of positioning data. + + Each factory method takes a parameters argument, which allows to configure + the created source. +*/ + +/*! + \fn QGeoPositionInfoSource *QGeoPositionInfoSourceFactory::positionInfoSource(QObject *parent, const QVariantMap ¶meters) + + Returns a new QGeoPositionInfoSource associated with this plugin + with parent \a parent, and using \a parameters as configuration parameters. + Can also return 0, in which case the plugin loader will use the factory with + the next highest priority. +*/ + +/*! + \fn QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactory::satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) + + Returns a new QGeoSatelliteInfoSource associated with this plugin + with parent \a parent, and using \a parameters as configuration parameters. + Can also return 0, in which case the plugin loader will use the factory with + the next highest priority. +*/ + +/*! + \fn QGeoAreaMonitorSource *QGeoPositionInfoSourceFactory::areaMonitor(QObject *parent, const QVariantMap ¶meters); + + Returns a new QGeoAreaMonitorSource associated with this plugin with parent + \a parent, and using \a parameters as configuration parameters. + Can also return 0, in which case the plugin loader will use the factory with + the next highest priority. +*/ + +/*! + Destroys the position info source factory. +*/ +QGeoPositionInfoSourceFactory::~QGeoPositionInfoSourceFactory() +{} + +QT_END_NAMESPACE + diff --git a/src/positioning/qgeopositioninfosourcefactory.h b/src/positioning/qgeopositioninfosourcefactory.h new file mode 100644 index 0000000..94465a6 --- /dev/null +++ b/src/positioning/qgeopositioninfosourcefactory.h @@ -0,0 +1,30 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOPOSITIONINFOSOURCEFACTORY_H +#define QGEOPOSITIONINFOSOURCEFACTORY_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONING_EXPORT QGeoPositionInfoSourceFactory +{ +public: + virtual ~QGeoPositionInfoSourceFactory(); + + virtual QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap ¶meters) = 0; + virtual QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) = 0; + virtual QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) = 0; +}; + +#define QT_POSITION_SOURCE_INTERFACE +Q_DECLARE_INTERFACE(QGeoPositionInfoSourceFactory, + "org.qt-project.qt.position.sourcefactory/6.0") + +QT_END_NAMESPACE + +#endif // QGEOPOSITIONINFOSOURCEFACTORY_H diff --git a/src/positioning/qgeorectangle.cpp b/src/positioning/qgeorectangle.cpp new file mode 100644 index 0000000..5e829ec --- /dev/null +++ b/src/positioning/qgeorectangle.cpp @@ -0,0 +1,916 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeorectangle.h" +#include "qgeorectangle_p.h" + +#include "qwebmercator_p.h" +#include "qdoublevector2d_p.h" +#include "qgeocoordinate.h" +#include "qnumeric.h" +#include "qlocationutils_p.h" +#include +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN(QGeoRectangle) + +/*! + \class QGeoRectangle + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \since 5.2 + + \brief The QGeoRectangle class defines a rectangular geographic area. + + The rectangle is defined in terms of a QGeoCoordinate which specifies the + top left coordinate of the rectangle and a QGeoCoordinate which specifies + the bottom right coordinate of the rectangle. + + A geo rectangle is considered invalid if the top left or bottom right + coordinates are invalid or if the top left coordinate is south of the + bottom right coordinate. + + Geo rectangles can never cross the poles. + + Several methods behave as though the geo rectangle is defined in terms of a + center coordinate, the width of the geo rectangle in degrees and the height + of the geo rectangle in degrees. + + If the height or center of a geo rectangle is adjusted such that it would + cross one of the poles the height is modified such that the geo rectangle + touches but does not cross the pole and that the center coordinate is still + in the center of the geo rectangle. + + This class is a \l Q_GADGET since Qt 5.5. It can be + \l{Cpp_value_integration_positioning}{directly used from C++ and QML}. +*/ + +/*! + \property QGeoRectangle::bottomLeft + \brief This property holds the bottom left coorindate of this geo rectangle. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +/*! + \property QGeoRectangle::bottomRight + \brief This property holds the bottom right coordinate of this geo rectangle. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +/*! + \property QGeoRectangle::topLeft + \brief This property holds the top left coordinate of this geo rectangle. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +/*! + \property QGeoRectangle::topRight + \brief This property holds the top right coordinate of this geo rectangle. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +/*! + \property QGeoRectangle::center + \brief This property holds the center of this geo rectangle. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \sa QGeoShape::center + + \since 5.5 +*/ + +/*! + \property QGeoRectangle::width + \brief This property holds the width of this geo rectangle in degrees. + + The property value is undefined if this geo rectangle is invalid. + + If the new width is less than 0.0 or if this geo rectangle is invalid, this + function does nothing. To set up the values of an invalid + geo rectangle based on the center, width, and height, you should use + \l setCenter() first to make the geo rectangle valid. + + 360.0 is the width used only if the new width is equal or greater than 360. + In such cases the leftmost longitude of the geo rectangle is set to -180.0 + degrees and the rightmost longitude of the geo rectangle is set to 180.0 + degrees. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +/*! + \property QGeoRectangle::height + \brief This property holds the height of this geo rectangle in degrees. + + The property value is undefined if this geo rectangle is invalid. + + If the new height is less than 0.0 or if this geo rectangle is invalid, + the property is not changed. To set up the values of an invalid + geo rectangle based on the center, width, and height, you should use + \l setCenter() first to make the geo rectangle valid. + + If the change in height would cause the geo rectangle to cross a pole, + the height is adjusted such that the geo rectangle only touches the pole. + + This change is done such that the center coordinate is still at the + center of the geo rectangle, which may result in a geo rectangle with + a smaller height than expected. + + 180.0 is the height used only if the new height is greater or equal than 180. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +inline QGeoRectanglePrivate *QGeoRectangle::d_func() +{ + return static_cast(d_ptr.data()); +} + +inline const QGeoRectanglePrivate *QGeoRectangle::d_func() const +{ + return static_cast(d_ptr.constData()); +} + +/*! + Constructs a new, invalid geo rectangle. +*/ +QGeoRectangle::QGeoRectangle() +: QGeoShape(new QGeoRectanglePrivate) +{ +} + +/*! + Constructs a new geo rectangle centered at \a center with a + width in degrees of \a degreesWidth and a height in degrees of \a degreesHeight. + + If \a degreesHeight would take the geo rectangle beyond one of the poles, + the height of the geo rectangle will be truncated such that the geo rectangle + only extends up to the pole. The center of the geo rectangle will be + unchanged, and the height will be adjusted such that the center point is at + the center of the truncated geo rectangle. +*/ +QGeoRectangle::QGeoRectangle(const QGeoCoordinate ¢er, double degreesWidth, double degreesHeight) +{ + d_ptr = new QGeoRectanglePrivate(center, center); + setWidth(degreesWidth); + setHeight(degreesHeight); +} + +/*! + Constructs a new geo rectangle with a top left coordinate \a topLeft and a bottom right + coordinate \a bottomRight. +*/ +QGeoRectangle::QGeoRectangle(const QGeoCoordinate &topLeft, const QGeoCoordinate &bottomRight) +{ + d_ptr = new QGeoRectanglePrivate(topLeft, bottomRight); +} + +/*! + Constructs a new geo rectangle, of minimum size, containing all of the \a coordinates. +*/ +QGeoRectangle::QGeoRectangle(const QList &coordinates) +{ + if (coordinates.isEmpty()) { + d_ptr = new QGeoRectanglePrivate; + } else { + const QGeoCoordinate &startCoordinate = coordinates.first(); + d_ptr = new QGeoRectanglePrivate(startCoordinate, startCoordinate); + + for (const QGeoCoordinate &coordinate : coordinates) + d_func()->extendRectangle(coordinate); + } +} + +/*! + Constructs a geo rectangle from the contents of \a other. +*/ +QGeoRectangle::QGeoRectangle(const QGeoRectangle &other) +: QGeoShape(other) +{ +} + +/*! + Constructs a geo rectangle from the contents of \a other. +*/ +QGeoRectangle::QGeoRectangle(const QGeoShape &other) +: QGeoShape(other) +{ + if (type() != QGeoShape::RectangleType) + d_ptr = new QGeoRectanglePrivate; +} + +/*! + Destroys this geo rectangle. +*/ +QGeoRectangle::~QGeoRectangle() +{ +} + +/*! + Assigns \a other to this geo rectangle and returns a reference to this geo rectangle. +*/ +QGeoRectangle &QGeoRectangle::operator=(const QGeoRectangle &other) +{ + QGeoShape::operator=(other); + return *this; +} + +bool QGeoRectanglePrivate::isValid() const +{ + return topLeft.isValid() && bottomRight.isValid() && + topLeft.latitude() >= bottomRight.latitude(); +} + +bool QGeoRectanglePrivate::isEmpty() const +{ + if (!isValid()) + return true; + + return topLeft.latitude() == bottomRight.latitude() || + topLeft.longitude() == bottomRight.longitude(); +} + +/*! + Sets the top left coordinate of this geo rectangle to \a topLeft. +*/ +void QGeoRectangle::setTopLeft(const QGeoCoordinate &topLeft) +{ + Q_D(QGeoRectangle); + + d->topLeft = topLeft; +} + +/*! + Returns the top left coordinate of this geo rectangle. +*/ +QGeoCoordinate QGeoRectangle::topLeft() const +{ + Q_D(const QGeoRectangle); + + return d->topLeft; +} + +/*! + Sets the top right coordinate of this geo rectangle to \a topRight. +*/ +void QGeoRectangle::setTopRight(const QGeoCoordinate &topRight) +{ + Q_D(QGeoRectangle); + + d->topLeft.setLatitude(topRight.latitude()); + d->bottomRight.setLongitude(topRight.longitude()); +} + +/*! + Returns the top right coordinate of this geo rectangle. +*/ +QGeoCoordinate QGeoRectangle::topRight() const +{ + // TODO remove? + if (!isValid()) + return QGeoCoordinate(); + + Q_D(const QGeoRectangle); + + return QGeoCoordinate(d->topLeft.latitude(), d->bottomRight.longitude()); +} + +/*! + Sets the bottom left coordinate of this geo rectangle to \a bottomLeft. +*/ +void QGeoRectangle::setBottomLeft(const QGeoCoordinate &bottomLeft) +{ + Q_D(QGeoRectangle); + + d->bottomRight.setLatitude(bottomLeft.latitude()); + d->topLeft.setLongitude(bottomLeft.longitude()); +} + +/*! + Returns the bottom left coordinate of this geo rectangle. +*/ +QGeoCoordinate QGeoRectangle::bottomLeft() const +{ + // TODO remove? + if (!isValid()) + return QGeoCoordinate(); + + Q_D(const QGeoRectangle); + + return QGeoCoordinate(d->bottomRight.latitude(), d->topLeft.longitude()); +} + +/*! + Sets the bottom right coordinate of this geo rectangle to \a bottomRight. +*/ +void QGeoRectangle::setBottomRight(const QGeoCoordinate &bottomRight) +{ + Q_D(QGeoRectangle); + + d->bottomRight = bottomRight; +} + +/*! + Returns the bottom right coordinate of this geo rectangle. +*/ +QGeoCoordinate QGeoRectangle::bottomRight() const +{ + Q_D(const QGeoRectangle); + + return d->bottomRight; +} + +/*! + Sets the center of this geo rectangle to \a center. + + If this causes the geo rectangle to cross on of the poles the height of the + geo rectangle will be truncated such that the geo rectangle only extends up + to the pole. The center of the geo rectangle will be unchanged, and the + height will be adjusted such that the center point is at the center of the + truncated geo rectangle. + +*/ +void QGeoRectangle::setCenter(const QGeoCoordinate ¢er) +{ + Q_D(QGeoRectangle); + + if (!isValid()) { + d->topLeft = center; + d->bottomRight = center; + return; + } + double width = this->width(); + double height = this->height(); + + double tlLat = center.latitude() + height / 2.0; + double tlLon = center.longitude() - width / 2.0; + double brLat = center.latitude() - height / 2.0; + double brLon = center.longitude() + width / 2.0; + tlLon = QLocationUtils::wrapLong(tlLon); + brLon = QLocationUtils::wrapLong(brLon); + + if (tlLat > 90.0) { + brLat = 2 * center.latitude() - 90.0; + tlLat = 90.0; + } + + if (tlLat < -90.0) { + brLat = -90.0; + tlLat = -90.0; + } + + if (brLat > 90.0) { + tlLat = 90.0; + brLat = 90.0; + } + + if (brLat < -90.0) { + tlLat = 2 * center.latitude() + 90.0; + brLat = -90.0; + } + + if (width == 360.0) { + tlLon = -180.0; + brLon = 180.0; + } + + d->topLeft = QGeoCoordinate(tlLat, tlLon); + d->bottomRight = QGeoCoordinate(brLat, brLon); +} + +/*! + Returns the center of this geo rectangle. Equivalent to QGeoShape::center(). +*/ +QGeoCoordinate QGeoRectangle::center() const +{ + Q_D(const QGeoRectangle); + + return d->center(); +} + +/*! + Sets the width of this geo rectangle in degrees to \a degreesWidth. +*/ +void QGeoRectangle::setWidth(double degreesWidth) +{ + if (!isValid()) + return; + + if (degreesWidth < 0.0) + return; + + Q_D(QGeoRectangle); + + if (degreesWidth >= 360.0) { + d->topLeft.setLongitude(-180.0); + d->bottomRight.setLongitude(180.0); + return; + } + + double tlLat = d->topLeft.latitude(); + double brLat = d->bottomRight.latitude(); + + QGeoCoordinate c = center(); + + double tlLon = c.longitude() - degreesWidth / 2.0; + tlLon = QLocationUtils::wrapLong(tlLon); + + double brLon = c.longitude() + degreesWidth / 2.0; + brLon = QLocationUtils::wrapLong(brLon); + + d->topLeft = QGeoCoordinate(tlLat, tlLon); + d->bottomRight = QGeoCoordinate(brLat, brLon); +} + +/*! + Returns the width of this geo rectangle in degrees. + + The return value is undefined if this geo rectangle is invalid. +*/ +double QGeoRectangle::width() const +{ + if (!isValid()) + return qQNaN(); + + Q_D(const QGeoRectangle); + + double result = d->bottomRight.longitude() - d->topLeft.longitude(); + if (result < 0.0) + result += 360.0; + if (result > 360.0) + result -= 360.0; + + return result; +} + +/*! + Sets the height of this geo rectangle in degrees to \a degreesHeight. +*/ +void QGeoRectangle::setHeight(double degreesHeight) +{ + if (!isValid()) + return; + + if (degreesHeight < 0.0) + return; + + if (degreesHeight >= 180.0) { + degreesHeight = 180.0; + } + + Q_D(QGeoRectangle); + + double tlLon = d->topLeft.longitude(); + double brLon = d->bottomRight.longitude(); + + QGeoCoordinate c = center(); + + double tlLat = c.latitude() + degreesHeight / 2.0; + double brLat = c.latitude() - degreesHeight / 2.0; + + if (tlLat > 90.0) { + brLat = 2* c.latitude() - 90.0; + tlLat = 90.0; + } + + if (tlLat < -90.0) { + brLat = -90.0; + tlLat = -90.0; + } + + if (brLat > 90.0) { + tlLat = 90.0; + brLat = 90.0; + } + + if (brLat < -90.0) { + tlLat = 2 * c.latitude() + 90.0; + brLat = -90.0; + } + + d->topLeft = QGeoCoordinate(tlLat, tlLon); + d->bottomRight = QGeoCoordinate(brLat, brLon); +} + +/*! + Returns the height of this geo rectangle in degrees. + + The return value is undefined if this geo rectangle is invalid. +*/ +double QGeoRectangle::height() const +{ + if (!isValid()) + return qQNaN(); + + Q_D(const QGeoRectangle); + + return d->topLeft.latitude() - d->bottomRight.latitude(); +} + +bool QGeoRectanglePrivate::contains(const QGeoCoordinate &coordinate) const +{ + if (!isValid() || !coordinate.isValid()) + return false; + + double left = topLeft.longitude(); + double right = bottomRight.longitude(); + double top = topLeft.latitude(); + double bottom = bottomRight.latitude(); + + double lon = coordinate.longitude(); + double lat = coordinate.latitude(); + + if (lat > top) + return false; + if (lat < bottom) + return false; + + if ((lat == 90.0) && (top == 90.0)) + return true; + + if ((lat == -90.0) && (bottom == -90.0)) + return true; + + if (left <= right) { + if ((lon < left) || (lon > right)) + return false; + } else { + if ((lon < left) && (lon > right)) + return false; + } + + return true; +} + +QGeoCoordinate QGeoRectanglePrivate::center() const +{ + if (!isValid()) + return QGeoCoordinate(); + + double cLat = (topLeft.latitude() + bottomRight.latitude()) / 2.0; + double cLon = (bottomRight.longitude() + topLeft.longitude()) / 2.0; + + if (topLeft.longitude() > bottomRight.longitude()) + cLon = cLon - 180.0; + + cLon = QLocationUtils::wrapLong(cLon); + return QGeoCoordinate(cLat, cLon); +} + +QGeoRectangle QGeoRectanglePrivate::boundingGeoRectangle() const +{ + return QGeoRectangle(topLeft, bottomRight); +} + +/*! + Returns whether the geo rectangle \a rectangle is contained within this + geo rectangle. +*/ +bool QGeoRectangle::contains(const QGeoRectangle &rectangle) const +{ + Q_D(const QGeoRectangle); + + return (d->contains(rectangle.topLeft()) + && d->contains(rectangle.topRight()) + && d->contains(rectangle.bottomLeft()) + && d->contains(rectangle.bottomRight())); +} + +/*! + Returns whether the geo rectangle \a rectangle intersects this geo rectangle. + + If the top or bottom edges of both geo rectangles are at one of the poles + the geo rectangles are considered to be intersecting, since the longitude + is irrelevant when the edges are at the pole. +*/ +bool QGeoRectangle::intersects(const QGeoRectangle &rectangle) const +{ + Q_D(const QGeoRectangle); + + double left1 = d->topLeft.longitude(); + double right1 = d->bottomRight.longitude(); + double top1 = d->topLeft.latitude(); + double bottom1 = d->bottomRight.latitude(); + + double left2 = rectangle.d_func()->topLeft.longitude(); + double right2 = rectangle.d_func()->bottomRight.longitude(); + double top2 = rectangle.d_func()->topLeft.latitude(); + double bottom2 = rectangle.d_func()->bottomRight.latitude(); + + if (top1 < bottom2) + return false; + + if (bottom1 > top2) + return false; + + if ((top1 == 90.0) && (top1 == top2)) + return true; + + if ((bottom1 == -90.0) && (bottom1 == bottom2)) + return true; + + if (left1 < right1) { + if (left2 < right2) { + if ((left1 > right2) || (right1 < left2)) + return false; + } else { + if ((left1 > right2) && (right1 < left2)) + return false; + } + } else { + if (left2 < right2) { + if ((left2 > right1) && (right2 < left1)) + return false; + } else { + // if both wrap then they have to intersect + } + } + + return true; +} + +/*! + Translates this geo rectangle by \a degreesLatitude northwards and \a + degreesLongitude eastwards. + + Negative values of \a degreesLatitude and \a degreesLongitude correspond to + southward and westward translation respectively. + + If the translation would have caused the geo rectangle to cross a pole the + geo rectangle will be translated until the top or bottom edge of the geo rectangle + touches the pole but not further. +*/ +void QGeoRectangle::translate(double degreesLatitude, double degreesLongitude) +{ + // TODO handle dlat, dlon larger than 360 degrees + + Q_D(QGeoRectangle); + + double tlLat = d->topLeft.latitude(); + double tlLon = d->topLeft.longitude(); + double brLat = d->bottomRight.latitude(); + double brLon = d->bottomRight.longitude(); + + if (degreesLatitude >= 0.0) + degreesLatitude = qMin(degreesLatitude, 90.0 - tlLat); + else + degreesLatitude = qMax(degreesLatitude, -90.0 - brLat); + + if ( (tlLon != -180.0) || (brLon != 180.0) ) { + tlLon = QLocationUtils::wrapLong(tlLon + degreesLongitude); + brLon = QLocationUtils::wrapLong(brLon + degreesLongitude); + } + + tlLat += degreesLatitude; + brLat += degreesLatitude; + + d->topLeft = QGeoCoordinate(tlLat, tlLon); + d->bottomRight = QGeoCoordinate(brLat, brLon); +} + +/*! + Returns a copy of this geo rectangle translated by \a degreesLatitude northwards and \a + degreesLongitude eastwards. + + Negative values of \a degreesLatitude and \a degreesLongitude correspond to + southward and westward translation respectively. + + \sa translate() +*/ +QGeoRectangle QGeoRectangle::translated(double degreesLatitude, double degreesLongitude) const +{ + QGeoRectangle result(*this); + result.translate(degreesLatitude, degreesLongitude); + return result; +} + +/*! + Extends the geo rectangle to also cover the coordinate \a coordinate + + \since 5.9 +*/ +void QGeoRectangle::extendRectangle(const QGeoCoordinate &coordinate) +{ + Q_D(QGeoRectangle); + d->extendRectangle(coordinate); +} + +/*! + Returns the smallest geo rectangle which contains both this geo rectangle and \a rectangle. + + If the centers of the two geo rectangles are separated by exactly 180.0 degrees then the + width is set to 360.0 degrees with the leftmost longitude set to -180.0 degrees and the + rightmost longitude set to 180.0 degrees. This is done to ensure that the result is + independent of the order of the operands. + +*/ +QGeoRectangle QGeoRectangle::united(const QGeoRectangle &rectangle) const +{ + QGeoRectangle result(*this); + if (rectangle.isValid()) + result |= rectangle; + return result; +} + +/*! + Extends the rectangle in the smallest possible way to include \a coordinate in + the shape. + + Both the rectangle and coordinate needs to be valid. If the rectangle already covers + the coordinate noting happens. + +*/ +void QGeoRectanglePrivate::extendRectangle(const QGeoCoordinate &coordinate) +{ + if (!isValid() || !coordinate.isValid() || contains(coordinate)) + return; + + double left = topLeft.longitude(); + double right = bottomRight.longitude(); + double top = topLeft.latitude(); + double bottom = bottomRight.latitude(); + + double inputLat = coordinate.latitude(); + double inputLon = coordinate.longitude(); + + top = qMax(top, inputLat); + bottom = qMin(bottom, inputLat); + + bool wrap = left > right; + + if (wrap && inputLon > right && inputLon < left) { + if (qAbs(left - inputLon) < qAbs(right - inputLon)) + left = inputLon; + else + right = inputLon; + } else if (!wrap) { + if (inputLon < left) { + if (360 - (right - inputLon) < left - inputLon) + right = inputLon; + else + left = inputLon; + } else if (inputLon > right) { + if (360 - (inputLon - left) < inputLon - right) + left = inputLon; + else + right = inputLon; + } + } + topLeft = QGeoCoordinate(top, left); + bottomRight = QGeoCoordinate(bottom, right); +} + +/*! + \fn QGeoRectangle QGeoRectangle::operator|(const QGeoRectangle &rectangle) const + + Returns the smallest geo rectangle which contains both this geo rectangle and \a rectangle. + + If the centers of the two geo rectangles are separated by exactly 180.0 degrees then the + width is set to 360.0 degrees with the leftmost longitude set to -180.0 degrees and the + rightmost longitude set to 180.0 degrees. This is done to ensure that the result is + independent of the order of the operands. + +*/ + +/*! + Returns the smallest geo rectangle which contains both this geo rectangle and \a rectangle. + + If the centers of the two geo rectangles are separated by exactly 180.0 degrees then the + width is set to 360.0 degrees with the leftmost longitude set to -180.0 degrees and the + rightmost longitude set to 180.0 degrees. This is done to ensure that the result is + independent of the order of the operands. + +*/ +QGeoRectangle &QGeoRectangle::operator|=(const QGeoRectangle &rectangle) +{ + // If non-intersecting goes for most narrow box + + Q_D(QGeoRectangle); + + double top = qMax(d->topLeft.latitude(), rectangle.d_func()->topLeft.latitude()); + double bottom = qMin(d->bottomRight.latitude(), rectangle.d_func()->bottomRight.latitude()); + + QGeoRectangle candidate( + {top, d->topLeft.longitude()}, + {bottom, rectangle.d_func()->bottomRight.longitude()} + ); + QGeoRectangle otherCandidate( + {top, rectangle.d_func()->topLeft.longitude()}, + {bottom, d->bottomRight.longitude()} + ); + double unwrappedWidth = (candidate.width() < rectangle.width() ? 360 : 0) + candidate.width(); + double otherUnwrappedWidth = (otherCandidate.width() < width() ? 360 : 0) + otherCandidate.width(); + if (otherUnwrappedWidth < unwrappedWidth) { + candidate = otherCandidate; + unwrappedWidth = otherUnwrappedWidth; + } + if (360 <= unwrappedWidth) { + candidate.d_func()->topLeft.setLongitude(-180.0); + candidate.d_func()->bottomRight.setLongitude(180.0); + } + + candidate = (candidate.width() < width() ? *this : candidate); + candidate = (candidate.width() < rectangle.width() ? rectangle : candidate); + + double middle1 = center().longitude(); + double middle2 = rectangle.center().longitude(); + if ((middle1 <= middle2 ? 0 : 360) + middle2 - middle1 == 180) { + candidate.d_func()->topLeft.setLongitude(-180.0); + candidate.d_func()->bottomRight.setLongitude(180.0); + } + + *this = candidate; + this->d_func()->topLeft.setLatitude(top); + this->d_func()->bottomRight.setLatitude(bottom); + + return *this; +} + +/*! + Returns the geo rectangle properties as a string. + + \since 5.5 +*/ +QString QGeoRectangle::toString() const +{ + if (type() != QGeoShape::RectangleType) { + qWarning("Not a rectangle a %d\n", type()); + return QStringLiteral("QGeoRectangle(not a rectangle)"); + } + + return QStringLiteral("QGeoRectangle({%1, %2}, {%3, %4})") + .arg(topLeft().latitude()) + .arg(topLeft().longitude()) + .arg(bottomRight().latitude()) + .arg(bottomRight().longitude()); +} + +/******************************************************************************* +*******************************************************************************/ + +QGeoRectanglePrivate::QGeoRectanglePrivate() +: QGeoShapePrivate(QGeoShape::RectangleType) +{ +} + +QGeoRectanglePrivate::QGeoRectanglePrivate(const QGeoCoordinate &topLeft, + const QGeoCoordinate &bottomRight) +: QGeoShapePrivate(QGeoShape::RectangleType), topLeft(topLeft), bottomRight(bottomRight) +{ +} + +QGeoRectanglePrivate::QGeoRectanglePrivate(const QGeoRectanglePrivate &other) +: QGeoShapePrivate(QGeoShape::RectangleType), topLeft(other.topLeft), + bottomRight(other.bottomRight) +{ +} + +QGeoRectanglePrivate::~QGeoRectanglePrivate() {} + +QGeoShapePrivate *QGeoRectanglePrivate::clone() const +{ + return new QGeoRectanglePrivate(*this); +} + +bool QGeoRectanglePrivate::operator==(const QGeoShapePrivate &other) const +{ + if (!QGeoShapePrivate::operator==(other)) + return false; + + const QGeoRectanglePrivate &otherBox = static_cast(other); + + return topLeft == otherBox.topLeft && bottomRight == otherBox.bottomRight; +} + +size_t QGeoRectanglePrivate::hash(size_t seed) const +{ + return qHashMulti(seed, topLeft, bottomRight); +} + +QT_END_NAMESPACE + +#include "moc_qgeorectangle.cpp" diff --git a/src/positioning/qgeorectangle.h b/src/positioning/qgeorectangle.h new file mode 100644 index 0000000..7044c0b --- /dev/null +++ b/src/positioning/qgeorectangle.h @@ -0,0 +1,98 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEORECTANGLE_H +#define QGEORECTANGLE_H + +#include + +QT_BEGIN_NAMESPACE + +class QGeoRectanglePrivate; + +class Q_POSITIONING_EXPORT QGeoRectangle : public QGeoShape +{ + Q_GADGET + Q_PROPERTY(QGeoCoordinate bottomLeft READ bottomLeft WRITE setBottomLeft) + Q_PROPERTY(QGeoCoordinate bottomRight READ bottomRight WRITE setBottomRight) + Q_PROPERTY(QGeoCoordinate topLeft READ topLeft WRITE setTopLeft) + Q_PROPERTY(QGeoCoordinate topRight READ topRight WRITE setTopRight) + Q_PROPERTY(QGeoCoordinate center READ center WRITE setCenter) + Q_PROPERTY(double height READ height WRITE setHeight) + Q_PROPERTY(double width READ width WRITE setWidth) + +public: + QGeoRectangle(); + QGeoRectangle(const QGeoCoordinate ¢er, double degreesWidth, double degreesHeight); + QGeoRectangle(const QGeoCoordinate &topLeft, const QGeoCoordinate &bottomRight); + QGeoRectangle(const QList &coordinates); + QGeoRectangle(const QGeoRectangle &other); + QGeoRectangle(const QGeoShape &other); + + ~QGeoRectangle(); + + QGeoRectangle &operator=(const QGeoRectangle &other); + + void setTopLeft(const QGeoCoordinate &topLeft); + QGeoCoordinate topLeft() const; + + void setTopRight(const QGeoCoordinate &topRight); + QGeoCoordinate topRight() const; + + void setBottomLeft(const QGeoCoordinate &bottomLeft); + QGeoCoordinate bottomLeft() const; + + void setBottomRight(const QGeoCoordinate &bottomRight); + QGeoCoordinate bottomRight() const; + + void setCenter(const QGeoCoordinate ¢er); + QGeoCoordinate center() const; + + void setWidth(double degreesWidth); + double width() const; + + void setHeight(double degreesHeight); + double height() const; + + using QGeoShape::contains; + bool contains(const QGeoRectangle &rectangle) const; + Q_INVOKABLE bool intersects(const QGeoRectangle &rectangle) const; + + Q_INVOKABLE void translate(double degreesLatitude, double degreesLongitude); + Q_INVOKABLE QGeoRectangle translated(double degreesLatitude, double degreesLongitude) const; + Q_INVOKABLE void extendRectangle(const QGeoCoordinate &coordinate); + + Q_INVOKABLE QGeoRectangle united(const QGeoRectangle &rectangle) const; + QGeoRectangle operator|(const QGeoRectangle &rectangle) const; + QGeoRectangle &operator|=(const QGeoRectangle &rectangle); + + Q_INVOKABLE QString toString() const; + +private: + inline QGeoRectanglePrivate *d_func(); + inline const QGeoRectanglePrivate *d_func() const; + +#ifndef QT_NO_DATASTREAM + friend QDataStream &operator<<(QDataStream &stream, const QGeoRectangle &rectangle) + { + return stream << static_cast(rectangle); + } + friend QDataStream &operator>>(QDataStream &stream, QGeoRectangle &rectangle) + { + return stream >> static_cast(rectangle); + } +#endif +}; + +Q_DECLARE_TYPEINFO(QGeoRectangle, Q_RELOCATABLE_TYPE); + +inline QGeoRectangle QGeoRectangle::operator|(const QGeoRectangle &rectangle) const +{ + return united(rectangle); +} + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN(QGeoRectangle, Q_POSITIONING_EXPORT) + +#endif diff --git a/src/positioning/qgeorectangle_p.h b/src/positioning/qgeorectangle_p.h new file mode 100644 index 0000000..c4e4fe3 --- /dev/null +++ b/src/positioning/qgeorectangle_p.h @@ -0,0 +1,53 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEORECTANGLE_P_H +#define QGEORECTANGLE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qgeoshape_p.h" +#include "qgeocoordinate.h" + +QT_BEGIN_NAMESPACE + +class QGeoRectanglePrivate : public QGeoShapePrivate +{ +public: + QGeoRectanglePrivate(); + QGeoRectanglePrivate(const QGeoCoordinate &topLeft, const QGeoCoordinate &bottomRight); + QGeoRectanglePrivate(const QGeoRectanglePrivate &other); + ~QGeoRectanglePrivate(); + + bool isValid() const override; + bool isEmpty() const override; + bool contains(const QGeoCoordinate &coordinate) const override; + + QGeoCoordinate center() const override; + + QGeoRectangle boundingGeoRectangle() const override; + + void extendRectangle(const QGeoCoordinate &coordinate); + + QGeoShapePrivate *clone() const override; + + bool operator==(const QGeoShapePrivate &other) const override; + + size_t hash(size_t seed) const override; + + QGeoCoordinate topLeft; + QGeoCoordinate bottomRight; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qgeosatelliteinfo.cpp b/src/positioning/qgeosatelliteinfo.cpp new file mode 100644 index 0000000..6965074 --- /dev/null +++ b/src/positioning/qgeosatelliteinfo.cpp @@ -0,0 +1,401 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#include "qgeosatelliteinfo.h" +#include "private/qgeosatelliteinfo_p.h" + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN(QGeoSatelliteInfo) + +/*! + \class QGeoSatelliteInfo + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \ingroup shared + \since 5.2 + + \brief The QGeoSatelliteInfo class contains basic information about a satellite. + + \sa QGeoSatelliteInfoSource +*/ + +/*! + \enum QGeoSatelliteInfo::Attribute + Defines the attributes for the satellite information. + \value Elevation The elevation of the satellite, in degrees. + \value Azimuth The azimuth to true north, in degrees. +*/ + +/*! + \enum QGeoSatelliteInfo::SatelliteSystem + Defines the GNSS system of the satellite. + \value Undefined Not defined. + \value GPS Global Positioning System (USA). + \value GLONASS Global Positioning System (Russia). + \value GALILEO Global navigation satellite system (EU). + \value BEIDOU BeiDou navigation satellite system (China). + \value QZSS Quasi-Zenith Satellite System (Japan). + \value Multiple This type normally indicates that the information is + received from a device that supports multiple satellite systems, and + the satellite system is not explicitly specified. Depending on the + data source, you might use other information to determine the actual + system type. One example of the usage of this type is an NMEA $GNGSA + message, which contains the IDs of the satellites being used, but + does not explicitly mention their system types. + \value CustomType The first type that can be used for user purposes. For + example when reimplementing NMEA data parsing in + \l QNmeaSatelliteInfoSource. User can add more types using + \c {CustomType + 1}, \c {CustomType + 2} and so on. +*/ + +/*! + Creates a satellite information object. +*/ +QGeoSatelliteInfo::QGeoSatelliteInfo() + : d(new QGeoSatelliteInfoPrivate) +{ + d->signal = -1; + d->satId = -1; + d->system = QGeoSatelliteInfo::Undefined; +} + +/*! + Creates a satellite information object with the values of \a other. +*/ + +QGeoSatelliteInfo::QGeoSatelliteInfo(const QGeoSatelliteInfo &other) + : d(other.d) +{ +} + +QGeoSatelliteInfo::QGeoSatelliteInfo(QGeoSatelliteInfoPrivate &dd) : d(&dd) +{ +} + +/*! + \fn QGeoSatelliteInfo::QGeoSatelliteInfo(QGeoSatelliteInfo &&other) noexcept + \since 6.2 + + Creates a satellite information object by moving from \a other. + + Note that a moved-from QGeoSatelliteInfo can only be destroyed or + assigned to. The effect of calling other functions than the destructor + or one of the assignment operators is undefined. +*/ + +/*! + Destroys a satellite information object. +*/ +QGeoSatelliteInfo::~QGeoSatelliteInfo() +{ +} + +QT_DEFINE_QESDP_SPECIALIZATION_DTOR(QGeoSatelliteInfoPrivate) + +/*! + Assigns the values from \a other to this object. +*/ +QGeoSatelliteInfo &QGeoSatelliteInfo::operator=(const QGeoSatelliteInfo & other) +{ + if (this == &other) + return *this; + + d = other.d; + return *this; +} + +/*! + \fn QGeoSatelliteInfo &QGeoSatelliteInfo::operator=(QGeoSatelliteInfo &&other) noexcept + \since 6.2 + + Move-assigns the value from \a other to this object + + Note that a moved-from QGeoSatelliteInfo can only be destroyed or + assigned to. The effect of calling other functions than the destructor + or one of the assignment operators is undefined. +*/ + +/*! + \fn bool QGeoSatelliteInfo::operator==(const QGeoSatelliteInfo &lhs, const QGeoSatelliteInfo &rhs) + + Returns \c true if all the parameters of the \a lhs satellite are the same + as those of \a rhs. Otherwise returns \c false. +*/ + +/*! + \fn bool QGeoSatelliteInfo::operator!=(const QGeoSatelliteInfo &lhs, const QGeoSatelliteInfo &rhs) + + Returns \c true if any of the parameters of the \a lhs satellite are not + the same as those of \a rhs. Otherwise returns \c false. +*/ + +/*! + Sets the Satellite System (GPS, GLONASS, ...) to \a system. +*/ +void QGeoSatelliteInfo::setSatelliteSystem(SatelliteSystem system) +{ + d.detach(); + d->system = system; +} + +/*! + Returns the Satellite System (GPS, GLONASS, ...) + + \note This value can be used together with \l satelliteIdentifier() + to uniquely identify a satellite. + + \sa satelliteIdentifier() +*/ +QGeoSatelliteInfo::SatelliteSystem QGeoSatelliteInfo::satelliteSystem() const +{ + return d->system; +} + +/*! + Sets the satellite identifier number to \a satId. + + The satellite identifier number can be used to identify a satellite within + the satellite system. + + The actual value may vary, depending on the platform and the selected + backend. + + For example, if \e nmea plugin is used, the satellite identifier for GPS + satellite system represents the PRN (Pseudo-random noise) number, and the + satellite identifier for GLONASS satellite system represents the slot + number. +*/ +void QGeoSatelliteInfo::setSatelliteIdentifier(int satId) +{ + d.detach(); + d->satId = satId; +} + +/*! + Returns the satellite identifier number. + + The satellite identifier number can be used to identify a satellite within + the satellite system. + + The actual value may vary, depending on the platform and the selected + backend. + + For example, if \e nmea plugin is used, the satellite identifier for GPS + satellite system represents the PRN (Pseudo-random noise) number, and the + satellite identifier for GLONASS satellite system represents the slot + number. + + For NMEA-based backends the satellite identifier can be used to determine + the satellite system type if it is not available from other sources. + You can refer to \l {https://gpsd.gitlab.io/gpsd/NMEA.html#_satellite_ids} + {satellite IDs list} to check the ID ranges for different satellite systems. + + \note Depending on the platform and the selected backend, the satellite + identifier ranges for different satellite systems may intersect. To uniquely + identify a satellite, a combination of satelliteIndetifier() and + \l satelliteSystem() must be used. + + \sa satelliteSystem() +*/ +int QGeoSatelliteInfo::satelliteIdentifier() const +{ + return d->satId; +} + +/*! + Sets the signal strength to \a signalStrength, in decibels. +*/ +void QGeoSatelliteInfo::setSignalStrength(int signalStrength) +{ + d.detach(); + d->signal = signalStrength; +} + +/*! + Returns the signal strength, or -1 if the value has not been set. +*/ +int QGeoSatelliteInfo::signalStrength() const +{ + return d->signal; +} + +/*! + Sets the value for \a attribute to \a value. +*/ +void QGeoSatelliteInfo::setAttribute(Attribute attribute, qreal value) +{ + d.detach(); + d->doubleAttribs[int(attribute)] = value; +} + +/*! + Returns the value of the specified \a attribute as a qreal value. + + Returns -1 if the value has not been set. + + \sa hasAttribute(), setAttribute() +*/ +qreal QGeoSatelliteInfo::attribute(Attribute attribute) const +{ + if (d->doubleAttribs.contains(int(attribute))) + return d->doubleAttribs[int(attribute)]; + return -1; +} + +/*! + Removes the specified \a attribute and its value. +*/ +void QGeoSatelliteInfo::removeAttribute(Attribute attribute) +{ + d.detach(); + d->doubleAttribs.remove(int(attribute)); +} + +/*! + Returns true if the specified \a attribute is present in this update. +*/ +bool QGeoSatelliteInfo::hasAttribute(Attribute attribute) const +{ + return d->doubleAttribs.contains(int(attribute)); +} + +/*! + \internal +*/ +void QGeoSatelliteInfo::detach() +{ + if (d) + d.detach(); + else + d = new QGeoSatelliteInfoPrivate; +} + +bool QGeoSatelliteInfo::equals(const QGeoSatelliteInfo &lhs, const QGeoSatelliteInfo &rhs) +{ + return *lhs.d == *rhs.d; +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug QGeoSatelliteInfo::debugStreaming(QDebug dbg, const QGeoSatelliteInfo &info) +{ + QDebugStateSaver saver(dbg); + dbg.nospace() << "QGeoSatelliteInfo(system=" << info.d->system; + dbg << ", satId=" << info.d->satId; + dbg << ", signal-strength=" << info.d->signal; + + + QList attribs = info.d->doubleAttribs.keys(); + for (int i = 0; i < attribs.size(); ++i) { + dbg << ", "; + switch (attribs[i]) { + case QGeoSatelliteInfo::Elevation: + dbg << "Elevation="; + break; + case QGeoSatelliteInfo::Azimuth: + dbg << "Azimuth="; + break; + } + dbg << info.d->doubleAttribs[attribs[i]]; + } + dbg << ')'; + return dbg; +} +#endif // QT_NO_DEBUG_STREAM + +#ifndef QT_NO_DATASTREAM +/*! + \fn QDataStream &QGeoSatelliteInfo::operator<<(QDataStream &stream, const QGeoSatelliteInfo &info) + + Writes the given \a info to the specified \a stream. + + \sa {Serializing Qt Data Types} + +*/ + +QDataStream &QGeoSatelliteInfo::dataStreamOut(QDataStream &stream, const QGeoSatelliteInfo &info) +{ + stream << info.d->signal; + stream << info.d->doubleAttribs; + stream << info.d->satId; + stream << int(info.d->system); + return stream; +} +#endif // QT_NO_DATASTREAM + +#ifndef QT_NO_DATASTREAM +/*! + \fn QDataStream &QGeoSatelliteInfo::operator>>(QDataStream &stream, QGeoSatelliteInfo &info) + + Reads satellite information from the specified \a stream into the given + \a info. + + \sa {Serializing Qt Data Types} +*/ + +QDataStream &QGeoSatelliteInfo::dataStreamIn(QDataStream &stream, QGeoSatelliteInfo &info) +{ + int system; + stream >> info.d->signal; + stream >> info.d->doubleAttribs; + stream >> info.d->satId; + stream >> system; + info.d->system = (QGeoSatelliteInfo::SatelliteSystem)system; + return stream; +} +#endif // QT_NO_DATASTREAM + +QGeoSatelliteInfoPrivate::QGeoSatelliteInfoPrivate() : QSharedData() +{ + +} + +QGeoSatelliteInfoPrivate::QGeoSatelliteInfoPrivate(const QGeoSatelliteInfoPrivate &other) + : QSharedData(other) +{ + signal = other.signal; + satId = other.satId; + system = other.system; + doubleAttribs = other.doubleAttribs; +} + +QGeoSatelliteInfoPrivate::~QGeoSatelliteInfoPrivate() {} + +bool QGeoSatelliteInfoPrivate::operator==(const QGeoSatelliteInfoPrivate &other) const +{ + return signal == other.signal + && satId == other.satId + && system == other.system + && doubleAttribs == other.doubleAttribs; +} + +QGeoSatelliteInfoPrivate *QGeoSatelliteInfoPrivate::get(const QGeoSatelliteInfo &info) +{ + return info.d.data(); +} + +size_t qHash(const QGeoSatelliteInfo &key, size_t seed) noexcept +{ + // Other properties and attributes might change + return qHashMulti(seed, key.d->satId, key.d->system); +} + +namespace QTest +{ + +char *toString(const QGeoSatelliteInfo &info) +{ + QString result; + QDebug dbg(&result); + dbg << info; + + return qstrdup(qPrintable(result)); +} + +} + + +QT_END_NAMESPACE diff --git a/src/positioning/qgeosatelliteinfo.h b/src/positioning/qgeosatelliteinfo.h new file mode 100644 index 0000000..8b4ea8f --- /dev/null +++ b/src/positioning/qgeosatelliteinfo.h @@ -0,0 +1,125 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QGEOSATELLITEINFO_H +#define QGEOSATELLITEINFO_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QDebug; +class QDataStream; + +class QGeoSatelliteInfo; +Q_POSITIONING_EXPORT size_t qHash(const QGeoSatelliteInfo &key, size_t seed = 0) noexcept; +namespace QTest +{ + +Q_POSITIONING_EXPORT char *toString(const QGeoSatelliteInfo &info); + +} // namespace QTest + +class QGeoSatelliteInfoPrivate; +QT_DECLARE_QESDP_SPECIALIZATION_DTOR_WITH_EXPORT(QGeoSatelliteInfoPrivate, Q_POSITIONING_EXPORT) + +class Q_POSITIONING_EXPORT QGeoSatelliteInfo +{ + Q_GADGET + Q_PROPERTY(SatelliteSystem satelliteSystem READ satelliteSystem FINAL) + Q_PROPERTY(int satelliteIdentifier READ satelliteIdentifier FINAL) + Q_PROPERTY(qreal signalStrength READ signalStrength FINAL) + +public: + enum Attribute { + Elevation, + Azimuth + }; + Q_ENUM(Attribute) + + enum SatelliteSystem { + Undefined = 0x00, + GPS = 0x01, + GLONASS = 0x02, + GALILEO = 0x03, + BEIDOU = 0x04, + QZSS = 0x05, + Multiple = 0xFF, + CustomType = 0x100 + }; + Q_ENUM(SatelliteSystem) + + QGeoSatelliteInfo(); + QGeoSatelliteInfo(const QGeoSatelliteInfo &other); + QGeoSatelliteInfo(QGeoSatelliteInfoPrivate &dd); + QGeoSatelliteInfo(QGeoSatelliteInfo &&other) noexcept = default; + ~QGeoSatelliteInfo(); + + QGeoSatelliteInfo &operator=(const QGeoSatelliteInfo &other); + QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QGeoSatelliteInfo) + + void swap(QGeoSatelliteInfo &other) noexcept { d.swap(other.d); } + + friend bool operator==(const QGeoSatelliteInfo &lhs, const QGeoSatelliteInfo &rhs) + { + return equals(lhs, rhs); + } + friend bool operator!=(const QGeoSatelliteInfo &lhs, const QGeoSatelliteInfo &rhs) + { + return !equals(lhs, rhs); + } + + void setSatelliteSystem(SatelliteSystem system); + SatelliteSystem satelliteSystem() const; + + void setSatelliteIdentifier(int satId); + int satelliteIdentifier() const; + + void setSignalStrength(int signalStrength); + int signalStrength() const; + + void setAttribute(Attribute attribute, qreal value); + Q_INVOKABLE qreal attribute(Attribute attribute) const; + void removeAttribute(Attribute attribute); + + Q_INVOKABLE bool hasAttribute(Attribute attribute) const; + + void detach(); + +private: + static bool equals(const QGeoSatelliteInfo &lhs, const QGeoSatelliteInfo &rhs); +#ifndef QT_NO_DEBUG_STREAM + friend QDebug operator<<(QDebug dbg, const QGeoSatelliteInfo &info) + { + return debugStreaming(dbg, info); + } + static QDebug debugStreaming(QDebug dbg, const QGeoSatelliteInfo &info); +#endif +#ifndef QT_NO_DATASTREAM + friend QDataStream &operator<<(QDataStream &stream, const QGeoSatelliteInfo &info) + { + return dataStreamOut(stream, info); + } + friend QDataStream &operator>>(QDataStream &stream, QGeoSatelliteInfo &info) + { + return dataStreamIn(stream, info); + } + static QDataStream &dataStreamOut(QDataStream &stream, const QGeoSatelliteInfo &info); + static QDataStream &dataStreamIn(QDataStream &stream, QGeoSatelliteInfo &info); +#endif + QExplicitlySharedDataPointer d; + friend class QGeoSatelliteInfoPrivate; + + friend Q_POSITIONING_EXPORT size_t qHash(const QGeoSatelliteInfo &key, size_t seed) noexcept; + friend Q_POSITIONING_EXPORT char *QTest::toString(const QGeoSatelliteInfo &info); +}; + +Q_DECLARE_SHARED(QGeoSatelliteInfo) + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN(QGeoSatelliteInfo, Q_POSITIONING_EXPORT) + +#endif diff --git a/src/positioning/qgeosatelliteinfo_p.h b/src/positioning/qgeosatelliteinfo_p.h new file mode 100644 index 0000000..ebb75ec --- /dev/null +++ b/src/positioning/qgeosatelliteinfo_p.h @@ -0,0 +1,41 @@ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOSATELLITEINFO_P_H +#define QGEOSATELLITEINFO_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoSatelliteInfoPrivate : public QSharedData +{ +public: + QGeoSatelliteInfoPrivate(); + QGeoSatelliteInfoPrivate(const QGeoSatelliteInfoPrivate &other); + virtual ~QGeoSatelliteInfoPrivate(); + bool operator==(const QGeoSatelliteInfoPrivate &other) const; + static QGeoSatelliteInfoPrivate *get(const QGeoSatelliteInfo &info); + + int signal; + int satId; + QGeoSatelliteInfo::SatelliteSystem system; + QHash doubleAttribs; +}; + +QT_END_NAMESPACE + +#endif // QGEOSATELLITEINFO_P_H diff --git a/src/positioning/qgeosatelliteinfosource.cpp b/src/positioning/qgeosatelliteinfosource.cpp new file mode 100644 index 0000000..c204172 --- /dev/null +++ b/src/positioning/qgeosatelliteinfosource.cpp @@ -0,0 +1,390 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#include +#include +#include "qgeopositioninfosourcefactory.h" +#include "qgeopositioninfosource_p.h" +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +/*! + \class QGeoSatelliteInfoSource + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \since 5.2 + + \brief The QGeoSatelliteInfoSource class is an abstract base class for the distribution of satellite information updates. + + The static function QGeoSatelliteInfoSource::createDefaultSource() creates a default + satellite data source that is appropriate for the platform, if one is + available. Otherwise, available QGeoPositionInfoSourceFactory plugins will + be checked for one that has a satellite data source available. + + Call startUpdates() and stopUpdates() to start and stop regular updates, + or requestUpdate() to request a single update. + When an update is available, satellitesInViewUpdated() and/or + satellitesInUseUpdated() will be emitted. + + If regular satellite updates are required, setUpdateInterval() can be used + to specify how often these updates should be emitted. If no interval is + specified, updates are simply provided whenever they are available. + For example: + + \code + // Emit updates every 10 seconds if available + QGeoSatelliteInfoSource *source = QGeoSatelliteInfoSource::createDefaultSource(0); + if (source) + source->setUpdateInterval(10000); + \endcode + + To remove an update interval that was previously set, call + setUpdateInterval() with a value of 0. + + \note The satellite source may have a minimum value requirement for + update intervals, as returned by minimumUpdateInterval(). + + \note To use this class from Android service, see + \l {Qt Positioning on Android}. +*/ + +/*! + Creates a satellite source with the specified \a parent. +*/ + +QGeoSatelliteInfoSourcePrivate::~QGeoSatelliteInfoSourcePrivate() +{ + +} + +QGeoSatelliteInfoSource::QGeoSatelliteInfoSource(QObject *parent) + : QObject(*new QGeoSatelliteInfoSourcePrivate, parent) +{ +} + +QGeoSatelliteInfoSource::QGeoSatelliteInfoSource(QGeoSatelliteInfoSourcePrivate &dd, QObject *parent) + : QObject(dd, parent) +{ + +} + +/*! + Destroys the satellite source. +*/ +QGeoSatelliteInfoSource::~QGeoSatelliteInfoSource() +{ +} + +/*! + Returns the unique name of the satellite source implementation in use. + + This is the same name that can be passed to createSource() in order to + create a new instance of a particular satellite source implementation. +*/ +QString QGeoSatelliteInfoSource::sourceName() const +{ + Q_D(const QGeoSatelliteInfoSource); + return d->providerName; +} + + +/*! + \property QGeoSatelliteInfoSource::updateInterval + \brief This property holds the requested interval in milliseconds between each update. + + If the update interval is not set (or is set to 0) the + source will provide updates as often as necessary. + + If the update interval is set, the source will provide updates at an + interval as close to the requested interval as possible. If the requested + interval is less than the minimumUpdateInterval(), + the minimum interval is used instead. + + Changes to the update interval will happen as soon as is practical, however the + time the change takes may vary between implementations. Whether or not the elapsed + time from the previous interval is counted as part of the new interval is also + implementation dependent. + + The default value for this property is 0. + + \note Subclass implementations must call the base implementation of + setUpdateInterval() so that updateInterval() returns the correct value. +*/ +void QGeoSatelliteInfoSource::setUpdateInterval(int msec) +{ + Q_D(QGeoSatelliteInfoSource); + d->interval = msec; +} + +int QGeoSatelliteInfoSource::updateInterval() const +{ + Q_D(const QGeoSatelliteInfoSource); + return d->interval.value(); +} + +QBindable QGeoSatelliteInfoSource::bindableUpdateInterval() +{ + Q_D(QGeoSatelliteInfoSource); + return QBindable(&d->interval); +} + +/*! + \since 6.2 + Sets the backend-specific property named \a name to \a value. + Returns \c true on success, \c false otherwise. + Backend-specific properties can be used to configure the satellite info + subsystem behavior at runtime. + + \sa backendProperty +*/ +bool QGeoSatelliteInfoSource::setBackendProperty(const QString &name, const QVariant &value) +{ + Q_UNUSED(name) + Q_UNUSED(value) + return false; +} + +/*! + \since 6.2 + Returns the value of the backend-specific property named \a name, + if present. Otherwise the returned value will be invalid. + + \sa setBackendProperty +*/ +QVariant QGeoSatelliteInfoSource::backendProperty(const QString &name) const +{ + Q_UNUSED(name) + return QVariant(); +} + +QGeoSatelliteInfoSource *QGeoSatelliteInfoSourcePrivate::createSourceReal(const QCborMap &meta, const QVariantMap ¶meters, QObject *parent) +{ + QGeoSatelliteInfoSource *s = nullptr; + auto factory = QGeoPositionInfoSourcePrivate::loadFactory(meta); + if (factory) + s = factory->satelliteInfoSource(parent, parameters); + if (s) + s->d_func()->providerName = meta.value(QStringLiteral("Provider")).toString(); + + return s; +} + +/*! + Creates and returns a source with the specified \a parent that reads + from the system's default source of satellite update information, or the + highest priority available plugin. + + Returns \c nullptr if the system has no default satellite source, no valid + plugins could be found or the user does not have the permission to access + the satellite data. +*/ +QGeoSatelliteInfoSource *QGeoSatelliteInfoSource::createDefaultSource(QObject *parent) +{ + return createDefaultSource(QVariantMap(), parent); +} + +/*! + Creates and returns a source with the given \a parent, + by loading the plugin named \a sourceName. + + Returns \c nullptr if the plugin cannot be found. +*/ +QGeoSatelliteInfoSource *QGeoSatelliteInfoSource::createSource(const QString &sourceName, QObject *parent) +{ + return createSource(sourceName, QVariantMap(), parent); +} + +/*! + Creates and returns a satellite source with the given \a parent that + reads from the system's default sources of satellite data, or the plugin + with the highest available priority. + + Returns \c nullptr if the system has no default satellite source, no valid + plugins could be found or the user does not have the permission to access + the satellite information. + + This method passes \a parameters to the factory to configure the source. + + \since Qt 5.14 +*/ +QGeoSatelliteInfoSource *QGeoSatelliteInfoSource::createDefaultSource(const QVariantMap ¶meters, QObject *parent) +{ + const QList plugins = QGeoPositionInfoSourcePrivate::pluginsSorted(); + for (const QCborMap &obj : plugins) { + if (obj.value(QStringLiteral("Satellite")).isBool() + && obj.value(QStringLiteral("Satellite")).toBool()) + { + const QString testableKey = QStringLiteral("Testable"); + if (obj.contains(testableKey) && !obj.value(testableKey).toBool()) { + static bool inTest = qEnvironmentVariableIsSet("QT_QTESTLIB_RUNNING"); + if (inTest) + continue; + } + return QGeoSatelliteInfoSourcePrivate::createSourceReal(obj, parameters, parent); + } + } + + return nullptr; +} + +/*! + Creates and returns a satellite source with the given \a parent, + by loading the plugin named \a sourceName. + + Returns \c nullptr if the plugin cannot be found. + + This method passes \a parameters to the factory to configure the source. + + \since Qt 5.14 +*/ +QGeoSatelliteInfoSource *QGeoSatelliteInfoSource::createSource(const QString &sourceName, const QVariantMap ¶meters, QObject *parent) +{ + auto plugins = QGeoPositionInfoSourcePrivate::plugins(); + if (plugins.contains(sourceName)) + return QGeoSatelliteInfoSourcePrivate::createSourceReal(plugins.value(sourceName), parameters, parent); + return nullptr; +} + +/*! + Returns a list of available source plugins, including the default system + backend if one is available. +*/ +QStringList QGeoSatelliteInfoSource::availableSources() +{ + QStringList plugins; + const auto meta = QGeoPositionInfoSourcePrivate::plugins(); + for (auto it = meta.cbegin(), end = meta.cend(); it != end; ++it) { + if (it.value().value(QStringLiteral("Satellite")).isBool() + && it.value().value(QStringLiteral("Satellite")).toBool()) { + plugins << it.key(); + } + } + + return plugins; +} + +/*! + \fn void QGeoSatelliteInfoSource::satellitesInViewUpdated(const QList &satellites); + + If startUpdates() or requestUpdate() is called, this signal is emitted + when an update is available on the satellites that are + currently in view. + + The \a satellites parameter holds the satellites currently in view. +*/ + +/*! + \fn void QGeoSatelliteInfoSource::satellitesInUseUpdated(const QList &satellites); + + If startUpdates() or requestUpdate() is called, this signal is emitted + when an update is available on the number of satellites that are + currently in use. + + These are the satellites that are used to get a "fix" - that + is, those used to determine the current position. + + The \a satellites parameter holds the satellites currently in use. +*/ + +/*! + \property QGeoSatelliteInfoSource::minimumUpdateInterval + \brief This property holds the minimum time (in milliseconds) required to retrieve a satellite update. + + This is the minimum value accepted by setUpdateInterval() and + requestUpdate(). +*/ + + +/*! + \fn virtual void QGeoSatelliteInfoSource::startUpdates() = 0; + + Starts emitting updates at regular intervals. The updates will be + provided whenever new satellite information becomes available. + + If satellite information cannot be retrieved or some other + form of timeout has occurred the satellitesInViewUpdated() + and satellitesInUseUpdated() signals may be emitted with + empty parameter lists. + + \note Since Qt6 this method always resets the last error to + \l {QGeoSatelliteInfoSource::}{NoError} before starting + the updates. + + \note To understand how to use this method from an Android service, see + \l {Qt Positioning on Android}. + + \sa satellitesInViewUpdated(), satellitesInUseUpdated() +*/ + +/*! + \fn virtual void QGeoSatelliteInfoSource::stopUpdates() = 0; + + Stops emitting updates at regular intervals. +*/ + +/*! + \fn virtual void QGeoSatelliteInfoSource::requestUpdate(int timeout = 0); + + Attempts to get the current satellite information and emit + satellitesInViewUpdated() and satellitesInUseUpdated() with this + information. If the current satellite information cannot be found + within the given \a timeout (in milliseconds) or if \a timeout is less than + the value returned by minimumUpdateInterval(), an errorOccurred() signal + with \l {QGeoSatelliteInfoSource::UpdateTimeoutError} + {UpdateTimeoutError} is emitted. + + If the timeout is zero, the timeout defaults to a reasonable timeout + period as appropriate for the source. + + This does nothing if another update request is in progress. However + it can be called even if startUpdates() has already been called and + regular updates are in progress. + + \note Since Qt6 this method always resets the last error to + \l {QGeoSatelliteInfoSource::}{NoError} before requesting + the satellite information. + + \note To understand how to use this method from an Android service, see + \l {Qt Positioning on Android}. +*/ + +/*! + \fn QGeoSatelliteInfoSource::Error QGeoSatelliteInfoSource::error() const = 0 + + Returns the last error that occurred. + + \note Since Qt6 the last error is always reset when calling startUpdates() + or requestUpdate(). +*/ + +/*! + \fn void QGeoSatelliteInfoSource::errorOccurred(QGeoSatelliteInfoSource::Error satelliteError) + + This signal is emitted after an error occurred. The \a satelliteError + parameter describes the type of error that occurred. +*/ + +/*! + \enum QGeoSatelliteInfoSource::Error + + The Error enumeration represents the errors which can occur. + + \value AccessError The connection setup to the satellite backend failed because the + application lacked the required privileges. + \value ClosedError The satellite backend closed the connection, which happens for example in case + the user is switching location services to off. This object becomes invalid and should be deleted. + A new satellite source can be created by calling createDefaultSource() later on. + \value NoError No error has occurred. + \value UnknownSourceError An unidentified error occurred. + \value UpdateTimeoutError The current satellite information could not be + retrieved within the specified timeout. + */ + + +QT_END_NAMESPACE + +#include "moc_qgeosatelliteinfosource.cpp" diff --git a/src/positioning/qgeosatelliteinfosource.h b/src/positioning/qgeosatelliteinfosource.h new file mode 100644 index 0000000..76a9621 --- /dev/null +++ b/src/positioning/qgeosatelliteinfosource.h @@ -0,0 +1,73 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QGEOSATELLITEINFOSOURCE_H +#define QGEOSATELLITEINFOSOURCE_H + +#include + +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoSatelliteInfoSourcePrivate; +class Q_POSITIONING_EXPORT QGeoSatelliteInfoSource : public QObject +{ + Q_OBJECT + Q_PROPERTY(int updateInterval READ updateInterval WRITE setUpdateInterval BINDABLE + bindableUpdateInterval) + Q_PROPERTY(int minimumUpdateInterval READ minimumUpdateInterval) + +public: + enum Error { + AccessError = 0, + ClosedError = 1, + NoError = 2, + UnknownSourceError = -1, + UpdateTimeoutError = 3, + }; + Q_ENUM(Error) + + explicit QGeoSatelliteInfoSource(QObject *parent); + virtual ~QGeoSatelliteInfoSource(); + + static QGeoSatelliteInfoSource *createDefaultSource(QObject *parent); + static QGeoSatelliteInfoSource *createSource(const QString &sourceName, QObject *parent); + static QGeoSatelliteInfoSource *createDefaultSource(const QVariantMap ¶meters, QObject *parent); + static QGeoSatelliteInfoSource *createSource(const QString &sourceName, const QVariantMap ¶meters, QObject *parent); + static QStringList availableSources(); + + QString sourceName() const; + + virtual void setUpdateInterval(int msec); + int updateInterval() const; + QBindable bindableUpdateInterval(); + + virtual int minimumUpdateInterval() const = 0; + virtual Error error() const = 0; + + virtual bool setBackendProperty(const QString &name, const QVariant &value); + virtual QVariant backendProperty(const QString &name) const; + +public Q_SLOTS: + virtual void startUpdates() = 0; + virtual void stopUpdates() = 0; + + virtual void requestUpdate(int timeout = 0) = 0; + +Q_SIGNALS: + void satellitesInViewUpdated(const QList &satellites); + void satellitesInUseUpdated(const QList &satellites); + void errorOccurred(QGeoSatelliteInfoSource::Error); + +protected: + explicit QGeoSatelliteInfoSource(QGeoSatelliteInfoSourcePrivate &dd, QObject *parent); + +private: + Q_DISABLE_COPY(QGeoSatelliteInfoSource) + Q_DECLARE_PRIVATE(QGeoSatelliteInfoSource) +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qgeosatelliteinfosource_p.h b/src/positioning/qgeosatelliteinfosource_p.h new file mode 100644 index 0000000..bd02bc4 --- /dev/null +++ b/src/positioning/qgeosatelliteinfosource_p.h @@ -0,0 +1,37 @@ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOSATELLITEINFOSOURCE_P_H +#define QGEOSATELLITEINFOSOURCE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +QT_BEGIN_NAMESPACE +class QGeoSatelliteInfoSource; +class QGeoSatelliteInfoSourcePrivate : public QObjectPrivate +{ +public: + virtual ~QGeoSatelliteInfoSourcePrivate(); + static QGeoSatelliteInfoSource *createSourceReal(const QCborMap &meta, + const QVariantMap ¶meters, + QObject *parent); + Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(QGeoSatelliteInfoSourcePrivate, int, interval, 0) + QString providerName; +}; + +QT_END_NAMESPACE + +#endif // QGEOSATELLITEINFOSOURCE_P_H diff --git a/src/positioning/qgeoshape.cpp b/src/positioning/qgeoshape.cpp new file mode 100644 index 0000000..2463e90 --- /dev/null +++ b/src/positioning/qgeoshape.cpp @@ -0,0 +1,415 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qgeoshape.h" +#include "qgeoshape_p.h" +#include "qgeorectangle.h" +#include "qgeocircle.h" +#include "qgeopath.h" +#include "qgeopolygon.h" + + +#ifndef QT_NO_DEBUG_STREAM +#include +#endif + +#ifndef QT_NO_DATASTREAM +#include +#endif + +QT_BEGIN_NAMESPACE + +QT_IMPL_METATYPE_EXTERN(QGeoShape) + +QGeoShapePrivate::QGeoShapePrivate(QGeoShape::ShapeType type) +: type(type) +{ +} + +QGeoShapePrivate::~QGeoShapePrivate() +{ +} + +bool QGeoShapePrivate::operator==(const QGeoShapePrivate &other) const +{ + return type == other.type; +} + +/*! + \class QGeoShape + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \since 5.2 + + \brief The QGeoShape class defines a geographic area. + + This class is the base class for classes which specify a geographic + area. + + For the sake of consistency, subclasses should describe the specific + details of the associated areas in terms of QGeoCoordinate instances + and distances in meters. + + This class is a \l Q_GADGET since Qt 5.5. It can be + \l{Cpp_value_integration_positioning}{directly used from C++ and QML}. +*/ + +/*! + \enum QGeoShape::ShapeType + + Describes the type of the shape. + + \value UnknownType A shape of unknown type + \value RectangleType A rectangular shape + \value CircleType A circular shape + \value PathType A path type + \value PolygonType A polygon type +*/ + +/*! + \property QGeoShape::type + \brief This property holds the type of this geo shape. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +/*! + \property QGeoShape::isValid + \brief This property holds the validity of the geo shape. + + A geo shape is considered to be invalid if some of the data that is required to + unambiguously describe the geo shape has not been set or has been set to an + unsuitable value depending on the subclass of this object. The default constructed + objects of this type are invalid. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ + +/*! + \property QGeoShape::isEmpty + \brief This property defines whether this geo shape is empty. + + An empty geo shape is a region which has a geometrical area of 0. + + While this property is introduced in Qt 5.5, the related accessor functions + exist since the first version of this class. + + \since 5.5 +*/ +inline QGeoShapePrivate *QGeoShape::d_func() +{ + return static_cast(d_ptr.data()); +} + +inline const QGeoShapePrivate *QGeoShape::d_func() const +{ + return static_cast(d_ptr.constData()); +} + +/*! + Constructs a new invalid geo shape of \l UnknownType. +*/ +QGeoShape::QGeoShape() +{ +} + +/*! + Constructs a new geo shape which is a copy of \a other. +*/ +QGeoShape::QGeoShape(const QGeoShape &other) +: d_ptr(other.d_ptr) +{ +} + +/*! + \internal +*/ +QGeoShape::QGeoShape(QGeoShapePrivate *d) +: d_ptr(d) +{ +} + +bool QGeoShape::equals(const QGeoShape &lhs, const QGeoShape &rhs) +{ + if (lhs.d_func() == rhs.d_func()) + return true; + + if (!lhs.d_func() || !rhs.d_func()) + return false; + + return *lhs.d_func() == *rhs.d_func(); +} + +/*! + Destroys this geo shape. +*/ +QGeoShape::~QGeoShape() +{ +} + +/*! + Returns the type of this geo shape. +*/ +QGeoShape::ShapeType QGeoShape::type() const +{ + Q_D(const QGeoShape); + + if (d) + return d->type; + else + return UnknownType; +} + +/*! + Returns whether this geo shape is valid. + +*/ +bool QGeoShape::isValid() const +{ + Q_D(const QGeoShape); + + if (d) + return d->isValid(); + else + return false; +} + +/*! + Returns whether this geo shape is empty. + + An empty geo shape is a region which has a geometrical area of 0. +*/ +bool QGeoShape::isEmpty() const +{ + Q_D(const QGeoShape); + + if (d) + return d->isEmpty(); + else + return true; +} + +/*! + Returns whether the coordinate \a coordinate is contained within this geo shape. +*/ +bool QGeoShape::contains(const QGeoCoordinate &coordinate) const +{ + Q_D(const QGeoShape); + + if (d) + return d->contains(coordinate); + else + return false; +} + +/*! + Returns a QGeoRectangle representing the geographical bounding rectangle of the + geo shape, that defines the latitudinal/longitudinal bounds of the geo shape. + + \since 5.9 +*/ +QGeoRectangle QGeoShape::boundingGeoRectangle() const +{ + Q_D(const QGeoShape); + + if (d) + return d->boundingGeoRectangle(); + else + return QGeoRectangle(); +} + +/*! + Returns the coordinate located at the geometric center of the geo shape. + + \since 5.5 +*/ +QGeoCoordinate QGeoShape::center() const +{ + Q_D(const QGeoShape); + + if (d) + return d->center(); + else + return QGeoCoordinate(); +} + +/*! + \fn bool QGeoShape::operator==(const QGeoShape &lhs, const QGeoShape &rhs) + + Returns \c true if the \a lhs geo shape is equivalent to the \a rhs geo + shape, otherwise returns \c false. +*/ + +/*! + \fn bool QGeoShape::operator!=(const QGeoShape &lhs, const QGeoShape &rhs) + + Returns \c true if the \a lhs geo shape is not equivalent to the \a rhs geo + shape, otherwise returns \c false. +*/ + +/*! + Assigns \a other to this geo shape and returns a reference to this geo shape. +*/ +QGeoShape &QGeoShape::operator=(const QGeoShape &other) +{ + if (this == &other) + return *this; + + d_ptr = other.d_ptr; + return *this; +} + +/*! + Returns a string representation of this geo shape. + + \since 5.5 +*/ +QString QGeoShape::toString() const +{ + return QStringLiteral("QGeoShape(%1)").arg(type()); +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug QGeoShape::debugStreaming(QDebug dbg, const QGeoShape &shape) +{ + QDebugStateSaver saver(dbg); + dbg.nospace() << "QGeoShape("; + switch (shape.type()) { + case QGeoShape::UnknownType: + dbg << "Unknown"; + break; + case QGeoShape::RectangleType: + dbg << "Rectangle"; + break; + case QGeoShape::PathType: + dbg << "Path"; + break; + case QGeoShape::PolygonType: + dbg << "Polygon"; + break; + case QGeoShape::CircleType: + dbg << "Circle"; + } + + dbg << ')'; + + return dbg; +} +#endif + +#ifndef QT_NO_DATASTREAM +QDataStream &QGeoShape::dataStreamOut(QDataStream &stream, const QGeoShape &shape) +{ + stream << quint32(shape.type()); + switch (shape.type()) { + case QGeoShape::UnknownType: + break; + case QGeoShape::RectangleType: { + QGeoRectangle r = shape; + stream << r.topLeft() << r.bottomRight(); + break; + } + case QGeoShape::CircleType: { + QGeoCircle c = shape; + stream << c.center() << c.radius(); + break; + } + case QGeoShape::PathType: { + QGeoPath p = shape; + stream << p.width(); + stream << p.path().size(); + for (const auto &c: p.path()) + stream << c; + break; + } + case QGeoShape::PolygonType: { + QGeoPolygon p = shape; + stream << p.perimeter().size(); + for (const auto &c: p.perimeter()) + stream << c; + break; + } + } + + return stream; +} + +QDataStream &QGeoShape::dataStreamIn(QDataStream &stream, QGeoShape &shape) +{ + quint32 type; + stream >> type; + + switch (type) { + case QGeoShape::UnknownType: + shape = QGeoShape(); + break; + case QGeoShape::RectangleType: { + QGeoCoordinate tl; + QGeoCoordinate br; + stream >> tl >> br; + shape = QGeoRectangle(tl, br); + break; + } + case QGeoShape::CircleType: { + QGeoCoordinate c; + qreal r; + stream >> c >> r; + shape = QGeoCircle(c, r); + break; + } + case QGeoShape::PathType: { + QList l; + QGeoCoordinate c; + qreal width; + stream >> width; + qsizetype sz; + stream >> sz; + for (qsizetype i = 0; i < sz; i++) { + stream >> c; + l.append(c); + } + shape = QGeoPath(l, width); + break; + } + case QGeoShape::PolygonType: { + QList l; + QGeoCoordinate c; + qsizetype sz; + stream >> sz; + for (qsizetype i = 0; i < sz; i++) { + stream >> c; + l.append(c); + } + shape = QGeoPolygon(l); + break; + } + } + + return stream; +} +#endif + +/*! + \relates QGeoShape + + Returns the hash value for the \a shape, using \a seed for the + calculation. +*/ +size_t qHash(const QGeoShape &shape, size_t seed) noexcept +{ + if (shape.d_ptr) + return shape.d_ptr->hash(seed); + else + return qHashMulti(seed, shape.type()); +} + +QT_END_NAMESPACE + +#include "moc_qgeoshape.cpp" + diff --git a/src/positioning/qgeoshape.h b/src/positioning/qgeoshape.h new file mode 100644 index 0000000..2592fee --- /dev/null +++ b/src/positioning/qgeoshape.h @@ -0,0 +1,97 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOSHAPE_H +#define QGEOSHAPE_H + +#include +#include + +QT_BEGIN_NAMESPACE + +class QDebug; +class QGeoShapePrivate; +class QGeoRectangle; + +class Q_POSITIONING_EXPORT QGeoShape +{ + Q_GADGET + Q_PROPERTY(ShapeType type READ type) + Q_PROPERTY(bool isValid READ isValid) + Q_PROPERTY(bool isEmpty READ isEmpty) + Q_PROPERTY(QGeoCoordinate center READ center) + Q_ENUMS(ShapeType) + +public: + QGeoShape(); + Q_INVOKABLE QGeoShape(const QGeoShape &other); + ~QGeoShape(); + + enum ShapeType { + UnknownType, + RectangleType, + CircleType, + PathType, + PolygonType + }; + + ShapeType type() const; + + bool isValid() const; + bool isEmpty() const; + Q_INVOKABLE bool contains(const QGeoCoordinate &coordinate) const; + Q_INVOKABLE QGeoRectangle boundingGeoRectangle() const; + QGeoCoordinate center() const; + + friend bool operator==(const QGeoShape &lhs, const QGeoShape &rhs) + { + return equals(lhs, rhs); + } + friend bool operator!=(const QGeoShape &lhs, const QGeoShape &rhs) + { + return !equals(lhs, rhs); + } + + QGeoShape &operator=(const QGeoShape &other); + + Q_INVOKABLE QString toString() const; +protected: + QGeoShape(QGeoShapePrivate *d); + + QSharedDataPointer d_ptr; + +private: + static bool equals(const QGeoShape &lhs, const QGeoShape &rhs); + inline QGeoShapePrivate *d_func(); + inline const QGeoShapePrivate *d_func() const; +#ifndef QT_NO_DEBUG_STREAM + friend QDebug operator<<(QDebug dbg, const QGeoShape &shape) + { + return debugStreaming(dbg, shape); + } + static QDebug debugStreaming(QDebug dbg, const QGeoShape &shape); +#endif +#ifndef QT_NO_DATASTREAM + friend QDataStream &operator<<(QDataStream &stream, const QGeoShape &shape) + { + return dataStreamOut(stream, shape); + } + friend QDataStream &operator>>(QDataStream &stream, QGeoShape &shape) + { + return dataStreamIn(stream, shape); + } + static QDataStream &dataStreamOut(QDataStream &stream, const QGeoShape &shape); + static QDataStream &dataStreamIn(QDataStream &stream, QGeoShape &shape); +#endif + friend Q_POSITIONING_EXPORT size_t qHash(const QGeoShape &key, size_t seed) noexcept; +}; + +Q_POSITIONING_EXPORT size_t qHash(const QGeoShape &shape, size_t seed = 0) noexcept; + +Q_DECLARE_TYPEINFO(QGeoShape, Q_RELOCATABLE_TYPE); + +QT_END_NAMESPACE + +QT_DECL_METATYPE_EXTERN(QGeoShape, Q_POSITIONING_EXPORT) + +#endif diff --git a/src/positioning/qgeoshape_p.h b/src/positioning/qgeoshape_p.h new file mode 100644 index 0000000..4151f38 --- /dev/null +++ b/src/positioning/qgeoshape_p.h @@ -0,0 +1,58 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QGEOSHAPE_P_H +#define QGEOSHAPE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include + +#include "qgeorectangle.h" +#include "private/qglobal_p.h" + +QT_BEGIN_NAMESPACE + +class QGeoShapePrivate : public QSharedData +{ +public: + explicit QGeoShapePrivate(QGeoShape::ShapeType type); + virtual ~QGeoShapePrivate(); + + virtual bool isValid() const = 0; + virtual bool isEmpty() const = 0; + virtual bool contains(const QGeoCoordinate &coordinate) const = 0; + + virtual QGeoCoordinate center() const = 0; + + virtual QGeoRectangle boundingGeoRectangle() const = 0; + + virtual QGeoShapePrivate *clone() const = 0; + + virtual bool operator==(const QGeoShapePrivate &other) const; + + virtual size_t hash(size_t seed) const = 0; + + QGeoShape::ShapeType type; +}; + +// don't use the copy constructor when detaching from a QSharedDataPointer, use virtual clone() +// call instead. +template <> +Q_INLINE_TEMPLATE QGeoShapePrivate *QSharedDataPointer::clone() +{ + return d->clone(); +} + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qlocationutils.cpp b/src/positioning/qlocationutils.cpp new file mode 100644 index 0000000..801aaec --- /dev/null +++ b/src/positioning/qlocationutils.cpp @@ -0,0 +1,569 @@ +// Copyright (C) 2016 Jolla Ltd. +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#include "qlocationutils_p.h" +#include "qgeopositioninfo.h" +#include "qgeosatelliteinfo.h" + +#include +#include +#include +#include +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +// converts e.g. 15306.0235 from NMEA sentence to 153.100392 +static double qlocationutils_nmeaDegreesToDecimal(double nmeaDegrees) +{ + double deg; + double min = 100.0 * modf(nmeaDegrees / 100.0, °); + return deg + (min / 60.0); +} + +static void qlocationutils_readGga(QByteArrayView bv, QGeoPositionInfo *info, double uere, + bool *hasFix) +{ + const QList parts = QByteArray::fromRawData(bv.data(), bv.size()).split(','); + QGeoCoordinate coord; + + if (hasFix && parts.size() > 6 && !parts[6].isEmpty()) + *hasFix = parts[6].toInt() > 0; + + if (parts.size() > 1 && !parts[1].isEmpty()) { + QTime time; + if (QLocationUtils::getNmeaTime(parts[1], &time)) + info->setTimestamp(QDateTime(QDate(), time, QTimeZone::UTC)); + } + + if (parts.size() > 5 && parts[3].size() == 1 && parts[5].size() == 1) { + double lat; + double lng; + if (QLocationUtils::getNmeaLatLong(parts[2], parts[3][0], parts[4], parts[5][0], &lat, &lng)) { + coord.setLatitude(lat); + coord.setLongitude(lng); + } + } + + if (parts.size() > 8 && !parts[8].isEmpty()) { + bool hasHdop = false; + double hdop = parts[8].toDouble(&hasHdop); + if (hasHdop) + info->setAttribute(QGeoPositionInfo::HorizontalAccuracy, 2 * hdop * uere); + } + + if (parts.size() > 9 && !parts[9].isEmpty()) { + bool hasAlt = false; + double alt = parts[9].toDouble(&hasAlt); + if (hasAlt) + coord.setAltitude(alt); + } + + if (coord.type() != QGeoCoordinate::InvalidCoordinate) + info->setCoordinate(coord); +} + +static void qlocationutils_readGsa(QByteArrayView bv, QGeoPositionInfo *info, double uere, + bool *hasFix) +{ + const QList parts = QByteArray::fromRawData(bv.data(), bv.size()).split(','); + + if (hasFix && parts.size() > 2 && !parts[2].isEmpty()) + *hasFix = parts[2].toInt() > 0; + + if (parts.size() > 16 && !parts[16].isEmpty()) { + bool hasHdop = false; + double hdop = parts[16].toDouble(&hasHdop); + if (hasHdop) + info->setAttribute(QGeoPositionInfo::HorizontalAccuracy, 2 * hdop * uere); + } + + if (parts.size() > 17 && !parts[17].isEmpty()) { + bool hasVdop = false; + double vdop = parts[17].toDouble(&hasVdop); + if (hasVdop) + info->setAttribute(QGeoPositionInfo::VerticalAccuracy, 2 * vdop * uere); + } +} + +static void qlocationutils_readGsa(QByteArrayView bv, QList &pnrsInUse) +{ + const QList parts = QByteArray::fromRawData(bv.data(), bv.size()).split(','); + pnrsInUse.clear(); + if (parts.size() <= 2) + return; + bool ok; + for (qsizetype i = 3; i < qMin(15, parts.size()); ++i) { + const QByteArray &pnrString = parts.at(i); + if (pnrString.isEmpty()) + continue; + int pnr = pnrString.toInt(&ok); + if (ok) + pnrsInUse.append(pnr); + } +} + +static void qlocationutils_readGll(QByteArrayView bv, QGeoPositionInfo *info, bool *hasFix) +{ + const QList parts = QByteArray::fromRawData(bv.data(), bv.size()).split(','); + QGeoCoordinate coord; + + if (hasFix && parts.size() > 6 && !parts[6].isEmpty()) + *hasFix = (parts[6][0] == 'A'); + + if (parts.size() > 5 && !parts[5].isEmpty()) { + QTime time; + if (QLocationUtils::getNmeaTime(parts[5], &time)) + info->setTimestamp(QDateTime(QDate(), time, QTimeZone::UTC)); + } + + if (parts.size() > 4 && parts[2].size() == 1 && parts[4].size() == 1) { + double lat; + double lng; + if (QLocationUtils::getNmeaLatLong(parts[1], parts[2][0], parts[3], parts[4][0], &lat, &lng)) { + coord.setLatitude(lat); + coord.setLongitude(lng); + } + } + + if (coord.type() != QGeoCoordinate::InvalidCoordinate) + info->setCoordinate(coord); +} + +static void qlocationutils_readRmc(QByteArrayView bv, QGeoPositionInfo *info, bool *hasFix) +{ + const QList parts = QByteArray::fromRawData(bv.data(), bv.size()).split(','); + QGeoCoordinate coord; + QDate date; + QTime time; + + if (hasFix && parts.size() > 2 && !parts[2].isEmpty()) + *hasFix = (parts[2][0] == 'A'); + + if (parts.size() > 9 && parts[9].size() == 6) { + date = QDate::fromString(QString::fromLatin1(parts[9]), QStringLiteral("ddMMyy")); + if (date.isValid()) + date = date.addYears(100); // otherwise starts from 1900 + } + + if (parts.size() > 1 && !parts[1].isEmpty()) + QLocationUtils::getNmeaTime(parts[1], &time); + + if (parts.size() > 6 && parts[4].size() == 1 && parts[6].size() == 1) { + double lat; + double lng; + if (QLocationUtils::getNmeaLatLong(parts[3], parts[4][0], parts[5], parts[6][0], &lat, &lng)) { + coord.setLatitude(lat); + coord.setLongitude(lng); + } + } + + bool parsed = false; + double value = 0.0; + if (parts.size() > 7 && !parts[7].isEmpty()) { + value = parts[7].toDouble(&parsed); + if (parsed) + info->setAttribute(QGeoPositionInfo::GroundSpeed, qreal(value * 1.852 / 3.6)); // knots -> m/s + } + if (parts.size() > 8 && !parts[8].isEmpty()) { + value = parts[8].toDouble(&parsed); + if (parsed) + info->setAttribute(QGeoPositionInfo::Direction, qreal(value)); + } + if (parts.size() > 11 && parts[11].size() == 1 + && (parts[11][0] == 'E' || parts[11][0] == 'W')) { + value = parts[10].toDouble(&parsed); + if (parsed) { + if (parts[11][0] == 'W') + value *= -1; + info->setAttribute(QGeoPositionInfo::MagneticVariation, qreal(value)); + } + } + + if (coord.type() != QGeoCoordinate::InvalidCoordinate) + info->setCoordinate(coord); + + info->setTimestamp(QDateTime(date, time, QTimeZone::UTC)); +} + +static void qlocationutils_readVtg(QByteArrayView bv, QGeoPositionInfo *info, bool *hasFix) +{ + if (hasFix) + *hasFix = false; + + const QList parts = QByteArray::fromRawData(bv.data(), bv.size()).split(','); + + bool parsed = false; + double value = 0.0; + if (parts.size() > 1 && !parts[1].isEmpty()) { + value = parts[1].toDouble(&parsed); + if (parsed) + info->setAttribute(QGeoPositionInfo::Direction, qreal(value)); + } + if (parts.size() > 7 && !parts[7].isEmpty()) { + value = parts[7].toDouble(&parsed); + if (parsed) + info->setAttribute(QGeoPositionInfo::GroundSpeed, qreal(value / 3.6)); // km/h -> m/s + } +} + +static void qlocationutils_readZda(QByteArrayView bv, QGeoPositionInfo *info, bool *hasFix) +{ + if (hasFix) + *hasFix = false; + + const QList parts = QByteArray::fromRawData(bv.data(), bv.size()).split(','); + QDate date; + QTime time; + + if (parts.size() > 1 && !parts[1].isEmpty()) + QLocationUtils::getNmeaTime(parts[1], &time); + + if (parts.size() > 4 && !parts[2].isEmpty() && !parts[3].isEmpty() + && parts[4].size() == 4) { // must be full 4-digit year + int day = parts[2].toInt(); + int month = parts[3].toInt(); + int year = parts[4].toInt(); + if (day > 0 && month > 0 && year > 0) + date.setDate(year, month, day); + } + + info->setTimestamp(QDateTime(date, time, QTimeZone::UTC)); +} + +QLocationUtils::NmeaSentence QLocationUtils::getNmeaSentenceType(QByteArrayView bv) +{ + if (bv.size() < 6 || bv[0] != '$' || !hasValidNmeaChecksum(bv)) + return NmeaSentenceInvalid; + + QByteArrayView key = bv.sliced(3); + + if (key.startsWith("GGA")) + return NmeaSentenceGGA; + + if (key.startsWith("GSA")) + return NmeaSentenceGSA; + + if (key.startsWith("GSV")) + return NmeaSentenceGSV; + + if (key.startsWith("GLL")) + return NmeaSentenceGLL; + + if (key.startsWith("RMC")) + return NmeaSentenceRMC; + + if (key.startsWith("VTG")) + return NmeaSentenceVTG; + + if (key.startsWith("ZDA")) + return NmeaSentenceZDA; + + return NmeaSentenceInvalid; +} + +QGeoSatelliteInfo::SatelliteSystem QLocationUtils::getSatelliteSystem(QByteArrayView bv) +{ + if (bv.size() < 6 || bv[0] != '$' || !hasValidNmeaChecksum(bv)) + return QGeoSatelliteInfo::Undefined; + + QByteArrayView key = bv.sliced(1); + + // GPS: GP + if (key.startsWith("GP")) + return QGeoSatelliteInfo::GPS; + + // GLONASS: GL + if (key.startsWith("GL")) + return QGeoSatelliteInfo::GLONASS; + + // GALILEO: GA + if (key.startsWith("GA")) + return QGeoSatelliteInfo::GALILEO; + + // BeiDou: BD or GB + if (key.startsWith("BD") || key.startsWith("GB")) + return QGeoSatelliteInfo::BEIDOU; + + // QZSS: GQ, PQ, QZ + if (key.startsWith("GQ") || key.startsWith("PQ") || key.startsWith("QZ")) + return QGeoSatelliteInfo::QZSS; + + // Multiple: GN + if (key.startsWith("GN")) + return QGeoSatelliteInfo::Multiple; + + return QGeoSatelliteInfo::Undefined; +} + +QGeoSatelliteInfo::SatelliteSystem QLocationUtils::getSatelliteSystemBySatelliteId(int satId) +{ + if (satId >= 1 && satId <= 32) + return QGeoSatelliteInfo::GPS; + + if (satId >= 65 && satId <= 96) // including future extensions + return QGeoSatelliteInfo::GLONASS; + + if (satId >= 193 && satId <= 200) // including future extensions + return QGeoSatelliteInfo::QZSS; + + if ((satId >= 201 && satId <= 235) || (satId >= 401 && satId <= 437)) + return QGeoSatelliteInfo::BEIDOU; + + if (satId >= 301 && satId <= 336) + return QGeoSatelliteInfo::GALILEO; + + return QGeoSatelliteInfo::Undefined; +} + +bool QLocationUtils::getPosInfoFromNmea(QByteArrayView bv, QGeoPositionInfo *info, + double uere, bool *hasFix) +{ + if (!info) + return false; + + if (hasFix) + *hasFix = false; + + NmeaSentence nmeaType = getNmeaSentenceType(bv); + if (nmeaType == NmeaSentenceInvalid) + return false; + + // Adjust size so that * and following characters are not parsed by the following functions. + qsizetype idx = bv.indexOf('*'); + QByteArrayView key = idx < 0 ? bv : bv.first(idx); + + switch (nmeaType) { + case NmeaSentenceGGA: + qlocationutils_readGga(key, info, uere, hasFix); + return true; + case NmeaSentenceGSA: + qlocationutils_readGsa(key, info, uere, hasFix); + return true; + case NmeaSentenceGLL: + qlocationutils_readGll(key, info, hasFix); + return true; + case NmeaSentenceRMC: + qlocationutils_readRmc(key, info, hasFix); + return true; + case NmeaSentenceVTG: + qlocationutils_readVtg(key, info, hasFix); + return true; + case NmeaSentenceZDA: + qlocationutils_readZda(key, info, hasFix); + return true; + default: + return false; + } +} + +QNmeaSatelliteInfoSource::SatelliteInfoParseStatus +QLocationUtils::getSatInfoFromNmea(QByteArrayView bv, QList &infos, QGeoSatelliteInfo::SatelliteSystem &system) +{ + if (bv.isEmpty()) + return QNmeaSatelliteInfoSource::NotParsed; + + NmeaSentence nmeaType = getNmeaSentenceType(bv); + if (nmeaType != NmeaSentenceGSV) + return QNmeaSatelliteInfoSource::NotParsed; + + // Standard forbids using $GN talker id for GSV messages, so the system + // type here will be uniquely identified. + system = getSatelliteSystem(bv); + + // Adjust size so that * and following characters are not parsed by the + // following code. + qsizetype idx = bv.indexOf('*'); + + const QList parts = QByteArray::fromRawData(bv.data(), + idx < 0 ? bv.size() : idx).split(','); + + if (parts.size() <= 3) { + infos.clear(); + return QNmeaSatelliteInfoSource::FullyParsed; // Malformed sentence. + } + bool ok; + const int totalSentences = parts.at(1).toInt(&ok); + if (!ok) { + infos.clear(); + return QNmeaSatelliteInfoSource::FullyParsed; // Malformed sentence. + } + + const int sentence = parts.at(2).toInt(&ok); + if (!ok) { + infos.clear(); + return QNmeaSatelliteInfoSource::FullyParsed; // Malformed sentence. + } + + const int totalSats = parts.at(3).toInt(&ok); + if (!ok) { + infos.clear(); + return QNmeaSatelliteInfoSource::FullyParsed; // Malformed sentence. + } + + if (sentence == 1) + infos.clear(); + + const int numSatInSentence = qMin(sentence * 4, totalSats) - (sentence - 1) * 4; + if (parts.size() < (4 + numSatInSentence * 4)) { + infos.clear(); + return QNmeaSatelliteInfoSource::FullyParsed; // Malformed sentence. + } + + int field = 4; + for (int i = 0; i < numSatInSentence; ++i) { + QGeoSatelliteInfo info; + info.setSatelliteSystem(system); + int prn = parts.at(field++).toInt(&ok); + // Quote from: https://gpsd.gitlab.io/gpsd/NMEA.html#_satellite_ids + // GLONASS satellite numbers come in two flavors. If a sentence has a GL + // talker ID, expect the skyviews to be GLONASS-only and in the range + // 1-32; you must add 64 to get a globally-unique NMEA ID. If the + // sentence has a GN talker ID, the device emits a multi-constellation + // skyview with GLONASS IDs already in the 65-96 range. + // + // However I don't observe such behavior with my device. So implementing + // a safe scenario. + if (ok && (system == QGeoSatelliteInfo::GLONASS)) { + if (prn <= 64) + prn += 64; + } + info.setSatelliteIdentifier((ok) ? prn : 0); + const int elevation = parts.at(field++).toInt(&ok); + info.setAttribute(QGeoSatelliteInfo::Elevation, (ok) ? elevation : 0); + const int azimuth = parts.at(field++).toInt(&ok); + info.setAttribute(QGeoSatelliteInfo::Azimuth, (ok) ? azimuth : 0); + const int snr = parts.at(field++).toInt(&ok); + info.setSignalStrength((ok) ? snr : -1); + infos.append(info); + } + + if (sentence == totalSentences) + return QNmeaSatelliteInfoSource::FullyParsed; + + return QNmeaSatelliteInfoSource::PartiallyParsed; +} + +QGeoSatelliteInfo::SatelliteSystem QLocationUtils::getSatInUseFromNmea(QByteArrayView bv, + QList &pnrsInUse) +{ + if (bv.isEmpty()) + return QGeoSatelliteInfo::Undefined; + + NmeaSentence nmeaType = getNmeaSentenceType(bv); + if (nmeaType != NmeaSentenceGSA) + return QGeoSatelliteInfo::Undefined; + + auto systemType = getSatelliteSystem(bv); + if (systemType == QGeoSatelliteInfo::Undefined) + return systemType; + + // The documentation states that we do not modify pnrsInUse if we could not + // parse the data + pnrsInUse.clear(); + + // Adjust size so that * and following characters are not parsed by the following functions. + qsizetype idx = bv.indexOf('*'); + QByteArrayView key = idx < 0 ? bv : bv.first(idx); + + qlocationutils_readGsa(key, pnrsInUse); + + // Quote from: https://gpsd.gitlab.io/gpsd/NMEA.html#_satellite_ids + // GLONASS satellite numbers come in two flavors. If a sentence has a GL + // talker ID, expect the skyviews to be GLONASS-only and in the range 1-32; + // you must add 64 to get a globally-unique NMEA ID. If the sentence has a + // GN talker ID, the device emits a multi-constellation skyview with + // GLONASS IDs already in the 65-96 range. + // + // However I don't observe such behavior with my device. So implementing a + // safe scenario. + if (systemType == QGeoSatelliteInfo::GLONASS) { + std::for_each(pnrsInUse.begin(), pnrsInUse.end(), [](int &id) { + if (id <= 64) + id += 64; + }); + } + + if ((systemType == QGeoSatelliteInfo::Multiple) && !pnrsInUse.isEmpty()) { + // Standard claims that in case of multiple system types we will receive + // several GSA messages, each containing data from only one satellite + // system, so we can pick the first id to determine the system type. + auto tempSystemType = getSatelliteSystemBySatelliteId(pnrsInUse.front()); + if (tempSystemType != QGeoSatelliteInfo::Undefined) + systemType = tempSystemType; + } + + return systemType; +} + +bool QLocationUtils::hasValidNmeaChecksum(QByteArrayView bv) +{ + qsizetype asteriskIndex = bv.indexOf('*'); + + constexpr qsizetype CSUM_LEN = 2; + if (asteriskIndex < 0 || asteriskIndex >= bv.size() - CSUM_LEN) + return false; + + // XOR byte value of all characters between '$' and '*' + int result = 0; + for (qsizetype i = 1; i < asteriskIndex; ++i) + result ^= bv[i]; + /* + char calc[CSUM_LEN + 1]; + ::snprintf(calc, CSUM_LEN + 1, "%02x", result); + return ::strncmp(calc, &data[asteriskIndex+1], 2) == 0; + */ + + QByteArrayView checkSumBytes = bv.sliced(asteriskIndex + 1, 2); + bool ok = false; + int checksum = checkSumBytes.toInt(&ok,16); + return ok && checksum == result; +} + +bool QLocationUtils::getNmeaTime(const QByteArray &bytes, QTime *time) +{ + QTime tempTime = QTime::fromString(QString::fromLatin1(bytes), + QStringView(bytes.size() > 6 && bytes[6] == '.' + ? u"hhmmss.z" + : u"hhmmss")); + + if (tempTime.isValid()) { + *time = tempTime; + return true; + } + return false; +} + +bool QLocationUtils::getNmeaLatLong(const QByteArray &latString, char latDirection, const QByteArray &lngString, char lngDirection, double *lat, double *lng) +{ + if ((latDirection != 'N' && latDirection != 'S') + || (lngDirection != 'E' && lngDirection != 'W')) { + return false; + } + + bool hasLat = false; + bool hasLong = false; + double tempLat = latString.toDouble(&hasLat); + double tempLng = lngString.toDouble(&hasLong); + if (hasLat && hasLong) { + tempLat = qlocationutils_nmeaDegreesToDecimal(tempLat); + if (latDirection == 'S') + tempLat *= -1; + tempLng = qlocationutils_nmeaDegreesToDecimal(tempLng); + if (lngDirection == 'W') + tempLng *= -1; + + if (isValidLat(tempLat) && isValidLong(tempLng)) { + *lat = tempLat; + *lng = tempLng; + return true; + } + } + return false; +} + +QT_END_NAMESPACE + diff --git a/src/positioning/qlocationutils_p.h b/src/positioning/qlocationutils_p.h new file mode 100644 index 0000000..4189373 --- /dev/null +++ b/src/positioning/qlocationutils_p.h @@ -0,0 +1,313 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QLOCATIONUTILS_P_H +#define QLOCATIONUTILS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include // needed for non-std:: versions of functions +#include +#include +#include +#include + +static const double offsetEpsilon = 1e-12; // = 0.000000000001 +static const double leftOffset = -180.0 + offsetEpsilon; +static const double rightOffset = 180.0 - offsetEpsilon; + +QT_BEGIN_NAMESPACE +class QTime; +class QByteArray; + +class QGeoPositionInfo; +class QGeoSatelliteInfo; +class Q_POSITIONING_PRIVATE_EXPORT QLocationUtils +{ +public: + enum CardinalDirection { + CardinalN, + CardinalE, + CardinalS, + CardinalW, + CardinalNE, + CardinalSE, + CardinalSW, + CardinalNW, + CardinalNNE, + CardinalENE, + CardinalESE, + CardinalSSE, + CardinalSSW, + CardinalWSW, + CardinalWNW, + CardinalNNW + }; + + enum NmeaSentence { + NmeaSentenceInvalid, + NmeaSentenceGGA, // Fix information + NmeaSentenceGSA, // Overall Satellite data, such as HDOP and VDOP + NmeaSentenceGLL, // Lat/Lon data + NmeaSentenceRMC, // Recommended minimum data for gps + NmeaSentenceVTG, // Vector track an Speed over the Ground + NmeaSentenceZDA, // Date and Time + NmeaSentenceGSV // Per-Satellite Info + }; + + inline static bool isValidLat(double lat) { + return lat >= -90.0 && lat <= 90.0; + } + inline static bool isValidLong(double lng) { + return lng >= -180.0 && lng <= 180.0; + } + + inline static double clipLat(double lat, double clipValue = 90.0) { + if (lat > clipValue) + lat = clipValue; + else if (lat < -clipValue) + lat = -clipValue; + return lat; + } + + inline static double wrapLong(double lng) { + if (lng > 180.0) + lng -= 360.0; + else if (lng < -180.0) + lng += 360.0; + return lng; + } + + inline static CardinalDirection azimuthToCardinalDirection4(double azimuth) + { + azimuth = fmod(azimuth, 360.0); + if (azimuth < 45.0 || azimuth > 315.0 ) + return CardinalN; + else if (azimuth < 135.0) + return CardinalE; + else if (azimuth < 225.0) + return CardinalS; + else + return CardinalW; + } + + inline static CardinalDirection azimuthToCardinalDirection8(double azimuth) + { + azimuth = fmod(azimuth, 360.0); + if (azimuth < 22.5 || azimuth > 337.5 ) + return CardinalN; + else if (azimuth < 67.5) + return CardinalNE; + else if (azimuth < 112.5) + return CardinalE; + else if (azimuth < 157.5) + return CardinalSE; + else if (azimuth < 202.5) + return CardinalS; + + else if (azimuth < 247.5) + return CardinalSW; + else if (azimuth < 292.5) + return CardinalW; + else + return CardinalNW; + } + + inline static CardinalDirection azimuthToCardinalDirection16(double azimuth) + { + azimuth = fmod(azimuth, 360.0); + if (azimuth < 11.5 || azimuth > 348.75 ) + return CardinalN; + else if (azimuth < 33.75) + return CardinalNNE; + else if (azimuth < 56.25) + return CardinalNE; + else if (azimuth < 78.75) + return CardinalENE; + else if (azimuth < 101.25) + return CardinalE; + else if (azimuth < 123.75) + return CardinalESE; + else if (azimuth < 146.25) + return CardinalSE; + else if (azimuth < 168.75) + return CardinalSSE; + else if (azimuth < 191.25) + return CardinalS; + + else if (azimuth < 213.75) + return CardinalSSW; + else if (azimuth < 236.25) + return CardinalSW; + else if (azimuth < 258.75) + return CardinalWSW; + else if (azimuth < 281.25) + return CardinalW; + else if (azimuth < 303.75) + return CardinalWNW; + else if (azimuth < 326.25) + return CardinalNW; + else + return CardinalNNW; + } + + // For values exceeding +- 720.0 + inline static double wrapLongExt(double lng) { + double remainder = fmod(lng + 180.0, 360.0); + return fmod(remainder + 360.0, 360.0) - 180.0; + } + + // Mirrors the azimuth against the X axis. Azimuth assumed to be in [0,360[ + inline static double mirrorAzimuthX(double azimuth) { + if (azimuth <= 90.0) + return 180.0 - azimuth; + else + return 180.0 + (360.0 - azimuth); + } + + // Mirrors the azimuth against the Y axis. Azimuth assumed to be in [0,360[ + inline static double mirrorAzimuthY(double azimuth) { + if (azimuth == 0.0) + return 0.0; + return 360.0 - azimuth; + } + + inline static double radians(double degrees) + { + return qDegreesToRadians(degrees); + } + + inline static double degrees(double radians) + { + return qRadiansToDegrees(radians); + } + + inline static double earthMeanRadius() + { + return 6371007.2; + } + + inline static double earthMeanCircumference() + { + return earthMeanRadius() * 2.0 * M_PI; + } + + inline static double mercatorMaxLatitude() + { + return 85.05113; + } + + inline static QGeoCoordinate antipodalPoint(const QGeoCoordinate &p) + { + return QGeoCoordinate(-p.latitude(), wrapLong(p.longitude() + 180.0)); + } + + // Leftmost longitude before wrapping kicks in + inline static double mapLeftLongitude(double centerLongitude) + { + return wrapLong(centerLongitude + leftOffset); + } + + // Rightmost longitude before wrapping kicks in + inline static double mapRightLongitude(double centerLongitude) + { + return wrapLong(centerLongitude - leftOffset); + } + + inline static void split_double(double input, float *hipart, float *lopart) + { + *hipart = (float) input; + double delta = input - ((double) *hipart); + *lopart = (float) delta; + } + + static qreal metersPerPixel(qreal zoomLevel, const QGeoCoordinate &coordinate) + { + const qreal metersPerTile = earthMeanCircumference() * std::cos(radians(coordinate.latitude())) / std::pow(2, zoomLevel); + return metersPerTile / 256.0; + } + + /* + returns the NMEA sentence type. + */ + static NmeaSentence getNmeaSentenceType(QByteArrayView bv); + + /* + Returns the satellite system type based on the message type. + See https://gpsd.gitlab.io/gpsd/NMEA.html#_talker_ids for reference + */ + static QGeoSatelliteInfo::SatelliteSystem getSatelliteSystem(QByteArrayView bv); + + /* + Returns the satellite system type based on the satellite id. + See https://gpsd.gitlab.io/gpsd/NMEA.html#_satellite_ids for reference + */ + static QGeoSatelliteInfo::SatelliteSystem getSatelliteSystemBySatelliteId(int satId); + + /* + Creates a QGeoPositionInfo from a GGA, GLL, RMC, VTG or ZDA sentence. + + Note: + - GGA and GLL sentences have time but not date so the update's + QDateTime object will have an invalid date. + - RMC reports date with a two-digit year so in this case the year + is assumed to be after the year 2000. + */ + static bool getPosInfoFromNmea(QByteArrayView bv, + QGeoPositionInfo *info, double uere, + bool *hasFix = nullptr); + + /* + Retruns a list of QGeoSatelliteInfo in the view. + + Note: this function has to be called repeatedly until it returns + QNmeaSatelliteInfoSource::FullyParsed. + Reason being that GSV sentences can be split into multiple samples, so + getting the full data requires parsing multiple sentences. + */ + static QNmeaSatelliteInfoSource::SatelliteInfoParseStatus + getSatInfoFromNmea(QByteArrayView bv, QList &infos, QGeoSatelliteInfo::SatelliteSystem &system); + + /* + Parses GSA for satellites in use. + + Returns satellite system type or QGeoSatelliteInfo::Undefined if parsing + failed + */ + static QGeoSatelliteInfo::SatelliteSystem getSatInUseFromNmea(QByteArrayView bv, + QList &pnrsInUse); + + /* + Returns true if the given NMEA sentence has a valid checksum. + */ + static bool hasValidNmeaChecksum(QByteArrayView bv); + + /* + Returns time from a string in hhmmss or hhmmss.z+ format. + */ + static bool getNmeaTime(const QByteArray &bytes, QTime *time); + + /* + Accepts for example ("2734.7964", 'S', "15306.0124", 'E') and returns the + lat-long values. Fails if lat or long fail isValidLat() or isValidLong(). + */ + static bool getNmeaLatLong(const QByteArray &latString, + char latDirection, + const QByteArray &lngString, + char lngDirection, + double *lat, + double *lon); +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qnmeapositioninfosource.cpp b/src/positioning/qnmeapositioninfosource.cpp new file mode 100644 index 0000000..1528cad --- /dev/null +++ b/src/positioning/qnmeapositioninfosource.cpp @@ -0,0 +1,964 @@ +// Copyright (C) 2016 Jolla Ltd. +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#include "qnmeapositioninfosource_p.h" +#include "qgeopositioninfo_p.h" +#include "qlocationutils_p.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +#define USE_POSITION_NMEA_PIMPL 0 + +#if USE_POSITION_NMEA_PIMPL +class QGeoPositionInfoPrivateNmea : public QGeoPositionInfoPrivate +{ +public: + virtual ~QGeoPositionInfoPrivateNmea(); + + QList nmeaSentences; +}; + + +QGeoPositionInfoPrivateNmea::~QGeoPositionInfoPrivateNmea() +{ + +} +#else +typedef QGeoPositionInfoPrivate QGeoPositionInfoPrivateNmea; +#endif + +static bool propagateCoordinate(QGeoPositionInfo &dst, const QGeoPositionInfo &src, bool force = true) +{ + bool updated = false; + QGeoCoordinate c = dst.coordinate(); + const QGeoCoordinate & srcCoordinate = src.coordinate(); + if (qIsFinite(src.coordinate().latitude()) + && (!qIsFinite(dst.coordinate().latitude()) || force)) { + updated |= (c.latitude() != srcCoordinate.latitude()); + c.setLatitude(src.coordinate().latitude()); + } + if (qIsFinite(src.coordinate().longitude()) + && (!qIsFinite(dst.coordinate().longitude()) || force)) { + updated |= (c.longitude() != srcCoordinate.longitude()); + c.setLongitude(src.coordinate().longitude()); + } + if (qIsFinite(src.coordinate().altitude()) + && (!qIsFinite(dst.coordinate().altitude()) || force)) { + updated |= (c.altitude() != srcCoordinate.altitude()); + c.setAltitude(src.coordinate().altitude()); + } + dst.setCoordinate(c); + return updated; +} + +static bool propagateDate(QGeoPositionInfo &dst, const QGeoPositionInfo &src) +{ + if (!dst.timestamp().date().isValid() && src.timestamp().isValid()) { // time was supposed to be set/the same already. Date can be overwritten. + dst.setTimestamp(src.timestamp()); + return true; + } + return false; +} + +static bool propagateAttributes(QGeoPositionInfo &dst, const QGeoPositionInfo &src, bool force = true) +{ + bool updated = false; + static Q_DECL_CONSTEXPR std::array attrs { + { QGeoPositionInfo::GroundSpeed + ,QGeoPositionInfo::HorizontalAccuracy + ,QGeoPositionInfo::VerticalAccuracy + ,QGeoPositionInfo::Direction + ,QGeoPositionInfo::VerticalSpeed + ,QGeoPositionInfo::MagneticVariation} }; + for (const auto a: attrs) { + if (src.hasAttribute(a) && (!dst.hasAttribute(a) || force)) { + updated |= (dst.attribute(a) != src.attribute(a)); + dst.setAttribute(a, src.attribute(a)); + } + } + + return updated; +} + +// returns false if src does not contain any additional or different data than dst, +// true otherwise. +static bool mergePositions(QGeoPositionInfo &dst, const QGeoPositionInfo &src, QByteArray nmeaSentence) +{ + bool updated = false; + + updated |= propagateCoordinate(dst, src); + updated |= propagateDate(dst, src); + updated |= propagateAttributes(dst, src); + +#if USE_POSITION_NMEA_PIMPL + QGeoPositionInfoPrivateNmea *dstPimpl = static_cast(QGeoPositionInfoPrivate::get(dst)); + dstPimpl->nmeaSentences.append(nmeaSentence); +#else + Q_UNUSED(nmeaSentence); +#endif + return updated; +} + +static qint64 msecsTo(const QDateTime &from, const QDateTime &to) +{ + if (!from.time().isValid() || !to.time().isValid()) + return 0; + + if (!from.date().isValid() || !to.date().isValid()) // use only time + return from.time().msecsTo(to.time()); + + return from.msecsTo(to); +} + +QNmeaReader::~QNmeaReader() + = default; + +QNmeaRealTimeReader::QNmeaRealTimeReader(QNmeaPositionInfoSourcePrivate *sourcePrivate) + : QNmeaReader(sourcePrivate), m_update(*new QGeoPositionInfoPrivateNmea) +{ + // An env var controlling the number of milliseconds to use to withold + // an update and wait for additional data to combine. + // The update will be pushed earlier than this if a newer update will be received. + // The update will be withold longer than this amount of time if additional + // valid data will keep arriving within this time frame. + bool ok = false; + int pushDelay = qEnvironmentVariableIntValue("QT_NMEA_PUSH_DELAY", &ok); + if (ok) + pushDelay = std::clamp(pushDelay, -1, 1000); + else + pushDelay = 20; + + if (pushDelay >= 0) { + m_timer.setSingleShot(true); + m_timer.setInterval(pushDelay); + m_timer.connect(&m_timer, &QTimer::timeout, &m_timer, [this]() { + this->notifyNewUpdate(); + }); + } + m_pushDelay = pushDelay; +} + +QNmeaRealTimeReader::~QNmeaRealTimeReader() + = default; + +void QNmeaRealTimeReader::readAvailableData() +{ + while (m_proxy->m_device->canReadLine()) { + const QTime infoTime = m_update.timestamp().time(); // if update has been set, time must be valid. + const QDate infoDate = m_update.timestamp().date(); // this one might not be valid, as some sentences do not contain it + + QGeoPositionInfoPrivateNmea *pimpl = new QGeoPositionInfoPrivateNmea; + QGeoPositionInfo pos(*pimpl); + + char buf[1024]; + qint64 size = m_proxy->m_device->readLine(buf, sizeof(buf)); + if (size <= 0) + continue; + + const bool oldFix = m_hasFix; + bool hasFix; + const bool parsed = m_proxy->parsePosInfoFromNmeaData( + QByteArrayView{buf, static_cast(size)}, &pos, &hasFix); + + if (!parsed) { + // got garbage, don't stop the timer + continue; + } + + m_hasFix |= hasFix; + m_updateParsed = true; + + // Date may or may not be valid, as some packets do not have date. + // If date isn't valid, match is performed on time only. + // Hence, make sure that packet blocks are generated with + // the sentences containing the full timestamp (e.g., GPRMC) *first* ! + if (infoTime.isValid()) { + if (pos.timestamp().time().isValid()) { + const bool newerTime = infoTime < pos.timestamp().time(); + const bool newerDate = (infoDate.isValid() // if time is valid but one date or both are not, + && pos.timestamp().date().isValid() + && infoDate < pos.timestamp().date()); + if (newerTime || newerDate) { + // Effectively read data for different update, that is also newer, + // so flush retained update, and copy the new pos into m_update + const QDate updateDate = m_update.timestamp().date(); + const QDate lastPushedDate = m_lastPushedTS.date(); + const bool newerTimestampSinceLastPushed = m_update.timestamp() > m_lastPushedTS; + const bool invalidDate = !(updateDate.isValid() && lastPushedDate.isValid()); + const bool newerTimeSinceLastPushed = m_update.timestamp().time() > m_lastPushedTS.time(); + if ( newerTimestampSinceLastPushed || (invalidDate && newerTimeSinceLastPushed)) { + m_proxy->notifyNewUpdate(&m_update, oldFix); + m_lastPushedTS = m_update.timestamp(); + } + m_timer.stop(); + // next update data + propagateAttributes(pos, m_update, false); + m_update = pos; + m_hasFix = hasFix; + } else { + if (infoTime == pos.timestamp().time()) + // timestamps match -- merge into m_update + if (mergePositions(m_update, pos, QByteArray(buf, size))) { + // Reset the timer only if new info has been received. + // Else the source might be keep repeating outdated info until + // new info become available. + m_timer.stop(); + } + // else discard out of order outdated info. + } + } else { + // no timestamp available in parsed update-- merge into m_update + if (mergePositions(m_update, pos, QByteArray(buf, size))) + m_timer.stop(); + } + } else { + // there was no info with valid TS. Overwrite with whatever is parsed. +#if USE_POSITION_NMEA_PIMPL + pimpl->nmeaSentences.append(QByteArray(buf, size)); +#endif + propagateAttributes(pos, m_update); + m_update = pos; + m_timer.stop(); + } + } + + if (m_updateParsed) { + if (m_pushDelay < 0) + notifyNewUpdate(); + else + m_timer.start(); + } +} + +void QNmeaRealTimeReader::notifyNewUpdate() +{ + const bool newerTime = m_update.timestamp().time() > m_lastPushedTS.time(); + const bool newerDate = (m_update.timestamp().date().isValid() + && m_lastPushedTS.date().isValid() + && m_update.timestamp().date() > m_lastPushedTS.date()); + if (newerTime || newerDate) { + m_proxy->notifyNewUpdate(&m_update, m_hasFix); + m_lastPushedTS = m_update.timestamp(); + } + m_timer.stop(); +} + + +//============================================================ + +QNmeaSimulatedReader::QNmeaSimulatedReader(QNmeaPositionInfoSourcePrivate *sourcePrivate) + : QNmeaReader(sourcePrivate), + m_currTimerId(-1), + m_hasValidDateTime(false) +{ +} + +QNmeaSimulatedReader::~QNmeaSimulatedReader() +{ + if (m_currTimerId > 0) + killTimer(m_currTimerId); +} + +void QNmeaSimulatedReader::readAvailableData() +{ + if (m_currTimerId > 0) // we are already reading + return; + + if (!m_hasValidDateTime) { // first update + Q_ASSERT(m_proxy->m_device && (m_proxy->m_device->openMode() & QIODevice::ReadOnly)); + + if (!setFirstDateTime()) { + //m_proxy->notifyReachedEndOfFile(); + qWarning("QNmeaPositionInfoSource: cannot find NMEA sentence with valid date & time"); + return; + } + + m_hasValidDateTime = true; + simulatePendingUpdate(); + + } else { + // previously read to EOF, but now new data has arrived + processNextSentence(); + } +} + +static int processSentence(QGeoPositionInfo &info, + QByteArray &m_nextLine, + QNmeaPositionInfoSourcePrivate *m_proxy, + QQueue &m_pendingUpdates, + bool &hasFix) +{ + int timeToNextUpdate = -1; + QDateTime prevTs; + if (!m_pendingUpdates.isEmpty()) + prevTs = m_pendingUpdates.head().info.timestamp(); + + // find the next update with a valid time (as long as the time is valid, + // we can calculate when the update should be emitted) + while (!m_nextLine.isEmpty() || (m_proxy->m_device && m_proxy->m_device->bytesAvailable() > 0)) { + char static_buf[1024]; + char *buf = static_buf; + QByteArray nextLine; + qint64 size = 0; + if (!m_nextLine.isEmpty()) { + // Read something in the previous call, but TS was later. + size = m_nextLine.size(); + nextLine = m_nextLine; + m_nextLine.clear(); + buf = nextLine.data(); + } else { + size = m_proxy->m_device->readLine(buf, sizeof(static_buf)); + } + + if (size <= 0) + continue; + + const QTime infoTime = info.timestamp().time(); // if info has been set, time must be valid. + const QDate infoDate = info.timestamp().date(); // this one might not be valid, as some sentences do not contain it + + /* + Packets containing time information are GGA, RMC, ZDA, GLL: + + GGA : GPS fix data - only time + GLL : geographic latitude and longitude - only time + RMC : recommended minimum FPOS/transit data - date and time + ZDA : only timestamp - date and time + + QLocationUtils is currently also capable of parsing VTG and GSA sentences: + + VTG: containing Track made good and ground speed + GSA: overall satellite data, w. accuracies (ends up into PositionInfo) + + Since these sentences contain no timestamp, their content will be merged with the content + from any prior sentence that had timestamp info, if any is available. + */ + + QGeoPositionInfoPrivateNmea *pimpl = new QGeoPositionInfoPrivateNmea; + QGeoPositionInfo pos(*pimpl); + if (m_proxy->parsePosInfoFromNmeaData( + QByteArrayView{buf, static_cast(size)}, &pos, &hasFix)) { + // Date may or may not be valid, as some packets do not have date. + // If date isn't valid, match is performed on time only. + // Hence, make sure that packet blocks are generated with + // the sentences containing the full timestamp (e.g., GPRMC) *first* ! + if (infoTime.isValid()) { + if (pos.timestamp().time().isValid()) { + const bool newerTime = infoTime < pos.timestamp().time(); + const bool newerDate = (infoDate.isValid() // if time is valid but one date or both are not, + && pos.timestamp().date().isValid() + && infoDate < pos.timestamp().date()); + if (newerTime || newerDate) { + // Effectively read data for different update, that is also newer, so copy buf into m_nextLine + m_nextLine = QByteArray(buf, size); + break; + } else { + if (infoTime == pos.timestamp().time()) + // timestamps match -- merge into info + mergePositions(info, pos, QByteArray(buf, size)); + // else discard out of order outdated info. + } + } else { + // no timestamp available -- merge into info + mergePositions(info, pos, QByteArray(buf, size)); + } + } else { + // there was no info with valid TS. Overwrite with whatever is parsed. +#if USE_POSITION_NMEA_PIMPL + pimpl->nmeaSentences.append(QByteArray(buf, size)); +#endif + info = pos; + } + + if (prevTs.time().isValid()) { + timeToNextUpdate = msecsTo(prevTs, info.timestamp()); + if (timeToNextUpdate < 0) // Somehow parsing expired packets, reset info + info = QGeoPositionInfo(*new QGeoPositionInfoPrivateNmea); + } + } + } + + return timeToNextUpdate; +} + +bool QNmeaSimulatedReader::setFirstDateTime() +{ + // find the first update with valid date and time + QGeoPositionInfo info(*new QGeoPositionInfoPrivateNmea); + bool hasFix = false; + processSentence(info, m_nextLine, m_proxy, m_pendingUpdates, hasFix); + + if (info.timestamp().time().isValid()) { // NMEA may have sentences with only time and no date. These would generate invalid positions + QPendingGeoPositionInfo pending; + pending.info = info; + pending.hasFix = hasFix; + m_pendingUpdates.enqueue(pending); + return true; + } + return false; +} + +void QNmeaSimulatedReader::simulatePendingUpdate() +{ + if (!m_pendingUpdates.isEmpty()) { + // will be dequeued in processNextSentence() + QPendingGeoPositionInfo &pending = m_pendingUpdates.head(); + m_proxy->notifyNewUpdate(&pending.info, pending.hasFix); + } + + processNextSentence(); +} + +void QNmeaSimulatedReader::timerEvent(QTimerEvent *event) +{ + killTimer(event->timerId()); + m_currTimerId = -1; + simulatePendingUpdate(); +} + +void QNmeaSimulatedReader::processNextSentence() +{ + QGeoPositionInfo info(*new QGeoPositionInfoPrivateNmea); + bool hasFix = false; + + int timeToNextUpdate = processSentence(info, m_nextLine, m_proxy, m_pendingUpdates, hasFix); + if (timeToNextUpdate < 0) + return; + + m_pendingUpdates.dequeue(); + + QPendingGeoPositionInfo pending; + pending.info = info; + pending.hasFix = hasFix; + m_pendingUpdates.enqueue(pending); + m_currTimerId = startTimer(timeToNextUpdate); +} + + +//============================================================ + + +QNmeaPositionInfoSourcePrivate::QNmeaPositionInfoSourcePrivate(QNmeaPositionInfoSource *parent, QNmeaPositionInfoSource::UpdateMode updateMode) + : QObject(parent), + m_updateMode(updateMode), + m_device(0), + m_invokedStart(false), + m_positionError(QGeoPositionInfoSource::UnknownSourceError), + m_userEquivalentRangeError(qQNaN()), + m_source(parent), + m_nmeaReader(0), + m_updateTimer(0), + m_requestTimer(0), + m_horizontalAccuracy(qQNaN()), + m_verticalAccuracy(qQNaN()), + m_noUpdateLastInterval(false), + m_updateTimeoutSent(false), + m_connectedReadyRead(false) +{ +} + +QNmeaPositionInfoSourcePrivate::~QNmeaPositionInfoSourcePrivate() +{ + delete m_nmeaReader; + delete m_updateTimer; +} + +bool QNmeaPositionInfoSourcePrivate::openSourceDevice() +{ + if (!m_device) { + qWarning("QNmeaPositionInfoSource: no QIODevice data source, call setDevice() first"); + return false; + } + + if (!m_device->isOpen() && !m_device->open(QIODevice::ReadOnly)) { + qWarning("QNmeaPositionInfoSource: cannot open QIODevice data source"); + return false; + } + + connect(m_device, SIGNAL(aboutToClose()), SLOT(sourceDataClosed())); + connect(m_device, SIGNAL(readChannelFinished()), SLOT(sourceDataClosed())); + connect(m_device, SIGNAL(destroyed()), SLOT(sourceDataClosed())); + + return true; +} + +void QNmeaPositionInfoSourcePrivate::sourceDataClosed() +{ + if (m_nmeaReader && m_device && m_device->bytesAvailable()) + m_nmeaReader->readAvailableData(); +} + +void QNmeaPositionInfoSourcePrivate::readyRead() +{ + if (m_nmeaReader) + m_nmeaReader->readAvailableData(); +} + +bool QNmeaPositionInfoSourcePrivate::initialize() +{ + if (m_nmeaReader) + return true; + + if (!openSourceDevice()) + return false; + + if (m_updateMode == QNmeaPositionInfoSource::RealTimeMode) + m_nmeaReader = new QNmeaRealTimeReader(this); + else + m_nmeaReader = new QNmeaSimulatedReader(this); + + return true; +} + +void QNmeaPositionInfoSourcePrivate::prepareSourceDevice() +{ + // some data may already be available + if (m_updateMode == QNmeaPositionInfoSource::SimulationMode) { + if (m_nmeaReader && m_device->bytesAvailable()) + m_nmeaReader->readAvailableData(); + } + + if (!m_connectedReadyRead) { + connect(m_device, SIGNAL(readyRead()), SLOT(readyRead())); + m_connectedReadyRead = true; + } +} + +bool QNmeaPositionInfoSourcePrivate::parsePosInfoFromNmeaData(QByteArrayView data, + QGeoPositionInfo *posInfo, bool *hasFix) +{ + return m_source->parsePosInfoFromNmeaData(data, posInfo, hasFix); +} + +void QNmeaPositionInfoSourcePrivate::startUpdates() +{ + if (m_invokedStart) + return; + + m_positionError = QGeoPositionInfoSource::NoError; + + m_invokedStart = true; + m_pendingUpdate = QGeoPositionInfo(); + m_noUpdateLastInterval = false; + + bool initialized = initialize(); + if (!initialized) { + m_source->setError(QGeoPositionInfoSource::AccessError); + return; + } + + if (m_updateMode == QNmeaPositionInfoSource::RealTimeMode) { + // skip over any buffered data - we only want the newest data. + // Don't do this in requestUpdate. In that case bufferedData is good to have/use. + if (m_device->bytesAvailable()) { + if (m_device->isSequential()) + m_device->readAll(); + else + m_device->seek(m_device->bytesAvailable()); + } + } + + if (m_updateTimer) + m_updateTimer->stop(); + + if (m_source->updateInterval() > 0) { + if (!m_updateTimer) + m_updateTimer = new QBasicTimer; + m_updateTimer->start(m_source->updateInterval(), this); + } + + if (initialized) + prepareSourceDevice(); +} + +void QNmeaPositionInfoSourcePrivate::stopUpdates() +{ + m_invokedStart = false; + if (m_updateTimer) + m_updateTimer->stop(); + m_pendingUpdate = QGeoPositionInfo(); + m_noUpdateLastInterval = false; +} + +void QNmeaPositionInfoSourcePrivate::requestUpdate(int msec) +{ + if (m_requestTimer && m_requestTimer->isActive()) + return; + + m_positionError = QGeoPositionInfoSource::NoError; + + if (msec <= 0 || msec < m_source->minimumUpdateInterval()) { + m_source->setError(QGeoPositionInfoSource::UpdateTimeoutError); + return; + } + + if (!m_requestTimer) { + m_requestTimer = new QTimer(this); + connect(m_requestTimer, SIGNAL(timeout()), SLOT(updateRequestTimeout())); + } + + bool initialized = initialize(); + if (!initialized) { + m_source->setError(QGeoPositionInfoSource::UpdateTimeoutError); + return; + } + + m_requestTimer->start(msec); + prepareSourceDevice(); +} + +void QNmeaPositionInfoSourcePrivate::updateRequestTimeout() +{ + m_requestTimer->stop(); + m_source->setError(QGeoPositionInfoSource::UpdateTimeoutError); +} + +void QNmeaPositionInfoSourcePrivate::notifyNewUpdate(QGeoPositionInfo *update, bool hasFix) +{ + // include before uncommenting + //qDebug() << "QNmeaPositionInfoSourcePrivate::notifyNewUpdate()" << update->timestamp() << hasFix << m_invokedStart << (m_requestTimer && m_requestTimer->isActive()); + + QDate date = update->timestamp().date(); + if (date.isValid()) { + m_currentDate = date; + } else { + // some sentence have time but no date + QTime time = update->timestamp().time(); + if (time.isValid() && m_currentDate.isValid()) + update->setTimestamp(QDateTime(m_currentDate, time, QTimeZone::UTC)); + } + + // Some attributes are sent in separate NMEA sentences. Save and restore the accuracy + // measurements. + if (update->hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) + m_horizontalAccuracy = update->attribute(QGeoPositionInfo::HorizontalAccuracy); + else if (!qIsNaN(m_horizontalAccuracy)) + update->setAttribute(QGeoPositionInfo::HorizontalAccuracy, m_horizontalAccuracy); + + if (update->hasAttribute(QGeoPositionInfo::VerticalAccuracy)) + m_verticalAccuracy = update->attribute(QGeoPositionInfo::VerticalAccuracy); + else if (!qIsNaN(m_verticalAccuracy)) + update->setAttribute(QGeoPositionInfo::VerticalAccuracy, m_verticalAccuracy); + + if (hasFix && update->isValid()) { + if (m_requestTimer && m_requestTimer->isActive()) { // User called requestUpdate() + m_requestTimer->stop(); + emitUpdated(*update); + } else if (m_invokedStart) { // user called startUpdates() + if (m_updateTimer && m_updateTimer->isActive()) { // update interval > 0 + // for periodic updates, only want the most recent update + m_pendingUpdate = *update; // Set what to send in timerEvent() + if (m_noUpdateLastInterval) { + // if the update was invalid when timerEvent was last called, a valid update + // should be sent ASAP + emitPendingUpdate(); + m_noUpdateLastInterval = false; + } + } else { // update interval <= 0 + emitUpdated(*update); + } + } + m_lastUpdate = *update; // Set in any case, if update is valid. Used in lastKnownPosition(). + } +} + +void QNmeaPositionInfoSourcePrivate::timerEvent(QTimerEvent *) +{ + emitPendingUpdate(); +} + +void QNmeaPositionInfoSourcePrivate::emitPendingUpdate() +{ + if (m_pendingUpdate.isValid()) { + m_updateTimeoutSent = false; + m_noUpdateLastInterval = false; + emitUpdated(m_pendingUpdate); + m_pendingUpdate = QGeoPositionInfo(); + } else { // invalid update + if (m_noUpdateLastInterval && !m_updateTimeoutSent) { + m_updateTimeoutSent = true; + m_pendingUpdate = QGeoPositionInfo(); // Invalid already, but clear just in case. + m_source->setError(QGeoPositionInfoSource::UpdateTimeoutError); + } + m_noUpdateLastInterval = true; + } +} + +void QNmeaPositionInfoSourcePrivate::emitUpdated(const QGeoPositionInfo &update) +{ + // check for duplication already done in QNmeaRealTimeReader::notifyNewUpdate + // and QNmeaRealTimeReader::readAvailableData + m_lastUpdate = update; + emit m_source->positionUpdated(update); +} + +//========================================================= + +/*! + \class QNmeaPositionInfoSource + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \since 5.2 + + \brief The QNmeaPositionInfoSource class provides positional information using a NMEA data source. + + NMEA is a commonly used protocol for the specification of one's global + position at a certain point in time. The QNmeaPositionInfoSource class reads NMEA + data and uses it to provide positional data in the form of + QGeoPositionInfo objects. + + A QNmeaPositionInfoSource instance operates in either \l {RealTimeMode} or + \l {SimulationMode}. These modes allow NMEA data to be read from either a + live source of positional data, or replayed for simulation purposes from + previously recorded NMEA data. + + The source of NMEA data is set with setDevice(). + + Use startUpdates() to start receiving regular position updates and stopUpdates() to stop these + updates. If you only require updates occasionally, you can call requestUpdate() to request a + single update. + + In both cases the position information is received via the positionUpdated() signal and the + last known position can be accessed with lastKnownPosition(). + + QNmeaPositionInfoSource supports reporting the accuracy of the horizontal and vertical position. + To enable position accuracy reporting an estimate of the User Equivalent Range Error associated + with the NMEA source must be set with setUserEquivalentRangeError(). +*/ + + +/*! + \enum QNmeaPositionInfoSource::UpdateMode + Defines the available update modes. + + \value RealTimeMode Positional data is read and distributed from the data source as it becomes available. Use this mode if you are using a live source of positional data (for example, a GPS hardware device). + \value SimulationMode The data and time information in the NMEA source data is used to provide positional updates at the rate at which the data was originally recorded. Use this mode if the data source contains previously recorded NMEA data and you want to replay the data for simulation purposes. +*/ + + +/*! + Constructs a QNmeaPositionInfoSource instance with the given \a parent + and \a updateMode. +*/ +QNmeaPositionInfoSource::QNmeaPositionInfoSource(UpdateMode updateMode, QObject *parent) + : QGeoPositionInfoSource(parent), + d(new QNmeaPositionInfoSourcePrivate(this, updateMode)) +{ +} + +/*! + Destroys the position source. +*/ +QNmeaPositionInfoSource::~QNmeaPositionInfoSource() +{ + delete d; +} + +/*! + Sets the User Equivalent Range Error (UERE) to \a uere. The UERE is used in calculating an + estimate of the accuracy of the position information reported by the position info source. The + UERE should be set to a value appropriate for the GPS device which generated the NMEA stream. + + The true UERE value is calculated from multiple error sources including errors introduced by + the satellites and signal propogation delays through the atmosphere as well as errors + introduced by the receiving GPS equipment. For details on GPS accuracy see + \l {https://web.archive.org/web/20161212144906if_/http://edu-observatory.org/gps/gps_accuracy.html} {Sam J. Wormley, GPS Errors & Estimating Your Reveiver's Accuracy}. + + A typical value for UERE is approximately 5.1. + + \since 5.3 + + \sa userEquivalentRangeError() +*/ +void QNmeaPositionInfoSource::setUserEquivalentRangeError(double uere) +{ + d->m_userEquivalentRangeError = uere; +} + +/*! + Returns the current User Equivalent Range Error (UERE). The UERE is used in calculating an + estimate of the accuracy of the position information reported by the position info source. The + default value is NaN which means no accuracy information will be provided. + + \since 5.3 + + \sa setUserEquivalentRangeError() +*/ +double QNmeaPositionInfoSource::userEquivalentRangeError() const +{ + return d->m_userEquivalentRangeError; +} + +/*! + Parses an NMEA sentence string into a QGeoPositionInfo. + + The default implementation will parse standard NMEA sentences. + This method should be reimplemented in a subclass whenever the need to deal with non-standard + NMEA sentences arises. + + The parser reads \a size bytes from \a data and uses that information to setup \a posInfo and + \a hasFix. If \a hasFix is set to false then \a posInfo may contain only the time or the date + and the time. + + Returns true if the sentence was successfully parsed, otherwise returns false and should not + modifiy \a posInfo or \a hasFix. +*/ + +#if QT_DEPRECATED_SINCE(7, 0) +bool QNmeaPositionInfoSource::parsePosInfoFromNmeaData(const char *data, int size, + QGeoPositionInfo *posInfo, bool *hasFix) +{ +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) + return QLocationUtils::getPosInfoFromNmea(QByteArrayView{data, size}, posInfo, + d->m_userEquivalentRangeError, hasFix); +#else + return parsePosInfoFromNmeaData(QByteArrayView{data, size}, posInfo, hasFix); +#endif +} +#endif // QT_DEPRECATED_SINCE(7, 0) + +bool QNmeaPositionInfoSource::parsePosInfoFromNmeaData(QByteArrayView data, + QGeoPositionInfo *posInfo, bool *hasFix) +{ +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) + return parsePosInfoFromNmeaData(data.data(), static_cast(data.size()), + posInfo, hasFix); +#else + return QLocationUtils::getPosInfoFromNmea(data, posInfo, + d->m_userEquivalentRangeError, hasFix); +#endif +} + + +/*! + Returns the update mode. +*/ +QNmeaPositionInfoSource::UpdateMode QNmeaPositionInfoSource::updateMode() const +{ + return d->m_updateMode; +} + +/*! + Sets the NMEA data source to \a device. If the device is not open, it + will be opened in QIODevice::ReadOnly mode. + + The source device can only be set once and must be set before calling + startUpdates() or requestUpdate(). + + \b {Note:} The \a device must emit QIODevice::readyRead() for the + source to be notified when data is available for reading. + QNmeaPositionInfoSource does not assume the ownership of the device, + and hence does not deallocate it upon destruction. +*/ +void QNmeaPositionInfoSource::setDevice(QIODevice *device) +{ + if (device != d->m_device) { + if (!d->m_device) + d->m_device = device; + else + qWarning("QNmeaPositionInfoSource: source device has already been set"); + } +} + +/*! + Returns the NMEA data source. +*/ +QIODevice *QNmeaPositionInfoSource::device() const +{ + return d->m_device; +} + +/*! + \reimp +*/ +void QNmeaPositionInfoSource::setUpdateInterval(int msec) +{ + int interval = msec; + if (interval != 0) + interval = qMax(msec, minimumUpdateInterval()); + QGeoPositionInfoSource::setUpdateInterval(interval); + if (d->m_invokedStart) { + d->stopUpdates(); + d->startUpdates(); + } +} + +/*! + \reimp +*/ +void QNmeaPositionInfoSource::startUpdates() +{ + d->startUpdates(); +} + +/*! + \reimp +*/ +void QNmeaPositionInfoSource::stopUpdates() +{ + d->stopUpdates(); +} + +/*! + \reimp +*/ +void QNmeaPositionInfoSource::requestUpdate(int msec) +{ + d->requestUpdate(msec == 0 ? 60000 * 5 : msec); // 5min default timeout +} + +/*! + \reimp +*/ +QGeoPositionInfo QNmeaPositionInfoSource::lastKnownPosition(bool) const +{ + // the bool value does not matter since we only use satellite positioning + return d->m_lastUpdate; +} + +/*! + \reimp +*/ +QGeoPositionInfoSource::PositioningMethods QNmeaPositionInfoSource::supportedPositioningMethods() const +{ + return SatellitePositioningMethods; +} + +/*! + \reimp +*/ +int QNmeaPositionInfoSource::minimumUpdateInterval() const +{ + return 2; // Some chips are capable of over 100 updates per seconds. +} + +/*! + \reimp +*/ +QGeoPositionInfoSource::Error QNmeaPositionInfoSource::error() const +{ + return d->m_positionError; +} + +void QNmeaPositionInfoSource::setError(QGeoPositionInfoSource::Error positionError) +{ + d->m_positionError = positionError; + if (d->m_positionError != QGeoPositionInfoSource::NoError) + emit QGeoPositionInfoSource::errorOccurred(positionError); +} + +QT_END_NAMESPACE + +#include "moc_qnmeapositioninfosource_p.cpp" +#include "moc_qnmeapositioninfosource.cpp" diff --git a/src/positioning/qnmeapositioninfosource.h b/src/positioning/qnmeapositioninfosource.h new file mode 100644 index 0000000..4016c75 --- /dev/null +++ b/src/positioning/qnmeapositioninfosource.h @@ -0,0 +1,70 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QNMEAPOSITIONINFOSOURCE_H +#define QNMEAPOSITIONINFOSOURCE_H + +#include + +QT_BEGIN_NAMESPACE + +class QIODevice; + +class QNmeaPositionInfoSourcePrivate; +class Q_POSITIONING_EXPORT QNmeaPositionInfoSource : public QGeoPositionInfoSource +{ + Q_OBJECT +public: + enum UpdateMode { + RealTimeMode = 1, + SimulationMode + }; + + explicit QNmeaPositionInfoSource(UpdateMode updateMode, QObject *parent = nullptr); + ~QNmeaPositionInfoSource(); + + void setUserEquivalentRangeError(double uere); + double userEquivalentRangeError() const; + + UpdateMode updateMode() const; + + void setDevice(QIODevice *source); + QIODevice *device() const; + + void setUpdateInterval(int msec) override; + + QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const override; + PositioningMethods supportedPositioningMethods() const override; + int minimumUpdateInterval() const override; + Error error() const override; + + +public Q_SLOTS: + void startUpdates() override; + void stopUpdates() override; + void requestUpdate(int timeout = 0) override; + +protected: +#if QT_DEPRECATED_SINCE(7, 0) + QT6_ONLY(virtual) + bool parsePosInfoFromNmeaData(const char *data, + int size, + QGeoPositionInfo *posInfo, + bool *hasFix); +#endif + // ### Qt 7: design a return type that gets rid of out-parameters + QT7_ONLY(virtual) + bool parsePosInfoFromNmeaData(QByteArrayView data, + QGeoPositionInfo *posInfo, + bool *hasFix); + + void setError(QGeoPositionInfoSource::Error positionError); + +private: + Q_DISABLE_COPY(QNmeaPositionInfoSource) + friend class QNmeaPositionInfoSourcePrivate; + QNmeaPositionInfoSourcePrivate *d; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qnmeapositioninfosource_p.h b/src/positioning/qnmeapositioninfosource_p.h new file mode 100644 index 0000000..8957ded --- /dev/null +++ b/src/positioning/qnmeapositioninfosource_p.h @@ -0,0 +1,154 @@ +// Copyright (C) 2018 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QNMEAPOSITIONINFOSOURCE_P_H +#define QNMEAPOSITIONINFOSOURCE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qnmeapositioninfosource.h" +#include "qgeopositioninfo.h" + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QBasicTimer; +class QTimerEvent; +class QTimer; + +class QNmeaReader; +struct QPendingGeoPositionInfo +{ + QGeoPositionInfo info; + bool hasFix; +}; + + +class QNmeaPositionInfoSourcePrivate : public QObject +{ + Q_OBJECT +public: + QNmeaPositionInfoSourcePrivate(QNmeaPositionInfoSource *parent, QNmeaPositionInfoSource::UpdateMode updateMode); + ~QNmeaPositionInfoSourcePrivate(); + + void startUpdates(); + void stopUpdates(); + void requestUpdate(int msec); + + bool parsePosInfoFromNmeaData(QByteArrayView data, + QGeoPositionInfo *posInfo, + bool *hasFix); + + void notifyNewUpdate(QGeoPositionInfo *update, bool fixStatus); + + QNmeaPositionInfoSource::UpdateMode m_updateMode; + QPointer m_device; + QGeoPositionInfo m_lastUpdate; + bool m_invokedStart; + QGeoPositionInfoSource::Error m_positionError; + double m_userEquivalentRangeError; + +public Q_SLOTS: + void readyRead(); + +protected: + void timerEvent(QTimerEvent *event) override; + +private Q_SLOTS: + void emitPendingUpdate(); + void sourceDataClosed(); + void updateRequestTimeout(); + +private: + bool openSourceDevice(); + bool initialize(); + void prepareSourceDevice(); + void emitUpdated(const QGeoPositionInfo &update); + + QNmeaPositionInfoSource *m_source; + QNmeaReader *m_nmeaReader; + QGeoPositionInfo m_pendingUpdate; + QDate m_currentDate; + QBasicTimer *m_updateTimer; // the timer used in startUpdates() + QTimer *m_requestTimer; // the timer used in requestUpdate() + qreal m_horizontalAccuracy; + qreal m_verticalAccuracy; + bool m_noUpdateLastInterval; + bool m_updateTimeoutSent; + bool m_connectedReadyRead; +}; + + +class QNmeaReader +{ +public: + explicit QNmeaReader(QNmeaPositionInfoSourcePrivate *sourcePrivate) + : m_proxy(sourcePrivate) {} + virtual ~QNmeaReader(); + + virtual void readAvailableData() = 0; + +protected: + QNmeaPositionInfoSourcePrivate *m_proxy; +}; + + +class QNmeaRealTimeReader : public QNmeaReader +{ +public: + explicit QNmeaRealTimeReader(QNmeaPositionInfoSourcePrivate *sourcePrivate); + ~QNmeaRealTimeReader() override; + + void readAvailableData() override; + void notifyNewUpdate(); + + // Data members + QGeoPositionInfo m_update; + QDateTime m_lastPushedTS; + bool m_updateParsed = false; + bool m_hasFix = false; + QTimer m_timer; + int m_pushDelay = -1; +}; + + +class QNmeaSimulatedReader : public QObject, public QNmeaReader +{ + Q_OBJECT +public: + explicit QNmeaSimulatedReader(QNmeaPositionInfoSourcePrivate *sourcePrivate); + ~QNmeaSimulatedReader(); + void readAvailableData() override; + +protected: + void timerEvent(QTimerEvent *event) override; + +private Q_SLOTS: + void simulatePendingUpdate(); + +private: + bool setFirstDateTime(); + void processNextSentence(); + + QQueue m_pendingUpdates; + QByteArray m_nextLine; + int m_currTimerId; + bool m_hasValidDateTime; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qnmeasatelliteinfosource.cpp b/src/positioning/qnmeasatelliteinfosource.cpp new file mode 100644 index 0000000..b920dee --- /dev/null +++ b/src/positioning/qnmeasatelliteinfosource.cpp @@ -0,0 +1,918 @@ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qnmeasatelliteinfosource.h" +#include "private/qnmeasatelliteinfosource_p.h" +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +#if USE_SATELLITE_NMEA_PIMPL +class QGeoSatelliteInfoPrivateNmea : public QGeoSatelliteInfoPrivate +{ +public: + QGeoSatelliteInfoPrivateNmea(const QGeoSatelliteInfoPrivate &other); + QGeoSatelliteInfoPrivateNmea(const QGeoSatelliteInfoPrivateNmea &other); + virtual ~QGeoSatelliteInfoPrivateNmea(); + + QList nmeaSentences; +}; + +QGeoSatelliteInfoPrivateNmea::QGeoSatelliteInfoPrivateNmea(const QGeoSatelliteInfoPrivate &other) + : QGeoSatelliteInfoPrivate(other) +{ +} + +QGeoSatelliteInfoPrivateNmea::QGeoSatelliteInfoPrivateNmea(const QGeoSatelliteInfoPrivateNmea &other) + : QGeoSatelliteInfoPrivate(other) +{ + nmeaSentences = other.nmeaSentences; +} + +QGeoSatelliteInfoPrivateNmea::~QGeoSatelliteInfoPrivateNmea() {} +#else +typedef QGeoSatelliteInfoPrivate QGeoSatelliteInfoPrivateNmea; +#endif + +QNmeaSatelliteInfoSourcePrivate::QNmeaSatelliteInfoSourcePrivate(QNmeaSatelliteInfoSource *parent, QNmeaSatelliteInfoSource::UpdateMode updateMode) + : m_source(parent), + m_updateMode(updateMode) +{ +} + +void QNmeaSatelliteInfoSourcePrivate::notifyNewUpdate() +{ + if (m_pendingUpdate.isValid() && m_pendingUpdate.isFresh()) { + if (m_requestTimer && m_requestTimer->isActive()) { // User called requestUpdate() + m_requestTimer->stop(); + emitUpdated(m_pendingUpdate, true); + } else if (m_invokedStart) { // user called startUpdates() + if (m_updateTimer && m_updateTimer->isActive()) { // update interval > 0 + // for periodic updates, only want the most recent update + if (m_noUpdateLastInterval) { + // if the update was invalid when timerEvent was last called, a valid update + // should be sent ASAP + emitPendingUpdate(); // m_noUpdateLastInterval handled in there. + } + } else { // update interval <= 0, send anything new ASAP + m_noUpdateLastInterval = !emitUpdated(m_pendingUpdate, false); + } + } + } +} + +void QNmeaSatelliteInfoSourcePrivate::processNmeaData(QNmeaSatelliteInfoUpdate &updateInfo) +{ + char buf[1024]; + qint64 size = m_device->readLine(buf, sizeof(buf)); + if (size <= 0) + return; + + QList satInUse; + const auto satSystemType = m_source->parseSatellitesInUseFromNmea(QByteArrayView{buf,static_cast(size)}, + satInUse); + if (satSystemType != QGeoSatelliteInfo::Undefined) { + const bool res = updateInfo.setSatellitesInUse(satSystemType, satInUse); +#if USE_SATELLITE_NMEA_PIMPL + if (res) { + updateInfo.gsa = QByteArray(buf, size); + auto &info = updateInfo.m_satellites[satSystemType]; + if (!info.satellitesInUse.isEmpty()) { + for (auto &s : info.satellitesInUse) { + static_cast(QGeoSatelliteInfoPrivate::get(s)) + ->nmeaSentences.append(updateInfo.gsa); + } + for (auto &s : info.satellitesInView) { + static_cast(QGeoSatelliteInfoPrivate::get(s)) + ->nmeaSentences.append(updateInfo.gsa); + } + } + } +#else + Q_UNUSED(res) +#endif // USE_SATELLITE_NMEA_PIMPL + } else { + // Here we have the assumption that multiple parts of GSV sentence + // come one after another. At least this is how it should be. + auto systemType = QGeoSatelliteInfo::Undefined; + const auto parserStatus = m_source->parseSatelliteInfoFromNmea( + QByteArrayView{buf,static_cast(size)}, updateInfo.m_satellitesInViewParsed, systemType); + if (parserStatus == QNmeaSatelliteInfoSource::PartiallyParsed) { + updateInfo.m_satellites[systemType].updatingGSV = true; +#if USE_SATELLITE_NMEA_PIMPL + updateInfo.gsv.append(QByteArray(buf, size)); +#endif + } else if (parserStatus == QNmeaSatelliteInfoSource::FullyParsed) { +#if USE_SATELLITE_NMEA_PIMPL + updateInfo.gsv.append(QByteArray(buf, size)); + for (int i = 0; i < updateInfo.m_satellitesInViewParsed.size(); i++) { + const QGeoSatelliteInfo &s = updateInfo.m_satellitesInViewParsed.at(i); + QGeoSatelliteInfoPrivateNmea *pimpl = + new QGeoSatelliteInfoPrivateNmea(*QGeoSatelliteInfoPrivate::get(s)); + pimpl->nmeaSentences.append(updateInfo.gsa); + pimpl->nmeaSentences.append(updateInfo.gsv); + updateInfo.m_satellitesInViewParsed.replace(i, QGeoSatelliteInfo(*pimpl)); + } + updateInfo.gsv.clear(); +#endif + updateInfo.setSatellitesInView(systemType, updateInfo.m_satellitesInViewParsed); + } + } +} + +QNmeaSatelliteInfoSourcePrivate::~QNmeaSatelliteInfoSourcePrivate() +{ + delete m_updateTimer; +} + +void QNmeaSatelliteInfoSourcePrivate::startUpdates() +{ + if (m_invokedStart) + return; + + m_satelliteError = QGeoSatelliteInfoSource::NoError; + + m_invokedStart = true; + m_pendingUpdate.clear(); + m_noUpdateLastInterval = false; + + bool initialized = initialize(); + if (!initialized) + return; + + if (m_updateMode == QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode) { + // skip over any buffered data - we only want the newest data. + // Don't do this in requestUpdate. In that case bufferedData is good to have/use. + if (m_device->bytesAvailable()) { + if (m_device->isSequential()) + m_device->readAll(); + else + m_device->seek(m_device->bytesAvailable()); + } + } + + if (m_updateTimer) + m_updateTimer->stop(); + + if (m_source->updateInterval() > 0) { + if (!m_updateTimer) + m_updateTimer = new QBasicTimer; + m_updateTimer->start(m_source->updateInterval(), this); + } + + if (initialized) + prepareSourceDevice(); +} + +void QNmeaSatelliteInfoSourcePrivate::stopUpdates() +{ + m_invokedStart = false; + if (m_updateTimer) + m_updateTimer->stop(); + m_pendingUpdate.clear(); + m_noUpdateLastInterval = false; +} + +void QNmeaSatelliteInfoSourcePrivate::requestUpdate(int msec) +{ + if (m_requestTimer && m_requestTimer->isActive()) + return; + + m_satelliteError = QGeoSatelliteInfoSource::NoError; + + if (msec <= 0 || msec < m_source->minimumUpdateInterval()) { + m_source->setError(QGeoSatelliteInfoSource::UpdateTimeoutError); + return; + } + + if (!m_requestTimer) { + m_requestTimer = new QTimer(this); + connect(m_requestTimer, SIGNAL(timeout()), SLOT(updateRequestTimeout())); + } + + bool initialized = initialize(); + if (!initialized) { + m_source->setError(QGeoSatelliteInfoSource::UpdateTimeoutError); + return; + } + + m_requestTimer->start(msec); + prepareSourceDevice(); +} + +void QNmeaSatelliteInfoSourcePrivate::readyRead() +{ + if (m_nmeaReader) + m_nmeaReader->readAvailableData(); +} + +void QNmeaSatelliteInfoSourcePrivate::emitPendingUpdate() +{ + if (m_pendingUpdate.isValid() && m_pendingUpdate.isFresh()) { + m_updateTimeoutSent = false; + m_noUpdateLastInterval = false; + if (!emitUpdated(m_pendingUpdate, false)) + m_noUpdateLastInterval = true; + // m_pendingUpdate.clear(); // Do not clear, it will be incrementally updated + } else { // invalid or not fresh update + if (m_noUpdateLastInterval && !m_updateTimeoutSent) { + m_updateTimeoutSent = true; + m_source->setError(QGeoSatelliteInfoSource::UpdateTimeoutError); + } + m_noUpdateLastInterval = true; + } +} + +void QNmeaSatelliteInfoSourcePrivate::sourceDataClosed() +{ + if (m_nmeaReader && m_device && m_device->bytesAvailable()) + m_nmeaReader->readAvailableData(); +} + +void QNmeaSatelliteInfoSourcePrivate::updateRequestTimeout() +{ + m_requestTimer->stop(); + m_source->setError(QGeoSatelliteInfoSource::UpdateTimeoutError); +} + +bool QNmeaSatelliteInfoSourcePrivate::openSourceDevice() +{ + if (!m_device) { + qWarning("QNmeaSatelliteInfoSource: no QIODevice data source, call setDevice() first"); + return false; + } + + if (!m_device->isOpen() && !m_device->open(QIODevice::ReadOnly)) { + qWarning("QNmeaSatelliteInfoSource: cannot open QIODevice data source"); + return false; + } + + connect(m_device, SIGNAL(aboutToClose()), SLOT(sourceDataClosed())); + connect(m_device, SIGNAL(readChannelFinished()), SLOT(sourceDataClosed())); + connect(m_device, SIGNAL(destroyed()), SLOT(sourceDataClosed())); + + return true; +} + +bool QNmeaSatelliteInfoSourcePrivate::initialize() +{ + if (m_nmeaReader) + return true; + + if (!openSourceDevice()) + return false; + + if (m_updateMode == QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode) + m_nmeaReader.reset(new QNmeaSatelliteRealTimeReader(this)); + else + m_nmeaReader.reset(new QNmeaSatelliteSimulationReader(this)); + + return true; +} + +void QNmeaSatelliteInfoSourcePrivate::prepareSourceDevice() +{ + // some data may already be available + if (m_updateMode == QNmeaSatelliteInfoSource::UpdateMode::SimulationMode) { + if (m_nmeaReader && m_device->bytesAvailable()) + m_nmeaReader->readAvailableData(); + } + + if (!m_connectedReadyRead) { + connect(m_device, SIGNAL(readyRead()), SLOT(readyRead())); + m_connectedReadyRead = true; + } +} + +bool QNmeaSatelliteInfoSourcePrivate::emitUpdated(QNmeaSatelliteInfoUpdate &update, + bool fromRequestUpdate) +{ + bool emitted = false; + if (!update.isFresh()) + return emitted; + + update.consume(); + bool inUseUpdated = false; + bool inViewUpdated = false; + if (!fromRequestUpdate) { + // we need to send update if information from at least one satellite + // systems has changed + for (auto it = update.m_satellites.cbegin(); it != update.m_satellites.cend(); ++it) { + inUseUpdated |= + it->satellitesInUse != m_lastUpdate.m_satellites[it.key()].satellitesInUse; + inViewUpdated |= + it->satellitesInView != m_lastUpdate.m_satellites[it.key()].satellitesInView; + } + } else { + // if we come here from requestUpdate(), we need to emit, even if the data + // didn't really change + inUseUpdated = true; + inViewUpdated = true; + } + + m_lastUpdate = update; + if (update.m_validInUse && inUseUpdated) { + emit m_source->satellitesInUseUpdated(update.allSatellitesInUse()); + emitted = true; + } + if (update.m_validInView && inViewUpdated) { + emit m_source->satellitesInViewUpdated(update.allSatellitesInView()); + emitted = true; + } + return emitted; +} + +void QNmeaSatelliteInfoSourcePrivate::timerEvent(QTimerEvent * /*event*/) +{ + emitPendingUpdate(); +} + +/*! + \class QNmeaSatelliteInfoSource + \inmodule QtPositioning + \ingroup QtPositioning-positioning + \since 6.2 + + \brief The \l QNmeaSatelliteInfoSource class provides satellite information + using an NMEA data source. + + NMEA is a commonly used protocol for the specification of one's global + position at a certain point in time. The \l QNmeaSatelliteInfoSource class + reads NMEA data and uses it to provide information about satellites in view + and satellites in use in form of lists of \l QGeoSatelliteInfo objects. + + A \l QNmeaSatelliteInfoSource instance operates in either \l {RealTimeMode} + or \l {SimulationMode}. These modes allow NMEA data to be read from either a + live source of data, or replayed for simulation purposes from previously + recorded NMEA data. + + The source of NMEA data is set via \l setDevice(). + + Use \l startUpdates() to start receiving regular satellite information + updates and \l stopUpdates() to stop these updates. If you only require + updates occasionally, you can call \l requestUpdate() to request a single + update of both satellites in view and satellites in use. + + The information about satellites in view is received via the + \l satellitesInViewUpdated() signal. + + The information about satellites in use is received via the + \l satellitesInUseUpdated() signal. +*/ + +/*! + \enum QNmeaSatelliteInfoSource::UpdateMode + Defines the available update modes. + + \value RealTimeMode Satellite information is read and distributed from the + data source as it becomes available. Use this mode if you are using + a live source of NMEA data (for example a GPS hardware device). + \value SimulationMode Satellite information is read and distributed from the + data source at the given rate. The rate is determined by the + \l {QNmeaSatelliteInfoSource::}{SimulationUpdateInterval} parameter. + Use this mode if the data source contains previously recorded NMEA + data and you want to replay the data for simulation purposes. +*/ + +/*! + \variable QNmeaSatelliteInfoSource::SimulationUpdateInterval + \brief The backend property name for data read rate in the + \l SimulationMode. The value for this property is the integer number + representing the amount of milliseconds between the subsequent reads. + Use this parameter in the \l {QNmeaSatelliteInfoSource::} + {setBackendProperty()} and \l {QNmeaSatelliteInfoSource::}{backendProperty()} + methods. + + \note This property is different from the interval that can be set via + \l {setUpdateInterval()}. The value set via \l {setUpdateInterval()} + denotes an interval for the user notification, while this parameter + specifies the internal frequency of reading the data from source file. It + means that one can have multiple (or none) reads during the + \l {updateInterval()} period. +*/ +QString QNmeaSatelliteInfoSource::SimulationUpdateInterval = + QStringLiteral("nmea.satellite_info_simulation_interval"); + +/*! + Constructs a \l QNmeaSatelliteInfoSource instance with the given \a parent + and \a mode. +*/ +QNmeaSatelliteInfoSource::QNmeaSatelliteInfoSource(UpdateMode mode, QObject *parent) + : QGeoSatelliteInfoSource(parent), + d(new QNmeaSatelliteInfoSourcePrivate(this, mode)) +{ +} + +/*! + Destroys the satellite information source. +*/ +QNmeaSatelliteInfoSource::~QNmeaSatelliteInfoSource() +{ + delete d; +} + +/*! + Returns the update mode. +*/ +QNmeaSatelliteInfoSource::UpdateMode QNmeaSatelliteInfoSource::updateMode() const +{ + return d->m_updateMode; +} + +/*! + Sets the NMEA data source to \a device. If the device is not open, it + will be opened in QIODevice::ReadOnly mode. + + The source device can only be set once and must be set before calling + \l startUpdates() or \l requestUpdate(). + + \note The \a device must emit \l {QIODevice::readyRead()} for the + source to be notified when data is available for reading. + \l QNmeaSatelliteInfoSource does not assume the ownership of the device, + and hence does not deallocate it upon destruction. +*/ +void QNmeaSatelliteInfoSource::setDevice(QIODevice *device) +{ + if (device != d->m_device) { + if (!d->m_device) + d->m_device = device; + else + qWarning("QNmeaSatelliteInfoSource: source device has already been set"); + } +} + +/*! + Returns the NMEA data source. +*/ +QIODevice *QNmeaSatelliteInfoSource::device() const +{ + return d->m_device; +} + +/*! + \reimp +*/ +void QNmeaSatelliteInfoSource::setUpdateInterval(int msec) +{ + int interval = msec; + if (interval != 0) + interval = qMax(msec, minimumUpdateInterval()); + QGeoSatelliteInfoSource::setUpdateInterval(interval); + if (d->m_invokedStart) { + d->stopUpdates(); + d->startUpdates(); + } +} + +/*! + \reimp +*/ +int QNmeaSatelliteInfoSource::minimumUpdateInterval() const +{ + return 2; // Some chips are capable of over 100 updates per seconds. +} + +/*! + \reimp +*/ +QGeoSatelliteInfoSource::Error QNmeaSatelliteInfoSource::error() const +{ + return d->m_satelliteError; +} + +/*! + \reimp +*/ +bool QNmeaSatelliteInfoSource::setBackendProperty(const QString &name, const QVariant &value) +{ + if (name == SimulationUpdateInterval && d->m_updateMode == UpdateMode::SimulationMode) { + bool ok = false; + const int interval = value.toInt(&ok); + if (ok) { + auto *reader = dynamic_cast(d->m_nmeaReader.get()); + if (reader) { + reader->setUpdateInterval(interval); + } else { + // d->m_nmeaReader will use it in constructor + d->m_simulationUpdateInterval = interval; + } + return true; + } + } + return false; +} + +/*! + \reimp +*/ +QVariant QNmeaSatelliteInfoSource::backendProperty(const QString &name) const +{ + if (name == SimulationUpdateInterval && d->m_updateMode == UpdateMode::SimulationMode) { + auto *reader = dynamic_cast(d->m_nmeaReader.get()); + if (reader) + return reader->updateInterval(); + else + return d->m_simulationUpdateInterval; + } + return QVariant(); +} + +/*! + \reimp +*/ +void QNmeaSatelliteInfoSource::startUpdates() +{ + d->startUpdates(); +} + +/*! + \reimp +*/ +void QNmeaSatelliteInfoSource::stopUpdates() +{ + d->stopUpdates(); +} + +/*! + \reimp +*/ +void QNmeaSatelliteInfoSource::requestUpdate(int msec) +{ + d->requestUpdate(msec == 0 ? 60000 * 5 : msec); // 5min default timeout +} + +/*! + Parses an NMEA sentence string to extract the IDs of satelites in use. + + The default implementation will parse standard NMEA $GPGSA sentences. + This method should be reimplemented in a subclass whenever the need to deal + with non-standard NMEA sentences arises. + + The parser reads \a size bytes from \a data and uses that information to + fill \a pnrsInUse list. + + Returns system type if the sentence was successfully parsed, otherwise + returns \l QGeoSatelliteInfo::Undefined and should not modifiy \a pnrsInUse. +*/ + +#if QT_DEPRECATED_SINCE(7, 0) +QGeoSatelliteInfo::SatelliteSystem +QNmeaSatelliteInfoSource::parseSatellitesInUseFromNmea(const char *data, int size, + QList &pnrsInUse) +{ +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) + return QLocationUtils::getSatInUseFromNmea(QByteArrayView{data, size}, pnrsInUse); +#else + return parseSatellitesInUseFromNmea(QByteArrayView{data, size}, pnrsInUse); +#endif +} +#endif // QT_DEPRECATED_SINCE(7, 0) + +QGeoSatelliteInfo::SatelliteSystem +QNmeaSatelliteInfoSource::parseSatellitesInUseFromNmea(QByteArrayView data, + QList &pnrsInUse) +{ +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) + return parseSatellitesInUseFromNmea(data.data(), static_cast(data.size()), pnrsInUse); +#else + return QLocationUtils::getSatInUseFromNmea(data, pnrsInUse); +#endif +} + +/*! + \enum QNmeaSatelliteInfoSource::SatelliteInfoParseStatus + Defines the parse status of satellite information. The satellite information + can be split into multiple sentences, and we need to parse all of them. + \value NotParsed The data does not contain information about satellites. + \value PartiallyParsed A valid satellite information is received and parsed, + but it's not complete, so we need to wait for another NMEA sentence. + \value FullyParsed Satellite information was fully collected and parsed. +*/ + +/*! + Parses an NMEA sentence string to extract the information about satellites + in view. + + The default implementation will parse standard NMEA $GPGSV sentences. + This method should be reimplemented in a subclass whenever the need to deal + with non-standard NMEA sentences arises. + + The parser reads \a size bytes from \a data and uses that information to + fill \a infos list. + + Returns \l SatelliteInfoParseStatus with parse result. + Modifies \a infos list in case \l {QNmeaSatelliteInfoSource::} + {PartiallyParsed} or \l {QNmeaSatelliteInfoSource::}{FullyParsed} is + returned. + Also sets the \a system to correct satellite system type. This is required + to determine the system type in case there are no satellites in view. +*/ + +#if QT_DEPRECATED_SINCE(7, 0) +QNmeaSatelliteInfoSource::SatelliteInfoParseStatus +QNmeaSatelliteInfoSource::parseSatelliteInfoFromNmea(const char *data, int size, + QList &infos, + QGeoSatelliteInfo::SatelliteSystem &system) +{ +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) + return static_cast( + QLocationUtils::getSatInfoFromNmea(QByteArrayView{data, size}, infos, system)); +#else + return parseSatelliteInfoFromNmea(QByteArrayView{data, size}, infos, system); +#endif +} +#endif // QT_DEPRECATED_SINCE(7, 0) + +QNmeaSatelliteInfoSource::SatelliteInfoParseStatus +QNmeaSatelliteInfoSource::parseSatelliteInfoFromNmea(QByteArrayView data, + QList &infos, + QGeoSatelliteInfo::SatelliteSystem &system) +{ +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) + return parseSatelliteInfoFromNmea(data.data(), static_cast(data.size()), infos, system); +#else + return static_cast( + QLocationUtils::getSatInfoFromNmea(data, infos, system)); +#endif +} + +void QNmeaSatelliteInfoSource::setError(QGeoSatelliteInfoSource::Error satelliteError) +{ + d->m_satelliteError = satelliteError; + if (d->m_satelliteError != QGeoSatelliteInfoSource::NoError) + emit QGeoSatelliteInfoSource::errorOccurred(satelliteError); +} + +QList QNmeaSatelliteInfoUpdate::allSatellitesInUse() const +{ + QList result; + for (const auto &s : m_satellites) + result.append(s.satellitesInUse); + return result; +} + +QList QNmeaSatelliteInfoUpdate::allSatellitesInView() const +{ + QList result; + for (const auto &s : m_satellites) + result.append(s.satellitesInView); + return result; +} + +void QNmeaSatelliteInfoUpdate::setSatellitesInView(QGeoSatelliteInfo::SatelliteSystem system, + const QList &inView) +{ + auto &info = m_satellites[system]; + info.updatingGSV = false; + + info.satellitesInView = inView; + info.validInView = true; + + if (!info.satellitesInUseReceived) { + // Normally a GSA message should come after a GSV message. If this flag + // is not set, we have received 2 consecutive GSV messages for this + // system without a GSA in between. + // This means that we could actually receive a $GNGSA empty message for + // this specific type. As it had no ids and GN talker id, we could not + // determine system type. This most probably means that we have no + // satellites in use for this system type. + // Clear satellites in use, if any. + info.satellitesInUse.clear(); + info.inUseIds.clear(); + info.validInUse = true; + } + info.satellitesInUseReceived = false; + + if (info.satellitesInView.isEmpty()) { + // If we received an empty list of satellites in view, then the list of + // satellites in use will also be empty, so we would not be able to + // match it with correct system type in case of $GNGSA message. Clear + // the list in advance. + info.satellitesInUse.clear(); + info.inUseIds.clear(); + info.validInUse = true; + } else if (!info.inUseIds.isEmpty()) { + // We have some satellites in use cached. Check if we have received the + // proper GSV for them. + info.satellitesInUse.clear(); + info.validInUse = false; + bool corrupt = false; + for (const auto id : info.inUseIds) { + bool found = false; + for (const auto &s : info.satellitesInView) { + if (s.satelliteIdentifier() == id) { + info.satellitesInUse.append(s); + found = true; + break; + } + } + if (!found) { + // The previoulsy received GSA is incorrect or not related to + // this GSV + info.satellitesInUse.clear(); + corrupt = true; + break; + } + } + info.validInUse = !corrupt; + info.inUseIds.clear(); + } + + m_validInUse = calculateValidInUse(); + m_validInView = calculateValidInView(); + m_fresh = true; +} + +bool QNmeaSatelliteInfoUpdate::setSatellitesInUse(QGeoSatelliteInfo::SatelliteSystem system, + const QList &inUse) +{ + if (system == QGeoSatelliteInfo::Undefined || system == QGeoSatelliteInfo::Multiple) + return false; // No way to determine satellite system + + SatelliteInfo &info = m_satellites[system]; + info.satellitesInUse.clear(); + + info.satellitesInUseReceived = true; + info.inUseIds = inUse; + + if (info.updatingGSV) { + info.validInView = false; + m_validInView = false; + return false; + } + + for (const auto id : inUse) { + bool found = false; + for (const auto &s : info.satellitesInView) { + if (s.satelliteIdentifier() == id) { + info.satellitesInUse.append(s); + found = true; + break; + } + } + if (!found) { + // satellites in use are not in view -> related GSV is not yet received + info.satellitesInView.clear(); + info.validInView = false; + m_validInView = false; + return false; + } + } + + info.inUseIds.clear(); // make sure we remove all obsolete cache + + info.validInUse = true; + m_fresh = true; + m_validInUse = calculateValidInUse(); + + return true; +} + +void QNmeaSatelliteInfoUpdate::consume() +{ + m_fresh = false; +} + +bool QNmeaSatelliteInfoUpdate::isFresh() const +{ + return m_fresh; +} + +void QNmeaSatelliteInfoUpdate::clear() +{ + m_satellites.clear(); + m_satellitesInViewParsed.clear(); + m_validInView = false; + m_validInUse = false; + m_fresh = false; +#if USE_SATELLITE_NMEA_PIMPL + gsa.clear(); + gsv.clear(); +#endif +} + +bool QNmeaSatelliteInfoUpdate::isValid() const +{ + // GSV without GSA is valid. GSA with outdated but still matching GSV also valid. + return m_validInView || m_validInUse; +} + +bool QNmeaSatelliteInfoUpdate::calculateValidInUse() const +{ + for (const auto &s : m_satellites) { + if (!s.validInUse) + return false; + } + return true; +} + +bool QNmeaSatelliteInfoUpdate::calculateValidInView() const +{ + for (const auto &s : m_satellites) { + if (!s.validInView) + return false; + } + return true; +} + +QNmeaSatelliteReader::QNmeaSatelliteReader(QNmeaSatelliteInfoSourcePrivate *sourcePrivate) + : m_proxy(sourcePrivate) +{ +} + +QNmeaSatelliteReader::~QNmeaSatelliteReader() +{ +} + +QNmeaSatelliteRealTimeReader::QNmeaSatelliteRealTimeReader(QNmeaSatelliteInfoSourcePrivate *sourcePrivate) + : QNmeaSatelliteReader(sourcePrivate) +{ +} + +void QNmeaSatelliteRealTimeReader::readAvailableData() +{ + while (m_proxy->m_device->canReadLine()) + m_proxy->processNmeaData(m_proxy->m_pendingUpdate); + m_proxy->notifyNewUpdate(); +} + +QNmeaSatelliteSimulationReader::QNmeaSatelliteSimulationReader(QNmeaSatelliteInfoSourcePrivate *sourcePrivate) + : QNmeaSatelliteReader(sourcePrivate) +{ + m_timer.reset(new QTimer); + QObject::connect(m_timer.get(), &QTimer::timeout, m_timer.get(), [this]() { + readAvailableData(); + }); + m_updateInterval = + qMax(m_proxy->m_simulationUpdateInterval, m_proxy->m_source->minimumUpdateInterval()); +} + +void QNmeaSatelliteSimulationReader::readAvailableData() +{ + if (!m_timer->isActive()) { + // At the very first start we just start a timer to simulate a short + // delay for overlapping requestUpdate() calls. + // See TestQGeoSatelliteInfoSource::requestUpdate_overlappingCalls and + // TestQGeoSatelliteInfoSource::requestUpdate_overlappingCallsWithTimeout + m_timer->start(m_updateInterval); + } else { + // Here we try to get both satellites in view and satellites in use. + // We behave like that because according to the QGeoSatelliteInfoSource + // tests each call to requestUpdate() should return both satellites in + // view and satellites in use. Same is expected on each interval for + // startUpdates(). + // However user-provided NMEA logs might not contain some of the + // messages, so we will try not to get stuck here infinitely. + int numSatInUseMsgs = 0; + int numSatInViewMsgs = 0; + while (!m_proxy->m_device->atEnd() && (!numSatInUseMsgs || !numSatInViewMsgs)) { + m_proxy->processNmeaData(m_proxy->m_pendingUpdate); + if (m_proxy->m_pendingUpdate.m_validInUse) + numSatInUseMsgs++; + if (m_proxy->m_pendingUpdate.m_validInView) + numSatInViewMsgs++; + // if we got the second message for one of them, but still didn't + // receive any for the other - break. + // We use 2 in the comparison, because, as soon as the m_validIn* + // flag is set, it will stay true until we receive invalid message. + if (numSatInUseMsgs > 2 || numSatInViewMsgs > 2) { + const QString msgType = (numSatInUseMsgs > numSatInViewMsgs) + ? QStringLiteral("GSA") + : QStringLiteral("GSV"); + qWarning() << "nmea simulation reader: possibly incorrect message order. Got too " + "many consecutive" + << msgType << "messages"; + break; + } + } + m_proxy->notifyNewUpdate(); + } +} + +void QNmeaSatelliteSimulationReader::setUpdateInterval(int msec) +{ + // restart the timer with new interval + m_updateInterval = qMax(msec, m_proxy->m_source->minimumUpdateInterval()); + if (m_timer->isActive()) + m_timer->start(m_updateInterval); +} + +int QNmeaSatelliteSimulationReader::updateInterval() const +{ + return m_updateInterval; +} + +QT_END_NAMESPACE + +#include "moc_qnmeasatelliteinfosource_p.cpp" +#include "moc_qnmeasatelliteinfosource.cpp" diff --git a/src/positioning/qnmeasatelliteinfosource.h b/src/positioning/qnmeasatelliteinfosource.h new file mode 100644 index 0000000..257e583 --- /dev/null +++ b/src/positioning/qnmeasatelliteinfosource.h @@ -0,0 +1,81 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QNMEASATELLITEINFOSOURCE_H +#define QNMEASATELLITEINFOSOURCE_H + +#include + +QT_BEGIN_NAMESPACE + +class QIODevice; + +class QNmeaSatelliteInfoSourcePrivate; +class Q_POSITIONING_EXPORT QNmeaSatelliteInfoSource : public QGeoSatelliteInfoSource +{ + Q_OBJECT +public: + enum class UpdateMode { + RealTimeMode = 1, + SimulationMode + }; + + static QString SimulationUpdateInterval; + + explicit QNmeaSatelliteInfoSource(UpdateMode mode, QObject *parent = nullptr); + ~QNmeaSatelliteInfoSource() override; + + UpdateMode updateMode() const; + + void setDevice(QIODevice *source); + QIODevice *device() const; + + void setUpdateInterval(int msec) override; + int minimumUpdateInterval() const override; + Error error() const override; + + bool setBackendProperty(const QString &name, const QVariant &value) override; + QVariant backendProperty(const QString &name) const override; + +public Q_SLOTS: + void startUpdates() override; + void stopUpdates() override; + void requestUpdate(int timeout = 0) override; + +protected: +#if QT_DEPRECATED_SINCE(7, 0) + QT6_ONLY(virtual) + QGeoSatelliteInfo::SatelliteSystem + parseSatellitesInUseFromNmea(const char *data, int size, QList &pnrsInUse); +#endif + QT7_ONLY(virtual) + QGeoSatelliteInfo::SatelliteSystem + parseSatellitesInUseFromNmea(QByteArrayView data, QList &pnrsInUse); + enum SatelliteInfoParseStatus { + NotParsed = 0, + PartiallyParsed, + FullyParsed + }; +#if QT_DEPRECATED_SINCE(7, 0) + QT6_ONLY(virtual) + SatelliteInfoParseStatus parseSatelliteInfoFromNmea(const char *data, int size, + QList &infos, + QGeoSatelliteInfo::SatelliteSystem &system); +#endif + QT7_ONLY(virtual) + SatelliteInfoParseStatus parseSatelliteInfoFromNmea(QByteArrayView data, + QList &infos, + QGeoSatelliteInfo::SatelliteSystem &system); + + QNmeaSatelliteInfoSourcePrivate *d; + void setError(QGeoSatelliteInfoSource::Error satelliteError); + + friend class QNmeaSatelliteInfoSourcePrivate; + Q_DISABLE_COPY(QNmeaSatelliteInfoSource) + + // for using the SatelliteInfoParseStatus enum + friend class QLocationUtils; +}; + +QT_END_NAMESPACE + +#endif // QNMEASATELLITEINFOSOURCE_H diff --git a/src/positioning/qnmeasatelliteinfosource_p.h b/src/positioning/qnmeasatelliteinfosource_p.h new file mode 100644 index 0000000..7706d47 --- /dev/null +++ b/src/positioning/qnmeasatelliteinfosource_p.h @@ -0,0 +1,146 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QNMESATELLITEINFOSOURCE_P_H +#define QNMESATELLITEINFOSOURCE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qnmeasatelliteinfosource.h" +#include + +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +#define USE_SATELLITE_NMEA_PIMPL 1 + +struct SatelliteInfo +{ + QList satellitesInView; + QList satellitesInUse; + QList inUseIds; // temp buffer for GSA received before GSV + bool satellitesInUseReceived = false; + bool updatingGSV = false; + bool validInView = false; + bool validInUse = false; +}; + +struct QNmeaSatelliteInfoUpdate +{ + QMap m_satellites; + QList m_satellitesInViewParsed; + bool m_validInView = false; // global state for all satellite systems + bool m_validInUse = false; // global state for all satellite systems + bool m_fresh = false; +#if USE_SATELLITE_NMEA_PIMPL + QByteArray gsa; + QList gsv; +#endif + QList allSatellitesInUse() const; + QList allSatellitesInView() const; + void setSatellitesInView(QGeoSatelliteInfo::SatelliteSystem system, + const QList &inView); + bool setSatellitesInUse(QGeoSatelliteInfo::SatelliteSystem system, const QList &inUse); + void consume(); + bool isFresh() const; + void clear(); + bool isValid() const; + bool calculateValidInUse() const; + bool calculateValidInView() const; +}; + +class QNmeaSatelliteReader; +class QNmeaSatelliteInfoSourcePrivate : public QObject +{ + Q_OBJECT +public: + QNmeaSatelliteInfoSourcePrivate(QNmeaSatelliteInfoSource *parent, QNmeaSatelliteInfoSource::UpdateMode updateMode); + ~QNmeaSatelliteInfoSourcePrivate(); + + void startUpdates(); + void stopUpdates(); + void requestUpdate(int msec); + void notifyNewUpdate(); + void processNmeaData(QNmeaSatelliteInfoUpdate &updateInfo); + +public slots: + void readyRead(); + void emitPendingUpdate(); + void sourceDataClosed(); + void updateRequestTimeout(); + +public: + QNmeaSatelliteInfoSource *m_source = nullptr; + QGeoSatelliteInfoSource::Error m_satelliteError = QGeoSatelliteInfoSource::NoError; + QPointer m_device; + QNmeaSatelliteInfoUpdate m_pendingUpdate; + QNmeaSatelliteInfoUpdate m_lastUpdate; + bool m_invokedStart = false; + bool m_noUpdateLastInterval = false; + bool m_updateTimeoutSent = false; + bool m_connectedReadyRead = false; + QBasicTimer *m_updateTimer = nullptr; // the timer used in startUpdates() + QTimer *m_requestTimer = nullptr; // the timer used in requestUpdate() + QScopedPointer m_nmeaReader; + QNmeaSatelliteInfoSource::UpdateMode m_updateMode; + int m_simulationUpdateInterval = 100; + +protected: + bool openSourceDevice(); + bool initialize(); + void prepareSourceDevice(); + bool emitUpdated(QNmeaSatelliteInfoUpdate &update, bool fromRequestUpdate); + void timerEvent(QTimerEvent *event) override; +}; + +class QNmeaSatelliteReader +{ +public: + QNmeaSatelliteReader(QNmeaSatelliteInfoSourcePrivate *sourcePrivate); + virtual ~QNmeaSatelliteReader(); + + virtual void readAvailableData() = 0; + +protected: + QNmeaSatelliteInfoSourcePrivate *m_proxy; +}; + +class QNmeaSatelliteRealTimeReader : public QNmeaSatelliteReader +{ +public: + QNmeaSatelliteRealTimeReader(QNmeaSatelliteInfoSourcePrivate *sourcePrivate); + void readAvailableData() override; +}; + +class QNmeaSatelliteSimulationReader : public QNmeaSatelliteReader +{ +public: + QNmeaSatelliteSimulationReader(QNmeaSatelliteInfoSourcePrivate *sourcePrivate); + void readAvailableData() override; + void setUpdateInterval(int msec); + int updateInterval() const; + +private: + QScopedPointer m_timer; + int m_updateInterval; +}; + +QT_END_NAMESPACE + +#endif diff --git a/src/positioning/qpositioningglobal.h b/src/positioning/qpositioningglobal.h new file mode 100644 index 0000000..316e0ee --- /dev/null +++ b/src/positioning/qpositioningglobal.h @@ -0,0 +1,10 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QPOSITIONINGGLOBAL_H +#define QPOSITIONINGGLOBAL_H + +#include +#include + +#endif // QPOSITIONINGGLOBAL_H + diff --git a/src/positioning/qpositioningglobal_p.h b/src/positioning/qpositioningglobal_p.h new file mode 100644 index 0000000..1b0e018 --- /dev/null +++ b/src/positioning/qpositioningglobal_p.h @@ -0,0 +1,21 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QPOSITIONINGGLOBAL_P_H +#define QPOSITIONINGGLOBAL_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qpositioningglobal.h" +#include + +#endif // QPOSITIONINGGLOBAL_P_H + diff --git a/src/positioning/qwebmercator.cpp b/src/positioning/qwebmercator.cpp new file mode 100644 index 0000000..a7a32ce --- /dev/null +++ b/src/positioning/qwebmercator.cpp @@ -0,0 +1,100 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#include "qwebmercator_p.h" + +#include "qgeocoordinate.h" + +#include +#include + +#include "qdoublevector2d_p.h" + +QT_BEGIN_NAMESPACE + +// y-Coordinates of maps aproach +-infinity when latitudes approach +-90 and +// they have to be limited to avoid numerical problems. Here the limit is +// chosen such that only points below/above +-89.9999999999 deg latituide are +// cut off, which corresponds to accuracy of qFuzzyCompare +const static double yCutOff = 4.0; + +QDoubleVector2D QWebMercator::coordToMercator(const QGeoCoordinate &coord) +{ + const double pi = M_PI; + + double lon = coord.longitude() / 360.0 + 0.5; + + double lat = coord.latitude(); + lat = 0.5 - (std::log(std::tan((pi / 4.0) + (pi / 2.0) * lat / 180.0)) / pi) / 2.0; + lat = qBound(-yCutOff, lat, 1.0 + yCutOff); + + return QDoubleVector2D(lon, lat); +} + +double QWebMercator::realmod(const double a, const double b) +{ + quint64 div = static_cast(a / b); + return a - static_cast(div) * b; +} + +QGeoCoordinate QWebMercator::mercatorToCoord(const QDoubleVector2D &mercator) +{ + const double pi = M_PI; + + const double fx = mercator.x(); + const double fy = mercator.y(); + + double lat; + + if (fy <= -yCutOff) + lat = 90.0; + else if (fy >= 1.0 + yCutOff) + lat = -90.0; + else + lat = (180.0 / pi) * (2.0 * std::atan(std::exp(pi * (1.0 - 2.0 * fy))) - (pi / 2.0)); + + double lng; + if (fx >= 0) { + lng = realmod(fx, 1.0); + } else { + lng = realmod(1.0 - realmod(-1.0 * fx, 1.0), 1.0); + } + + lng = lng * 360.0 - 180.0; + + return QGeoCoordinate(lat, lng, 0.0); +} + +QGeoCoordinate QWebMercator::coordinateInterpolation(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) +{ + QDoubleVector2D s = QWebMercator::coordToMercator(from); + QDoubleVector2D e = QWebMercator::coordToMercator(to); + + double x; + + if (0.5 < qAbs(e.x() - s.x())) { + // handle dateline crossing + double ex = e.x(); + double sx = s.x(); + if (ex < sx) + sx -= 1.0; + else if (sx < ex) + ex -= 1.0; + + x = (1.0 - progress) * sx + progress * ex; + + if (!qFuzzyIsNull(x) && (x < 0.0)) + x += 1.0; + + } else { + x = (1.0 - progress) * s.x() + progress * e.x(); + } + + double y = (1.0 - progress) * s.y() + progress * e.y(); + + QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y)); + result.setAltitude((1.0 - progress) * from.altitude() + progress * to.altitude()); + + return result; +} + +QT_END_NAMESPACE diff --git a/src/positioning/qwebmercator_p.h b/src/positioning/qwebmercator_p.h new file mode 100644 index 0000000..a7d318d --- /dev/null +++ b/src/positioning/qwebmercator_p.h @@ -0,0 +1,39 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QWEBMERCATOR_P_H +#define QWEBMERCATOR_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include "qpositioningglobal_p.h" + +QT_BEGIN_NAMESPACE + +class QGeoCoordinate; +class QDoubleVector2D; + +class Q_POSITIONING_PRIVATE_EXPORT QWebMercator +{ +public: + static QDoubleVector2D coordToMercator(const QGeoCoordinate &coord); + static QGeoCoordinate mercatorToCoord(const QDoubleVector2D &mercator); + static QGeoCoordinate coordinateInterpolation(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress); + +private: + static double realmod(const double a, const double b); +}; + +QT_END_NAMESPACE + +#endif // QWEBMERCATOR_P_H diff --git a/src/positioningquick/CMakeLists.txt b/src/positioningquick/CMakeLists.txt new file mode 100644 index 0000000..2c2414f --- /dev/null +++ b/src/positioningquick/CMakeLists.txt @@ -0,0 +1,54 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from positioningquick.pro. + +##################################################################### +## PositioningQuick Module: +##################################################################### + +qt_internal_add_qml_module(PositioningQuick + URI QtPositioning + VERSION ${CMAKE_PROJECT_VERSION} + PLUGIN_TARGET positioningquickplugin + NO_GENERATE_PLUGIN_SOURCE + NO_PLUGIN_OPTIONAL + CLASS_NAME QtPositioningDeclarativeModule + DEPENDENCIES + QtQuick/auto + SOURCES + qdeclarativegeoaddress_p.h qdeclarativegeoaddress.cpp + qdeclarativegeolocation_p.h qdeclarativegeolocation.cpp + qdeclarativepluginparameter_p.h qdeclarativepluginparameter.cpp + qdeclarativeposition_p.h qdeclarativeposition.cpp + qdeclarativepositionsource_p.h qdeclarativepositionsource.cpp + qdeclarativesatellitesource_p.h qdeclarativesatellitesource.cpp + qquickgeocoordinateanimation_p.h qquickgeocoordinateanimation.cpp + locationsingleton_p.h locationsingleton.cpp + qquickgeocoordinateanimation_p_p.h + qpositioningquickglobal.h + qpositioningquickglobal_p.h + qpositioningquickmodule_p.h qpositioningquickmodule.cpp + LIBRARIES + Qt::PositioningPrivate + Qt::QuickPrivate + PUBLIC_LIBRARIES + Qt::Core + Qt::Positioning + Qt::Qml + Qt::Quick + PRIVATE_MODULE_INTERFACE + Qt::PositioningPrivate + Qt::QuickPrivate + GENERATE_CPP_EXPORTS + GENERATE_PRIVATE_CPP_EXPORTS +) + +qt_internal_extend_target(positioningquickplugin + SOURCES + positioningplugin.cpp + LIBRARIES + Qt::PositioningQuickPrivate + Qt::Quick +) + diff --git a/src/positioningquick/geosatelliteinfo.qdoc b/src/positioningquick/geosatelliteinfo.qdoc new file mode 100644 index 0000000..cb17e27 --- /dev/null +++ b/src/positioningquick/geosatelliteinfo.qdoc @@ -0,0 +1,89 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only + +/*! + \qmlvaluetype geoSatelliteInfo + \ingroup qmlvaluetypes + \inqmlmodule QtPositioning + \since 6.5 + + \brief The geoSatelliteInfo type represents basic information about a + satellite. + + This type is a QML representation of \l QGeoSatelliteInfo. The type is + uncreatable from QML and can only be used when handling satellite updates + from \l SatelliteSource. + + This type contains the \c satelliteSystem, \c satelliteIdentifier and + \c signalStrength read-only properties, and also optional attributes. + + Use the \l hasAttribute method to check if the attribute exists or not, + and the \l attribute method to get its value. + + \sa QGeoSatelliteInfo +*/ + +/*! + \qmlproperty enumeration QtPositioning::geoSatelliteInfo::satelliteSystem + \readonly + + Holds the GNSS system of the satellite. + + \value GeoSatelliteInfo.Undefined Not defined. + \value GeoSatelliteInfo.GPS Global Positioning System (USA). + \value GeoSatelliteInfo.GLONASS Global Positioning System (Russia). + \value GeoSatelliteInfo.GALILEO Global navigation satellite system (EU). + \value GeoSatelliteInfo.BEIDOU BeiDou navigation satellite system (China). + \value GeoSatelliteInfo.QZSS Quasi-Zenith Satellite System (Japan). + \value GeoSatelliteInfo.Multiple This type normally indicates that the + information is received from a device that supports multiple + satellite systems, and the satellite system is not explicitly + specified. + \value GeoSatelliteInfo.CustomType The first type that can be used + for user purposes. +*/ + +/*! + \qmlproperty int QtPositioning::geoSatelliteInfo::satelliteIdentifier + \readonly + + Holds the satellite identifier number. + + The satellite identifier number can be used to identify a satellite within + the satellite system. + + The actual value may vary, depending on the platform and the selected + backend. +*/ + +/*! + \qmlproperty real QtPositioning::geoSatelliteInfo::signalStrength + \readonly + + Holds the signal strength in decibels. +*/ + +/*! + \qmlmethod real QtPositioning::geoSatelliteInfo::attribute(Attribute attr) + + Returns the value of the attribute \a attr or -1 if the value has not been + set. + + The following attributes are supported: + + \list + \li \c {GeoSatelliteInfo.Elevation} - the elevation of the satellite, + in degrees. + \li \c {GeoSatelliteInfo.Azimuth} - the azimuth to true north, + in degrees. + \endlist +*/ + +/*! + \qmlmethod bool QtPositioning::geoSatelliteInfo::hasAttribute(Attribute attr) + + Returns \c true if the satellite information contains the attribute \a attr. + Otherwise returns \c false. + + See \l attribute() for the list of supported attributes. +*/ diff --git a/src/positioningquick/locationsingleton.cpp b/src/positioningquick/locationsingleton.cpp new file mode 100644 index 0000000..f8a9dbd --- /dev/null +++ b/src/positioningquick/locationsingleton.cpp @@ -0,0 +1,359 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "locationsingleton_p.h" +#include +#include +#include + +QT_BEGIN_NAMESPACE + +static QGeoCoordinate parseCoordinate(const QJSValue &value, bool *ok) +{ + QGeoCoordinate c; + + if (value.isObject()) { + if (value.hasProperty(QStringLiteral("latitude"))) + c.setLatitude(value.property(QStringLiteral("latitude")).toNumber()); + if (value.hasProperty(QStringLiteral("longitude"))) + c.setLongitude(value.property(QStringLiteral("longitude")).toNumber()); + if (value.hasProperty(QStringLiteral("altitude"))) + c.setAltitude(value.property(QStringLiteral("altitude")).toNumber()); + + if (ok) + *ok = true; + } else if (ok) { + *ok = false; + } + + return c; +} + + +/*! + \qmltype QtPositioning + \inqmlmodule QtPositioning + \since 5.2 + + \brief The QtPositioning global object provides useful functions for working with location-based + types in QML. + + \qml + import QtPositioning + + Item { + property var coordinate: QtPositioning.coordinate(-27.5, 153.1) + } + \endqml +*/ + +LocationSingleton::LocationSingleton(QObject *parent) +: QObject(parent) +{ +} + +/*! + \qmlmethod coordinate QtPositioning::coordinate() + + Constructs an invalid coordinate. + +*/ +QGeoCoordinate LocationSingleton::coordinate() const +{ + return QGeoCoordinate(); +} + +/*! + \qmlmethod coordinate QtPositioning::coordinate(real latitude, real longitude, real altitude) const + + Constructs a coordinate with the specified \a latitude, \a longitude and optional \a altitude. + Both \a latitude and \a longitude must be valid, otherwise an invalid coordinate is returned. + + \sa {coordinate} +*/ +QGeoCoordinate LocationSingleton::coordinate(double latitude, double longitude, double altitude) const +{ + return QGeoCoordinate(latitude, longitude, altitude); +} + +/*! + \qmlmethod geoshape QtPositioning::shape() const + + Constructs an invalid geoshape. + + \sa {geoshape} +*/ +QGeoShape LocationSingleton::shape() const +{ + return QGeoShape(); +} + +/*! + \qmlmethod georectangle QtPositioning::rectangle() const + + Constructs an invalid georectangle. + + \sa {georectangle} +*/ +QGeoRectangle LocationSingleton::rectangle() const +{ + return QGeoRectangle(); +} + +/*! + \qmlmethod georectangle QtPositioning::rectangle(coordinate center, real width, real height) const + + Constructs a georectangle centered at \a center with a width of \a width degrees and a hight of + \a height degrees. + + \sa {georectangle} +*/ +QGeoRectangle LocationSingleton::rectangle(const QGeoCoordinate ¢er, + double width, double height) const +{ + return QGeoRectangle(center, width, height); +} + +/*! + \qmlmethod georectangle QtPositioning::rectangle(coordinate topLeft, coordinate bottomRight) const + + Constructs a georectangle with its top left corner positioned at \a topLeft and its bottom + right corner positioned at \a {bottomRight}. + + \sa {georectangle} +*/ +QGeoRectangle LocationSingleton::rectangle(const QGeoCoordinate &topLeft, + const QGeoCoordinate &bottomRight) const +{ + return QGeoRectangle(topLeft, bottomRight); +} + +/*! + \qmlmethod georectangle QtPositioning::rectangle(list coordinates) const + + Constructs a georectangle from the list of coordinates, the returned list is the smallest possible + containing all the coordinates. + + \sa {georectangle} +*/ +QGeoRectangle LocationSingleton::rectangle(const QVariantList &coordinates) const +{ + QList internalCoordinates; + for (const auto &coordinate : coordinates) { + if (coordinate.canConvert()) + internalCoordinates << coordinate.value(); + } + + return QGeoRectangle(internalCoordinates); +} + +/*! + \qmlmethod geocircle QtPositioning::circle() const + + Constructs an invalid geocircle. + + \sa {geocircle} +*/ +QGeoCircle LocationSingleton::circle() const +{ + return QGeoCircle(); +} + +/*! + \qmlmethod geocircle QtPositioning::circle(coordinate center, real radius) const + + Constructs a geocircle centered at \a center with a radius of \a radius meters. +*/ +QGeoCircle LocationSingleton::circle(const QGeoCoordinate ¢er, qreal radius) const +{ + return QGeoCircle(center, radius); +} + +/*! + \qmlmethod geopath QtPositioning::path() const + + Constructs an empty geopath. + + \sa {geopath} + \since 5.9 +*/ +QGeoPath LocationSingleton::path() const +{ + return QGeoPath(); +} + +/*! + \qmlmethod geopath QtPositioning::path(list coordinates, real width) const + + Constructs a geopath from coordinates and width. + + \sa {geopath} + \since 5.9 +*/ +QGeoPath LocationSingleton::path(const QJSValue &value, qreal width) const +{ + QList pathList; + + if (value.isArray()) { + quint32 length = value.property(QStringLiteral("length")).toUInt(); + for (quint32 i = 0; i < length; ++i) { + bool ok = false; + QGeoCoordinate c = parseCoordinate(value.property(i), &ok); + + if (!ok || !c.isValid()) { + pathList.clear(); // aborting + break; + } + + pathList.append(c); + } + } + + return QGeoPath(pathList, width); +} + +/*! + \qmlmethod geopolygon QtPositioning::polygon() const + + Constructs an empty polygon. + + \sa {geopolygon} + \since 5.10 +*/ +QGeoPolygon LocationSingleton::polygon() const +{ + return QGeoPolygon(); +} + +/*! + \qmlmethod geopolygon QtPositioning::polygon(list coordinates) const + + Constructs a polygon from coordinates. + + \sa {geopolygon} + \since 5.10 +*/ +QGeoPolygon LocationSingleton::polygon(const QVariantList &coordinates) const +{ + QList internalCoordinates; + for (const auto &coordinate : coordinates) { + if (coordinate.canConvert()) + internalCoordinates << coordinate.value(); + } + + return QGeoPolygon(internalCoordinates); +} + +/*! + \qmlmethod geopolygon QtPositioning::polygon(list perimeter, list> holes) const + + Constructs a polygon from coordinates for perimeter and inner holes. + + \sa {geopolygon} + \since 5.12 +*/ +QGeoPolygon LocationSingleton::polygon(const QVariantList &perimeter, const QVariantList &holes) const +{ + QList internalCoordinates; + for (const auto &coordinate : perimeter) { + if (coordinate.canConvert()) + internalCoordinates << coordinate.value(); + } + QGeoPolygon poly(internalCoordinates); + + for (const auto &h : holes) { + if (h.metaType().id() == QMetaType::QVariantList) { + QList hole; + const QVariantList &holeData = h.toList(); + for (const auto &coord : holeData) { + if (coord.canConvert()) + hole << coord.value(); + } + if (!hole.isEmpty()) + poly.addHole(hole); + } + } + + return poly; +} + +/*! + \qmlmethod geocircle QtPositioning::shapeToCircle(geoshape shape) const + + Converts \a shape to a geocircle. + + \sa {geocircle} + \since 5.5 +*/ +QGeoCircle LocationSingleton::shapeToCircle(const QGeoShape &shape) const +{ + return QGeoCircle(shape); +} + +/*! + \qmlmethod georectangle QtPositioning::shapeToRectangle(geoshape shape) const + + Converts \a shape to a georectangle. + + \sa {georectangle} + \since 5.5 +*/ +QGeoRectangle LocationSingleton::shapeToRectangle(const QGeoShape &shape) const +{ + return QGeoRectangle(shape); +} + +/*! + \qmlmethod geopath QtPositioning::shapeToPath(geoshape shape) const + + Converts \a shape to a geopath. + + \sa {geopath} + \since 5.9 +*/ +QGeoPath LocationSingleton::shapeToPath(const QGeoShape &shape) const +{ + return QGeoPath(shape); +} + +/*! + \qmlmethod geopolygon QtPositioning::shapeToPolygon(geoshape shape) const + + Converts \a shape to a polygon. + + \sa {geopolygon} + \since 5.10 +*/ +QGeoPolygon LocationSingleton::shapeToPolygon(const QGeoShape &shape) const +{ + return QGeoPolygon(shape); +} + +/*! + \qmlmethod coordinate QtPositioning::mercatorToCoord(point mercator) const + + Converts a \a mercator coordinate into a latitude-longitude coordinate. + + \sa {coordToMercator} + \since 5.12 +*/ +QGeoCoordinate LocationSingleton::mercatorToCoord(const QPointF &mercator) const +{ + return QWebMercator::mercatorToCoord(QDoubleVector2D(mercator.x(), mercator.y())); +} + +/*! + \qmlmethod point QtPositioning::coordToMercator(coordinate coord) const + + Converts a coordinate \a coord into a mercator coordinate and returns it. + \sa {mercatorToCoord} + \since 5.12 +*/ +QPointF LocationSingleton::coordToMercator(const QGeoCoordinate &coord) const +{ + return QWebMercator::coordToMercator(coord).toPointF(); +} + +QT_END_NAMESPACE + +#include "moc_locationsingleton_p.cpp" diff --git a/src/positioningquick/locationsingleton_p.h b/src/positioningquick/locationsingleton_p.h new file mode 100644 index 0000000..42c055b --- /dev/null +++ b/src/positioningquick/locationsingleton_p.h @@ -0,0 +1,78 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef LOCATIONSINGLETON_H +#define LOCATIONSINGLETON_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONINGQUICK_PRIVATE_EXPORT LocationSingleton : public QObject +{ + Q_OBJECT + QML_NAMED_ELEMENT(QtPositioning) + QML_SINGLETON + QML_ADDED_IN_VERSION(5, 0) + +public: + explicit LocationSingleton(QObject *parent = 0); + + Q_INVOKABLE QGeoCoordinate coordinate() const; + Q_INVOKABLE QGeoCoordinate coordinate(double latitude, double longitude, + double altitude = qQNaN()) const; + + Q_INVOKABLE QGeoShape shape() const; + + Q_INVOKABLE QGeoRectangle rectangle() const; + Q_INVOKABLE QGeoRectangle rectangle(const QGeoCoordinate ¢er, + double width, double height) const; + Q_INVOKABLE QGeoRectangle rectangle(const QGeoCoordinate &topLeft, + const QGeoCoordinate &bottomRight) const; + Q_INVOKABLE QGeoRectangle rectangle(const QVariantList &coordinates) const; + + Q_INVOKABLE QGeoCircle circle() const; + Q_INVOKABLE QGeoCircle circle(const QGeoCoordinate ¢er, qreal radius = -1.0) const; + + Q_INVOKABLE QGeoPath path() const; + Q_INVOKABLE QGeoPath path(const QJSValue &value, qreal width = 0.0) const; + + Q_INVOKABLE QGeoPolygon polygon() const; + Q_INVOKABLE QGeoPolygon polygon(const QVariantList &value) const; + Q_INVOKABLE QGeoPolygon polygon(const QVariantList &perimeter, const QVariantList &holes) const; + + Q_INVOKABLE QGeoCircle shapeToCircle(const QGeoShape &shape) const; + Q_INVOKABLE QGeoRectangle shapeToRectangle(const QGeoShape &shape) const; + Q_INVOKABLE QGeoPath shapeToPath(const QGeoShape &shape) const; + Q_INVOKABLE QGeoPolygon shapeToPolygon(const QGeoShape &shape) const; + + Q_REVISION(5, 12) Q_INVOKABLE QGeoCoordinate mercatorToCoord(const QPointF &mercator) const; + Q_REVISION(5, 12) Q_INVOKABLE QPointF coordToMercator(const QGeoCoordinate &coord) const; +}; + +QT_END_NAMESPACE + +#endif // LOCATIONSINGLETON_H diff --git a/src/positioningquick/positioningplugin.cpp b/src/positioningquick/positioningplugin.cpp new file mode 100644 index 0000000..b1f884f --- /dev/null +++ b/src/positioningquick/positioningplugin.cpp @@ -0,0 +1,592 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +/*! + \qmlvaluetype coordinate + \ingroup qmlvaluetypes + \inqmlmodule QtPositioning + \since 5.2 + + \brief The coordinate type represents and stores a geographic position. + + This type is a QML representation of \l QGeoCoordinate and represents a geographic + position in the form of \l {latitude}, \l longitude and \l altitude attributes. + The \l latitude attribute specifies the number of + decimal degrees above and below the equator. A positive latitude indicates the Northern + Hemisphere and a negative latitude indicates the Southern Hemisphere. The \l longitude + attribute specifies the number of decimal degrees east and west. A positive longitude + indicates the Eastern Hemisphere and a negative longitude indicates the Western Hemisphere. + The \l altitude attribute specifies the number of meters above sea level. Together, these + attributes specify a 3-dimensional position anywhere on or near the Earth's surface. + + The \l isValid attribute can be used to test if a coordinate is valid. A coordinate is + considered valid if it has a valid latitude and longitude. A valid altitude is not required. + The latitude must be between -90 and 90 inclusive and the longitude must be between -180 and + 180 inclusive. + + The \c coordinate type is used by many other types in the Qt Location module, for specifying + the position of an object on a Map, the current position of a device and many other tasks. + They also feature a number of important utility methods that make otherwise complex + calculations simple to use, such as \l {atDistanceAndAzimuth}(). + + \section1 Accuracy + + The latitude, longitude and altitude attributes stored in the coordinate type are represented + as doubles, giving them approximately 16 decimal digits of precision -- enough to specify + micrometers. The calculations performed in coordinate's methods such as \l {azimuthTo}() and + \l {distanceTo}() also use doubles for all intermediate values, but the inherent inaccuracies in + their spherical Earth model dominate the amount of error in their output. + + \section1 Example Usage + + Use properties of type \l var to store a \c {coordinate}. To create a \c coordinate use + one of the methods described below. In all cases, specifying the \l altitude attribute is + optional. + + To create a \c coordinate value, use the \l{QtPositioning::coordinate}{QtPositioning.coordinate()} + function: + + \qml + import QtPositioning + + Location { coordinate: QtPositioning.coordinate(-27.5, 153.1) } + \endqml + + or as separate \l latitude, \l longitude and \l altitude components: + + \qml + Location { + coordinate { + latitude: -27.5 + longitude: 153.1 + } + } + \endqml + + When integrating with C++, note that any QGeoCoordinate value passed into QML from C++ is + automatically converted into a \c coordinate value, and vice-versa. + + \section1 Properties + + \section2 latitude + + \code + real latitude + \endcode + + This property holds the latitude value of the geographical position + (decimal degrees). A positive latitude indicates the Northern Hemisphere, + and a negative latitude indicates the Southern Hemisphere. + If the property has not been set, its default value is NaN. + + For more details see the \l {QGeoCoordinate::latitude} property + + \section2 longitude + + \code + real longitude + \endcode + + This property holds the longitude value of the geographical position + (decimal degrees). A positive longitude indicates the Eastern Hemisphere, + and a negative longitude indicates the Western Hemisphere + If the property has not been set, its default value is NaN. + + For more details see the \l {QGeoCoordinate::longitude} property + + \section2 altitude + + \code + real altitude + \endcode + + This property holds the altitude value (meters above sea level). + If the property has not been set, its default value is NaN. + + For more details see the \l {QGeoCoordinate::altitude} property + + \section2 isValid + + \code + bool isValid + \endcode + + This property holds the current validity of the coordinate. Coordinates + are considered valid if they have been set with a valid latitude and + longitude (altitude is not required). + + The latitude must be between -90 to 90 inclusive to be considered valid, + and the longitude must be between -180 to 180 inclusive to be considered + valid. + + This is a read-only property. + + \section1 Methods + + \section2 distanceTo() + + \code + real distanceTo(coordinate other) + \endcode + + Returns the distance (in meters) from this coordinate to the coordinate specified by \a other. + Altitude is not used in the calculation. + + This calculation returns the great-circle distance between the two coordinates, with an + assumption that the Earth is spherical for the purpose of this calculation. + + \section2 azimuthTo() + + \code + real azimuth(coordinate other) + \endcode + + Returns the azimuth (or bearing) in degrees from this coordinate to the coordinate specified by + \a other. Altitude is not used in the calculation. + + There is an assumption that the Earth is spherical for the purpose of this calculation. + + \section2 atDistanceAndAzimuth() + + \code + coordinate atDistanceAndAzimuth(real distance, real azimuth) + \endcode + + Returns the coordinate that is reached by traveling \a distance metres from this coordinate at + \a azimuth degrees along a great-circle. + + There is an assumption that the Earth is spherical for the purpose of this calculation. +*/ + +/*! + \qmlvaluetype geoshape + \ingroup qmlvaluetypes + \inqmlmodule QtPositioning + \since 5.2 + + \brief A geoshape type represents an abstract geographic area. + + This type is a QML representation of \l QGeoShape which is an abstract geographic area. + It includes attributes and methods common to all geographic areas. To create objects + that represent a valid geographic area use \l {georectangle} or \l {geocircle}. + + The \l isValid attribute can be used to test if the geoshape represents a valid geographic + area. + + The \l isEmpty attribute can be used to test if the geoshape represents a region with a + geometrical area of 0. + + The \l {contains}() method can be used to test if a \l {coordinate} is + within the geoshape. + + \section1 Example Usage + + Use properties of type \l var to store a \c {geoshape}. To create a \c geoshape use one + of the methods described below. + + To create a \c geoshape value, specify it as a "shape()" string: + + \qml + import QtPositioning + + Item { + property var region: "shape()" + } + \endqml + + or with the \l {QtPositioning::shape}{QtPositioning.shape()} function: + + \qml + import QtPositioning + + Item { + property var region: QtPositioning.shape() + } + \endqml + + When integrating with C++, note that any QGeoShape value passed into QML from C++ is + automatically converted into a \c geoshape value, and vice-versa. + + \section1 Properties + + \section2 isEmpty + + \code + bool isEmpty + \endcode + + Returns whether this geoshape is empty. An empty geoshape is a region which has + a geometrical area of 0. + + \section2 isValid + + \code + bool isValid + \endcode + + Returns whether this geoshape is valid. + + A geoshape is considered to be invalid if some of the data that is required to + unambiguously describe the geoshape has not been set or has been set to an + unsuitable value. + + \section2 type + + \code + ShapeType type + \endcode + + Returns the current type of the shape. + + \list + \li \c GeoShape.UnknownType - The shape's type is not known. + \li \c GeoShape.RectangleType - The shape is a \l georectangle. + \li \c GeoShape.CircleType - The shape is a \l geocircle. + \li \c GeoShape.PathType - The shape is a \l geopath. (Since Qt 5.9) + \li \c GeoShape.PolygonType - The shape is a \l geopolygon. (Since Qt 5.10) + \endlist + + This QML property was introduced by Qt 5.5. + + \section1 Methods + + \section2 contains() + + \code + bool contains(coordinate coord) + \endcode + + Returns true if the \l {QtPositioning::coordinate}{coordinate} specified by \a coord is within + this geoshape; Otherwise returns false. +*/ + +/*! + \qmlvaluetype georectangle + \ingroup qmlvaluetypes + \inqmlmodule QtPositioning + \since 5.2 + + \brief The georectangle type represents a rectangular geographic area. + + The \c georectangle type is a \l {geoshape} that represents a + rectangular geographic area. The type is direct representation of a \l QGeoRectangle. + It is defined by a pair of \l {coordinate}{coordinates} which represent the top-left + and bottom-right corners of the \c {georectangle}. The coordinates are accessible + from the \l topLeft and \l bottomRight attributes. + + A \c georectangle is considered invalid if the top-left or bottom-right coordinates are invalid + or if the top-left coordinate is south of the bottom-right coordinate. + + The coordinates of the four corners of the \c georectangle can be accessed with the + \l {topLeft}, \l {topRight}, \l {bottomLeft} and \l {bottomRight} attributes. The \l center + attribute can be used to get the coordinate of the center of the \c georectangle. The \l width + and \l height attributes can be used to get the width and height of the \c georectangle in + degrees. Setting one of these attributes will cause the other attributes to be adjusted + accordingly. + + \section1 Limitations + + A \c georectangle can never cross the poles. + + If the height or center of a \c georectangle is adjusted such that it would cross one of the + poles the height is modified such that the \c georectangle touches but does not cross the pole + and that the center coordinate is still in the center of the \c georectangle. + + \section1 Example Usage + + Use properties of type \l var to store a \c {georectangle}. To create a \c georectangle + value, use the \l {QtPositioning::rectangle}{QtPositioning.rectangle()} function: + + \qml + import QtPositioning + + Item { + property var region: QtPositioning.rectangle(QtPositioning.coordinate(-27.5, 153.1), QtPositioning.coordinate(-27.6, 153.2)) + } + \endqml + + When integrating with C++, note that any QGeoRectangle value passed into QML from C++ is + automatically converted into a \c georectangle value, and vice-versa. + + \section1 Properties + + \section2 bottomLeft + + \code + coordinate bottomLeft + \endcode + + This property holds the bottom left coordinate of this georectangle. + + \section2 bottomRight + + \code + coordinate bottomRight + \endcode + + This property holds the bottom right coordinate of this georectangle. + + \section2 center + + \code + coordinate center + \endcode + + This property holds the center coordinate of this georectangle. For more details + see \l {QGeoRectangle::setCenter()}. + + \section2 height + + \code + double height + \endcode + + This property holds the height of this georectangle (in degrees). For more details + see \l {QGeoRectangle::setHeight()}. + + \note If the georectangle is invalid, it is not possible to set the height. QtPositioning + releases prior to Qt 5.5 permitted the setting of the height even on invalid georectangles. + + \section2 topLeft + + \code + coordinate topLeft + \endcode + + This property holds the top left coordinate of this georectangle. + + \section2 topRight + + \code + coordinate topRight + \endcode + + This property holds the top right coordinate of this georectangle. + + \section2 width + + \code + double width + \endcode + + This property holds the width of this georectangle (in degrees). For more details + see \l {QGeoRectangle::setWidth()}. + + \note If the georectangle is invalid, it is not possible to set the width. QtPositioning + releases prior to Qt 5.5 permitted the setting of the width even on invalid georectangles. +*/ + +/*! + \qmlvaluetype geocircle + \ingroup qmlvaluetypes + \inqmlmodule QtPositioning + \since 5.2 + + \brief The geocircle type represents a circular geographic area. + + The \c geocircle type is a \l {geoshape} that represents a circular + geographic area. It is a direct representation of a \l QGeoCircle and is defined + in terms of a \l {coordinate} which specifies the \l center of the circle and + a qreal which specifies the \l radius of the circle in meters. + + The circle is considered invalid if the \l center coordinate is invalid or if + the \l radius is less than zero. + + \section1 Example Usage + + Use properties of type \l var to store a \c {geocircle}. To create a \c geocircle value, + use the \l {QtPositioning::circle}{QtPositioning.circle()} function: + + \qml + import QtPositioning + + Item { + property var region: QtPositioning.circle(QtPositioning.coordinate(-27.5, 153.1), 1000) + } + \endqml + + When integrating with C++, note that any QGeoCircle value passed into QML from C++ is + automatically converted into a \c geocircle value, and vise-versa. + + \section1 Properties + + \section2 center + + \code + coordinate radius + \endcode + + This property holds the coordinate of the center of the geocircle. + + \section2 radius + + \code + real radius + \endcode + + This property holds the radius of the geocircle in meters. + + The default value for the radius is -1 indicating an invalid geocircle area. +*/ + +/*! + \qmlvaluetype geopath + \ingroup qmlvaluetypes + \inqmlmodule QtPositioning + \since 5.9 + + \brief The geopath type represents a geographic path. + + The \c geopath type is a \l {geoshape} that represents a geographic + path. It is a direct representation of a \l QGeoPath and is defined + in terms of a \l {path} which holds the list of geo coordinates in the + path. + + The path is considered invalid if it is empty. + + When integrating with C++, note that any QGeoPath value passed into QML from C++ is + automatically converted into a \c geopath value, and vice versa. + + \section1 Properties + + \section2 path + + This property holds the list of coordinates defining the path. + + \section2 width + + This property holds the width of the path in meters. This is currently only used + when calling the \l {contains}() method. + + The default value for the width is 0. +*/ + +/*! + \qmlvaluetype geopolygon + \ingroup qmlvaluetypes + \inqmlmodule QtPositioning + \since 5.10 + + \brief The geopolygon type represents a geographic polygon. + + The \c geopolygon type is a \l [QML] geoshape that represents a geographic + polygon. It is a direct representation of QGeoPolygon and is defined in + terms of a \l path which holds a list of geo coordinates in the polygon. + + The polygon is considered invalid if its path holds less than three + coordinates. + + When integrating with C++, note that any QGeoPolygon value passed into QML + is automatically converted into a \c geopolygon, and vice versa. + + \section1 Properties + + \section2 path + + This property holds the list of coordinates defining the polygon. +*/ + +class QtPositioningDeclarativeModule: public QQmlEngineExtensionPlugin +{ + Q_OBJECT + + Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) + +public: + QtPositioningDeclarativeModule(QObject *parent = 0) : QQmlEngineExtensionPlugin(parent) + { + volatile auto registration = &qml_register_types_QtPositioning; + Q_UNUSED(registration) + } +}; + +namespace { + +bool parseCoordinate(const QVariantMap &map, QGeoCoordinate &c) +{ + if (const auto it = map.find(QStringLiteral("latitude")); it != map.end()) + c.setLatitude(it.value().toDouble()); + else + c.setLatitude(qQNaN()); + if (const auto it = map.find(QStringLiteral("longitude")); it != map.end()) + c.setLongitude(it.value().toDouble()); + else + c.setLongitude(qQNaN()); + if (const auto it = map.find(QStringLiteral("altitude")); it != map.end()) + c.setAltitude(it.value().toDouble()); + else + c.setAltitude(qQNaN()); + + // Not considering the case where the map is valid but containing NaNs. + return c.isValid(); +} + +bool parseRectangle(const QVariantMap &map, QGeoRectangle &rect) +{ + if (const auto it = map.find(QStringLiteral("topLeft")); it != map.end()) + rect.setTopLeft(it.value().value()); + if (const auto it = map.find(QStringLiteral("bottomLeft")); it != map.end()) + rect.setBottomLeft(it.value().value()); + if (const auto it = map.find(QStringLiteral("topRight")); it != map.end()) + rect.setTopRight(it.value().value()); + if (const auto it = map.find(QStringLiteral("bottomRight")); it != map.end()) + rect.setBottomRight(it.value().value()); + if (const auto it = map.find(QStringLiteral("center")); it != map.end()) + rect.setCenter(it.value().value()); + if (const auto it = map.find(QStringLiteral("width")); it != map.end()) + rect.setWidth(it.value().toDouble()); + if (const auto it = map.find(QStringLiteral("height")); it != map.end()) + rect.setHeight(it.value().toDouble()); + + // Not considering the case where the map is valid but containing NaNs. + return rect.isValid(); +} +} + +void QtPositioningDeclarative_initializeModule() +{ + QMetaType::registerConverter(); + QMetaType::registerConverter(); + QMetaType::registerConverter(); + QMetaType::registerConverter(); + QMetaType::registerConverter(); + QMetaType::registerConverter(); + QMetaType::registerConverter(); + QMetaType::registerConverter(); + + if (!QMetaType::registerConverterFunction([](const void *src, void *target) -> bool { + const QVariantMap &map = *static_cast(src); + QGeoCoordinate &coord = *static_cast(target); + return parseCoordinate(map, coord); + }, QMetaType::fromType(), QMetaType::fromType())) { + qWarning("Failed to register conversion function from QVariantMap to QGeoCoordinate"); + } + + if (!QMetaType::registerConverterFunction([](const void *src, void *target) -> bool { + const QVariantMap &map = *static_cast(src); + QGeoRectangle &rect = *static_cast(target); + return parseRectangle(map, rect); + }, QMetaType::fromType(), QMetaType::fromType())) { + qWarning("Failed to register conversion function from QVariantMap to QGeoRectangle"); + } + + qRegisterAnimationInterpolator(q_coordinateInterpolator); +} + +Q_CONSTRUCTOR_FUNCTION(QtPositioningDeclarative_initializeModule) + +QT_END_NAMESPACE + +#include "positioningplugin.moc" diff --git a/src/positioningquick/qdeclarativegeoaddress.cpp b/src/positioningquick/qdeclarativegeoaddress.cpp new file mode 100644 index 0000000..4c0123d --- /dev/null +++ b/src/positioningquick/qdeclarativegeoaddress.cpp @@ -0,0 +1,346 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qdeclarativegeoaddress_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Address + \inqmlmodule QtPositioning + \since 5.2 + + \brief The Address QML type represents a specific location as a street address. + + An Address is used as a unit of data for queries such as (Reverse) Geocoding + or Places searches -- many of these operations either accept an Address + or return one. + + Not all properties of an Address are necessarily available or relevant + in all parts of the world and all locales. The \l district, \l state and + \l county properties are particularly area-specific for many data sources, + and often only one or two of these are available or useful. + + The Address has a \l text property which holds a formatted string. It + is the recommended way to display an address to the user and typically + takes the format of an address as found on an envelope, but this is not always + the case. The \l text may be automatically generated from constituent + address properties such as \l street, \l city and and so on, but can also + be explicitly assigned. See \l text for details. + + \section2 Example Usage + + The following code snippet shows the declaration of an Address object. + + \code + Address { + id: address + street: "53 Brandl St" + city: "Eight Mile Plains" + country: "Australia" + countryCode: "AUS" + } + \endcode + + This could then be used, for example, as the value of a geocoding query, + to get an exact longitude and latitude for the address. + + \sa {QGeoAddress} +*/ + +QDeclarativeGeoAddress::QDeclarativeGeoAddress(QObject *parent) : + QObject(parent) +{ +} + +QDeclarativeGeoAddress::QDeclarativeGeoAddress(const QGeoAddress &address, QObject *parent) : + QObject(parent), m_address(address) +{ +} + +/*! + \qmlproperty QGeoAddress QtPositioning::Address::address + + For details on how to use this property to interface between C++ and QML see + "\l {Address - QGeoAddress} {Interfaces between C++ and QML Code}". +*/ +QGeoAddress QDeclarativeGeoAddress::address() const +{ + return m_address; +} + +void QDeclarativeGeoAddress::setAddress(const QGeoAddress &address) +{ + // Elaborate but takes care of emiting needed signals + setText(address.text()); + setCountry(address.country()); + setCountryCode(address.countryCode()); + setState(address.state()); + setCounty(address.county()); + setCity(address.city()); + setDistrict(address.district()); + setStreet(address.street()); + setStreetNumber(address.streetNumber()); + setPostalCode(address.postalCode()); + m_address = address; +} + +/*! + \qmlproperty string QtPositioning::Address::text + + This property holds the address as a single formatted string. It is the recommended + string to use to display the address to the user. It typically takes the format of + an address as found on an envelope, but this is not always necessarily the case. + + The address \c text is either automatically generated or explicitly assigned, + this can be determined by checking \l isTextGenerated. + + If an empty string is assigned to \c text, then \l isTextGenerated will be set + to true and \c text will return a string which is locally formatted according to + \l countryCode and based on the properties of the address. Modifying the address + properties such as \l street, \l city and so on may cause the contents of \c text to + change. + + If a non-empty string is assigned to \c text, then \l isTextGenerated will be + set to false and \c text will always return the explicitly assigned string. + Modifying address properties will not affect the \c text property. +*/ +QString QDeclarativeGeoAddress::text() const +{ + return m_address.text(); +} + +void QDeclarativeGeoAddress::setText(const QString &address) +{ + QString oldText = m_address.text(); + bool oldIsTextGenerated = m_address.isTextGenerated(); + m_address.setText(address); + + if (oldText != m_address.text()) + emit textChanged(); + if (oldIsTextGenerated != m_address.isTextGenerated()) + emit isTextGeneratedChanged(); +} + +/*! + \qmlproperty string QtPositioning::Address::country + + This property holds the country of the address as a single formatted string. +*/ +QString QDeclarativeGeoAddress::country() const +{ + return m_address.country(); +} + +void QDeclarativeGeoAddress::setCountry(const QString &country) +{ + if (m_address.country() == country) + return; + QString oldText = m_address.text(); + m_address.setCountry(country); + emit countryChanged(); + + if (m_address.isTextGenerated() && oldText != m_address.text()) + emit textChanged(); +} + +/*! + \qmlproperty string QtPositioning::Address::countryCode + + This property holds the country code of the address as a single formatted string. +*/ +QString QDeclarativeGeoAddress::countryCode() const +{ + return m_address.countryCode(); +} + +void QDeclarativeGeoAddress::setCountryCode(const QString &countryCode) +{ + if (m_address.countryCode() == countryCode) + return; + QString oldText = m_address.text(); + m_address.setCountryCode(countryCode); + emit countryCodeChanged(); + + if (m_address.isTextGenerated() && oldText != m_address.text()) + emit textChanged(); +} + +/*! + \qmlproperty string QtPositioning::Address::state + + This property holds the state of the address as a single formatted string. +*/ +QString QDeclarativeGeoAddress::state() const +{ + return m_address.state(); +} + +void QDeclarativeGeoAddress::setState(const QString &state) +{ + if (m_address.state() == state) + return; + QString oldText = m_address.text(); + m_address.setState(state); + emit stateChanged(); + + if (m_address.isTextGenerated() && oldText != m_address.text()) + emit textChanged(); +} + +/*! + \qmlproperty string QtPositioning::Address::county + + This property holds the county of the address as a single formatted string. +*/ +QString QDeclarativeGeoAddress::county() const +{ + return m_address.county(); +} + +void QDeclarativeGeoAddress::setCounty(const QString &county) +{ + if (m_address.county() == county) + return; + QString oldText = m_address.text(); + m_address.setCounty(county); + emit countyChanged(); + + if (m_address.isTextGenerated() && oldText != m_address.text()) + emit textChanged(); +} + +/*! + \qmlproperty string QtPositioning::Address::city + + This property holds the city of the address as a single formatted string. +*/ +QString QDeclarativeGeoAddress::city() const +{ + return m_address.city(); +} + +void QDeclarativeGeoAddress::setCity(const QString &city) +{ + if (m_address.city() == city) + return; + QString oldText = m_address.text(); + m_address.setCity(city); + emit cityChanged(); + + if (m_address.isTextGenerated() && oldText != m_address.text()) + emit textChanged(); +} + +/*! + \qmlproperty string QtPositioning::Address::district + + This property holds the district of the address as a single formatted string. +*/ +QString QDeclarativeGeoAddress::district() const +{ + return m_address.district(); +} + +void QDeclarativeGeoAddress::setDistrict(const QString &district) +{ + if (m_address.district() == district) + return; + QString oldText = m_address.text(); + m_address.setDistrict(district); + emit districtChanged(); + + if (m_address.isTextGenerated() && oldText != m_address.text()) + emit textChanged(); +} + +/*! + \qmlproperty string QtPositioning::Address::street + + This property holds the street of the address. + + \note Before Qt6 this property could also contain things like a unit number, + a building name, or anything else that might be used to distinguish one + address from another. Since Qt6 use \l{QtPositioning::Address::}{streetNumber} + property for such information. +*/ +QString QDeclarativeGeoAddress::street() const +{ + return m_address.street(); +} + +void QDeclarativeGeoAddress::setStreet(const QString &street) +{ + if (m_address.street() == street) + return; + QString oldText = m_address.text(); + m_address.setStreet(street); + emit streetChanged(); + + if (m_address.isTextGenerated() && oldText != m_address.text()) + emit textChanged(); +} + +/*! + \qmlproperty string QtPositioning::Address::streetNumber + \since QtPositioning 6.2 + + This property holds the street number of the address like a unit number, + a building name, or anything else that might be used to distinguish one + address from another. +*/ +QString QDeclarativeGeoAddress::streetNumber() const +{ + return m_address.streetNumber(); +} + +void QDeclarativeGeoAddress::setStreetNumber(const QString &streetNumber) +{ + if (m_address.streetNumber() == streetNumber) + return; + QString oldText = m_address.text(); + m_address.setStreetNumber(streetNumber); + emit streetNumberChanged(); + + if (m_address.isTextGenerated() && oldText != m_address.text()) + emit textChanged(); +} + +/*! + \qmlproperty string QtPositioning::Address::postalCode + + This property holds the postal code of the address as a single formatted string. +*/ +QString QDeclarativeGeoAddress::postalCode() const +{ + return m_address.postalCode(); +} + +void QDeclarativeGeoAddress::setPostalCode(const QString &postalCode) +{ + if (m_address.postalCode() == postalCode) + return; + QString oldText = m_address.text(); + m_address.setPostalCode(postalCode); + emit postalCodeChanged(); + + if (m_address.isTextGenerated() && oldText != m_address.text()) + emit textChanged(); +} + +/*! + \qmlproperty bool QtPositioning::Address::isTextGenerated + + This property holds a boolean that if true, indicates that \l text is automatically + generated from address properties. If false, it indicates that the \l text has been + explicitly assigned. + +*/ +bool QDeclarativeGeoAddress::isTextGenerated() const +{ + return m_address.isTextGenerated(); +} + +QT_END_NAMESPACE + +#include "moc_qdeclarativegeoaddress_p.cpp" diff --git a/src/positioningquick/qdeclarativegeoaddress_p.h b/src/positioningquick/qdeclarativegeoaddress_p.h new file mode 100644 index 0000000..19b4b26 --- /dev/null +++ b/src/positioningquick/qdeclarativegeoaddress_p.h @@ -0,0 +1,93 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QDECLARATIVEGEOADDRESS_P_H +#define QDECLARATIVEGEOADDRESS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONINGQUICK_PRIVATE_EXPORT QDeclarativeGeoAddress : public QObject +{ + Q_OBJECT + QML_NAMED_ELEMENT(Address) + QML_ADDED_IN_VERSION(5, 0) + + Q_PROPERTY(QGeoAddress address READ address WRITE setAddress) + Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged) + Q_PROPERTY(QString country READ country WRITE setCountry NOTIFY countryChanged) + Q_PROPERTY(QString countryCode READ countryCode WRITE setCountryCode NOTIFY countryCodeChanged) + Q_PROPERTY(QString state READ state WRITE setState NOTIFY stateChanged) + Q_PROPERTY(QString county READ county WRITE setCounty NOTIFY countyChanged) + Q_PROPERTY(QString city READ city WRITE setCity NOTIFY cityChanged) + Q_PROPERTY(QString district READ district WRITE setDistrict NOTIFY districtChanged) + Q_PROPERTY(QString street READ street WRITE setStreet NOTIFY streetChanged) + Q_PROPERTY(QString streetNumber READ streetNumber WRITE setStreetNumber + NOTIFY streetNumberChanged REVISION(6, 2)) + Q_PROPERTY(QString postalCode READ postalCode WRITE setPostalCode NOTIFY postalCodeChanged) + Q_PROPERTY(bool isTextGenerated READ isTextGenerated NOTIFY isTextGeneratedChanged) + +public: + explicit QDeclarativeGeoAddress(QObject *parent = 0); + QDeclarativeGeoAddress(const QGeoAddress &address, QObject *parent = 0); + QGeoAddress address() const; + void setAddress(const QGeoAddress &address); + + QString text() const; + void setText(const QString &address); + + QString country() const; + void setCountry(const QString &country); + QString countryCode() const; + void setCountryCode(const QString &countryCode); + QString state() const; + void setState(const QString &state); + QString county() const; + void setCounty(const QString &county); + QString city() const; + void setCity(const QString &city); + QString district() const; + void setDistrict(const QString &district); + QString street() const; + void setStreet(const QString &street); + QString streetNumber() const; + void setStreetNumber(const QString &streetNumber); + QString postalCode() const; + void setPostalCode(const QString &postalCode); + bool isTextGenerated() const; + +Q_SIGNALS: + void textChanged(); + void countryChanged(); + void countryCodeChanged(); + void stateChanged(); + void countyChanged(); + void cityChanged(); + void districtChanged(); + void streetChanged(); + void streetNumberChanged(); + void postalCodeChanged(); + void isTextGeneratedChanged(); + +private: + QGeoAddress m_address; +}; + +QT_END_NAMESPACE + +#endif // QDECLARATIVEGEOADDRESS_P_H diff --git a/src/positioningquick/qdeclarativegeolocation.cpp b/src/positioningquick/qdeclarativegeolocation.cpp new file mode 100644 index 0000000..c757958 --- /dev/null +++ b/src/positioningquick/qdeclarativegeolocation.cpp @@ -0,0 +1,225 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qdeclarativegeolocation_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Location + \inqmlmodule QtPositioning + \since 5.2 + + \brief The Location type holds location data. + + Location types represent a geographic "location", in a human sense. This + consists of a specific \l {coordinate}, an \l {address} and a + \l {boundingShape}{bounding shape}. + The \l {boundingShape}{bounding shape} represents the recommended region + to display when viewing this location. + + The Location type is most commonly seen as the contents of a search + model such as the GeocodeModel. When a GeocodeModel returns the list of + locations found for a given query, it represents these as Location objects. + + \section2 Example Usage + + The following example shows a simple Location object being declared: + + \code + Location { + coordinate { + latitude: -27.3 + longitude: 153.1 + } + address: Address { + ... + } + } + \endcode +*/ + +/*! + \qmlproperty VariantMap QDeclarativeGeoLocation::extendedAttributes + + This property holds the extended attributes for this Location. + Extended attributes are backend-dependent and can be location-dependent. + + \since 5.13 +*/ + +QDeclarativeGeoLocation::QDeclarativeGeoLocation(QObject *parent) +: QObject(parent) + +{ + setLocationInternal(QGeoLocation()); +} + +QDeclarativeGeoLocation::QDeclarativeGeoLocation(const QGeoLocation &src, QObject *parent) +: QObject(parent) +{ + setLocationInternal(src); +} + +QDeclarativeGeoLocation::~QDeclarativeGeoLocation() +{ +} + +/*! + \internal + + This method is supposed to be used in the constructors, when we know that + the properties have no bindings, and we do not want to introduce any. +*/ +void QDeclarativeGeoLocation::setLocationInternal(const QGeoLocation &src) +{ + m_address.setValueBypassingBindings(new QDeclarativeGeoAddress(src.address(), this)); + m_coordinate.setValueBypassingBindings(src.coordinate()); + m_boundingShape.setValueBypassingBindings(src.boundingShape()); + m_extendedAttributes.setValueBypassingBindings(src.extendedAttributes()); +} + +/*! + \qmlproperty QGeoLocation QtPositioning::Location::location + + For details on how to use this property to interface between C++ and QML see + "\l {Location - QGeoLocation} {Interfaces between C++ and QML Code}". + + \note This property updates the whole geo location information, so using it + will result in breaking of all the bindings for all other properties. +*/ +void QDeclarativeGeoLocation::setLocation(const QGeoLocation &src) +{ + if (m_address && m_address->parent() == this) { + m_address->setAddress(src.address()); + } else if (!m_address || m_address->parent() != this) { + m_address.setValue(new QDeclarativeGeoAddress(src.address(), this)); + m_address.notify(); + } + + setCoordinate(src.coordinate()); + setBoundingShape(src.boundingShape()); + setExtendedAttributes(src.extendedAttributes()); +} + +QGeoLocation QDeclarativeGeoLocation::location() const +{ + QGeoLocation retValue; + retValue.setAddress(m_address ? m_address->address() : QGeoAddress()); + retValue.setCoordinate(m_coordinate); + retValue.setBoundingShape(m_boundingShape); + retValue.setExtendedAttributes(m_extendedAttributes); + return retValue; +} + +/*! + \qmlproperty Address QtPositioning::Location::address + + This property holds the address of the location which can be use to retrieve address details of the location. +*/ +void QDeclarativeGeoLocation::setAddress(QDeclarativeGeoAddress *address) +{ + m_address.removeBindingUnlessInWrapper(); + + const QDeclarativeGeoAddress *oldAddress = m_address.valueBypassingBindings(); + if (oldAddress == address) + return; + + // implicitly deleting m_address.value() will force the QML bindings to + // be reevaluated by the QML engine. So we defer the deletion of the old + // address until a new value is assigned to the m_address. + m_address.setValueBypassingBindings(address); + m_address.notify(); + if (oldAddress && (oldAddress->parent() == this)) + delete oldAddress; +} + +QBindable QDeclarativeGeoLocation::bindableAddress() +{ + return QBindable(&m_address); +} + +QDeclarativeGeoAddress *QDeclarativeGeoLocation::address() const +{ + return m_address; +} + +/*! + \qmlproperty coordinate QtPositioning::Location::coordinate + + This property holds the exact geographical coordinate of the location which can be used to retrieve the latitude, longitude and altitude of the location. + + \note this property's changed() signal is currently emitted only if the + whole object changes, not if only the contents of the object change. +*/ +void QDeclarativeGeoLocation::setCoordinate(const QGeoCoordinate coordinate) +{ + m_coordinate = coordinate; +} + +QBindable QDeclarativeGeoLocation::bindableCoordinate() +{ + return QBindable(&m_coordinate); +} + +QGeoCoordinate QDeclarativeGeoLocation::coordinate() const +{ + return m_coordinate; +} + +/*! + \since QtPositioning 6.2 + + \qmlproperty geoshape QtPositioning::Location::boundingShape + + This property holds the recommended region to use when displaying the location. + For example, a building's location may have a region centered around the building, + but the region is large enough to show it's immediate surrounding geographical + context. + + \note This property's changed() signal is currently emitted only if the + whole object changes, not if only the contents of the object change. + + \note This property was introduced in Qt6 instead of boundingBox property. + It returns a \l geoshape instead of a \l georectangle. + Use \l QGeoShape::boundingGeoRectangle() to obtain a bounding + \l georectangle for the shape. + + If you need to convert the returned shape to a specific type, use the + \c type property of \l geoshape together with convenience + methods from \l [QML]{QtPositioning} like + \l {QtPositioning::shapeToRectangle}{QtPositioning.shapeToRectangle()}. +*/ +void QDeclarativeGeoLocation::setBoundingShape(const QGeoShape &boundingShape) +{ + m_boundingShape = boundingShape; +} + +QBindable QDeclarativeGeoLocation::bindableBoundingShape() +{ + return QBindable(&m_boundingShape); +} + +QVariantMap QDeclarativeGeoLocation::extendedAttributes() const +{ + return m_extendedAttributes; +} + +void QDeclarativeGeoLocation::setExtendedAttributes(const QVariantMap &attributes) +{ + m_extendedAttributes = attributes; +} + +QBindable QDeclarativeGeoLocation::bindableExtendedAttributes() +{ + return QBindable(&m_extendedAttributes); +} + +QGeoShape QDeclarativeGeoLocation::boundingShape() const +{ + return m_boundingShape; +} + +QT_END_NAMESPACE + +#include "moc_qdeclarativegeolocation_p.cpp" diff --git a/src/positioningquick/qdeclarativegeolocation_p.h b/src/positioningquick/qdeclarativegeolocation_p.h new file mode 100644 index 0000000..5ea6872 --- /dev/null +++ b/src/positioningquick/qdeclarativegeolocation_p.h @@ -0,0 +1,80 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QDECLARATIVEGEOLOCATION_P_H +#define QDECLARATIVEGEOLOCATION_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONINGQUICK_PRIVATE_EXPORT QDeclarativeGeoLocation : public QObject +{ + Q_OBJECT + QML_NAMED_ELEMENT(Location) + QML_ADDED_IN_VERSION(5, 0) + + Q_PROPERTY(QGeoLocation location READ location WRITE setLocation) + Q_PROPERTY(QDeclarativeGeoAddress *address READ address WRITE setAddress BINDABLE + bindableAddress) + Q_PROPERTY(QGeoCoordinate coordinate READ coordinate WRITE setCoordinate BINDABLE + bindableCoordinate) + Q_PROPERTY(QGeoShape boundingShape READ boundingShape WRITE setBoundingShape BINDABLE + bindableBoundingShape REVISION(6, 2)) + Q_PROPERTY(QVariantMap extendedAttributes READ extendedAttributes WRITE setExtendedAttributes + BINDABLE bindableExtendedAttributes REVISION(5, 13)) + +public: + explicit QDeclarativeGeoLocation(QObject *parent = 0); + explicit QDeclarativeGeoLocation(const QGeoLocation &src, QObject *parent = 0); + ~QDeclarativeGeoLocation(); + + QGeoLocation location() const; + void setLocation(const QGeoLocation &src); + + QDeclarativeGeoAddress *address() const; + void setAddress(QDeclarativeGeoAddress *address); + QBindable bindableAddress(); + + QGeoCoordinate coordinate() const; + void setCoordinate(const QGeoCoordinate coordinate); + QBindable bindableCoordinate(); + + QGeoShape boundingShape() const; + void setBoundingShape(const QGeoShape &boundingShape); + QBindable bindableBoundingShape(); + + QVariantMap extendedAttributes() const; + void setExtendedAttributes(const QVariantMap &attributes); + QBindable bindableExtendedAttributes(); + +private: + void setLocationInternal(const QGeoLocation &src); + + Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QDeclarativeGeoLocation, QDeclarativeGeoAddress *, m_address, + &QDeclarativeGeoLocation::setAddress, nullptr) + Q_OBJECT_BINDABLE_PROPERTY(QDeclarativeGeoLocation, QGeoShape, m_boundingShape) + Q_OBJECT_BINDABLE_PROPERTY(QDeclarativeGeoLocation, QGeoCoordinate, m_coordinate) + Q_OBJECT_BINDABLE_PROPERTY(QDeclarativeGeoLocation, QVariantMap, m_extendedAttributes) +}; + +QT_END_NAMESPACE + +#endif // QDECLARATIVELOCATION_P_H diff --git a/src/positioningquick/qdeclarativepluginparameter.cpp b/src/positioningquick/qdeclarativepluginparameter.cpp new file mode 100644 index 0000000..9180f49 --- /dev/null +++ b/src/positioningquick/qdeclarativepluginparameter.cpp @@ -0,0 +1,114 @@ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qdeclarativepluginparameter_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype PluginParameter + \inqmlmodule QtPositioning + \ingroup qml-QtPositioning5-common + \since QtPositioning 5.14 + + \brief The PluginParameter type describes a parameter for a + \omit + plugin, either geoservice \l Plugin, or + \endomit + position plugin. + + The PluginParameter object is used to provide a parameter of some kind + to a plugin. Typically, these parameters contain details like an application + token for access to a service, or a proxy server to use for network access, + or the serial port to which a serial GPS receiver is connected. + + To set such a parameter, declare a PluginParameter inside an element that + accepts plugin parameters as configuration objects, such as a + \omit + \l Plugin object, or a + \endomit + \l PositionSource object, and set values for its \l{name} and \l{value} + properties. A list of valid parameter names for each plugin is available + from the + \omit + \l {Qt Location#Plugin References and Parameters}{plugin reference pages} + for geoservice plugins, and + \endomit + \l {Qt Positioning plugins#Default plugins}{default plugins page} for + position plugins. + + \section2 Example Usage + + The following example shows the instantiation of the + \l {Qt Positioning NMEA plugin}{NMEA} plugin with the \e nmea.source + parameter that specifies the data source. + + \code + PositionSource { + name: "nmea" + PluginParameter { name: "nmea.source"; value: "serial:/dev/ttyACM0" } + } + \endcode +*/ + +/*! + \qmlproperty string PluginParameter::name + + This property holds the name of the plugin parameter as a single formatted string. + This property is a write-once property. +*/ + +/*! + \qmlproperty QVariant PluginParameter::value + + This property holds the value of the plugin parameter which support different types of values (variant). + This property is a write-once property. +*/ + +QDeclarativePluginParameter::QDeclarativePluginParameter(QObject *parent) + : QObject(parent) {} + +QDeclarativePluginParameter::~QDeclarativePluginParameter() {} + +void QDeclarativePluginParameter::setName(const QString &name) +{ + if (!name_.isEmpty() || name.isEmpty()) + return; + + name_ = name; + + emit nameChanged(name_); + if (value_.isValid()) + emit initialized(); +} + +QString QDeclarativePluginParameter::name() const +{ + return name_; +} + +void QDeclarativePluginParameter::setValue(const QVariant &value) +{ + if (value_.isValid() || !value.isValid() || value.isNull()) + return; + + value_ = value; + + emit valueChanged(value_); + if (!name_.isEmpty()) + emit initialized(); +} + +QVariant QDeclarativePluginParameter::value() const +{ + return value_; +} + +bool QDeclarativePluginParameter::isInitialized() const +{ + return !name_.isEmpty() && value_.isValid(); +} + +QT_END_NAMESPACE + +#include "moc_qdeclarativepluginparameter_p.cpp" diff --git a/src/positioningquick/qdeclarativepluginparameter_p.h b/src/positioningquick/qdeclarativepluginparameter_p.h new file mode 100644 index 0000000..1825dfb --- /dev/null +++ b/src/positioningquick/qdeclarativepluginparameter_p.h @@ -0,0 +1,63 @@ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QDECLARATIVEPLUGINPARAMETER_P_H +#define QDECLARATIVEPLUGINPARAMETER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONINGQUICK_PRIVATE_EXPORT QDeclarativePluginParameter : public QObject +{ + Q_OBJECT + QML_NAMED_ELEMENT(PluginParameter) + QML_ADDED_IN_VERSION(5, 14) + + Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) + Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged) + +public: + explicit QDeclarativePluginParameter(QObject *parent = 0); + ~QDeclarativePluginParameter(); + + void setName(const QString &name); + QString name() const; + + void setValue(const QVariant &value); + QVariant value() const; + + bool isInitialized() const; + +Q_SIGNALS: + void nameChanged(const QString &name); + void valueChanged(const QVariant &value); + void initialized(); + +private: + QString name_; + QVariant value_; +}; + + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QDeclarativePluginParameter) + +#endif // QDECLARATIVEPLUGINPARAMETER_P_H diff --git a/src/positioningquick/qdeclarativeposition.cpp b/src/positioningquick/qdeclarativeposition.cpp new file mode 100644 index 0000000..dbc260a --- /dev/null +++ b/src/positioningquick/qdeclarativeposition.cpp @@ -0,0 +1,645 @@ +// Copyright (C) 2016 Jolla Ltd. +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include +#include "qdeclarativeposition_p.h" +#include +#include +#include + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Position + //! \instantiates QDeclarativePosition + \inqmlmodule QtPositioning + \since 5.2 + + \brief The Position type holds positional data at a particular point in time, + such as coordinate (longitude, latitude, altitude) and speed. + + The Position type holds values related to geographic location such as + a \l coordinate (longitude, latitude, and altitude), the \l timestamp when + the Position was obtained, the \l speed at that time, and the accuracy of + the data. + + Primarily, it is used in the \l{PositionSource::position}{position} property + of a \l{PositionSource}, as the basic unit of data available from the system + location data source. + + Not all properties of a Position object are necessarily valid or available + (for example latitude and longitude may be valid, but speed update has not been + received or set manually). As a result, corresponding "valid" properties + are available (for example \l{coordinate} and \l{longitudeValid}, \l{latitudeValid} + etc) to discern whether the data is available and valid in this position + update. + + Position objects are read-only and can only be produced by a PositionSource. + + \section2 Example Usage + + See the example given for the \l {PositionSource} type, or the + \l {Satellite Info} example application. + + \sa PositionSource, coordinate +*/ + +namespace +{ + +bool equalOrNaN(qreal a, qreal b) +{ + return a == b || (qIsNaN(a) && qIsNaN(b)); +} + +bool exclusiveNaN(qreal a, qreal b) +{ + return qIsNaN(a) != qIsNaN(b); +} + +} + +QDeclarativePosition::QDeclarativePosition(QObject *parent) +: QObject(parent) +{ +} + +QDeclarativePosition::~QDeclarativePosition() +{ +} + +void QDeclarativePosition::setPosition(const QGeoPositionInfo &info) +{ + // timestamp + const QDateTime pTimestamp = m_info.timestamp(); + const QDateTime timestamp = info.timestamp(); + const bool timestampChanged = pTimestamp != timestamp; + + // coordinate + const QGeoCoordinate pCoordinate = m_info.coordinate(); + const QGeoCoordinate coordinate = info.coordinate(); + const bool coordinateChanged = pCoordinate != coordinate; + const bool latitudeValidChanged = exclusiveNaN(pCoordinate.latitude(), coordinate.latitude()); + const bool longitudeValidChanged = + exclusiveNaN(pCoordinate.longitude(), coordinate.longitude()); + const bool altitudeValidChanged = exclusiveNaN(pCoordinate.altitude(), coordinate.altitude()); + + // direction + const qreal pDirection = m_info.attribute(QGeoPositionInfo::Direction); + const qreal direction = info.attribute(QGeoPositionInfo::Direction); + const bool directionChanged = !equalOrNaN(pDirection, direction); + const bool directionValidChanged = exclusiveNaN(pDirection, direction); + + // ground speed + const qreal pSpeed = m_info.attribute(QGeoPositionInfo::GroundSpeed); + const qreal speed = info.attribute(QGeoPositionInfo::GroundSpeed); + const bool speedChanged = !equalOrNaN(pSpeed, speed); + const bool speedValidChanged = exclusiveNaN(pSpeed, speed); + + // vertical speed + const qreal pVerticalSpeed = m_info.attribute(QGeoPositionInfo::VerticalSpeed); + const qreal verticalSpeed = info.attribute(QGeoPositionInfo::VerticalSpeed); + const bool verticalSpeedChanged = !equalOrNaN(pVerticalSpeed, verticalSpeed); + const bool verticalSpeedValidChanged = exclusiveNaN(pVerticalSpeed, verticalSpeed); + + // magnetic variation + const qreal pMagneticVariation = m_info.attribute(QGeoPositionInfo::MagneticVariation); + const qreal magneticVariation = info.attribute(QGeoPositionInfo::MagneticVariation); + const bool magneticVariationChanged = !equalOrNaN(pMagneticVariation, magneticVariation); + const bool magneticVariationValidChanged = exclusiveNaN(pMagneticVariation, magneticVariation); + + // horizontal accuracy + const qreal pHorizontalAccuracy = m_info.attribute(QGeoPositionInfo::HorizontalAccuracy); + const qreal horizontalAccuracy = info.attribute(QGeoPositionInfo::HorizontalAccuracy); + const bool horizontalAccuracyChanged = !equalOrNaN(pHorizontalAccuracy, horizontalAccuracy); + const bool horizontalAccuracyValidChanged = + exclusiveNaN(pHorizontalAccuracy, horizontalAccuracy); + + // vertical accuracy + const qreal pVerticalAccuracy = m_info.attribute(QGeoPositionInfo::VerticalAccuracy); + const qreal verticalAccuracy = info.attribute(QGeoPositionInfo::VerticalAccuracy); + const bool verticalAccuracyChanged = !equalOrNaN(pVerticalAccuracy, verticalAccuracy); + const bool verticalAccuracyValidChanged = exclusiveNaN(pVerticalAccuracy, verticalAccuracy); + + // direction accuracy + const qreal pDirectionAccuracy = m_info.attribute(QGeoPositionInfo::DirectionAccuracy); + const qreal directionAccuracy = info.attribute(QGeoPositionInfo::DirectionAccuracy); + const bool directionAccuracyChanged = !equalOrNaN(pDirectionAccuracy, directionAccuracy); + const bool directionAccuracyValidChanged = exclusiveNaN(pDirectionAccuracy, directionAccuracy); + + m_info = info; + + if (timestampChanged) + m_computedTimestamp.notify(); + + if (coordinateChanged) + m_computedCoordinate.notify(); + if (latitudeValidChanged) + m_computedLatitudeValid.notify(); + if (longitudeValidChanged) + m_computedLongitudeValid.notify(); + if (altitudeValidChanged) + m_computedAltitudeValid.notify(); + + if (directionChanged) + m_computedDirection.notify(); + if (directionValidChanged) + m_computedDirectionValid.notify(); + + if (speedChanged) + m_computedSpeed.notify(); + if (speedValidChanged) + m_computedSpeedValid.notify(); + + if (verticalSpeedChanged) + m_computedVerticalSpeed.notify(); + if (verticalSpeedValidChanged) + m_computedVerticalSpeedValid.notify(); + + if (horizontalAccuracyChanged) + m_computedHorizontalAccuracy.notify(); + if (horizontalAccuracyValidChanged) + m_computedHorizontalAccuracyValid.notify(); + + if (verticalAccuracyChanged) + m_computedVerticalAccuracy.notify(); + if (verticalAccuracyValidChanged) + m_computedVerticalAccuracyValid.notify(); + + if (magneticVariationChanged) + m_computedMagneticVariation.notify(); + if (magneticVariationValidChanged) + m_computedMagneticVariationValid.notify(); + + if (directionAccuracyChanged) + m_computedDirectionAccuracy.notify(); + if (directionAccuracyValidChanged) + m_computedDirectionAccuracyValid.notify(); +} + +const QGeoPositionInfo &QDeclarativePosition::position() const +{ + return m_info; +} + +QBindable QDeclarativePosition::bindableLatitudeValid() const +{ + return QBindable(&m_computedLatitudeValid); +} + +QBindable QDeclarativePosition::bindableLongitudeValid() const +{ + return QBindable(&m_computedLongitudeValid); +} + +QBindable QDeclarativePosition::bindableAltitudeValid() const +{ + return QBindable(&m_computedAltitudeValid); +} + +QBindable QDeclarativePosition::bindableCoordinate() const +{ + return QBindable(&m_computedCoordinate); +} + +QBindable QDeclarativePosition::bindableTimestamp() const +{ + return QBindable(&m_computedTimestamp); +} + +QBindable QDeclarativePosition::bindableSpeed() const +{ + return QBindable(&m_computedSpeed); +} + +QBindable QDeclarativePosition::bindableSpeedValid() const +{ + return QBindable(&m_computedSpeedValid); +} + +QBindable QDeclarativePosition::bindableHorizontalAccuracy() const +{ + return QBindable(&m_computedHorizontalAccuracy); +} + +QBindable QDeclarativePosition::binableVerticalAccuracy() const +{ + return QBindable(&m_computedVerticalAccuracy); +} + +QBindable QDeclarativePosition::bindableHorizontalAccuracyValid() const +{ + return QBindable(&m_computedHorizontalAccuracyValid); +} + +QBindable QDeclarativePosition::bindableVerticalAccuracyValid() const +{ + return QBindable(&m_computedVerticalAccuracyValid); +} + +QBindable QDeclarativePosition::bindableDirectionValid() const +{ + return QBindable(&m_computedDirectionValid); +} + +QBindable QDeclarativePosition::bindableDirection() const +{ + return QBindable(&m_computedDirection); +} + +QBindable QDeclarativePosition::bindableVerticalSpeedValid() const +{ + return QBindable(&m_computedVerticalSpeedValid); +} + +QBindable QDeclarativePosition::bindableVerticalSpeed() const +{ + return QBindable(&m_computedVerticalSpeed); +} + +QBindable QDeclarativePosition::bindableMagneticVariation() const +{ + return QBindable(&m_computedMagneticVariation); +} + +QBindable QDeclarativePosition::bindableMagneticVariationValid() const +{ + return QBindable(&m_computedMagneticVariationValid); +} + +QBindable QDeclarativePosition::bindableDirectionAccuracy() const +{ + return QBindable(&m_computedDirectionAccuracy); +} + +QBindable QDeclarativePosition::bindableDirectionAccuracyValid() const +{ + return QBindable(&m_computedDirectionAccuracyValid); +} + +/*! + \qmlproperty coordinate Position::coordinate + + This property holds the latitude, longitude, and altitude value of the Position. + + It is a read-only property. + + \sa longitudeValid, latitudeValid, altitudeValid +*/ +QGeoCoordinate QDeclarativePosition::coordinate() const +{ + return m_computedCoordinate.value(); +} + +QGeoCoordinate QDeclarativePosition::coordinateActualCalculation() const +{ + return m_info.coordinate(); +} + +/*! + \qmlproperty bool Position::latitudeValid + + This property is true if coordinate's latitude has been set + (to indicate whether that data has been received or not, as every update + does not necessarily contain all data). + + \sa coordinate +*/ +bool QDeclarativePosition::isLatitudeValid() const +{ + return m_computedLatitudeValid.value(); +} + +bool QDeclarativePosition::isLatitudeValidActualCalculation() const +{ + return !qIsNaN(m_info.coordinate().latitude()); +} + +/*! + \qmlproperty bool Position::longitudeValid + + This property is true if coordinate's longitude has been set + (to indicate whether that data has been received or not, as every update + does not necessarily contain all data). + + \sa coordinate +*/ +bool QDeclarativePosition::isLongitudeValid() const +{ + return m_computedLongitudeValid.value(); +} + +bool QDeclarativePosition::isLongitudeValidActualCalculation() const +{ + return !qIsNaN(m_info.coordinate().longitude()); +} + +/*! + \qmlproperty bool Position::speedValid + + This property is true if \l speed has been set + (to indicate whether that data has been received or not, as every update + does not necessarily contain all data). + + \sa speed +*/ +bool QDeclarativePosition::isSpeedValid() const +{ + return m_computedSpeedValid.value(); +} + +bool QDeclarativePosition::isSpeedValidActualCalculation() const +{ + return !qIsNaN(m_info.attribute(QGeoPositionInfo::GroundSpeed)); +} + +/*! + \qmlproperty bool Position::altitudeValid + + This property is true if coordinate's altitude has been set + (to indicate whether that data has been received or not, as every update + does not necessarily contain all data). + + \sa coordinate +*/ +bool QDeclarativePosition::isAltitudeValid() const +{ + return m_computedAltitudeValid.value(); +} + +bool QDeclarativePosition::isAltitudeValidActualCalculation() const +{ + return !qIsNaN(m_info.coordinate().altitude()); +} + +/*! + \qmlproperty double Position::speed + + This property holds the value of speed (groundspeed, meters / second). + + It is a read-only property. + + \sa speedValid, coordinate +*/ +double QDeclarativePosition::speed() const +{ + return m_computedSpeed.value(); +} + +double QDeclarativePosition::speedActualCalculation() const +{ + return m_info.attribute(QGeoPositionInfo::GroundSpeed); +} + +/*! + \qmlproperty real Position::horizontalAccuracy + + This property holds the horizontal accuracy of the coordinate (in meters). + + \sa horizontalAccuracyValid, coordinate +*/ +qreal QDeclarativePosition::horizontalAccuracy() const +{ + return m_computedHorizontalAccuracy.value(); +} + +qreal QDeclarativePosition::horizontalAccuracyActualCalculation() const +{ + return m_info.attribute(QGeoPositionInfo::HorizontalAccuracy); +} + +/*! + \qmlproperty bool Position::horizontalAccuracyValid + + This property is true if \l horizontalAccuracy has been set + (to indicate whether that data has been received or not, as every update + does not necessarily contain all data). + + \sa horizontalAccuracy +*/ +bool QDeclarativePosition::isHorizontalAccuracyValid() const +{ + return m_computedHorizontalAccuracyValid.value(); +} + +bool QDeclarativePosition::isHorizontalAccuracyValidActualCalculation() const +{ + return !qIsNaN(m_info.attribute(QGeoPositionInfo::HorizontalAccuracy)); +} + +/*! + \qmlproperty real Position::verticalAccuracy + + This property holds the vertical accuracy of the coordinate (in meters). + + \sa verticalAccuracyValid, coordinate +*/ +qreal QDeclarativePosition::verticalAccuracy() const +{ + return m_computedVerticalAccuracy.value(); +} + +qreal QDeclarativePosition::verticalAccuracyActualCalculation() const +{ + return m_info.attribute(QGeoPositionInfo::VerticalAccuracy); +} + +/*! + \qmlproperty bool Position::verticalAccuracyValid + + This property is true if \l verticalAccuracy has been set + (to indicate whether that data has been received or not, as every update + does not necessarily contain all data). + + \sa verticalAccuracy +*/ +bool QDeclarativePosition::isVerticalAccuracyValid() const +{ + return m_computedVerticalAccuracyValid.value(); +} + +bool QDeclarativePosition::isVerticalAccuracyValidActualCalculation() const +{ + return !qIsNaN(m_info.attribute(QGeoPositionInfo::VerticalAccuracy)); +} + +/*! + \qmlproperty date Position::timestamp + + This property holds the timestamp when this position + was received. If the property has not been set, it is invalid. + + It is a read-only property. +*/ +QDateTime QDeclarativePosition::timestamp() const +{ + return m_computedTimestamp.value(); +} + +QDateTime QDeclarativePosition::timestampActualCalculation() const +{ + return m_info.timestamp(); +} + +/*! + \qmlproperty bool Position::directionValid + \since Qt Positioning 5.3 + + This property is true if \l direction has been set (to indicate whether that data has been + received or not, as every update does not necessarily contain all data). + + \sa direction +*/ +bool QDeclarativePosition::isDirectionValid() const +{ + return m_computedDirectionValid.value(); +} + +bool QDeclarativePosition::isDirectionValidActualCalculation() const +{ + return !qIsNaN(m_info.attribute(QGeoPositionInfo::Direction)); +} + +/*! + \qmlproperty double Position::direction + \since Qt Positioning 5.3 + + This property holds the value of the direction of travel in degrees from true north. + + It is a read-only property. + + \sa directionValid +*/ +double QDeclarativePosition::direction() const +{ + return m_computedDirection.value(); +} + +double QDeclarativePosition::directionActualCalculation() const +{ + return m_info.attribute(QGeoPositionInfo::Direction); +} + +/*! + \qmlproperty bool Position::verticalSpeedValid + \since Qt Positioning 5.3 + + This property is true if \l verticalSpeed has been set (to indicate whether that data has been + received or not, as every update does not necessarily contain all data). + + \sa verticalSpeed +*/ +bool QDeclarativePosition::isVerticalSpeedValid() const +{ + return m_computedVerticalSpeedValid.value(); +} + +bool QDeclarativePosition::isVerticalSpeedValidActualCalculation() const +{ + return !qIsNaN(m_info.attribute(QGeoPositionInfo::VerticalSpeed)); +} + +/*! + \qmlproperty double Position::verticalSpeed + \since Qt Positioning 5.3 + + This property holds the value of the vertical speed in meters per second. + + It is a read-only property. + + \sa verticalSpeedValid +*/ +double QDeclarativePosition::verticalSpeed() const +{ + return m_computedVerticalSpeed.value(); +} + +double QDeclarativePosition::verticalSpeedActualCalculation() const +{ + return m_info.attribute(QGeoPositionInfo::VerticalSpeed); +} + +/*! + \qmlproperty bool Position::magneticVariationValid + \since Qt Positioning 5.4 + + This property is true if \l magneticVariation has been set (to indicate whether that data has been + received or not, as every update does not necessarily contain all data). + + \sa magneticVariation +*/ +bool QDeclarativePosition::isMagneticVariationValid() const +{ + return m_computedMagneticVariationValid.value(); +} + +bool QDeclarativePosition::isMagneticVariationValidActualCalculation() const +{ + return !qIsNaN(m_info.attribute(QGeoPositionInfo::MagneticVariation)); +} + +/*! + \qmlproperty double Position::magneticVariation + \since Qt Positioning 5.4 + + This property holds the angle between the horizontal component of the + magnetic field and true north, in degrees. Also known as magnetic + declination. A positive value indicates a clockwise direction from + true north and a negative value indicates a counter-clockwise direction. + + It is a read-only property. + + \sa magneticVariationValid +*/ +double QDeclarativePosition::magneticVariation() const +{ + return m_computedMagneticVariation.value(); +} + +double QDeclarativePosition::magneticVariationActualCalculation() const +{ + return m_info.attribute(QGeoPositionInfo::MagneticVariation); +} + +/*! + \qmlproperty bool Position::directionAccuracyValid + \since Qt Positioning 6.3 + + This property is \c true if \l directionAccuracy has been set. + + \sa directionAccuracy +*/ +bool QDeclarativePosition::isDirectionAccuracyValid() const +{ + return m_computedDirectionAccuracyValid.value(); +} + +bool QDeclarativePosition::isDirectionAccuracyValidActualCalculation() const +{ + return !qIsNaN(m_info.attribute(QGeoPositionInfo::DirectionAccuracy)); +} + +/*! + \qmlproperty double Position::directionAccuracy + \since Qt Positioning 6.3 + + This property holds the accuracy of the provided \l direction in degrees. + This property is valid for Android and macOS/iOS only. See + \l {QGeoPositionInfo::Attribute} documentation for more details. + + \sa direction, directionAccuracyValid +*/ +double QDeclarativePosition::directionAccuracy() const +{ + return m_computedDirectionAccuracy.value(); +} + +double QDeclarativePosition::directionAccuracyActualCalculation() const +{ + return m_info.attribute(QGeoPositionInfo::DirectionAccuracy); +} + +QT_END_NAMESPACE + +#include "moc_qdeclarativeposition_p.cpp" diff --git a/src/positioningquick/qdeclarativeposition_p.h b/src/positioningquick/qdeclarativeposition_p.h new file mode 100644 index 0000000..2d0fd95 --- /dev/null +++ b/src/positioningquick/qdeclarativeposition_p.h @@ -0,0 +1,184 @@ +// Copyright (C) 2016 Jolla Ltd. +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QDECLARATIVEPOSITION_H +#define QDECLARATIVEPOSITION_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONINGQUICK_PRIVATE_EXPORT QDeclarativePosition : public QObject +{ + Q_OBJECT + QML_NAMED_ELEMENT(Position) + QML_ADDED_IN_VERSION(5, 0) + + Q_PROPERTY(bool latitudeValid READ isLatitudeValid BINDABLE bindableLatitudeValid) + Q_PROPERTY(bool longitudeValid READ isLongitudeValid BINDABLE bindableLongitudeValid) + Q_PROPERTY(bool altitudeValid READ isAltitudeValid BINDABLE bindableAltitudeValid) + Q_PROPERTY(QGeoCoordinate coordinate READ coordinate BINDABLE bindableCoordinate) + Q_PROPERTY(QDateTime timestamp READ timestamp BINDABLE bindableTimestamp) + Q_PROPERTY(double speed READ speed BINDABLE bindableSpeed) + Q_PROPERTY(bool speedValid READ isSpeedValid BINDABLE bindableSpeedValid) + Q_PROPERTY(qreal horizontalAccuracy READ horizontalAccuracy BINDABLE bindableHorizontalAccuracy) + Q_PROPERTY(qreal verticalAccuracy READ verticalAccuracy BINDABLE binableVerticalAccuracy) + Q_PROPERTY(bool horizontalAccuracyValid READ isHorizontalAccuracyValid BINDABLE + bindableHorizontalAccuracyValid) + Q_PROPERTY(bool verticalAccuracyValid READ isVerticalAccuracyValid BINDABLE + bindableVerticalAccuracyValid) + + Q_PROPERTY(bool directionValid READ isDirectionValid BINDABLE bindableDirectionValid + REVISION(5, 1)) + Q_PROPERTY(double direction READ direction BINDABLE bindableDirection REVISION(5, 1)) + Q_PROPERTY(bool verticalSpeedValid READ isVerticalSpeedValid BINDABLE bindableVerticalSpeedValid + REVISION(5, 1)) + Q_PROPERTY(double verticalSpeed READ verticalSpeed BINDABLE bindableVerticalSpeed + REVISION(5, 1)) + + Q_PROPERTY(double magneticVariation READ magneticVariation BINDABLE bindableMagneticVariation + REVISION(5, 2)) + Q_PROPERTY(bool magneticVariationValid READ isMagneticVariationValid BINDABLE + bindableMagneticVariationValid REVISION(5, 2)) + + Q_PROPERTY(double directionAccuracy READ directionAccuracy BINDABLE bindableDirectionAccuracy + REVISION(6, 3)) + Q_PROPERTY(bool directionAccuracyValid READ isDirectionAccuracyValid BINDABLE + bindableDirectionAccuracyValid REVISION(6, 3)) + +public: + explicit QDeclarativePosition(QObject *parent = 0); + ~QDeclarativePosition(); + + bool isLatitudeValid() const; + bool isLongitudeValid() const; + bool isAltitudeValid() const; + QDateTime timestamp() const; + double speed() const; + bool isSpeedValid() const; + QGeoCoordinate coordinate() const; + bool isHorizontalAccuracyValid() const; + qreal horizontalAccuracy() const; + bool isVerticalAccuracyValid() const; + qreal verticalAccuracy() const; + + bool isDirectionValid() const; + double direction() const; + + bool isVerticalSpeedValid() const; + double verticalSpeed() const; + + bool isMagneticVariationValid() const; + double magneticVariation() const; + + void setPosition(const QGeoPositionInfo &info); + const QGeoPositionInfo &position() const; + + bool isDirectionAccuracyValid() const; + double directionAccuracy() const; + + QBindable bindableLatitudeValid() const; + QBindable bindableLongitudeValid() const; + QBindable bindableAltitudeValid() const; + QBindable bindableCoordinate() const; + QBindable bindableTimestamp() const; + QBindable bindableSpeed() const; + QBindable bindableSpeedValid() const; + QBindable bindableHorizontalAccuracy() const; + QBindable binableVerticalAccuracy() const; + QBindable bindableHorizontalAccuracyValid() const; + QBindable bindableVerticalAccuracyValid() const; + QBindable bindableDirectionValid() const; + QBindable bindableDirection() const; + QBindable bindableVerticalSpeedValid() const; + QBindable bindableVerticalSpeed() const; + QBindable bindableMagneticVariation() const; + QBindable bindableMagneticVariationValid() const; + QBindable bindableDirectionAccuracy() const; + QBindable bindableDirectionAccuracyValid() const; + +private: + bool isLatitudeValidActualCalculation() const; + bool isLongitudeValidActualCalculation() const; + bool isAltitudeValidActualCalculation() const; + QGeoCoordinate coordinateActualCalculation() const; + QDateTime timestampActualCalculation() const; + double speedActualCalculation() const; + bool isSpeedValidActualCalculation() const; + qreal horizontalAccuracyActualCalculation() const; + qreal verticalAccuracyActualCalculation() const; + bool isHorizontalAccuracyValidActualCalculation() const; + bool isVerticalAccuracyValidActualCalculation() const; + bool isDirectionValidActualCalculation() const; + double directionActualCalculation() const; + bool isVerticalSpeedValidActualCalculation() const; + double verticalSpeedActualCalculation() const; + double magneticVariationActualCalculation() const; + bool isMagneticVariationValidActualCalculation() const; + double directionAccuracyActualCalculation() const; + bool isDirectionAccuracyValidActualCalculation() const; + + QGeoPositionInfo m_info; + + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, bool, m_computedLatitudeValid, + &QDeclarativePosition::isLatitudeValidActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, bool, m_computedLongitudeValid, + &QDeclarativePosition::isLongitudeValidActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, bool, m_computedAltitudeValid, + &QDeclarativePosition::isAltitudeValidActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, QGeoCoordinate, m_computedCoordinate, + &QDeclarativePosition::coordinateActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, QDateTime, m_computedTimestamp, + &QDeclarativePosition::timestampActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, double, m_computedSpeed, + &QDeclarativePosition::speedActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, bool, m_computedSpeedValid, + &QDeclarativePosition::isSpeedValidActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, qreal, m_computedHorizontalAccuracy, + &QDeclarativePosition::horizontalAccuracyActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, qreal, m_computedVerticalAccuracy, + &QDeclarativePosition::verticalAccuracyActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, bool, m_computedHorizontalAccuracyValid, + &QDeclarativePosition::isHorizontalAccuracyValidActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, bool, m_computedVerticalAccuracyValid, + &QDeclarativePosition::isVerticalAccuracyValidActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, bool, m_computedDirectionValid, + &QDeclarativePosition::isDirectionValidActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, double, m_computedDirection, + &QDeclarativePosition::directionActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, bool, m_computedVerticalSpeedValid, + &QDeclarativePosition::isVerticalSpeedValidActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, double, m_computedVerticalSpeed, + &QDeclarativePosition::verticalSpeedActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, double, m_computedMagneticVariation, + &QDeclarativePosition::magneticVariationActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, bool, m_computedMagneticVariationValid, + &QDeclarativePosition::isMagneticVariationValidActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, double, m_computedDirectionAccuracy, + &QDeclarativePosition::directionAccuracyActualCalculation) + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePosition, bool, m_computedDirectionAccuracyValid, + &QDeclarativePosition::isDirectionAccuracyValidActualCalculation) +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QDeclarativePosition) + +#endif diff --git a/src/positioningquick/qdeclarativepositionsource.cpp b/src/positioningquick/qdeclarativepositionsource.cpp new file mode 100644 index 0000000..5e27ae3 --- /dev/null +++ b/src/positioningquick/qdeclarativepositionsource.cpp @@ -0,0 +1,871 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qdeclarativepositionsource_p.h" +#include "qdeclarativeposition_p.h" + +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +/*! + \qmltype PositionSource + //! \instantiates QDeclarativePositionSource + \inqmlmodule QtPositioning + \since 5.2 + + \brief The PositionSource type provides the device's current position. + + The PositionSource type provides information about the user device's + current position. The position is available as a \l{Position} type, which + contains all the standard parameters typically available from GPS and other + similar systems, including longitude, latitude, speed and accuracy details. + + As different position sources are available on different platforms and + devices, these are categorized by their basic type (Satellite, NonSatellite, + and AllPositioningMethods). The available methods for the current platform + can be enumerated in the \l{supportedPositioningMethods} property. + + To indicate which methods are suitable for your application, set the + \l{preferredPositioningMethods} property. If the preferred methods are not + available, the default source of location data for the platform will be + chosen instead. If no default source is available (because none are installed + for the runtime platform, or because it is disabled), the \l{valid} property + will be set to false. + + The \l updateInterval property can then be used to indicate how often your + application wishes to receive position updates. The \l{start}(), + \l{stop}() and \l{update}() methods can be used to control the operation + of the PositionSource, as well as the \l{active} property, which when set + is equivalent to calling \l{start}() or \l{stop}(). + + When the PositionSource is active, position updates can be retrieved + either by simply using the \l{position} property in a binding (as the + value of another item's property), or by providing an implementation of + the \c {onPositionChanged} signal-handler. + + \section2 Example Usage + + The following example shows a simple PositionSource used to receive + updates every second and print the longitude and latitude out to + the console. + + \code + PositionSource { + id: src + updateInterval: 1000 + active: true + + onPositionChanged: { + var coord = src.position.coordinate; + console.log("Coordinate:", coord.longitude, coord.latitude); + } + } + \endcode + + \section2 Controlling Operation State + + As it's mentioned above, PositionSource provides two ways to control its + operation state: + + \list + \li By using the \l active \l {Qt Bindable Properties}{bindable} property. + \li By using \l start() and \l stop() methods. + \endlist + + \note It's very important not to mix these approaches. If a bindable + \l active property is used to control the PositionSource object, but later + \l start() or \l stop() is called from the other part of the code, the + binding is broken, which may result in, for example, a UI element that is + not connected to any underlying object anymore. + + Consider the following example of \b {bad code} where the \c active property + is bound to the CheckBox state, and calling \l stop() in the \c onClicked + signal handler breaks that binding. + + \qml + Window { + width: 640 + height: 480 + visible: true + + PositionSource { + id: posSource + name: "geoclue2" + active: cb.checked + } + + Column { + anchors.centerIn: parent + spacing: 20 + CheckBox { + id: cb + } + Button { + id: btn + text: "Stop" + onClicked: { + posSource.stop() + } + } + } + } + \endqml + + Once the \e Stop button is clicked, \l stop() is executed, and the binding + for the \l active property is broken. At this point the CheckBox UI element + is no longer controlling the PositionSource object. + + A straightforward fix in this case is to update the CheckBox state from + the \c onClicked handler. As soon as the CheckBox is unchecked, the + \l active property will be notified, and the PositionSource object's state + will update accordingly. The UI will also be in a consistent state. + + \qml + Button { + id: btn + text: "Stop" + onClicked: { + cb.checked = false + } + } + \endqml + + \note Using \l update() to request a single position update \e {does not} + have any effect on the \l active property's bindings, so they can be used + together without any problems. + + \sa {QtPositioning::Position}, {QGeoPositionInfoSource}, {PluginParameter}, + {Qt Bindable Properties} + +*/ + +QDeclarativePositionSource::QDeclarativePositionSource() + : m_singleUpdate(0), m_regularUpdates(0), m_componentComplete(0), + m_parametersInitialized(0), m_startRequested(0), m_defaultSourceUsed(0) +{ + m_position.setValueBypassingBindings(new QDeclarativePosition(this)); +} + +QDeclarativePositionSource::~QDeclarativePositionSource() +{ + delete m_positionSource; +} + + +/*! + \qmlproperty string PositionSource::name + + This property holds the unique internal name for the plugin currently + providing position information. + + Setting the property causes the PositionSource to use a particular positioning provider. If + the PositionSource is active at the time that the name property is changed, it will become + inactive. If the specified positioning provider cannot be loaded the position source will + become invalid. + + Changing the name property may cause the \l {updateInterval}, \l {supportedPositioningMethods} + and \l {preferredPositioningMethods} properties to change as well. +*/ + + +QString QDeclarativePositionSource::name() const +{ + return m_sourceName; +} + +void QDeclarativePositionSource::setName(const QString &newName) +{ + m_sourceName.removeBindingUnlessInWrapper(); + if (m_positionSource && m_positionSource->sourceName() == newName) + return; + + if (newName.isEmpty() && m_defaultSourceUsed) + return; // previously attached to a default source, now requesting the same. + + const QString previousName = m_sourceName.valueBypassingBindings(); + + if (!m_componentComplete || !m_parametersInitialized) { + if (previousName != newName) { + m_sourceName.setValueBypassingBindings(newName); + m_sourceName.notify(); + } + return; + } + + // tryAttach() will update the m_sourceName correctly + tryAttach(newName, false); +} + +QBindable QDeclarativePositionSource::bindableName() +{ + return QBindable(&m_sourceName); +} + +QBindable QDeclarativePositionSource::bindablePosition() const +{ + return QBindable(&m_position); +} + +/*! + \internal +*/ +void QDeclarativePositionSource::tryAttach(const QString &newName, bool useFallback) +{ + const QString previousName = name(); + const bool sourceExisted = (m_positionSource != nullptr); + + int previousUpdateInterval = updateInterval(); + PositioningMethods previousPositioningMethods = supportedPositioningMethods(); + PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods(); + + m_defaultSourceUsed = false; + + if (newName.isEmpty()) { + setSource(QGeoPositionInfoSource::createDefaultSource(parameterMap(), this)); + m_defaultSourceUsed = true; + } else { + setSource(QGeoPositionInfoSource::createSource(newName, parameterMap(), this)); + if (!m_positionSource && useFallback) { + setSource(QGeoPositionInfoSource::createDefaultSource(parameterMap(), this)); + m_defaultSourceUsed = true; + } + } + + if (m_positionSource) { + m_sourceName.setValueBypassingBindings(m_positionSource->sourceName()); + + connect(m_positionSource, SIGNAL(positionUpdated(QGeoPositionInfo)), + this, SLOT(positionUpdateReceived(QGeoPositionInfo))); + connect(m_positionSource, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error)), + this, SLOT(sourceErrorReceived(QGeoPositionInfoSource::Error))); + + m_positionSource->setUpdateInterval(m_updateInterval); + m_positionSource->setPreferredPositioningMethods( + static_cast(int(m_preferredPositioningMethods))); + + if (m_startRequested) { + const QGeoPositionInfo &lastKnown = m_positionSource->lastKnownPosition(); + if (lastKnown.isValid()) + setPosition(lastKnown); + } + } else { + m_sourceName.setValueBypassingBindings(newName); + m_defaultSourceUsed = false; + if (m_active) { + // We do not want to break the binding here, because we just want to + // give the user an opportunity to select another plugin and keep + // working. + m_active.setValueBypassingBindings(false); + m_active.notify(); + } + } + + if (previousUpdateInterval != updateInterval()) + emit updateIntervalChanged(); + + if (previousPreferredPositioningMethods != preferredPositioningMethods()) + emit preferredPositioningMethodsChanged(); + + if (previousPositioningMethods != supportedPositioningMethods()) + notifySupportedPositioningMethodsChanged(); + + const bool sourceCurrentlyExists = (m_positionSource != nullptr); + if (sourceExisted != sourceCurrentlyExists) { + m_isValid.notify(); + emit validityChanged(); + } + + if (m_active) { // implies m_positionSource + // If m_active is true, then the previous position source existed! + Q_ASSERT(sourceExisted); + // New source is set. It should be inactive by default. + // But we do not want to break the binding. + m_active.setValueBypassingBindings(false); + m_active.notify(); + } else if (m_startRequested) { + m_startRequested = false; + executeStart(); + } + + if (previousName != m_sourceName) + m_sourceName.notify(); +} + +/*! + \qmlproperty bool PositionSource::valid + + This property is true if the PositionSource object has acquired a valid + backend plugin to provide data. If false, other methods on the PositionSource + will have no effect. + + Applications should check this property to determine whether positioning is + available and enabled on the runtime platform, and react accordingly. +*/ +bool QDeclarativePositionSource::isValid() const +{ + return m_isValid.value(); +} + +QBindable QDeclarativePositionSource::bindableIsValid() const +{ + return QBindable(&m_isValid); +} + +bool QDeclarativePositionSource::isValidActualComputation() const +{ + return m_positionSource != nullptr; +} + +/*! + \internal +*/ +void QDeclarativePositionSource::onParameterInitialized() +{ + m_parametersInitialized = true; + for (QDeclarativePluginParameter *p: std::as_const(m_parameters)) { + if (!p->isInitialized()) { + m_parametersInitialized = false; + break; + } + } + + // If here, componentComplete has been called. + if (m_parametersInitialized) + tryAttach(m_sourceName.value()); +} + +void QDeclarativePositionSource::notifySupportedPositioningMethodsChanged() +{ + m_supportedPositioningMethods.notify(); + emit supportedPositioningMethodsChanged(); +} + +void QDeclarativePositionSource::setPosition(const QGeoPositionInfo &pi) +{ + m_position.value()->setPosition(pi); + m_position.notify(); + emit positionChanged(); +} + +void QDeclarativePositionSource::setSource(QGeoPositionInfoSource *source) +{ + if (m_positionSource) + delete m_positionSource; + + if (!source) { + m_positionSource = nullptr; + } else { + m_positionSource = source; + connect(m_positionSource, &QGeoPositionInfoSource::supportedPositioningMethodsChanged, + this, &QDeclarativePositionSource::notifySupportedPositioningMethodsChanged); + } +} + +bool QDeclarativePositionSource::parametersReady() +{ + for (const QDeclarativePluginParameter *p: std::as_const(m_parameters)) { + if (!p->isInitialized()) + return false; + } + return true; +} + +/*! + \internal +*/ +QVariantMap QDeclarativePositionSource::parameterMap() const +{ + QVariantMap map; + + for (const auto *parameter : m_parameters) + map.insert(parameter->name(), parameter->value()); + + return map; +} + +/*! + \internal +*/ +void QDeclarativePositionSource::setUpdateInterval(int updateInterval) +{ + if (m_positionSource) { + int previousUpdateInterval = m_positionSource->updateInterval(); + + m_updateInterval = updateInterval; + + if (previousUpdateInterval != updateInterval) { + m_positionSource->setUpdateInterval(updateInterval); + if (previousUpdateInterval != m_positionSource->updateInterval()) + emit updateIntervalChanged(); + } + } else { + if (m_updateInterval != updateInterval) { + m_updateInterval = updateInterval; + emit updateIntervalChanged(); + } + } +} + +/*! + \qmlproperty int PositionSource::updateInterval + + This property holds the desired interval between updates (milliseconds). + + \sa {QGeoPositionInfoSource::updateInterval()} +*/ + +int QDeclarativePositionSource::updateInterval() const +{ + if (!m_positionSource) + return m_updateInterval; + + return m_positionSource->updateInterval(); +} + +/*! + \qmlproperty enumeration PositionSource::supportedPositioningMethods + + This property holds the supported positioning methods of the + current source. + + \list + \li PositionSource.NoPositioningMethods - No positioning methods supported (no source). + \li PositionSource.SatellitePositioningMethods - Satellite-based positioning methods such as GPS are supported. + \li PositionSource.NonSatellitePositioningMethods - Non-satellite-based methods are supported. + \li PositionSource.AllPositioningMethods - Both satellite-based and non-satellite positioning methods are supported. + \endlist + +*/ + +QDeclarativePositionSource::PositioningMethods +QDeclarativePositionSource::supportedPositioningMethods() const +{ + return m_supportedPositioningMethods.value(); +} + +QDeclarativePositionSource::PositioningMethods +QDeclarativePositionSource::supportedMethodsActualComputation() const +{ + if (m_positionSource) { + return static_cast( + int(m_positionSource->supportedPositioningMethods())); + } + return QDeclarativePositionSource::NoPositioningMethods; +} + +QBindable +QDeclarativePositionSource::bindableSupportedPositioningMethods() const +{ + return QBindable(&m_supportedPositioningMethods); +} + +/*! + \qmlproperty enumeration PositionSource::preferredPositioningMethods + + This property holds the preferred positioning methods of the + current source. + + \list + \li PositionSource.NoPositioningMethods - No positioning method is preferred. + \li PositionSource.SatellitePositioningMethods - Satellite-based positioning methods such as GPS should be preferred. + \li PositionSource.NonSatellitePositioningMethods - Non-satellite-based methods should be preferred. + \li PositionSource.AllPositioningMethods - Any positioning methods are acceptable. + \endlist + +*/ + +void QDeclarativePositionSource::setPreferredPositioningMethods(PositioningMethods methods) +{ + if (m_positionSource) { + PositioningMethods previousPreferredPositioningMethods = preferredPositioningMethods(); + + m_preferredPositioningMethods = methods; + + if (previousPreferredPositioningMethods != methods) { + m_positionSource->setPreferredPositioningMethods( + static_cast(int(methods))); + if (previousPreferredPositioningMethods != m_positionSource->preferredPositioningMethods()) + emit preferredPositioningMethodsChanged(); + } + } else { + if (m_preferredPositioningMethods != methods) { + m_preferredPositioningMethods = methods; + emit preferredPositioningMethodsChanged(); + } + } +} + +QDeclarativePositionSource::PositioningMethods QDeclarativePositionSource::preferredPositioningMethods() const +{ + if (m_positionSource) { + return static_cast( + int(m_positionSource->preferredPositioningMethods())); + } + return m_preferredPositioningMethods; +} + +/*! + \qmlmethod PositionSource::start() + + Requests updates from the location source. + Uses \l updateInterval if set, default interval otherwise. + If there is no source available, this method has no effect. + + \note Calling this method breaks the bindings of + \l {PositionSource::}{active} property. + + \sa stop, update, active +*/ + +void QDeclarativePositionSource::start() +{ + if (m_positionSource) { + m_active.removeBindingUnlessInWrapper(); + executeStart(); + } +} + +/*! + \qmlmethod PositionSource::update(int timeout) + + A convenience method to request single update from the location source. + If there is no source available, this method has no effect. + + If the position source is not active, it will be activated for as + long as it takes to receive an update, or until the request times + out. The request timeout period is source-specific. + + The \a timeout is specified in milliseconds. If the \a timeout is zero + (the default value), it defaults to a reasonable timeout period as + appropriate for the source. + + \sa start, stop, active +*/ + +void QDeclarativePositionSource::update(int timeout) +{ + if (m_positionSource) { + m_singleUpdate = true; + if (!m_active) { + // Questionable: we do not want this method to break the binding. + // Mostly because it can be called while the updates are already + // running. + m_active.setValueBypassingBindings(true); + m_active.notify(); + } + // Use default timeout value. Set active before calling the + // update request because on some platforms there may + // be results immediately. + m_positionSource->requestUpdate(timeout); + } +} + +/*! + \qmlmethod PositionSource::stop() + + Stops updates from the location source. + If there is no source available or it is not active, + this method has no effect. + + \note Calling this method breaks the bindings of + \l {PositionSource::}{active} property. + + \sa start, update, active +*/ + +void QDeclarativePositionSource::stop() +{ + if (m_positionSource) { + m_positionSource->stopUpdates(); + m_regularUpdates = false; + // Try to break the binding even if we do not actually need to update + // the active state. The m_active can be updated later, when the + // single update request finishes. + m_active.removeBindingUnlessInWrapper(); + if (m_active && !m_singleUpdate) { + m_active.setValueBypassingBindings(false); + m_active.notify(); + } + } +} + +/*! + \qmlproperty bool PositionSource::active + + This property indicates whether the position source is active. + Setting this property to false equals calling \l stop, and + setting this property true equals calling \l start. + + \sa start, stop, update +*/ +void QDeclarativePositionSource::setActive(bool active) +{ + // We need to remove binding, if this method is called explicitly. + // Other changes to m_active are done inside start() and stop() methods. + m_active.removeBindingUnlessInWrapper(); + if (active == m_active) + return; + + if (active) { + // If the component is not completed yet, we need to defer the + // actual executeStart() call until everything is set up. + if (m_componentComplete && m_parametersInitialized) + executeStart(); + else + m_startRequested = true; + } else { + stop(); + } +} + +bool QDeclarativePositionSource::isActive() const +{ + return m_active; +} + +/*! + \qmlproperty Position PositionSource::position + + This property holds the last known positional data. + It is a read-only property. + + The Position type has different positional member variables, + whose validity can be checked with appropriate validity functions + (for example sometimes an update does not have speed or altitude data). + + However, whenever a \c {positionChanged} signal has been received, at least + position::coordinate::latitude, position::coordinate::longitude, and position::timestamp can + be assumed to be valid. + + \sa start, stop, update +*/ + +QDeclarativePosition *QDeclarativePositionSource::position() +{ + return m_position.value(); +} + +void QDeclarativePositionSource::positionUpdateReceived(const QGeoPositionInfo &update) +{ + setPosition(update); + + if (m_singleUpdate && m_active) { + // we need to reset m_singleUpdate because we got one + m_singleUpdate = false; + if (!m_regularUpdates) { + // but we change the active state only if the regular updates are + // also stopped + m_active.setValueBypassingBindings(false); + m_active.notify(); + } + } +} + + +/*! + \qmlproperty enumeration PositionSource::sourceError + + This property holds the error which last occurred with the PositionSource. + + \list + \li PositionSource.AccessError - The connection setup to the remote positioning backend failed because the + application lacked the required privileges. + \li PositionSource.ClosedError - The positioning backend closed the connection, which happens for example in case + the user is switching location services to off. As soon as the location service is re-enabled + regular updates will resume. + \li PositionSource.NoError - No error has occurred. + \li PositionSource.UnknownSourceError - An unidentified error occurred. + \li PositionSource.UpdateTimeoutError - The current position could not be + retrieved within the specified timeout, or this PositionSource determined + that it will not be able to provide further regular updates. + \endlist + +*/ + +QDeclarativePositionSource::SourceError QDeclarativePositionSource::sourceError() const +{ + return m_sourceError; +} + +QBindable +QDeclarativePositionSource::bindableSourceError() const +{ + return QBindable(&m_sourceError); +} + +QGeoPositionInfoSource *QDeclarativePositionSource::positionSource() const +{ + return m_positionSource; +} + +/*! + \qmlproperty list PositionSource::parameters + \qmldefault + + This property holds the list of plugin parameters. + + \since QtPositioning 5.14 +*/ +QQmlListProperty QDeclarativePositionSource::parameters() +{ + return QQmlListProperty(this, + 0, + parameter_append, + parameter_count, + parameter_at, + parameter_clear); +} + +/*! + \internal +*/ +void QDeclarativePositionSource::parameter_append(QQmlListProperty *prop, QDeclarativePluginParameter *parameter) +{ + QDeclarativePositionSource *p = static_cast(prop->object); + p->m_parameters.append(parameter); +} + +/*! + \internal +*/ +qsizetype QDeclarativePositionSource::parameter_count(QQmlListProperty *prop) +{ + return static_cast(prop->object)->m_parameters.size(); +} + +/*! + \internal +*/ +QDeclarativePluginParameter *QDeclarativePositionSource::parameter_at(QQmlListProperty *prop, qsizetype index) +{ + return static_cast(prop->object)->m_parameters[index]; +} + +/*! + \internal +*/ +void QDeclarativePositionSource::parameter_clear(QQmlListProperty *prop) +{ + QDeclarativePositionSource *p = static_cast(prop->object); + p->m_parameters.clear(); +} + +void QDeclarativePositionSource::executeStart() +{ + if (m_positionSource) { + m_positionSource->startUpdates(); + + // If this method is called directly from start(), the binding is + // already broken there (for the consistency with stop()). + // If this method is called by a timer, started in setActive(), we do + // not need to break the binding, because it was already done (if + // needed). + + m_regularUpdates = true; + if (!m_active) { + m_active.setValueBypassingBindings(true); + m_active.notify(); + } + } +} + +void QDeclarativePositionSource::componentComplete() +{ + m_componentComplete = true; + m_parametersInitialized = true; + for (QDeclarativePluginParameter *p: std::as_const(m_parameters)) { + if (!p->isInitialized()) { + m_parametersInitialized = false; + connect(p, &QDeclarativePluginParameter::initialized, + this, &QDeclarativePositionSource::onParameterInitialized, + Qt::SingleShotConnection); + } + } + + if (m_parametersInitialized) + tryAttach(m_sourceName.value()); +} + +/*! + \qmlmethod bool PositionSource::setBackendProperty(string name, Variant value) + + Sets the backend-specific property named \a name to \a value. + Returns true on success, false otherwise, including if called on an uninitialized PositionSource. + Supported backend-specific properties are listed and described in + \l {Qt Positioning plugins#Default plugins}. + + \since Qt Positioning 5.14 + + \sa backendProperty, QGeoPositionInfoSource::setBackendProperty +*/ +bool QDeclarativePositionSource::setBackendProperty(const QString &name, const QVariant &value) +{ + if (m_positionSource) + return m_positionSource->setBackendProperty(name, value); + return false; +} + +/*! + \qmlmethod Variant PositionSource::backendProperty(string name) + + Returns the value of the backend-specific property named \a name, if present. + Otherwise, including if called on an uninitialized PositionSource, the return value will be invalid. + Supported backend-specific properties are listed and described in + \l {Qt Positioning plugins#Default plugins}. + + \since Qt Positioning 5.14 + + \sa backendProperty, QGeoPositionInfoSource::setBackendProperty +*/ +QVariant QDeclarativePositionSource::backendProperty(const QString &name) const +{ + if (m_positionSource) + return m_positionSource->backendProperty(name); + return QVariant(); +} + +QBindable QDeclarativePositionSource::bindableActive() +{ + return QBindable(&m_active); +} + +/*! + \internal +*/ +void QDeclarativePositionSource::sourceErrorReceived(const QGeoPositionInfoSource::Error error) +{ + if (error == QGeoPositionInfoSource::AccessError) + m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::AccessError); + else if (error == QGeoPositionInfoSource::ClosedError) + m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::ClosedError); + else if (error == QGeoPositionInfoSource::UpdateTimeoutError) + m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::UpdateTimeoutError); + else if (error == QGeoPositionInfoSource::NoError) + return; //nothing to do + else + m_sourceError.setValueBypassingBindings(QDeclarativePositionSource::UnknownSourceError); + + m_sourceError.notify(); + emit sourceErrorChanged(); + + // if an error occurred during single update, the update is stopped, so we + // need to change the active state. + if (m_active && m_singleUpdate) { + m_singleUpdate = false; + if (!m_regularUpdates) { + m_active.setValueBypassingBindings(false); + m_active.notify(); + } + } +} + +QT_END_NAMESPACE + +#include "moc_qdeclarativepositionsource_p.cpp" diff --git a/src/positioningquick/qdeclarativepositionsource_p.h b/src/positioningquick/qdeclarativepositionsource_p.h new file mode 100644 index 0000000..a182858 --- /dev/null +++ b/src/positioningquick/qdeclarativepositionsource_p.h @@ -0,0 +1,187 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QDECLARATIVEPOSITIONSOURCE_H +#define QDECLARATIVEPOSITIONSOURCE_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QFile; +class QTcpSocket; + +class Q_POSITIONINGQUICK_PRIVATE_EXPORT QDeclarativePositionSource : public QObject, public QQmlParserStatus +{ + Q_OBJECT + QML_NAMED_ELEMENT(PositionSource) + QML_ADDED_IN_VERSION(5, 0) + + Q_PROPERTY(QDeclarativePosition *position READ position NOTIFY positionChanged + BINDABLE bindablePosition) + Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged + BINDABLE bindableActive) + Q_PROPERTY(bool valid READ isValid NOTIFY validityChanged BINDABLE bindableIsValid) + Q_PROPERTY(int updateInterval READ updateInterval WRITE setUpdateInterval + NOTIFY updateIntervalChanged) + Q_PROPERTY(PositioningMethods supportedPositioningMethods READ supportedPositioningMethods + NOTIFY supportedPositioningMethodsChanged + BINDABLE bindableSupportedPositioningMethods) + Q_PROPERTY(PositioningMethods preferredPositioningMethods READ preferredPositioningMethods + WRITE setPreferredPositioningMethods NOTIFY preferredPositioningMethodsChanged) + Q_PROPERTY(SourceError sourceError READ sourceError NOTIFY sourceErrorChanged + BINDABLE bindableSourceError) + Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged BINDABLE bindableName) + Q_PROPERTY(QQmlListProperty parameters READ parameters REVISION(5, 14)) + Q_ENUMS(PositioningMethod) + + Q_CLASSINFO("DefaultProperty", "parameters") + Q_INTERFACES(QQmlParserStatus) + +public: + enum PositioningMethod { + NoPositioningMethods = QGeoPositionInfoSource::NoPositioningMethods, + SatellitePositioningMethods = QGeoPositionInfoSource::SatellitePositioningMethods, + NonSatellitePositioningMethods = QGeoPositionInfoSource::NonSatellitePositioningMethods, + AllPositioningMethods = QGeoPositionInfoSource::AllPositioningMethods + }; + + Q_DECLARE_FLAGS(PositioningMethods, PositioningMethod) + Q_FLAGS(PositioningMethods) + + enum SourceError { + AccessError = QGeoPositionInfoSource::AccessError, + ClosedError = QGeoPositionInfoSource::ClosedError, + UnknownSourceError = QGeoPositionInfoSource::UnknownSourceError, + NoError = QGeoPositionInfoSource::NoError, + UpdateTimeoutError = QGeoPositionInfoSource::UpdateTimeoutError, + }; + Q_ENUMS(SourceError) + + QDeclarativePositionSource(); + ~QDeclarativePositionSource(); + void setUpdateInterval(int updateInterval); + void setActive(bool active); + void setPreferredPositioningMethods(PositioningMethods methods); + + QString name() const; + void setName(const QString &name); + + int updateInterval() const; + bool isActive() const; + bool isValid() const; + QDeclarativePosition *position(); + PositioningMethods supportedPositioningMethods() const; + PositioningMethods preferredPositioningMethods() const; + SourceError sourceError() const; + QGeoPositionInfoSource *positionSource() const; + QQmlListProperty parameters(); + QVariantMap parameterMap() const; + + // Virtuals from QQmlParserStatus + void classBegin() override { } + void componentComplete() override; + + Q_REVISION(5, 14) Q_INVOKABLE bool setBackendProperty(const QString &name, const QVariant &value); + Q_REVISION(5, 14) Q_INVOKABLE QVariant backendProperty(const QString &name) const; + + QBindable bindableSupportedPositioningMethods() const; + QBindable bindableSourceError() const; + QBindable bindableIsValid() const; + QBindable bindableName(); + QBindable bindablePosition() const; + QBindable bindableActive(); + +public Q_SLOTS: + void update(int timeout = 0); + void start(); + void stop(); + +Q_SIGNALS: + void positionChanged(); + void activeChanged(); + void updateIntervalChanged(); + void supportedPositioningMethodsChanged(); + void preferredPositioningMethodsChanged(); + void sourceErrorChanged(); + void nameChanged(); + void validityChanged(); + +private Q_SLOTS: + void positionUpdateReceived(const QGeoPositionInfo &update); + void sourceErrorReceived(const QGeoPositionInfoSource::Error error); + void onParameterInitialized(); + void notifySupportedPositioningMethodsChanged(); + +private: + void setPosition(const QGeoPositionInfo &pi); + void setSource(QGeoPositionInfoSource *source); + bool parametersReady(); + void tryAttach(const QString &name, bool useFallback = true); + + static void parameter_append(QQmlListProperty *prop, QDeclarativePluginParameter *mapObject); + static qsizetype parameter_count(QQmlListProperty *prop); + static QDeclarativePluginParameter *parameter_at(QQmlListProperty *prop, qsizetype index); + static void parameter_clear(QQmlListProperty *prop); + + bool isValidActualComputation() const; + PositioningMethods supportedMethodsActualComputation() const; + + void executeStart(); + + QGeoPositionInfoSource *m_positionSource = nullptr; + PositioningMethods m_preferredPositioningMethods = AllPositioningMethods; + int m_updateInterval = 0; + QList m_parameters; + + Q_OBJECT_COMPAT_PROPERTY(QDeclarativePositionSource, QString, m_sourceName, + &QDeclarativePositionSource::setName, + &QDeclarativePositionSource::nameChanged) + + Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QDeclarativePositionSource, bool, m_active, + &QDeclarativePositionSource::setActive, + &QDeclarativePositionSource::activeChanged, false) + + Q_OBJECT_BINDABLE_PROPERTY(QDeclarativePositionSource, QDeclarativePosition *, m_position) + + Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(QDeclarativePositionSource, SourceError, m_sourceError, + NoError) + + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePositionSource, PositioningMethods, + m_supportedPositioningMethods, + &QDeclarativePositionSource::supportedMethodsActualComputation) + + Q_OBJECT_COMPUTED_PROPERTY(QDeclarativePositionSource, bool, m_isValid, + &QDeclarativePositionSource::isValidActualComputation) + + quint8 m_singleUpdate : 1; + quint8 m_regularUpdates : 1; + quint8 m_componentComplete : 1; + quint8 m_parametersInitialized : 1; + quint8 m_startRequested : 1; + quint8 m_defaultSourceUsed : 1; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QDeclarativePositionSource) + +#endif diff --git a/src/positioningquick/qdeclarativesatellitesource.cpp b/src/positioningquick/qdeclarativesatellitesource.cpp new file mode 100644 index 0000000..674daa9 --- /dev/null +++ b/src/positioningquick/qdeclarativesatellitesource.cpp @@ -0,0 +1,531 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qdeclarativesatellitesource_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype SatelliteSource + \inqmlmodule QtPositioning + \since 6.5 + \brief The SatelliteSource class provides the satellite information. + + The SatelliteSource class provides information about satellites in use and + satellites in view. This class is a QML representation of + \l QGeoSatelliteInfoSource. + + Like its C++ equivalent, the class supports different plugins. Use the + \l name property to specify the name of the plugin to be used, and provide + \l {PluginParameter}s, if required. If the \l name property is not set, + a default plugin will be used. See \l {Qt Positioning Plugins} for more + information on the available plugins. + + Use the \l valid property to check the SatelliteSource state. + + Use the \l updateInterval property to indicate how often your application + wants to receive the satellite information updates. The \l start(), + \l stop() and \l update() methods can be used to control the operation + of the SatelliteSource, as well as the \l active property, which when set + is equivalent to calling \l start() or \l stop(). + + When the SatelliteSource is active, satellite information updates can + be retrieved using the \l satellitesInView and \l satellitesInUse + properties. + + If an error happens during satellite information updates, use the + \l sourceError property to get the actual error code. + + \section2 Example Usage + + The following example shows a SatelliteSource which is using the + \l {Qt Positioning NMEA plugin}{NMEA} plugin to receive satellite + information updates every second and print the amount of satellites + in view and satellites in use to the console. + + \qml + SatelliteSource { + id: source + name: "nmea" + active: true + updateInterval: 1000 + PluginParameter { name: "nmea.source"; value: "serial:/dev/ttyACM0" } + + onSatellitesInUseChanged: { + console.log("Satellites in use:", source.satellitesInUse.length) + } + onSatellitesInViewChanged: { + console.log("Satellites in view:", source.satellitesInView.length) + } + } + \endqml + + \sa QGeoSatelliteInfoSource, PluginParameter, geoSatelliteInfo +*/ + +QDeclarativeSatelliteSource::QDeclarativeSatelliteSource() + : m_active(0), m_componentComplete(0), m_parametersInitialized(0), + m_startRequested(0), m_defaultSourceUsed(0), m_regularUpdates(0), + m_singleUpdate(0), m_singleUpdateRequested(0) +{ +} + +QDeclarativeSatelliteSource::~QDeclarativeSatelliteSource() = default; + +/*! + \qmlproperty bool SatelliteSource::active + + This property indicates whether the satellite source is active. + Setting this property to \c false equals calling \l stop, and + setting this property to \c true equals calling \l start. + + \sa start, stop, update +*/ +bool QDeclarativeSatelliteSource::isActive() const +{ + return m_active; +} + +/*! + \qmlproperty bool SatelliteSource::valid + \readonly + + This property is \c true if the SatelliteSource object has acquired a valid + backend plugin to provide data, and \c false otherwise. + + Applications should check this property to determine whether providing + satellite information is available and enabled on the runtime platform, + and react accordingly. +*/ +bool QDeclarativeSatelliteSource::isValid() const +{ + return m_source != nullptr; +} + +/*! + \qmlproperty int SatelliteSource::updateInterval + + This property holds the desired interval between updates in milliseconds. +*/ +int QDeclarativeSatelliteSource::updateInterval() const +{ + return m_source ? m_source->updateInterval() : m_updateInterval; +} + +/*! + \qmlproperty enumeration SatelliteSource::sourceError + \readonly + + This property holds the error which last occurred with the backend data + provider. + + \list + \li SatelliteSource.AccessError - The connection setup to the satellite + backend failed because the application lacked the required + privileges. + \li SatelliteSource.ClosedError - The satellite backend closed the + connection, which happens for example in case the user is switching + location services to off. + \li SatelliteSource.NoError - No error has occurred. + \li SatelliteSource.UnknownSourceError - An unidentified error occurred. + \li SatelliteSource.UpdateTimeoutError - The satellite information + could not be retrieved within the specified timeout. + \endlist +*/ +QDeclarativeSatelliteSource::SourceError QDeclarativeSatelliteSource::sourceError() const +{ + return m_error; +} + +/*! + \qmlproperty string SatelliteSource::name + + This property holds the unique internal name for the plugin currently + providing satellite information. + + Setting the property causes the SatelliteSource to use a particular + backend plugin. If the SatelliteSource is active at the time that the name + property is changed, it will become inactive. If the specified backend + cannot be loaded the satellite source will become invalid. + + Changing the name property may cause the \l updateInterval property + to change as well. +*/ +QString QDeclarativeSatelliteSource::name() const +{ + return m_source ? m_source->sourceName() : m_name; +} + +/*! + \qmlproperty list SatelliteSource::parameters + \readonly + \qmldefault + + This property holds the list of plugin parameters. + + \sa PluginParameter +*/ +QQmlListProperty QDeclarativeSatelliteSource::parameters() +{ + return QQmlListProperty(this, nullptr, + parameter_append, + parameter_count, + parameter_at, + parameter_clear); +} + +/*! + \qmlproperty list SatelliteSource::satellitesInUse + \readonly + + This property holds the list of satellites that are currently in use. + These are the satellites that are used to get a "fix" - that + is, those used to determine the current position. +*/ +QList QDeclarativeSatelliteSource::satellitesInUse() const +{ + return m_satellitesInUse; +} + +/*! + \qmlproperty list SatelliteSource::satellitesInView + \readonly + + This property holds the list of satellites that are currently in view. +*/ +QList QDeclarativeSatelliteSource::satellitesInView() const +{ + return m_satellitesInView; +} + +void QDeclarativeSatelliteSource::setUpdateInterval(int updateInterval) +{ + if (m_updateInterval == updateInterval) + return; + + const auto oldInterval = m_updateInterval; + + if (m_source) { + m_source->setUpdateInterval(updateInterval); + // The above call can set some other interval, for example if desired + // updateInterval is less than minimum supported update interval. So + // we need to read the value back explicitly. + m_updateInterval = m_source->updateInterval(); + } else { + m_updateInterval = updateInterval; + } + if (oldInterval != m_updateInterval) + emit updateIntervalChanged(); +} + +void QDeclarativeSatelliteSource::setActive(bool active) +{ + if (active == m_active) + return; + + if (active) + start(); + else + stop(); +} + +void QDeclarativeSatelliteSource::setName(const QString &name) +{ + if ((m_name == name) || (name.isEmpty() && m_defaultSourceUsed)) + return; + + if (m_componentComplete && m_parametersInitialized) { + createSource(name); // it will update name and emit, if needed + } else { + m_name = name; + emit nameChanged(); + } +} + +void QDeclarativeSatelliteSource::componentComplete() +{ + m_componentComplete = true; + m_parametersInitialized = true; + for (QDeclarativePluginParameter *p: std::as_const(m_parameters)) { + if (!p->isInitialized()) { + m_parametersInitialized = false; + connect(p, &QDeclarativePluginParameter::initialized, + this, &QDeclarativeSatelliteSource::onParameterInitialized, + Qt::SingleShotConnection); + } + } + + if (m_parametersInitialized) + createSource(m_name); +} + +/*! + \qmlmethod bool SatelliteSource::setBackendProperty(string name, var value) + + Sets the backend-specific property named \a name to \a value. + Returns true on success, false otherwise, including if called on an + uninitialized SatelliteSource. +*/ +bool QDeclarativeSatelliteSource::setBackendProperty(const QString &name, const QVariant &value) +{ + if (m_source) + return m_source->setBackendProperty(name, value); + return false; +} + +/*! + \qmlmethod var SatelliteSource::backendProperty(string name) + + Returns the value of the backend-specific property named \a name, if + present. Otherwise, including if called on an uninitialized SatelliteSource, + the return value will be invalid. +*/ +QVariant QDeclarativeSatelliteSource::backendProperty(const QString &name) const +{ + return m_source ? m_source->backendProperty(name) : QVariant{}; +} + +/*! + \qmlmethod SatelliteSource::update(int timeout = 0) + + A convenience method to request a single update from the satellite source. + If there is no source available, this method has no effect. + + If the satellite source is not active, it will be activated for as + long as it takes to receive an update, or until the request times + out. The request timeout period is plugin-specific. + + The \a timeout is specified in milliseconds. If the \a timeout is zero + (the default value), it defaults to a reasonable timeout period as + appropriate for the source. + + \sa start, stop, active +*/ +void QDeclarativeSatelliteSource::update(int timeout) +{ + if (m_componentComplete && m_parametersInitialized) { + executeSingleUpdate(timeout); + } else { + m_singleUpdateDesiredTimeout = timeout; + m_singleUpdateRequested = true; + } +} + +/*! + \qmlmethod SatelliteSource::start() + + Requests updates from the satellite source. Uses \l updateInterval if set, + default interval otherwise. If there is no source available, this method + has no effect. + + \sa stop, update, active +*/ +void QDeclarativeSatelliteSource::start() +{ + if (m_componentComplete && m_parametersInitialized) + executeStart(); + else + m_startRequested = true; +} + +/*! + \qmlmethod SatelliteSource::stop() + + Stops updates from the satellite source. If there is no source available or + it is not active, this method has no effect. + + \sa start, update, active +*/ +void QDeclarativeSatelliteSource::stop() +{ + if (m_source) { + m_source->stopUpdates(); + m_regularUpdates = false; + + if (m_active && !m_singleUpdate) { + m_active = false; + emit activeChanged(); + } + } else { + m_startRequested = false; + } +} + +void QDeclarativeSatelliteSource::sourceErrorReceived(const QGeoSatelliteInfoSource::Error error) +{ + const auto oldError = m_error; + m_error = static_cast(error); + if (m_error != oldError) + emit sourceErrorChanged(); + + // if an error occurred during single update, the update is stopped, so we + // need to change the active state. + if (m_singleUpdate) { + m_singleUpdate = false; + if (m_active && !m_regularUpdates) { + m_active = false; + emit activeChanged(); + } + } +} + +void QDeclarativeSatelliteSource::onParameterInitialized() +{ + m_parametersInitialized = true; + for (QDeclarativePluginParameter *p: std::as_const(m_parameters)) { + if (!p->isInitialized()) { + m_parametersInitialized = false; + break; + } + } + + // m_componentComplete == true here + if (m_parametersInitialized) + createSource(m_name); +} + +void QDeclarativeSatelliteSource::satellitesInViewUpdateReceived(const QList &satellites) +{ + m_satellitesInView = satellites; + emit satellitesInViewChanged(); + handleSingleUpdateReceived(); +} + +void QDeclarativeSatelliteSource::satellitesInUseUpdateReceived(const QList &satellites) +{ + m_satellitesInUse = satellites; + emit satellitesInUseChanged(); + handleSingleUpdateReceived(); +} + +QVariantMap QDeclarativeSatelliteSource::parameterMap() const +{ + QVariantMap map; + for (const auto *parameter : std::as_const(m_parameters)) + map.insert(parameter->name(), parameter->value()); + return map; +} + +void QDeclarativeSatelliteSource::createSource(const QString &newName) +{ + if (m_source && m_source->sourceName() == newName) + return; + + const auto oldName = name(); + const bool oldIsValid = isValid(); + const bool oldActive = isActive(); + const auto oldUpdateInterval = updateInterval(); + + if (m_source) { + m_source->disconnect(this); + m_source->stopUpdates(); + m_source.reset(nullptr); + m_active = false; + } + + if (!newName.isEmpty()) { + m_source.reset(QGeoSatelliteInfoSource::createSource(newName, parameterMap(), nullptr)); + m_defaultSourceUsed = false; + } else { + m_source.reset(QGeoSatelliteInfoSource::createDefaultSource(parameterMap(), nullptr)); + m_defaultSourceUsed = true; + } + + if (m_source) { + connect(m_source.get(), &QGeoSatelliteInfoSource::errorOccurred, + this, &QDeclarativeSatelliteSource::sourceErrorReceived); + connect(m_source.get(), &QGeoSatelliteInfoSource::satellitesInViewUpdated, + this, &QDeclarativeSatelliteSource::satellitesInViewUpdateReceived); + connect(m_source.get(), &QGeoSatelliteInfoSource::satellitesInUseUpdated, + this, &QDeclarativeSatelliteSource::satellitesInUseUpdateReceived); + + m_name = m_source->sourceName(); + m_source->setUpdateInterval(m_updateInterval); + m_updateInterval = m_source->updateInterval(); + } else { + m_name = newName; + m_defaultSourceUsed = false; + } + + if (oldName != name()) + emit nameChanged(); + + if (oldIsValid != isValid()) + emit validityChanged(); + + if (oldActive != isActive()) + emit activeChanged(); + + if (oldUpdateInterval != updateInterval()) + emit updateIntervalChanged(); + + if (m_startRequested) { + m_startRequested = false; + executeStart(); + } + if (m_singleUpdateRequested) { + m_singleUpdateRequested = false; + executeSingleUpdate(m_singleUpdateDesiredTimeout); + } +} + +void QDeclarativeSatelliteSource::handleSingleUpdateReceived() +{ + if (m_singleUpdate) { + m_singleUpdate = false; + if (m_active && !m_regularUpdates) { + m_active = false; + emit activeChanged(); + } + } +} + +void QDeclarativeSatelliteSource::executeStart() +{ + if (m_source) { + m_regularUpdates = true; + if (!m_active) { + m_active = true; + emit activeChanged(); + } + m_source->startUpdates(); + } +} + +void QDeclarativeSatelliteSource::executeSingleUpdate(int timeout) +{ + if (m_source) { + m_singleUpdate = true; + if (!m_active) { + m_active = true; + emit activeChanged(); + } + m_source->requestUpdate(timeout); + } +} + +void QDeclarativeSatelliteSource::parameter_append(PluginParameterProperty *prop, + QDeclarativePluginParameter *parameter) +{ + auto *src = static_cast(prop->object); + src->m_parameters.append(parameter); +} + +qsizetype QDeclarativeSatelliteSource::parameter_count(PluginParameterProperty *prop) +{ + return static_cast(prop->object)->m_parameters.size(); +} + +QDeclarativePluginParameter * +QDeclarativeSatelliteSource::parameter_at(PluginParameterProperty *prop, qsizetype index) +{ + return static_cast(prop->object)->m_parameters[index]; +} + +void QDeclarativeSatelliteSource::parameter_clear(PluginParameterProperty *prop) +{ + auto *src = static_cast(prop->object); + src->m_parameters.clear(); +} + +QT_END_NAMESPACE diff --git a/src/positioningquick/qdeclarativesatellitesource_p.h b/src/positioningquick/qdeclarativesatellitesource_p.h new file mode 100644 index 0000000..c4e59f7 --- /dev/null +++ b/src/positioningquick/qdeclarativesatellitesource_p.h @@ -0,0 +1,142 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QDECLARATIVESATELLITESOURCE_H +#define QDECLARATIVESATELLITESOURCE_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include + +#include + +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +class Q_POSITIONINGQUICK_PRIVATE_EXPORT QDeclarativeSatelliteSource : public QObject, public QQmlParserStatus +{ + Q_OBJECT + QML_NAMED_ELEMENT(SatelliteSource) + QML_ADDED_IN_VERSION(6, 5) + + Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged) + Q_PROPERTY(bool valid READ isValid NOTIFY validityChanged) + Q_PROPERTY(int updateInterval READ updateInterval WRITE setUpdateInterval + NOTIFY updateIntervalChanged) + Q_PROPERTY(SourceError sourceError READ sourceError NOTIFY sourceErrorChanged) + Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) + Q_PROPERTY(QQmlListProperty parameters READ parameters) + Q_PROPERTY(QList satellitesInUse READ satellitesInUse + NOTIFY satellitesInUseChanged) + Q_PROPERTY(QList satellitesInView READ satellitesInView + NOTIFY satellitesInViewChanged) + + Q_CLASSINFO("DefaultProperty", "parameters") + Q_INTERFACES(QQmlParserStatus) + +public: + enum SourceError { + AccessError = QGeoSatelliteInfoSource::AccessError, + ClosedError = QGeoSatelliteInfoSource::ClosedError, + NoError = QGeoSatelliteInfoSource::NoError, + UnknownSourceError = QGeoSatelliteInfoSource::UnknownSourceError, + UpdateTimeoutError = QGeoSatelliteInfoSource::UpdateTimeoutError, + }; + Q_ENUM(SourceError) + + QDeclarativeSatelliteSource(); + ~QDeclarativeSatelliteSource(); + + bool isActive() const; + bool isValid() const; + int updateInterval() const; + SourceError sourceError() const; + QString name() const; + QQmlListProperty parameters(); + QList satellitesInUse() const; + QList satellitesInView() const; + + void setUpdateInterval(int updateInterval); + void setActive(bool active); + void setName(const QString &name); + + // virtuals from QQmlParserStatus + void classBegin() override { } + void componentComplete() override; + + Q_INVOKABLE bool setBackendProperty(const QString &name, const QVariant &value); + Q_INVOKABLE QVariant backendProperty(const QString &name) const; + +public Q_SLOTS: + void update(int timeout = 0); + void start(); + void stop(); + +Q_SIGNALS: + void activeChanged(); + void validityChanged(); + void updateIntervalChanged(); + void sourceErrorChanged(); + void nameChanged(); + void satellitesInUseChanged(); + void satellitesInViewChanged(); + +private Q_SLOTS: + void sourceErrorReceived(const QGeoSatelliteInfoSource::Error error); + void onParameterInitialized(); + void satellitesInViewUpdateReceived(const QList &satellites); + void satellitesInUseUpdateReceived(const QList &satellites); + +private: + QVariantMap parameterMap() const; + void createSource(const QString &newName); + void handleSingleUpdateReceived(); + void executeStart(); + void executeSingleUpdate(int timeout); + + using PluginParameterProperty = QQmlListProperty; + static void parameter_append(PluginParameterProperty *prop, + QDeclarativePluginParameter *parameter); + static qsizetype parameter_count(PluginParameterProperty *prop); + static QDeclarativePluginParameter *parameter_at(PluginParameterProperty *prop, + qsizetype index); + static void parameter_clear(PluginParameterProperty *prop); + + std::unique_ptr m_source; + QList m_parameters; + + int m_updateInterval = 0; + SourceError m_error = SourceError::NoError; + QString m_name; + QList m_satellitesInView; + QList m_satellitesInUse; + + int m_singleUpdateDesiredTimeout = 0; + + quint8 m_active : 1; + quint8 m_componentComplete : 1; + quint8 m_parametersInitialized : 1; + quint8 m_startRequested : 1; + quint8 m_defaultSourceUsed : 1; + quint8 m_regularUpdates : 1; + quint8 m_singleUpdate : 1; + quint8 m_singleUpdateRequested : 1; +}; + +QT_END_NAMESPACE + +#endif // QDECLARATIVESATELLITESOURCE_H diff --git a/src/positioningquick/qpositioningquickglobal.h b/src/positioningquick/qpositioningquickglobal.h new file mode 100644 index 0000000..a04bc15 --- /dev/null +++ b/src/positioningquick/qpositioningquickglobal.h @@ -0,0 +1,20 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QPOSITIONINGQUICKGLOBAL_H +#define QPOSITIONINGQUICKGLOBAL_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include + +#endif // QPOSITIONINGQUICKGLOBAL_H diff --git a/src/positioningquick/qpositioningquickglobal_p.h b/src/positioningquick/qpositioningquickglobal_p.h new file mode 100644 index 0000000..6c7db02 --- /dev/null +++ b/src/positioningquick/qpositioningquickglobal_p.h @@ -0,0 +1,26 @@ +// Copyright (C) 2017 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QPOSITIONINGQUICKGLOBAL_P_H +#define QPOSITIONINGQUICKGLOBAL_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qpositioningquickglobal.h" +#include + +QT_BEGIN_NAMESPACE + +void Q_POSITIONINGQUICK_PRIVATE_EXPORT qml_register_types_QtPositioning(); + +QT_END_NAMESPACE + +#endif // QPOSITIONINGQUICKGLOBAL_P_H diff --git a/src/positioningquick/qpositioningquickmodule.cpp b/src/positioningquick/qpositioningquickmodule.cpp new file mode 100644 index 0000000..87e2d3a --- /dev/null +++ b/src/positioningquick/qpositioningquickmodule.cpp @@ -0,0 +1,4 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "moc_qpositioningquickmodule_p.cpp" diff --git a/src/positioningquick/qpositioningquickmodule_p.h b/src/positioningquick/qpositioningquickmodule_p.h new file mode 100644 index 0000000..e2253c7 --- /dev/null +++ b/src/positioningquick/qpositioningquickmodule_p.h @@ -0,0 +1,148 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +#ifndef QT_POSITIONINGQUICKMODULE_P_H +#define QT_POSITIONINGQUICKMODULE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include "qpositioningquickglobal_p.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +struct QGeoCoordinateForeign +{ + Q_GADGET + QML_FOREIGN(QGeoCoordinate) + QML_VALUE_TYPE(geoCoordinate) + QML_STRUCTURED_VALUE + QML_ADDED_IN_VERSION(5, 0) +}; + +struct QGeoAddressForeign +{ + Q_GADGET + QML_FOREIGN(QGeoAddress) + QML_VALUE_TYPE(geoAddress) + QML_STRUCTURED_VALUE + QML_ADDED_IN_VERSION(5, 0) +}; + +struct QGeoRectangleForeign +{ + Q_GADGET + QML_FOREIGN(QGeoRectangle) + QML_VALUE_TYPE(geoRectangle) + QML_STRUCTURED_VALUE + QML_ADDED_IN_VERSION(5, 0) +}; + +struct QGeoCircleForeign +{ + Q_GADGET + QML_FOREIGN(QGeoCircle) + QML_VALUE_TYPE(geoCircle) + QML_STRUCTURED_VALUE + QML_ADDED_IN_VERSION(5, 0) +}; + +struct QGeoPathForeign +{ + Q_GADGET + QML_FOREIGN(QGeoPath) + QML_VALUE_TYPE(geoPath) + QML_STRUCTURED_VALUE + QML_ADDED_IN_VERSION(5, 0) +}; + +struct QGeoPolygonForeign +{ + Q_GADGET + QML_FOREIGN(QGeoPolygon) + QML_VALUE_TYPE(geoPolygon) + QML_STRUCTURED_VALUE + QML_ADDED_IN_VERSION(5, 0) +}; + +struct QGeoLocationForeign +{ + Q_GADGET + QML_FOREIGN(QGeoLocation) + QML_VALUE_TYPE(geoLocation) + QML_STRUCTURED_VALUE + QML_ADDED_IN_VERSION(5, 0) +}; + +struct QGeoShapeForeign +{ + Q_GADGET + QML_FOREIGN(QGeoShape) + QML_VALUE_TYPE(geoShape) + QML_CONSTRUCTIBLE_VALUE + QML_ADDED_IN_VERSION(5, 0) +}; + +struct QGeoCoordinateObjectForeign +{ + Q_GADGET + QML_FOREIGN(QGeoCoordinateObject) + QML_ANONYMOUS + QML_ADDED_IN_VERSION(5, 0) +}; + +struct QGeoPositionInfoForeign +{ + Q_GADGET + QML_FOREIGN(QGeoPositionInfo) + QML_VALUE_TYPE(geoPositionInfo) + QML_STRUCTURED_VALUE + QML_ADDED_IN_VERSION(5, 0) +}; + +struct QGeoSatelliteInfoForeign +{ + Q_GADGET + QML_FOREIGN(QGeoSatelliteInfo) + QML_VALUE_TYPE(geoSatelliteInfo) + QML_ADDED_IN_VERSION(6, 5) +}; + +// To prevent the same QGeoSatelliteInfo type from being exported into qmltypes +// twice for a value type and the enums. See QTBUG-115361. +class QGeoSatelliteInfoDerived : public QGeoSatelliteInfo +{ + Q_GADGET +}; + +namespace QGeoSatelliteInfoForeignNamespace +{ + Q_NAMESPACE + QML_FOREIGN_NAMESPACE(QGeoSatelliteInfoDerived) + QML_NAMED_ELEMENT(GeoSatelliteInfo) + QML_ADDED_IN_VERSION(6, 5) +} + +QT_END_NAMESPACE + +#endif // QT_POSITIONINGQUICKMODULE_P_H diff --git a/src/positioningquick/qquickgeocoordinateanimation.cpp b/src/positioningquick/qquickgeocoordinateanimation.cpp new file mode 100644 index 0000000..cd6ceb9 --- /dev/null +++ b/src/positioningquick/qquickgeocoordinateanimation.cpp @@ -0,0 +1,263 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qquickgeocoordinateanimation_p.h" +#include "qquickgeocoordinateanimation_p_p.h" +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +/*! + \qmltype CoordinateAnimation + \inherits PropertyAnimation + \inqmlmodule QtPositioning + \since 5.3 + + \brief A PropertyAnimation for geo coordinate properties. + + A specialized \l{PropertyAnimation} that defines an animation + between two \l{coordinate}{coordinates}. + + By default, a \l{latitude} of the \l{coordinate} is animated in the direction of shortest + (geodesic) distance between those coordinates. Since CoordinateAnimation uses Mercator + map projection, the \l{latitude} animation is always between -90 and 90 degrees. + The \l{longitude} animation path is not limited and can go over 180 degrees + in both west and east directions. + + The \l{direction} property can be set to specify the direction in which the \l{longitude} + animation should occur. + + \sa {Animation and Transitions in Qt Quick} +*/ + +QVariant q_coordinateInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) +{ + if (from == to) { + if (progress < 0.5) { + return QVariant::fromValue(from); + } else { + return QVariant::fromValue(to); + } + } + + QGeoCoordinate result = QWebMercator::coordinateInterpolation(from, to, progress); + + return QVariant::fromValue(result); +} + +QVariant q_coordinateShortestInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) +{ + const QGeoMercatorCoordinatePrivate* fromMercator = + static_cast(QGeoCoordinatePrivate::get(&from)); + const QGeoMercatorCoordinatePrivate* toMercator = + static_cast(QGeoCoordinatePrivate::get(&to)); + + double toX = toMercator->m_mercatorX; + double toY = toMercator->m_mercatorY; + double fromX = fromMercator->m_mercatorX; + double fromY = fromMercator->m_mercatorY; + double x; + if (0.5 < qAbs(toX - fromX)) { + // handle dateline crossing + double ex = toX; + double sx = fromX; + if (ex < sx) + sx -= 1.0; + else if (sx < ex) + ex -= 1.0; + + x = sx + (ex - sx) * progress; + + if (x < 0.0) + x += 1.0; + + } else { + x = fromX + (toX - fromX) * progress; + } + + double y = fromY + (toY - fromY) * progress; + + QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y)); + result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress); + return QVariant::fromValue(result); +} + +QVariant q_coordinateEastInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) +{ + const QGeoMercatorCoordinatePrivate* fromMercator = + static_cast(QGeoCoordinatePrivate::get(&from)); + const QGeoMercatorCoordinatePrivate* toMercator = + static_cast(QGeoCoordinatePrivate::get(&to)); + + double toX = toMercator->m_mercatorX; + double toY = toMercator->m_mercatorY; + double fromX = fromMercator->m_mercatorX; + double fromY = fromMercator->m_mercatorY; + double diff = toX - fromX; + + while (diff < 0.0) { + toX += 1.0; + diff += 1.0; + } + + double x = fromX + (toX - fromX) * progress; + double y = fromY + (toY - fromY) * progress; + + while (x > 1.0) + x -= 1.0; + + QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y)); + result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress); + + return QVariant::fromValue(result); +} + +QVariant q_coordinateWestInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress) +{ + const QGeoMercatorCoordinatePrivate* fromMercator = + static_cast(QGeoCoordinatePrivate::get(&from)); + const QGeoMercatorCoordinatePrivate* toMercator = + static_cast(QGeoCoordinatePrivate::get(&to)); + + double toX = toMercator->m_mercatorX; + double toY = toMercator->m_mercatorY; + double fromX = fromMercator->m_mercatorX; + double fromY = fromMercator->m_mercatorY; + double diff = toX - fromX; + + while (diff > 0.0) { + toX -= 1.0; + diff -= 1.0; + } + + double x = fromX + (toX - fromX) * progress; + double y = fromY + (toY - fromY) * progress; + + while (x < 0.0) + x += 1.0; + + QGeoCoordinate result = QWebMercator::mercatorToCoord(QDoubleVector2D(x, y)); + result.setAltitude(from.altitude() + (to.altitude() - from.altitude()) * progress); + + return QVariant::fromValue(result); +} + +QQuickGeoCoordinateAnimation::QQuickGeoCoordinateAnimation(QObject *parent) + : QQuickPropertyAnimation(*(new QQuickGeoCoordinateAnimationPrivate), parent) + +{ + Q_D(QQuickGeoCoordinateAnimation); + d->interpolatorType = qMetaTypeId(); + d->defaultToInterpolatorType = true; + d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType); +} + +QQuickGeoCoordinateAnimation::~QQuickGeoCoordinateAnimation() +{ +} + +/*! + \qmlproperty coordinate CoordinateAnimation::from + This property holds the coordinate where the animation should begin. +*/ +QGeoCoordinate QQuickGeoCoordinateAnimation::from() const +{ + Q_D(const QQuickGeoCoordinateAnimation); + return d->from.value(); +} + +void QQuickGeoCoordinateAnimation::setFrom(const QGeoCoordinate &f) +{ + QGeoMercatorCoordinatePrivate *mercator = new QGeoMercatorCoordinatePrivate(); + QDoubleVector2D fromVector = QWebMercator::coordToMercator(f); + mercator->lat = f.latitude(); + mercator->lng = f.longitude(); + mercator->alt = f.altitude(); + mercator->m_mercatorX = fromVector.x(); + mercator->m_mercatorY = fromVector.y(); + QGeoCoordinate from(*mercator); + QQuickPropertyAnimation::setFrom(QVariant::fromValue(from)); +} + +/*! + \qmlproperty coordinate CoordinateAnimation::to + This property holds the coordinate where the animation should end. +*/ +QGeoCoordinate QQuickGeoCoordinateAnimation::to() const +{ + Q_D(const QQuickGeoCoordinateAnimation); + return d->to.value(); +} + +void QQuickGeoCoordinateAnimation::setTo(const QGeoCoordinate &t) +{ + QGeoMercatorCoordinatePrivate *mercator = new QGeoMercatorCoordinatePrivate(); + QDoubleVector2D toVector = QWebMercator::coordToMercator(t); + mercator->lat = t.latitude(); + mercator->lng = t.longitude(); + mercator->alt = t.altitude(); + mercator->m_mercatorX = toVector.x(); + mercator->m_mercatorY = toVector.y(); + QGeoCoordinate to(*mercator); + QQuickPropertyAnimation::setTo(QVariant::fromValue(to)); +} + +/*! + \qmlproperty enumeration CoordinateAnimation::direction + This property holds the direction of the \l{longitude} animation of the \l{coordinate}. + + Possible values are: + + \list + \li CoordinateAnimation.Shortest (default) - the longitude animation goes in the direction + that produces the shortest animation path. + \li CoordinateAnimation.West - the longitude animation always goes into western direction + and may cross the date line. + \li CoordinateAnimation.East - the longitude animation always goes into eastern direction + and may cross the date line. + \endlist + \since 5.5 +*/ + + +QQuickGeoCoordinateAnimation::Direction QQuickGeoCoordinateAnimation::direction() const +{ + Q_D(const QQuickGeoCoordinateAnimation); + return d->m_direction.value(); +} + +void QQuickGeoCoordinateAnimation::setDirection(QQuickGeoCoordinateAnimation::Direction direction) +{ + Q_D( QQuickGeoCoordinateAnimation); + d->m_direction.removeBindingUnlessInWrapper(); + if (d->m_direction.valueBypassingBindings() == direction) + return; + + d->m_direction.setValueBypassingBindings(direction); + switch (direction) { + case West: + d->interpolator = reinterpret_cast(reinterpret_cast(&q_coordinateWestInterpolator)); + break; + case East: + d->interpolator = reinterpret_cast(reinterpret_cast(&q_coordinateEastInterpolator)); + break; + case Shortest: + default: + d->interpolator = reinterpret_cast(reinterpret_cast(&q_coordinateShortestInterpolator)); + break; + } + d->m_direction.notify(); +} + +QBindable QQuickGeoCoordinateAnimation::bindableDirection() +{ + Q_D(QQuickGeoCoordinateAnimation); + return QBindable(&d->m_direction); +} + +QT_END_NAMESPACE + +#include "moc_qquickgeocoordinateanimation_p.cpp" diff --git a/src/positioningquick/qquickgeocoordinateanimation_p.h b/src/positioningquick/qquickgeocoordinateanimation_p.h new file mode 100644 index 0000000..d705fef --- /dev/null +++ b/src/positioningquick/qquickgeocoordinateanimation_p.h @@ -0,0 +1,68 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QQUICKGEOCOORDINATEANIMATION_P_H +#define QQUICKGEOCOORDINATEANIMATION_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QQuickGeoCoordinateAnimationPrivate; + +class Q_POSITIONINGQUICK_PRIVATE_EXPORT QQuickGeoCoordinateAnimation : public QQuickPropertyAnimation +{ + Q_OBJECT + QML_NAMED_ELEMENT(CoordinateAnimation) + QML_ADDED_IN_VERSION(5, 3) + Q_DECLARE_PRIVATE(QQuickGeoCoordinateAnimation) + Q_PROPERTY(QGeoCoordinate from READ from WRITE setFrom) + Q_PROPERTY(QGeoCoordinate to READ to WRITE setTo) + Q_PROPERTY(Direction direction READ direction WRITE setDirection NOTIFY directionChanged + BINDABLE bindableDirection) + +public: + enum Direction { + Shortest, + West, + East + }; + Q_ENUM(Direction) + + QQuickGeoCoordinateAnimation(QObject *parent=0); + ~QQuickGeoCoordinateAnimation(); + + QGeoCoordinate from() const; + void setFrom(const QGeoCoordinate &); + + QGeoCoordinate to() const; + void setTo(const QGeoCoordinate &); + + Direction direction() const; + void setDirection(Direction direction); + QBindable bindableDirection(); + +Q_SIGNALS: + void directionChanged(); +}; + +QVariant Q_POSITIONINGQUICK_PRIVATE_EXPORT q_coordinateInterpolator(const QGeoCoordinate &from, const QGeoCoordinate &to, qreal progress); + +QT_END_NAMESPACE + +QML_DECLARE_TYPE(QQuickGeoCoordinateAnimation) + +#endif // QQUICKCOORDINATEANIMATION_P_H diff --git a/src/positioningquick/qquickgeocoordinateanimation_p_p.h b/src/positioningquick/qquickgeocoordinateanimation_p_p.h new file mode 100644 index 0000000..df06436 --- /dev/null +++ b/src/positioningquick/qquickgeocoordinateanimation_p_p.h @@ -0,0 +1,46 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QQUICKGEOCOORDINATEANIMATION_P_P_H +#define QQUICKGEOCOORDINATEANIMATION_P_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qquickgeocoordinateanimation_p.h" +#include +#include + +QT_BEGIN_NAMESPACE + +class QQuickGeoCoordinateAnimationPrivate : public QQuickPropertyAnimationPrivate +{ + Q_DECLARE_PUBLIC(QQuickGeoCoordinateAnimation) +public: + void setDirection(QQuickGeoCoordinateAnimation::Direction direction) + { + q_func()->setDirection(direction); + } + void directionChanged() + { + Q_EMIT q_func()->directionChanged(); + } + + Q_OBJECT_COMPAT_PROPERTY_WITH_ARGS(QQuickGeoCoordinateAnimationPrivate, + QQuickGeoCoordinateAnimation::Direction, m_direction, + &QQuickGeoCoordinateAnimationPrivate::setDirection, + &QQuickGeoCoordinateAnimationPrivate::directionChanged, + QQuickGeoCoordinateAnimation::Shortest) +}; + +QT_END_NAMESPACE + +#endif // QQUICKGEOCOORDINATEANIMATION_P_P_H diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..800bc26 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from tests.pro. + +if(QT_BUILD_STANDALONE_TESTS) + # Add qt_find_package calls for extra dependencies that need to be found when building + # the standalone tests here. +endif() +qt_build_tests() diff --git a/tests/applications/positioning_backend/CMakeLists.txt b/tests/applications/positioning_backend/CMakeLists.txt new file mode 100644 index 0000000..a1f9ed2 --- /dev/null +++ b/tests/applications/positioning_backend/CMakeLists.txt @@ -0,0 +1,31 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from positioning_backend.pro. + +##################################################################### +## posbackendtesting Binary: +##################################################################### + +qt_internal_add_executable(posbackendtesting + GUI + SOURCES + logwidget.cpp logwidget.h + main.cpp + widget.cpp widget.h widget.ui + LIBRARIES + Qt::Gui + Qt::Positioning + Qt::Widgets + ENABLE_AUTOGEN_TOOLS + uic +) + +#### Keys ignored in scope 1:.:.:positioning_backend.pro:: +# TEMPLATE = "app" + +## Scopes: +##################################################################### + +#### Keys ignored in scope 2:.:.:positioning_backend.pro:WINRT: +# WINRT_MANIFEST.capabilities_device = "location" diff --git a/tests/applications/positioning_backend/logwidget.cpp b/tests/applications/positioning_backend/logwidget.cpp new file mode 100644 index 0000000..9e450d1 --- /dev/null +++ b/tests/applications/positioning_backend/logwidget.cpp @@ -0,0 +1,21 @@ +// Copyright (C) 2018 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include "logwidget.h" +#include + +LogWidget::LogWidget(QWidget *parent) : QWidget(parent) +{ + QVBoxLayout *verticalLayout = new QVBoxLayout(this); + verticalLayout->setSpacing(6); + verticalLayout->setContentsMargins(11, 11, 11, 11); + verticalLayout->setObjectName(QString::fromUtf8("verticalLayout")); + + editor = new QPlainTextEdit(this); + verticalLayout->addWidget(editor); +} + +void LogWidget::appendLog(const QString &line) +{ + editor->appendPlainText(line); +} diff --git a/tests/applications/positioning_backend/logwidget.h b/tests/applications/positioning_backend/logwidget.h new file mode 100644 index 0000000..ad6b62d --- /dev/null +++ b/tests/applications/positioning_backend/logwidget.h @@ -0,0 +1,22 @@ +// Copyright (C) 2018 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef LOGWIDGET_H +#define LOGWIDGET_H + +#include +#include + +class LogWidget : public QWidget +{ + Q_OBJECT +public: + explicit LogWidget(QWidget *parent = nullptr); + + void appendLog(const QString &line); + +private: + QPlainTextEdit *editor; +}; + +#endif // LOGWIDGET_H diff --git a/tests/applications/positioning_backend/main.cpp b/tests/applications/positioning_backend/main.cpp new file mode 100644 index 0000000..c7cef43 --- /dev/null +++ b/tests/applications/positioning_backend/main.cpp @@ -0,0 +1,29 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#include "widget.h" +#include "logwidget.h" +#include + +#include +#include +#include + +int main(int argc, char *argv[]) +{ + //QLoggingCategory::setFilterRules("qt.positioning.*=true"); + QApplication a(argc, argv); + + LogWidget *log = new LogWidget; + Widget *w1 = new Widget(log); + Widget *w2 = new Widget(log); + + QTabWidget tabWidget; + tabWidget.setTabPosition(QTabWidget::South); + + tabWidget.addTab(w1, "Instance 1"); + tabWidget.addTab(w2, "Instance 2"); + tabWidget.addTab(log, "Logs"); + + tabWidget.show(); + return a.exec(); +} diff --git a/tests/applications/positioning_backend/widget.cpp b/tests/applications/positioning_backend/widget.cpp new file mode 100644 index 0000000..c516aa1 --- /dev/null +++ b/tests/applications/positioning_backend/widget.cpp @@ -0,0 +1,163 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#include "widget.h" +#include "ui_widget.h" +#include +#include + +Widget::Widget(LogWidget *logWidget, QWidget *parent) : + QWidget(parent), + log(logWidget), + ui(new Ui::Widget) +{ + ui->setupUi(this); + qDebug() << "Available:" << QGeoPositionInfoSource::availableSources(); + m_posSource = QGeoPositionInfoSource::createDefaultSource(this); + if (!m_posSource) + qFatal("No Position Source created!"); + connect(m_posSource, SIGNAL(positionUpdated(QGeoPositionInfo)), + this, SLOT(positionUpdated(QGeoPositionInfo))); + + connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), + this, SLOT(setInterval(int))); + + ui->groupBox->setLayout(ui->gridLayout); + ui->horizontalSlider->setMinimum(m_posSource->minimumUpdateInterval()); + ui->labelTimeOut->setVisible(false); + + connect(m_posSource, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error)), + this, SLOT(errorChanged(QGeoPositionInfoSource::Error))); + connect(m_posSource, &QGeoPositionInfoSource::supportedPositioningMethodsChanged, + this, [this]() { + auto methods = m_posSource->supportedPositioningMethods(); + const QString status = QStringLiteral("Satellite: %1 ").arg(bool(methods & QGeoPositionInfoSource::SatellitePositioningMethods)) + + QStringLiteral("Non-Satellite: %1").arg(bool(methods & QGeoPositionInfoSource::NonSatellitePositioningMethods)); + + qDebug() << "Available Positioning Methods Changed" << status; + log->appendLog(status); + }); +} + +void Widget::positionUpdated(QGeoPositionInfo gpsPos) +{ + QGeoCoordinate coord = gpsPos.coordinate(); + ui->labelLatitude->setText(QString::number(coord.latitude())); + ui->labelLongitude->setText(QString::number(coord.longitude())); + ui->labelAltitude->setText(QString::number(coord.altitude())); + ui->labelTimeStamp->setText(gpsPos.timestamp().toString()); + if (gpsPos.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) + ui->labelHAccuracy->setText(QString::number(gpsPos.attribute(QGeoPositionInfo::HorizontalAccuracy))); + else + ui->labelHAccuracy->setText(QStringLiteral("N/A")); + + if (gpsPos.hasAttribute(QGeoPositionInfo::VerticalAccuracy)) + ui->labelVAccuracy->setText(QString::number(gpsPos.attribute(QGeoPositionInfo::VerticalAccuracy))); + else + ui->labelVAccuracy->setText(QStringLiteral("N/A")); + + if (gpsPos.hasAttribute(QGeoPositionInfo::Direction)) + ui->labelDirection->setText(QString::number(gpsPos.attribute(QGeoPositionInfo::Direction))); + else + ui->labelDirection->setText(QStringLiteral("N/A")); + + if (gpsPos.hasAttribute(QGeoPositionInfo::GroundSpeed)) + ui->labelSpeed->setText(QString::number(gpsPos.attribute(QGeoPositionInfo::GroundSpeed))); + else + ui->labelSpeed->setText(QStringLiteral("N/A")); + + log->appendLog(coord.toString()); +} + +void Widget::positionTimedOut() +{ + ui->labelTimeOut->setVisible(true); +} + +void Widget::errorChanged(QGeoPositionInfoSource::Error err) +{ + if (err == QGeoPositionInfoSource::UpdateTimeoutError) { + // handle timeout + positionTimedOut(); + } else { + // handle other errors + ui->labelErrorState->setText(QString::number(err)); + m_posSource->stopUpdates(); + ui->checkBox->setChecked(false); + } +} + +Widget::~Widget() +{ + delete ui; +} + +void Widget::setInterval(int msec) +{ + m_posSource->setUpdateInterval(msec); +} + +void Widget::on_buttonRetrieve_clicked() +{ + // Requesting current position for _one_ time + m_posSource->requestUpdate(10000); +} + +void Widget::on_buttonStart_clicked() +{ + // Either start or stop the current position info source + bool running = ui->checkBox->isChecked(); + if (running) { + ui->checkBox->setChecked(false); + m_posSource->stopUpdates(); + } else { + ui->checkBox->setChecked(true); + m_posSource->startUpdates(); + } +} + +void Widget::on_radioButton_clicked() +{ + m_posSource->setPreferredPositioningMethods(QGeoPositionInfoSource::NoPositioningMethods); +} + +void Widget::on_radioButton_2_clicked() +{ + m_posSource->setPreferredPositioningMethods(QGeoPositionInfoSource::SatellitePositioningMethods); +} + +void Widget::on_radioButton_3_clicked() +{ + m_posSource->setPreferredPositioningMethods(QGeoPositionInfoSource::NonSatellitePositioningMethods); +} + +void Widget::on_radioButton_4_clicked() +{ + m_posSource->setPreferredPositioningMethods(QGeoPositionInfoSource::AllPositioningMethods); +} + +void Widget::on_buttonUpdateSupported_clicked() +{ + QGeoPositionInfoSource::PositioningMethods m = m_posSource->supportedPositioningMethods(); + QString text; + switch (m) { + case QGeoPositionInfoSource::NoPositioningMethods: + text = QStringLiteral("None"); + break; + case QGeoPositionInfoSource::SatellitePositioningMethods: + text = QStringLiteral("Satellite"); + break; + case QGeoPositionInfoSource::NonSatellitePositioningMethods: + text = QStringLiteral("Non Satellite"); + break; + case QGeoPositionInfoSource::AllPositioningMethods: + text = QStringLiteral("All"); + break; + } + + ui->labelSupported->setText(text); +} + +void Widget::on_buttonResetError_clicked() +{ + ui->labelErrorState->setText(QStringLiteral("N/A")); +} diff --git a/tests/applications/positioning_backend/widget.h b/tests/applications/positioning_backend/widget.h new file mode 100644 index 0000000..c088033 --- /dev/null +++ b/tests/applications/positioning_backend/widget.h @@ -0,0 +1,45 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#ifndef WIDGET_H +#define WIDGET_H + +#include "logwidget.h" + +#include +#include + +namespace Ui { + class Widget; +} + +class Widget : public QWidget +{ + Q_OBJECT + +public: + explicit Widget(LogWidget *log, QWidget *parent = nullptr); + ~Widget(); + +public slots: + void positionUpdated(QGeoPositionInfo gpsPos); + void setInterval(int msec); + void positionTimedOut(); + void errorChanged(QGeoPositionInfoSource::Error err); +private slots: + void on_buttonRetrieve_clicked(); + void on_buttonStart_clicked(); + void on_radioButton_2_clicked(); + void on_radioButton_clicked(); + void on_radioButton_3_clicked(); + void on_radioButton_4_clicked(); + + void on_buttonUpdateSupported_clicked(); + void on_buttonResetError_clicked(); + +private: + LogWidget *log = nullptr; + Ui::Widget *ui; + QGeoPositionInfoSource *m_posSource; +}; + +#endif // WIDGET_H diff --git a/tests/applications/positioning_backend/widget.ui b/tests/applications/positioning_backend/widget.ui new file mode 100644 index 0000000..9cb1566 --- /dev/null +++ b/tests/applications/positioning_backend/widget.ui @@ -0,0 +1,334 @@ + + + Widget + + + + 0 + 0 + 276 + 467 + + + + Widget + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + Latitude: + + + + + + + N/A + + + + + + + Longitude: + + + + + + + N/A + + + + + + + Altitude: + + + + + + + N/A + + + + + + + TimeStamp: + + + + + + + N/A + + + + + + + Horizontal Accuracy: + + + + + + + N/A + + + + + + + Vertical Accuracy: + + + + + + + N/A + + + + + + + TimeOut: + + + + + + + true + + + !!!!!TimeOut!!!!! + + + + + + + Supported Methods: + + + + + + + Error State: + + + + + + + + + N/A + + + + + + + Reset + + + + + + + + + + + N/A + + + + + + + Update + + + + + + + + + Direction: + + + + + + + N/A + + + + + + + Speed: + + + + + + + N/A + + + + + + + + + Method + + + + + 43 + 21 + 254 + 71 + + + + + + + None + + + + + + + Satelite + + + true + + + + + + + Non-Satelite + + + + + + + All + + + + + + + + + + + + + Interval: + + + + + + + 50 + + + 10000 + + + Qt::Horizontal + + + + + + + 0 + + + + + + + + + false + + + Running + + + + + + + + + Start/Stop + + + + + + + Retrieve + + + + + + + + + + + + horizontalSlider + valueChanged(int) + labelInterval + setNum(int) + + + 217 + 137 + + + 386 + 138 + + + + + diff --git a/tests/auto/CMakeLists.txt b/tests/auto/CMakeLists.txt new file mode 100644 index 0000000..701c2a8 --- /dev/null +++ b/tests/auto/CMakeLists.txt @@ -0,0 +1,41 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from auto.pro. + +add_subdirectory(doublevectors) +add_subdirectory(qgeoaddress) +add_subdirectory(qgeoshape) +add_subdirectory(qgeorectangle) +add_subdirectory(qgeocircle) +add_subdirectory(qgeopath) +add_subdirectory(qgeopolygon) +add_subdirectory(qgeocoordinate) +add_subdirectory(qgeocoordinateobject) +add_subdirectory(qgeolocation) +add_subdirectory(qgeopositioninfo) +add_subdirectory(qgeosatelliteinfo) +add_subdirectory(qgeosatelliteinfosource) +add_subdirectory(qnmeasatelliteinfosource) +add_subdirectory(qwebmercator) +add_subdirectory(cmake) +if (QT6_IS_SHARED_LIBS_BUILD) + add_subdirectory(positionplugin) + add_subdirectory(positionplugintest) + add_subdirectory(qgeoareamonitor) + add_subdirectory(qgeopositioninfosource) + add_subdirectory(qnmeapositioninfosource) +endif() +if(TARGET Qt::Quick) + add_subdirectory(qdeclarativegeolocation) + add_subdirectory(qdeclarativeposition) + add_subdirectory(qquickgeocoordinateanimation) + if (QT6_IS_SHARED_LIBS_BUILD) + add_subdirectory(dummypositionplugin) + add_subdirectory(satellitesourceplugin) + add_subdirectory(declarative_positioning_core) + add_subdirectory(qdeclarativepositionsource) + add_subdirectory(declarative_geolocation) + add_subdirectory(declarative_satellitesource) + endif() +endif() diff --git a/tests/auto/bic/data/QtPositioning.5.10.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtPositioning.5.10.0.linux-gcc-amd64.txt new file mode 100644 index 0000000..cd57ca0 --- /dev/null +++ b/tests/auto/bic/data/QtPositioning.5.10.0.linux-gcc-amd64.txt @@ -0,0 +1,4773 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7f13e8ed68a0) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7f13e8fad060) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7f13e8fad2a0) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7f13e8fad4e0) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7f13e8fad720) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7f13e8fad8a0) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7f13e8fadc60) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7f13e6c69420) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7f13e6c694e0) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7f13e6c69840) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7f13e6c69900) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7f13e6c699c0) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7f13e6c69a80) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7f13e6c69d20) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7f13e6c69f00) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f13e6cdb3c0) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f13e6cdb420) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f13e6d4f0c0) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f13e6d4f120) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f13e6cac208) 0 empty + std::input_iterator_tag (0x0x7f13e6d4f180) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f13e6cac270) 0 empty + std::forward_iterator_tag (0x0x7f13e6cac2d8) 0 empty + std::input_iterator_tag (0x0x7f13e6d4f1e0) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f13e6cac340) 0 empty + std::bidirectional_iterator_tag (0x0x7f13e6cac3a8) 0 empty + std::forward_iterator_tag (0x0x7f13e6cac410) 0 empty + std::input_iterator_tag (0x0x7f13e6d4f240) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7f13e6d4fea0) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7f13e6d4ff00) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7f13e6d4ff60) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7f13e6a0b000) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7f13e6a0b060) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7f13e6a0bb40) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f13e6a0bd80) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f13e6a0be40) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f13e6a0bea0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f13e6a0bf60) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f13e6abf000) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f13e6abf480) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f13e6abf4e0) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7f13e6abf540) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7f13e6cac958) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7f13e6abf5a0) 0 nearly-empty + primary-for std::bad_exception (0x0x7f13e6cac958) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7f13e6abf600) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7f13e6abf660) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16u) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7f13e6cacb60) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7f13e6abfa80) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f13e6cacb60) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7f13e6cacbc8) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16u) + std::bad_alloc (0x0x7f13e6cacc30) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7f13e6cacbc8) + std::exception (0x0x7f13e6abfae0) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f13e6cacc30) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f13e6abfb40) 0 empty + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7f13e6839780) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f13e663c480) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f13e663c4e0) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7f13e66e13c0) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7f13e66e1420) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f13e66e14e0) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f13e66e1540) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f13e66e15a0) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f13e66e1600) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f13e66e1720) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f13e66e1780) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f13e66e1ba0) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f13e66e1c00) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7f13e6219420) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7f13e6219480) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f13e62d3420) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f13e608a240) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f13e623d9c0) 0 + std::iterator (0x0x7f13e608a300) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f13e623da28) 0 + std::_Bit_iterator_base (0x0x7f13e623da90) 0 + std::iterator (0x0x7f13e608a360) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f13e623daf8) 0 + std::_Bit_iterator_base (0x0x7f13e623db60) 0 + std::iterator (0x0x7f13e608a3c0) 0 empty + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7f13e5e9a1e0) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7f13e5e9af60) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7f13e5e9af00) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7f13e5c01f00) 0 + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f13e4bcea20) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f13e4bcea80) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f13e490c540) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f13e490c5a0) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f13e490c600) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f13e490c660) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f13e490c900) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7f13e490ce40) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7f13e4907888) 0 + std::__atomic_flag_base (0x0x7f13e490cea0) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f13e4584000) 0 + QAtomicInteger (0x0x7f13e4584068) 0 + QBasicAtomicInteger (0x0x7f13e44b5600) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f13e435eba0) 0 empty + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f13e417cc00) 0 + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f13e417cd20) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f13e4362a90) 0 + QGenericArgument (0x0x7f13e417cd80) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f13e417cf00) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f13e3e1f000) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f13e3ea1060) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f13e3ea10c0) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f13e3ea1360) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f13e3ea13c0) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7f13e3ea1720) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f13e3ea1780) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7f13e3ea17e0) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f13e3ea1840) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f13e3ea18a0) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7f13e3ea1c60) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7f13e3c47000) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16u) + std::exception (0x0x7f13e3ea1d20) 0 nearly-empty + primary-for std::logic_error (0x0x7f13e3c47000) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7f13e3c47068) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16u) + std::logic_error (0x0x7f13e3c470d0) 0 + primary-for std::domain_error (0x0x7f13e3c47068) + std::exception (0x0x7f13e3ea1d80) 0 nearly-empty + primary-for std::logic_error (0x0x7f13e3c470d0) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7f13e3c47138) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16u) + std::logic_error (0x0x7f13e3c471a0) 0 + primary-for std::invalid_argument (0x0x7f13e3c47138) + std::exception (0x0x7f13e3ea1de0) 0 nearly-empty + primary-for std::logic_error (0x0x7f13e3c471a0) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7f13e3c47208) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16u) + std::logic_error (0x0x7f13e3c47270) 0 + primary-for std::length_error (0x0x7f13e3c47208) + std::exception (0x0x7f13e3ea1e40) 0 nearly-empty + primary-for std::logic_error (0x0x7f13e3c47270) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7f13e3c472d8) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16u) + std::logic_error (0x0x7f13e3c47340) 0 + primary-for std::out_of_range (0x0x7f13e3c472d8) + std::exception (0x0x7f13e3ea1ea0) 0 nearly-empty + primary-for std::logic_error (0x0x7f13e3c47340) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7f13e3c473a8) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16u) + std::exception (0x0x7f13e3ea1f00) 0 nearly-empty + primary-for std::runtime_error (0x0x7f13e3c473a8) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7f13e3c47410) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16u) + std::runtime_error (0x0x7f13e3c47478) 0 + primary-for std::range_error (0x0x7f13e3c47410) + std::exception (0x0x7f13e3ea1f60) 0 nearly-empty + primary-for std::runtime_error (0x0x7f13e3c47478) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7f13e3c474e0) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16u) + std::runtime_error (0x0x7f13e3c47548) 0 + primary-for std::overflow_error (0x0x7f13e3c474e0) + std::exception (0x0x7f13e3c65000) 0 nearly-empty + primary-for std::runtime_error (0x0x7f13e3c47548) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7f13e3c475b0) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16u) + std::runtime_error (0x0x7f13e3c47618) 0 + primary-for std::underflow_error (0x0x7f13e3c475b0) + std::exception (0x0x7f13e3c65060) 0 nearly-empty + primary-for std::runtime_error (0x0x7f13e3c47618) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7f13e3c651e0) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16u) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7f13e3c65420) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7f13e3c655a0) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7f13e3c47af8) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16u) + std::runtime_error (0x0x7f13e3c47b60) 0 + primary-for std::system_error (0x0x7f13e3c47af8) + std::exception (0x0x7f13e3c657e0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f13e3c47b60) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7f13e3ccc750) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16u) + std::system_error (0x0x7f13e3ccc7b8) 0 + primary-for std::ios_base::failure (0x0x7f13e3ccc750) + std::runtime_error (0x0x7f13e3ccc820) 0 + primary-for std::system_error (0x0x7f13e3ccc7b8) + std::exception (0x0x7f13e3c65ae0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f13e3ccc820) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f13e3c65b40) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f13e3c65ba0) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f13e3c65c00) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7f13e3c65a80) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7f13e3da43c0) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f13e3da4a80) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7f13e399b0d0 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f13e399b1a0 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7f13e399b548 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f13e399b618 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f13e3950300) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f13e3950360) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f13e36d76c0) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f13e36d7a20) 0 + +Class QStringView + size=16 align=8 + base size=16 base align=8 +QStringView (0x0x7f13e36d7ea0) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f13e340ad20) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f13e34983c0) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f13e3498360) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f13e323c480) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f13e2fec0c0) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7f13e2feccc0) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7f13e2fecd20) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f13e2fecd80) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7f13e2dde180) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7f13e2dde1e0) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7f13e2df4068) 0 empty + QListData::NotIndirectLayout (0x0x7f13e2dde240) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7f13e2e75620) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f13e2dde2a0) 0 empty + QListData::NotIndirectLayout (0x0x7f13e2dde300) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7f13e2df40d0) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f13e2dde360) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f13e2dde3c0) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f13e2dde120) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f13e2dde840) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f13e2c21a80) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f13e2c21a20) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f13e2c22af8) 0 + QList (0x0x7f13e2c22b60) 0 + QListSpecialMethods (0x0x7f13e2c21c60) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f13e2cbe0c0) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f13e2cbeba0) 0 + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7f13e2a9b240) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7f13e2a9b3c0) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7f13e2a9b480) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7f13e2d61340) 0 + std::__uses_alloc_base (0x0x7f13e2a9b420) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7f13e2bae4e0) 0 empty + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f13e2bae720) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f13e2bae7e0) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f13e2bae900) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f13e2baea80) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f13e2baeea0) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7f13e2906000) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f13e2906960) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f13e2906d80) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f13e25e30c0) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7f13e23f6900) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7f13e2557780) 0 empty + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7f13e25577e0) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f13e25579c0) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7f13e2557960) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7f13e221ec60) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7f13e221ecc0) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f13e221ed80) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7f13e224a680) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7f13e221ed20) 0 + primary-for QAbstractAnimation (0x0x7f13e224a680) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f13e221ee40) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7f13e224a6e8) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7f13e221ede0) 0 + primary-for QAnimationDriver (0x0x7f13e224a6e8) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f13e221ef00) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7f13e224a750) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7f13e221eea0) 0 + primary-for QEventLoop (0x0x7f13e224a750) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f13e22a8120) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f13e22a81e0) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f13e22a8240) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7f13e224a888) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7f13e22a8180) 0 + primary-for QAbstractEventDispatcher (0x0x7f13e224a888) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7f13e22a84e0) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16u) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7f13e224aa90) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16u) + std::exception (0x0x7f13e22a8540) 0 nearly-empty + primary-for std::bad_cast (0x0x7f13e224aa90) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7f13e224aaf8) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16u) + std::exception (0x0x7f13e22a85a0) 0 nearly-empty + primary-for std::bad_typeid (0x0x7f13e224aaf8) + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7f13e1fa4d68) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16u) + std::exception (0x0x7f13e206c660) 0 nearly-empty + primary-for std::bad_function_call (0x0x7f13e1fa4d68) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7f13e206c720) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7f13e206c780) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7f13e206c8a0) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f13e206cd80) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f13e2121300) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f13e21216c0) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7f13e2121660) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f13e2121720) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f13e1f5a000) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f13e1f5a0c0) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f13e1f5a060) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f13e1f5a120) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f13e2121f60) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f13e1bfdc00) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f13e1ca32a0) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f13e1ca3240) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f13e1ca3360) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f13e1ca3300) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f13e19bf660) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f13e19bfd20) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f13e1b97480) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7f13e1b88af8) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7f13e1b97420) 0 + primary-for QAbstractItemModel (0x0x7f13e1b88af8) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f13e1b977e0) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractTableModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7f13e1b88d00) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7f13e1b88d68) 0 + primary-for QAbstractTableModel (0x0x7f13e1b88d00) + QObject (0x0x7f13e1b97780) 0 + primary-for QAbstractItemModel (0x0x7f13e1b88d68) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f13e1b978a0) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractListModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7f13e1b88dd0) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7f13e1b88e38) 0 + primary-for QAbstractListModel (0x0x7f13e1b88dd0) + QObject (0x0x7f13e1b97840) 0 + primary-for QAbstractItemModel (0x0x7f13e1b88e38) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f13e1b97b40) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f13e1b97c00) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7f13e1b88f70) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7f13e189e000) 0 + primary-for QAbstractProxyModel (0x0x7f13e1b88f70) + QObject (0x0x7f13e1b97ba0) 0 + primary-for QAbstractItemModel (0x0x7f13e189e000) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f13e1b97cc0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7f13e189e068) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7f13e1b97c60) 0 + primary-for QAbstractState (0x0x7f13e189e068) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f13e1b97d80) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7f13e189e0d0) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7f13e1b97d20) 0 + primary-for QAbstractTransition (0x0x7f13e189e0d0) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f13e1b97e40) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7f13e189e138) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7f13e189e1a0) 0 + primary-for QAnimationGroup (0x0x7f13e189e138) + QObject (0x0x7f13e1b97de0) 0 + primary-for QAbstractAnimation (0x0x7f13e189e1a0) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f13e190bba0) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f13e190be40) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f13e190bf00) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f13e15a2240) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7f13e189e820) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7f13e15a21e0) 0 + primary-for QIODevice (0x0x7f13e189e820) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f13e15a2480) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7f13e189e958) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7f13e189e9c0) 0 + primary-for QBuffer (0x0x7f13e189e958) + QObject (0x0x7f13e15a2420) 0 + primary-for QIODevice (0x0x7f13e189e9c0) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f13e15a2540) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f13e15a24e0) 0 + +Class QStaticByteArrayMatcherBase::Skiptable + size=256 align=1 + base size=256 base align=1 +QStaticByteArrayMatcherBase::Skiptable (0x0x7f13e15a2660) 0 + +Class QStaticByteArrayMatcherBase + size=256 align=16 + base size=256 base align=16 +QStaticByteArrayMatcherBase (0x0x7f13e15a2600) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f13e15a2840) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f13e15a2a20) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f13e173d060) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f13e173d120) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f13e13bb120) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7f13e13bb5a0) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7f13e13a3ea0) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7f13e13bb600) 0 + primary-for QTimerEvent (0x0x7f13e13a3ea0) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7f13e13a3f08) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7f13e13bb660) 0 + primary-for QChildEvent (0x0x7f13e13a3f08) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7f13e142d478) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7f13e13bbb40) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f13e142d478) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7f13e142d4e0) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7f13e13bbba0) 0 + primary-for QDeferredDeleteEvent (0x0x7f13e142d4e0) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f13e13bbc60) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7f13e142d548) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7f13e13bbc00) 0 + primary-for QCoreApplication (0x0x7f13e142d548) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f13e13bbcc0) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f13e13bbd20) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f13e1493360) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f13e14933c0) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7f13e1493480) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f13e1493960) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f13e1493c00) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7f13e11763c0) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7f13e1176420) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f13e1176360) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f13e1225540) 0 + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7f13e1225a20) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7f13e13499c0) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f13e1349c60) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f13e1349ea0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f13e107f060) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7f13e107f5a0) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f13e107f540) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f13e0de5a80) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f13e0de5b40) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f13e0eb6cc0) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7f13e0ed1410) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7f13e0ed1478) 0 + primary-for QFileDevice (0x0x7f13e0ed1410) + QObject (0x0x7f13e0eb6c60) 0 + primary-for QIODevice (0x0x7f13e0ed1478) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f13e0eb6f00) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7f13e0ed15b0) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7f13e0ed1618) 0 + primary-for QFile (0x0x7f13e0ed15b0) + QIODevice (0x0x7f13e0ed1680) 0 + primary-for QFileDevice (0x0x7f13e0ed1618) + QObject (0x0x7f13e0eb6ea0) 0 + primary-for QIODevice (0x0x7f13e0ed1680) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f13e0f3f120) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f13e0f3f540) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f13e0f3ff00) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f13e0c33180) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f13e0cea5a0) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7f13e0ce28f0) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7f13e0ce2958) 0 + primary-for QEventTransition (0x0x7f13e0ce28f0) + QObject (0x0x7f13e0cea540) 0 + primary-for QAbstractTransition (0x0x7f13e0ce2958) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7f13e0ce29c0) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7f13e0cea600) 0 nearly-empty + primary-for QException (0x0x7f13e0ce29c0) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7f13e0ce2a28) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7f13e0ce2a90) 0 nearly-empty + primary-for QUnhandledException (0x0x7f13e0ce2a28) + std::exception (0x0x7f13e0cea660) 0 nearly-empty + primary-for QException (0x0x7f13e0ce2a90) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f13e0cea6c0) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f13e0cea780) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f13e0cea7e0) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f13e0cea900) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7f13e0ce2af8) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7f13e0cea8a0) 0 + primary-for QFileSelector (0x0x7f13e0ce2af8) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f13e0cea9c0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7f13e0ce2b60) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7f13e0cea960) 0 + primary-for QFileSystemWatcher (0x0x7f13e0ce2b60) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f13e0ceaa80) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7f13e0ce2bc8) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7f13e0ce2c30) 0 + primary-for QFinalState (0x0x7f13e0ce2bc8) + QObject (0x0x7f13e0ceaa20) 0 + primary-for QAbstractState (0x0x7f13e0ce2c30) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f13e0ceaae0) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f13e0ceab40) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f13e0ce2d68) 0 + QBasicMutex (0x0x7f13e0cead20) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f13e0cead80) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f13e0ceade0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f13e0ceae40) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7f13e0ceaf60) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7f13e0a6d7e0) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f13e0b1f000) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 0u +48 0u +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7f13e0a72ea0) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7f13e0a6df60) 0 + primary-for QFutureWatcherBase (0x0x7f13e0a72ea0) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f13e0b1f600) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7f13e0b317b8) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7f13e0b31820) 0 + primary-for QHistoryState (0x0x7f13e0b317b8) + QObject (0x0x7f13e0b1f5a0) 0 + primary-for QAbstractState (0x0x7f13e0b31820) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f13e0b1f6c0) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7f13e0b31888) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7f13e0b318f0) 0 + primary-for QIdentityProxyModel (0x0x7f13e0b31888) + QAbstractItemModel (0x0x7f13e0b31958) 0 + primary-for QAbstractProxyModel (0x0x7f13e0b318f0) + QObject (0x0x7f13e0b1f660) 0 + primary-for QAbstractItemModel (0x0x7f13e0b31958) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f13e0b1f720) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f13e0b1fde0) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7f13e07ce1a0) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7f13e0b1fd80) 0 + primary-for QItemSelectionModel (0x0x7f13e07ce1a0) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f13e07ce3a8) 0 + QList (0x0x7f13e07ce410) 0 + QListSpecialMethods (0x0x7f13e0817120) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f13e0817600) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f13e05b3d20) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7f13e061c2a0) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7f13e061c300) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f13e061c4e0) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f13e061c540) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f13e061c480) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f13e06de780) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f13e06de7e0) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f13e06dee40) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f13e06deea0) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f13e06dede0) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f13e041f180) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7f13e03e5750) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7f13e041f120) 0 + primary-for QLibrary (0x0x7f13e03e5750) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7f13e041f840) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7f13e041f360) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f13e041fd20) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f13e041fd80) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f13e04f6060) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f13e04f6300) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f13e04f6c60) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7f13e01b2600) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f13e01b2960) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7f13e01b2ae0) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f13e01b2a80) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f13e01b2c60) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7f13e01b2f00) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f13dff3c5a0) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f13dff3c600) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f13dff3cc00) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f13dff3cf00) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f13dff3cf60) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f13dfff32a0) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7f13dff5e9c0) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7f13dfff3240) 0 + primary-for QMimeData (0x0x7f13dff5e9c0) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f13dfff3300) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f13dfff3600) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f13dfff36c0) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7f13dff5ebc8) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7f13dfff3660) 0 + primary-for QObjectCleanupHandler (0x0x7f13dff5ebc8) + +Class QOperatingSystemVersion + size=16 align=4 + base size=16 base align=4 +QOperatingSystemVersion (0x0x7f13dfff3720) 0 + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f13dfff3ea0) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7f13e005b2d8) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7f13e005b340) 0 + primary-for QParallelAnimationGroup (0x0x7f13e005b2d8) + QAbstractAnimation (0x0x7f13e005b3a8) 0 + primary-for QAnimationGroup (0x0x7f13e005b340) + QObject (0x0x7f13dfff3e40) 0 + primary-for QAbstractAnimation (0x0x7f13e005b3a8) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f13dfff3f60) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7f13e005b410) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7f13e005b478) 0 + primary-for QPauseAnimation (0x0x7f13e005b410) + QObject (0x0x7f13dfff3f00) 0 + primary-for QAbstractAnimation (0x0x7f13e005b478) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f13e008f180) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f13e008f480) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7f13e005b680) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7f13e008f420) 0 + primary-for QPluginLoader (0x0x7f13e005b680) + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f13e008f4e0) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f13e008fba0) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7f13e005bd00) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7f13e005bd68) 0 + primary-for QProcess (0x0x7f13e005bd00) + QObject (0x0x7f13e008fb40) 0 + primary-for QIODevice (0x0x7f13e005bd68) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f13e008fc60) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7f13e005bdd0) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7f13e005be38) 0 + primary-for QVariantAnimation (0x0x7f13e005bdd0) + QObject (0x0x7f13e008fc00) 0 + primary-for QAbstractAnimation (0x0x7f13e005be38) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f13e008fd20) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7f13e005bf08) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7f13e005bf70) 0 + primary-for QPropertyAnimation (0x0x7f13e005bf08) + QAbstractAnimation (0x0x7f13dfd33000) 0 + primary-for QVariantAnimation (0x0x7f13e005bf70) + QObject (0x0x7f13e008fcc0) 0 + primary-for QAbstractAnimation (0x0x7f13dfd33000) + +Class QRandomGenerator::Storage + size=2504 align=8 + base size=2504 base align=8 +QRandomGenerator::Storage (0x0x7f13e008fe40) 0 + +Class QRandomGenerator + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator (0x0x7f13e008fde0) 0 + +Class QRandomGenerator64 + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator64 (0x0x7f13dfdd12d8) 0 + QRandomGenerator (0x0x7f13dfda8de0) 0 + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f13dfda8ea0) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f13dfe34180) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f13dfe34240) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f13dfe34300) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f13dfe345a0) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f13dfe34840) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f13dfe34ae0) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f13dfe34d80) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f13dfc563c0) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f13dfc566c0) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f13dfc569c0) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f13dfc56b40) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7f13dfc754e0) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7f13dfc75548) 0 + primary-for QSaveFile (0x0x7f13dfc754e0) + QIODevice (0x0x7f13dfc755b0) 0 + primary-for QFileDevice (0x0x7f13dfc75548) + QObject (0x0x7f13dfc56ae0) 0 + primary-for QIODevice (0x0x7f13dfc755b0) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f13dfc56c00) 0 + +Class QSemaphoreReleaser + size=16 align=8 + base size=12 base align=8 +QSemaphoreReleaser (0x0x7f13dfc56c60) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f13df9f32a0) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7f13df9d8dd0) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7f13df9d8e38) 0 + primary-for QSequentialAnimationGroup (0x0x7f13df9d8dd0) + QAbstractAnimation (0x0x7f13df9d8ea0) 0 + primary-for QAnimationGroup (0x0x7f13df9d8e38) + QObject (0x0x7f13df9f3240) 0 + primary-for QAbstractAnimation (0x0x7f13df9d8ea0) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f13df9f3360) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7f13df9d8f08) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7f13df9f3300) 0 + primary-for QSettings (0x0x7f13df9d8f08) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f13df9f3420) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7f13df9d8f70) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7f13df9f33c0) 0 + primary-for QSharedMemory (0x0x7f13df9d8f70) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f13df9f34e0) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7f13dfa42000) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7f13df9f3480) 0 + primary-for QSignalMapper (0x0x7f13dfa42000) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f13df9f35a0) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7f13dfa42068) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7f13dfa420d0) 0 + primary-for QSignalTransition (0x0x7f13dfa42068) + QObject (0x0x7f13df9f3540) 0 + primary-for QAbstractTransition (0x0x7f13dfa420d0) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f13df9f3660) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7f13dfa42138) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7f13df9f3600) 0 + primary-for QSocketNotifier (0x0x7f13dfa42138) + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f13df9f3720) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7f13dfa421a0) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7f13dfa42208) 0 + primary-for QSortFilterProxyModel (0x0x7f13dfa421a0) + QAbstractItemModel (0x0x7f13dfa42270) 0 + primary-for QAbstractProxyModel (0x0x7f13dfa42208) + QObject (0x0x7f13df9f36c0) 0 + primary-for QAbstractItemModel (0x0x7f13dfa42270) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f13df9f37e0) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f13df9f3a20) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7f13dfa42410) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7f13dfa42478) 0 + primary-for QState (0x0x7f13dfa42410) + QObject (0x0x7f13df9f39c0) 0 + primary-for QAbstractState (0x0x7f13dfa42478) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f13df9f3b40) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7f13dfa42618) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7f13df9f3ba0) 0 + primary-for QStateMachine::SignalEvent (0x0x7f13dfa42618) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7f13dfa42680) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7f13df9f3c00) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f13dfa42680) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7f13dfa424e0) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7f13dfa42548) 0 + primary-for QStateMachine (0x0x7f13dfa424e0) + QAbstractState (0x0x7f13dfa425b0) 0 + primary-for QState (0x0x7f13dfa42548) + QObject (0x0x7f13df9f3ae0) 0 + primary-for QAbstractState (0x0x7f13dfa425b0) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7f13df9f3c60) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f13df73dba0) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f13df79a6c0) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7f13df75db60) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7f13df75dbc8) 0 + primary-for QStringListModel (0x0x7f13df75db60) + QAbstractItemModel (0x0x7f13df75dc30) 0 + primary-for QAbstractListModel (0x0x7f13df75dbc8) + QObject (0x0x7f13df79a660) 0 + primary-for QAbstractItemModel (0x0x7f13df75dc30) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f13df79a720) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f13df79a7e0) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f13df79a900) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7f13df75dc98) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7f13df75dd00) 0 + primary-for QTemporaryFile (0x0x7f13df75dc98) + QFileDevice (0x0x7f13df75dd68) 0 + primary-for QFile (0x0x7f13df75dd00) + QIODevice (0x0x7f13df75ddd0) 0 + primary-for QFileDevice (0x0x7f13df75dd68) + QObject (0x0x7f13df79a8a0) 0 + primary-for QIODevice (0x0x7f13df75ddd0) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f13df79a960) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f13df79aba0) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 0u +64 0u + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f13df79ab40) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f13df79ad80) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f13df79ade0) 0 + +Class std::__mutex_base + size=40 align=8 + base size=40 base align=8 +std::__mutex_base (0x0x7f13df79ae40) 0 + +Class std::__recursive_mutex_base + size=40 align=8 + base size=40 base align=8 +std::__recursive_mutex_base (0x0x7f13df79aea0) 0 + +Class std::mutex + size=40 align=8 + base size=40 base align=8 +std::mutex (0x0x7f13df8bc000) 0 + std::__mutex_base (0x0x7f13df79af00) 0 + +Class std::recursive_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_mutex (0x0x7f13df8bc068) 0 + std::__recursive_mutex_base (0x0x7f13df79af60) 0 + +Class std::timed_mutex + size=40 align=8 + base size=40 base align=8 +std::timed_mutex (0x0x7f13df8d2460) 0 + std::__mutex_base (0x0x7f13df8cf0c0) 0 + std::__timed_mutex_impl (0x0x7f13df8cf120) 0 empty + +Class std::recursive_timed_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_timed_mutex (0x0x7f13df8e80e0) 0 + std::__recursive_mutex_base (0x0x7f13df8cf1e0) 0 + std::__timed_mutex_impl (0x0x7f13df8cf240) 0 empty + +Class std::defer_lock_t + size=1 align=1 + base size=0 base align=1 +std::defer_lock_t (0x0x7f13df8cf2a0) 0 empty + +Class std::try_to_lock_t + size=1 align=1 + base size=0 base align=1 +std::try_to_lock_t (0x0x7f13df8cf300) 0 empty + +Class std::adopt_lock_t + size=1 align=1 + base size=0 base align=1 +std::adopt_lock_t (0x0x7f13df8cf360) 0 empty + +Class std::once_flag + size=4 align=4 + base size=4 base align=4 +std::once_flag (0x0x7f13df8cf5a0) 0 + +Vtable for __gnu_cxx::__concurrence_lock_error +__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_lock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +24 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +32 (int (*)(...))__gnu_cxx::__concurrence_lock_error::what + +Class __gnu_cxx::__concurrence_lock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_lock_error (0x0x7f13df8bc1a0) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16u) + std::exception (0x0x7f13df8cf660) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_lock_error (0x0x7f13df8bc1a0) + +Vtable for __gnu_cxx::__concurrence_unlock_error +__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx26__concurrence_unlock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +24 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +32 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::what + +Class __gnu_cxx::__concurrence_unlock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_unlock_error (0x0x7f13df8bc208) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16u) + std::exception (0x0x7f13df8cf720) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7f13df8bc208) + +Vtable for __gnu_cxx::__concurrence_broadcast_error +__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx29__concurrence_broadcast_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +24 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +32 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::what + +Class __gnu_cxx::__concurrence_broadcast_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_broadcast_error (0x0x7f13df8bc270) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16u) + std::exception (0x0x7f13df8cf7e0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7f13df8bc270) + +Vtable for __gnu_cxx::__concurrence_wait_error +__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_wait_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +24 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +32 (int (*)(...))__gnu_cxx::__concurrence_wait_error::what + +Class __gnu_cxx::__concurrence_wait_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_wait_error (0x0x7f13df8bc340) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16u) + std::exception (0x0x7f13df8cf8a0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_wait_error (0x0x7f13df8bc340) + +Class __gnu_cxx::__mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__mutex (0x0x7f13df8cf960) 0 + +Class __gnu_cxx::__recursive_mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__recursive_mutex (0x0x7f13df8cf9c0) 0 + +Class __gnu_cxx::__scoped_lock + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__scoped_lock (0x0x7f13df8cfa20) 0 + +Class __gnu_cxx::__cond + size=48 align=8 + base size=48 base align=8 +__gnu_cxx::__cond (0x0x7f13df8cfa80) 0 + +Vtable for std::bad_weak_ptr +std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12bad_weak_ptr) +16 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +24 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +32 (int (*)(...))std::bad_weak_ptr::what + +Class std::bad_weak_ptr + size=8 align=8 + base size=8 base align=8 +std::bad_weak_ptr (0x0x7f13df8bc618) 0 nearly-empty + vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16u) + std::exception (0x0x7f13df8cfde0) 0 nearly-empty + primary-for std::bad_weak_ptr (0x0x7f13df8bc618) + +Class std::_Sp_make_shared_tag + size=1 align=1 + base size=0 base align=1 +std::_Sp_make_shared_tag (0x0x7f13df619660) 0 empty + +Class std::_Sp_locker + size=2 align=1 + base size=2 base align=1 +std::_Sp_locker (0x0x7f13df619e40) 0 + +Class std::thread::id + size=8 align=8 + base size=8 base align=8 +std::thread::id (0x0x7f13df2a9060) 0 + +Vtable for std::thread::_Impl_base +std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6thread10_Impl_baseE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class std::thread::_Impl_base + size=24 align=8 + base size=24 base align=8 +std::thread::_Impl_base (0x0x7f13df2a90c0) 0 + vptr=((& std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE) + 16u) + +Class std::thread + size=8 align=8 + base size=8 base align=8 +std::thread (0x0x7f13df2a9000) 0 + +Class std::condition_variable + size=48 align=8 + base size=48 base align=8 +std::condition_variable (0x0x7f13df3e0cc0) 0 + +Class std::__at_thread_exit_elt + size=16 align=8 + base size=16 base align=8 +std::__at_thread_exit_elt (0x0x7f13df3e0d80) 0 + +Class std::_V2::condition_variable_any + size=64 align=8 + base size=64 base align=8 +std::_V2::condition_variable_any (0x0x7f13df3e0de0) 0 + +Class std::__atomic_futex_unsigned_base + size=1 align=1 + base size=0 base align=1 +std::__atomic_futex_unsigned_base (0x0x7f13df0cd480) 0 empty + +Vtable for std::future_error +std::future_error::_ZTVSt12future_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12future_error) +16 (int (*)(...))std::future_error::~future_error +24 (int (*)(...))std::future_error::~future_error +32 (int (*)(...))std::future_error::what + +Class std::future_error + size=32 align=8 + base size=32 base align=8 +std::future_error (0x0x7f13df0ca958) 0 + vptr=((& std::future_error::_ZTVSt12future_error) + 16u) + std::logic_error (0x0x7f13df0ca9c0) 0 + primary-for std::future_error (0x0x7f13df0ca958) + std::exception (0x0x7f13df0cd5a0) 0 nearly-empty + primary-for std::logic_error (0x0x7f13df0ca9c0) + +Class std::__future_base::_Result_base::_Deleter + size=1 align=1 + base size=0 base align=1 +std::__future_base::_Result_base::_Deleter (0x0x7f13df0cd6c0) 0 empty + +Vtable for std::__future_base::_Result_base +std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class std::__future_base::_Result_base + size=16 align=8 + base size=16 base align=8 +std::__future_base::_Result_base (0x0x7f13df0cd660) 0 + vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16u) + +Class std::__future_base::_State_baseV2::__exception_ptr_tag + size=1 align=1 + base size=0 base align=1 +std::__future_base::_State_baseV2::__exception_ptr_tag (0x0x7f13df228c00) 0 empty + +Class std::__future_base::_State_baseV2::_Make_ready + size=32 align=8 + base size=32 base align=8 +std::__future_base::_State_baseV2::_Make_ready (0x0x7f13df162f70) 0 + std::__at_thread_exit_elt (0x0x7f13df228cc0) 0 + +Vtable for std::__future_base::_State_baseV2 +std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base13_State_baseV2E) +16 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +24 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +32 (int (*)(...))std::__future_base::_State_baseV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_State_baseV2 + size=32 align=8 + base size=28 base align=8 +std::__future_base::_State_baseV2 (0x0x7f13df0cd840) 0 + vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16u) + +Class std::__future_base + size=1 align=1 + base size=0 base align=1 +std::__future_base (0x0x7f13df0cd600) 0 empty + +Vtable for std::__future_base::_Async_state_commonV2 +std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base21_Async_state_commonV2E) +16 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +24 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +32 (int (*)(...))std::__future_base::_Async_state_commonV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_Async_state_commonV2 + size=48 align=8 + base size=44 base align=8 +std::__future_base::_Async_state_commonV2 (0x0x7f13deb7ab60) 0 + vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16u) + std::__future_base::_State_baseV2 (0x0x7f13deb75ba0) 0 + primary-for std::__future_base::_Async_state_commonV2 (0x0x7f13deb7ab60) + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f13debda300) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7f13debd9618) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7f13debda2a0) 0 + primary-for QThread (0x0x7f13debd9618) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f13debda420) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7f13debd9680) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7f13debda3c0) 0 + primary-for QThreadPool (0x0x7f13debd9680) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f13debda480) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f13debda5a0) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7f13debd96e8) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7f13debda540) 0 + primary-for QTimeLine (0x0x7f13debd96e8) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f13debda660) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7f13debd9750) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7f13debda600) 0 + primary-for QTimer (0x0x7f13debd9750) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f13debdad20) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f13debdacc0) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f13de8c1300) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7f13de8c81a0) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7f13de8c12a0) 0 + primary-for QTranslator (0x0x7f13de8c81a0) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f13de8c1420) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f13de9daae0) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f13de670180) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f13de670780) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f13de6707e0) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f13de670ae0) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f13de699c98) 0 + QVector (0x0x7f13de670ea0) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f13de670f00) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f13de7671e0) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f13de767480) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7f13de767720) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f13de767780) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f13de4121e0) 0 + +Class QGeoAddress + size=8 align=8 + base size=8 base align=8 +QGeoAddress (0x0x7f13de412300) 0 + +Class QGeoCoordinate + size=8 align=8 + base size=8 base align=8 +QGeoCoordinate (0x0x7f13de412a80) 0 + +Class QGeoShape + size=8 align=8 + base size=8 base align=8 +QGeoShape (0x0x7f13de412ea0) 0 + +Class QGeoAreaMonitorInfo + size=8 align=8 + base size=8 base align=8 +QGeoAreaMonitorInfo (0x0x7f13de497360) 0 + +Class QGeoPositionInfo + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfo (0x0x7f13de497420) 0 + +Class QGeoPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoPositionInfoSource::QPrivateSignal (0x0x7f13de4974e0) 0 empty + +Vtable for QGeoPositionInfoSource +QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QGeoPositionInfoSource) +16 (int (*)(...))QGeoPositionInfoSource::metaObject +24 (int (*)(...))QGeoPositionInfoSource::qt_metacast +32 (int (*)(...))QGeoPositionInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoPositionInfoSource (0x0x7f13de44d6e8) 0 + vptr=((& QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource) + 16u) + QObject (0x0x7f13de497480) 0 + primary-for QGeoPositionInfoSource (0x0x7f13de44d6e8) + +Class QGeoAreaMonitorSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoAreaMonitorSource::QPrivateSignal (0x0x7f13de497720) 0 empty + +Vtable for QGeoAreaMonitorSource +QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QGeoAreaMonitorSource) +16 (int (*)(...))QGeoAreaMonitorSource::metaObject +24 (int (*)(...))QGeoAreaMonitorSource::qt_metacast +32 (int (*)(...))QGeoAreaMonitorSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoAreaMonitorSource::setPositionInfoSource +120 (int (*)(...))QGeoAreaMonitorSource::positionInfoSource +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoAreaMonitorSource + size=24 align=8 + base size=24 base align=8 +QGeoAreaMonitorSource (0x0x7f13de44d820) 0 + vptr=((& QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource) + 16u) + QObject (0x0x7f13de4976c0) 0 + primary-for QGeoAreaMonitorSource (0x0x7f13de44d820) + +Class QGeoRectangle + size=8 align=8 + base size=8 base align=8 +QGeoRectangle (0x0x7f13de44d888) 0 + QGeoShape (0x0x7f13de497780) 0 + +Class QGeoCircle + size=8 align=8 + base size=8 base align=8 +QGeoCircle (0x0x7f13de44db60) 0 + QGeoShape (0x0x7f13de497c60) 0 + +Class QGeoLocation + size=8 align=8 + base size=8 base align=8 +QGeoLocation (0x0x7f13de574060) 0 + +Class QGeoPath + size=8 align=8 + base size=8 base align=8 +QGeoPath (0x0x7f13de58e3a8) 0 + QGeoShape (0x0x7f13de5747e0) 0 + +Class QGeoPolygon + size=8 align=8 + base size=8 base align=8 +QGeoPolygon (0x0x7f13de58e5b0) 0 + QGeoShape (0x0x7f13de574ba0) 0 + +Class QGeoSatelliteInfo + size=8 align=8 + base size=8 base align=8 +QGeoSatelliteInfo (0x0x7f13de574f60) 0 + +Class QGeoSatelliteInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoSatelliteInfoSource::QPrivateSignal (0x0x7f13de5e4060) 0 empty + +Vtable for QGeoSatelliteInfoSource +QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QGeoSatelliteInfoSource) +16 (int (*)(...))QGeoSatelliteInfoSource::metaObject +24 (int (*)(...))QGeoSatelliteInfoSource::qt_metacast +32 (int (*)(...))QGeoSatelliteInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoSatelliteInfoSource::setUpdateInterval +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual + +Class QGeoSatelliteInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoSatelliteInfoSource (0x0x7f13de58e7b8) 0 + vptr=((& QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource) + 16u) + QObject (0x0x7f13de5e4000) 0 + primary-for QGeoSatelliteInfoSource (0x0x7f13de58e7b8) + +Vtable for QGeoPositionInfoSourceFactory +QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI29QGeoPositionInfoSourceFactory) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactory + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactory (0x0x7f13de5e4120) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory) + 16u) + +Class QNmeaPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNmeaPositionInfoSource::QPrivateSignal (0x0x7f13de5e4240) 0 empty + +Vtable for QNmeaPositionInfoSource +QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource: 24u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QNmeaPositionInfoSource) +16 (int (*)(...))QNmeaPositionInfoSource::metaObject +24 (int (*)(...))QNmeaPositionInfoSource::qt_metacast +32 (int (*)(...))QNmeaPositionInfoSource::qt_metacall +40 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +48 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QNmeaPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))QNmeaPositionInfoSource::lastKnownPosition +136 (int (*)(...))QNmeaPositionInfoSource::supportedPositioningMethods +144 (int (*)(...))QNmeaPositionInfoSource::minimumUpdateInterval +152 (int (*)(...))QNmeaPositionInfoSource::error +160 (int (*)(...))QNmeaPositionInfoSource::startUpdates +168 (int (*)(...))QNmeaPositionInfoSource::stopUpdates +176 (int (*)(...))QNmeaPositionInfoSource::requestUpdate +184 (int (*)(...))QNmeaPositionInfoSource::parsePosInfoFromNmeaData + +Class QNmeaPositionInfoSource + size=32 align=8 + base size=32 base align=8 +QNmeaPositionInfoSource (0x0x7f13de58e820) 0 + vptr=((& QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource) + 16u) + QGeoPositionInfoSource (0x0x7f13de58e888) 0 + primary-for QNmeaPositionInfoSource (0x0x7f13de58e820) + QObject (0x0x7f13de5e41e0) 0 + primary-for QGeoPositionInfoSource (0x0x7f13de58e888) + diff --git a/tests/auto/bic/data/QtPositioning.5.11.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtPositioning.5.11.0.linux-gcc-amd64.txt new file mode 100644 index 0000000..0d9ef89 --- /dev/null +++ b/tests/auto/bic/data/QtPositioning.5.11.0.linux-gcc-amd64.txt @@ -0,0 +1,4773 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7f1d80fa6de0) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7f1d810875a0) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7f1d810877e0) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7f1d81087a20) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7f1d81087c60) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7f1d81087de0) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7f1d7ec391e0) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7f1d7ecc0960) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7f1d7ecc0a20) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7f1d7ecc0d80) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7f1d7ecc0e40) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7f1d7ecc0f00) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7f1d7ecf4000) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7f1d7ecf42a0) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7f1d7ecf4480) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f1d7ecf4900) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f1d7ecf4960) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f1d7eda0600) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f1d7eda0660) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f1d7ed052d8) 0 empty + std::input_iterator_tag (0x0x7f1d7eda06c0) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f1d7ed05340) 0 empty + std::forward_iterator_tag (0x0x7f1d7ed053a8) 0 empty + std::input_iterator_tag (0x0x7f1d7eda0720) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f1d7ed05410) 0 empty + std::bidirectional_iterator_tag (0x0x7f1d7ed05478) 0 empty + std::forward_iterator_tag (0x0x7f1d7ed054e0) 0 empty + std::input_iterator_tag (0x0x7f1d7eda0780) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7f1d7ede6420) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7f1d7ede6480) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7f1d7ede64e0) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7f1d7ede6540) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7f1d7ede65a0) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7f1d7eaf60c0) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f1d7eaf6300) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f1d7eaf63c0) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f1d7eaf6420) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f1d7eaf64e0) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f1d7eaf6540) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f1d7eaf69c0) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f1d7eaf6a20) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7f1d7eaf6a80) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7f1d7ed05a28) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7f1d7eaf6ae0) 0 nearly-empty + primary-for std::bad_exception (0x0x7f1d7ed05a28) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7f1d7eaf6b40) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7f1d7eaf6ba0) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16u) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7f1d7ed05c30) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7f1d7ec2c000) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f1d7ed05c30) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7f1d7ed05c98) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16u) + std::bad_alloc (0x0x7f1d7ed05d00) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7f1d7ed05c98) + std::exception (0x0x7f1d7ec2c060) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f1d7ed05d00) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f1d7ec2c0c0) 0 empty + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7f1d7ec2ccc0) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f1d7ea299c0) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f1d7ea29a20) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7f1d7e733900) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7f1d7e733960) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f1d7e733a20) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f1d7e733a80) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f1d7e733ae0) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f1d7e733b40) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f1d7e733c60) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f1d7e733cc0) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f1d7e49a120) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f1d7e49a180) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7f1d7e291960) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7f1d7e2919c0) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f1d7e2c5960) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f1d7e0b9780) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f1d7e2bfa90) 0 + std::iterator (0x0x7f1d7e0b9840) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f1d7e2bfaf8) 0 + std::_Bit_iterator_base (0x0x7f1d7e2bfb60) 0 + std::iterator (0x0x7f1d7e0b98a0) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f1d7e2bfbc8) 0 + std::_Bit_iterator_base (0x0x7f1d7e2bfc30) 0 + std::iterator (0x0x7f1d7e0b9900) 0 empty + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7f1d7defc720) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7f1d7dfe74e0) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7f1d7dfe7480) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7f1d7dd91480) 0 + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f1d7cac7f60) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f1d7c981000) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f1d7ca0ea80) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f1d7ca0eae0) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f1d7ca0eb40) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f1d7ca0eba0) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f1d7ca0ee40) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7f1d7c67c3c0) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7f1d7ca17958) 0 + std::__atomic_flag_base (0x0x7f1d7c67c420) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f1d7c2930d0) 0 + QAtomicInteger (0x0x7f1d7c293138) 0 + QBasicAtomicInteger (0x0x7f1d7c4a7b40) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f1d7be79120) 0 empty + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f1d7beec180) 0 + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f1d7beec2a0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f1d7c070b60) 0 + QGenericArgument (0x0x7f1d7beec300) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f1d7beec480) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f1d7beec540) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f1d7bfca5a0) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f1d7bfca600) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f1d7bfca8a0) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f1d7bfca900) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7f1d7bfcac60) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f1d7bfcacc0) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7f1d7bfcad20) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f1d7bfcad80) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f1d7bfcade0) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7f1d7bd661e0) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7f1d7bd700d0) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16u) + std::exception (0x0x7f1d7bd662a0) 0 nearly-empty + primary-for std::logic_error (0x0x7f1d7bd700d0) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7f1d7bd70138) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16u) + std::logic_error (0x0x7f1d7bd701a0) 0 + primary-for std::domain_error (0x0x7f1d7bd70138) + std::exception (0x0x7f1d7bd66300) 0 nearly-empty + primary-for std::logic_error (0x0x7f1d7bd701a0) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7f1d7bd70208) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16u) + std::logic_error (0x0x7f1d7bd70270) 0 + primary-for std::invalid_argument (0x0x7f1d7bd70208) + std::exception (0x0x7f1d7bd66360) 0 nearly-empty + primary-for std::logic_error (0x0x7f1d7bd70270) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7f1d7bd702d8) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16u) + std::logic_error (0x0x7f1d7bd70340) 0 + primary-for std::length_error (0x0x7f1d7bd702d8) + std::exception (0x0x7f1d7bd663c0) 0 nearly-empty + primary-for std::logic_error (0x0x7f1d7bd70340) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7f1d7bd703a8) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16u) + std::logic_error (0x0x7f1d7bd70410) 0 + primary-for std::out_of_range (0x0x7f1d7bd703a8) + std::exception (0x0x7f1d7bd66420) 0 nearly-empty + primary-for std::logic_error (0x0x7f1d7bd70410) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7f1d7bd70478) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16u) + std::exception (0x0x7f1d7bd66480) 0 nearly-empty + primary-for std::runtime_error (0x0x7f1d7bd70478) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7f1d7bd704e0) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16u) + std::runtime_error (0x0x7f1d7bd70548) 0 + primary-for std::range_error (0x0x7f1d7bd704e0) + std::exception (0x0x7f1d7bd664e0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f1d7bd70548) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7f1d7bd705b0) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16u) + std::runtime_error (0x0x7f1d7bd70618) 0 + primary-for std::overflow_error (0x0x7f1d7bd705b0) + std::exception (0x0x7f1d7bd66540) 0 nearly-empty + primary-for std::runtime_error (0x0x7f1d7bd70618) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7f1d7bd70680) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16u) + std::runtime_error (0x0x7f1d7bd706e8) 0 + primary-for std::underflow_error (0x0x7f1d7bd70680) + std::exception (0x0x7f1d7bd665a0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f1d7bd706e8) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7f1d7bd66720) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16u) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7f1d7bd66960) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7f1d7bd66ae0) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7f1d7bd70bc8) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16u) + std::runtime_error (0x0x7f1d7bd70c30) 0 + primary-for std::system_error (0x0x7f1d7bd70bc8) + std::exception (0x0x7f1d7bd66d20) 0 nearly-empty + primary-for std::runtime_error (0x0x7f1d7bd70c30) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7f1d7be05820) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16u) + std::system_error (0x0x7f1d7be05888) 0 + primary-for std::ios_base::failure (0x0x7f1d7be05820) + std::runtime_error (0x0x7f1d7be058f0) 0 + primary-for std::system_error (0x0x7f1d7be05888) + std::exception (0x0x7f1d7ba37060) 0 nearly-empty + primary-for std::runtime_error (0x0x7f1d7be058f0) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f1d7ba370c0) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f1d7ba37120) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f1d7ba37180) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7f1d7ba37000) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7f1d7ba37900) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f1d7bbbb000) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7f1d7b6d91a0 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f1d7b6d9270 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7f1d7b6d9618 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f1d7b6d96e8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f1d7b9b4840) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f1d7b9b48a0) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f1d7b816c00) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f1d7b816f60) 0 + +Class QStringView + size=16 align=8 + base size=16 base align=8 +QStringView (0x0x7f1d7b50e420) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f1d7b5962a0) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f1d7b596900) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f1d7b5968a0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f1d7b37b9c0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f1d7b117600) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7f1d7af242a0) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7f1d7af24300) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f1d7af24360) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7f1d7af24720) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7f1d7af24780) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7f1d7af371a0) 0 empty + QListData::NotIndirectLayout (0x0x7f1d7af247e0) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7f1d7afeda10) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f1d7af24840) 0 empty + QListData::NotIndirectLayout (0x0x7f1d7af248a0) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7f1d7af37208) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f1d7af24900) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f1d7af24960) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f1d7af246c0) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f1d7af24de0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f1d7adb5060) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f1d7adb5000) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f1d7ada1c30) 0 + QList (0x0x7f1d7ada1c98) 0 + QListSpecialMethods (0x0x7f1d7adb5240) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f1d7adb5660) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f1d7aad4240) 0 + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7f1d7aad48a0) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7f1d7aad4a20) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7f1d7aad4ae0) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7f1d7ae205b0) 0 + std::__uses_alloc_base (0x0x7f1d7aad4a80) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7f1d7a8f9b40) 0 empty + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f1d7a8f9d80) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f1d7a8f9e40) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f1d7a8f9f60) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f1d7aa22120) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f1d7aa22540) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7f1d7aa22660) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f1d7a73f000) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f1d7a73f420) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f1d7a73f720) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7f1d7a58cf60) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7f1d7a30ade0) 0 empty + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7f1d7a30ae40) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f1d7a37d060) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7f1d7a37d000) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7f1d7a415300) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7f1d7a415360) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f1d7a415420) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7f1d7a4117b8) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7f1d7a4153c0) 0 + primary-for QAbstractAnimation (0x0x7f1d7a4117b8) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f1d7a4154e0) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7f1d7a411820) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7f1d7a415480) 0 + primary-for QAnimationDriver (0x0x7f1d7a411820) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f1d7a4155a0) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7f1d7a411888) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7f1d7a415540) 0 + primary-for QEventLoop (0x0x7f1d7a411888) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f1d7a415780) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f1d7a415840) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f1d7a4158a0) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7f1d7a4119c0) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7f1d7a4157e0) 0 + primary-for QAbstractEventDispatcher (0x0x7f1d7a4119c0) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7f1d7a415b40) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16u) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7f1d7a411bc8) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16u) + std::exception (0x0x7f1d7a415ba0) 0 nearly-empty + primary-for std::bad_cast (0x0x7f1d7a411bc8) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7f1d7a411c30) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16u) + std::exception (0x0x7f1d7a415c00) 0 nearly-empty + primary-for std::bad_typeid (0x0x7f1d7a411c30) + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7f1d7a164ea0) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16u) + std::exception (0x0x7f1d7a1d6cc0) 0 nearly-empty + primary-for std::bad_function_call (0x0x7f1d7a164ea0) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7f1d7a1d6d80) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7f1d7a1d6de0) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7f1d7a1d6f00) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f1d79e7f420) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f1d79e7f960) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f1d79e7fd20) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7f1d79e7fcc0) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f1d79e7fd80) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f1d7a012660) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f1d7a012720) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f1d7a0126c0) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f1d7a012780) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f1d7a012600) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f1d79a692a0) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f1d79a69900) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f1d79a698a0) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f1d79a699c0) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f1d79a69960) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f1d79b92cc0) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f1d798d83c0) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f1d79974ae0) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7f1d79975c30) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7f1d79974a80) 0 + primary-for QAbstractItemModel (0x0x7f1d79975c30) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f1d799d53c0) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractTableModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7f1d799d4340) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7f1d799d43a8) 0 + primary-for QAbstractTableModel (0x0x7f1d799d4340) + QObject (0x0x7f1d799d5360) 0 + primary-for QAbstractItemModel (0x0x7f1d799d43a8) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f1d799d5480) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractListModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7f1d799d4410) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7f1d799d4478) 0 + primary-for QAbstractListModel (0x0x7f1d799d4410) + QObject (0x0x7f1d799d5420) 0 + primary-for QAbstractItemModel (0x0x7f1d799d4478) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f1d799d5720) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f1d799d57e0) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7f1d799d45b0) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7f1d799d4618) 0 + primary-for QAbstractProxyModel (0x0x7f1d799d45b0) + QObject (0x0x7f1d799d5780) 0 + primary-for QAbstractItemModel (0x0x7f1d799d4618) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f1d799d58a0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7f1d799d4680) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7f1d799d5840) 0 + primary-for QAbstractState (0x0x7f1d799d4680) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f1d799d5960) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7f1d799d46e8) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7f1d799d5900) 0 + primary-for QAbstractTransition (0x0x7f1d799d46e8) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f1d799d5a20) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7f1d799d4750) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7f1d799d47b8) 0 + primary-for QAnimationGroup (0x0x7f1d799d4750) + QObject (0x0x7f1d799d59c0) 0 + primary-for QAbstractAnimation (0x0x7f1d799d47b8) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f1d79743780) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f1d79743a20) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f1d79743ae0) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f1d79743de0) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7f1d799d4e38) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7f1d79743d80) 0 + primary-for QIODevice (0x0x7f1d799d4e38) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f1d79822060) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7f1d799d4f70) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7f1d79821000) 0 + primary-for QBuffer (0x0x7f1d799d4f70) + QObject (0x0x7f1d79822000) 0 + primary-for QIODevice (0x0x7f1d79821000) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f1d79822120) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f1d798220c0) 0 + +Class QStaticByteArrayMatcherBase::Skiptable + size=256 align=1 + base size=256 base align=1 +QStaticByteArrayMatcherBase::Skiptable (0x0x7f1d79822240) 0 + +Class QStaticByteArrayMatcherBase + size=256 align=16 + base size=256 base align=16 +QStaticByteArrayMatcherBase (0x0x7f1d798221e0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f1d79822420) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f1d79822600) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f1d79822c00) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f1d79822cc0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f1d7961dcc0) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7f1d7925b180) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7f1d792304e0) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7f1d7925b1e0) 0 + primary-for QTimerEvent (0x0x7f1d792304e0) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7f1d79230548) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7f1d7925b240) 0 + primary-for QChildEvent (0x0x7f1d79230548) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7f1d79230a90) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7f1d7925b720) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f1d79230a90) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7f1d79230af8) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7f1d7925b780) 0 + primary-for QDeferredDeleteEvent (0x0x7f1d79230af8) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f1d7925b840) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7f1d79230b60) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7f1d7925b7e0) 0 + primary-for QCoreApplication (0x0x7f1d79230b60) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f1d7925b8a0) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f1d7925b900) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f1d7925bf00) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f1d7925bf60) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7f1d7936a060) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f1d7936a540) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f1d7936a7e0) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7f1d7936af60) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7f1d79410000) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f1d7936af00) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f1d790bf120) 0 + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7f1d790bf600) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7f1d791f85a0) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f1d791f8840) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f1d791f8a80) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f1d791f8c00) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7f1d78fb6180) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f1d78fb6120) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f1d78c80660) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f1d78c80720) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f1d78d588a0) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7f1d78d5cc98) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7f1d78d5cd00) 0 + primary-for QFileDevice (0x0x7f1d78d5cc98) + QObject (0x0x7f1d78d58840) 0 + primary-for QIODevice (0x0x7f1d78d5cd00) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f1d78d58ae0) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7f1d78d5ce38) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7f1d78d5cea0) 0 + primary-for QFile (0x0x7f1d78d5ce38) + QIODevice (0x0x7f1d78d5cf08) 0 + primary-for QFileDevice (0x0x7f1d78d5cea0) + QObject (0x0x7f1d78d58a80) 0 + primary-for QIODevice (0x0x7f1d78d5cf08) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f1d78d58cc0) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f1d78e19120) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f1d78e19720) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f1d78e19960) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f1d78b6ed80) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7f1d78b70b60) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7f1d78b70bc8) 0 + primary-for QEventTransition (0x0x7f1d78b70b60) + QObject (0x0x7f1d78b6ed20) 0 + primary-for QAbstractTransition (0x0x7f1d78b70bc8) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7f1d78b70c30) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7f1d78b6ede0) 0 nearly-empty + primary-for QException (0x0x7f1d78b70c30) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7f1d78b70c98) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7f1d78b70d00) 0 nearly-empty + primary-for QUnhandledException (0x0x7f1d78b70c98) + std::exception (0x0x7f1d78b6ee40) 0 nearly-empty + primary-for QException (0x0x7f1d78b70d00) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f1d78b6eea0) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f1d78b6ef60) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f1d78bea000) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f1d78bea120) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7f1d78b70d68) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7f1d78bea0c0) 0 + primary-for QFileSelector (0x0x7f1d78b70d68) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f1d78bea1e0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7f1d78b70dd0) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7f1d78bea180) 0 + primary-for QFileSystemWatcher (0x0x7f1d78b70dd0) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f1d78bea2a0) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7f1d78b70e38) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7f1d78b70ea0) 0 + primary-for QFinalState (0x0x7f1d78b70e38) + QObject (0x0x7f1d78bea240) 0 + primary-for QAbstractState (0x0x7f1d78b70ea0) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f1d78bea300) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f1d78bea360) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f1d7889b000) 0 + QBasicMutex (0x0x7f1d78bea540) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f1d78bea5a0) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f1d78bea600) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f1d78bea660) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7f1d78bea780) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7f1d78913000) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f1d789137e0) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 0u +48 0u +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7f1d78991138) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7f1d78913780) 0 + primary-for QFutureWatcherBase (0x0x7f1d78991138) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f1d78913de0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7f1d78991a28) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7f1d78991a90) 0 + primary-for QHistoryState (0x0x7f1d78991a28) + QObject (0x0x7f1d78913d80) 0 + primary-for QAbstractState (0x0x7f1d78991a90) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f1d78913ea0) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7f1d78991af8) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7f1d78991b60) 0 + primary-for QIdentityProxyModel (0x0x7f1d78991af8) + QAbstractItemModel (0x0x7f1d78991bc8) 0 + primary-for QAbstractProxyModel (0x0x7f1d78991b60) + QObject (0x0x7f1d78913e40) 0 + primary-for QAbstractItemModel (0x0x7f1d78991bc8) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f1d78913f00) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f1d78658600) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7f1d7865b410) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7f1d786585a0) 0 + primary-for QItemSelectionModel (0x0x7f1d7865b410) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f1d7865b618) 0 + QList (0x0x7f1d7865b680) 0 + QListSpecialMethods (0x0x7f1d78658900) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f1d78658de0) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f1d78465540) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7f1d78465a80) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7f1d78465ae0) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f1d78465cc0) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f1d78465d20) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f1d78465c60) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f1d78566f60) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f1d785d9000) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f1d785d9660) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f1d785d96c0) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f1d785d9600) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f1d78284960) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7f1d782859c0) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7f1d78284900) 0 + primary-for QLibrary (0x0x7f1d782859c0) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7f1d78315060) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7f1d78284b40) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f1d78315540) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f1d783155a0) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f1d78315840) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f1d78315ae0) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f1d7800f480) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7f1d7800fde0) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f1d780b6180) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7f1d780b6300) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f1d780b62a0) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f1d780b6480) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7f1d780b6720) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f1d780b6d80) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f1d780b6de0) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f1d77e7a420) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f1d77e7a720) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f1d77e7a780) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f1d77e7aa80) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7f1d7820dc30) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7f1d77e7aa20) 0 + primary-for QMimeData (0x0x7f1d7820dc30) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f1d77e7aae0) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f1d77e7ade0) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f1d77e7aea0) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7f1d7820de38) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7f1d77e7ae40) 0 + primary-for QObjectCleanupHandler (0x0x7f1d7820de38) + +Class QOperatingSystemVersion + size=16 align=4 + base size=16 base align=4 +QOperatingSystemVersion (0x0x7f1d77e7af00) 0 + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f1d77f086c0) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7f1d77f0b548) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7f1d77f0b5b0) 0 + primary-for QParallelAnimationGroup (0x0x7f1d77f0b548) + QAbstractAnimation (0x0x7f1d77f0b618) 0 + primary-for QAnimationGroup (0x0x7f1d77f0b5b0) + QObject (0x0x7f1d77f08660) 0 + primary-for QAbstractAnimation (0x0x7f1d77f0b618) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f1d77f08780) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7f1d77f0b680) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7f1d77f0b6e8) 0 + primary-for QPauseAnimation (0x0x7f1d77f0b680) + QObject (0x0x7f1d77f08720) 0 + primary-for QAbstractAnimation (0x0x7f1d77f0b6e8) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f1d77f08960) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f1d77f08c60) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7f1d77f0b8f0) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7f1d77f08c00) 0 + primary-for QPluginLoader (0x0x7f1d77f0b8f0) + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f1d77f08cc0) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f1d77f8a3c0) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7f1d77f0bf70) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7f1d77f96000) 0 + primary-for QProcess (0x0x7f1d77f0bf70) + QObject (0x0x7f1d77f8a360) 0 + primary-for QIODevice (0x0x7f1d77f96000) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f1d77f8a480) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7f1d77f96068) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7f1d77f960d0) 0 + primary-for QVariantAnimation (0x0x7f1d77f96068) + QObject (0x0x7f1d77f8a420) 0 + primary-for QAbstractAnimation (0x0x7f1d77f960d0) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f1d77f8a540) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7f1d77f961a0) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7f1d77f96208) 0 + primary-for QPropertyAnimation (0x0x7f1d77f961a0) + QAbstractAnimation (0x0x7f1d77f96270) 0 + primary-for QVariantAnimation (0x0x7f1d77f96208) + QObject (0x0x7f1d77f8a4e0) 0 + primary-for QAbstractAnimation (0x0x7f1d77f96270) + +Class QRandomGenerator::Storage + size=2504 align=8 + base size=2504 base align=8 +QRandomGenerator::Storage (0x0x7f1d77f8a660) 0 + +Class QRandomGenerator + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator (0x0x7f1d77f8a600) 0 + +Class QRandomGenerator64 + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator64 (0x0x7f1d77c78548) 0 + QRandomGenerator (0x0x7f1d77c76600) 0 + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f1d77c766c0) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f1d77c76960) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f1d77c76a20) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f1d77c76ae0) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f1d77c76d80) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f1d77d90060) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f1d77d90300) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f1d77d905a0) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f1d77d90ba0) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f1d77d90ea0) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f1d77b961e0) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f1d77b96360) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7f1d77a81750) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7f1d77a817b8) 0 + primary-for QSaveFile (0x0x7f1d77a81750) + QIODevice (0x0x7f1d77a81820) 0 + primary-for QFileDevice (0x0x7f1d77a817b8) + QObject (0x0x7f1d77b96300) 0 + primary-for QIODevice (0x0x7f1d77a81820) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f1d77b96420) 0 + +Class QSemaphoreReleaser + size=16 align=8 + base size=12 base align=8 +QSemaphoreReleaser (0x0x7f1d77b965a0) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f1d778e3ba0) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7f1d778f50d0) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7f1d778f5138) 0 + primary-for QSequentialAnimationGroup (0x0x7f1d778f50d0) + QAbstractAnimation (0x0x7f1d778f51a0) 0 + primary-for QAnimationGroup (0x0x7f1d778f5138) + QObject (0x0x7f1d778e3b40) 0 + primary-for QAbstractAnimation (0x0x7f1d778f51a0) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f1d778e3c60) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7f1d778f5208) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7f1d778e3c00) 0 + primary-for QSettings (0x0x7f1d778f5208) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f1d778e3d20) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7f1d778f5270) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7f1d778e3cc0) 0 + primary-for QSharedMemory (0x0x7f1d778f5270) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f1d778e3de0) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7f1d778f52d8) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7f1d778e3d80) 0 + primary-for QSignalMapper (0x0x7f1d778f52d8) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f1d778e3ea0) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7f1d778f5340) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7f1d778f53a8) 0 + primary-for QSignalTransition (0x0x7f1d778f5340) + QObject (0x0x7f1d778e3e40) 0 + primary-for QAbstractTransition (0x0x7f1d778f53a8) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f1d778e3f60) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7f1d778f5410) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7f1d778e3f00) 0 + primary-for QSocketNotifier (0x0x7f1d778f5410) + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f1d77976060) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7f1d778f5478) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7f1d778f54e0) 0 + primary-for QSortFilterProxyModel (0x0x7f1d778f5478) + QAbstractItemModel (0x0x7f1d778f5548) 0 + primary-for QAbstractProxyModel (0x0x7f1d778f54e0) + QObject (0x0x7f1d77976000) 0 + primary-for QAbstractItemModel (0x0x7f1d778f5548) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f1d77976120) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f1d77976360) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7f1d778f56e8) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7f1d778f5750) 0 + primary-for QState (0x0x7f1d778f56e8) + QObject (0x0x7f1d77976300) 0 + primary-for QAbstractState (0x0x7f1d778f5750) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f1d77976480) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7f1d778f58f0) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7f1d779764e0) 0 + primary-for QStateMachine::SignalEvent (0x0x7f1d778f58f0) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7f1d778f5958) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7f1d77976540) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f1d778f5958) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7f1d778f57b8) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7f1d778f5820) 0 + primary-for QStateMachine (0x0x7f1d778f57b8) + QAbstractState (0x0x7f1d778f5888) 0 + primary-for QState (0x0x7f1d778f5820) + QObject (0x0x7f1d77976420) 0 + primary-for QAbstractState (0x0x7f1d778f5888) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7f1d779765a0) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f1d7765c4e0) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f1d776e98a0) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7f1d776ed958) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7f1d776ed9c0) 0 + primary-for QStringListModel (0x0x7f1d776ed958) + QAbstractItemModel (0x0x7f1d776eda28) 0 + primary-for QAbstractListModel (0x0x7f1d776ed9c0) + QObject (0x0x7f1d776e9840) 0 + primary-for QAbstractItemModel (0x0x7f1d776eda28) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f1d776e9900) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f1d776e99c0) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f1d776e9ae0) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7f1d776eda90) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7f1d776edaf8) 0 + primary-for QTemporaryFile (0x0x7f1d776eda90) + QFileDevice (0x0x7f1d776edb60) 0 + primary-for QFile (0x0x7f1d776edaf8) + QIODevice (0x0x7f1d776edbc8) 0 + primary-for QFileDevice (0x0x7f1d776edb60) + QObject (0x0x7f1d776e9a80) 0 + primary-for QIODevice (0x0x7f1d776edbc8) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f1d776e9b40) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f1d776e9d80) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 0u +64 0u + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f1d776e9d20) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f1d776e9f60) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f1d777d7000) 0 + +Class std::__mutex_base + size=40 align=8 + base size=40 base align=8 +std::__mutex_base (0x0x7f1d777d7060) 0 + +Class std::__recursive_mutex_base + size=40 align=8 + base size=40 base align=8 +std::__recursive_mutex_base (0x0x7f1d777d70c0) 0 + +Class std::mutex + size=40 align=8 + base size=40 base align=8 +std::mutex (0x0x7f1d776eddd0) 0 + std::__mutex_base (0x0x7f1d777d7120) 0 + +Class std::recursive_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_mutex (0x0x7f1d776ede38) 0 + std::__recursive_mutex_base (0x0x7f1d777d7180) 0 + +Class std::timed_mutex + size=40 align=8 + base size=40 base align=8 +std::timed_mutex (0x0x7f1d777f1b60) 0 + std::__mutex_base (0x0x7f1d777d72a0) 0 + std::__timed_mutex_impl (0x0x7f1d777d7300) 0 empty + +Class std::recursive_timed_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_timed_mutex (0x0x7f1d7730f540) 0 + std::__recursive_mutex_base (0x0x7f1d777d73c0) 0 + std::__timed_mutex_impl (0x0x7f1d777d7420) 0 empty + +Class std::defer_lock_t + size=1 align=1 + base size=0 base align=1 +std::defer_lock_t (0x0x7f1d777d7480) 0 empty + +Class std::try_to_lock_t + size=1 align=1 + base size=0 base align=1 +std::try_to_lock_t (0x0x7f1d777d74e0) 0 empty + +Class std::adopt_lock_t + size=1 align=1 + base size=0 base align=1 +std::adopt_lock_t (0x0x7f1d777d7540) 0 empty + +Class std::once_flag + size=4 align=4 + base size=4 base align=4 +std::once_flag (0x0x7f1d777d7780) 0 + +Vtable for __gnu_cxx::__concurrence_lock_error +__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_lock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +24 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +32 (int (*)(...))__gnu_cxx::__concurrence_lock_error::what + +Class __gnu_cxx::__concurrence_lock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_lock_error (0x0x7f1d776edf70) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16u) + std::exception (0x0x7f1d777d7840) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_lock_error (0x0x7f1d776edf70) + +Vtable for __gnu_cxx::__concurrence_unlock_error +__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx26__concurrence_unlock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +24 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +32 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::what + +Class __gnu_cxx::__concurrence_unlock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_unlock_error (0x0x7f1d77369000) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16u) + std::exception (0x0x7f1d777d7900) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7f1d77369000) + +Vtable for __gnu_cxx::__concurrence_broadcast_error +__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx29__concurrence_broadcast_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +24 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +32 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::what + +Class __gnu_cxx::__concurrence_broadcast_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_broadcast_error (0x0x7f1d77369068) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16u) + std::exception (0x0x7f1d777d79c0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7f1d77369068) + +Vtable for __gnu_cxx::__concurrence_wait_error +__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_wait_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +24 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +32 (int (*)(...))__gnu_cxx::__concurrence_wait_error::what + +Class __gnu_cxx::__concurrence_wait_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_wait_error (0x0x7f1d77369138) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16u) + std::exception (0x0x7f1d777d7a80) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_wait_error (0x0x7f1d77369138) + +Class __gnu_cxx::__mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__mutex (0x0x7f1d777d7b40) 0 + +Class __gnu_cxx::__recursive_mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__recursive_mutex (0x0x7f1d777d7ba0) 0 + +Class __gnu_cxx::__scoped_lock + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__scoped_lock (0x0x7f1d777d7c00) 0 + +Class __gnu_cxx::__cond + size=48 align=8 + base size=48 base align=8 +__gnu_cxx::__cond (0x0x7f1d777d7c60) 0 + +Vtable for std::bad_weak_ptr +std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12bad_weak_ptr) +16 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +24 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +32 (int (*)(...))std::bad_weak_ptr::what + +Class std::bad_weak_ptr + size=8 align=8 + base size=8 base align=8 +std::bad_weak_ptr (0x0x7f1d77369410) 0 nearly-empty + vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16u) + std::exception (0x0x7f1d7742f000) 0 nearly-empty + primary-for std::bad_weak_ptr (0x0x7f1d77369410) + +Class std::_Sp_make_shared_tag + size=1 align=1 + base size=0 base align=1 +std::_Sp_make_shared_tag (0x0x7f1d7742f840) 0 empty + +Class std::_Sp_locker + size=2 align=1 + base size=2 base align=1 +std::_Sp_locker (0x0x7f1d771a8060) 0 + +Class std::thread::id + size=8 align=8 + base size=8 base align=8 +std::thread::id (0x0x7f1d771a8240) 0 + +Vtable for std::thread::_Impl_base +std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6thread10_Impl_baseE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class std::thread::_Impl_base + size=24 align=8 + base size=24 base align=8 +std::thread::_Impl_base (0x0x7f1d771a82a0) 0 + vptr=((& std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE) + 16u) + +Class std::thread + size=8 align=8 + base size=8 base align=8 +std::thread (0x0x7f1d771a81e0) 0 + +Class std::condition_variable + size=48 align=8 + base size=48 base align=8 +std::condition_variable (0x0x7f1d76f18ea0) 0 + +Class std::__at_thread_exit_elt + size=16 align=8 + base size=16 base align=8 +std::__at_thread_exit_elt (0x0x7f1d76f18f60) 0 + +Class std::_V2::condition_variable_any + size=64 align=8 + base size=64 base align=8 +std::_V2::condition_variable_any (0x0x7f1d76f7c000) 0 + +Class std::__atomic_futex_unsigned_base + size=1 align=1 + base size=0 base align=1 +std::__atomic_futex_unsigned_base (0x0x7f1d77003660) 0 empty + +Vtable for std::future_error +std::future_error::_ZTVSt12future_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12future_error) +16 (int (*)(...))std::future_error::~future_error +24 (int (*)(...))std::future_error::~future_error +32 (int (*)(...))std::future_error::what + +Class std::future_error + size=32 align=8 + base size=32 base align=8 +std::future_error (0x0x7f1d77005750) 0 + vptr=((& std::future_error::_ZTVSt12future_error) + 16u) + std::logic_error (0x0x7f1d770057b8) 0 + primary-for std::future_error (0x0x7f1d77005750) + std::exception (0x0x7f1d77003780) 0 nearly-empty + primary-for std::logic_error (0x0x7f1d770057b8) + +Class std::__future_base::_Result_base::_Deleter + size=1 align=1 + base size=0 base align=1 +std::__future_base::_Result_base::_Deleter (0x0x7f1d770038a0) 0 empty + +Vtable for std::__future_base::_Result_base +std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class std::__future_base::_Result_base + size=16 align=8 + base size=16 base align=8 +std::__future_base::_Result_base (0x0x7f1d77003840) 0 + vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16u) + +Class std::__future_base::_State_baseV2::__exception_ptr_tag + size=1 align=1 + base size=0 base align=1 +std::__future_base::_State_baseV2::__exception_ptr_tag (0x0x7f1d76cf7de0) 0 empty + +Class std::__future_base::_State_baseV2::_Make_ready + size=32 align=8 + base size=32 base align=8 +std::__future_base::_State_baseV2::_Make_ready (0x0x7f1d76cf6d68) 0 + std::__at_thread_exit_elt (0x0x7f1d76cf7ea0) 0 + +Vtable for std::__future_base::_State_baseV2 +std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base13_State_baseV2E) +16 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +24 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +32 (int (*)(...))std::__future_base::_State_baseV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_State_baseV2 + size=32 align=8 + base size=28 base align=8 +std::__future_base::_State_baseV2 (0x0x7f1d77003a20) 0 + vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16u) + +Class std::__future_base + size=1 align=1 + base size=0 base align=1 +std::__future_base (0x0x7f1d770037e0) 0 empty + +Vtable for std::__future_base::_Async_state_commonV2 +std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base21_Async_state_commonV2E) +16 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +24 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +32 (int (*)(...))std::__future_base::_Async_state_commonV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_Async_state_commonV2 + size=48 align=8 + base size=44 base align=8 +std::__future_base::_Async_state_commonV2 (0x0x7f1d76abd958) 0 + vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16u) + std::__future_base::_State_baseV2 (0x0x7f1d76aa9d80) 0 + primary-for std::__future_base::_Async_state_commonV2 (0x0x7f1d76abd958) + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f1d767184e0) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7f1d7671e410) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7f1d76718480) 0 + primary-for QThread (0x0x7f1d7671e410) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f1d76718600) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7f1d7671e478) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7f1d767185a0) 0 + primary-for QThreadPool (0x0x7f1d7671e478) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f1d76718660) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f1d76718780) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7f1d7671e4e0) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7f1d76718720) 0 + primary-for QTimeLine (0x0x7f1d7671e4e0) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f1d76718840) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7f1d7671e548) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7f1d767187e0) 0 + primary-for QTimer (0x0x7f1d7671e548) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f1d76718f00) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f1d76718ea0) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f1d767ff4e0) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7f1d7671e5b0) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7f1d767ff480) 0 + primary-for QTranslator (0x0x7f1d7671e5b0) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f1d767ff600) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f1d7651bcc0) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f1d765b7360) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f1d765b7960) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f1d765b79c0) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f1d765b7c60) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f1d765e4a28) 0 + QVector (0x0x7f1d7666e060) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f1d7666e0c0) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f1d7666e360) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f1d7666e600) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7f1d7666e8a0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f1d7666e900) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f1d7635a360) 0 + +Class QGeoAddress + size=8 align=8 + base size=8 base align=8 +QGeoAddress (0x0x7f1d7635a480) 0 + +Class QGeoCoordinate + size=8 align=8 + base size=8 base align=8 +QGeoCoordinate (0x0x7f1d7635ac00) 0 + +Class QGeoShape + size=8 align=8 + base size=8 base align=8 +QGeoShape (0x0x7f1d763ce060) 0 + +Class QGeoAreaMonitorInfo + size=8 align=8 + base size=8 base align=8 +QGeoAreaMonitorInfo (0x0x7f1d763ce4e0) 0 + +Class QGeoPositionInfo + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfo (0x0x7f1d763ce5a0) 0 + +Class QGeoPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoPositionInfoSource::QPrivateSignal (0x0x7f1d763ce780) 0 empty + +Vtable for QGeoPositionInfoSource +QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QGeoPositionInfoSource) +16 (int (*)(...))QGeoPositionInfoSource::metaObject +24 (int (*)(...))QGeoPositionInfoSource::qt_metacast +32 (int (*)(...))QGeoPositionInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoPositionInfoSource (0x0x7f1d7639a478) 0 + vptr=((& QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource) + 16u) + QObject (0x0x7f1d763ce720) 0 + primary-for QGeoPositionInfoSource (0x0x7f1d7639a478) + +Class QGeoAreaMonitorSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoAreaMonitorSource::QPrivateSignal (0x0x7f1d763ce9c0) 0 empty + +Vtable for QGeoAreaMonitorSource +QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QGeoAreaMonitorSource) +16 (int (*)(...))QGeoAreaMonitorSource::metaObject +24 (int (*)(...))QGeoAreaMonitorSource::qt_metacast +32 (int (*)(...))QGeoAreaMonitorSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoAreaMonitorSource::setPositionInfoSource +120 (int (*)(...))QGeoAreaMonitorSource::positionInfoSource +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoAreaMonitorSource + size=24 align=8 + base size=24 base align=8 +QGeoAreaMonitorSource (0x0x7f1d7639a5b0) 0 + vptr=((& QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource) + 16u) + QObject (0x0x7f1d763ce960) 0 + primary-for QGeoAreaMonitorSource (0x0x7f1d7639a5b0) + +Class QGeoRectangle + size=8 align=8 + base size=8 base align=8 +QGeoRectangle (0x0x7f1d7639a618) 0 + QGeoShape (0x0x7f1d763cea20) 0 + +Class QGeoCircle + size=8 align=8 + base size=8 base align=8 +QGeoCircle (0x0x7f1d7639a8f0) 0 + QGeoShape (0x0x7f1d763cef00) 0 + +Class QGeoLocation + size=8 align=8 + base size=8 base align=8 +QGeoLocation (0x0x7f1d764c1300) 0 + +Class QGeoPath + size=8 align=8 + base size=8 base align=8 +QGeoPath (0x0x7f1d764eb138) 0 + QGeoShape (0x0x7f1d764c1a80) 0 + +Class QGeoPolygon + size=8 align=8 + base size=8 base align=8 +QGeoPolygon (0x0x7f1d764eb340) 0 + QGeoShape (0x0x7f1d764c1e40) 0 + +Class QGeoSatelliteInfo + size=8 align=8 + base size=8 base align=8 +QGeoSatelliteInfo (0x0x7f1d76121240) 0 + +Class QGeoSatelliteInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoSatelliteInfoSource::QPrivateSignal (0x0x7f1d76121300) 0 empty + +Vtable for QGeoSatelliteInfoSource +QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QGeoSatelliteInfoSource) +16 (int (*)(...))QGeoSatelliteInfoSource::metaObject +24 (int (*)(...))QGeoSatelliteInfoSource::qt_metacast +32 (int (*)(...))QGeoSatelliteInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoSatelliteInfoSource::setUpdateInterval +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual + +Class QGeoSatelliteInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoSatelliteInfoSource (0x0x7f1d764eb548) 0 + vptr=((& QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource) + 16u) + QObject (0x0x7f1d761212a0) 0 + primary-for QGeoSatelliteInfoSource (0x0x7f1d764eb548) + +Vtable for QGeoPositionInfoSourceFactory +QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI29QGeoPositionInfoSourceFactory) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactory + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactory (0x0x7f1d761213c0) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory) + 16u) + +Class QNmeaPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNmeaPositionInfoSource::QPrivateSignal (0x0x7f1d761214e0) 0 empty + +Vtable for QNmeaPositionInfoSource +QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource: 24u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QNmeaPositionInfoSource) +16 (int (*)(...))QNmeaPositionInfoSource::metaObject +24 (int (*)(...))QNmeaPositionInfoSource::qt_metacast +32 (int (*)(...))QNmeaPositionInfoSource::qt_metacall +40 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +48 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QNmeaPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))QNmeaPositionInfoSource::lastKnownPosition +136 (int (*)(...))QNmeaPositionInfoSource::supportedPositioningMethods +144 (int (*)(...))QNmeaPositionInfoSource::minimumUpdateInterval +152 (int (*)(...))QNmeaPositionInfoSource::error +160 (int (*)(...))QNmeaPositionInfoSource::startUpdates +168 (int (*)(...))QNmeaPositionInfoSource::stopUpdates +176 (int (*)(...))QNmeaPositionInfoSource::requestUpdate +184 (int (*)(...))QNmeaPositionInfoSource::parsePosInfoFromNmeaData + +Class QNmeaPositionInfoSource + size=32 align=8 + base size=32 base align=8 +QNmeaPositionInfoSource (0x0x7f1d764eb5b0) 0 + vptr=((& QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource) + 16u) + QGeoPositionInfoSource (0x0x7f1d764eb618) 0 + primary-for QNmeaPositionInfoSource (0x0x7f1d764eb5b0) + QObject (0x0x7f1d76121480) 0 + primary-for QGeoPositionInfoSource (0x0x7f1d764eb618) + diff --git a/tests/auto/bic/data/QtPositioning.5.12.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtPositioning.5.12.0.linux-gcc-amd64.txt new file mode 100644 index 0000000..faae30f --- /dev/null +++ b/tests/auto/bic/data/QtPositioning.5.12.0.linux-gcc-amd64.txt @@ -0,0 +1,4838 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7f7e246782a0) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7f7e246bfa20) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7f7e246bfc60) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7f7e246bfea0) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7f7e2226a120) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7f7e2226a2a0) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7f7e2226a660) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7f7e222f5de0) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7f7e222f5ea0) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7f7e22326240) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7f7e22326300) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7f7e223263c0) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7f7e22326480) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7f7e22326720) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7f7e22326900) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f7e22326d80) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f7e22326de0) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f7e223e0a80) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f7e223e0ae0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f7e2232a5b0) 0 empty + std::input_iterator_tag (0x0x7f7e223e0b40) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f7e2232a618) 0 empty + std::forward_iterator_tag (0x0x7f7e2232a680) 0 empty + std::input_iterator_tag (0x0x7f7e223e0ba0) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f7e2232a6e8) 0 empty + std::bidirectional_iterator_tag (0x0x7f7e2232a750) 0 empty + std::forward_iterator_tag (0x0x7f7e2232a7b8) 0 empty + std::input_iterator_tag (0x0x7f7e223e0c00) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7f7e2241d8a0) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7f7e2241d900) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7f7e2241d960) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7f7e2241d9c0) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7f7e2241da20) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7f7e220fb540) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f7e220fb780) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f7e220fb840) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f7e220fb8a0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f7e220fb960) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f7e220fb9c0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f7e220fbe40) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f7e220fbea0) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7f7e220fbf00) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7f7e2232ad00) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7f7e220fbf60) 0 nearly-empty + primary-for std::bad_exception (0x0x7f7e2232ad00) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7f7e22245000) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7f7e22245060) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16u) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7f7e2232af08) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7f7e22245480) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f7e2232af08) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7f7e2232af70) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16u) + std::bad_alloc (0x0x7f7e21e75000) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7f7e2232af70) + std::exception (0x0x7f7e222454e0) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f7e21e75000) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f7e22245540) 0 empty + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7f7e21f13180) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f7e21f13e40) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f7e21f13ea0) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7f7e21d65d80) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7f7e21d65de0) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f7e21d65ea0) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f7e21d65f00) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f7e21d65f60) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f7e21dfc000) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f7e21dfc120) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f7e21dfc180) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f7e21dfc5a0) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f7e21dfc600) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7f7e21c2ede0) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7f7e21c2ee40) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f7e218fdde0) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f7e2169ec00) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f7e218f0d68) 0 + std::iterator (0x0x7f7e2169ecc0) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f7e218f0dd0) 0 + std::_Bit_iterator_base (0x0x7f7e218f0e38) 0 + std::iterator (0x0x7f7e2169ed20) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f7e218f0ea0) 0 + std::_Bit_iterator_base (0x0x7f7e218f0f08) 0 + std::iterator (0x0x7f7e2169ed80) 0 empty + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7f7e21498ba0) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7f7e215cd960) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7f7e215cd900) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7f7e21361900) 0 + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f7e1ff9f420) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f7e1ff9f480) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f7e20046f00) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f7e20046f60) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f7e1fc8f000) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f7e1fc8f060) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f7e1fc8f300) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7f7e1fc8f840) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7f7e1fc55c30) 0 + std::__atomic_flag_base (0x0x7f7e1fc8f8a0) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f7e1fb293a8) 0 + QAtomicInteger (0x0x7f7e1fb29410) 0 + QBasicAtomicInteger (0x0x7f7e1f8eb000) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f7e1f7be5a0) 0 empty + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f7e1f51f780) 0 + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f7e1f51f8a0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f7e1f563000) 0 + QGenericArgument (0x0x7f7e1f51f900) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f7e1f51fa80) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f7e1f51fb40) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f7e1f602ba0) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f7e1f602c00) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f7e1f602ea0) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f7e1f602f00) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7f7e1f2f22a0) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f7e1f2f2300) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7f7e1f2f2360) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f7e1f2f23c0) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f7e1f2f2420) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7f7e1f2f27e0) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7f7e1f336618) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16u) + std::exception (0x0x7f7e1f2f28a0) 0 nearly-empty + primary-for std::logic_error (0x0x7f7e1f336618) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7f7e1f336680) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16u) + std::logic_error (0x0x7f7e1f3366e8) 0 + primary-for std::domain_error (0x0x7f7e1f336680) + std::exception (0x0x7f7e1f2f2900) 0 nearly-empty + primary-for std::logic_error (0x0x7f7e1f3366e8) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7f7e1f336750) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16u) + std::logic_error (0x0x7f7e1f3367b8) 0 + primary-for std::invalid_argument (0x0x7f7e1f336750) + std::exception (0x0x7f7e1f2f2960) 0 nearly-empty + primary-for std::logic_error (0x0x7f7e1f3367b8) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7f7e1f336820) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16u) + std::logic_error (0x0x7f7e1f336888) 0 + primary-for std::length_error (0x0x7f7e1f336820) + std::exception (0x0x7f7e1f2f29c0) 0 nearly-empty + primary-for std::logic_error (0x0x7f7e1f336888) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7f7e1f3368f0) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16u) + std::logic_error (0x0x7f7e1f336958) 0 + primary-for std::out_of_range (0x0x7f7e1f3368f0) + std::exception (0x0x7f7e1f2f2a20) 0 nearly-empty + primary-for std::logic_error (0x0x7f7e1f336958) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7f7e1f3369c0) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16u) + std::exception (0x0x7f7e1f2f2a80) 0 nearly-empty + primary-for std::runtime_error (0x0x7f7e1f3369c0) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7f7e1f336a28) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16u) + std::runtime_error (0x0x7f7e1f336a90) 0 + primary-for std::range_error (0x0x7f7e1f336a28) + std::exception (0x0x7f7e1f2f2ae0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f7e1f336a90) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7f7e1f336af8) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16u) + std::runtime_error (0x0x7f7e1f336b60) 0 + primary-for std::overflow_error (0x0x7f7e1f336af8) + std::exception (0x0x7f7e1f2f2b40) 0 nearly-empty + primary-for std::runtime_error (0x0x7f7e1f336b60) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7f7e1f336bc8) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16u) + std::runtime_error (0x0x7f7e1f336c30) 0 + primary-for std::underflow_error (0x0x7f7e1f336bc8) + std::exception (0x0x7f7e1f2f2ba0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f7e1f336c30) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7f7e1f2f2d20) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16u) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7f7e1f2f2f60) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7f7e1f416120) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7f7e1f439068) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16u) + std::runtime_error (0x0x7f7e1f4390d0) 0 + primary-for std::system_error (0x0x7f7e1f439068) + std::exception (0x0x7f7e1f416360) 0 nearly-empty + primary-for std::runtime_error (0x0x7f7e1f4390d0) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7f7e1f439c98) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16u) + std::system_error (0x0x7f7e1f439d00) 0 + primary-for std::ios_base::failure (0x0x7f7e1f439c98) + std::runtime_error (0x0x7f7e1f439d68) 0 + primary-for std::system_error (0x0x7f7e1f439d00) + std::exception (0x0x7f7e1f416660) 0 nearly-empty + primary-for std::runtime_error (0x0x7f7e1f439d68) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f7e1f4166c0) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f7e1f416720) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f7e1f416780) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7f7e1f416600) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7f7e1f416f00) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f7e1f176600) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7f7e1ecf8680 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f7e1ecf8750 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7f7e1ecf8af8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f7e1ecf8bc8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f7e1ef13e40) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f7e1ef13ea0) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f7e1ea8d240) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f7e1ea8d5a0) 0 + +Class QStringView + size=16 align=8 + base size=16 base align=8 +QStringView (0x0x7f7e1ea8da20) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f7e1ebab8a0) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f7e1ebabf00) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f7e1ebabea0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f7e1e688000) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f7e1e688c00) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7f7e1e7ea8a0) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7f7e1e7ea900) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f7e1e7ea960) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7f7e1e7ead20) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7f7e1e7ead80) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7f7e1e56f618) 0 empty + QListData::NotIndirectLayout (0x0x7f7e1e7eade0) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7f7e1e63f3f0) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f7e1e7eae40) 0 empty + QListData::NotIndirectLayout (0x0x7f7e1e7eaea0) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7f7e1e56f680) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f7e1e7eaf00) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f7e1e7eaf60) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f7e1e7eacc0) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f7e1e250420) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f7e1e3f1660) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f7e1e3f1600) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f7e1e4120d0) 0 + QList (0x0x7f7e1e412138) 0 + QListSpecialMethods (0x0x7f7e1e3f1840) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f7e1e3f1c60) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f7e1e0e1840) 0 + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7f7e1e0e1ea0) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7f7e1deb6060) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7f7e1deb6120) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7f7e1e412a28) 0 + std::__uses_alloc_base (0x0x7f7e1deb60c0) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7f7e1dfa8180) 0 empty + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f7e1dfa83c0) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f7e1dfa8480) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f7e1dfa85a0) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f7e1dfa8720) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f7e1dfa8b40) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7f7e1dfa8c60) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f7e1dd32600) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f7e1dd32a20) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f7e1dd32d20) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7f7e1dc2f720) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7f7e1d97e5a0) 0 empty + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7f7e1d97e600) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f7e1d97e7e0) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7f7e1d97e780) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7f7e1da44a80) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7f7e1da44ae0) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f7e1da44ba0) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7f7e1da45d68) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7f7e1da44b40) 0 + primary-for QAbstractAnimation (0x0x7f7e1da45d68) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f7e1da44c60) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7f7e1da45dd0) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7f7e1da44c00) 0 + primary-for QAnimationDriver (0x0x7f7e1da45dd0) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f7e1da44d20) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7f7e1da45e38) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7f7e1da44cc0) 0 + primary-for QEventLoop (0x0x7f7e1da45e38) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f7e1da44f00) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f7e1d6fb000) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f7e1d6fb060) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7f7e1da45f70) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7f7e1da44f60) 0 + primary-for QAbstractEventDispatcher (0x0x7f7e1da45f70) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7f7e1d6fb300) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16u) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7f7e1d717068) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16u) + std::exception (0x0x7f7e1d6fb360) 0 nearly-empty + primary-for std::bad_cast (0x0x7f7e1d717068) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7f7e1d7170d0) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16u) + std::exception (0x0x7f7e1d6fb3c0) 0 nearly-empty + primary-for std::bad_typeid (0x0x7f7e1d7170d0) + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7f7e1d491340) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16u) + std::exception (0x0x7f7e1d495480) 0 nearly-empty + primary-for std::bad_function_call (0x0x7f7e1d491340) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7f7e1d495540) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7f7e1d4955a0) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7f7e1d4956c0) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f7e1d495ba0) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f7e1d54c120) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f7e1d54c4e0) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7f7e1d54c480) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f7e1d54c540) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f7e1d54cde0) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f7e1d54cea0) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f7e1d54ce40) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f7e1d54cf00) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f7e1d54cd80) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f7e1d446a20) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f7e1d0dc0c0) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f7e1d0dc060) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f7e1d0dc180) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f7e1d0dc120) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f7e1d200480) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f7e1d200b40) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f7e1cfe62a0) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7f7e1cfe90d0) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7f7e1cfe6240) 0 + primary-for QAbstractItemModel (0x0x7f7e1cfe90d0) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f7e1cfe6b40) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractTableModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7f7e1cfe97b8) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7f7e1cfe9820) 0 + primary-for QAbstractTableModel (0x0x7f7e1cfe97b8) + QObject (0x0x7f7e1cfe6ae0) 0 + primary-for QAbstractItemModel (0x0x7f7e1cfe9820) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f7e1cfe6c00) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractListModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7f7e1cfe9888) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7f7e1cfe98f0) 0 + primary-for QAbstractListModel (0x0x7f7e1cfe9888) + QObject (0x0x7f7e1cfe6ba0) 0 + primary-for QAbstractItemModel (0x0x7f7e1cfe98f0) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f7e1cfe6ea0) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f7e1cfe6f60) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7f7e1cfe9a28) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7f7e1cfe9a90) 0 + primary-for QAbstractProxyModel (0x0x7f7e1cfe9a28) + QObject (0x0x7f7e1cfe6f00) 0 + primary-for QAbstractItemModel (0x0x7f7e1cfe9a90) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f7e1cd40060) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7f7e1cfe9af8) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7f7e1cd40000) 0 + primary-for QAbstractState (0x0x7f7e1cfe9af8) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f7e1cd40120) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7f7e1cfe9b60) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7f7e1cd400c0) 0 + primary-for QAbstractTransition (0x0x7f7e1cfe9b60) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f7e1cd401e0) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7f7e1cfe9bc8) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7f7e1cfe9c30) 0 + primary-for QAnimationGroup (0x0x7f7e1cfe9bc8) + QObject (0x0x7f7e1cd40180) 0 + primary-for QAbstractAnimation (0x0x7f7e1cfe9c30) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f7e1cd8ff00) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f7e1cdd21e0) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f7e1cdd22a0) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f7e1cdd25a0) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7f7e1cdd72d8) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7f7e1cdd2540) 0 + primary-for QIODevice (0x0x7f7e1cdd72d8) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f7e1cdd27e0) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7f7e1cdd7410) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7f7e1cdd7478) 0 + primary-for QBuffer (0x0x7f7e1cdd7410) + QObject (0x0x7f7e1cdd2780) 0 + primary-for QIODevice (0x0x7f7e1cdd7478) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f7e1cdd28a0) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f7e1cdd2840) 0 + +Class QStaticByteArrayMatcherBase::Skiptable + size=256 align=1 + base size=256 base align=1 +QStaticByteArrayMatcherBase::Skiptable (0x0x7f7e1cdd29c0) 0 + +Class QStaticByteArrayMatcherBase + size=256 align=16 + base size=256 base align=16 +QStaticByteArrayMatcherBase (0x0x7f7e1cdd2960) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f7e1cdd2ba0) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f7e1cdd2d80) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f7e1cb46060) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7f7e1cb467e0) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7f7e1cb46840) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f7e1cb46780) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f7e1cc07960) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7f7e1cc07f60) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f7e1c922240) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f7e1c922480) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f7e1c922b40) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f7e1c922cc0) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7f7e1c6a3240) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f7e1c6a31e0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f7e1c460540) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f7e1c460600) 0 empty + +Class QCborError + size=4 align=4 + base size=4 base align=4 +QCborError (0x0x7f7e1c4e5960) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f7e1c4e5ae0) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f7e1c571120) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f7e1c571420) 0 + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f7e1c5717e0) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f7e1c2b7ea0) 0 + +Class QCborParserError + size=16 align=8 + base size=12 base align=8 +QCborParserError (0x0x7f7e1c3394e0) 0 + +Class QCborValue + size=24 align=8 + base size=20 base align=8 +QCborValue (0x0x7f7e1c339540) 0 + +Class QCborValueRef + size=16 align=8 + base size=16 base align=8 +QCborValueRef (0x0x7f7e1c19b540) 0 + +Class QCborArray::Iterator + size=16 align=8 + base size=16 base align=8 +QCborArray::Iterator (0x0x7f7e1c19bae0) 0 + +Class QCborArray::ConstIterator + size=16 align=8 + base size=16 base align=8 +QCborArray::ConstIterator (0x0x7f7e1c19bb40) 0 + +Class QCborArray + size=8 align=8 + base size=8 base align=8 +QCborArray (0x0x7f7e1c19ba80) 0 + +Class QCborMap::Iterator + size=16 align=8 + base size=16 base align=8 +QCborMap::Iterator (0x0x7f7e1becaba0) 0 + +Class QCborMap::ConstIterator + size=16 align=8 + base size=16 base align=8 +QCborMap::ConstIterator (0x0x7f7e1becac00) 0 + +Class QCborMap + size=8 align=8 + base size=8 base align=8 +QCborMap (0x0x7f7e1becab40) 0 + +Class qfloat16 + size=2 align=2 + base size=2 base align=2 +qfloat16 (0x0x7f7e1bc8f780) 0 + +Class QCborStreamWriter + size=8 align=8 + base size=8 base align=8 +QCborStreamWriter (0x0x7f7e1bc8fb40) 0 + +Class QCborStreamReader + size=24 align=8 + base size=20 base align=8 +QCborStreamReader (0x0x7f7e1bde6540) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f7e1bde6ba0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f7e1bde6c60) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f7e1bae6c60) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7f7e1bb25120) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7f7e1baf4a28) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7f7e1bb25180) 0 + primary-for QTimerEvent (0x0x7f7e1baf4a28) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7f7e1baf4a90) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7f7e1bb251e0) 0 + primary-for QChildEvent (0x0x7f7e1baf4a90) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7f7e1bb82000) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7f7e1bb256c0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f7e1bb82000) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7f7e1bb82068) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7f7e1bb25720) 0 + primary-for QDeferredDeleteEvent (0x0x7f7e1bb82068) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f7e1bb257e0) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7f7e1bb820d0) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7f7e1bb25780) 0 + primary-for QCoreApplication (0x0x7f7e1bb820d0) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f7e1bb25840) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f7e1bb258a0) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f7e1bb25900) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7f7e1bb259c0) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f7e1bb25ea0) 0 + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7f7e1b8453c0) 0 + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f7e1b972240) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7f7e1b962548) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7f7e1b9625b0) 0 + primary-for QFileDevice (0x0x7f7e1b962548) + QObject (0x0x7f7e1b9721e0) 0 + primary-for QIODevice (0x0x7f7e1b9625b0) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f7e1b972480) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7f7e1b9626e8) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7f7e1b962750) 0 + primary-for QFile (0x0x7f7e1b9626e8) + QIODevice (0x0x7f7e1b9627b8) 0 + primary-for QFileDevice (0x0x7f7e1b962750) + QObject (0x0x7f7e1b972420) 0 + primary-for QIODevice (0x0x7f7e1b9627b8) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f7e1b972660) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f7e1b972a80) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f7e1b68e0c0) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f7e1b68e300) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f7e1b774720) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7f7e1b7777b8) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7f7e1b777820) 0 + primary-for QEventTransition (0x0x7f7e1b7777b8) + QObject (0x0x7f7e1b7746c0) 0 + primary-for QAbstractTransition (0x0x7f7e1b777820) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7f7e1b777888) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7f7e1b774780) 0 nearly-empty + primary-for QException (0x0x7f7e1b777888) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7f7e1b7778f0) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7f7e1b777958) 0 nearly-empty + primary-for QUnhandledException (0x0x7f7e1b7778f0) + std::exception (0x0x7f7e1b7747e0) 0 nearly-empty + primary-for QException (0x0x7f7e1b777958) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f7e1b774840) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f7e1b774900) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f7e1b774960) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f7e1b774a80) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7f7e1b7779c0) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7f7e1b774a20) 0 + primary-for QFileSelector (0x0x7f7e1b7779c0) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f7e1b774b40) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7f7e1b777a28) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7f7e1b774ae0) 0 + primary-for QFileSystemWatcher (0x0x7f7e1b777a28) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f7e1b774c00) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7f7e1b777a90) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7f7e1b777af8) 0 + primary-for QFinalState (0x0x7f7e1b777a90) + QObject (0x0x7f7e1b774ba0) 0 + primary-for QAbstractState (0x0x7f7e1b777af8) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f7e1b774c60) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f7e1b774cc0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f7e1b777c30) 0 + QBasicMutex (0x0x7f7e1b774ea0) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f7e1b774f00) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f7e1b774f60) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f7e1b4d4000) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7f7e1b4d4120) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7f7e1b4d4960) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f7e1b5a6180) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 0u +48 0u +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7f7e1b51ad68) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7f7e1b5a6120) 0 + primary-for QFutureWatcherBase (0x0x7f7e1b51ad68) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f7e1b5a6780) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7f7e1b5e4680) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7f7e1b5e46e8) 0 + primary-for QHistoryState (0x0x7f7e1b5e4680) + QObject (0x0x7f7e1b5a6720) 0 + primary-for QAbstractState (0x0x7f7e1b5e46e8) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f7e1b5a6840) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7f7e1b5e4750) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7f7e1b5e47b8) 0 + primary-for QIdentityProxyModel (0x0x7f7e1b5e4750) + QAbstractItemModel (0x0x7f7e1b5e4820) 0 + primary-for QAbstractProxyModel (0x0x7f7e1b5e47b8) + QObject (0x0x7f7e1b5a67e0) 0 + primary-for QAbstractItemModel (0x0x7f7e1b5e4820) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f7e1b5a68a0) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f7e1b5a6f60) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7f7e1b283068) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7f7e1b5a6f00) 0 + primary-for QItemSelectionModel (0x0x7f7e1b283068) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f7e1b283270) 0 + QList (0x0x7f7e1b2832d8) 0 + QListSpecialMethods (0x0x7f7e1b2a22a0) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f7e1b2a2780) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f7e1b060ea0) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7f7e1b0d7420) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7f7e1b0d7480) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f7e1b0d7660) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f7e1b0d76c0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f7e1b0d7600) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f7e1b197900) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f7e1b197960) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f7e1b226000) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f7e1b226060) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f7e1b197f60) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f7e1aeca300) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7f7e1aec8618) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7f7e1aeca2a0) 0 + primary-for QLibrary (0x0x7f7e1aec8618) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7f7e1aeca9c0) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7f7e1aeca4e0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f7e1aecaea0) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f7e1aecaf00) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f7e1afdb1e0) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f7e1afdb7e0) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f7e1ac6b180) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7f7e1ac6b780) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f7e1ac6bae0) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7f7e1ac6bc60) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f7e1ac6bc00) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f7e1ac6bde0) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7f7e1adf00c0) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f7e1adf0720) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f7e1adf0780) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f7e1adf0d80) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f7e1a9d90c0) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f7e1a9d9120) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f7e1a9d9420) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7f7e1a9c0888) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7f7e1a9d93c0) 0 + primary-for QMimeData (0x0x7f7e1a9c0888) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f7e1a9d9480) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f7e1a9d9780) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f7e1a9d9840) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7f7e1a9c0a90) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7f7e1a9d97e0) 0 + primary-for QObjectCleanupHandler (0x0x7f7e1a9c0a90) + +Class QOperatingSystemVersion + size=16 align=4 + base size=16 base align=4 +QOperatingSystemVersion (0x0x7f7e1a9d98a0) 0 + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f7e1aa6f060) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7f7e1aa691a0) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7f7e1aa69208) 0 + primary-for QParallelAnimationGroup (0x0x7f7e1aa691a0) + QAbstractAnimation (0x0x7f7e1aa69270) 0 + primary-for QAnimationGroup (0x0x7f7e1aa69208) + QObject (0x0x7f7e1aa6f000) 0 + primary-for QAbstractAnimation (0x0x7f7e1aa69270) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f7e1aa6f120) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7f7e1aa692d8) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7f7e1aa69340) 0 + primary-for QPauseAnimation (0x0x7f7e1aa692d8) + QObject (0x0x7f7e1aa6f0c0) 0 + primary-for QAbstractAnimation (0x0x7f7e1aa69340) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f7e1aa6f300) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f7e1aa6f600) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7f7e1aa69548) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7f7e1aa6f5a0) 0 + primary-for QPluginLoader (0x0x7f7e1aa69548) + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f7e1aa6f660) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f7e1aa6fd20) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7f7e1aa69bc8) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7f7e1aa69c30) 0 + primary-for QProcess (0x0x7f7e1aa69bc8) + QObject (0x0x7f7e1aa6fcc0) 0 + primary-for QIODevice (0x0x7f7e1aa69c30) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f7e1aa6fde0) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7f7e1aa69c98) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7f7e1aa69d00) 0 + primary-for QVariantAnimation (0x0x7f7e1aa69c98) + QObject (0x0x7f7e1aa6fd80) 0 + primary-for QAbstractAnimation (0x0x7f7e1aa69d00) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f7e1aa6fea0) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7f7e1aa69dd0) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7f7e1aa69e38) 0 + primary-for QPropertyAnimation (0x0x7f7e1aa69dd0) + QAbstractAnimation (0x0x7f7e1aa69ea0) 0 + primary-for QVariantAnimation (0x0x7f7e1aa69e38) + QObject (0x0x7f7e1aa6fe40) 0 + primary-for QAbstractAnimation (0x0x7f7e1aa69ea0) + +Class QRandomGenerator::Storage + size=2504 align=8 + base size=2504 base align=8 +QRandomGenerator::Storage (0x0x7f7e1a755000) 0 + +Class QRandomGenerator + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator (0x0x7f7e1aa6ff60) 0 + +Class QRandomGenerator64 + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator64 (0x0x7f7e1a7d51a0) 0 + QRandomGenerator (0x0x7f7e1a7a1f60) 0 + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f7e1a7ff060) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f7e1a7ff300) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f7e1a7ff3c0) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f7e1a7ff480) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f7e1a7ff720) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f7e1a7ff9c0) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f7e1a7ffc60) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f7e1a7fff00) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f7e1a6450c0) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7f7e1a7d5d00) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7f7e1a7d5d68) 0 + primary-for QSaveFile (0x0x7f7e1a7d5d00) + QIODevice (0x0x7f7e1a7d5dd0) 0 + primary-for QFileDevice (0x0x7f7e1a7d5d68) + QObject (0x0x7f7e1a645060) 0 + primary-for QIODevice (0x0x7f7e1a7d5dd0) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f7e1a6451e0) 0 + +Class QSemaphoreReleaser + size=16 align=8 + base size=12 base align=8 +QSemaphoreReleaser (0x0x7f7e1a645360) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f7e1a388960) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7f7e1a38e680) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7f7e1a38e6e8) 0 + primary-for QSequentialAnimationGroup (0x0x7f7e1a38e680) + QAbstractAnimation (0x0x7f7e1a38e750) 0 + primary-for QAnimationGroup (0x0x7f7e1a38e6e8) + QObject (0x0x7f7e1a388900) 0 + primary-for QAbstractAnimation (0x0x7f7e1a38e750) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f7e1a388a20) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7f7e1a38e7b8) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7f7e1a3889c0) 0 + primary-for QSettings (0x0x7f7e1a38e7b8) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f7e1a388ae0) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7f7e1a38e820) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7f7e1a388a80) 0 + primary-for QSharedMemory (0x0x7f7e1a38e820) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f7e1a388ba0) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7f7e1a38e888) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7f7e1a388b40) 0 + primary-for QSignalMapper (0x0x7f7e1a38e888) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f7e1a388c60) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7f7e1a38e8f0) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7f7e1a38e958) 0 + primary-for QSignalTransition (0x0x7f7e1a38e8f0) + QObject (0x0x7f7e1a388c00) 0 + primary-for QAbstractTransition (0x0x7f7e1a38e958) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f7e1a388d20) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7f7e1a38e9c0) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7f7e1a388cc0) 0 + primary-for QSocketNotifier (0x0x7f7e1a38e9c0) + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f7e1a388de0) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7f7e1a38ea28) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7f7e1a38ea90) 0 + primary-for QSortFilterProxyModel (0x0x7f7e1a38ea28) + QAbstractItemModel (0x0x7f7e1a38eaf8) 0 + primary-for QAbstractProxyModel (0x0x7f7e1a38ea90) + QObject (0x0x7f7e1a388d80) 0 + primary-for QAbstractItemModel (0x0x7f7e1a38eaf8) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f7e1a388ea0) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f7e1a451120) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7f7e1a38ec98) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7f7e1a38ed00) 0 + primary-for QState (0x0x7f7e1a38ec98) + QObject (0x0x7f7e1a4510c0) 0 + primary-for QAbstractState (0x0x7f7e1a38ed00) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f7e1a451240) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7f7e1a38eea0) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7f7e1a4512a0) 0 + primary-for QStateMachine::SignalEvent (0x0x7f7e1a38eea0) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7f7e1a38ef08) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7f7e1a451300) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f7e1a38ef08) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7f7e1a38ed68) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7f7e1a38edd0) 0 + primary-for QStateMachine (0x0x7f7e1a38ed68) + QAbstractState (0x0x7f7e1a38ee38) 0 + primary-for QState (0x0x7f7e1a38edd0) + QObject (0x0x7f7e1a4511e0) 0 + primary-for QAbstractState (0x0x7f7e1a38ee38) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7f7e1a451360) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f7e1a4fe2a0) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f7e1a18e660) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7f7e1a163f08) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7f7e1a163f70) 0 + primary-for QStringListModel (0x0x7f7e1a163f08) + QAbstractItemModel (0x0x7f7e1a1ae000) 0 + primary-for QAbstractListModel (0x0x7f7e1a163f70) + QObject (0x0x7f7e1a18e600) 0 + primary-for QAbstractItemModel (0x0x7f7e1a1ae000) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f7e1a18e6c0) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f7e1a18e780) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f7e1a18e8a0) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7f7e1a1ae068) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7f7e1a1ae0d0) 0 + primary-for QTemporaryFile (0x0x7f7e1a1ae068) + QFileDevice (0x0x7f7e1a1ae138) 0 + primary-for QFile (0x0x7f7e1a1ae0d0) + QIODevice (0x0x7f7e1a1ae1a0) 0 + primary-for QFileDevice (0x0x7f7e1a1ae138) + QObject (0x0x7f7e1a18e840) 0 + primary-for QIODevice (0x0x7f7e1a1ae1a0) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f7e1a18e900) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f7e1a18eb40) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 0u +64 0u + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f7e1a18eae0) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f7e1a18ed20) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f7e1a18ed80) 0 + +Class std::__mutex_base + size=40 align=8 + base size=40 base align=8 +std::__mutex_base (0x0x7f7e1a18ede0) 0 + +Class std::__recursive_mutex_base + size=40 align=8 + base size=40 base align=8 +std::__recursive_mutex_base (0x0x7f7e1a18ee40) 0 + +Class std::mutex + size=40 align=8 + base size=40 base align=8 +std::mutex (0x0x7f7e1a1ae3a8) 0 + std::__mutex_base (0x0x7f7e1a18eea0) 0 + +Class std::recursive_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_mutex (0x0x7f7e1a1ae410) 0 + std::__recursive_mutex_base (0x0x7f7e1a18ef00) 0 + +Class std::timed_mutex + size=40 align=8 + base size=40 base align=8 +std::timed_mutex (0x0x7f7e1a2954d0) 0 + std::__mutex_base (0x0x7f7e1a29d060) 0 + std::__timed_mutex_impl (0x0x7f7e1a29d0c0) 0 empty + +Class std::recursive_timed_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_timed_mutex (0x0x7f7e1a295e70) 0 + std::__recursive_mutex_base (0x0x7f7e1a29d180) 0 + std::__timed_mutex_impl (0x0x7f7e1a29d1e0) 0 empty + +Class std::defer_lock_t + size=1 align=1 + base size=0 base align=1 +std::defer_lock_t (0x0x7f7e1a29d240) 0 empty + +Class std::try_to_lock_t + size=1 align=1 + base size=0 base align=1 +std::try_to_lock_t (0x0x7f7e1a29d2a0) 0 empty + +Class std::adopt_lock_t + size=1 align=1 + base size=0 base align=1 +std::adopt_lock_t (0x0x7f7e1a29d300) 0 empty + +Class std::once_flag + size=4 align=4 + base size=4 base align=4 +std::once_flag (0x0x7f7e1a29d540) 0 + +Vtable for __gnu_cxx::__concurrence_lock_error +__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_lock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +24 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +32 (int (*)(...))__gnu_cxx::__concurrence_lock_error::what + +Class __gnu_cxx::__concurrence_lock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_lock_error (0x0x7f7e1a1ae548) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16u) + std::exception (0x0x7f7e1a29d600) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_lock_error (0x0x7f7e1a1ae548) + +Vtable for __gnu_cxx::__concurrence_unlock_error +__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx26__concurrence_unlock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +24 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +32 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::what + +Class __gnu_cxx::__concurrence_unlock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_unlock_error (0x0x7f7e1a1ae5b0) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16u) + std::exception (0x0x7f7e1a29d6c0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7f7e1a1ae5b0) + +Vtable for __gnu_cxx::__concurrence_broadcast_error +__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx29__concurrence_broadcast_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +24 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +32 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::what + +Class __gnu_cxx::__concurrence_broadcast_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_broadcast_error (0x0x7f7e1a1ae618) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16u) + std::exception (0x0x7f7e1a29d780) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7f7e1a1ae618) + +Vtable for __gnu_cxx::__concurrence_wait_error +__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_wait_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +24 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +32 (int (*)(...))__gnu_cxx::__concurrence_wait_error::what + +Class __gnu_cxx::__concurrence_wait_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_wait_error (0x0x7f7e1a1ae6e8) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16u) + std::exception (0x0x7f7e1a29d840) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_wait_error (0x0x7f7e1a1ae6e8) + +Class __gnu_cxx::__mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__mutex (0x0x7f7e1a29d900) 0 + +Class __gnu_cxx::__recursive_mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__recursive_mutex (0x0x7f7e1a29d960) 0 + +Class __gnu_cxx::__scoped_lock + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__scoped_lock (0x0x7f7e1a29d9c0) 0 + +Class __gnu_cxx::__cond + size=48 align=8 + base size=48 base align=8 +__gnu_cxx::__cond (0x0x7f7e1a29da20) 0 + +Vtable for std::bad_weak_ptr +std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12bad_weak_ptr) +16 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +24 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +32 (int (*)(...))std::bad_weak_ptr::what + +Class std::bad_weak_ptr + size=8 align=8 + base size=8 base align=8 +std::bad_weak_ptr (0x0x7f7e1a1ae9c0) 0 nearly-empty + vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16u) + std::exception (0x0x7f7e1a29dd80) 0 nearly-empty + primary-for std::bad_weak_ptr (0x0x7f7e1a1ae9c0) + +Class std::_Sp_make_shared_tag + size=1 align=1 + base size=0 base align=1 +std::_Sp_make_shared_tag (0x0x7f7e19fef600) 0 empty + +Class std::_Sp_locker + size=2 align=1 + base size=2 base align=1 +std::_Sp_locker (0x0x7f7e19fefde0) 0 + +Class std::thread::id + size=8 align=8 + base size=8 base align=8 +std::thread::id (0x0x7f7e19d7f000) 0 + +Vtable for std::thread::_Impl_base +std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6thread10_Impl_baseE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class std::thread::_Impl_base + size=24 align=8 + base size=24 base align=8 +std::thread::_Impl_base (0x0x7f7e19d7f060) 0 + vptr=((& std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE) + 16u) + +Class std::thread + size=8 align=8 + base size=8 base align=8 +std::thread (0x0x7f7e19feff60) 0 + +Class std::condition_variable + size=48 align=8 + base size=48 base align=8 +std::condition_variable (0x0x7f7e19eb6c60) 0 + +Class std::__at_thread_exit_elt + size=16 align=8 + base size=16 base align=8 +std::__at_thread_exit_elt (0x0x7f7e19eb6d20) 0 + +Class std::_V2::condition_variable_any + size=64 align=8 + base size=64 base align=8 +std::_V2::condition_variable_any (0x0x7f7e19eb6d80) 0 + +Class std::__atomic_futex_unsigned_base + size=1 align=1 + base size=0 base align=1 +std::__atomic_futex_unsigned_base (0x0x7f7e19b83420) 0 empty + +Vtable for std::future_error +std::future_error::_ZTVSt12future_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12future_error) +16 (int (*)(...))std::future_error::~future_error +24 (int (*)(...))std::future_error::~future_error +32 (int (*)(...))std::future_error::what + +Class std::future_error + size=32 align=8 + base size=32 base align=8 +std::future_error (0x0x7f7e19b73d00) 0 + vptr=((& std::future_error::_ZTVSt12future_error) + 16u) + std::logic_error (0x0x7f7e19b73d68) 0 + primary-for std::future_error (0x0x7f7e19b73d00) + std::exception (0x0x7f7e19b83540) 0 nearly-empty + primary-for std::logic_error (0x0x7f7e19b73d68) + +Class std::__future_base::_Result_base::_Deleter + size=1 align=1 + base size=0 base align=1 +std::__future_base::_Result_base::_Deleter (0x0x7f7e19b83660) 0 empty + +Vtable for std::__future_base::_Result_base +std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class std::__future_base::_Result_base + size=16 align=8 + base size=16 base align=8 +std::__future_base::_Result_base (0x0x7f7e19b83600) 0 + vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16u) + +Class std::__future_base::_State_baseV2::__exception_ptr_tag + size=1 align=1 + base size=0 base align=1 +std::__future_base::_State_baseV2::__exception_ptr_tag (0x0x7f7e19cdeba0) 0 empty + +Class std::__future_base::_State_baseV2::_Make_ready + size=32 align=8 + base size=32 base align=8 +std::__future_base::_State_baseV2::_Make_ready (0x0x7f7e19d01340) 0 + std::__at_thread_exit_elt (0x0x7f7e19cdec60) 0 + +Vtable for std::__future_base::_State_baseV2 +std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base13_State_baseV2E) +16 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +24 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +32 (int (*)(...))std::__future_base::_State_baseV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_State_baseV2 + size=32 align=8 + base size=28 base align=8 +std::__future_base::_State_baseV2 (0x0x7f7e19b837e0) 0 + vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16u) + +Class std::__future_base + size=1 align=1 + base size=0 base align=1 +std::__future_base (0x0x7f7e19b835a0) 0 empty + +Vtable for std::__future_base::_Async_state_commonV2 +std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base21_Async_state_commonV2E) +16 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +24 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +32 (int (*)(...))std::__future_base::_Async_state_commonV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_Async_state_commonV2 + size=48 align=8 + base size=44 base align=8 +std::__future_base::_Async_state_commonV2 (0x0x7f7e19649f08) 0 + vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16u) + std::__future_base::_State_baseV2 (0x0x7f7e19654b40) 0 + primary-for std::__future_base::_Async_state_commonV2 (0x0x7f7e19649f08) + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f7e196bb2a0) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7f7e196b09c0) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7f7e196bb240) 0 + primary-for QThread (0x0x7f7e196b09c0) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f7e196bb3c0) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7f7e196b0a28) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7f7e196bb360) 0 + primary-for QThreadPool (0x0x7f7e196b0a28) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f7e196bb420) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f7e196bb540) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7f7e196b0a90) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7f7e196bb4e0) 0 + primary-for QTimeLine (0x0x7f7e196b0a90) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f7e196bb600) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7f7e196b0af8) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7f7e196bb5a0) 0 + primary-for QTimer (0x0x7f7e196b0af8) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f7e196bbd20) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f7e196bbcc0) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f7e193a4300) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7f7e1936c680) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7f7e193a42a0) 0 + primary-for QTranslator (0x0x7f7e1936c680) + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f7e193a4360) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f7e193a49c0) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f7e193a4a20) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f7e193a4cc0) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f7e194303a8) 0 + QVector (0x0x7f7e194570c0) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f7e19457120) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f7e194573c0) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f7e19457660) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7f7e19457900) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f7e19457960) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f7e191583c0) 0 + +Class QGeoAddress + size=8 align=8 + base size=8 base align=8 +QGeoAddress (0x0x7f7e191584e0) 0 + +Class QGeoCoordinate + size=8 align=8 + base size=8 base align=8 +QGeoCoordinate (0x0x7f7e19158c60) 0 + +Class QGeoShape + size=8 align=8 + base size=8 base align=8 +QGeoShape (0x0x7f7e191ca0c0) 0 + +Class QGeoAreaMonitorInfo + size=8 align=8 + base size=8 base align=8 +QGeoAreaMonitorInfo (0x0x7f7e191ca540) 0 + +Class QGeoPositionInfo + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfo (0x0x7f7e191ca600) 0 + +Class QGeoPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoPositionInfoSource::QPrivateSignal (0x0x7f7e191ca7e0) 0 empty + +Vtable for QGeoPositionInfoSource +QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QGeoPositionInfoSource) +16 (int (*)(...))QGeoPositionInfoSource::metaObject +24 (int (*)(...))QGeoPositionInfoSource::qt_metacast +32 (int (*)(...))QGeoPositionInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoPositionInfoSource (0x0x7f7e1915add0) 0 + vptr=((& QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource) + 16u) + QObject (0x0x7f7e191ca780) 0 + primary-for QGeoPositionInfoSource (0x0x7f7e1915add0) + +Class QGeoAreaMonitorSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoAreaMonitorSource::QPrivateSignal (0x0x7f7e191caa20) 0 empty + +Vtable for QGeoAreaMonitorSource +QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QGeoAreaMonitorSource) +16 (int (*)(...))QGeoAreaMonitorSource::metaObject +24 (int (*)(...))QGeoAreaMonitorSource::qt_metacast +32 (int (*)(...))QGeoAreaMonitorSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoAreaMonitorSource::setPositionInfoSource +120 (int (*)(...))QGeoAreaMonitorSource::positionInfoSource +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoAreaMonitorSource + size=24 align=8 + base size=24 base align=8 +QGeoAreaMonitorSource (0x0x7f7e1915af08) 0 + vptr=((& QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource) + 16u) + QObject (0x0x7f7e191ca9c0) 0 + primary-for QGeoAreaMonitorSource (0x0x7f7e1915af08) + +Class QGeoRectangle + size=8 align=8 + base size=8 base align=8 +QGeoRectangle (0x0x7f7e1915af70) 0 + QGeoShape (0x0x7f7e191caa80) 0 + +Class QGeoCircle + size=8 align=8 + base size=8 base align=8 +QGeoCircle (0x0x7f7e19279270) 0 + QGeoShape (0x0x7f7e191caf60) 0 + +Class QGeoLocation + size=8 align=8 + base size=8 base align=8 +QGeoLocation (0x0x7f7e192bc360) 0 + +Class QGeoPath + size=8 align=8 + base size=8 base align=8 +QGeoPath (0x0x7f7e19279a90) 0 + QGeoShape (0x0x7f7e192bcae0) 0 + +Class QGeoPolygon + size=8 align=8 + base size=8 base align=8 +QGeoPolygon (0x0x7f7e19279c98) 0 + QGeoShape (0x0x7f7e192bcea0) 0 + +Class QGeoSatelliteInfo + size=8 align=8 + base size=8 base align=8 +QGeoSatelliteInfo (0x0x7f7e18f1e2a0) 0 + +Class QGeoSatelliteInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoSatelliteInfoSource::QPrivateSignal (0x0x7f7e18f1e360) 0 empty + +Vtable for QGeoSatelliteInfoSource +QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QGeoSatelliteInfoSource) +16 (int (*)(...))QGeoSatelliteInfoSource::metaObject +24 (int (*)(...))QGeoSatelliteInfoSource::qt_metacast +32 (int (*)(...))QGeoSatelliteInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoSatelliteInfoSource::setUpdateInterval +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual + +Class QGeoSatelliteInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoSatelliteInfoSource (0x0x7f7e19279ea0) 0 + vptr=((& QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource) + 16u) + QObject (0x0x7f7e18f1e300) 0 + primary-for QGeoSatelliteInfoSource (0x0x7f7e19279ea0) + +Vtable for QGeoPositionInfoSourceFactory +QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI29QGeoPositionInfoSourceFactory) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactory + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactory (0x0x7f7e18f1e420) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory) + 16u) + +Class QNmeaPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNmeaPositionInfoSource::QPrivateSignal (0x0x7f7e18f1e540) 0 empty + +Vtable for QNmeaPositionInfoSource +QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource: 24u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QNmeaPositionInfoSource) +16 (int (*)(...))QNmeaPositionInfoSource::metaObject +24 (int (*)(...))QNmeaPositionInfoSource::qt_metacast +32 (int (*)(...))QNmeaPositionInfoSource::qt_metacall +40 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +48 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QNmeaPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))QNmeaPositionInfoSource::lastKnownPosition +136 (int (*)(...))QNmeaPositionInfoSource::supportedPositioningMethods +144 (int (*)(...))QNmeaPositionInfoSource::minimumUpdateInterval +152 (int (*)(...))QNmeaPositionInfoSource::error +160 (int (*)(...))QNmeaPositionInfoSource::startUpdates +168 (int (*)(...))QNmeaPositionInfoSource::stopUpdates +176 (int (*)(...))QNmeaPositionInfoSource::requestUpdate +184 (int (*)(...))QNmeaPositionInfoSource::parsePosInfoFromNmeaData + +Class QNmeaPositionInfoSource + size=32 align=8 + base size=32 base align=8 +QNmeaPositionInfoSource (0x0x7f7e19279f08) 0 + vptr=((& QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource) + 16u) + QGeoPositionInfoSource (0x0x7f7e19279f70) 0 + primary-for QNmeaPositionInfoSource (0x0x7f7e19279f08) + QObject (0x0x7f7e18f1e4e0) 0 + primary-for QGeoPositionInfoSource (0x0x7f7e19279f70) + diff --git a/tests/auto/bic/data/QtPositioning.5.13.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtPositioning.5.13.0.linux-gcc-amd64.txt new file mode 100644 index 0000000..7f69b2e --- /dev/null +++ b/tests/auto/bic/data/QtPositioning.5.13.0.linux-gcc-amd64.txt @@ -0,0 +1,5208 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7f3508200c60) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7f3506ee4420) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7f3506ee4660) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7f3506ee48a0) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7f3506ee4ae0) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7f3506ee4c60) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7f3506f20060) 0 empty + +Class std::__do_is_implicitly_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_implicitly_default_constructible_impl (0x0x7f3506f4f180) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7f3506fa7840) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7f3506fa7900) 0 empty + +Class std::__invoke_memfun_ref + size=1 align=1 + base size=0 base align=1 +std::__invoke_memfun_ref (0x0x7f3506fa7cc0) 0 empty + +Class std::__invoke_memfun_deref + size=1 align=1 + base size=0 base align=1 +std::__invoke_memfun_deref (0x0x7f3506fa7d20) 0 empty + +Class std::__invoke_memobj_ref + size=1 align=1 + base size=0 base align=1 +std::__invoke_memobj_ref (0x0x7f3506fa7d80) 0 empty + +Class std::__invoke_memobj_deref + size=1 align=1 + base size=0 base align=1 +std::__invoke_memobj_deref (0x0x7f3506fa7de0) 0 empty + +Class std::__invoke_other + size=1 align=1 + base size=0 base align=1 +std::__invoke_other (0x0x7f3506fa7e40) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7f3506fa7f00) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7f3506fd6000) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7f3506fd60c0) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7f3506fd6180) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7f3506fd64e0) 0 empty + +Class std::__swappable_details::__do_is_swappable_impl + size=1 align=1 + base size=0 base align=1 +std::__swappable_details::__do_is_swappable_impl (0x0x7f3506fd6840) 0 empty + +Class std::__swappable_details::__do_is_nothrow_swappable_impl + size=1 align=1 + base size=0 base align=1 +std::__swappable_details::__do_is_nothrow_swappable_impl (0x0x7f3506fd68a0) 0 empty + +Class std::__nonesuch + size=1 align=1 + base size=0 base align=1 +std::__nonesuch (0x0x7f3506fd6e40) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7f3506c244e0) 0 empty + +Class std::__nonesuch_no_braces + size=1 align=1 + base size=1 base align=1 +std::__nonesuch_no_braces (0x0x7f3506f7ddd0) 0 empty + std::__nonesuch (0x0x7f3506c249c0) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f3506ca0360) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f3506ca03c0) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f3506cff0c0) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f3506cff120) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f3506c8e2d8) 0 empty + std::input_iterator_tag (0x0x7f3506cff180) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f3506c8e340) 0 empty + std::forward_iterator_tag (0x0x7f3506c8e3a8) 0 empty + std::input_iterator_tag (0x0x7f3506cff1e0) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f3506c8e410) 0 empty + std::bidirectional_iterator_tag (0x0x7f3506c8e478) 0 empty + std::forward_iterator_tag (0x0x7f3506c8e4e0) 0 empty + std::input_iterator_tag (0x0x7f3506cff240) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7f3506d92d20) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7f3506d92e40) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7f3506db0180) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7f3506db0480) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7f3506db05a0) 0 empty + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f3506a3e8a0) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f3506a3eba0) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f3506a3ec00) 0 + +Class __pthread_rwlock_arch_t + size=56 align=8 + base size=56 base align=8 +__pthread_rwlock_arch_t (0x0x7f3506a3ecc0) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f3506a3ed20) 0 + +Class __pthread_mutex_s + size=40 align=8 + base size=40 base align=8 +__pthread_mutex_s (0x0x7f3506a3ed80) 0 + +Class __pthread_cond_s + size=48 align=8 + base size=48 base align=8 +__pthread_cond_s (0x0x7f3506a3ede0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f3506a810c0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f3506a81360) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f3506a813c0) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7f3506b38180) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7f3506c8e820) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16) + std::exception (0x0x7f3506b38360) 0 nearly-empty + primary-for std::bad_exception (0x0x7f3506c8e820) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7f3506b38540) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7f3506c8e888) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16) + std::exception (0x0x7f3506b38900) 0 nearly-empty + primary-for std::bad_cast (0x0x7f3506c8e888) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7f3506c8e8f0) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16) + std::exception (0x0x7f3506b38ae0) 0 nearly-empty + primary-for std::bad_typeid (0x0x7f3506c8e8f0) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7f3506b38cc0) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7f3506b702a0) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7f3506c8e958) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16) + std::exception (0x0x7f3506b70960) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f3506c8e958) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7f3506c8e9c0) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16) + std::bad_alloc (0x0x7f3506c8ea28) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7f3506c8e9c0) + std::exception (0x0x7f3506b70b40) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f3506c8ea28) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f3506b70d20) 0 empty + +Class std::__allocator_traits_base + size=1 align=1 + base size=0 base align=1 +std::__allocator_traits_base (0x0x7f3506b70f00) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f3506819420) 0 empty + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f35069ceea0) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f35069cef60) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f3506491900) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f3506491a20) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f3506491d80) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f35064d1300) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f350650ba80) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7f35065a1ea0) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7f3506551888) 0 + std::__atomic_flag_base (0x0x7f35065a1f00) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f3506129000) 0 + QAtomicInteger (0x0x7f3506129068) 0 + QBasicAtomicInteger (0x0x7f35060daea0) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f3505d0b1e0) 0 empty + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f3505d50780) 0 + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f3505d50ea0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f3505f7abc8) 0 + QGenericArgument (0x0x7f3505d90180) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f3505d905a0) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f3505d909c0) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f3505a424e0) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f3505a42780) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f3505b0d5a0) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f3505b0d900) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7f3505b69c00) 0 empty + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f3505868480) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f3505868540) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7f3505916660) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f3505916720) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f3505916780) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f35059167e0) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f3505916840) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f3505916960) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f35059169c0) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f3505655960) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f35056559c0) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7f3505411a20) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7f3505411ba0) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f3505581d20) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7f35055d2120) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f35055d23c0) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f35055d25a0) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7f350521c5a0) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7f3505439d00) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16) + std::exception (0x0x7f350521c660) 0 nearly-empty + primary-for std::logic_error (0x0x7f3505439d00) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7f3505439d68) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16) + std::logic_error (0x0x7f3505439dd0) 0 + primary-for std::domain_error (0x0x7f3505439d68) + std::exception (0x0x7f350521c6c0) 0 nearly-empty + primary-for std::logic_error (0x0x7f3505439dd0) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7f3505439e38) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16) + std::logic_error (0x0x7f3505439ea0) 0 + primary-for std::invalid_argument (0x0x7f3505439e38) + std::exception (0x0x7f350521c720) 0 nearly-empty + primary-for std::logic_error (0x0x7f3505439ea0) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7f3505439f08) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16) + std::logic_error (0x0x7f3505439f70) 0 + primary-for std::length_error (0x0x7f3505439f08) + std::exception (0x0x7f350521c780) 0 nearly-empty + primary-for std::logic_error (0x0x7f3505439f70) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7f3505439208) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16) + std::logic_error (0x0x7f3505439270) 0 + primary-for std::out_of_range (0x0x7f3505439208) + std::exception (0x0x7f350521c7e0) 0 nearly-empty + primary-for std::logic_error (0x0x7f3505439270) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7f35054395b0) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16) + std::exception (0x0x7f350521c840) 0 nearly-empty + primary-for std::runtime_error (0x0x7f35054395b0) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7f3505439618) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16) + std::runtime_error (0x0x7f3505253000) 0 + primary-for std::range_error (0x0x7f3505439618) + std::exception (0x0x7f350521c8a0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f3505253000) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7f3505253068) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16) + std::runtime_error (0x0x7f35052530d0) 0 + primary-for std::overflow_error (0x0x7f3505253068) + std::exception (0x0x7f350521c900) 0 nearly-empty + primary-for std::runtime_error (0x0x7f35052530d0) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7f3505253138) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16) + std::runtime_error (0x0x7f35052531a0) 0 + primary-for std::underflow_error (0x0x7f3505253138) + std::exception (0x0x7f350521c960) 0 nearly-empty + primary-for std::runtime_error (0x0x7f35052531a0) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7f350521cae0) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7f350521ce40) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7f350527a6c0) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7f35052535b0) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16) + std::runtime_error (0x0x7f3505253618) 0 + primary-for std::system_error (0x0x7f35052535b0) + std::exception (0x0x7f35052a12a0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f3505253618) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7f3505253888) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16) + std::system_error (0x0x7f35052538f0) 0 + primary-for std::ios_base::failure (0x0x7f3505253888) + std::runtime_error (0x0x7f3505253958) 0 + primary-for std::system_error (0x0x7f35052538f0) + std::exception (0x0x7f35052d6840) 0 nearly-empty + primary-for std::runtime_error (0x0x7f3505253958) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f35052d68a0) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f35052d6900) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f35052d6960) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7f35052d67e0) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7f35053ca2a0) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f3505090480) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2 entries +0 ((& std::basic_ostream::_ZTVSo) + 24) +8 ((& std::basic_ostream::_ZTVSo) + 64) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2 entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2 entries +0 ((& std::basic_istream::_ZTVSi) + 24) +8 ((& std::basic_istream::_ZTVSi) + 64) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2 entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64) + +Construction vtable for std::basic_istream (0x0x7f3504c40068 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10 entries +0 24 +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0 +32 0 +40 18446744073709551592 +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0 +72 0 + +Construction vtable for std::basic_ostream (0x0x7f3504c40138 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10 entries +0 8 +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0 +32 0 +40 18446744073709551608 +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0 +72 0 + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7 entries +0 ((& std::basic_iostream::_ZTVSd) + 24) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64) +40 ((& std::basic_iostream::_ZTVSd) + 104) +48 ((& std::basic_iostream::_ZTVSd) + 64) + +Construction vtable for std::basic_istream (0x0x7f3504c40f08 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10 entries +0 24 +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 0 +32 0 +40 18446744073709551592 +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0 +72 0 + +Construction vtable for std::basic_ostream (0x0x7f3504c40270 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10 entries +0 8 +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 0 +32 0 +40 18446744073709551608 +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0 +72 0 + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7 entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64) + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f3504c6ade0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f3504c6ae40) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f3504dd7240) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f3504a630c0) 0 + +Class QStringView + size=16 align=8 + base size=16 base align=8 +QStringView (0x0x7f3504a63540) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f3504b39300) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f3504bb9d20) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f3504bb9cc0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f350498aea0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f350472b720) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7f350453da20) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7f350453dae0) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f3504212000) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f3504556208) 0 + std::iterator (0x0x7f3504212720) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f3504556340) 0 + std::_Bit_iterator_base (0x0x7f35045563a8) 0 + std::iterator (0x0x7f3504212d80) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f3504556410) 0 + std::_Bit_iterator_base (0x0x7f3504556478) 0 + std::iterator (0x0x7f35042435a0) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f3503ffac00) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7f35040fd9c0) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7f35040fda20) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7f3504556f70) 0 empty + QListData::NotIndirectLayout (0x0x7f35040fda80) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7f35040f30e0) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f35040fdae0) 0 empty + QListData::NotIndirectLayout (0x0x7f35040fdb40) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7f3504556680) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f35040fdba0) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f35040fdc00) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f35040fd960) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f3503debde0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f3503ee6480) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f3503ee6420) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f3503ed3c30) 0 + QList (0x0x7f3503ed3c98) 0 + QListSpecialMethods (0x0x7f3503ee66c0) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f3503fb0240) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f3503c37360) 0 + +Class std::_Rb_tree_header + size=40 align=8 + base size=40 base align=8 +std::_Rb_tree_header (0x0x7f3503c376c0) 0 + +Class std::__erased_type + size=1 align=1 + base size=0 base align=1 +std::__erased_type (0x0x7f3503a17c60) 0 empty + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7f3503a17cc0) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7f3503a17e40) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7f3503a17f00) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7f3503a38000) 0 + std::__uses_alloc_base (0x0x7f3503a17ea0) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7f3503ba72a0) 0 empty + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f35037bc720) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f35037bca80) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f35037e1000) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f35037e1540) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f3503847720) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7f3503847de0) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f350387bc60) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f350355a360) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f35035b38a0) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7f35033f76c0) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7f3503126180) 0 empty + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7f35031261e0) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f35031263c0) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7f3503126360) 0 + vptr=((& QObject::_ZTV7QObject) + 16) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7f35031eb1e0) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7f35031eb360) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f35031ebc00) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 0 +48 0 +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7f35031ea208) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16) + QObject (0x0x7f35031ebba0) 0 + primary-for QAbstractAnimation (0x0x7f35031ea208) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f3503228000) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7f35031ea270) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16) + QObject (0x0x7f35031ebf60) 0 + primary-for QAnimationDriver (0x0x7f35031ea270) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f3503228240) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7f35031ea2d8) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16) + QObject (0x0x7f35032281e0) 0 + primary-for QEventLoop (0x0x7f35031ea2d8) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f3503228ae0) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f3503228ba0) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f3503228c00) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7f35031ea410) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16) + QObject (0x0x7f3503228b40) 0 + primary-for QAbstractEventDispatcher (0x0x7f35031ea410) + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7f35032b6d68) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16) + std::exception (0x0x7f3502f052a0) 0 nearly-empty + primary-for std::bad_function_call (0x0x7f35032b6d68) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7f3502f05360) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7f3502f053c0) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7f3502f056c0) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f3502cfd660) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f3502d35300) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f3502e03c60) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7f3502e03c00) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f3502e03f00) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f3502b2c4e0) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f3502b2c5a0) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f3502b2c540) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f3502b2c600) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f3502b2c480) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f3502c858a0) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f3502ccbf00) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f3502ccbea0) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f35028f2060) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f35028f2000) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f35029b01e0) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f3502a06de0) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f3502ad2c00) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7f35026e0958) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16) + QObject (0x0x7f3502ad2ba0) 0 + primary-for QAbstractItemModel (0x0x7f35026e0958) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f35027b5000) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractTableModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7f35026e0f70) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16) + QAbstractItemModel (0x0x7f35027b1000) 0 + primary-for QAbstractTableModel (0x0x7f35026e0f70) + QObject (0x0x7f350272bf60) 0 + primary-for QAbstractItemModel (0x0x7f35027b1000) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f35027b5180) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractListModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7f35027b1068) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16) + QAbstractItemModel (0x0x7f35027b10d0) 0 + primary-for QAbstractListModel (0x0x7f35027b1068) + QObject (0x0x7f35027b5120) 0 + primary-for QAbstractItemModel (0x0x7f35027b10d0) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f35027b58a0) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f35027b5960) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7f35027b11a0) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16) + QAbstractItemModel (0x0x7f35027b1208) 0 + primary-for QAbstractProxyModel (0x0x7f35027b11a0) + QObject (0x0x7f35027b5900) 0 + primary-for QAbstractItemModel (0x0x7f35027b1208) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f35027b5ba0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 0 +48 0 +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7f35027b1270) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16) + QObject (0x0x7f35027b5b40) 0 + primary-for QAbstractState (0x0x7f35027b1270) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f35027b5de0) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 0 +48 0 +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7f35027b12d8) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16) + QObject (0x0x7f35027b5d80) 0 + primary-for QAbstractTransition (0x0x7f35027b12d8) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f350284d120) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 0 +48 0 +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7f35027b1340) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16) + QAbstractAnimation (0x0x7f35027b13a8) 0 + primary-for QAnimationGroup (0x0x7f35027b1340) + QObject (0x0x7f350284d0c0) 0 + primary-for QAbstractAnimation (0x0x7f35027b13a8) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f350289f480) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f35024df840) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f350252fcc0) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f35025a00c0) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7f35025948f0) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16) + QObject (0x0x7f35025a0060) 0 + primary-for QIODevice (0x0x7f35025948f0) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f35025a0a20) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7f3502594a28) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16) + QIODevice (0x0x7f3502594a90) 0 + primary-for QBuffer (0x0x7f3502594a28) + QObject (0x0x7f35025a09c0) 0 + primary-for QIODevice (0x0x7f3502594a90) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f35025a0cc0) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f35025a0c60) 0 + +Class QStaticByteArrayMatcherBase::Skiptable + size=256 align=1 + base size=256 base align=1 +QStaticByteArrayMatcherBase::Skiptable (0x0x7f35025a0e40) 0 + +Class QStaticByteArrayMatcherBase + size=256 align=16 + base size=256 base align=16 +QStaticByteArrayMatcherBase (0x0x7f35025a0de0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f3502608d20) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f3502663cc0) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f35026ce5a0) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7f350233a240) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7f350233a2a0) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f350233a1e0) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f350240e960) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7f35020f8f00) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f350215c7e0) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f3502200300) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f3502226f60) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f3502256120) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7f3501eddd20) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f3501eddcc0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f3502086d80) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f3502086e40) 0 empty + +Class QCborError + size=4 align=4 + base size=4 base align=4 +QCborError (0x0x7f3501d36180) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f3501d36900) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f3501dde7e0) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f3501e4a5a0) 0 + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f3501ebf000) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f3501be7f60) 0 + +Class QCborParserError + size=16 align=8 + base size=12 base align=8 +QCborParserError (0x0x7f3501c78ae0) 0 + +Class QCborValue + size=24 align=8 + base size=20 base align=8 +QCborValue (0x0x7f3501c78ba0) 0 + +Class QCborValueRef + size=16 align=8 + base size=16 base align=8 +QCborValueRef (0x0x7f35016ebba0) 0 + +Class QCborArray::Iterator + size=16 align=8 + base size=16 base align=8 +QCborArray::Iterator (0x0x7f3501781600) 0 + +Class QCborArray::ConstIterator + size=16 align=8 + base size=16 base align=8 +QCborArray::ConstIterator (0x0x7f3501781660) 0 + +Class QCborArray + size=8 align=8 + base size=8 base align=8 +QCborArray (0x0x7f35017815a0) 0 + +Class QCborMap::Iterator + size=16 align=8 + base size=16 base align=8 +QCborMap::Iterator (0x0x7f3501896060) 0 + +Class QCborMap::ConstIterator + size=16 align=8 + base size=16 base align=8 +QCborMap::ConstIterator (0x0x7f35018960c0) 0 + +Class QCborMap + size=8 align=8 + base size=8 base align=8 +QCborMap (0x0x7f3501896000) 0 + +Class qfloat16 + size=2 align=2 + base size=2 base align=2 +qfloat16 (0x0x7f350168d7e0) 0 + +Class QCborStreamWriter + size=8 align=8 + base size=8 base align=8 +QCborStreamWriter (0x0x7f3501349780) 0 + +Class QCborStreamReader + size=24 align=8 + base size=20 base align=8 +QCborStreamReader (0x0x7f350137d4e0) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f35013ff600) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f35013ff7e0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f35010f6d80) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7f35011804e0) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7f3501157c30) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16) + QEvent (0x0x7f35011808a0) 0 + primary-for QTimerEvent (0x0x7f3501157c30) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7f3501157c98) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16) + QEvent (0x0x7f3501180960) 0 + primary-for QChildEvent (0x0x7f3501157c98) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7f35011b1208) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16) + QEvent (0x0x7f35011bf000) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f35011b1208) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7f35011b1270) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16) + QEvent (0x0x7f35011bf0c0) 0 + primary-for QDeferredDeleteEvent (0x0x7f35011b1270) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f35011bf1e0) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7f35011b12d8) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16) + QObject (0x0x7f35011bf180) 0 + primary-for QCoreApplication (0x0x7f35011b12d8) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f35011bf420) 0 + +Class QConcatenateTablesProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QConcatenateTablesProxyModel::QPrivateSignal (0x0x7f35011bf5a0) 0 empty + +Vtable for QConcatenateTablesProxyModel +QConcatenateTablesProxyModel::_ZTV28QConcatenateTablesProxyModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI28QConcatenateTablesProxyModel) +16 (int (*)(...))QConcatenateTablesProxyModel::metaObject +24 (int (*)(...))QConcatenateTablesProxyModel::qt_metacast +32 (int (*)(...))QConcatenateTablesProxyModel::qt_metacall +40 (int (*)(...))QConcatenateTablesProxyModel::~QConcatenateTablesProxyModel +48 (int (*)(...))QConcatenateTablesProxyModel::~QConcatenateTablesProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QConcatenateTablesProxyModel::index +120 (int (*)(...))QConcatenateTablesProxyModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))QConcatenateTablesProxyModel::rowCount +144 (int (*)(...))QConcatenateTablesProxyModel::columnCount +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))QConcatenateTablesProxyModel::data +168 (int (*)(...))QConcatenateTablesProxyModel::setData +176 (int (*)(...))QConcatenateTablesProxyModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QConcatenateTablesProxyModel::itemData +200 (int (*)(...))QConcatenateTablesProxyModel::setItemData +208 (int (*)(...))QConcatenateTablesProxyModel::mimeTypes +216 (int (*)(...))QConcatenateTablesProxyModel::mimeData +224 (int (*)(...))QConcatenateTablesProxyModel::canDropMimeData +232 (int (*)(...))QConcatenateTablesProxyModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QConcatenateTablesProxyModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QConcatenateTablesProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QConcatenateTablesProxyModel + size=16 align=8 + base size=16 base align=8 +QConcatenateTablesProxyModel (0x0x7f35011b1340) 0 + vptr=((& QConcatenateTablesProxyModel::_ZTV28QConcatenateTablesProxyModel) + 16) + QAbstractItemModel (0x0x7f35011b13a8) 0 + primary-for QConcatenateTablesProxyModel (0x0x7f35011b1340) + QObject (0x0x7f35011bf540) 0 + primary-for QAbstractItemModel (0x0x7f35011b13a8) + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f35011bf780) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f35011bf8a0) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7f35011bfa20) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f3501281180) 0 + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7f35012818a0) 0 + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f3500fc2600) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7f3500fc05b0) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16) + QIODevice (0x0x7f3500fc0618) 0 + primary-for QFileDevice (0x0x7f3500fc05b0) + QObject (0x0x7f3500fc25a0) 0 + primary-for QIODevice (0x0x7f3500fc0618) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f3500fc2f00) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7f3500fc0750) 0 + vptr=((& QFile::_ZTV5QFile) + 16) + QFileDevice (0x0x7f3500fc07b8) 0 + primary-for QFile (0x0x7f3500fc0750) + QIODevice (0x0x7f3500fc0820) 0 + primary-for QFileDevice (0x0x7f3500fc07b8) + QObject (0x0x7f3500fc2ea0) 0 + primary-for QIODevice (0x0x7f3500fc0820) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f35010285a0) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f3501093960) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f3500d00cc0) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f3500d4d480) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f3500e555a0) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7f3500e16a90) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16) + QAbstractTransition (0x0x7f3500e16af8) 0 + primary-for QEventTransition (0x0x7f3500e16a90) + QObject (0x0x7f3500e55540) 0 + primary-for QAbstractTransition (0x0x7f3500e16af8) + +Vtable for QException +QException::_ZTV10QException: 7 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7f3500e16b60) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16) + std::exception (0x0x7f3500e55780) 0 nearly-empty + primary-for QException (0x0x7f3500e16b60) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7f3500e16bc8) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16) + QException (0x0x7f3500e16c30) 0 nearly-empty + primary-for QUnhandledException (0x0x7f3500e16bc8) + std::exception (0x0x7f3500e557e0) 0 nearly-empty + primary-for QException (0x0x7f3500e16c30) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f3500e55840) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f3500e55900) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f3500e55960) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f3500e55ba0) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7f3500e16c98) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16) + QObject (0x0x7f3500e55b40) 0 + primary-for QFileSelector (0x0x7f3500e16c98) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f3500e55de0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7f3500e16d00) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16) + QObject (0x0x7f3500e55d80) 0 + primary-for QFileSystemWatcher (0x0x7f3500e16d00) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f3500aae060) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7f3500e16d68) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16) + QAbstractState (0x0x7f3500e16dd0) 0 + primary-for QFinalState (0x0x7f3500e16d68) + QObject (0x0x7f3500aae000) 0 + primary-for QAbstractState (0x0x7f3500e16dd0) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0 +32 0 + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f3500aae240) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f3500aae4e0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f3500e16ea0) 0 + QBasicMutex (0x0x7f3500b2f180) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f3500b2f3c0) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f3500b2f840) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f3500b2fe40) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7f3500b87060) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7f3500bd4840) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f3500c71b40) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 0 +48 0 +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7f3500c5e4e0) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16) + QObject (0x0x7f3500c71ae0) 0 + primary-for QFutureWatcherBase (0x0x7f3500c5e4e0) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f3500899ea0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7f3500c5ed00) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16) + QAbstractState (0x0x7f3500c5ed68) 0 + primary-for QHistoryState (0x0x7f3500c5ed00) + QObject (0x0x7f3500899e40) 0 + primary-for QAbstractState (0x0x7f3500c5ed68) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f35008cc1e0) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7f3500c5edd0) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16) + QAbstractProxyModel (0x0x7f3500c5ee38) 0 + primary-for QIdentityProxyModel (0x0x7f3500c5edd0) + QAbstractItemModel (0x0x7f3500c5eea0) 0 + primary-for QAbstractProxyModel (0x0x7f3500c5ee38) + QObject (0x0x7f35008cc180) 0 + primary-for QAbstractItemModel (0x0x7f3500c5eea0) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f35008cc3c0) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f3500985cc0) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7f350098f820) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16) + QObject (0x0x7f3500985c60) 0 + primary-for QItemSelectionModel (0x0x7f350098f820) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f350098f9c0) 0 + QList (0x0x7f350098fa28) 0 + QListSpecialMethods (0x0x7f35009bd7e0) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f3500a56120) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f35007b0300) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7f35007f62a0) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7f35007f6540) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f35008398a0) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f3500839900) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f3500839840) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f35005657e0) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f3500565840) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f35005d4060) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f35005d40c0) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f35005d4000) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f35002e7420) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7f35002d7a90) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16) + QObject (0x0x7f35002e73c0) 0 + primary-for QLibrary (0x0x7f35002d7a90) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7f35003302a0) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7f35002e7d80) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f35003c99c0) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f35003c9a20) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f3500438840) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f35000a89c0) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f3500119d80) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7f35001c5060) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f35002591e0) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7f3500259420) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f35002593c0) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f3500259840) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7f34fff11780) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f34ffd57f60) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f34ffd7f000) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f34ffde2840) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f34ffe21a80) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f34ffe21ba0) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f34ffe80180) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7f34ffe776e8) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16) + QObject (0x0x7f34ffe80120) 0 + primary-for QMimeData (0x0x7f34ffe776e8) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f34ffe80360) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f34ffade480) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f34ffade540) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7f34ffad9a28) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16) + QObject (0x0x7f34ffade4e0) 0 + primary-for QObjectCleanupHandler (0x0x7f34ffad9a28) + +Class QOperatingSystemVersion + size=16 align=4 + base size=16 base align=4 +QOperatingSystemVersion (0x0x7f34ffade660) 0 + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f34ffb4cde0) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7f34ffb622d8) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16) + QAnimationGroup (0x0x7f34ffb62340) 0 + primary-for QParallelAnimationGroup (0x0x7f34ffb622d8) + QAbstractAnimation (0x0x7f34ffb623a8) 0 + primary-for QAnimationGroup (0x0x7f34ffb62340) + QObject (0x0x7f34ffb4cd80) 0 + primary-for QAbstractAnimation (0x0x7f34ffb623a8) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f34ffb76060) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7f34ffb62410) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16) + QAbstractAnimation (0x0x7f34ffb62478) 0 + primary-for QPauseAnimation (0x0x7f34ffb62410) + QObject (0x0x7f34ffb76000) 0 + primary-for QAbstractAnimation (0x0x7f34ffb62478) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f34ffb76c60) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f34ffbc4de0) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7f34ffbd17b8) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16) + QObject (0x0x7f34ffbc4d80) 0 + primary-for QPluginLoader (0x0x7f34ffbd17b8) + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f34ffbc4f00) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f34ffc3c5a0) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7f34ffc3f410) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16) + QIODevice (0x0x7f34ffc3f478) 0 + primary-for QProcess (0x0x7f34ffc3f410) + QObject (0x0x7f34ffc3c540) 0 + primary-for QIODevice (0x0x7f34ffc3f478) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f34ffc3cc60) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7f34ffc3f4e0) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16) + QAbstractAnimation (0x0x7f34ffc3f548) 0 + primary-for QVariantAnimation (0x0x7f34ffc3f4e0) + QObject (0x0x7f34ffc3cc00) 0 + primary-for QAbstractAnimation (0x0x7f34ffc3f548) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f34ffc3cf00) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7f34ffc3f618) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16) + QVariantAnimation (0x0x7f34ffc3f680) 0 + primary-for QPropertyAnimation (0x0x7f34ffc3f618) + QAbstractAnimation (0x0x7f34ffc3f6e8) 0 + primary-for QVariantAnimation (0x0x7f34ffc3f680) + QObject (0x0x7f34ffc3cea0) 0 + primary-for QAbstractAnimation (0x0x7f34ffc3f6e8) + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7f34ff904660) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7f34ffa0d3c0) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7f34ffa0d360) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7f34ff7fa120) 0 + +Class QRandomGenerator::Storage + size=2504 align=8 + base size=2504 base align=8 +QRandomGenerator::Storage (0x0x7f34ff606d80) 0 + +Class QRandomGenerator + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator (0x0x7f34ff606d20) 0 + +Class QRandomGenerator64 + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator64 (0x0x7f34ff2283a8) 0 + QRandomGenerator (0x0x7f34ff22f8a0) 0 + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f34ff254480) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f34ff254720) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f34ff254c00) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f34ff2d9120) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f34ff322f00) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f34ff39aea0) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f34ff040f00) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f34ff149060) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f34ff149300) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7f34ff0d0d68) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16) + QFileDevice (0x0x7f34ff0d0dd0) 0 + primary-for QSaveFile (0x0x7f34ff0d0d68) + QIODevice (0x0x7f34ff0d0e38) 0 + primary-for QFileDevice (0x0x7f34ff0d0dd0) + QObject (0x0x7f34ff1492a0) 0 + primary-for QIODevice (0x0x7f34ff0d0e38) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f34ff149900) 0 + +Class QSemaphoreReleaser + size=16 align=8 + base size=12 base align=8 +QSemaphoreReleaser (0x0x7f34ff149a80) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f34fee74d20) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7f34fee7cb60) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16) + QAnimationGroup (0x0x7f34fee7cbc8) 0 + primary-for QSequentialAnimationGroup (0x0x7f34fee7cb60) + QAbstractAnimation (0x0x7f34fee7cc30) 0 + primary-for QAnimationGroup (0x0x7f34fee7cbc8) + QObject (0x0x7f34fee74cc0) 0 + primary-for QAbstractAnimation (0x0x7f34fee7cc30) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f34fee74f60) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7f34fee7cc98) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16) + QObject (0x0x7f34fee74f00) 0 + primary-for QSettings (0x0x7f34fee7cc98) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f34feeb5420) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7f34fee7cd00) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16) + QObject (0x0x7f34feeb53c0) 0 + primary-for QSharedMemory (0x0x7f34fee7cd00) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f34feeb5660) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7f34fee7cd68) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16) + QObject (0x0x7f34feeb5600) 0 + primary-for QSignalMapper (0x0x7f34fee7cd68) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f34feeb58a0) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7f34fee7cdd0) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16) + QAbstractTransition (0x0x7f34fee7ce38) 0 + primary-for QSignalTransition (0x0x7f34fee7cdd0) + QObject (0x0x7f34feeb5840) 0 + primary-for QAbstractTransition (0x0x7f34fee7ce38) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f34feeb5b40) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7f34fee7cea0) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16) + QObject (0x0x7f34feeb5ae0) 0 + primary-for QSocketNotifier (0x0x7f34fee7cea0) + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f34feeb5d80) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7f34fee7cf08) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16) + QAbstractProxyModel (0x0x7f34fee7cf70) 0 + primary-for QSortFilterProxyModel (0x0x7f34fee7cf08) + QAbstractItemModel (0x0x7f34feefb000) 0 + primary-for QAbstractProxyModel (0x0x7f34fee7cf70) + QObject (0x0x7f34feeb5d20) 0 + primary-for QAbstractItemModel (0x0x7f34feefb000) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f34fef241e0) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f34fef24ae0) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7f34feefb1a0) 0 + vptr=((& QState::_ZTV6QState) + 16) + QAbstractState (0x0x7f34feefb208) 0 + primary-for QState (0x0x7f34feefb1a0) + QObject (0x0x7f34fef24a80) 0 + primary-for QAbstractState (0x0x7f34feefb208) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f34fef24f60) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7f34feefb3a8) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16) + QEvent (0x0x7f34fef72000) 0 + primary-for QStateMachine::SignalEvent (0x0x7f34feefb3a8) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7f34feefb410) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16) + QEvent (0x0x7f34fef72060) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f34feefb410) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7f34feefb270) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16) + QState (0x0x7f34feefb2d8) 0 + primary-for QStateMachine (0x0x7f34feefb270) + QAbstractState (0x0x7f34feefb340) 0 + primary-for QState (0x0x7f34feefb2d8) + QObject (0x0x7f34fef24f00) 0 + primary-for QAbstractState (0x0x7f34feefb340) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7f34fef72420) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f34ff010420) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f34fec9c780) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QStringListModel::itemData +200 (int (*)(...))QStringListModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QStringListModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7f34fec92548) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16) + QAbstractListModel (0x0x7f34fec925b0) 0 + primary-for QStringListModel (0x0x7f34fec92548) + QAbstractItemModel (0x0x7f34fec92618) 0 + primary-for QAbstractListModel (0x0x7f34fec925b0) + QObject (0x0x7f34fec9c720) 0 + primary-for QAbstractItemModel (0x0x7f34fec92618) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f34fec9c8a0) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f34fec9c960) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f34fec9ca80) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7f34fec92680) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16) + QFile (0x0x7f34fec926e8) 0 + primary-for QTemporaryFile (0x0x7f34fec92680) + QFileDevice (0x0x7f34fec92750) 0 + primary-for QFile (0x0x7f34fec926e8) + QIODevice (0x0x7f34fec927b8) 0 + primary-for QFileDevice (0x0x7f34fec92750) + QObject (0x0x7f34fec9ca20) 0 + primary-for QIODevice (0x0x7f34fec927b8) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f34fec9cde0) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f34fed03660) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 0 +64 0 + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f34fed03600) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f34fed69060) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f34fed69240) 0 + +Class std::__mutex_base + size=40 align=8 + base size=40 base align=8 +std::__mutex_base (0x0x7f34fed69420) 0 + +Class std::mutex + size=40 align=8 + base size=40 base align=8 +std::mutex (0x0x7f34fec929c0) 0 + std::__mutex_base (0x0x7f34fed69480) 0 + +Class std::defer_lock_t + size=1 align=1 + base size=0 base align=1 +std::defer_lock_t (0x0x7f34fed69660) 0 empty + +Class std::try_to_lock_t + size=1 align=1 + base size=0 base align=1 +std::try_to_lock_t (0x0x7f34fed696c0) 0 empty + +Class std::adopt_lock_t + size=1 align=1 + base size=0 base align=1 +std::adopt_lock_t (0x0x7f34fed69720) 0 empty + +Class std::__recursive_mutex_base + size=40 align=8 + base size=40 base align=8 +std::__recursive_mutex_base (0x0x7f34fedac180) 0 + +Class std::recursive_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_mutex (0x0x7f34fec92a28) 0 + std::__recursive_mutex_base (0x0x7f34fedac1e0) 0 + +Class std::timed_mutex + size=40 align=8 + base size=40 base align=8 +std::timed_mutex (0x0x7f34fed5fee0) 0 + std::__mutex_base (0x0x7f34fedac5a0) 0 + std::__timed_mutex_impl (0x0x7f34fedac600) 0 empty + +Class std::recursive_timed_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_timed_mutex (0x0x7f34fedcd230) 0 + std::__recursive_mutex_base (0x0x7f34fedac960) 0 + std::__timed_mutex_impl (0x0x7f34fedac9c0) 0 empty + +Class std::once_flag + size=4 align=4 + base size=4 base align=4 +std::once_flag (0x0x7f34fedf1120) 0 + +Vtable for __gnu_cxx::__concurrence_lock_error +__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_lock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +24 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +32 (int (*)(...))__gnu_cxx::__concurrence_lock_error::what + +Class __gnu_cxx::__concurrence_lock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_lock_error (0x0x7f34fec92b60) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16) + std::exception (0x0x7f34fedf1660) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_lock_error (0x0x7f34fec92b60) + +Vtable for __gnu_cxx::__concurrence_unlock_error +__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx26__concurrence_unlock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +24 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +32 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::what + +Class __gnu_cxx::__concurrence_unlock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_unlock_error (0x0x7f34fec92bc8) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16) + std::exception (0x0x7f34fedf1780) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7f34fec92bc8) + +Vtable for __gnu_cxx::__concurrence_broadcast_error +__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx29__concurrence_broadcast_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +24 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +32 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::what + +Class __gnu_cxx::__concurrence_broadcast_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_broadcast_error (0x0x7f34fec92c30) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16) + std::exception (0x0x7f34fedf18a0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7f34fec92c30) + +Vtable for __gnu_cxx::__concurrence_wait_error +__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_wait_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +24 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +32 (int (*)(...))__gnu_cxx::__concurrence_wait_error::what + +Class __gnu_cxx::__concurrence_wait_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_wait_error (0x0x7f34fec92d00) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16) + std::exception (0x0x7f34fedf19c0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_wait_error (0x0x7f34fec92d00) + +Class __gnu_cxx::__mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__mutex (0x0x7f34fea20a20) 0 + +Class __gnu_cxx::__recursive_mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__recursive_mutex (0x0x7f34fea20d20) 0 + +Class __gnu_cxx::__scoped_lock + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__scoped_lock (0x0x7f34fea40060) 0 + +Class __gnu_cxx::__cond + size=48 align=8 + base size=48 base align=8 +__gnu_cxx::__cond (0x0x7f34fea403c0) 0 + +Vtable for std::bad_weak_ptr +std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12bad_weak_ptr) +16 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +24 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +32 (int (*)(...))std::bad_weak_ptr::what + +Class std::bad_weak_ptr + size=8 align=8 + base size=8 base align=8 +std::bad_weak_ptr (0x0x7f34fec92d68) 0 nearly-empty + vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16) + std::exception (0x0x7f34feabe5a0) 0 nearly-empty + primary-for std::bad_weak_ptr (0x0x7f34fec92d68) + +Class std::_Sp_make_shared_tag + size=1 align=1 + base size=0 base align=1 +std::_Sp_make_shared_tag (0x0x7f34feb26540) 0 empty + +Class std::__sp_array_delete + size=1 align=1 + base size=0 base align=1 +std::__sp_array_delete (0x0x7f34feb26960) 0 empty + +Class std::_Sp_locker + size=2 align=1 + base size=2 base align=1 +std::_Sp_locker (0x0x7f34fe8727e0) 0 + +Vtable for std::thread::_State +std::thread::_State::_ZTVNSt6thread6_StateE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6thread6_StateE) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual + +Class std::thread::_State + size=8 align=8 + base size=8 base align=8 +std::thread::_State (0x0x7f34fe89ec60) 0 nearly-empty + vptr=((& std::thread::_State::_ZTVNSt6thread6_StateE) + 16) + +Class std::thread::id + size=8 align=8 + base size=8 base align=8 +std::thread::id (0x0x7f34fe89ecc0) 0 + +Class std::thread + size=8 align=8 + base size=8 base align=8 +std::thread (0x0x7f34fe89ec00) 0 + +Class std::condition_variable + size=48 align=8 + base size=48 base align=8 +std::condition_variable (0x0x7f34fe7620c0) 0 + +Class std::__at_thread_exit_elt + size=16 align=8 + base size=16 base align=8 +std::__at_thread_exit_elt (0x0x7f34fe762480) 0 + +Class std::_V2::condition_variable_any + size=64 align=8 + base size=64 base align=8 +std::_V2::condition_variable_any (0x0x7f34fe7624e0) 0 + +Class std::__atomic_futex_unsigned_base + size=1 align=1 + base size=0 base align=1 +std::__atomic_futex_unsigned_base (0x0x7f34fe4e47e0) 0 empty + +Vtable for std::future_error +std::future_error::_ZTVSt12future_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12future_error) +16 (int (*)(...))std::future_error::~future_error +24 (int (*)(...))std::future_error::~future_error +32 (int (*)(...))std::future_error::what + +Class std::future_error + size=32 align=8 + base size=32 base align=8 +std::future_error (0x0x7f34fe4e9618) 0 + vptr=((& std::future_error::_ZTVSt12future_error) + 16) + std::logic_error (0x0x7f34fe4e9680) 0 + primary-for std::future_error (0x0x7f34fe4e9618) + std::exception (0x0x7f34fe4e4f00) 0 nearly-empty + primary-for std::logic_error (0x0x7f34fe4e9680) + +Class std::__future_base::_Result_base::_Deleter + size=1 align=1 + base size=0 base align=1 +std::__future_base::_Result_base::_Deleter (0x0x7f34fe519660) 0 empty + +Vtable for std::__future_base::_Result_base +std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE) +16 (int (*)(...))__cxa_pure_virtual +24 0 +32 0 + +Class std::__future_base::_Result_base + size=16 align=8 + base size=16 base align=8 +std::__future_base::_Result_base (0x0x7f34fe519600) 0 + vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16) + +Class std::__future_base::_State_baseV2::__exception_ptr_tag + size=1 align=1 + base size=0 base align=1 +std::__future_base::_State_baseV2::__exception_ptr_tag (0x0x7f34fe2d8d80) 0 empty + +Class std::__future_base::_State_baseV2::_Make_ready + size=32 align=8 + base size=32 base align=8 +std::__future_base::_State_baseV2::_Make_ready (0x0x7f34fe2d7ea0) 0 + std::__at_thread_exit_elt (0x0x7f34fe2d8e40) 0 + +Vtable for std::__future_base::_State_baseV2 +std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base13_State_baseV2E) +16 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +24 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +32 (int (*)(...))std::__future_base::_State_baseV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_State_baseV2 + size=32 align=8 + base size=28 base align=8 +std::__future_base::_State_baseV2 (0x0x7f34fe5197e0) 0 + vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16) + +Class std::__future_base + size=1 align=1 + base size=0 base align=1 +std::__future_base (0x0x7f34fe5195a0) 0 empty + +Vtable for std::__future_base::_Async_state_commonV2 +std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base21_Async_state_commonV2E) +16 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +24 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +32 (int (*)(...))std::__future_base::_Async_state_commonV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_Async_state_commonV2 + size=48 align=8 + base size=44 base align=8 +std::__future_base::_Async_state_commonV2 (0x0x7f34fda71bc8) 0 + vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16) + std::__future_base::_State_baseV2 (0x0x7f34fda92e40) 0 + primary-for std::__future_base::_Async_state_commonV2 (0x0x7f34fda71bc8) + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f34fdacb720) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7f34fda71f08) 0 + vptr=((& QThread::_ZTV7QThread) + 16) + QObject (0x0x7f34fdacb6c0) 0 + primary-for QThread (0x0x7f34fda71f08) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f34fdacbae0) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7f34fda71f70) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16) + QObject (0x0x7f34fdacba80) 0 + primary-for QThreadPool (0x0x7f34fda71f70) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f34fdacbcc0) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f34fdb123c0) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7f34fdb1b000) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16) + QObject (0x0x7f34fdb12360) 0 + primary-for QTimeLine (0x0x7f34fdb1b000) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f34fdb12600) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7f34fdb1b068) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16) + QObject (0x0x7f34fdb125a0) 0 + primary-for QTimer (0x0x7f34fdb1b068) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f34fdb59f60) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f34fdb59f00) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f34fd81b060) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7f34fdc0e750) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16) + QObject (0x0x7f34fd81b000) 0 + primary-for QTranslator (0x0x7f34fdc0e750) + +Class QTransposeProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTransposeProxyModel::QPrivateSignal (0x0x7f34fd81b2a0) 0 empty + +Vtable for QTransposeProxyModel +QTransposeProxyModel::_ZTV20QTransposeProxyModel: 53 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QTransposeProxyModel) +16 (int (*)(...))QTransposeProxyModel::metaObject +24 (int (*)(...))QTransposeProxyModel::qt_metacast +32 (int (*)(...))QTransposeProxyModel::qt_metacall +40 (int (*)(...))QTransposeProxyModel::~QTransposeProxyModel +48 (int (*)(...))QTransposeProxyModel::~QTransposeProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTransposeProxyModel::index +120 (int (*)(...))QTransposeProxyModel::parent +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))QTransposeProxyModel::rowCount +144 (int (*)(...))QTransposeProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QTransposeProxyModel::headerData +184 (int (*)(...))QTransposeProxyModel::setHeaderData +192 (int (*)(...))QTransposeProxyModel::itemData +200 (int (*)(...))QTransposeProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QTransposeProxyModel::insertRows +264 (int (*)(...))QTransposeProxyModel::insertColumns +272 (int (*)(...))QTransposeProxyModel::removeRows +280 (int (*)(...))QTransposeProxyModel::removeColumns +288 (int (*)(...))QTransposeProxyModel::moveRows +296 (int (*)(...))QTransposeProxyModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QTransposeProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QTransposeProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QTransposeProxyModel::setSourceModel +392 (int (*)(...))QTransposeProxyModel::mapToSource +400 (int (*)(...))QTransposeProxyModel::mapFromSource +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QTransposeProxyModel + size=16 align=8 + base size=16 base align=8 +QTransposeProxyModel (0x0x7f34fdc0e7b8) 0 + vptr=((& QTransposeProxyModel::_ZTV20QTransposeProxyModel) + 16) + QAbstractProxyModel (0x0x7f34fdc0e820) 0 + primary-for QTransposeProxyModel (0x0x7f34fdc0e7b8) + QAbstractItemModel (0x0x7f34fdc0e888) 0 + primary-for QAbstractProxyModel (0x0x7f34fdc0e820) + QObject (0x0x7f34fd81b240) 0 + primary-for QAbstractItemModel (0x0x7f34fdc0e888) + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f34fd81b480) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f34fd8a2e40) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f34fd8a2f60) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f34fd94e360) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f34fd9a7f08) 0 + QVector (0x0x7f34fd9b4a80) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f34fd9b4d80) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f34fd630d20) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f34fd68cd20) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7f34fd6f6de0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f34fd6f6e40) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f34fd735d20) 0 + +Class QGeoAddress + size=8 align=8 + base size=8 base align=8 +QGeoAddress (0x0x7f34fd735f00) 0 + +Class QGeoCoordinate + size=8 align=8 + base size=8 base align=8 +QGeoCoordinate (0x0x7f34fd7db540) 0 + +Class QGeoShape + size=8 align=8 + base size=8 base align=8 +QGeoShape (0x0x7f34fd42eb40) 0 + +Class QGeoAreaMonitorInfo + size=8 align=8 + base size=8 base align=8 +QGeoAreaMonitorInfo (0x0x7f34fd478d20) 0 + +Class QGeoPositionInfo + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfo (0x0x7f34fd478de0) 0 + +Class QGeoPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoPositionInfoSource::QPrivateSignal (0x0x7f34fd4bf120) 0 empty + +Vtable for QGeoPositionInfoSource +QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource: 23 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QGeoPositionInfoSource) +16 (int (*)(...))QGeoPositionInfoSource::metaObject +24 (int (*)(...))QGeoPositionInfoSource::qt_metacast +32 (int (*)(...))QGeoPositionInfoSource::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoPositionInfoSource (0x0x7f34fd4839c0) 0 + vptr=((& QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource) + 16) + QObject (0x0x7f34fd4bf0c0) 0 + primary-for QGeoPositionInfoSource (0x0x7f34fd4839c0) + +Class QGeoAreaMonitorSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoAreaMonitorSource::QPrivateSignal (0x0x7f34fd4bf960) 0 empty + +Vtable for QGeoAreaMonitorSource +QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource: 23 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QGeoAreaMonitorSource) +16 (int (*)(...))QGeoAreaMonitorSource::metaObject +24 (int (*)(...))QGeoAreaMonitorSource::qt_metacast +32 (int (*)(...))QGeoAreaMonitorSource::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoAreaMonitorSource::setPositionInfoSource +120 (int (*)(...))QGeoAreaMonitorSource::positionInfoSource +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoAreaMonitorSource + size=24 align=8 + base size=24 base align=8 +QGeoAreaMonitorSource (0x0x7f34fd483af8) 0 + vptr=((& QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource) + 16) + QObject (0x0x7f34fd4bf900) 0 + primary-for QGeoAreaMonitorSource (0x0x7f34fd483af8) + +Class QGeoRectangle + size=8 align=8 + base size=8 base align=8 +QGeoRectangle (0x0x7f34fd483b60) 0 + QGeoShape (0x0x7f34fd4bfa80) 0 + +Class QGeoCircle + size=8 align=8 + base size=8 base align=8 +QGeoCircle (0x0x7f34fd53ff08) 0 + QGeoShape (0x0x7f34fd543f00) 0 + +Class QGeoLocation + size=8 align=8 + base size=8 base align=8 +QGeoLocation (0x0x7f34fd5d2120) 0 + +Class QGeoPath + size=8 align=8 + base size=8 base align=8 +QGeoPath (0x0x7f34fd11d9c0) 0 + QGeoShape (0x0x7f34fd121780) 0 + +Class QGeoPolygon + size=8 align=8 + base size=8 base align=8 +QGeoPolygon (0x0x7f34fd168b60) 0 + QGeoShape (0x0x7f34fd172960) 0 + +Class QGeoSatelliteInfo + size=8 align=8 + base size=8 base align=8 +QGeoSatelliteInfo (0x0x7f34fd1c1b40) 0 + +Class QGeoSatelliteInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoSatelliteInfoSource::QPrivateSignal (0x0x7f34fd1c1c60) 0 empty + +Vtable for QGeoSatelliteInfoSource +QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QGeoSatelliteInfoSource) +16 (int (*)(...))QGeoSatelliteInfoSource::metaObject +24 (int (*)(...))QGeoSatelliteInfoSource::qt_metacast +32 (int (*)(...))QGeoSatelliteInfoSource::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoSatelliteInfoSource::setUpdateInterval +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual + +Class QGeoSatelliteInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoSatelliteInfoSource (0x0x7f34fd1b6ea0) 0 + vptr=((& QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource) + 16) + QObject (0x0x7f34fd1c1c00) 0 + primary-for QGeoSatelliteInfoSource (0x0x7f34fd1b6ea0) + +Vtable for QGeoPositionInfoSourceFactory +QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory: 7 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI29QGeoPositionInfoSourceFactory) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactory + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactory (0x0x7f34fd1c1de0) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory) + 16) + +Class QNmeaPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNmeaPositionInfoSource::QPrivateSignal (0x0x7f34fd1f8060) 0 empty + +Vtable for QNmeaPositionInfoSource +QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource: 24 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QNmeaPositionInfoSource) +16 (int (*)(...))QNmeaPositionInfoSource::metaObject +24 (int (*)(...))QNmeaPositionInfoSource::qt_metacast +32 (int (*)(...))QNmeaPositionInfoSource::qt_metacall +40 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +48 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QNmeaPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))QNmeaPositionInfoSource::lastKnownPosition +136 (int (*)(...))QNmeaPositionInfoSource::supportedPositioningMethods +144 (int (*)(...))QNmeaPositionInfoSource::minimumUpdateInterval +152 (int (*)(...))QNmeaPositionInfoSource::error +160 (int (*)(...))QNmeaPositionInfoSource::startUpdates +168 (int (*)(...))QNmeaPositionInfoSource::stopUpdates +176 (int (*)(...))QNmeaPositionInfoSource::requestUpdate +184 (int (*)(...))QNmeaPositionInfoSource::parsePosInfoFromNmeaData + +Class QNmeaPositionInfoSource + size=32 align=8 + base size=32 base align=8 +QNmeaPositionInfoSource (0x0x7f34fd1b6f08) 0 + vptr=((& QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource) + 16) + QGeoPositionInfoSource (0x0x7f34fd1b6f70) 0 + primary-for QNmeaPositionInfoSource (0x0x7f34fd1b6f08) + QObject (0x0x7f34fd1f8000) 0 + primary-for QGeoPositionInfoSource (0x0x7f34fd1b6f70) + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fd235420) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fd235780) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fd235960) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fd235cc0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fd235ea0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fd26f240) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fd26f420) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fd26f780) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fd26f960) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fd26fcc0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fd26fea0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fd2a7240) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fd2a7420) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fd2a7780) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fd2a7960) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fd2a7cc0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fd3061e0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fd306540) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fd3066c0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fd306a20) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fd306ba0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fd306f00) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fcf340c0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fcf34420) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fcf345a0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fcf34900) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fcf34a80) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fcf34de0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fcf34f60) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fcf68300) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7f34fcf68480) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7f34fcf687e0) 0 empty + diff --git a/tests/auto/bic/data/QtPositioning.5.14.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtPositioning.5.14.0.linux-gcc-amd64.txt new file mode 100644 index 0000000..789cea6 --- /dev/null +++ b/tests/auto/bic/data/QtPositioning.5.14.0.linux-gcc-amd64.txt @@ -0,0 +1,5268 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7fe9fb51bd80) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7fe9fb5f3540) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7fe9fb5f3780) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7fe9fb5f39c0) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7fe9fb5f3c00) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7fe9fb5f3d80) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7fe9fb62b180) 0 empty + +Class std::__do_is_implicitly_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_implicitly_default_constructible_impl (0x0x7fe9fb6612a0) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7fe9fb6b5960) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7fe9fb6b5a20) 0 empty + +Class std::__invoke_memfun_ref + size=1 align=1 + base size=0 base align=1 +std::__invoke_memfun_ref (0x0x7fe9fb6b5de0) 0 empty + +Class std::__invoke_memfun_deref + size=1 align=1 + base size=0 base align=1 +std::__invoke_memfun_deref (0x0x7fe9fb6b5e40) 0 empty + +Class std::__invoke_memobj_ref + size=1 align=1 + base size=0 base align=1 +std::__invoke_memobj_ref (0x0x7fe9fb6b5ea0) 0 empty + +Class std::__invoke_memobj_deref + size=1 align=1 + base size=0 base align=1 +std::__invoke_memobj_deref (0x0x7fe9fb6b5f00) 0 empty + +Class std::__invoke_other + size=1 align=1 + base size=0 base align=1 +std::__invoke_other (0x0x7fe9fb6b5f60) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7fe9fb6e1060) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7fe9fb6e1120) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7fe9fb6e11e0) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7fe9fb6e12a0) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7fe9fb6e1600) 0 empty + +Class std::__swappable_details::__do_is_swappable_impl + size=1 align=1 + base size=0 base align=1 +std::__swappable_details::__do_is_swappable_impl (0x0x7fe9fb6e1960) 0 empty + +Class std::__swappable_details::__do_is_nothrow_swappable_impl + size=1 align=1 + base size=0 base align=1 +std::__swappable_details::__do_is_nothrow_swappable_impl (0x0x7fe9fb6e19c0) 0 empty + +Class std::__nonesuch + size=1 align=1 + base size=0 base align=1 +std::__nonesuch (0x0x7fe9fb6e1f60) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7fe9fb330600) 0 empty + +Class std::__nonesuch_no_braces + size=1 align=1 + base size=1 base align=1 +std::__nonesuch_no_braces (0x0x7fe9fb691d68) 0 empty + std::__nonesuch (0x0x7fe9fb330ae0) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7fe9fb3af480) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7fe9fb3af4e0) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7fe9fb40c1e0) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7fe9fb40c240) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7fe9fb3a5270) 0 empty + std::input_iterator_tag (0x0x7fe9fb40c2a0) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7fe9fb3a52d8) 0 empty + std::forward_iterator_tag (0x0x7fe9fb3a5340) 0 empty + std::input_iterator_tag (0x0x7fe9fb40c300) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7fe9fb3a53a8) 0 empty + std::bidirectional_iterator_tag (0x0x7fe9fb3a5410) 0 empty + std::forward_iterator_tag (0x0x7fe9fb3a5478) 0 empty + std::input_iterator_tag (0x0x7fe9fb40c360) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7fe9fb499e40) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7fe9fb499f60) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7fe9fb4c12a0) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7fe9fb4c15a0) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7fe9fb4c16c0) 0 empty + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7fe9fb14f9c0) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7fe9fb14fcc0) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7fe9fb14fd20) 0 + +Class __pthread_rwlock_arch_t + size=56 align=8 + base size=56 base align=8 +__pthread_rwlock_arch_t (0x0x7fe9fb14fde0) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7fe9fb14fe40) 0 + +Class __pthread_mutex_s + size=40 align=8 + base size=40 base align=8 +__pthread_mutex_s (0x0x7fe9fb14fea0) 0 + +Class __pthread_cond_s + size=48 align=8 + base size=48 base align=8 +__pthread_cond_s (0x0x7fe9fb14ff00) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7fe9fb1901e0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7fe9fb190480) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7fe9fb1904e0) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7fe9fb2492a0) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7fe9fb3a57b8) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16) + std::exception (0x0x7fe9fb249480) 0 nearly-empty + primary-for std::bad_exception (0x0x7fe9fb3a57b8) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7fe9fb249660) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7fe9fb3a5820) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16) + std::exception (0x0x7fe9fb249a20) 0 nearly-empty + primary-for std::bad_cast (0x0x7fe9fb3a5820) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7fe9fb3a5888) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16) + std::exception (0x0x7fe9fb249c00) 0 nearly-empty + primary-for std::bad_typeid (0x0x7fe9fb3a5888) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7fe9fb249de0) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7fe9fb2823c0) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7fe9fb3a58f0) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16) + std::exception (0x0x7fe9fb282a80) 0 nearly-empty + primary-for std::bad_alloc (0x0x7fe9fb3a58f0) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7fe9fb3a5958) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16) + std::bad_alloc (0x0x7fe9fb3a59c0) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7fe9fb3a5958) + std::exception (0x0x7fe9fb282c60) 0 nearly-empty + primary-for std::bad_alloc (0x0x7fe9fb3a59c0) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7fe9fb282e40) 0 empty + +Class std::__allocator_traits_base + size=1 align=1 + base size=0 base align=1 +std::__allocator_traits_base (0x0x7fe9fb2b3060) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7fe9faf29540) 0 empty + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7fe9fab9ba80) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7fe9fab9bba0) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7fe9fab9bd80) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7fe9fabde480) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7fe9fac18c00) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7fe9facd0120) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7fe9fac5f820) 0 + std::__atomic_flag_base (0x0x7fe9facd0180) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7fe9fac5ff70) 0 + QAtomicInteger (0x0x7fe9fa842000) 0 + QBasicAtomicInteger (0x0x7fe9fa7f93c0) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7fe9fa43bf00) 0 empty + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7fe9fa4a24e0) 0 + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7fe9fa4a2c00) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7fe9fa694c30) 0 + QGenericArgument (0x0x7fe9fa4a2ea0) 0 + +Class QMetaObject::SuperData + size=8 align=8 + base size=8 base align=8 +QMetaObject::SuperData (0x0x7fe9fa4dc360) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7fe9fa4dc300) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7fe9fa4dcc00) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7fe9fa18d720) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7fe9fa18de40) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7fe9fa25dc60) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7fe9fa29c000) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7fe9fa2e2300) 0 empty + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7fe9f9f96b40) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7fe9f9f96c00) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7fe9fa05dd20) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7fe9fa05dde0) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7fe9fa05de40) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7fe9fa05dea0) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7fe9fa05df00) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7fe9fa0b5060) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7fe9fa0b50c0) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7fe9f9dd5060) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7fe9f9dd50c0) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7fe9f9b81120) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7fe9f9b812a0) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7fe9f9d07420) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7fe9f9d077e0) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7fe9f9d07a80) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7fe9f9d07c60) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7fe9f9953c60) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7fe9f9b93d68) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16) + std::exception (0x0x7fe9f9953d20) 0 nearly-empty + primary-for std::logic_error (0x0x7fe9f9b93d68) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7fe9f9b93dd0) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16) + std::logic_error (0x0x7fe9f9b93e38) 0 + primary-for std::domain_error (0x0x7fe9f9b93dd0) + std::exception (0x0x7fe9f9953d80) 0 nearly-empty + primary-for std::logic_error (0x0x7fe9f9b93e38) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7fe9f9b93ea0) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16) + std::logic_error (0x0x7fe9f9b93f08) 0 + primary-for std::invalid_argument (0x0x7fe9f9b93ea0) + std::exception (0x0x7fe9f9953de0) 0 nearly-empty + primary-for std::logic_error (0x0x7fe9f9b93f08) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7fe9f9b93f70) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16) + std::logic_error (0x0x7fe9f9b93270) 0 + primary-for std::length_error (0x0x7fe9f9b93f70) + std::exception (0x0x7fe9f9953e40) 0 nearly-empty + primary-for std::logic_error (0x0x7fe9f9b93270) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7fe9f9b932d8) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16) + std::logic_error (0x0x7fe9f9b93618) 0 + primary-for std::out_of_range (0x0x7fe9f9b932d8) + std::exception (0x0x7fe9f9953ea0) 0 nearly-empty + primary-for std::logic_error (0x0x7fe9f9b93618) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7fe9f9b93680) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16) + std::exception (0x0x7fe9f9953f00) 0 nearly-empty + primary-for std::runtime_error (0x0x7fe9f9b93680) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7fe9f99b3000) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16) + std::runtime_error (0x0x7fe9f99b3068) 0 + primary-for std::range_error (0x0x7fe9f99b3000) + std::exception (0x0x7fe9f9953f60) 0 nearly-empty + primary-for std::runtime_error (0x0x7fe9f99b3068) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7fe9f99b30d0) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16) + std::runtime_error (0x0x7fe9f99b3138) 0 + primary-for std::overflow_error (0x0x7fe9f99b30d0) + std::exception (0x0x7fe9f99b9000) 0 nearly-empty + primary-for std::runtime_error (0x0x7fe9f99b3138) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7fe9f99b31a0) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16) + std::runtime_error (0x0x7fe9f99b3208) 0 + primary-for std::underflow_error (0x0x7fe9f99b31a0) + std::exception (0x0x7fe9f99b9060) 0 nearly-empty + primary-for std::runtime_error (0x0x7fe9f99b3208) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7fe9f99b91e0) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7fe9f99b9540) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7fe9f99b9d80) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7fe9f99b3618) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16) + std::runtime_error (0x0x7fe9f99b3680) 0 + primary-for std::system_error (0x0x7fe9f99b3618) + std::exception (0x0x7fe9f99ee960) 0 nearly-empty + primary-for std::runtime_error (0x0x7fe9f99b3680) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7fe9f99b38f0) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16) + std::system_error (0x0x7fe9f99b3958) 0 + primary-for std::ios_base::failure (0x0x7fe9f99b38f0) + std::runtime_error (0x0x7fe9f99b39c0) 0 + primary-for std::system_error (0x0x7fe9f99b3958) + std::exception (0x0x7fe9f9a23f00) 0 nearly-empty + primary-for std::runtime_error (0x0x7fe9f99b39c0) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7fe9f9a23f60) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7fe9f9a56000) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7fe9f9a56060) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7fe9f9a23ea0) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7fe9f9718960) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7fe9f97c2b40) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2 entries +0 ((& std::basic_ostream::_ZTVSo) + 24) +8 ((& std::basic_ostream::_ZTVSo) + 64) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2 entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2 entries +0 ((& std::basic_istream::_ZTVSi) + 24) +8 ((& std::basic_istream::_ZTVSi) + 64) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2 entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64) + +Construction vtable for std::basic_istream (0x0x7fe9f939d0d0 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10 entries +0 24 +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0 +32 0 +40 18446744073709551592 +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0 +72 0 + +Construction vtable for std::basic_ostream (0x0x7fe9f939d1a0 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10 entries +0 8 +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0 +32 0 +40 18446744073709551608 +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0 +72 0 + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7 entries +0 ((& std::basic_iostream::_ZTVSd) + 24) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64) +40 ((& std::basic_iostream::_ZTVSd) + 104) +48 ((& std::basic_iostream::_ZTVSd) + 64) + +Construction vtable for std::basic_istream (0x0x7fe9f939df70 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10 entries +0 24 +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 0 +32 0 +40 18446744073709551592 +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0 +72 0 + +Construction vtable for std::basic_ostream (0x0x7fe9f939d340 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10 entries +0 8 +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 0 +32 0 +40 18446744073709551608 +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0 +72 0 + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7 entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64) + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7fe9f93fc4e0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7fe9f93fc540) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7fe9f9116900) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7fe9f91ba780) 0 + +Class QStringView + size=16 align=8 + base size=16 base align=8 +QStringView (0x0x7fe9f91bac00) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7fe9f929bcc0) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7fe9f8f53c60) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7fe9f8f53b40) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7fe9f8e14ae0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7fe9f8b876c0) 0 + +Class QtPrivate::ArgBase + size=1 align=1 + base size=1 base align=1 +QtPrivate::ArgBase (0x0x7fe9f88144e0) 0 + +Class QtPrivate::QStringViewArg + size=24 align=8 + base size=24 base align=8 +QtPrivate::QStringViewArg (0x0x7fe9f8c15d68) 0 + QtPrivate::ArgBase (0x0x7fe9f8814540) 0 + +Class QtPrivate::QLatin1StringArg + size=24 align=8 + base size=24 base align=8 +QtPrivate::QLatin1StringArg (0x0x7fe9f8c15dd0) 0 + QtPrivate::ArgBase (0x0x7fe9f8814720) 0 + +Class std::__erased_type + size=1 align=1 + base size=0 base align=1 +std::__erased_type (0x0x7fe9f88e4660) 0 empty + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7fe9f88e46c0) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7fe9f88e4840) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7fe9f88e4900) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7fe9f88f41a0) 0 + std::__uses_alloc_base (0x0x7fe9f88e48a0) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7fe9f8644c60) 0 empty + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7fe9f86b6410) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16) + std::exception (0x0x7fe9f86bf5a0) 0 nearly-empty + primary-for std::bad_function_call (0x0x7fe9f86b6410) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7fe9f86bf660) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7fe9f86bf6c0) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7fe9f86bf9c0) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7fe9f84b8e40) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7fe9f84b8f00) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7fe9f81ec660) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7fe9f84fef70) 0 + std::iterator (0x0x7fe9f81ecd80) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7fe9f821d0d0) 0 + std::_Bit_iterator_base (0x0x7fe9f821d138) 0 + std::iterator (0x0x7fe9f8216420) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7fe9f821d1a0) 0 + std::_Bit_iterator_base (0x0x7fe9f821d208) 0 + std::iterator (0x0x7fe9f8216c00) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7fe9f806e780) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7fe9f813a540) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7fe9f813a5a0) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7fe9f821ddd0) 0 empty + QListData::NotIndirectLayout (0x0x7fe9f813a600) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7fe9f80958c0) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7fe9f813a660) 0 empty + QListData::NotIndirectLayout (0x0x7fe9f813a6c0) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7fe9f821de38) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7fe9f813a720) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7fe9f813a780) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7fe9f813a4e0) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7fe9f7e2b900) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7fe9f7f0be40) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7fe9f7f0bde0) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7fe9f7f10a28) 0 + QList (0x0x7fe9f7f10a90) 0 + QListSpecialMethods (0x0x7fe9f7f3a0c0) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7fe9f7c09000) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7fe9f7c90240) 0 + +Class std::_Rb_tree_header + size=40 align=8 + base size=40 base align=8 +std::_Rb_tree_header (0x0x7fe9f7c905a0) 0 + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7fe9f7a15ba0) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7fe9f7a15f00) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7fe9f7a36480) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7fe9f7a369c0) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7fe9f7a8aba0) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7fe9f7abf2a0) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7fe9f7759120) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7fe9f77b07e0) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7fe9f7804d20) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7fe9f76d3300) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7fe9f73abd80) 0 empty + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7fe9f73abde0) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7fe9f7412000) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7fe9f73abf60) 0 + vptr=((& QObject::_ZTV7QObject) + 16) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7fe9f7482de0) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7fe9f7482f60) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7fe9f74b6840) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 0 +48 0 +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7fe9f7475bc8) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16) + QObject (0x0x7fe9f74b67e0) 0 + primary-for QAbstractAnimation (0x0x7fe9f7475bc8) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7fe9f74b6c00) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7fe9f7475c30) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16) + QObject (0x0x7fe9f74b6ba0) 0 + primary-for QAnimationDriver (0x0x7fe9f7475c30) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7fe9f74b6e40) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7fe9f7475c98) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16) + QObject (0x0x7fe9f74b6de0) 0 + primary-for QEventLoop (0x0x7fe9f7475c98) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7fe9f7103720) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7fe9f71037e0) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7fe9f7103840) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7fe9f7475dd0) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16) + QObject (0x0x7fe9f7103780) 0 + primary-for QAbstractEventDispatcher (0x0x7fe9f7475dd0) + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7fe9f716b840) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7fe9f71934e0) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7fe9f725ae40) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7fe9f725ade0) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7fe9f7283120) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7fe9f6f90840) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7fe9f6f90900) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7fe9f6f908a0) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7fe9f6f90960) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7fe9f6f907e0) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7fe9f7089c00) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7fe9f6d532a0) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7fe9f6d53240) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7fe9f6d533c0) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7fe9f6d53360) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7fe9f6e1e540) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7fe9f6e8f180) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7fe9f6b46f60) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7fe9f6b43f70) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16) + QObject (0x0x7fe9f6b46f00) 0 + primary-for QAbstractItemModel (0x0x7fe9f6b43f70) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7fe9f6c28360) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractTableModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7fe9f6b8d5b0) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16) + QAbstractItemModel (0x0x7fe9f6b8d618) 0 + primary-for QAbstractTableModel (0x0x7fe9f6b8d5b0) + QObject (0x0x7fe9f6c28300) 0 + primary-for QAbstractItemModel (0x0x7fe9f6b8d618) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7fe9f6c284e0) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractListModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7fe9f6b8d680) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16) + QAbstractItemModel (0x0x7fe9f6b8d6e8) 0 + primary-for QAbstractListModel (0x0x7fe9f6b8d680) + QObject (0x0x7fe9f6c28480) 0 + primary-for QAbstractItemModel (0x0x7fe9f6b8d6e8) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7fe9f6c28c00) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7fe9f6c28cc0) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7fe9f6b8d7b8) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16) + QAbstractItemModel (0x0x7fe9f6b8d820) 0 + primary-for QAbstractProxyModel (0x0x7fe9f6b8d7b8) + QObject (0x0x7fe9f6c28c60) 0 + primary-for QAbstractItemModel (0x0x7fe9f6b8d820) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7fe9f6c28f00) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 0 +48 0 +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7fe9f6b8d888) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16) + QObject (0x0x7fe9f6c28ea0) 0 + primary-for QAbstractState (0x0x7fe9f6b8d888) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7fe9f6cb7180) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 0 +48 0 +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7fe9f6b8d8f0) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16) + QObject (0x0x7fe9f6cb7120) 0 + primary-for QAbstractTransition (0x0x7fe9f6b8d8f0) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7fe9f6cb7480) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 0 +48 0 +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7fe9f6b8d958) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16) + QAbstractAnimation (0x0x7fe9f6b8d9c0) 0 + primary-for QAnimationGroup (0x0x7fe9f6b8d958) + QObject (0x0x7fe9f6cb7420) 0 + primary-for QAbstractAnimation (0x0x7fe9f6b8d9c0) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7fe9f6918780) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7fe9f69b0120) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7fe9f6a115a0) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7fe9f6a5c840) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7fe9f6a51f70) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16) + QObject (0x0x7fe9f6a5c7e0) 0 + primary-for QIODevice (0x0x7fe9f6a51f70) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7fe9f6aa41e0) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7fe9f6a840d0) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16) + QIODevice (0x0x7fe9f6a84138) 0 + primary-for QBuffer (0x0x7fe9f6a840d0) + QObject (0x0x7fe9f6aa4180) 0 + primary-for QIODevice (0x0x7fe9f6a84138) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7fe9f6aa4480) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7fe9f6aa4420) 0 + +Class QStaticByteArrayMatcherBase::Skiptable + size=256 align=1 + base size=256 base align=1 +QStaticByteArrayMatcherBase::Skiptable (0x0x7fe9f6aa4600) 0 + +Class QStaticByteArrayMatcherBase + size=256 align=16 + base size=256 base align=16 +QStaticByteArrayMatcherBase (0x0x7fe9f6aa45a0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7fe9f6af34e0) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7fe9f67333c0) 0 + +Class QCalendar::YearMonthDay + size=12 align=4 + base size=12 base align=4 +QCalendar::YearMonthDay (0x0x7fe9f68a08a0) 0 + +Class QCalendar + size=8 align=8 + base size=8 base align=8 +QCalendar (0x0x7fe9f68a0840) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7fe9f68d90c0) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7fe9f6531960) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7fe9f659b600) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7fe9f659b660) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7fe9f659b5a0) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7fe9f6668d20) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7fe9f66b9600) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7fe9f635e2a0) 0 + +Vtable for __gnu_cxx::__concurrence_lock_error +__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_lock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +24 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +32 (int (*)(...))__gnu_cxx::__concurrence_lock_error::what + +Class __gnu_cxx::__concurrence_lock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_lock_error (0x0x7fe9f6365138) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16) + std::exception (0x0x7fe9f63b0120) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_lock_error (0x0x7fe9f6365138) + +Vtable for __gnu_cxx::__concurrence_unlock_error +__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx26__concurrence_unlock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +24 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +32 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::what + +Class __gnu_cxx::__concurrence_unlock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_unlock_error (0x0x7fe9f63651a0) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16) + std::exception (0x0x7fe9f63b0240) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7fe9f63651a0) + +Vtable for __gnu_cxx::__concurrence_broadcast_error +__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx29__concurrence_broadcast_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +24 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +32 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::what + +Class __gnu_cxx::__concurrence_broadcast_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_broadcast_error (0x0x7fe9f6365208) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16) + std::exception (0x0x7fe9f63b0360) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7fe9f6365208) + +Vtable for __gnu_cxx::__concurrence_wait_error +__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_wait_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +24 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +32 (int (*)(...))__gnu_cxx::__concurrence_wait_error::what + +Class __gnu_cxx::__concurrence_wait_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_wait_error (0x0x7fe9f63652d8) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16) + std::exception (0x0x7fe9f63b0480) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_wait_error (0x0x7fe9f63652d8) + +Class __gnu_cxx::__mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__mutex (0x0x7fe9f63d64e0) 0 + +Class __gnu_cxx::__recursive_mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__recursive_mutex (0x0x7fe9f63d67e0) 0 + +Class __gnu_cxx::__scoped_lock + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__scoped_lock (0x0x7fe9f63d6ae0) 0 + +Class __gnu_cxx::__cond + size=48 align=8 + base size=48 base align=8 +__gnu_cxx::__cond (0x0x7fe9f63d6e40) 0 + +Vtable for std::bad_weak_ptr +std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12bad_weak_ptr) +16 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +24 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +32 (int (*)(...))std::bad_weak_ptr::what + +Class std::bad_weak_ptr + size=8 align=8 + base size=8 base align=8 +std::bad_weak_ptr (0x0x7fe9f6365340) 0 nearly-empty + vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16) + std::exception (0x0x7fe9f6476060) 0 nearly-empty + primary-for std::bad_weak_ptr (0x0x7fe9f6365340) + +Class std::_Sp_make_shared_tag + size=1 align=1 + base size=0 base align=1 +std::_Sp_make_shared_tag (0x0x7fe9f64db000) 0 empty + +Class std::__sp_array_delete + size=1 align=1 + base size=0 base align=1 +std::__sp_array_delete (0x0x7fe9f64db420) 0 empty + +Class std::_Sp_locker + size=2 align=1 + base size=2 base align=1 +std::_Sp_locker (0x0x7fe9f62232a0) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7fe9f6251780) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7fe9f6251900) 0 + +Class QtPrivate::EnableInternalData + size=1 align=1 + base size=0 base align=1 +QtPrivate::EnableInternalData (0x0x7fe9f62db240) 0 empty + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7fe9f5f08900) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7fe9f5f088a0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7fe9f6099240) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7fe9f6099300) 0 empty + +Class QCborError + size=4 align=4 + base size=4 base align=4 +QCborError (0x0x7fe9f5d1e540) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7fe9f5d1ecc0) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7fe9f5dd8ba0) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7fe9f5e3e960) 0 + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7fe9f5ebd3c0) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7fe9f5c0b360) 0 + +Class QCborParserError + size=16 align=8 + base size=12 base align=8 +QCborParserError (0x0x7fe9f5c71ea0) 0 + +Class QCborValue + size=24 align=8 + base size=20 base align=8 +QCborValue (0x0x7fe9f5c71f60) 0 + +Class QCborValueRef + size=16 align=8 + base size=16 base align=8 +QCborValueRef (0x0x7fe9f5adab40) 0 + +Class QCborArray::Iterator + size=16 align=8 + base size=16 base align=8 +QCborArray::Iterator (0x0x7fe9f57805a0) 0 + +Class QCborArray::ConstIterator + size=16 align=8 + base size=16 base align=8 +QCborArray::ConstIterator (0x0x7fe9f5780600) 0 + +Class QCborArray + size=8 align=8 + base size=8 base align=8 +QCborArray (0x0x7fe9f5780540) 0 + +Class QCborMap::Iterator + size=16 align=8 + base size=16 base align=8 +QCborMap::Iterator (0x0x7fe9f54fe1e0) 0 + +Class QCborMap::ConstIterator + size=16 align=8 + base size=16 base align=8 +QCborMap::ConstIterator (0x0x7fe9f54fe240) 0 + +Class QCborMap + size=8 align=8 + base size=8 base align=8 +QCborMap (0x0x7fe9f54fe180) 0 + +Class qfloat16::Wrap + size=2 align=2 + base size=2 base align=2 +qfloat16::Wrap (0x0x7fe9f53039c0) 0 + +Class qfloat16 + size=2 align=2 + base size=2 base align=2 +qfloat16 (0x0x7fe9f5303960) 0 + +Class QCborStreamWriter + size=8 align=8 + base size=8 base align=8 +QCborStreamWriter (0x0x7fe9f53e7660) 0 + +Class QCborStreamReader + size=24 align=8 + base size=20 base align=8 +QCborStreamReader (0x0x7fe9f541b3c0) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7fe9f549e4e0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7fe9f549e6c0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7fe9f5192cc0) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7fe9f528e240) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7fe9f525ad68) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16) + QEvent (0x0x7fe9f528e600) 0 + primary-for QTimerEvent (0x0x7fe9f525ad68) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7fe9f525add0) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16) + QEvent (0x0x7fe9f528e6c0) 0 + primary-for QChildEvent (0x0x7fe9f525add0) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7fe9f52bb340) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16) + QEvent (0x0x7fe9f528ed20) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7fe9f52bb340) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7fe9f52bb3a8) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16) + QEvent (0x0x7fe9f528ede0) 0 + primary-for QDeferredDeleteEvent (0x0x7fe9f52bb3a8) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7fe9f528ef00) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7fe9f52bb410) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16) + QObject (0x0x7fe9f528eea0) 0 + primary-for QCoreApplication (0x0x7fe9f52bb410) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7fe9f52e7180) 0 + +Class QConcatenateTablesProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QConcatenateTablesProxyModel::QPrivateSignal (0x0x7fe9f52e7300) 0 empty + +Vtable for QConcatenateTablesProxyModel +QConcatenateTablesProxyModel::_ZTV28QConcatenateTablesProxyModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI28QConcatenateTablesProxyModel) +16 (int (*)(...))QConcatenateTablesProxyModel::metaObject +24 (int (*)(...))QConcatenateTablesProxyModel::qt_metacast +32 (int (*)(...))QConcatenateTablesProxyModel::qt_metacall +40 (int (*)(...))QConcatenateTablesProxyModel::~QConcatenateTablesProxyModel +48 (int (*)(...))QConcatenateTablesProxyModel::~QConcatenateTablesProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QConcatenateTablesProxyModel::index +120 (int (*)(...))QConcatenateTablesProxyModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))QConcatenateTablesProxyModel::rowCount +144 (int (*)(...))QConcatenateTablesProxyModel::columnCount +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))QConcatenateTablesProxyModel::data +168 (int (*)(...))QConcatenateTablesProxyModel::setData +176 (int (*)(...))QConcatenateTablesProxyModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QConcatenateTablesProxyModel::itemData +200 (int (*)(...))QConcatenateTablesProxyModel::setItemData +208 (int (*)(...))QConcatenateTablesProxyModel::mimeTypes +216 (int (*)(...))QConcatenateTablesProxyModel::mimeData +224 (int (*)(...))QConcatenateTablesProxyModel::canDropMimeData +232 (int (*)(...))QConcatenateTablesProxyModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QConcatenateTablesProxyModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QConcatenateTablesProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QConcatenateTablesProxyModel + size=16 align=8 + base size=16 base align=8 +QConcatenateTablesProxyModel (0x0x7fe9f52bb478) 0 + vptr=((& QConcatenateTablesProxyModel::_ZTV28QConcatenateTablesProxyModel) + 16) + QAbstractItemModel (0x0x7fe9f52bb4e0) 0 + primary-for QConcatenateTablesProxyModel (0x0x7fe9f52bb478) + QObject (0x0x7fe9f52e72a0) 0 + primary-for QAbstractItemModel (0x0x7fe9f52bb4e0) + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7fe9f52e74e0) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7fe9f52e7600) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7fe9f52e7780) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7fe9f4f59ea0) 0 + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7fe9f4f98600) 0 + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7fe9f50d2300) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7fe9f50c86e8) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16) + QIODevice (0x0x7fe9f50c8750) 0 + primary-for QFileDevice (0x0x7fe9f50c86e8) + QObject (0x0x7fe9f50d22a0) 0 + primary-for QIODevice (0x0x7fe9f50c8750) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7fe9f50d2c00) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7fe9f50c8888) 0 + vptr=((& QFile::_ZTV5QFile) + 16) + QFileDevice (0x0x7fe9f50c88f0) 0 + primary-for QFile (0x0x7fe9f50c8888) + QIODevice (0x0x7fe9f50c8958) 0 + primary-for QFileDevice (0x0x7fe9f50c88f0) + QObject (0x0x7fe9f50d2ba0) 0 + primary-for QIODevice (0x0x7fe9f50c8958) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7fe9f4d472a0) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7fe9f4e16180) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7fe9f4b3f180) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7fe9f4b3f900) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7fe9f4c6fa20) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7fe9f4c3a618) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16) + QAbstractTransition (0x0x7fe9f4c3a680) 0 + primary-for QEventTransition (0x0x7fe9f4c3a618) + QObject (0x0x7fe9f4c6f9c0) 0 + primary-for QAbstractTransition (0x0x7fe9f4c3a680) + +Vtable for QException +QException::_ZTV10QException: 7 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7fe9f4c3a6e8) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16) + std::exception (0x0x7fe9f4c6fc00) 0 nearly-empty + primary-for QException (0x0x7fe9f4c3a6e8) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7fe9f4c3a750) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16) + QException (0x0x7fe9f4c3a7b8) 0 nearly-empty + primary-for QUnhandledException (0x0x7fe9f4c3a750) + std::exception (0x0x7fe9f4c6fc60) 0 nearly-empty + primary-for QException (0x0x7fe9f4c3a7b8) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7fe9f4c6fcc0) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7fe9f4c6fd80) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7fe9f4c6fde0) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7fe9f4cb3060) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7fe9f4c3a820) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16) + QObject (0x0x7fe9f4cb3000) 0 + primary-for QFileSelector (0x0x7fe9f4c3a820) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7fe9f4cb32a0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7fe9f4c3a888) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16) + QObject (0x0x7fe9f4cb3240) 0 + primary-for QFileSystemWatcher (0x0x7fe9f4c3a888) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7fe9f4cb34e0) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7fe9f4c3a8f0) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16) + QAbstractState (0x0x7fe9f4c3a958) 0 + primary-for QFinalState (0x0x7fe9f4c3a8f0) + QObject (0x0x7fe9f4cb3480) 0 + primary-for QAbstractState (0x0x7fe9f4c3a958) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0 +32 0 + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7fe9f4cb36c0) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7fe9f4cb3960) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7fe9f4c3aa28) 0 + QBasicMutex (0x0x7fe9f490c600) 0 + +Class QRecursiveMutex + size=8 align=8 + base size=8 base align=8 +QRecursiveMutex (0x0x7fe9f4c3aa90) 0 + QMutex (0x0x7fe9f4c3aaf8) 0 + QBasicMutex (0x0x7fe9f490c840) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7fe9f490c8a0) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7fe9f490cea0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7fe9f493b4e0) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7fe9f493b6c0) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16) + +Class std::__mutex_base + size=40 align=8 + base size=40 base align=8 +std::__mutex_base (0x0x7fe9f49afea0) 0 + +Class std::mutex + size=40 align=8 + base size=40 base align=8 +std::mutex (0x0x7fe9f49c1410) 0 + std::__mutex_base (0x0x7fe9f49aff00) 0 + +Class std::defer_lock_t + size=1 align=1 + base size=0 base align=1 +std::defer_lock_t (0x0x7fe9f49d4120) 0 empty + +Class std::try_to_lock_t + size=1 align=1 + base size=0 base align=1 +std::try_to_lock_t (0x0x7fe9f49d4180) 0 empty + +Class std::adopt_lock_t + size=1 align=1 + base size=0 base align=1 +std::adopt_lock_t (0x0x7fe9f49d41e0) 0 empty + +Class std::__recursive_mutex_base + size=40 align=8 + base size=40 base align=8 +std::__recursive_mutex_base (0x0x7fe9f49d4c00) 0 + +Class std::recursive_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_mutex (0x0x7fe9f49c1478) 0 + std::__recursive_mutex_base (0x0x7fe9f49d4c60) 0 + +Class std::timed_mutex + size=40 align=8 + base size=40 base align=8 +std::timed_mutex (0x0x7fe9f49d2af0) 0 + std::__mutex_base (0x0x7fe9f4a0a060) 0 + std::__timed_mutex_impl (0x0x7fe9f4a0a0c0) 0 empty + +Class std::recursive_timed_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_timed_mutex (0x0x7fe9f49d2e70) 0 + std::__recursive_mutex_base (0x0x7fe9f4a0a420) 0 + std::__timed_mutex_impl (0x0x7fe9f4a0a480) 0 empty + +Class std::once_flag + size=4 align=4 + base size=4 base align=4 +std::once_flag (0x0x7fe9f4a0aba0) 0 + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7fe9f4a0ade0) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7fe9f46f1180) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 0 +48 0 +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7fe9f46ce270) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16) + QObject (0x0x7fe9f46f1120) 0 + primary-for QFutureWatcherBase (0x0x7fe9f46ce270) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7fe9f47224e0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7fe9f46cea90) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16) + QAbstractState (0x0x7fe9f46ceaf8) 0 + primary-for QHistoryState (0x0x7fe9f46cea90) + QObject (0x0x7fe9f4722480) 0 + primary-for QAbstractState (0x0x7fe9f46ceaf8) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7fe9f47227e0) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7fe9f46ceb60) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16) + QAbstractProxyModel (0x0x7fe9f46cebc8) 0 + primary-for QIdentityProxyModel (0x0x7fe9f46ceb60) + QAbstractItemModel (0x0x7fe9f46cec30) 0 + primary-for QAbstractProxyModel (0x0x7fe9f46cebc8) + QObject (0x0x7fe9f4722780) 0 + primary-for QAbstractItemModel (0x0x7fe9f46cec30) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7fe9f47229c0) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7fe9f4808300) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7fe9f48025b0) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16) + QObject (0x0x7fe9f48082a0) 0 + primary-for QItemSelectionModel (0x0x7fe9f48025b0) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7fe9f4802750) 0 + QList (0x0x7fe9f48027b8) 0 + QListSpecialMethods (0x0x7fe9f4808de0) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7fe9f48b1720) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7fe9f46143c0) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7fe9f4661360) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7fe9f4661600) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7fe9f46a5960) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7fe9f46a59c0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7fe9f46a5900) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7fe9f43d38a0) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7fe9f43d3900) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7fe9f443b120) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7fe9f443b180) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7fe9f443b0c0) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7fe9f41615a0) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7fe9f4160410) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16) + QObject (0x0x7fe9f4161540) 0 + primary-for QLibrary (0x0x7fe9f4160410) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7fe9f41ab420) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7fe9f4161f00) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7fe9f4242ba0) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7fe9f4242c00) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7fe9f3eb3a80) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7fe9f3f23c60) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7fe9f3fc2060) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7fe9f403b300) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7fe9f3cda840) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7fe9f3cdaa80) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7fe9f3cdaa20) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7fe9f3cdaea0) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7fe9f3d90de0) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7fe9f3c01600) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7fe9f3c01660) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7fe9f3c69ea0) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7fe9f37c60c0) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7fe9f37c61e0) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7fe9f3809780) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7fe9f3814068) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16) + QObject (0x0x7fe9f3809720) 0 + primary-for QMimeData (0x0x7fe9f3814068) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7fe9f3809960) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7fe9f38da8a0) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7fe9f38da960) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7fe9f38d1bc8) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16) + QObject (0x0x7fe9f38da900) 0 + primary-for QObjectCleanupHandler (0x0x7fe9f38d1bc8) + +Class QOperatingSystemVersion + size=16 align=4 + base size=16 base align=4 +QOperatingSystemVersion (0x0x7fe9f38daa80) 0 + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7fe9f3966240) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7fe9f395e478) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16) + QAnimationGroup (0x0x7fe9f395e4e0) 0 + primary-for QParallelAnimationGroup (0x0x7fe9f395e478) + QAbstractAnimation (0x0x7fe9f395e548) 0 + primary-for QAnimationGroup (0x0x7fe9f395e4e0) + QObject (0x0x7fe9f39661e0) 0 + primary-for QAbstractAnimation (0x0x7fe9f395e548) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7fe9f3966480) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7fe9f395e5b0) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16) + QAbstractAnimation (0x0x7fe9f395e618) 0 + primary-for QPauseAnimation (0x0x7fe9f395e5b0) + QObject (0x0x7fe9f3966420) 0 + primary-for QAbstractAnimation (0x0x7fe9f395e618) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7fe9f399e000) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7fe9f35d9180) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7fe9f35cf958) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16) + QObject (0x0x7fe9f35d9120) 0 + primary-for QPluginLoader (0x0x7fe9f35cf958) + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7fe9f35d92a0) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7fe9f36a9720) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7fe9f369bdd0) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16) + QIODevice (0x0x7fe9f369be38) 0 + primary-for QProcess (0x0x7fe9f369bdd0) + QObject (0x0x7fe9f36a96c0) 0 + primary-for QIODevice (0x0x7fe9f369be38) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7fe9f36a9de0) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7fe9f369bea0) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16) + QAbstractAnimation (0x0x7fe9f369bf08) 0 + primary-for QVariantAnimation (0x0x7fe9f369bea0) + QObject (0x0x7fe9f36a9d80) 0 + primary-for QAbstractAnimation (0x0x7fe9f369bf08) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7fe9f36f80c0) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7fe9f36f9000) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16) + QVariantAnimation (0x0x7fe9f36f9068) 0 + primary-for QPropertyAnimation (0x0x7fe9f36f9000) + QAbstractAnimation (0x0x7fe9f36f90d0) 0 + primary-for QVariantAnimation (0x0x7fe9f36f9068) + QObject (0x0x7fe9f36f8060) 0 + primary-for QAbstractAnimation (0x0x7fe9f36f90d0) + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7fe9f376e7e0) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7fe9f3479540) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7fe9f34794e0) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7fe9f32692a0) 0 + +Class QRandomGenerator::Storage + size=2504 align=8 + base size=2504 base align=8 +QRandomGenerator::Storage (0x0x7fe9f3074f00) 0 + +Class QRandomGenerator + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator (0x0x7fe9f3074ea0) 0 + +Class QRandomGenerator64 + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator64 (0x0x7fe9f3103d68) 0 + QRandomGenerator (0x0x7fe9f311da20) 0 + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7fe9f3142600) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7fe9f31428a0) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7fe9f3142d80) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7fe9f2dcc2a0) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7fe9f2e42180) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7fe9f2ebf1e0) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7fe9f2f76240) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7fe9f2c31360) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7fe9f2c31600) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7fe9f2bdd750) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16) + QFileDevice (0x0x7fe9f2bdd7b8) 0 + primary-for QSaveFile (0x0x7fe9f2bdd750) + QIODevice (0x0x7fe9f2bdd820) 0 + primary-for QFileDevice (0x0x7fe9f2bdd7b8) + QObject (0x0x7fe9f2c315a0) 0 + primary-for QIODevice (0x0x7fe9f2bdd820) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7fe9f2c31c00) 0 + +Class QSemaphoreReleaser + size=16 align=8 + base size=12 base align=8 +QSemaphoreReleaser (0x0x7fe9f2c31d80) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7fe9f2d2e9c0) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7fe9f2d42000) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16) + QAnimationGroup (0x0x7fe9f2d42068) 0 + primary-for QSequentialAnimationGroup (0x0x7fe9f2d42000) + QAbstractAnimation (0x0x7fe9f2d420d0) 0 + primary-for QAnimationGroup (0x0x7fe9f2d42068) + QObject (0x0x7fe9f2d2e960) 0 + primary-for QAbstractAnimation (0x0x7fe9f2d420d0) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7fe9f2d2ec00) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7fe9f2d42138) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16) + QObject (0x0x7fe9f2d2eba0) 0 + primary-for QSettings (0x0x7fe9f2d42138) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7fe9f2d770c0) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7fe9f2d421a0) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16) + QObject (0x0x7fe9f2d77060) 0 + primary-for QSharedMemory (0x0x7fe9f2d421a0) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7fe9f2d77300) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7fe9f2d42208) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16) + QObject (0x0x7fe9f2d772a0) 0 + primary-for QSignalMapper (0x0x7fe9f2d42208) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7fe9f2d77540) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7fe9f2d42270) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16) + QAbstractTransition (0x0x7fe9f2d422d8) 0 + primary-for QSignalTransition (0x0x7fe9f2d42270) + QObject (0x0x7fe9f2d774e0) 0 + primary-for QAbstractTransition (0x0x7fe9f2d422d8) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7fe9f2d777e0) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7fe9f2d42340) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16) + QObject (0x0x7fe9f2d77780) 0 + primary-for QSocketNotifier (0x0x7fe9f2d42340) + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7fe9f2d77a20) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7fe9f2d423a8) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16) + QAbstractProxyModel (0x0x7fe9f2d42410) 0 + primary-for QSortFilterProxyModel (0x0x7fe9f2d423a8) + QAbstractItemModel (0x0x7fe9f2d42478) 0 + primary-for QAbstractProxyModel (0x0x7fe9f2d42410) + QObject (0x0x7fe9f2d779c0) 0 + primary-for QAbstractItemModel (0x0x7fe9f2d42478) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7fe9f2d77e40) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7fe9f29f6780) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7fe9f2d42618) 0 + vptr=((& QState::_ZTV6QState) + 16) + QAbstractState (0x0x7fe9f2d42680) 0 + primary-for QState (0x0x7fe9f2d42618) + QObject (0x0x7fe9f29f6720) 0 + primary-for QAbstractState (0x0x7fe9f2d42680) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7fe9f29f6c00) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7fe9f2d42820) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16) + QEvent (0x0x7fe9f29f6c60) 0 + primary-for QStateMachine::SignalEvent (0x0x7fe9f2d42820) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7fe9f2d42888) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16) + QEvent (0x0x7fe9f29f6cc0) 0 + primary-for QStateMachine::WrappedEvent (0x0x7fe9f2d42888) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7fe9f2d426e8) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16) + QState (0x0x7fe9f2d42750) 0 + primary-for QStateMachine (0x0x7fe9f2d426e8) + QAbstractState (0x0x7fe9f2d427b8) 0 + primary-for QState (0x0x7fe9f2d42750) + QObject (0x0x7fe9f29f6ba0) 0 + primary-for QAbstractState (0x0x7fe9f2d427b8) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7fe9f2a4e0c0) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7fe9f2b26e40) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7fe9f27d51e0) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QStringListModel::itemData +200 (int (*)(...))QStringListModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QStringListModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7fe9f27c21a0) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16) + QAbstractListModel (0x0x7fe9f27c2208) 0 + primary-for QStringListModel (0x0x7fe9f27c21a0) + QAbstractItemModel (0x0x7fe9f27c2270) 0 + primary-for QAbstractListModel (0x0x7fe9f27c2208) + QObject (0x0x7fe9f27d5180) 0 + primary-for QAbstractItemModel (0x0x7fe9f27c2270) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7fe9f27d5300) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7fe9f27d53c0) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7fe9f27d54e0) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7fe9f27c22d8) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16) + QFile (0x0x7fe9f27c2340) 0 + primary-for QTemporaryFile (0x0x7fe9f27c22d8) + QFileDevice (0x0x7fe9f27c23a8) 0 + primary-for QFile (0x0x7fe9f27c2340) + QIODevice (0x0x7fe9f27c2410) 0 + primary-for QFileDevice (0x0x7fe9f27c23a8) + QObject (0x0x7fe9f27d5480) 0 + primary-for QIODevice (0x0x7fe9f27c2410) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7fe9f27d5840) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7fe9f28500c0) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 0 +64 0 + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7fe9f2850060) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7fe9f2850a80) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7fe9f2850c60) 0 + +Vtable for std::thread::_State +std::thread::_State::_ZTVNSt6thread6_StateE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6thread6_StateE) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual + +Class std::thread::_State + size=8 align=8 + base size=8 base align=8 +std::thread::_State (0x0x7fe9f2850ea0) 0 nearly-empty + vptr=((& std::thread::_State::_ZTVNSt6thread6_StateE) + 16) + +Class std::thread::id + size=8 align=8 + base size=8 base align=8 +std::thread::id (0x0x7fe9f2850f00) 0 + +Class std::thread + size=8 align=8 + base size=8 base align=8 +std::thread (0x0x7fe9f2850e40) 0 + +Class std::condition_variable + size=48 align=8 + base size=48 base align=8 +std::condition_variable (0x0x7fe9f273f300) 0 + +Class std::__at_thread_exit_elt + size=16 align=8 + base size=16 base align=8 +std::__at_thread_exit_elt (0x0x7fe9f273f6c0) 0 + +Class std::_V2::condition_variable_any + size=64 align=8 + base size=64 base align=8 +std::_V2::condition_variable_any (0x0x7fe9f273f720) 0 + +Class std::__atomic_futex_unsigned_base + size=1 align=1 + base size=0 base align=1 +std::__atomic_futex_unsigned_base (0x0x7fe9f24c6a20) 0 empty + +Vtable for std::future_error +std::future_error::_ZTVSt12future_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12future_error) +16 (int (*)(...))std::future_error::~future_error +24 (int (*)(...))std::future_error::~future_error +32 (int (*)(...))std::future_error::what + +Class std::future_error + size=32 align=8 + base size=32 base align=8 +std::future_error (0x0x7fe9f24ca7b8) 0 + vptr=((& std::future_error::_ZTVSt12future_error) + 16) + std::logic_error (0x0x7fe9f24ca820) 0 + primary-for std::future_error (0x0x7fe9f24ca7b8) + std::exception (0x0x7fe9f24f4180) 0 nearly-empty + primary-for std::logic_error (0x0x7fe9f24ca820) + +Class std::__future_base::_Result_base::_Deleter + size=1 align=1 + base size=0 base align=1 +std::__future_base::_Result_base::_Deleter (0x0x7fe9f24f48a0) 0 empty + +Vtable for std::__future_base::_Result_base +std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE) +16 (int (*)(...))__cxa_pure_virtual +24 0 +32 0 + +Class std::__future_base::_Result_base + size=16 align=8 + base size=16 base align=8 +std::__future_base::_Result_base (0x0x7fe9f24f4840) 0 + vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16) + +Class std::__future_base::_State_baseV2::__exception_ptr_tag + size=1 align=1 + base size=0 base align=1 +std::__future_base::_State_baseV2::__exception_ptr_tag (0x0x7fe9f2310000) 0 empty + +Class std::__future_base::_State_baseV2::_Make_ready + size=32 align=8 + base size=32 base align=8 +std::__future_base::_State_baseV2::_Make_ready (0x0x7fe9f22f9068) 0 + std::__at_thread_exit_elt (0x0x7fe9f23100c0) 0 + +Vtable for std::__future_base::_State_baseV2 +std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base13_State_baseV2E) +16 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +24 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +32 (int (*)(...))std::__future_base::_State_baseV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_State_baseV2 + size=32 align=8 + base size=28 base align=8 +std::__future_base::_State_baseV2 (0x0x7fe9f24f4a20) 0 + vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16) + +Class std::__future_base + size=1 align=1 + base size=0 base align=1 +std::__future_base (0x0x7fe9f24f47e0) 0 empty + +Vtable for std::__future_base::_Async_state_commonV2 +std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base21_Async_state_commonV2E) +16 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +24 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +32 (int (*)(...))std::__future_base::_Async_state_commonV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_Async_state_commonV2 + size=48 align=8 + base size=44 base align=8 +std::__future_base::_Async_state_commonV2 (0x0x7fe9f1a53d68) 0 + vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16) + std::__future_base::_State_baseV2 (0x0x7fe9f1aaf0c0) 0 + primary-for std::__future_base::_Async_state_commonV2 (0x0x7fe9f1a53d68) + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7fe9f1aaf960) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7fe9f1ac10d0) 0 + vptr=((& QThread::_ZTV7QThread) + 16) + QObject (0x0x7fe9f1aaf900) 0 + primary-for QThread (0x0x7fe9f1ac10d0) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7fe9f1aafd20) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7fe9f1ac1138) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16) + QObject (0x0x7fe9f1aafcc0) 0 + primary-for QThreadPool (0x0x7fe9f1ac1138) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7fe9f1aaff00) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7fe9f1af4600) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7fe9f1ac11a0) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16) + QObject (0x0x7fe9f1af45a0) 0 + primary-for QTimeLine (0x0x7fe9f1ac11a0) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7fe9f1af4840) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7fe9f1ac1208) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16) + QObject (0x0x7fe9f1af47e0) 0 + primary-for QTimer (0x0x7fe9f1ac1208) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7fe9f1b621e0) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7fe9f1b62180) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7fe9f18002a0) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7fe9f17f58f0) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16) + QObject (0x0x7fe9f1800240) 0 + primary-for QTranslator (0x0x7fe9f17f58f0) + +Class QTransposeProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTransposeProxyModel::QPrivateSignal (0x0x7fe9f18004e0) 0 empty + +Vtable for QTransposeProxyModel +QTransposeProxyModel::_ZTV20QTransposeProxyModel: 53 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QTransposeProxyModel) +16 (int (*)(...))QTransposeProxyModel::metaObject +24 (int (*)(...))QTransposeProxyModel::qt_metacast +32 (int (*)(...))QTransposeProxyModel::qt_metacall +40 (int (*)(...))QTransposeProxyModel::~QTransposeProxyModel +48 (int (*)(...))QTransposeProxyModel::~QTransposeProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTransposeProxyModel::index +120 (int (*)(...))QTransposeProxyModel::parent +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))QTransposeProxyModel::rowCount +144 (int (*)(...))QTransposeProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QTransposeProxyModel::headerData +184 (int (*)(...))QTransposeProxyModel::setHeaderData +192 (int (*)(...))QTransposeProxyModel::itemData +200 (int (*)(...))QTransposeProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QTransposeProxyModel::insertRows +264 (int (*)(...))QTransposeProxyModel::insertColumns +272 (int (*)(...))QTransposeProxyModel::removeRows +280 (int (*)(...))QTransposeProxyModel::removeColumns +288 (int (*)(...))QTransposeProxyModel::moveRows +296 (int (*)(...))QTransposeProxyModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QTransposeProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QTransposeProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QTransposeProxyModel::setSourceModel +392 (int (*)(...))QTransposeProxyModel::mapToSource +400 (int (*)(...))QTransposeProxyModel::mapFromSource +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QTransposeProxyModel + size=16 align=8 + base size=16 base align=8 +QTransposeProxyModel (0x0x7fe9f17f5958) 0 + vptr=((& QTransposeProxyModel::_ZTV20QTransposeProxyModel) + 16) + QAbstractProxyModel (0x0x7fe9f17f59c0) 0 + primary-for QTransposeProxyModel (0x0x7fe9f17f5958) + QAbstractItemModel (0x0x7fe9f17f5a28) 0 + primary-for QAbstractProxyModel (0x0x7fe9f17f59c0) + QObject (0x0x7fe9f1800480) 0 + primary-for QAbstractItemModel (0x0x7fe9f17f5a28) + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7fe9f18006c0) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7fe9f18f8ba0) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7fe9f18f8cc0) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7fe9f19a50c0) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7fe9f14fdd00) 0 + QVector (0x0x7fe9f15097e0) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7fe9f1509ae0) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7fe9f158ca80) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7fe9f15e9a80) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7fe9f1654b40) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7fe9f1654ba0) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7fe9f1693a80) 0 + +Class QGeoAddress + size=8 align=8 + base size=8 base align=8 +QGeoAddress (0x0x7fe9f1693c60) 0 + +Class QGeoCoordinate + size=8 align=8 + base size=8 base align=8 +QGeoCoordinate (0x0x7fe9f13372a0) 0 + +Class QGeoShape + size=8 align=8 + base size=8 base align=8 +QGeoShape (0x0x7fe9f13878a0) 0 + +Class QGeoAreaMonitorInfo + size=8 align=8 + base size=8 base align=8 +QGeoAreaMonitorInfo (0x0x7fe9f13dba80) 0 + +Class QGeoPositionInfo + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfo (0x0x7fe9f13dbb40) 0 + +Class QGeoPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoPositionInfoSource::QPrivateSignal (0x0x7fe9f13dbe40) 0 empty + +Vtable for QGeoPositionInfoSource +QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource: 23 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QGeoPositionInfoSource) +16 (int (*)(...))QGeoPositionInfoSource::metaObject +24 (int (*)(...))QGeoPositionInfoSource::qt_metacast +32 (int (*)(...))QGeoPositionInfoSource::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoPositionInfoSource (0x0x7fe9f13e17b8) 0 + vptr=((& QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource) + 16) + QObject (0x0x7fe9f13dbde0) 0 + primary-for QGeoPositionInfoSource (0x0x7fe9f13e17b8) + +Class QGeoAreaMonitorSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoAreaMonitorSource::QPrivateSignal (0x0x7fe9f142f6c0) 0 empty + +Vtable for QGeoAreaMonitorSource +QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource: 23 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QGeoAreaMonitorSource) +16 (int (*)(...))QGeoAreaMonitorSource::metaObject +24 (int (*)(...))QGeoAreaMonitorSource::qt_metacast +32 (int (*)(...))QGeoAreaMonitorSource::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoAreaMonitorSource::setPositionInfoSource +120 (int (*)(...))QGeoAreaMonitorSource::positionInfoSource +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoAreaMonitorSource + size=24 align=8 + base size=24 base align=8 +QGeoAreaMonitorSource (0x0x7fe9f13e18f0) 0 + vptr=((& QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource) + 16) + QObject (0x0x7fe9f142f660) 0 + primary-for QGeoAreaMonitorSource (0x0x7fe9f13e18f0) + +Class QGeoRectangle + size=8 align=8 + base size=8 base align=8 +QGeoRectangle (0x0x7fe9f13e1958) 0 + QGeoShape (0x0x7fe9f142f7e0) 0 + +Class QGeoCircle + size=8 align=8 + base size=8 base align=8 +QGeoCircle (0x0x7fe9f149cd00) 0 + QGeoShape (0x0x7fe9f14a6c60) 0 + +Class QGeoLocation + size=8 align=8 + base size=8 base align=8 +QGeoLocation (0x0x7fe9f111be40) 0 + +Class QGeoPath + size=8 align=8 + base size=8 base align=8 +QGeoPath (0x0x7fe9f11857b8) 0 + QGeoShape (0x0x7fe9f118a4e0) 0 + +Class QGeoPolygon + size=8 align=8 + base size=8 base align=8 +QGeoPolygon (0x0x7fe9f11d1958) 0 + QGeoShape (0x0x7fe9f11d56c0) 0 + +Class QGeoSatelliteInfo + size=8 align=8 + base size=8 base align=8 +QGeoSatelliteInfo (0x0x7fe9f12248a0) 0 + +Class QGeoSatelliteInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoSatelliteInfoSource::QPrivateSignal (0x0x7fe9f12249c0) 0 empty + +Vtable for QGeoSatelliteInfoSource +QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QGeoSatelliteInfoSource) +16 (int (*)(...))QGeoSatelliteInfoSource::metaObject +24 (int (*)(...))QGeoSatelliteInfoSource::qt_metacast +32 (int (*)(...))QGeoSatelliteInfoSource::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoSatelliteInfoSource::setUpdateInterval +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual + +Class QGeoSatelliteInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoSatelliteInfoSource (0x0x7fe9f1215c98) 0 + vptr=((& QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource) + 16) + QObject (0x0x7fe9f1224960) 0 + primary-for QGeoSatelliteInfoSource (0x0x7fe9f1215c98) + +Vtable for QGeoPositionInfoSourceFactory +QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory: 7 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI29QGeoPositionInfoSourceFactory) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactory + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactory (0x0x7fe9f1224b40) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory) + 16) + +Vtable for QGeoPositionInfoSourceFactoryV2 +QGeoPositionInfoSourceFactoryV2::_ZTV31QGeoPositionInfoSourceFactoryV2: 10 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI31QGeoPositionInfoSourceFactoryV2) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))__cxa_pure_virtual +64 (int (*)(...))__cxa_pure_virtual +72 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactoryV2 + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactoryV2 (0x0x7fe9f1215d00) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactoryV2::_ZTV31QGeoPositionInfoSourceFactoryV2) + 16) + QGeoPositionInfoSourceFactory (0x0x7fe9f1224d20) 0 nearly-empty + primary-for QGeoPositionInfoSourceFactoryV2 (0x0x7fe9f1215d00) + +Class QNmeaPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNmeaPositionInfoSource::QPrivateSignal (0x0x7fe9f1224f60) 0 empty + +Vtable for QNmeaPositionInfoSource +QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource: 24 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QNmeaPositionInfoSource) +16 (int (*)(...))QNmeaPositionInfoSource::metaObject +24 (int (*)(...))QNmeaPositionInfoSource::qt_metacast +32 (int (*)(...))QNmeaPositionInfoSource::qt_metacall +40 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +48 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QNmeaPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))QNmeaPositionInfoSource::lastKnownPosition +136 (int (*)(...))QNmeaPositionInfoSource::supportedPositioningMethods +144 (int (*)(...))QNmeaPositionInfoSource::minimumUpdateInterval +152 (int (*)(...))QNmeaPositionInfoSource::error +160 (int (*)(...))QNmeaPositionInfoSource::startUpdates +168 (int (*)(...))QNmeaPositionInfoSource::stopUpdates +176 (int (*)(...))QNmeaPositionInfoSource::requestUpdate +184 (int (*)(...))QNmeaPositionInfoSource::parsePosInfoFromNmeaData + +Class QNmeaPositionInfoSource + size=32 align=8 + base size=32 base align=8 +QNmeaPositionInfoSource (0x0x7fe9f1215d68) 0 + vptr=((& QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource) + 16) + QGeoPositionInfoSource (0x0x7fe9f1215dd0) 0 + primary-for QNmeaPositionInfoSource (0x0x7fe9f1215d68) + QObject (0x0x7fe9f1224f00) 0 + primary-for QGeoPositionInfoSource (0x0x7fe9f1215dd0) + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f12a0360) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f12a06c0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f12a08a0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f12a0c00) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f12a0de0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0edc180) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0edc360) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0edc6c0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0edc8a0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0edcc00) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0edcde0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0f12180) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0f12360) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0f126c0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0f128a0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0f12c00) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0f74120) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0f74480) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0f74600) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0f74960) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0f74ae0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0f74e40) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0fa4000) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0fa4360) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0fa44e0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0fa4840) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0fa49c0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0fa4d20) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0fa4ea0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0fd7240) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fe9f0fd73c0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fe9f0fd7720) 0 empty + diff --git a/tests/auto/bic/data/QtPositioning.5.15.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtPositioning.5.15.0.linux-gcc-amd64.txt new file mode 100644 index 0000000..3b5b77b --- /dev/null +++ b/tests/auto/bic/data/QtPositioning.5.15.0.linux-gcc-amd64.txt @@ -0,0 +1,5278 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7fd8a8528240) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7fd8a85749c0) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7fd8a8574c00) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7fd8a8574e40) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7fd8a85a00c0) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7fd8a85a0240) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7fd8a85a0600) 0 empty + +Class std::__do_is_implicitly_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_implicitly_default_constructible_impl (0x0x7fd8a85d9720) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7fd8a862fde0) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7fd8a862fea0) 0 empty + +Class std::__invoke_memfun_ref + size=1 align=1 + base size=0 base align=1 +std::__invoke_memfun_ref (0x0x7fd8a865f2a0) 0 empty + +Class std::__invoke_memfun_deref + size=1 align=1 + base size=0 base align=1 +std::__invoke_memfun_deref (0x0x7fd8a865f300) 0 empty + +Class std::__invoke_memobj_ref + size=1 align=1 + base size=0 base align=1 +std::__invoke_memobj_ref (0x0x7fd8a865f360) 0 empty + +Class std::__invoke_memobj_deref + size=1 align=1 + base size=0 base align=1 +std::__invoke_memobj_deref (0x0x7fd8a865f3c0) 0 empty + +Class std::__invoke_other + size=1 align=1 + base size=0 base align=1 +std::__invoke_other (0x0x7fd8a865f420) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7fd8a865f4e0) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7fd8a865f5a0) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7fd8a865f660) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7fd8a865f720) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7fd8a865fa80) 0 empty + +Class std::__swappable_details::__do_is_swappable_impl + size=1 align=1 + base size=0 base align=1 +std::__swappable_details::__do_is_swappable_impl (0x0x7fd8a865fde0) 0 empty + +Class std::__swappable_details::__do_is_nothrow_swappable_impl + size=1 align=1 + base size=0 base align=1 +std::__swappable_details::__do_is_nothrow_swappable_impl (0x0x7fd8a865fe40) 0 empty + +Class std::__nonesuch + size=1 align=1 + base size=0 base align=1 +std::__nonesuch (0x0x7fd8a82a5420) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7fd8a82a5a80) 0 empty + +Class std::__nonesuch_no_braces + size=1 align=1 + base size=1 base align=1 +std::__nonesuch_no_braces (0x0x7fd8a828e618) 0 empty + std::__nonesuch (0x0x7fd8a82a5f60) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7fd8a8328900) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7fd8a8328960) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7fd8a8386660) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7fd8a83866c0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7fd8a828eaf8) 0 empty + std::input_iterator_tag (0x0x7fd8a8386720) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7fd8a828eb60) 0 empty + std::forward_iterator_tag (0x0x7fd8a828ebc8) 0 empty + std::input_iterator_tag (0x0x7fd8a8386780) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7fd8a828ec30) 0 empty + std::bidirectional_iterator_tag (0x0x7fd8a828ec98) 0 empty + std::forward_iterator_tag (0x0x7fd8a828ed00) 0 empty + std::input_iterator_tag (0x0x7fd8a83867e0) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7fd8a8438300) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7fd8a8438420) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7fd8a8438720) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7fd8a8438a20) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7fd8a8438b40) 0 empty + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7fd8a80c8e40) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7fd8a8112180) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7fd8a81121e0) 0 + +Class __pthread_rwlock_arch_t + size=56 align=8 + base size=56 base align=8 +__pthread_rwlock_arch_t (0x0x7fd8a81122a0) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7fd8a8112300) 0 + +Class __pthread_mutex_s + size=40 align=8 + base size=40 base align=8 +__pthread_mutex_s (0x0x7fd8a8112360) 0 + +Class __pthread_cond_s + size=48 align=8 + base size=48 base align=8 +__pthread_cond_s (0x0x7fd8a81123c0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7fd8a8112660) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7fd8a8112900) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7fd8a8112960) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7fd8a81c7720) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7fd8a83f6068) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16) + std::exception (0x0x7fd8a81c7900) 0 nearly-empty + primary-for std::bad_exception (0x0x7fd8a83f6068) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7fd8a81c7ae0) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7fd8a83f60d0) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16) + std::exception (0x0x7fd8a81c7ea0) 0 nearly-empty + primary-for std::bad_cast (0x0x7fd8a83f60d0) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7fd8a83f6138) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16) + std::exception (0x0x7fd8a81f50c0) 0 nearly-empty + primary-for std::bad_typeid (0x0x7fd8a83f6138) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7fd8a81f52a0) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7fd8a81f5840) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7fd8a83f61a0) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16) + std::exception (0x0x7fd8a81f5f00) 0 nearly-empty + primary-for std::bad_alloc (0x0x7fd8a83f61a0) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7fd8a83f6208) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16) + std::bad_alloc (0x0x7fd8a83f6270) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7fd8a83f6208) + std::exception (0x0x7fd8a822e120) 0 nearly-empty + primary-for std::bad_alloc (0x0x7fd8a83f6270) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7fd8a822e300) 0 empty + +Class std::__allocator_traits_base + size=1 align=1 + base size=0 base align=1 +std::__allocator_traits_base (0x0x7fd8a822e4e0) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7fd8a7ea29c0) 0 empty + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7fd8a7b1df00) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7fd8a7b4b060) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7fd8a7b4b240) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7fd8a7b4b900) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7fd8a7bb20c0) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7fd8a7c4a600) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7fd8a7bf30d0) 0 + std::__atomic_flag_base (0x0x7fd8a7c4a660) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7fd8a7bf3820) 0 + QAtomicInteger (0x0x7fd8a7bf3888) 0 + QBasicAtomicInteger (0x0x7fd8a777e8a0) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7fd8a73e2420) 0 empty + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7fd8a741c9c0) 0 + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7fd8a7460120) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7fd8a740b4e0) 0 + QGenericArgument (0x0x7fd8a74603c0) 0 + +Class QMetaObject::SuperData + size=8 align=8 + base size=8 base align=8 +QMetaObject::SuperData (0x0x7fd8a7460840) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7fd8a74607e0) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7fd8a70b2120) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7fd8a7119c00) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7fd8a713b360) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7fd8a720c180) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7fd8a720c4e0) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7fd8a726a7e0) 0 empty + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7fd8a6f64060) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7fd8a6f64120) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7fd8a7017240) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7fd8a7017300) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7fd8a7017360) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7fd8a70173c0) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7fd8a7017420) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7fd8a7017540) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7fd8a70175a0) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7fd8a6d56540) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7fd8a6d565a0) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7fd8a6b0b600) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7fd8a6b0b780) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7fd8a6c82900) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7fd8a6c82cc0) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7fd8a6c82f60) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7fd8a68d3180) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7fd8a6919180) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7fd8a68e5478) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16) + std::exception (0x0x7fd8a6919240) 0 nearly-empty + primary-for std::logic_error (0x0x7fd8a68e5478) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7fd8a68e54e0) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16) + std::logic_error (0x0x7fd8a68e5548) 0 + primary-for std::domain_error (0x0x7fd8a68e54e0) + std::exception (0x0x7fd8a69192a0) 0 nearly-empty + primary-for std::logic_error (0x0x7fd8a68e5548) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7fd8a68e55b0) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16) + std::logic_error (0x0x7fd8a68e5618) 0 + primary-for std::invalid_argument (0x0x7fd8a68e55b0) + std::exception (0x0x7fd8a6919300) 0 nearly-empty + primary-for std::logic_error (0x0x7fd8a68e5618) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7fd8a68e5680) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16) + std::logic_error (0x0x7fd8a68e56e8) 0 + primary-for std::length_error (0x0x7fd8a68e5680) + std::exception (0x0x7fd8a6919360) 0 nearly-empty + primary-for std::logic_error (0x0x7fd8a68e56e8) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7fd8a68e5750) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16) + std::logic_error (0x0x7fd8a68e57b8) 0 + primary-for std::out_of_range (0x0x7fd8a68e5750) + std::exception (0x0x7fd8a69193c0) 0 nearly-empty + primary-for std::logic_error (0x0x7fd8a68e57b8) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7fd8a68e5820) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16) + std::exception (0x0x7fd8a6919420) 0 nearly-empty + primary-for std::runtime_error (0x0x7fd8a68e5820) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7fd8a68e5888) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16) + std::runtime_error (0x0x7fd8a68e58f0) 0 + primary-for std::range_error (0x0x7fd8a68e5888) + std::exception (0x0x7fd8a6919480) 0 nearly-empty + primary-for std::runtime_error (0x0x7fd8a68e58f0) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7fd8a68e5958) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16) + std::runtime_error (0x0x7fd8a68e59c0) 0 + primary-for std::overflow_error (0x0x7fd8a68e5958) + std::exception (0x0x7fd8a69194e0) 0 nearly-empty + primary-for std::runtime_error (0x0x7fd8a68e59c0) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7fd8a68e5a28) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16) + std::runtime_error (0x0x7fd8a68e5a90) 0 + primary-for std::underflow_error (0x0x7fd8a68e5a28) + std::exception (0x0x7fd8a6919540) 0 nearly-empty + primary-for std::runtime_error (0x0x7fd8a68e5a90) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7fd8a69196c0) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7fd8a6919a20) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7fd8a69712a0) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7fd8a68e5ea0) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16) + std::runtime_error (0x0x7fd8a68e5f08) 0 + primary-for std::system_error (0x0x7fd8a68e5ea0) + std::exception (0x0x7fd8a6971e40) 0 nearly-empty + primary-for std::runtime_error (0x0x7fd8a68e5f08) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7fd8a69c21a0) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16) + std::system_error (0x0x7fd8a69c2208) 0 + primary-for std::ios_base::failure (0x0x7fd8a69c21a0) + std::runtime_error (0x0x7fd8a69c2270) 0 + primary-for std::system_error (0x0x7fd8a69c2208) + std::exception (0x0x7fd8a69d2420) 0 nearly-empty + primary-for std::runtime_error (0x0x7fd8a69c2270) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7fd8a69d2480) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7fd8a69d24e0) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7fd8a69d2540) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7fd8a69d23c0) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7fd8a66a0e40) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7fd8a67a2060) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2 entries +0 ((& std::basic_ostream::_ZTVSo) + 24) +8 ((& std::basic_ostream::_ZTVSo) + 64) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2 entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2 entries +0 ((& std::basic_istream::_ZTVSi) + 24) +8 ((& std::basic_istream::_ZTVSi) + 64) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2 entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64) + +Construction vtable for std::basic_istream (0x0x7fd8a631a958 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10 entries +0 24 +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0 +32 0 +40 18446744073709551592 +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0 +72 0 + +Construction vtable for std::basic_ostream (0x0x7fd8a631aa28 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10 entries +0 8 +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0 +32 0 +40 18446744073709551608 +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0 +72 0 + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7 entries +0 ((& std::basic_iostream::_ZTVSd) + 24) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64) +40 ((& std::basic_iostream::_ZTVSd) + 104) +48 ((& std::basic_iostream::_ZTVSd) + 64) + +Construction vtable for std::basic_istream (0x0x7fd8a635b6e8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10 entries +0 24 +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 0 +32 0 +40 18446744073709551592 +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0 +72 0 + +Construction vtable for std::basic_ostream (0x0x7fd8a635b7b8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10 entries +0 8 +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 0 +32 0 +40 18446744073709551608 +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0 +72 0 + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7 entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64) + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7fd8a637f9c0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7fd8a637fa20) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7fd8a60b0de0) 0 + +Class QByteArray::FromBase64Result + size=16 align=8 + base size=12 base align=8 +QByteArray::FromBase64Result (0x0x7fd8a6154b40) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7fd8a625b060) 0 + +Class QStringView + size=16 align=8 + base size=16 base align=8 +QStringView (0x0x7fd8a625b4e0) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7fd8a5f426c0) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7fd8a5fff840) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7fd8a5fff720) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7fd8a5ad2660) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7fd8a5c5f240) 0 + +Class QtPrivate::ArgBase + size=1 align=1 + base size=1 base align=1 +QtPrivate::ArgBase (0x0x7fd8a59f70c0) 0 + +Class QtPrivate::QStringViewArg + size=24 align=8 + base size=24 base align=8 +QtPrivate::QStringViewArg (0x0x7fd8a58e9f70) 0 + QtPrivate::ArgBase (0x0x7fd8a59f7120) 0 + +Class QtPrivate::QLatin1StringArg + size=24 align=8 + base size=24 base align=8 +QtPrivate::QLatin1StringArg (0x0x7fd8a5a03000) 0 + QtPrivate::ArgBase (0x0x7fd8a59f7300) 0 + +Class std::__erased_type + size=1 align=1 + base size=0 base align=1 +std::__erased_type (0x0x7fd8a56bf420) 0 empty + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7fd8a56bf480) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7fd8a56bf600) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7fd8a56bf6c0) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7fd8a5a033a8) 0 + std::__uses_alloc_base (0x0x7fd8a56bf660) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7fd8a5823a20) 0 empty + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7fd8a548a618) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16) + std::exception (0x0x7fd8a54a1360) 0 nearly-empty + primary-for std::bad_function_call (0x0x7fd8a548a618) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7fd8a54a1420) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7fd8a54a1480) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7fd8a54a1780) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7fd8a5294c00) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7fd8a5294cc0) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7fd8a53ca3c0) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7fd8a530e1a0) 0 + std::iterator (0x0x7fd8a53caae0) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7fd8a530e2d8) 0 + std::_Bit_iterator_base (0x0x7fd8a530e340) 0 + std::iterator (0x0x7fd8a53fa180) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7fd8a530e3a8) 0 + std::_Bit_iterator_base (0x0x7fd8a530e410) 0 + std::iterator (0x0x7fd8a53fa960) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7fd8a5212180) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7fd8a4ebcf00) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7fd8a4ebcf60) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7fd8a530ef08) 0 empty + QListData::NotIndirectLayout (0x0x7fd8a4ed8000) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7fd8a4eb1230) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7fd8a4ed8060) 0 empty + QListData::NotIndirectLayout (0x0x7fd8a4ed80c0) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7fd8a530ef70) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7fd8a4ed8120) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7fd8a4ed8180) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7fd8a4ebcea0) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7fd8a4fd5300) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7fd8a4cb1840) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7fd8a4cb17e0) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7fd8a4ca7b60) 0 + QList (0x0x7fd8a4ca7bc8) 0 + QListSpecialMethods (0x0x7fd8a4cb1a80) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7fd8a4d80840) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7fd8a4e13a80) 0 + +Class std::_Rb_tree_header + size=40 align=8 + base size=40 base align=8 +std::_Rb_tree_header (0x0x7fd8a4e13de0) 0 + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7fd8a4b6d420) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7fd8a4b6d780) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7fd8a4b6dcc0) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7fd8a4798240) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7fd8a4801540) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7fd8a4801c00) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7fd8a4855c60) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7fd8a490ed80) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7fd8a458b300) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7fd8a442b960) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7fd8a455e420) 0 empty + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7fd8a455e480) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7fd8a455e660) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7fd8a455e600) 0 + vptr=((& QObject::_ZTV7QObject) + 16) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7fd8a4234480) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7fd8a4234600) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7fd8a4234ea0) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 0 +48 0 +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7fd8a4235340) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16) + QObject (0x0x7fd8a4234e40) 0 + primary-for QAbstractAnimation (0x0x7fd8a4235340) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7fd8a426d2a0) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7fd8a42353a8) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16) + QObject (0x0x7fd8a426d240) 0 + primary-for QAnimationDriver (0x0x7fd8a42353a8) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7fd8a426d4e0) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7fd8a4235410) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16) + QObject (0x0x7fd8a426d480) 0 + primary-for QEventLoop (0x0x7fd8a4235410) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7fd8a426dd80) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7fd8a426de40) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7fd8a426dea0) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7fd8a4235548) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16) + QObject (0x0x7fd8a426dde0) 0 + primary-for QAbstractEventDispatcher (0x0x7fd8a4235548) + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7fd8a42edea0) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7fd8a4319b40) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7fd8a40116c0) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7fd8a4011660) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7fd8a4011960) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7fd8a4140420) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7fd8a41404e0) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7fd8a4140480) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7fd8a4140540) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7fd8a41403c0) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7fd8a3ea17e0) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7fd8a3ee3e40) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7fd8a3ee3de0) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7fd8a3ee3f60) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7fd8a3ee3f00) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7fd8a3be4300) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7fd8a3c3cf00) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7fd8a3d0bd20) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7fd8a3d1a7b8) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16) + QObject (0x0x7fd8a3d0bcc0) 0 + primary-for QAbstractItemModel (0x0x7fd8a3d1a7b8) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7fd8a39f2120) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractTableModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7fd8a3d1add0) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16) + QAbstractItemModel (0x0x7fd8a3d1ae38) 0 + primary-for QAbstractTableModel (0x0x7fd8a3d1add0) + QObject (0x0x7fd8a39f20c0) 0 + primary-for QAbstractItemModel (0x0x7fd8a3d1ae38) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7fd8a39f22a0) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractListModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7fd8a3d1aea0) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16) + QAbstractItemModel (0x0x7fd8a3d1af08) 0 + primary-for QAbstractListModel (0x0x7fd8a3d1aea0) + QObject (0x0x7fd8a39f2240) 0 + primary-for QAbstractItemModel (0x0x7fd8a3d1af08) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7fd8a39f29c0) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7fd8a39f2a80) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7fd8a3a53000) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16) + QAbstractItemModel (0x0x7fd8a3a53068) 0 + primary-for QAbstractProxyModel (0x0x7fd8a3a53000) + QObject (0x0x7fd8a39f2a20) 0 + primary-for QAbstractItemModel (0x0x7fd8a3a53068) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7fd8a39f2cc0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 0 +48 0 +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7fd8a3a530d0) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16) + QObject (0x0x7fd8a39f2c60) 0 + primary-for QAbstractState (0x0x7fd8a3a530d0) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7fd8a39f2f00) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 0 +48 0 +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7fd8a3a53138) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16) + QObject (0x0x7fd8a39f2ea0) 0 + primary-for QAbstractTransition (0x0x7fd8a3a53138) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7fd8a3a8e240) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 0 +48 0 +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7fd8a3a531a0) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16) + QAbstractAnimation (0x0x7fd8a3a53208) 0 + primary-for QAnimationGroup (0x0x7fd8a3a531a0) + QObject (0x0x7fd8a3a8e1e0) 0 + primary-for QAbstractAnimation (0x0x7fd8a3a53208) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7fd8a3ae2540) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7fd8a3b5cea0) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7fd8a378aea0) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7fd8a37fa180) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7fd8a37ebaf8) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16) + QObject (0x0x7fd8a37fa120) 0 + primary-for QIODevice (0x0x7fd8a37ebaf8) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7fd8a37faae0) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7fd8a37ebc30) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16) + QIODevice (0x0x7fd8a37ebc98) 0 + primary-for QBuffer (0x0x7fd8a37ebc30) + QObject (0x0x7fd8a37faa80) 0 + primary-for QIODevice (0x0x7fd8a37ebc98) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7fd8a37fad80) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7fd8a37fad20) 0 + +Class QStaticByteArrayMatcherBase::Skiptable + size=256 align=1 + base size=256 base align=1 +QStaticByteArrayMatcherBase::Skiptable (0x0x7fd8a37faf00) 0 + +Class QStaticByteArrayMatcherBase + size=256 align=16 + base size=256 base align=16 +QStaticByteArrayMatcherBase (0x0x7fd8a37faea0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7fd8a3862de0) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7fd8a38becc0) 0 + +Class QCalendar::YearMonthDay + size=12 align=4 + base size=12 base align=4 +QCalendar::YearMonthDay (0x0x7fd8a364e1e0) 0 + +Class QCalendar + size=8 align=8 + base size=8 base align=8 +QCalendar (0x0x7fd8a364e180) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7fd8a364e9c0) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7fd8a36d42a0) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7fd8a3723f00) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7fd8a3723f60) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7fd8a3723ea0) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7fd8a3418660) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7fd8a3418f00) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7fd8a34edba0) 0 + +Vtable for __gnu_cxx::__concurrence_lock_error +__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_lock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +24 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +32 (int (*)(...))__gnu_cxx::__concurrence_lock_error::what + +Class __gnu_cxx::__concurrence_lock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_lock_error (0x0x7fd8a3410c98) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16) + std::exception (0x0x7fd8a3535a20) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_lock_error (0x0x7fd8a3410c98) + +Vtable for __gnu_cxx::__concurrence_unlock_error +__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx26__concurrence_unlock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +24 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +32 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::what + +Class __gnu_cxx::__concurrence_unlock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_unlock_error (0x0x7fd8a3410d00) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16) + std::exception (0x0x7fd8a3535b40) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7fd8a3410d00) + +Vtable for __gnu_cxx::__concurrence_broadcast_error +__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx29__concurrence_broadcast_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +24 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +32 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::what + +Class __gnu_cxx::__concurrence_broadcast_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_broadcast_error (0x0x7fd8a3410d68) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16) + std::exception (0x0x7fd8a3535c60) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7fd8a3410d68) + +Vtable for __gnu_cxx::__concurrence_wait_error +__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_wait_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +24 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +32 (int (*)(...))__gnu_cxx::__concurrence_wait_error::what + +Class __gnu_cxx::__concurrence_wait_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_wait_error (0x0x7fd8a3410e38) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16) + std::exception (0x0x7fd8a3535d80) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_wait_error (0x0x7fd8a3410e38) + +Class __gnu_cxx::__mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__mutex (0x0x7fd8a3561de0) 0 + +Class __gnu_cxx::__recursive_mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__recursive_mutex (0x0x7fd8a3187120) 0 + +Class __gnu_cxx::__scoped_lock + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__scoped_lock (0x0x7fd8a3187420) 0 + +Class __gnu_cxx::__cond + size=48 align=8 + base size=48 base align=8 +__gnu_cxx::__cond (0x0x7fd8a3187780) 0 + +Vtable for std::bad_weak_ptr +std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12bad_weak_ptr) +16 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +24 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +32 (int (*)(...))std::bad_weak_ptr::what + +Class std::bad_weak_ptr + size=8 align=8 + base size=8 base align=8 +std::bad_weak_ptr (0x0x7fd8a3410ea0) 0 nearly-empty + vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16) + std::exception (0x0x7fd8a31fa960) 0 nearly-empty + primary-for std::bad_weak_ptr (0x0x7fd8a3410ea0) + +Class std::_Sp_make_shared_tag + size=1 align=1 + base size=0 base align=1 +std::_Sp_make_shared_tag (0x0x7fd8a3269900) 0 empty + +Class std::__sp_array_delete + size=1 align=1 + base size=0 base align=1 +std::__sp_array_delete (0x0x7fd8a3269d20) 0 empty + +Class std::_Sp_locker + size=2 align=1 + base size=2 base align=1 +std::_Sp_locker (0x0x7fd8a2f9eba0) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7fd8a30050c0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7fd8a3005240) 0 + +Class QtPrivate::EnableInternalData + size=1 align=1 + base size=0 base align=1 +QtPrivate::EnableInternalData (0x0x7fd8a305cb40) 0 empty + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7fd8a30b8240) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7fd8a30b81e0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7fd8a2e2db40) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7fd8a2e2dc00) 0 empty + +Class QCborError + size=4 align=4 + base size=4 base align=4 +QCborError (0x0x7fd8a2eabe40) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7fd8a2ee0600) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7fd8a2b8b4e0) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7fd8a2bf02a0) 0 + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7fd8a2c46cc0) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7fd8a298dc60) 0 + +Class QCborParserError + size=16 align=8 + base size=12 base align=8 +QCborParserError (0x0x7fd8a2a1f7e0) 0 + +Class QCborValue + size=24 align=8 + base size=20 base align=8 +QCborValue (0x0x7fd8a2a1f8a0) 0 + +Class QCborValueRef + size=16 align=8 + base size=16 base align=8 +QCborValueRef (0x0x7fd8a2859ba0) 0 + +Class QCborArray::Iterator + size=16 align=8 + base size=16 base align=8 +QCborArray::Iterator (0x0x7fd8a28ed540) 0 + +Class QCborArray::ConstIterator + size=16 align=8 + base size=16 base align=8 +QCborArray::ConstIterator (0x0x7fd8a28ed5a0) 0 + +Class QCborArray + size=8 align=8 + base size=8 base align=8 +QCborArray (0x0x7fd8a28ed4e0) 0 + +Class QCborMap::Iterator + size=16 align=8 + base size=16 base align=8 +QCborMap::Iterator (0x0x7fd8a2668180) 0 + +Class QCborMap::ConstIterator + size=16 align=8 + base size=16 base align=8 +QCborMap::ConstIterator (0x0x7fd8a26681e0) 0 + +Class QCborMap + size=8 align=8 + base size=8 base align=8 +QCborMap (0x0x7fd8a2668120) 0 + +Class qfloat16::Wrap + size=2 align=2 + base size=2 base align=2 +qfloat16::Wrap (0x0x7fd8a246e960) 0 + +Class qfloat16 + size=2 align=2 + base size=2 base align=2 +qfloat16 (0x0x7fd8a246e900) 0 + +Class QCborStreamReader + size=24 align=8 + base size=20 base align=8 +QCborStreamReader (0x0x7fd8a255a720) 0 + +Class QCborStreamWriter + size=8 align=8 + base size=8 base align=8 +QCborStreamWriter (0x0x7fd8a21e4cc0) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7fd8a220f5a0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7fd8a220f780) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7fd8a2308d80) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7fd8a2005300) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7fd8a1fd0d68) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16) + QEvent (0x0x7fd8a20056c0) 0 + primary-for QTimerEvent (0x0x7fd8a1fd0d68) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7fd8a1fd0dd0) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16) + QEvent (0x0x7fd8a2005780) 0 + primary-for QChildEvent (0x0x7fd8a1fd0dd0) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7fd8a2031340) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16) + QEvent (0x0x7fd8a2005de0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7fd8a2031340) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7fd8a20313a8) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16) + QEvent (0x0x7fd8a2005ea0) 0 + primary-for QDeferredDeleteEvent (0x0x7fd8a20313a8) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7fd8a204b000) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7fd8a2031410) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16) + QObject (0x0x7fd8a2005f60) 0 + primary-for QCoreApplication (0x0x7fd8a2031410) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7fd8a204b240) 0 + +Class QConcatenateTablesProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QConcatenateTablesProxyModel::QPrivateSignal (0x0x7fd8a204b3c0) 0 empty + +Vtable for QConcatenateTablesProxyModel +QConcatenateTablesProxyModel::_ZTV28QConcatenateTablesProxyModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI28QConcatenateTablesProxyModel) +16 (int (*)(...))QConcatenateTablesProxyModel::metaObject +24 (int (*)(...))QConcatenateTablesProxyModel::qt_metacast +32 (int (*)(...))QConcatenateTablesProxyModel::qt_metacall +40 (int (*)(...))QConcatenateTablesProxyModel::~QConcatenateTablesProxyModel +48 (int (*)(...))QConcatenateTablesProxyModel::~QConcatenateTablesProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QConcatenateTablesProxyModel::index +120 (int (*)(...))QConcatenateTablesProxyModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))QConcatenateTablesProxyModel::rowCount +144 (int (*)(...))QConcatenateTablesProxyModel::columnCount +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))QConcatenateTablesProxyModel::data +168 (int (*)(...))QConcatenateTablesProxyModel::setData +176 (int (*)(...))QConcatenateTablesProxyModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QConcatenateTablesProxyModel::itemData +200 (int (*)(...))QConcatenateTablesProxyModel::setItemData +208 (int (*)(...))QConcatenateTablesProxyModel::mimeTypes +216 (int (*)(...))QConcatenateTablesProxyModel::mimeData +224 (int (*)(...))QConcatenateTablesProxyModel::canDropMimeData +232 (int (*)(...))QConcatenateTablesProxyModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QConcatenateTablesProxyModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QConcatenateTablesProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QConcatenateTablesProxyModel + size=16 align=8 + base size=16 base align=8 +QConcatenateTablesProxyModel (0x0x7fd8a2031478) 0 + vptr=((& QConcatenateTablesProxyModel::_ZTV28QConcatenateTablesProxyModel) + 16) + QAbstractItemModel (0x0x7fd8a20314e0) 0 + primary-for QConcatenateTablesProxyModel (0x0x7fd8a2031478) + QObject (0x0x7fd8a204b360) 0 + primary-for QAbstractItemModel (0x0x7fd8a20314e0) + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7fd8a204b5a0) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7fd8a204b6c0) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7fd8a204b840) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7fd8a21070c0) 0 + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7fd8a21077e0) 0 + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7fd8a1e4e4e0) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7fd8a1e476e8) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16) + QIODevice (0x0x7fd8a1e47750) 0 + primary-for QFileDevice (0x0x7fd8a1e476e8) + QObject (0x0x7fd8a1e4e480) 0 + primary-for QIODevice (0x0x7fd8a1e47750) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7fd8a1e4ede0) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7fd8a1e47888) 0 + vptr=((& QFile::_ZTV5QFile) + 16) + QFileDevice (0x0x7fd8a1e478f0) 0 + primary-for QFile (0x0x7fd8a1e47888) + QIODevice (0x0x7fd8a1e47958) 0 + primary-for QFileDevice (0x0x7fd8a1e478f0) + QObject (0x0x7fd8a1e4ed80) 0 + primary-for QIODevice (0x0x7fd8a1e47958) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7fd8a1ec1480) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7fd8a1b8d360) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7fd8a1ca8360) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7fd8a1ca8ae0) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7fd8a19a4c00) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7fd8a1976618) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16) + QAbstractTransition (0x0x7fd8a1976680) 0 + primary-for QEventTransition (0x0x7fd8a1976618) + QObject (0x0x7fd8a19a4ba0) 0 + primary-for QAbstractTransition (0x0x7fd8a1976680) + +Vtable for QException +QException::_ZTV10QException: 7 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7fd8a19766e8) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16) + std::exception (0x0x7fd8a19a4de0) 0 nearly-empty + primary-for QException (0x0x7fd8a19766e8) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7fd8a1976750) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16) + QException (0x0x7fd8a19767b8) 0 nearly-empty + primary-for QUnhandledException (0x0x7fd8a1976750) + std::exception (0x0x7fd8a19a4e40) 0 nearly-empty + primary-for QException (0x0x7fd8a19767b8) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7fd8a19a4ea0) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7fd8a19a4f60) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7fd8a19ec000) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7fd8a19ec240) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7fd8a1976820) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16) + QObject (0x0x7fd8a19ec1e0) 0 + primary-for QFileSelector (0x0x7fd8a1976820) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7fd8a19ec480) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7fd8a1976888) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16) + QObject (0x0x7fd8a19ec420) 0 + primary-for QFileSystemWatcher (0x0x7fd8a1976888) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7fd8a19ec6c0) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7fd8a19768f0) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16) + QAbstractState (0x0x7fd8a1976958) 0 + primary-for QFinalState (0x0x7fd8a19768f0) + QObject (0x0x7fd8a19ec660) 0 + primary-for QAbstractState (0x0x7fd8a1976958) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0 +32 0 + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7fd8a19ec8a0) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7fd8a19ecb40) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7fd8a1976a28) 0 + QBasicMutex (0x0x7fd8a1a897e0) 0 + +Class QRecursiveMutex + size=8 align=8 + base size=8 base align=8 +QRecursiveMutex (0x0x7fd8a1976a90) 0 + QMutex (0x0x7fd8a1976af8) 0 + QBasicMutex (0x0x7fd8a1a89a20) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7fd8a1a89a80) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7fd8a1ab70c0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7fd8a1ab76c0) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7fd8a1ab78a0) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16) + +Class std::__mutex_base + size=40 align=8 + base size=40 base align=8 +std::__mutex_base (0x0x7fd8a17480c0) 0 + +Class std::mutex + size=40 align=8 + base size=40 base align=8 +std::mutex (0x0x7fd8a1b40410) 0 + std::__mutex_base (0x0x7fd8a1748120) 0 + +Class std::defer_lock_t + size=1 align=1 + base size=0 base align=1 +std::defer_lock_t (0x0x7fd8a1748300) 0 empty + +Class std::try_to_lock_t + size=1 align=1 + base size=0 base align=1 +std::try_to_lock_t (0x0x7fd8a1748360) 0 empty + +Class std::adopt_lock_t + size=1 align=1 + base size=0 base align=1 +std::adopt_lock_t (0x0x7fd8a17483c0) 0 empty + +Class std::__recursive_mutex_base + size=40 align=8 + base size=40 base align=8 +std::__recursive_mutex_base (0x0x7fd8a1748de0) 0 + +Class std::recursive_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_mutex (0x0x7fd8a1b40478) 0 + std::__recursive_mutex_base (0x0x7fd8a1748e40) 0 + +Class std::timed_mutex + size=40 align=8 + base size=40 base align=8 +std::timed_mutex (0x0x7fd8a1745930) 0 + std::__mutex_base (0x0x7fd8a1785240) 0 + std::__timed_mutex_impl (0x0x7fd8a17852a0) 0 empty + +Class std::recursive_timed_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_timed_mutex (0x0x7fd8a1797310) 0 + std::__recursive_mutex_base (0x0x7fd8a1785600) 0 + std::__timed_mutex_impl (0x0x7fd8a1785660) 0 empty + +Class std::once_flag + size=4 align=4 + base size=4 base align=4 +std::once_flag (0x0x7fd8a1785d80) 0 + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7fd8a17cb000) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7fd8a1875360) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 0 +48 0 +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7fd8a184f270) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16) + QObject (0x0x7fd8a1875300) 0 + primary-for QFutureWatcherBase (0x0x7fd8a184f270) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7fd8a18996c0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7fd8a184fa90) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16) + QAbstractState (0x0x7fd8a184faf8) 0 + primary-for QHistoryState (0x0x7fd8a184fa90) + QObject (0x0x7fd8a1899660) 0 + primary-for QAbstractState (0x0x7fd8a184faf8) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7fd8a18999c0) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QIdentityProxyModel::moveRows +296 (int (*)(...))QIdentityProxyModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7fd8a184fb60) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16) + QAbstractProxyModel (0x0x7fd8a184fbc8) 0 + primary-for QIdentityProxyModel (0x0x7fd8a184fb60) + QAbstractItemModel (0x0x7fd8a184fc30) 0 + primary-for QAbstractProxyModel (0x0x7fd8a184fbc8) + QObject (0x0x7fd8a1899960) 0 + primary-for QAbstractItemModel (0x0x7fd8a184fc30) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7fd8a1899ba0) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7fd8a15824e0) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7fd8a157f5b0) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16) + QObject (0x0x7fd8a1582480) 0 + primary-for QItemSelectionModel (0x0x7fd8a157f5b0) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7fd8a157f750) 0 + QList (0x0x7fd8a157f7b8) 0 + QListSpecialMethods (0x0x7fd8a15fa000) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7fd8a1634900) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7fd8a16702a0) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7fd8a16c6240) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7fd8a16c64e0) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7fd8a170b840) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7fd8a170b8a0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7fd8a170b7e0) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7fd8a13b3e40) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7fd8a13b3ea0) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7fd8a11ffde0) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7fd8a11ffe40) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7fd8a11ffd80) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7fd8a12d2120) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7fd8a12cf138) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16) + QObject (0x0x7fd8a12d20c0) 0 + primary-for QLibrary (0x0x7fd8a12cf138) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7fd8a12d2f60) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7fd8a12d2a80) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7fd8a0ff93c0) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7fd8a0ff9420) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7fd8a10772a0) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7fd8a10e7480) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7fd8a0d4e840) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7fd8a0dcbae0) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7fd8a0e95060) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7fd8a0e952a0) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7fd8a0e95240) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7fd8a0e956c0) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7fd8a0b55600) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7fd8a0917de0) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7fd8a0917e40) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7fd8a09a66c0) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7fd8a09eb8a0) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7fd8a09eb9c0) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7fd8a0a2af60) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7fd8a0a2cc98) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16) + QObject (0x0x7fd8a0a2af00) 0 + primary-for QMimeData (0x0x7fd8a0a2cc98) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7fd8a0a4f180) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7fd8a07150c0) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7fd8a0715180) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7fd8a070a820) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16) + QObject (0x0x7fd8a0715120) 0 + primary-for QObjectCleanupHandler (0x0x7fd8a070a820) + +Class QOperatingSystemVersion + size=16 align=4 + base size=16 base align=4 +QOperatingSystemVersion (0x0x7fd8a07152a0) 0 + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7fd8a0784a20) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7fd8a07930d0) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16) + QAnimationGroup (0x0x7fd8a0793138) 0 + primary-for QParallelAnimationGroup (0x0x7fd8a07930d0) + QAbstractAnimation (0x0x7fd8a07931a0) 0 + primary-for QAnimationGroup (0x0x7fd8a0793138) + QObject (0x0x7fd8a07849c0) 0 + primary-for QAbstractAnimation (0x0x7fd8a07931a0) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7fd8a0784c60) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7fd8a0793208) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16) + QAbstractAnimation (0x0x7fd8a0793270) 0 + primary-for QPauseAnimation (0x0x7fd8a0793208) + QObject (0x0x7fd8a0784c00) 0 + primary-for QAbstractAnimation (0x0x7fd8a0793270) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7fd8a07b77e0) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7fd8a07fc960) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7fd8a07fe5b0) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16) + QObject (0x0x7fd8a07fc900) 0 + primary-for QPluginLoader (0x0x7fd8a07fe5b0) + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7fd8a07fca80) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7fd8a04c7f00) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7fd8a04d4a28) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16) + QIODevice (0x0x7fd8a04d4a90) 0 + primary-for QProcess (0x0x7fd8a04d4a28) + QObject (0x0x7fd8a04c7ea0) 0 + primary-for QIODevice (0x0x7fd8a04d4a90) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7fd8a050b600) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7fd8a04d4af8) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16) + QAbstractAnimation (0x0x7fd8a04d4b60) 0 + primary-for QVariantAnimation (0x0x7fd8a04d4af8) + QObject (0x0x7fd8a050b5a0) 0 + primary-for QAbstractAnimation (0x0x7fd8a04d4b60) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7fd8a050b8a0) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7fd8a04d4c30) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16) + QVariantAnimation (0x0x7fd8a04d4c98) 0 + primary-for QPropertyAnimation (0x0x7fd8a04d4c30) + QAbstractAnimation (0x0x7fd8a04d4d00) 0 + primary-for QVariantAnimation (0x0x7fd8a04d4c98) + QObject (0x0x7fd8a050b840) 0 + primary-for QAbstractAnimation (0x0x7fd8a04d4d00) + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7fd8a05b3000) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7fd8a0690d20) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7fd8a0690cc0) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7fd8a047fa80) 0 + +Class QRandomGenerator::Storage + size=2504 align=8 + base size=2504 base align=8 +QRandomGenerator::Storage (0x0x7fd8a02c0720) 0 + +Class QRandomGenerator + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator (0x0x7fd8a02c06c0) 0 + +Class QRandomGenerator64 + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator64 (0x0x7fd89ff349c0) 0 + QRandomGenerator (0x0x7fd89ff60240) 0 + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7fd89ff60de0) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7fd89ffe40c0) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7fd89ffe45a0) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7fd89ffe4a80) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7fd8a005b960) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7fd89fcd39c0) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7fd89fd84a20) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7fd89fe43b40) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7fd89fe43de0) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7fd89fe113a8) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16) + QFileDevice (0x0x7fd89fe11410) 0 + primary-for QSaveFile (0x0x7fd89fe113a8) + QIODevice (0x0x7fd89fe11478) 0 + primary-for QFileDevice (0x0x7fd89fe11410) + QObject (0x0x7fd89fe43d80) 0 + primary-for QIODevice (0x0x7fd89fe11478) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7fd89fe9e480) 0 + +Class QSemaphoreReleaser + size=16 align=8 + base size=12 base align=8 +QSemaphoreReleaser (0x0x7fd89fe9e600) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7fd89fb70240) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7fd89fb68c30) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16) + QAnimationGroup (0x0x7fd89fb68c98) 0 + primary-for QSequentialAnimationGroup (0x0x7fd89fb68c30) + QAbstractAnimation (0x0x7fd89fb68d00) 0 + primary-for QAnimationGroup (0x0x7fd89fb68c98) + QObject (0x0x7fd89fb701e0) 0 + primary-for QAbstractAnimation (0x0x7fd89fb68d00) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7fd89fb70480) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7fd89fb68d68) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16) + QObject (0x0x7fd89fb70420) 0 + primary-for QSettings (0x0x7fd89fb68d68) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7fd89fb70900) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7fd89fb68dd0) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16) + QObject (0x0x7fd89fb708a0) 0 + primary-for QSharedMemory (0x0x7fd89fb68dd0) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7fd89fb70b40) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7fd89fb68e38) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16) + QObject (0x0x7fd89fb70ae0) 0 + primary-for QSignalMapper (0x0x7fd89fb68e38) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7fd89fb70d80) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7fd89fb68ea0) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16) + QAbstractTransition (0x0x7fd89fb68f08) 0 + primary-for QSignalTransition (0x0x7fd89fb68ea0) + QObject (0x0x7fd89fb70d20) 0 + primary-for QAbstractTransition (0x0x7fd89fb68f08) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7fd89fbd8060) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7fd89fb68f70) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16) + QObject (0x0x7fd89fbd8000) 0 + primary-for QSocketNotifier (0x0x7fd89fb68f70) + +Class QSocketDescriptor + size=4 align=4 + base size=4 base align=4 +QSocketDescriptor (0x0x7fd89fbd8240) 0 + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7fd89fbd8e40) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7fd89fbf64e0) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16) + QAbstractProxyModel (0x0x7fd89fbf6548) 0 + primary-for QSortFilterProxyModel (0x0x7fd89fbf64e0) + QAbstractItemModel (0x0x7fd89fbf65b0) 0 + primary-for QAbstractProxyModel (0x0x7fd89fbf6548) + QObject (0x0x7fd89fbd8de0) 0 + primary-for QAbstractItemModel (0x0x7fd89fbf65b0) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7fd89fc322a0) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7fd89fc32ba0) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7fd89fbf6750) 0 + vptr=((& QState::_ZTV6QState) + 16) + QAbstractState (0x0x7fd89fbf67b8) 0 + primary-for QState (0x0x7fd89fbf6750) + QObject (0x0x7fd89fc32b40) 0 + primary-for QAbstractState (0x0x7fd89fbf67b8) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7fd89fc89060) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7fd89fbf6958) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16) + QEvent (0x0x7fd89fc890c0) 0 + primary-for QStateMachine::SignalEvent (0x0x7fd89fbf6958) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7fd89fbf69c0) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16) + QEvent (0x0x7fd89fc89120) 0 + primary-for QStateMachine::WrappedEvent (0x0x7fd89fbf69c0) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7fd89fbf6820) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16) + QState (0x0x7fd89fbf6888) 0 + primary-for QStateMachine (0x0x7fd89fbf6820) + QAbstractState (0x0x7fd89fbf68f0) 0 + primary-for QState (0x0x7fd89fbf6888) + QObject (0x0x7fd89fc89000) 0 + primary-for QAbstractState (0x0x7fd89fbf68f0) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7fd89fc89540) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7fd89f997300) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7fd89fa23660) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QStringListModel::itemData +200 (int (*)(...))QStringListModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QStringListModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7fd89fa1a2d8) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16) + QAbstractListModel (0x0x7fd89fa1a340) 0 + primary-for QStringListModel (0x0x7fd89fa1a2d8) + QAbstractItemModel (0x0x7fd89fa1a3a8) 0 + primary-for QAbstractListModel (0x0x7fd89fa1a340) + QObject (0x0x7fd89fa23600) 0 + primary-for QAbstractItemModel (0x0x7fd89fa1a3a8) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7fd89fa23780) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7fd89fa23840) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7fd89fa23960) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7fd89fa1a410) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16) + QFile (0x0x7fd89fa1a478) 0 + primary-for QTemporaryFile (0x0x7fd89fa1a410) + QFileDevice (0x0x7fd89fa1a4e0) 0 + primary-for QFile (0x0x7fd89fa1a478) + QIODevice (0x0x7fd89fa1a548) 0 + primary-for QFileDevice (0x0x7fd89fa1a4e0) + QObject (0x0x7fd89fa23900) 0 + primary-for QIODevice (0x0x7fd89fa1a548) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7fd89fa23cc0) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7fd89faa1540) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 0 +64 0 + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7fd89faa14e0) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7fd89faa1f00) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7fd89f6f7120) 0 + +Vtable for std::thread::_State +std::thread::_State::_ZTVNSt6thread6_StateE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6thread6_StateE) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual + +Class std::thread::_State + size=8 align=8 + base size=8 base align=8 +std::thread::_State (0x0x7fd89f6f7360) 0 nearly-empty + vptr=((& std::thread::_State::_ZTVNSt6thread6_StateE) + 16) + +Class std::thread::id + size=8 align=8 + base size=8 base align=8 +std::thread::id (0x0x7fd89f6f73c0) 0 + +Class std::thread + size=8 align=8 + base size=8 base align=8 +std::thread (0x0x7fd89f6f7300) 0 + +Class std::condition_variable + size=48 align=8 + base size=48 base align=8 +std::condition_variable (0x0x7fd89f580780) 0 + +Class std::__at_thread_exit_elt + size=16 align=8 + base size=16 base align=8 +std::__at_thread_exit_elt (0x0x7fd89f580b40) 0 + +Class std::_V2::condition_variable_any + size=64 align=8 + base size=64 base align=8 +std::_V2::condition_variable_any (0x0x7fd89f580ba0) 0 + +Class std::__atomic_futex_unsigned_base + size=1 align=1 + base size=0 base align=1 +std::__atomic_futex_unsigned_base (0x0x7fd89f316ea0) 0 empty + +Vtable for std::future_error +std::future_error::_ZTVSt12future_error: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12future_error) +16 (int (*)(...))std::future_error::~future_error +24 (int (*)(...))std::future_error::~future_error +32 (int (*)(...))std::future_error::what + +Class std::future_error + size=32 align=8 + base size=32 base align=8 +std::future_error (0x0x7fd89f31f8f0) 0 + vptr=((& std::future_error::_ZTVSt12future_error) + 16) + std::logic_error (0x0x7fd89f31f958) 0 + primary-for std::future_error (0x0x7fd89f31f8f0) + std::exception (0x0x7fd89f342600) 0 nearly-empty + primary-for std::logic_error (0x0x7fd89f31f958) + +Class std::__future_base::_Result_base::_Deleter + size=1 align=1 + base size=0 base align=1 +std::__future_base::_Result_base::_Deleter (0x0x7fd89f342d20) 0 empty + +Vtable for std::__future_base::_Result_base +std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE) +16 (int (*)(...))__cxa_pure_virtual +24 0 +32 0 + +Class std::__future_base::_Result_base + size=16 align=8 + base size=16 base align=8 +std::__future_base::_Result_base (0x0x7fd89f342cc0) 0 + vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16) + +Class std::__future_base::_State_baseV2::__exception_ptr_tag + size=1 align=1 + base size=0 base align=1 +std::__future_base::_State_baseV2::__exception_ptr_tag (0x0x7fd89f141480) 0 empty + +Class std::__future_base::_State_baseV2::_Make_ready + size=32 align=8 + base size=32 base align=8 +std::__future_base::_State_baseV2::_Make_ready (0x0x7fd89f1441a0) 0 + std::__at_thread_exit_elt (0x0x7fd89f141540) 0 + +Vtable for std::__future_base::_State_baseV2 +std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base13_State_baseV2E) +16 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +24 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +32 (int (*)(...))std::__future_base::_State_baseV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_State_baseV2 + size=32 align=8 + base size=28 base align=8 +std::__future_base::_State_baseV2 (0x0x7fd89f342ea0) 0 + vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16) + +Class std::__future_base + size=1 align=1 + base size=0 base align=1 +std::__future_base (0x0x7fd89f342c60) 0 empty + +Vtable for std::__future_base::_Async_state_commonV2 +std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base21_Async_state_commonV2E) +16 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +24 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +32 (int (*)(...))std::__future_base::_Async_state_commonV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_Async_state_commonV2 + size=48 align=8 + base size=44 base align=8 +std::__future_base::_Async_state_commonV2 (0x0x7fd89eca4478) 0 + vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16) + std::__future_base::_State_baseV2 (0x0x7fd89e8e6120) 0 + primary-for std::__future_base::_Async_state_commonV2 (0x0x7fd89eca4478) + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7fd89e8e69c0) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7fd89eca47b8) 0 + vptr=((& QThread::_ZTV7QThread) + 16) + QObject (0x0x7fd89e8e6960) 0 + primary-for QThread (0x0x7fd89eca47b8) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7fd89e8e6d80) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7fd89eca4820) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16) + QObject (0x0x7fd89e8e6d20) 0 + primary-for QThreadPool (0x0x7fd89eca4820) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7fd89e8e6f60) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7fd89e92f660) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7fd89eca4888) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16) + QObject (0x0x7fd89e92f600) 0 + primary-for QTimeLine (0x0x7fd89eca4888) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7fd89e92f8a0) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7fd89eca48f0) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16) + QObject (0x0x7fd89e92f840) 0 + primary-for QTimer (0x0x7fd89eca48f0) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7fd89e99c240) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7fd89e99c1e0) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7fd89ea3b300) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7fd89ea40000) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16) + QObject (0x0x7fd89ea3b2a0) 0 + primary-for QTranslator (0x0x7fd89ea40000) + +Class QTransposeProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTransposeProxyModel::QPrivateSignal (0x0x7fd89ea3b540) 0 empty + +Vtable for QTransposeProxyModel +QTransposeProxyModel::_ZTV20QTransposeProxyModel: 53 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QTransposeProxyModel) +16 (int (*)(...))QTransposeProxyModel::metaObject +24 (int (*)(...))QTransposeProxyModel::qt_metacast +32 (int (*)(...))QTransposeProxyModel::qt_metacall +40 (int (*)(...))QTransposeProxyModel::~QTransposeProxyModel +48 (int (*)(...))QTransposeProxyModel::~QTransposeProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTransposeProxyModel::index +120 (int (*)(...))QTransposeProxyModel::parent +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))QTransposeProxyModel::rowCount +144 (int (*)(...))QTransposeProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QTransposeProxyModel::headerData +184 (int (*)(...))QTransposeProxyModel::setHeaderData +192 (int (*)(...))QTransposeProxyModel::itemData +200 (int (*)(...))QTransposeProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QTransposeProxyModel::insertRows +264 (int (*)(...))QTransposeProxyModel::insertColumns +272 (int (*)(...))QTransposeProxyModel::removeRows +280 (int (*)(...))QTransposeProxyModel::removeColumns +288 (int (*)(...))QTransposeProxyModel::moveRows +296 (int (*)(...))QTransposeProxyModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QTransposeProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QTransposeProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QTransposeProxyModel::setSourceModel +392 (int (*)(...))QTransposeProxyModel::mapToSource +400 (int (*)(...))QTransposeProxyModel::mapFromSource +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QTransposeProxyModel + size=16 align=8 + base size=16 base align=8 +QTransposeProxyModel (0x0x7fd89ea40068) 0 + vptr=((& QTransposeProxyModel::_ZTV20QTransposeProxyModel) + 16) + QAbstractProxyModel (0x0x7fd89ea400d0) 0 + primary-for QTransposeProxyModel (0x0x7fd89ea40068) + QAbstractItemModel (0x0x7fd89ea40138) 0 + primary-for QAbstractProxyModel (0x0x7fd89ea400d0) + QObject (0x0x7fd89ea3b4e0) 0 + primary-for QAbstractItemModel (0x0x7fd89ea40138) + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7fd89ea3b720) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7fd89e635c00) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7fd89e635d20) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7fd89e6e2120) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7fd89e74b410) 0 + QVector (0x0x7fd89e746840) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7fd89e746b40) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7fd89e3cbae0) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7fd89e428ae0) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7fd89e48eba0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7fd89e48ec00) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7fd89e4d0ae0) 0 + +Class QGeoAddress + size=8 align=8 + base size=8 base align=8 +QGeoAddress (0x0x7fd89e4d0cc0) 0 + +Class QGeoCoordinate + size=8 align=8 + base size=8 base align=8 +QGeoCoordinate (0x0x7fd89e573300) 0 + +Class QGeoShape + size=8 align=8 + base size=8 base align=8 +QGeoShape (0x0x7fd89e1c7900) 0 + +Class QGeoAreaMonitorInfo + size=8 align=8 + base size=8 base align=8 +QGeoAreaMonitorInfo (0x0x7fd89e21cae0) 0 + +Class QGeoPositionInfo + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfo (0x0x7fd89e21cba0) 0 + +Class QGeoPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoPositionInfoSource::QPrivateSignal (0x0x7fd89e21cea0) 0 empty + +Vtable for QGeoPositionInfoSource +QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource: 23 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QGeoPositionInfoSource) +16 (int (*)(...))QGeoPositionInfoSource::metaObject +24 (int (*)(...))QGeoPositionInfoSource::qt_metacast +32 (int (*)(...))QGeoPositionInfoSource::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoPositionInfoSource (0x0x7fd89e213ea0) 0 + vptr=((& QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource) + 16) + QObject (0x0x7fd89e21ce40) 0 + primary-for QGeoPositionInfoSource (0x0x7fd89e213ea0) + +Class QGeoAreaMonitorSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoAreaMonitorSource::QPrivateSignal (0x0x7fd89e26f720) 0 empty + +Vtable for QGeoAreaMonitorSource +QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource: 23 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QGeoAreaMonitorSource) +16 (int (*)(...))QGeoAreaMonitorSource::metaObject +24 (int (*)(...))QGeoAreaMonitorSource::qt_metacast +32 (int (*)(...))QGeoAreaMonitorSource::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoAreaMonitorSource::setPositionInfoSource +120 (int (*)(...))QGeoAreaMonitorSource::positionInfoSource +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoAreaMonitorSource + size=24 align=8 + base size=24 base align=8 +QGeoAreaMonitorSource (0x0x7fd89e298000) 0 + vptr=((& QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource) + 16) + QObject (0x0x7fd89e26f6c0) 0 + primary-for QGeoAreaMonitorSource (0x0x7fd89e298000) + +Class QGeoRectangle + size=8 align=8 + base size=8 base align=8 +QGeoRectangle (0x0x7fd89e298068) 0 + QGeoShape (0x0x7fd89e26f840) 0 + +Class QGeoCircle + size=8 align=8 + base size=8 base align=8 +QGeoCircle (0x0x7fd89e2ee410) 0 + QGeoShape (0x0x7fd89e2e6cc0) 0 + +Class QGeoLocation + size=8 align=8 + base size=8 base align=8 +QGeoLocation (0x0x7fd89e356ea0) 0 + +Class QGeoPath + size=8 align=8 + base size=8 base align=8 +QGeoPath (0x0x7fd89e3b2ea0) 0 + QGeoShape (0x0x7fd89dfc5540) 0 + +Class QGeoPolygon + size=8 align=8 + base size=8 base align=8 +QGeoPolygon (0x0x7fd89e01d068) 0 + QGeoShape (0x0x7fd89e014720) 0 + +Class QGeoSatelliteInfo + size=8 align=8 + base size=8 base align=8 +QGeoSatelliteInfo (0x0x7fd89e061900) 0 + +Class QGeoSatelliteInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoSatelliteInfoSource::QPrivateSignal (0x0x7fd89e061a20) 0 empty + +Vtable for QGeoSatelliteInfoSource +QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource: 20 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QGeoSatelliteInfoSource) +16 (int (*)(...))QGeoSatelliteInfoSource::metaObject +24 (int (*)(...))QGeoSatelliteInfoSource::qt_metacast +32 (int (*)(...))QGeoSatelliteInfoSource::qt_metacall +40 0 +48 0 +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoSatelliteInfoSource::setUpdateInterval +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual + +Class QGeoSatelliteInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoSatelliteInfoSource (0x0x7fd89e0663a8) 0 + vptr=((& QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource) + 16) + QObject (0x0x7fd89e0619c0) 0 + primary-for QGeoSatelliteInfoSource (0x0x7fd89e0663a8) + +Vtable for QGeoPositionInfoSourceFactory +QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory: 7 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI29QGeoPositionInfoSourceFactory) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactory + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactory (0x0x7fd89e061ba0) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory) + 16) + +Vtable for QGeoPositionInfoSourceFactoryV2 +QGeoPositionInfoSourceFactoryV2::_ZTV31QGeoPositionInfoSourceFactoryV2: 10 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI31QGeoPositionInfoSourceFactoryV2) +16 0 +24 0 +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))__cxa_pure_virtual +64 (int (*)(...))__cxa_pure_virtual +72 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactoryV2 + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactoryV2 (0x0x7fd89e066410) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactoryV2::_ZTV31QGeoPositionInfoSourceFactoryV2) + 16) + QGeoPositionInfoSourceFactory (0x0x7fd89e061d80) 0 nearly-empty + primary-for QGeoPositionInfoSourceFactoryV2 (0x0x7fd89e066410) + +Class QNmeaPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNmeaPositionInfoSource::QPrivateSignal (0x0x7fd89e0a6000) 0 empty + +Vtable for QNmeaPositionInfoSource +QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource: 24 entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QNmeaPositionInfoSource) +16 (int (*)(...))QNmeaPositionInfoSource::metaObject +24 (int (*)(...))QNmeaPositionInfoSource::qt_metacast +32 (int (*)(...))QNmeaPositionInfoSource::qt_metacall +40 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +48 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QNmeaPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))QNmeaPositionInfoSource::lastKnownPosition +136 (int (*)(...))QNmeaPositionInfoSource::supportedPositioningMethods +144 (int (*)(...))QNmeaPositionInfoSource::minimumUpdateInterval +152 (int (*)(...))QNmeaPositionInfoSource::error +160 (int (*)(...))QNmeaPositionInfoSource::startUpdates +168 (int (*)(...))QNmeaPositionInfoSource::stopUpdates +176 (int (*)(...))QNmeaPositionInfoSource::requestUpdate +184 (int (*)(...))QNmeaPositionInfoSource::parsePosInfoFromNmeaData + +Class QNmeaPositionInfoSource + size=32 align=8 + base size=32 base align=8 +QNmeaPositionInfoSource (0x0x7fd89e066478) 0 + vptr=((& QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource) + 16) + QGeoPositionInfoSource (0x0x7fd89e0664e0) 0 + primary-for QNmeaPositionInfoSource (0x0x7fd89e066478) + QObject (0x0x7fd89e061f60) 0 + primary-for QGeoPositionInfoSource (0x0x7fd89e0664e0) + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89e0de3c0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89e0de720) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89e0de900) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89e0dec60) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89e0dee40) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89e11a1e0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89e11a3c0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89e11a720) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89e11a900) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89e11ac60) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89e11ae40) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89e1531e0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89e1533c0) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89e153720) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89e153900) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89e153c60) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89e1b2180) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89e1b24e0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89e1b2660) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89e1b29c0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89e1b2b40) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89e1b2ea0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89dde2060) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89dde23c0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89dde2540) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89dde28a0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89dde2a20) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89dde2d80) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89dde2f00) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89de162a0) 0 empty + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno + size=4 align=4 + base size=4 base align=4 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fd89de16420) 0 + +Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fd89de16780) 0 empty + diff --git a/tests/auto/bic/data/QtPositioning.5.3.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtPositioning.5.3.0.linux-gcc-amd64.txt new file mode 100644 index 0000000..d29c24a --- /dev/null +++ b/tests/auto/bic/data/QtPositioning.5.3.0.linux-gcc-amd64.txt @@ -0,0 +1,3822 @@ +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f95f2df8f00) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f95f2df8f60) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f95f1d8fb40) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f95f1d8fba0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f95f1d26820) 0 empty + std::input_iterator_tag (0x0x7f95f1d8fc00) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f95f1d26888) 0 empty + std::forward_iterator_tag (0x0x7f95f1d268f0) 0 empty + std::input_iterator_tag (0x0x7f95f1d8fc60) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f95f1d26958) 0 empty + std::bidirectional_iterator_tag (0x0x7f95f1d269c0) 0 empty + std::forward_iterator_tag (0x0x7f95f1d26a28) 0 empty + std::input_iterator_tag (0x0x7f95f1d8fcc0) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7f95f1de9840) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f95f1de9a80) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f95f1de9b40) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f95f1de9ba0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f95f1de9c60) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f95f1de9cc0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f95f1eab180) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f95f1eab1e0) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7f95f1eab240) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7f95f1d26d68) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7f95f1eab2a0) 0 nearly-empty + primary-for std::bad_exception (0x0x7f95f1d26d68) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7f95f1d26dd0) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7f95f1eab300) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f95f1d26dd0) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f95f1eab360) 0 empty + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f95f0cb36c0) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f95f0cb3720) 0 + +Class QtPrivate::big_ + size=2 align=1 + base size=2 base align=1 +QtPrivate::big_ (0x0x7f95f0cb3900) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f95f0a18060) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f95f0a180c0) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f95f0a18120) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f95f0a18180) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f95f0a182a0) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f95f06ee3a8) 0 + QAtomicInteger (0x0x7f95f06ee410) 0 + QBasicAtomicInteger (0x0x7f95f0a18d80) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f95f04f5ea0) 0 empty + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f95f069fde0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f95f05ca548) 0 + QGenericArgument (0x0x7f95f069fe40) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f95f0304000) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f95f0304120) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f95f0304360) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f95f03043c0) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f95f03044e0) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f95f0304540) 0 + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f95f03048a0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f95f0304900) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f95f0304a80) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f95f0304ea0) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +24 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f95f0304f00) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7f95f02039c0) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7f95f0203a20) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f95f0203ae0) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f95f0203b40) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f95f0203ba0) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f95f0203c00) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f95f0203d20) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f95f0203d80) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f95eff0a4e0) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f95eff0a660) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f95eff0a720) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f95eff0a6c0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f95eff0a8a0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f95eff0ab40) 0 + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f95eff0ad20) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7f95eff0ad80) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f95eff0ade0) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f95eff0ae40) 0 + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureE) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=16 align=8 + base size=16 base align=8 +std::ios_base::failure (0x0x7f95eff0e000) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureE) + 16u) + std::exception (0x0x7f95efbc92a0) 0 nearly-empty + primary-for std::ios_base::failure (0x0x7f95eff0e000) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f95efbc9300) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f95efbc9360) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f95efbc93c0) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7f95efbc9240) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7f95efbc9540) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f95efbc9c00) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7f95ef810a90 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD0Ev + +Construction vtable for std::basic_ostream (0x0x7f95ef810b60 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7f95ef810e38 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev + +Construction vtable for std::basic_ostream (0x0x7f95ef810f08 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f95ef8b0000) 0 + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f95ef8b0300) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f95ef8b02a0) 0 + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f95ef8b06c0) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f95ef6a5420) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f95ef67d208) 0 + std::iterator (0x0x7f95ef6a54e0) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f95ef67d270) 0 + std::_Bit_iterator_base (0x0x7f95ef67d2d8) 0 + std::iterator (0x0x7f95ef6a5540) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f95ef67d340) 0 + std::_Bit_iterator_base (0x0x7f95ef67d3a8) 0 + std::iterator (0x0x7f95ef6a55a0) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f95ef6a5960) 0 + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f95ef6a5d80) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f95ef6a5e40) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f95ef6a5f00) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f95ef180360) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f95ef1806c0) 0 + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f95ef180ae0) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f95ef180cc0) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f95ef180d80) 0 + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f95eeff3060) 0 + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7f95eeff31e0) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f95eeff3360) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7f95eeff3300) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7f95eeff3660) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7f95eeff36c0) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f95eeff3780) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +48 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7f95ef204dd0) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7f95eeff3720) 0 + primary-for QAbstractAnimation (0x0x7f95ef204dd0) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f95eeff3840) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7f95ef204e38) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7f95eeff37e0) 0 + primary-for QAnimationDriver (0x0x7f95ef204e38) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f95eeff3900) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 (int (*)(...))QAnimationGroup::~QAnimationGroup +48 (int (*)(...))QAnimationGroup::~QAnimationGroup +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7f95ef204ea0) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7f95ef204f08) 0 + primary-for QAnimationGroup (0x0x7f95ef204ea0) + QObject (0x0x7f95eeff38a0) 0 + primary-for QAbstractAnimation (0x0x7f95ef204f08) + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f95eeff39c0) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7f95ef204f70) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7f95eecee000) 0 + primary-for QParallelAnimationGroup (0x0x7f95ef204f70) + QAbstractAnimation (0x0x7f95eecee068) 0 + primary-for QAnimationGroup (0x0x7f95eecee000) + QObject (0x0x7f95eeff3960) 0 + primary-for QAbstractAnimation (0x0x7f95eecee068) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f95eeff3a80) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7f95eecee0d0) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7f95eecee138) 0 + primary-for QPauseAnimation (0x0x7f95eecee0d0) + QObject (0x0x7f95eeff3a20) 0 + primary-for QAbstractAnimation (0x0x7f95eecee138) + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f95eeff3c60) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f95eeff3e40) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f95eeff3f00) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f95eee232a0) 0 + +Class QHashData + size=48 align=8 + base size=48 base align=8 +QHashData (0x0x7f95eee23240) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f95eee23300) 0 empty + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f95eee237e0) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 (int (*)(...))QIODevice::~QIODevice +48 (int (*)(...))QIODevice::~QIODevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7f95eeceea28) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7f95eee23780) 0 + primary-for QIODevice (0x0x7f95eeceea28) + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f95eee23900) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f95eee239c0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f95eee23b40) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f95eee23ae0) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f95eeceebc8) 0 + QList (0x0x7f95eee23cc0) 0 + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f95ee8fe000) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f95ee8fe0c0) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f95ee8fe060) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f95ee8fe120) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f95eee23f60) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f95ee8fe3c0) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f95ee8fe480) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f95ee8fe420) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f95ee8fe540) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f95ee8fe4e0) 0 + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f95eea14120) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7f95ee9cc5b0) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7f95ee9cc618) 0 + primary-for QVariantAnimation (0x0x7f95ee9cc5b0) + QObject (0x0x7f95eea140c0) 0 + primary-for QAbstractAnimation (0x0x7f95ee9cc618) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f95eea141e0) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7f95ee9cc6e8) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7f95ee9cc750) 0 + primary-for QPropertyAnimation (0x0x7f95ee9cc6e8) + QAbstractAnimation (0x0x7f95ee9cc7b8) 0 + primary-for QVariantAnimation (0x0x7f95ee9cc750) + QObject (0x0x7f95eea14180) 0 + primary-for QAbstractAnimation (0x0x7f95ee9cc7b8) + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f95eea142a0) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7f95ee9cc820) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7f95ee9cc888) 0 + primary-for QSequentialAnimationGroup (0x0x7f95ee9cc820) + QAbstractAnimation (0x0x7f95ee9cc8f0) 0 + primary-for QAnimationGroup (0x0x7f95ee9cc888) + QObject (0x0x7f95eea14240) 0 + primary-for QAbstractAnimation (0x0x7f95ee9cc8f0) + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f95eea14360) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))QTextCodec::~QTextCodec +64 (int (*)(...))QTextCodec::~QTextCodec + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f95eea14300) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f95eea14480) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f95eea144e0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f95eea14540) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f95eea147e0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f95eea14960) 0 + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f95eea14de0) 0 empty + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f95ee7cd5a0) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f95ee7cd6c0) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f95ee7cd7e0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f95ee7cd960) 0 empty + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f95ee7cda20) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7f95ee9ccf08) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7f95ee9ccf70) 0 + primary-for QBuffer (0x0x7f95ee9ccf08) + QObject (0x0x7f95ee7cd9c0) 0 + primary-for QIODevice (0x0x7f95ee9ccf70) + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f95ee7cda80) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f95ee7cdd80) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f95ee7cdde0) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7f95ee7cdea0) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f95ee59f180) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f95ee59f3c0) 0 + +Class QDebug::Stream + size=72 align=8 + base size=72 base align=8 +QDebug::Stream (0x0x7f95ee59fa20) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f95ee59f9c0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f95ee59fb40) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f95ee59fc00) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f95ee59fcc0) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7f95ee5a2208) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7f95ee5a2270) 0 + primary-for QFileDevice (0x0x7f95ee5a2208) + QObject (0x0x7f95ee59fc60) 0 + primary-for QIODevice (0x0x7f95ee5a2270) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f95ee59fe40) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7f95ee5a23a8) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7f95ee5a2410) 0 + primary-for QFile (0x0x7f95ee5a23a8) + QIODevice (0x0x7f95ee5a2478) 0 + primary-for QFileDevice (0x0x7f95ee5a2410) + QObject (0x0x7f95ee59fde0) 0 + primary-for QIODevice (0x0x7f95ee5a2478) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f95ee59ff60) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f95ee371240) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f95ee371540) 0 + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f95ee371720) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7f95ee5a2958) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7f95ee3716c0) 0 + primary-for QFileSelector (0x0x7f95ee5a2958) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f95ee3717e0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7f95ee5a29c0) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7f95ee371780) 0 + primary-for QFileSystemWatcher (0x0x7f95ee5a29c0) + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f95ee371840) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f95ee371960) 0 + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f95ee3719c0) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f95ee371ba0) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7f95ee5a2a90) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7f95ee5a2af8) 0 + primary-for QProcess (0x0x7f95ee5a2a90) + QObject (0x0x7f95ee371b40) 0 + primary-for QIODevice (0x0x7f95ee5a2af8) + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f95ee371c00) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f95ee371d80) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7f95ee5a2b60) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7f95ee5a2bc8) 0 + primary-for QSaveFile (0x0x7f95ee5a2b60) + QIODevice (0x0x7f95ee5a2c30) 0 + primary-for QFileDevice (0x0x7f95ee5a2bc8) + QObject (0x0x7f95ee371d20) 0 + primary-for QIODevice (0x0x7f95ee5a2c30) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f95ee371e40) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7f95ee5a2c98) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7f95ee371de0) 0 + primary-for QSettings (0x0x7f95ee5a2c98) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f95ee371ea0) 0 empty + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f95ee0f2000) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f95ee0f2120) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7f95ee5a2dd0) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7f95ee5a2e38) 0 + primary-for QTemporaryFile (0x0x7f95ee5a2dd0) + QFileDevice (0x0x7f95ee5a2ea0) 0 + primary-for QFile (0x0x7f95ee5a2e38) + QIODevice (0x0x7f95ee5a2f08) 0 + primary-for QFileDevice (0x0x7f95ee5a2ea0) + QObject (0x0x7f95ee0f20c0) 0 + primary-for QIODevice (0x0x7f95ee5a2f08) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f95ee0f2240) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f95ee0f2660) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f95ee0f27e0) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f95ee0f2900) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f95ee0f2a80) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +48 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7f95ee1602d8) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7f95ee0f2a20) 0 + primary-for QAbstractItemModel (0x0x7f95ee1602d8) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f95ee0f2d80) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +48 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7f95ee160410) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7f95ee160478) 0 + primary-for QAbstractTableModel (0x0x7f95ee160410) + QObject (0x0x7f95ee0f2d20) 0 + primary-for QAbstractItemModel (0x0x7f95ee160478) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f95ee0f2e40) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 (int (*)(...))QAbstractListModel::~QAbstractListModel +48 (int (*)(...))QAbstractListModel::~QAbstractListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7f95ee1604e0) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7f95ee160548) 0 + primary-for QAbstractListModel (0x0x7f95ee1604e0) + QObject (0x0x7f95ee0f2de0) 0 + primary-for QAbstractItemModel (0x0x7f95ee160548) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f95ee0f2f00) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +48 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7f95ee1605b0) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7f95ee160618) 0 + primary-for QAbstractProxyModel (0x0x7f95ee1605b0) + QObject (0x0x7f95ee0f2ea0) 0 + primary-for QAbstractItemModel (0x0x7f95ee160618) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f95edee8000) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7f95ee160680) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7f95ee1606e8) 0 + primary-for QIdentityProxyModel (0x0x7f95ee160680) + QAbstractItemModel (0x0x7f95ee160750) 0 + primary-for QAbstractProxyModel (0x0x7f95ee1606e8) + QObject (0x0x7f95ee0f2f60) 0 + primary-for QAbstractItemModel (0x0x7f95ee160750) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f95edee8060) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f95edee81e0) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7f95ee160820) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7f95edee8180) 0 + primary-for QItemSelectionModel (0x0x7f95ee160820) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f95ee160958) 0 + QList (0x0x7f95edee83c0) 0 + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f95edee8480) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7f95ee1609c0) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7f95ee160a28) 0 + primary-for QSortFilterProxyModel (0x0x7f95ee1609c0) + QAbstractItemModel (0x0x7f95ee160a90) 0 + primary-for QAbstractProxyModel (0x0x7f95ee160a28) + QObject (0x0x7f95edee8420) 0 + primary-for QAbstractItemModel (0x0x7f95ee160a90) + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f95edee8540) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7f95ee160af8) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7f95ee160b60) 0 + primary-for QStringListModel (0x0x7f95ee160af8) + QAbstractItemModel (0x0x7f95ee160bc8) 0 + primary-for QAbstractListModel (0x0x7f95ee160b60) + QObject (0x0x7f95edee84e0) 0 + primary-for QAbstractItemModel (0x0x7f95ee160bc8) + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f95edee85a0) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f95edee8660) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f95edee8780) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f95edee87e0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f95edee8720) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f95edee8840) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f95edee88a0) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f95edee8960) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f95edee89c0) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f95edee8900) 0 + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f95edee8ae0) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7f95ee160c30) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7f95edee8a80) 0 + primary-for QEventLoop (0x0x7f95ee160c30) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f95edee8c00) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f95edee8cc0) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f95edee8d20) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +48 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7f95ee160d68) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7f95edee8c60) 0 + primary-for QAbstractEventDispatcher (0x0x7f95ee160d68) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +24 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f95edee8d80) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f95edee8de0) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7f95edee8f00) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7f95ee160e38) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7f95edee8f60) 0 + primary-for QTimerEvent (0x0x7f95ee160e38) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7f95ee160ea0) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7f95edd19000) 0 + primary-for QChildEvent (0x0x7f95ee160ea0) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7f95ee160f08) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7f95edd19060) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f95ee160f08) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7f95ee160f70) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7f95edd190c0) 0 + primary-for QDeferredDeleteEvent (0x0x7f95ee160f70) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f95edd19180) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7f95edd27000) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7f95edd19120) 0 + primary-for QCoreApplication (0x0x7f95edd27000) + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7f95edd191e0) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f95edd19240) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f95edd19360) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f95edd19480) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f95edd194e0) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f95edd19660) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7f95edd27270) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7f95edd19600) 0 + primary-for QMimeData (0x0x7f95edd27270) + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f95edd19720) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7f95edd272d8) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7f95edd196c0) 0 + primary-for QObjectCleanupHandler (0x0x7f95edd272d8) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f95edd19960) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7f95edd27340) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7f95edd19900) 0 + primary-for QSharedMemory (0x0x7f95edd27340) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f95edd19a20) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7f95edd273a8) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7f95edd199c0) 0 + primary-for QSignalMapper (0x0x7f95edd273a8) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f95edd19ae0) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7f95edd27410) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7f95edd19a80) 0 + primary-for QSocketNotifier (0x0x7f95edd27410) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f95edd19b40) 0 + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f95edd19c60) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7f95edd27478) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7f95edd19c00) 0 + primary-for QTimer (0x0x7f95edd27478) + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f95edd19d80) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7f95edd274e0) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7f95edd19d20) 0 + primary-for QTranslator (0x0x7f95edd274e0) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f95edd19de0) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f95edd19f60) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 (int (*)(...))QFactoryInterface::~QFactoryInterface +24 (int (*)(...))QFactoryInterface::~QFactoryInterface +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f95edead000) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f95edead120) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7f95edd275b0) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7f95edead0c0) 0 + primary-for QLibrary (0x0x7f95edd275b0) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f95edead240) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f95edead3c0) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7f95edd27750) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7f95edead360) 0 + primary-for QPluginLoader (0x0x7f95edd27750) + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f95edead420) 0 + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f95edead5a0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 (int (*)(...))QAbstractState::~QAbstractState +48 (int (*)(...))QAbstractState::~QAbstractState +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7f95edd27820) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7f95edead540) 0 + primary-for QAbstractState (0x0x7f95edd27820) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f95edead660) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 (int (*)(...))QAbstractTransition::~QAbstractTransition +48 (int (*)(...))QAbstractTransition::~QAbstractTransition +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7f95edd27888) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7f95edead600) 0 + primary-for QAbstractTransition (0x0x7f95edd27888) + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f95edead720) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7f95edd278f0) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7f95edd27958) 0 + primary-for QEventTransition (0x0x7f95edd278f0) + QObject (0x0x7f95edead6c0) 0 + primary-for QAbstractTransition (0x0x7f95edd27958) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f95edead7e0) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7f95edd279c0) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7f95edd27a28) 0 + primary-for QFinalState (0x0x7f95edd279c0) + QObject (0x0x7f95edead780) 0 + primary-for QAbstractState (0x0x7f95edd27a28) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f95edead8a0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7f95edd27a90) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7f95edd27af8) 0 + primary-for QHistoryState (0x0x7f95edd27a90) + QObject (0x0x7f95edead840) 0 + primary-for QAbstractState (0x0x7f95edd27af8) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f95edead960) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7f95edd27b60) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7f95edd27bc8) 0 + primary-for QSignalTransition (0x0x7f95edd27b60) + QObject (0x0x7f95edead900) 0 + primary-for QAbstractTransition (0x0x7f95edd27bc8) + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f95edeada20) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7f95edd27c30) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7f95edd27c98) 0 + primary-for QState (0x0x7f95edd27c30) + QObject (0x0x7f95edead9c0) 0 + primary-for QAbstractState (0x0x7f95edd27c98) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f95edeadb40) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7f95edd27e38) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7f95edeadba0) 0 + primary-for QStateMachine::SignalEvent (0x0x7f95edd27e38) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7f95edd27ea0) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7f95edeadc00) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f95edd27ea0) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7f95edd27d00) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7f95edd27d68) 0 + primary-for QStateMachine (0x0x7f95edd27d00) + QAbstractState (0x0x7f95edd27dd0) 0 + primary-for QState (0x0x7f95edd27d68) + QObject (0x0x7f95edeadae0) 0 + primary-for QAbstractState (0x0x7f95edd27dd0) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7f95edd27f08) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7f95edeadc60) 0 nearly-empty + primary-for QException (0x0x7f95edd27f08) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7f95edd27f70) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7f95edbb5000) 0 nearly-empty + primary-for QUnhandledException (0x0x7f95edd27f70) + std::exception (0x0x7f95edeadcc0) 0 nearly-empty + primary-for QException (0x0x7f95edbb5000) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f95edeadd20) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f95edeadde0) 0 + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QRunnable::~QRunnable +32 (int (*)(...))QRunnable::~QRunnable + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f95edeade40) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f95edeadea0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f95edbb51a0) 0 + QBasicMutex (0x0x7f95edbed000) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f95edbed060) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f95edbed0c0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f95edbed120) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7f95edbed2a0) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7f95edbed360) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f95edbed6c0) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +48 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7f95edbb5a90) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7f95edbed660) 0 + primary-for QFutureWatcherBase (0x0x7f95edbb5a90) + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f95edbed7e0) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f95edbed840) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f95edbed8a0) 0 + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f95edbed900) 0 + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f95edbed9c0) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7f95edbb5e38) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7f95edbed960) 0 + primary-for QThread (0x0x7f95edbb5e38) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f95edbeda80) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7f95edbb5ea0) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7f95edbeda20) 0 + primary-for QThreadPool (0x0x7f95edbb5ea0) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f95edbedae0) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f95edbedba0) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f95ed9a7180) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f95ed9a71e0) 0 + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f95ed9a7360) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f95ed9a7300) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f95ed9a74e0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f95ed9a75a0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f95ed9a7780) 0 + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f95ed9a7900) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f95ed9a7960) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f95ed9a79c0) 0 + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f95ed9a7a20) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f95ed9a7b40) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f95ed9a7c60) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f95ed9a7d80) 0 + +Class QLinkedListData + size=32 align=8 + base size=32 base align=8 +QLinkedListData (0x0x7f95ed9a7ea0) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f95ed75a240) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7f95ed75a360) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f95ed75a480) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f95ed75a540) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f95ed75a660) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f95ed75a780) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f95ed75a8a0) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f95ed75a9c0) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f95ed75acc0) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f95ed75ae40) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f95ed63f0c0) 0 empty + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f95ed63fae0) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f95ed63fc60) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7f95ed6657b8) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7f95ed63fc00) 0 + primary-for QTimeLine (0x0x7f95ed6657b8) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f95ed63fd20) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f95ed63fcc0) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f95ed63ff60) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f95ed337000) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f95ed665a28) 0 + QVector (0x0x7f95ed3371e0) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f95ed337240) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f95ed337360) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f95ed337480) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7f95ed3375a0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f95ed337600) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f95ed337720) 0 + +Class QGeoAddress + size=8 align=8 + base size=8 base align=8 +QGeoAddress (0x0x7f95ed337840) 0 + +Class QGeoCoordinate + size=8 align=8 + base size=8 base align=8 +QGeoCoordinate (0x0x7f95ed337ae0) 0 + +Class QGeoShape + size=8 align=8 + base size=8 base align=8 +QGeoShape (0x0x7f95ed337d80) 0 + +Class QGeoAreaMonitorInfo + size=8 align=8 + base size=8 base align=8 +QGeoAreaMonitorInfo (0x0x7f95ed447060) 0 + +Class QGeoPositionInfo + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfo (0x0x7f95ed447120) 0 + +Class QGeoPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoPositionInfoSource::QPrivateSignal (0x0x7f95ed4471e0) 0 empty + +Vtable for QGeoPositionInfoSource +QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QGeoPositionInfoSource) +16 (int (*)(...))QGeoPositionInfoSource::metaObject +24 (int (*)(...))QGeoPositionInfoSource::qt_metacast +32 (int (*)(...))QGeoPositionInfoSource::qt_metacall +40 (int (*)(...))QGeoPositionInfoSource::~QGeoPositionInfoSource +48 (int (*)(...))QGeoPositionInfoSource::~QGeoPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoPositionInfoSource (0x0x7f95ed665d00) 0 + vptr=((& QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource) + 16u) + QObject (0x0x7f95ed447180) 0 + primary-for QGeoPositionInfoSource (0x0x7f95ed665d00) + +Class QGeoAreaMonitorSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoAreaMonitorSource::QPrivateSignal (0x0x7f95ed447360) 0 empty + +Vtable for QGeoAreaMonitorSource +QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QGeoAreaMonitorSource) +16 (int (*)(...))QGeoAreaMonitorSource::metaObject +24 (int (*)(...))QGeoAreaMonitorSource::qt_metacast +32 (int (*)(...))QGeoAreaMonitorSource::qt_metacall +40 (int (*)(...))QGeoAreaMonitorSource::~QGeoAreaMonitorSource +48 (int (*)(...))QGeoAreaMonitorSource::~QGeoAreaMonitorSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoAreaMonitorSource::setPositionInfoSource +120 (int (*)(...))QGeoAreaMonitorSource::positionInfoSource +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoAreaMonitorSource + size=24 align=8 + base size=24 base align=8 +QGeoAreaMonitorSource (0x0x7f95ed665e38) 0 + vptr=((& QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource) + 16u) + QObject (0x0x7f95ed447300) 0 + primary-for QGeoAreaMonitorSource (0x0x7f95ed665e38) + +Class QGeoCircle + size=8 align=8 + base size=8 base align=8 +QGeoCircle (0x0x7f95ed665ea0) 0 + QGeoShape (0x0x7f95ed4473c0) 0 + +Class QGeoLocation + size=8 align=8 + base size=8 base align=8 +QGeoLocation (0x0x7f95ed447600) 0 + +Class QGeoSatelliteInfo + size=8 align=8 + base size=8 base align=8 +QGeoSatelliteInfo (0x0x7f95ed4478a0) 0 + +Class QGeoSatelliteInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoSatelliteInfoSource::QPrivateSignal (0x0x7f95ed447960) 0 empty + +Vtable for QGeoSatelliteInfoSource +QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QGeoSatelliteInfoSource) +16 (int (*)(...))QGeoSatelliteInfoSource::metaObject +24 (int (*)(...))QGeoSatelliteInfoSource::qt_metacast +32 (int (*)(...))QGeoSatelliteInfoSource::qt_metacall +40 (int (*)(...))QGeoSatelliteInfoSource::~QGeoSatelliteInfoSource +48 (int (*)(...))QGeoSatelliteInfoSource::~QGeoSatelliteInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoSatelliteInfoSource::setUpdateInterval +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual + +Class QGeoSatelliteInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoSatelliteInfoSource (0x0x7f95ed060000) 0 + vptr=((& QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource) + 16u) + QObject (0x0x7f95ed447900) 0 + primary-for QGeoSatelliteInfoSource (0x0x7f95ed060000) + +Vtable for QGeoPositionInfoSourceFactory +QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI29QGeoPositionInfoSourceFactory) +16 (int (*)(...))QGeoPositionInfoSourceFactory::~QGeoPositionInfoSourceFactory +24 (int (*)(...))QGeoPositionInfoSourceFactory::~QGeoPositionInfoSourceFactory +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactory + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactory (0x0x7f95ed447a20) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory) + 16u) + +Class QGeoRectangle + size=8 align=8 + base size=8 base align=8 +QGeoRectangle (0x0x7f95ed060068) 0 + QGeoShape (0x0x7f95ed447ae0) 0 + +Class QNmeaPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNmeaPositionInfoSource::QPrivateSignal (0x0x7f95ed447e40) 0 empty + +Vtable for QNmeaPositionInfoSource +QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource: 24u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QNmeaPositionInfoSource) +16 (int (*)(...))QNmeaPositionInfoSource::metaObject +24 (int (*)(...))QNmeaPositionInfoSource::qt_metacast +32 (int (*)(...))QNmeaPositionInfoSource::qt_metacall +40 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +48 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QNmeaPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))QNmeaPositionInfoSource::lastKnownPosition +136 (int (*)(...))QNmeaPositionInfoSource::supportedPositioningMethods +144 (int (*)(...))QNmeaPositionInfoSource::minimumUpdateInterval +152 (int (*)(...))QNmeaPositionInfoSource::error +160 (int (*)(...))QNmeaPositionInfoSource::startUpdates +168 (int (*)(...))QNmeaPositionInfoSource::stopUpdates +176 (int (*)(...))QNmeaPositionInfoSource::requestUpdate +184 (int (*)(...))QNmeaPositionInfoSource::parsePosInfoFromNmeaData + +Class QNmeaPositionInfoSource + size=32 align=8 + base size=32 base align=8 +QNmeaPositionInfoSource (0x0x7f95ed060138) 0 + vptr=((& QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource) + 16u) + QGeoPositionInfoSource (0x0x7f95ed0601a0) 0 + primary-for QNmeaPositionInfoSource (0x0x7f95ed060138) + QObject (0x0x7f95ed447de0) 0 + primary-for QGeoPositionInfoSource (0x0x7f95ed0601a0) + diff --git a/tests/auto/bic/data/QtPositioning.5.4.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtPositioning.5.4.0.linux-gcc-amd64.txt new file mode 100644 index 0000000..3746cf7 --- /dev/null +++ b/tests/auto/bic/data/QtPositioning.5.4.0.linux-gcc-amd64.txt @@ -0,0 +1,3854 @@ +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7fb610c07060) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7fb610c070c0) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7fb610c48c60) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7fb610c48cc0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7fb610bdc958) 0 empty + std::input_iterator_tag (0x0x7fb610c48d20) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7fb610bdc9c0) 0 empty + std::forward_iterator_tag (0x0x7fb610bdca28) 0 empty + std::input_iterator_tag (0x0x7fb610c48d80) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7fb610bdca90) 0 empty + std::bidirectional_iterator_tag (0x0x7fb610bdcaf8) 0 empty + std::forward_iterator_tag (0x0x7fb610bdcb60) 0 empty + std::input_iterator_tag (0x0x7fb610c48de0) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7fb610c79960) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7fb610c79ba0) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7fb610c79c60) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7fb610c79cc0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7fb610c79d80) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7fb610c79de0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7fb610d642a0) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7fb610d64300) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7fb610d64360) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7fb610bdcea0) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7fb610d643c0) 0 nearly-empty + primary-for std::bad_exception (0x0x7fb610bdcea0) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7fb610bdcf08) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7fb610d64420) 0 nearly-empty + primary-for std::bad_alloc (0x0x7fb610bdcf08) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7fb610d64480) 0 empty + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7fb60fb587e0) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7fb60fb58840) 0 + +Class QtPrivate::big_ + size=2 align=1 + base size=2 base align=1 +QtPrivate::big_ (0x0x7fb60fb58a20) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7fb60f8c8300) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7fb60f8c8360) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7fb60f8c83c0) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7fb60f8c8420) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7fb60f8c8540) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7fb60f8cd680) 0 + QAtomicInteger (0x0x7fb60f8cd6e8) 0 + QBasicAtomicInteger (0x0x7fb60f70e060) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7fb60f4e4180) 0 empty + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7fb60f1ae0c0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7fb60f452820) 0 + QGenericArgument (0x0x7fb60f1ae120) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7fb60f1ae2a0) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7fb60f1ae3c0) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7fb60f1ae600) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7fb60f1ae660) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7fb60f1ae780) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7fb60f1ae7e0) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7fb60f1aeae0) 0 empty + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7fb60f1aee40) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +24 (int (*)(...))__cxxabiv1::__forced_unwind::~__forced_unwind +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7fb60f1aeea0) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7fb60efe4960) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7fb60efe49c0) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7fb60efe4a80) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7fb60efe4ae0) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7fb60efe4b40) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7fb60efe4ba0) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7fb60efe4cc0) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7fb60efe4d20) 0 + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7fb60f0ed4e0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7fb60f0ed540) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7fb60f0ed6c0) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7fb60f0ed7e0) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7fb60f0ed960) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7fb60f0eda20) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7fb60f0ed9c0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7fb60f0edba0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7fb60f0ede40) 0 + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7fb60ea19060) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7fb60ea190c0) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7fb60ea19120) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7fb60ea19180) 0 + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureE) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=16 align=8 + base size=16 base align=8 +std::ios_base::failure (0x0x7fb60ead6000) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureE) + 16u) + std::exception (0x0x7fb60ea195a0) 0 nearly-empty + primary-for std::ios_base::failure (0x0x7fb60ead6000) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7fb60ea19600) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7fb60ea19660) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7fb60ea196c0) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7fb60ea19540) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7fb60ea19840) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7fb60ea19f00) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7fb60e693e38 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSiD0Ev + +Construction vtable for std::basic_ostream (0x0x7fb60e693f08 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSoD0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7fb60e6933a8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +32 (int (*)(...))std::basic_istream<_CharT, _Traits>::~basic_istream > +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_istream::_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev + +Construction vtable for std::basic_ostream (0x0x7fb60e6934e0 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +32 (int (*)(...))std::basic_ostream<_CharT, _Traits>::~basic_ostream > +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev +72 (int (*)(...))std::basic_ostream::_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7fb60e6e1300) 0 + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7fb60e6e1660) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7fb60e6e1600) 0 + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7fb60e6e1b40) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7fb60e5678a0) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7fb60e766750) 0 + std::iterator (0x0x7fb60e567960) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7fb60e7667b8) 0 + std::_Bit_iterator_base (0x0x7fb60e766820) 0 + std::iterator (0x0x7fb60e5679c0) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7fb60e766888) 0 + std::_Bit_iterator_base (0x0x7fb60e7668f0) 0 + std::iterator (0x0x7fb60e567a20) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7fb60e567de0) 0 + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7fb60e34d240) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7fb60e34d300) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7fb60e34d3c0) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7fb60e34d7e0) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7fb60e34db40) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7fb60e34dc60) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7fb60e146480) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7fb60e146660) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7fb60e146720) 0 + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7fb60df0ba80) 0 + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7fb60df0bc00) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7fb60df0bde0) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7fb60df0bd80) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7fb60dbea120) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7fb60dbea180) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7fb60dbea240) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +48 (int (*)(...))QAbstractAnimation::~QAbstractAnimation +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7fb60df5f5b0) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7fb60dbea1e0) 0 + primary-for QAbstractAnimation (0x0x7fb60df5f5b0) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7fb60dbea300) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7fb60df5f618) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7fb60dbea2a0) 0 + primary-for QAnimationDriver (0x0x7fb60df5f618) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7fb60dbea3c0) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 (int (*)(...))QAnimationGroup::~QAnimationGroup +48 (int (*)(...))QAnimationGroup::~QAnimationGroup +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7fb60df5f680) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7fb60df5f6e8) 0 + primary-for QAnimationGroup (0x0x7fb60df5f680) + QObject (0x0x7fb60dbea360) 0 + primary-for QAbstractAnimation (0x0x7fb60df5f6e8) + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7fb60dbea480) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7fb60df5f750) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7fb60df5f7b8) 0 + primary-for QParallelAnimationGroup (0x0x7fb60df5f750) + QAbstractAnimation (0x0x7fb60df5f820) 0 + primary-for QAnimationGroup (0x0x7fb60df5f7b8) + QObject (0x0x7fb60dbea420) 0 + primary-for QAbstractAnimation (0x0x7fb60df5f820) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7fb60dbea540) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7fb60df5f888) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7fb60df5f8f0) 0 + primary-for QPauseAnimation (0x0x7fb60df5f888) + QObject (0x0x7fb60dbea4e0) 0 + primary-for QAbstractAnimation (0x0x7fb60df5f8f0) + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7fb60dbea720) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7fb60dbea900) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7fb60dbea9c0) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7fb60dbead20) 0 + +Class QHashData + size=48 align=8 + base size=48 base align=8 +QHashData (0x0x7fb60dbeacc0) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7fb60dbead80) 0 empty + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7fb60da72300) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 (int (*)(...))QIODevice::~QIODevice +48 (int (*)(...))QIODevice::~QIODevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7fb60dacc138) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7fb60da722a0) 0 + primary-for QIODevice (0x0x7fb60dacc138) + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7fb60da72420) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7fb60da724e0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7fb60da72660) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7fb60da72600) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7fb60dacc340) 0 + QList (0x0x7fb60dacc3a8) 0 + QListSpecialMethods (0x0x7fb60da72840) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7fb60da72b40) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7fb60da72c00) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7fb60da72ba0) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7fb60da72c60) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7fb60da72ae0) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7fb60da72f60) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7fb60d8f6060) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7fb60d8f6000) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7fb60d8f6120) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7fb60d8f60c0) 0 + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7fb60d8f6cc0) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7fb60dacce38) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7fb60daccea0) 0 + primary-for QVariantAnimation (0x0x7fb60dacce38) + QObject (0x0x7fb60d8f6c60) 0 + primary-for QAbstractAnimation (0x0x7fb60daccea0) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7fb60d8f6d80) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7fb60daccf70) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7fb60dacc068) 0 + primary-for QPropertyAnimation (0x0x7fb60daccf70) + QAbstractAnimation (0x0x7fb60daccc98) 0 + primary-for QVariantAnimation (0x0x7fb60dacc068) + QObject (0x0x7fb60d8f6d20) 0 + primary-for QAbstractAnimation (0x0x7fb60daccc98) + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7fb60d8f6e40) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7fb60daccd00) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7fb60daccd68) 0 + primary-for QSequentialAnimationGroup (0x0x7fb60daccd00) + QAbstractAnimation (0x0x7fb60d5a6000) 0 + primary-for QAnimationGroup (0x0x7fb60daccd68) + QObject (0x0x7fb60d8f6de0) 0 + primary-for QAbstractAnimation (0x0x7fb60d5a6000) + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7fb60d8f6f00) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))QTextCodec::~QTextCodec +64 (int (*)(...))QTextCodec::~QTextCodec + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7fb60d8f6ea0) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7fb60d5c2060) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7fb60d5c20c0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7fb60d5c2120) 0 + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7fb60d5c2300) 0 empty + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7fb60d5c2a80) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7fb60d5c2ba0) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7fb60d5c2cc0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7fb60d5c2e40) 0 empty + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7fb60d5c2f00) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7fb60d5a62d8) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7fb60d5a6340) 0 + primary-for QBuffer (0x0x7fb60d5a62d8) + QObject (0x0x7fb60d5c2ea0) 0 + primary-for QIODevice (0x0x7fb60d5a6340) + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7fb60d5c2f60) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7fb60d3c92a0) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7fb60d3c9300) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7fb60d3c93c0) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7fb60d3c9660) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7fb60d3c98a0) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7fb60d3c9f00) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7fb60d3c9ea0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7fb60d18a060) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7fb60d18a120) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7fb60d18a1e0) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7fb60d5a67b8) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7fb60d5a6820) 0 + primary-for QFileDevice (0x0x7fb60d5a67b8) + QObject (0x0x7fb60d18a180) 0 + primary-for QIODevice (0x0x7fb60d5a6820) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7fb60d18a360) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7fb60d5a6958) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7fb60d5a69c0) 0 + primary-for QFile (0x0x7fb60d5a6958) + QIODevice (0x0x7fb60d5a6a28) 0 + primary-for QFileDevice (0x0x7fb60d5a69c0) + QObject (0x0x7fb60d18a300) 0 + primary-for QIODevice (0x0x7fb60d5a6a28) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7fb60d18a480) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7fb60d18a720) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7fb60d18aa20) 0 + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7fb60d18ac00) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7fb60d5a6f08) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7fb60d18aba0) 0 + primary-for QFileSelector (0x0x7fb60d5a6f08) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7fb60d18acc0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7fb60d5a6f70) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7fb60d18ac60) 0 + primary-for QFileSystemWatcher (0x0x7fb60d5a6f70) + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7fb60d18ad20) 0 + +Class QLoggingCategory::AtomicBools + size=3 align=1 + base size=3 base align=1 +QLoggingCategory::AtomicBools (0x0x7fb60d18aea0) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7fb60d18ae40) 0 + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7fb60d318060) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7fb60d318240) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7fb60d306138) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7fb60d3061a0) 0 + primary-for QProcess (0x0x7fb60d306138) + QObject (0x0x7fb60d3181e0) 0 + primary-for QIODevice (0x0x7fb60d3061a0) + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7fb60d3182a0) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7fb60d318420) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7fb60d306208) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7fb60d306270) 0 + primary-for QSaveFile (0x0x7fb60d306208) + QIODevice (0x0x7fb60d3062d8) 0 + primary-for QFileDevice (0x0x7fb60d306270) + QObject (0x0x7fb60d3183c0) 0 + primary-for QIODevice (0x0x7fb60d3062d8) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7fb60d3184e0) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7fb60d306340) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7fb60d318480) 0 + primary-for QSettings (0x0x7fb60d306340) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7fb60d318540) 0 empty + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7fb60d318660) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7fb60d318900) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7fb60d318a20) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7fb60d3064e0) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7fb60d306548) 0 + primary-for QTemporaryFile (0x0x7fb60d3064e0) + QFileDevice (0x0x7fb60d3065b0) 0 + primary-for QFile (0x0x7fb60d306548) + QIODevice (0x0x7fb60d306618) 0 + primary-for QFileDevice (0x0x7fb60d3065b0) + QObject (0x0x7fb60d3189c0) 0 + primary-for QIODevice (0x0x7fb60d306618) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7fb60d318b40) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7fb60d0bd060) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7fb60d0bd1e0) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7fb60d0bd300) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7fb60d0bd480) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +48 (int (*)(...))QAbstractItemModel::~QAbstractItemModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7fb60d306af8) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7fb60d0bd420) 0 + primary-for QAbstractItemModel (0x0x7fb60d306af8) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7fb60d0bd7e0) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +48 (int (*)(...))QAbstractTableModel::~QAbstractTableModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7fb60d306c98) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7fb60d306d00) 0 + primary-for QAbstractTableModel (0x0x7fb60d306c98) + QObject (0x0x7fb60d0bd780) 0 + primary-for QAbstractItemModel (0x0x7fb60d306d00) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7fb60d0bd8a0) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 (int (*)(...))QAbstractListModel::~QAbstractListModel +48 (int (*)(...))QAbstractListModel::~QAbstractListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7fb60d306d68) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7fb60d306dd0) 0 + primary-for QAbstractListModel (0x0x7fb60d306d68) + QObject (0x0x7fb60d0bd840) 0 + primary-for QAbstractItemModel (0x0x7fb60d306dd0) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7fb60d0bd960) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +48 (int (*)(...))QAbstractProxyModel::~QAbstractProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7fb60d306e38) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7fb60d306ea0) 0 + primary-for QAbstractProxyModel (0x0x7fb60d306e38) + QObject (0x0x7fb60d0bd900) 0 + primary-for QAbstractItemModel (0x0x7fb60d306ea0) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7fb60d0bda20) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7fb60d306f08) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7fb60d306f70) 0 + primary-for QIdentityProxyModel (0x0x7fb60d306f08) + QAbstractItemModel (0x0x7fb60cdee000) 0 + primary-for QAbstractProxyModel (0x0x7fb60d306f70) + QObject (0x0x7fb60d0bd9c0) 0 + primary-for QAbstractItemModel (0x0x7fb60cdee000) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7fb60d0bda80) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7fb60d0bdc00) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7fb60cdee0d0) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7fb60d0bdba0) 0 + primary-for QItemSelectionModel (0x0x7fb60cdee0d0) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7fb60cdee270) 0 + QList (0x0x7fb60cdee2d8) 0 + QListSpecialMethods (0x0x7fb60d0bde40) 0 empty + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7fb60d0bdf00) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7fb60cdee340) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7fb60cdee3a8) 0 + primary-for QSortFilterProxyModel (0x0x7fb60cdee340) + QAbstractItemModel (0x0x7fb60cdee410) 0 + primary-for QAbstractProxyModel (0x0x7fb60cdee3a8) + QObject (0x0x7fb60d0bdea0) 0 + primary-for QAbstractItemModel (0x0x7fb60cdee410) + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7fb60ceb8000) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7fb60cdee478) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7fb60cdee4e0) 0 + primary-for QStringListModel (0x0x7fb60cdee478) + QAbstractItemModel (0x0x7fb60cdee548) 0 + primary-for QAbstractListModel (0x0x7fb60cdee4e0) + QObject (0x0x7fb60d0bdf60) 0 + primary-for QAbstractItemModel (0x0x7fb60cdee548) + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7fb60ceb8060) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7fb60ceb8120) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7fb60ceb81e0) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7fb60ceb8240) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7fb60ceb8300) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7fb60ceb8360) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7fb60ceb82a0) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7fb60ceb83c0) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7fb60ceb8420) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7fb60ceb84e0) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7fb60ceb8540) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7fb60ceb8480) 0 + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7fb60ceb8660) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7fb60cdee5b0) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7fb60ceb8600) 0 + primary-for QEventLoop (0x0x7fb60cdee5b0) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7fb60ceb8780) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7fb60ceb8840) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7fb60ceb88a0) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +48 (int (*)(...))QAbstractEventDispatcher::~QAbstractEventDispatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7fb60cdee6e8) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7fb60ceb87e0) 0 + primary-for QAbstractEventDispatcher (0x0x7fb60cdee6e8) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +24 (int (*)(...))QAbstractNativeEventFilter::~QAbstractNativeEventFilter +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7fb60ceb8900) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7fb60ceb8960) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7fb60ceb8a80) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7fb60cdee7b8) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7fb60ceb8ae0) 0 + primary-for QTimerEvent (0x0x7fb60cdee7b8) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7fb60cdee820) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7fb60ceb8b40) 0 + primary-for QChildEvent (0x0x7fb60cdee820) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7fb60cdee888) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7fb60ceb8ba0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7fb60cdee888) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7fb60cdee8f0) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7fb60ceb8c00) 0 + primary-for QDeferredDeleteEvent (0x0x7fb60cdee8f0) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7fb60ceb8cc0) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7fb60cdee958) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7fb60ceb8c60) 0 + primary-for QCoreApplication (0x0x7fb60cdee958) + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7fb60ceb8d20) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7fb60ceb8d80) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7fb60ceb8ea0) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7fb60ccff000) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7fb60ccff060) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7fb60ccff1e0) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7fb60cdeebc8) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7fb60ccff180) 0 + primary-for QMimeData (0x0x7fb60cdeebc8) + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7fb60ccff2a0) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7fb60cdeec30) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7fb60ccff240) 0 + primary-for QObjectCleanupHandler (0x0x7fb60cdeec30) + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7fb60ccff3c0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7fb60ccff540) 0 + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7fb60ccffc00) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7fb60cdeee38) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7fb60ccffba0) 0 + primary-for QSharedMemory (0x0x7fb60cdeee38) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7fb60ccffcc0) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7fb60cdeeea0) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7fb60ccffc60) 0 + primary-for QSignalMapper (0x0x7fb60cdeeea0) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7fb60ccffd80) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7fb60cdeef08) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7fb60ccffd20) 0 + primary-for QSocketNotifier (0x0x7fb60cdeef08) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7fb60ccffde0) 0 + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7fb60ccfff00) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7fb60cdeef70) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7fb60ccffea0) 0 + primary-for QTimer (0x0x7fb60cdeef70) + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7fb60ca600c0) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7fb60ca62068) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7fb60ca60060) 0 + primary-for QTranslator (0x0x7fb60ca62068) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7fb60ca60120) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7fb60ca602a0) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 (int (*)(...))QFactoryInterface::~QFactoryInterface +24 (int (*)(...))QFactoryInterface::~QFactoryInterface +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7fb60ca60300) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7fb60ca60420) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7fb60ca62138) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7fb60ca603c0) 0 + primary-for QLibrary (0x0x7fb60ca62138) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7fb60ca60540) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7fb60ca606c0) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7fb60ca622d8) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7fb60ca60660) 0 + primary-for QPluginLoader (0x0x7fb60ca622d8) + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7fb60ca60720) 0 + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7fb60ca608a0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 (int (*)(...))QAbstractState::~QAbstractState +48 (int (*)(...))QAbstractState::~QAbstractState +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7fb60ca623a8) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7fb60ca60840) 0 + primary-for QAbstractState (0x0x7fb60ca623a8) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7fb60ca60960) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 (int (*)(...))QAbstractTransition::~QAbstractTransition +48 (int (*)(...))QAbstractTransition::~QAbstractTransition +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7fb60ca62410) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7fb60ca60900) 0 + primary-for QAbstractTransition (0x0x7fb60ca62410) + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7fb60ca60a20) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7fb60ca62478) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7fb60ca624e0) 0 + primary-for QEventTransition (0x0x7fb60ca62478) + QObject (0x0x7fb60ca609c0) 0 + primary-for QAbstractTransition (0x0x7fb60ca624e0) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7fb60ca60ae0) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7fb60ca62548) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7fb60ca625b0) 0 + primary-for QFinalState (0x0x7fb60ca62548) + QObject (0x0x7fb60ca60a80) 0 + primary-for QAbstractState (0x0x7fb60ca625b0) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7fb60ca60ba0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7fb60ca62618) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7fb60ca62680) 0 + primary-for QHistoryState (0x0x7fb60ca62618) + QObject (0x0x7fb60ca60b40) 0 + primary-for QAbstractState (0x0x7fb60ca62680) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7fb60ca60c60) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7fb60ca626e8) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7fb60ca62750) 0 + primary-for QSignalTransition (0x0x7fb60ca626e8) + QObject (0x0x7fb60ca60c00) 0 + primary-for QAbstractTransition (0x0x7fb60ca62750) + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7fb60ca60d20) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7fb60ca627b8) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7fb60ca62820) 0 + primary-for QState (0x0x7fb60ca627b8) + QObject (0x0x7fb60ca60cc0) 0 + primary-for QAbstractState (0x0x7fb60ca62820) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7fb60ca60e40) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7fb60ca629c0) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7fb60ca60ea0) 0 + primary-for QStateMachine::SignalEvent (0x0x7fb60ca629c0) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7fb60ca62a28) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7fb60ca60f00) 0 + primary-for QStateMachine::WrappedEvent (0x0x7fb60ca62a28) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7fb60ca62888) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7fb60ca628f0) 0 + primary-for QStateMachine (0x0x7fb60ca62888) + QAbstractState (0x0x7fb60ca62958) 0 + primary-for QState (0x0x7fb60ca628f0) + QObject (0x0x7fb60ca60de0) 0 + primary-for QAbstractState (0x0x7fb60ca62958) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7fb60ca62a90) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7fb60ca60f60) 0 nearly-empty + primary-for QException (0x0x7fb60ca62a90) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7fb60ca62af8) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7fb60ca62b60) 0 nearly-empty + primary-for QUnhandledException (0x0x7fb60ca62af8) + std::exception (0x0x7fb60c7a9000) 0 nearly-empty + primary-for QException (0x0x7fb60ca62b60) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7fb60c7a9060) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7fb60c7a9120) 0 + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QRunnable::~QRunnable +32 (int (*)(...))QRunnable::~QRunnable + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7fb60c7a9180) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7fb60c7a91e0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7fb60ca62d00) 0 + QBasicMutex (0x0x7fb60c7a9300) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7fb60c7a9360) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7fb60c7a93c0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7fb60c7a9420) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7fb60c7a95a0) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7fb60c7a9660) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7fb60c7a99c0) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +48 (int (*)(...))QFutureWatcherBase::~QFutureWatcherBase +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7fb60c834618) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7fb60c7a9960) 0 + primary-for QFutureWatcherBase (0x0x7fb60c834618) + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7fb60c7a9ae0) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7fb60c7a9b40) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7fb60c7a9ba0) 0 + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7fb60c7a9c00) 0 + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7fb60c7a9cc0) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7fb60c8349c0) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7fb60c7a9c60) 0 + primary-for QThread (0x0x7fb60c8349c0) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7fb60c7a9d80) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7fb60c834a28) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7fb60c7a9d20) 0 + primary-for QThreadPool (0x0x7fb60c834a28) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7fb60c7a9de0) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7fb60c7a9ea0) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7fb60c581480) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7fb60c5814e0) 0 + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7fb60c581660) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7fb60c581600) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7fb60c5817e0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7fb60c5818a0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7fb60c581a80) 0 + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7fb60c581c00) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7fb60c581c60) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7fb60c581cc0) 0 + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7fb60c581d20) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7fb60c581e40) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7fb60c581f60) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7fb60c6f70c0) 0 + +Class QLinkedListData + size=32 align=8 + base size=32 base align=8 +QLinkedListData (0x0x7fb60c6f71e0) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7fb60c6f7540) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7fb60c6f7660) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7fb60c6f7780) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7fb60c6f7840) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7fb60c6f7960) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7fb60c6f7a80) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7fb60c6f7ba0) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7fb60c6f7cc0) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7fb60c20c000) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7fb60c20c180) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7fb60c20c3c0) 0 empty + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7fb60c20cde0) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7fb60c20cf60) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7fb60c2a0340) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7fb60c20cf00) 0 + primary-for QTimeLine (0x0x7fb60c2a0340) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7fb60c2fc060) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7fb60c2fc000) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7fb60c2fc2a0) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7fb60c2fc300) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7fb60c2a05b0) 0 + QVector (0x0x7fb60c2fc4e0) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7fb60c2fc540) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7fb60c2fc660) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7fb60c2fc780) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7fb60c2fc8a0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7fb60c2fc900) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7fb60c2fca20) 0 + +Class QGeoAddress + size=8 align=8 + base size=8 base align=8 +QGeoAddress (0x0x7fb60c2fcb40) 0 + +Class QGeoCoordinate + size=8 align=8 + base size=8 base align=8 +QGeoCoordinate (0x0x7fb60c2fcde0) 0 + +Class QGeoShape + size=8 align=8 + base size=8 base align=8 +QGeoShape (0x0x7fb60bfed0c0) 0 + +Class QGeoAreaMonitorInfo + size=8 align=8 + base size=8 base align=8 +QGeoAreaMonitorInfo (0x0x7fb60bfed360) 0 + +Class QGeoPositionInfo + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfo (0x0x7fb60bfed420) 0 + +Class QGeoPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoPositionInfoSource::QPrivateSignal (0x0x7fb60bfed4e0) 0 empty + +Vtable for QGeoPositionInfoSource +QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QGeoPositionInfoSource) +16 (int (*)(...))QGeoPositionInfoSource::metaObject +24 (int (*)(...))QGeoPositionInfoSource::qt_metacast +32 (int (*)(...))QGeoPositionInfoSource::qt_metacall +40 (int (*)(...))QGeoPositionInfoSource::~QGeoPositionInfoSource +48 (int (*)(...))QGeoPositionInfoSource::~QGeoPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoPositionInfoSource (0x0x7fb60c2a0888) 0 + vptr=((& QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource) + 16u) + QObject (0x0x7fb60bfed480) 0 + primary-for QGeoPositionInfoSource (0x0x7fb60c2a0888) + +Class QGeoAreaMonitorSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoAreaMonitorSource::QPrivateSignal (0x0x7fb60bfed660) 0 empty + +Vtable for QGeoAreaMonitorSource +QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QGeoAreaMonitorSource) +16 (int (*)(...))QGeoAreaMonitorSource::metaObject +24 (int (*)(...))QGeoAreaMonitorSource::qt_metacast +32 (int (*)(...))QGeoAreaMonitorSource::qt_metacall +40 (int (*)(...))QGeoAreaMonitorSource::~QGeoAreaMonitorSource +48 (int (*)(...))QGeoAreaMonitorSource::~QGeoAreaMonitorSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoAreaMonitorSource::setPositionInfoSource +120 (int (*)(...))QGeoAreaMonitorSource::positionInfoSource +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoAreaMonitorSource + size=24 align=8 + base size=24 base align=8 +QGeoAreaMonitorSource (0x0x7fb60c2a09c0) 0 + vptr=((& QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource) + 16u) + QObject (0x0x7fb60bfed600) 0 + primary-for QGeoAreaMonitorSource (0x0x7fb60c2a09c0) + +Class QGeoCircle + size=8 align=8 + base size=8 base align=8 +QGeoCircle (0x0x7fb60c2a0a28) 0 + QGeoShape (0x0x7fb60bfed6c0) 0 + +Class QGeoLocation + size=8 align=8 + base size=8 base align=8 +QGeoLocation (0x0x7fb60bfed900) 0 + +Class QGeoSatelliteInfo + size=8 align=8 + base size=8 base align=8 +QGeoSatelliteInfo (0x0x7fb60bfedba0) 0 + +Class QGeoSatelliteInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoSatelliteInfoSource::QPrivateSignal (0x0x7fb60bfedc60) 0 empty + +Vtable for QGeoSatelliteInfoSource +QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QGeoSatelliteInfoSource) +16 (int (*)(...))QGeoSatelliteInfoSource::metaObject +24 (int (*)(...))QGeoSatelliteInfoSource::qt_metacast +32 (int (*)(...))QGeoSatelliteInfoSource::qt_metacall +40 (int (*)(...))QGeoSatelliteInfoSource::~QGeoSatelliteInfoSource +48 (int (*)(...))QGeoSatelliteInfoSource::~QGeoSatelliteInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoSatelliteInfoSource::setUpdateInterval +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual + +Class QGeoSatelliteInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoSatelliteInfoSource (0x0x7fb60c2a0b60) 0 + vptr=((& QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource) + 16u) + QObject (0x0x7fb60bfedc00) 0 + primary-for QGeoSatelliteInfoSource (0x0x7fb60c2a0b60) + +Vtable for QGeoPositionInfoSourceFactory +QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI29QGeoPositionInfoSourceFactory) +16 (int (*)(...))QGeoPositionInfoSourceFactory::~QGeoPositionInfoSourceFactory +24 (int (*)(...))QGeoPositionInfoSourceFactory::~QGeoPositionInfoSourceFactory +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactory + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactory (0x0x7fb60bfedd20) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory) + 16u) + +Class QGeoRectangle + size=8 align=8 + base size=8 base align=8 +QGeoRectangle (0x0x7fb60c2a0bc8) 0 + QGeoShape (0x0x7fb60bfedde0) 0 + +Class QNmeaPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNmeaPositionInfoSource::QPrivateSignal (0x0x7fb60c0d21e0) 0 empty + +Vtable for QNmeaPositionInfoSource +QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource: 24u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QNmeaPositionInfoSource) +16 (int (*)(...))QNmeaPositionInfoSource::metaObject +24 (int (*)(...))QNmeaPositionInfoSource::qt_metacast +32 (int (*)(...))QNmeaPositionInfoSource::qt_metacall +40 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +48 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QNmeaPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))QNmeaPositionInfoSource::lastKnownPosition +136 (int (*)(...))QNmeaPositionInfoSource::supportedPositioningMethods +144 (int (*)(...))QNmeaPositionInfoSource::minimumUpdateInterval +152 (int (*)(...))QNmeaPositionInfoSource::error +160 (int (*)(...))QNmeaPositionInfoSource::startUpdates +168 (int (*)(...))QNmeaPositionInfoSource::stopUpdates +176 (int (*)(...))QNmeaPositionInfoSource::requestUpdate +184 (int (*)(...))QNmeaPositionInfoSource::parsePosInfoFromNmeaData + +Class QNmeaPositionInfoSource + size=32 align=8 + base size=32 base align=8 +QNmeaPositionInfoSource (0x0x7fb60c2a0d00) 0 + vptr=((& QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource) + 16u) + QGeoPositionInfoSource (0x0x7fb60c2a0d68) 0 + primary-for QNmeaPositionInfoSource (0x0x7fb60c2a0d00) + QObject (0x0x7fb60c0d2180) 0 + primary-for QGeoPositionInfoSource (0x0x7fb60c2a0d68) + diff --git a/tests/auto/bic/data/QtPositioning.5.6.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtPositioning.5.6.0.linux-gcc-amd64.txt new file mode 100644 index 0000000..42ed838 --- /dev/null +++ b/tests/auto/bic/data/QtPositioning.5.6.0.linux-gcc-amd64.txt @@ -0,0 +1,4118 @@ +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f7583ec7ae0) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f7583ec7b40) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f7583f85780) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f7583f857e0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f7583f02958) 0 empty + std::input_iterator_tag (0x0x7f7583f85840) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f7583f029c0) 0 empty + std::forward_iterator_tag (0x0x7f7583f02a28) 0 empty + std::input_iterator_tag (0x0x7f7583f858a0) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f7583f02a90) 0 empty + std::bidirectional_iterator_tag (0x0x7f7583f02af8) 0 empty + std::forward_iterator_tag (0x0x7f7583f02b60) 0 empty + std::input_iterator_tag (0x0x7f7583f85900) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7f7583f85de0) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7f7583f85e40) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7f7583f85ea0) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7f7583f85f00) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7f7583f85f60) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7f75840199c0) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f7584019c00) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f7584019cc0) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f7584019d20) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f7584019de0) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f7584019e40) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f7582cc5300) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f7582cc5360) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7f7582cc53c0) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7f7583f02e38) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7f7582cc5420) 0 nearly-empty + primary-for std::bad_exception (0x0x7f7583f02e38) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7f7583f02ea0) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7f7582cc5480) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f7583f02ea0) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f7582cc54e0) 0 empty + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f7582a5ec00) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f7582a5ec60) 0 + +Class QtPrivate::big_ + size=2 align=1 + base size=2 base align=1 +QtPrivate::big_ (0x0x7f7582a5ee40) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f7582b81ea0) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f7582b81f00) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f7582b81f60) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f7582be9000) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f7582be9180) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f7582bb2618) 0 + QAtomicInteger (0x0x7f7582bb2680) 0 + QBasicAtomicInteger (0x0x7f7582be9cc0) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f75826b1de0) 0 empty + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f75824ee2a0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f7582724888) 0 + QGenericArgument (0x0x7f75824ee300) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f75824ee480) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f75824ee540) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f75824ee600) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f75824ee660) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f75824ee7e0) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f75824ee8a0) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7f75824eecc0) 0 empty + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f758227a060) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f758227a0c0) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7f758227af60) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7f7582342000) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f75823420c0) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f7582342120) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f7582342180) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f75823421e0) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f7582342300) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f7582342360) 0 + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f7582342c00) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7f7582342c60) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f7582342cc0) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f7582342d20) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7f7582200120) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7f7582337c30) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16u) + std::exception (0x0x7f75822001e0) 0 nearly-empty + primary-for std::logic_error (0x0x7f7582337c30) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7f7582337c98) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16u) + std::logic_error (0x0x7f7582337d00) 0 + primary-for std::domain_error (0x0x7f7582337c98) + std::exception (0x0x7f7582200240) 0 nearly-empty + primary-for std::logic_error (0x0x7f7582337d00) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7f7582337d68) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16u) + std::logic_error (0x0x7f7582337dd0) 0 + primary-for std::invalid_argument (0x0x7f7582337d68) + std::exception (0x0x7f75822002a0) 0 nearly-empty + primary-for std::logic_error (0x0x7f7582337dd0) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7f7582337e38) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16u) + std::logic_error (0x0x7f7582337ea0) 0 + primary-for std::length_error (0x0x7f7582337e38) + std::exception (0x0x7f7582200300) 0 nearly-empty + primary-for std::logic_error (0x0x7f7582337ea0) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7f7582337f08) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16u) + std::logic_error (0x0x7f7582337f70) 0 + primary-for std::out_of_range (0x0x7f7582337f08) + std::exception (0x0x7f7582200360) 0 nearly-empty + primary-for std::logic_error (0x0x7f7582337f70) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7f7582337138) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16u) + std::exception (0x0x7f75822003c0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f7582337138) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7f7582337208) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16u) + std::runtime_error (0x0x7f7582337270) 0 + primary-for std::range_error (0x0x7f7582337208) + std::exception (0x0x7f7582200420) 0 nearly-empty + primary-for std::runtime_error (0x0x7f7582337270) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7f75823372d8) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16u) + std::runtime_error (0x0x7f75823373a8) 0 + primary-for std::overflow_error (0x0x7f75823372d8) + std::exception (0x0x7f7582200480) 0 nearly-empty + primary-for std::runtime_error (0x0x7f75823373a8) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7f75823374e0) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16u) + std::runtime_error (0x0x7f75823375b0) 0 + primary-for std::underflow_error (0x0x7f75823374e0) + std::exception (0x0x7f75822004e0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f75823375b0) + +Class std::ios_base::system_error::error_code + size=16 align=8 + base size=16 base align=8 +std::ios_base::system_error::error_code (0x0x7f7582200600) 0 + +Vtable for std::ios_base::system_error +std::ios_base::system_error::_ZTVNSt8ios_base12system_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base12system_errorE) +16 (int (*)(...))std::ios_base::system_error::~system_error +24 (int (*)(...))std::ios_base::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::ios_base::system_error + size=32 align=8 + base size=32 base align=8 +std::ios_base::system_error (0x0x7f7582337958) 0 + vptr=((& std::ios_base::system_error::_ZTVNSt8ios_base12system_errorE) + 16u) + std::runtime_error (0x0x7f7582337a28) 0 + primary-for std::ios_base::system_error (0x0x7f7582337958) + std::exception (0x0x7f75822005a0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f7582337a28) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7f7582249000) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16u) + std::ios_base::system_error (0x0x7f7582249068) 0 + primary-for std::ios_base::failure (0x0x7f7582249000) + std::runtime_error (0x0x7f75822490d0) 0 + primary-for std::ios_base::system_error (0x0x7f7582249068) + std::exception (0x0x7f7582200660) 0 nearly-empty + primary-for std::runtime_error (0x0x7f75822490d0) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f75822006c0) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f7582200720) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f7582200780) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7f7582200540) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7f7582200ea0) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f7581f505a0) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7f7581a5d750 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f7581a5d820 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7f7581a5dbc8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f7581a5dc98 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f7581cd5cc0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f7581cd5d20) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f7581b5f360) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f7581b5f540) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f7581b5f780) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f7581b5f840) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f7581b5f7e0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f7581b5fea0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f75819b72a0) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7f75819b7660) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7f75819b76c0) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f75819b7720) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7f75819b7ae0) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7f75819b7b40) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7f7581b4ec98) 0 empty + QListData::NotIndirectLayout (0x0x7f75819b7ba0) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7f75817db310) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f75819b7c00) 0 empty + QListData::NotIndirectLayout (0x0x7f75819b7c60) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7f7581b4ed00) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f75819b7cc0) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f75819b7d20) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f75819b7a80) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f758184a900) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f758184aae0) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f758184aa80) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f758152d068) 0 + QList (0x0x7f758152d0d0) 0 + QListSpecialMethods (0x0x7f758184acc0) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f758184af00) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f758158f600) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f758152dd00) 0 + std::iterator (0x0x7f758158f6c0) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f758152dd68) 0 + std::_Bit_iterator_base (0x0x7f758152ddd0) 0 + std::iterator (0x0x7f758158f720) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f758152de38) 0 + std::_Bit_iterator_base (0x0x7f758152dea0) 0 + std::iterator (0x0x7f758158f780) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f758158fb40) 0 + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f758109f060) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f758109f120) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f758109f240) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f758109f3c0) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f758109f660) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7f758109f780) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f75811d2180) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f75811d2540) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f75811d2780) 0 + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f7580faa7e0) 0 + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7f7580faa960) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f7580faab40) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7f7580faaae0) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7f7580faaea0) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7f7580faaf00) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f7580caa000) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7f7580ca5000) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7f7580faaf60) 0 + primary-for QAbstractAnimation (0x0x7f7580ca5000) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f7580caa0c0) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7f7580ca5068) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7f7580caa060) 0 + primary-for QAnimationDriver (0x0x7f7580ca5068) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f7580caa180) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7f7580ca50d0) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7f7580ca5138) 0 + primary-for QAnimationGroup (0x0x7f7580ca50d0) + QObject (0x0x7f7580caa120) 0 + primary-for QAbstractAnimation (0x0x7f7580ca5138) + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f7580caa240) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7f7580ca51a0) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7f7580ca5208) 0 + primary-for QParallelAnimationGroup (0x0x7f7580ca51a0) + QAbstractAnimation (0x0x7f7580ca5270) 0 + primary-for QAnimationGroup (0x0x7f7580ca5208) + QObject (0x0x7f7580caa1e0) 0 + primary-for QAbstractAnimation (0x0x7f7580ca5270) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f7580caa300) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7f7580ca52d8) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7f7580ca5340) 0 + primary-for QPauseAnimation (0x0x7f7580ca52d8) + QObject (0x0x7f7580caa2a0) 0 + primary-for QAbstractAnimation (0x0x7f7580ca5340) + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f7580d78660) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f7580d787e0) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f7580d788a0) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f7580d78c60) 0 + +Class QHashData + size=48 align=8 + base size=48 base align=8 +QHashData (0x0x7f7580d78c00) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f7580d78cc0) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f7580afc720) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f7580afc7e0) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f7580afc780) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f7580afc840) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f7580afc6c0) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f7580afcb40) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f7580afcc00) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f7580afcba0) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f7580afccc0) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f7580afcc60) 0 + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f75808c9900) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7f75808f43a8) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7f75808f4410) 0 + primary-for QVariantAnimation (0x0x7f75808f43a8) + QObject (0x0x7f75808c98a0) 0 + primary-for QAbstractAnimation (0x0x7f75808f4410) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f75808c99c0) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7f75808f44e0) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7f75808f4548) 0 + primary-for QPropertyAnimation (0x0x7f75808f44e0) + QAbstractAnimation (0x0x7f75808f45b0) 0 + primary-for QVariantAnimation (0x0x7f75808f4548) + QObject (0x0x7f75808c9960) 0 + primary-for QAbstractAnimation (0x0x7f75808f45b0) + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f75808c9a80) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7f75808f4618) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7f75808f4680) 0 + primary-for QSequentialAnimationGroup (0x0x7f75808f4618) + QAbstractAnimation (0x0x7f75808f46e8) 0 + primary-for QAnimationGroup (0x0x7f75808f4680) + QObject (0x0x7f75808c9a20) 0 + primary-for QAbstractAnimation (0x0x7f75808f46e8) + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f75808c9b40) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 0u +64 0u + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f75808c9ae0) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f75808c9c60) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f75808c9cc0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f75808c9d20) 0 + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f75808c9f00) 0 empty + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f7580a066c0) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f7580a06840) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f7580a069c0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f7580a06ba0) 0 empty + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f7580a06c60) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7f75808f49c0) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7f7580a06c00) 0 + primary-for QIODevice (0x0x7f75808f49c0) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f7580a06de0) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7f75808f4af8) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7f75808f4b60) 0 + primary-for QBuffer (0x0x7f75808f4af8) + QObject (0x0x7f7580a06d80) 0 + primary-for QIODevice (0x0x7f75808f4b60) + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f7580a06e40) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f7580a06f00) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f75807fb2a0) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f75807fb300) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7f75807fb3c0) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f75807fb5a0) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f75807fb7e0) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7f75807fbae0) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f75807fba80) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f75807fbc60) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f75807fbd20) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f75807fbf00) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7f758055d340) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7f758055d3a8) 0 + primary-for QFileDevice (0x0x7f758055d340) + QObject (0x0x7f75807fbea0) 0 + primary-for QIODevice (0x0x7f758055d3a8) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f75806330c0) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7f758055d4e0) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7f758055d548) 0 + primary-for QFile (0x0x7f758055d4e0) + QIODevice (0x0x7f758055d5b0) 0 + primary-for QFileDevice (0x0x7f758055d548) + QObject (0x0x7f7580633060) 0 + primary-for QIODevice (0x0x7f758055d5b0) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f75806331e0) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f75806334e0) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f7580633840) 0 + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f7580633a20) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7f758055da90) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7f75806339c0) 0 + primary-for QFileSelector (0x0x7f758055da90) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f7580633ae0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7f758055daf8) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7f7580633a80) 0 + primary-for QFileSystemWatcher (0x0x7f758055daf8) + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f7580633b40) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7f7580633cc0) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f7580633c60) 0 + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f7580633e40) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f75803880c0) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7f758055dd00) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7f758055dd68) 0 + primary-for QProcess (0x0x7f758055dd00) + QObject (0x0x7f7580388060) 0 + primary-for QIODevice (0x0x7f758055dd68) + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f7580388120) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f75803882a0) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7f758055ddd0) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7f758055de38) 0 + primary-for QSaveFile (0x0x7f758055ddd0) + QIODevice (0x0x7f758055dea0) 0 + primary-for QFileDevice (0x0x7f758055de38) + QObject (0x0x7f7580388240) 0 + primary-for QIODevice (0x0x7f758055dea0) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f7580388360) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7f758055df08) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7f7580388300) 0 + primary-for QSettings (0x0x7f758055df08) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f75803883c0) 0 empty + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7f75803884e0) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f75803887e0) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f7580388900) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7f758043b068) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7f758043b0d0) 0 + primary-for QTemporaryFile (0x0x7f758043b068) + QFileDevice (0x0x7f758043b138) 0 + primary-for QFile (0x0x7f758043b0d0) + QIODevice (0x0x7f758043b1a0) 0 + primary-for QFileDevice (0x0x7f758043b138) + QObject (0x0x7f75803888a0) 0 + primary-for QIODevice (0x0x7f758043b1a0) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f7580388a20) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f7580388e40) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f7580144060) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f75801441e0) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f75801443c0) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7f758043b680) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7f7580144360) 0 + primary-for QAbstractItemModel (0x0x7f758043b680) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f7580144720) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractTableModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7f758043b888) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7f758043b8f0) 0 + primary-for QAbstractTableModel (0x0x7f758043b888) + QObject (0x0x7f75801446c0) 0 + primary-for QAbstractItemModel (0x0x7f758043b8f0) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f75801447e0) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractListModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7f758043b958) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7f758043b9c0) 0 + primary-for QAbstractListModel (0x0x7f758043b958) + QObject (0x0x7f7580144780) 0 + primary-for QAbstractItemModel (0x0x7f758043b9c0) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f7580144ae0) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7f758043baf8) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7f758043bb60) 0 + primary-for QAbstractProxyModel (0x0x7f758043baf8) + QObject (0x0x7f7580144a80) 0 + primary-for QAbstractItemModel (0x0x7f758043bb60) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f7580144ba0) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7f758043bbc8) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7f758043bc30) 0 + primary-for QIdentityProxyModel (0x0x7f758043bbc8) + QAbstractItemModel (0x0x7f758043bc98) 0 + primary-for QAbstractProxyModel (0x0x7f758043bc30) + QObject (0x0x7f7580144b40) 0 + primary-for QAbstractItemModel (0x0x7f758043bc98) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f7580144c00) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f7580144de0) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7f758043bdd0) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7f7580144d80) 0 + primary-for QItemSelectionModel (0x0x7f758043bdd0) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f757ff17000) 0 + QList (0x0x7f757ff17068) 0 + QListSpecialMethods (0x0x7f757fef2060) 0 empty + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f757fef2480) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7f757ff17138) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7f757ff171a0) 0 + primary-for QSortFilterProxyModel (0x0x7f757ff17138) + QAbstractItemModel (0x0x7f757ff17208) 0 + primary-for QAbstractProxyModel (0x0x7f757ff171a0) + QObject (0x0x7f757fef2420) 0 + primary-for QAbstractItemModel (0x0x7f757ff17208) + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f757fef2540) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7f757ff17270) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7f757ff172d8) 0 + primary-for QStringListModel (0x0x7f757ff17270) + QAbstractItemModel (0x0x7f757ff17340) 0 + primary-for QAbstractListModel (0x0x7f757ff172d8) + QObject (0x0x7f757fef24e0) 0 + primary-for QAbstractItemModel (0x0x7f757ff17340) + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f757fef25a0) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f757fef2660) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7f757fef2720) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7f757fef2780) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f757fef2840) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f757fef28a0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f757fef27e0) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f757fef2900) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f757fef2960) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f757fef2a20) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f757fef2a80) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f757fef29c0) 0 + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f757fef2ba0) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7f757ff173a8) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7f757fef2b40) 0 + primary-for QEventLoop (0x0x7f757ff173a8) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f757fef2cc0) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f757fef2d80) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f757fef2de0) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7f757ff174e0) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7f757fef2d20) 0 + primary-for QAbstractEventDispatcher (0x0x7f757ff174e0) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f757fef2e40) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f757fef2ea0) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7f757fcc7060) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7f757ff175b0) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7f757fcc70c0) 0 + primary-for QTimerEvent (0x0x7f757ff175b0) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7f757ff17618) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7f757fcc7120) 0 + primary-for QChildEvent (0x0x7f757ff17618) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7f757ff17680) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7f757fcc7180) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f757ff17680) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7f757ff176e8) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7f757fcc71e0) 0 + primary-for QDeferredDeleteEvent (0x0x7f757ff176e8) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f757fcc72a0) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7f757ff17750) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7f757fcc7240) 0 + primary-for QCoreApplication (0x0x7f757ff17750) + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7f757fcc7300) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f757fcc7480) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f757fcc7600) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f757fcc7780) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f757fcc77e0) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f757fcc79c0) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7f757ff178f0) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7f757fcc7960) 0 + primary-for QMimeData (0x0x7f757ff178f0) + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f757fcc7a80) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7f757ff17958) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7f757fcc7a20) 0 + primary-for QObjectCleanupHandler (0x0x7f757ff17958) + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f757fcc7ae0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f757fcc7c60) 0 + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f757fad12a0) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7f757ff17d68) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7f757fad1240) 0 + primary-for QSharedMemory (0x0x7f757ff17d68) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f757fad1360) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7f757ff17dd0) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7f757fad1300) 0 + primary-for QSignalMapper (0x0x7f757ff17dd0) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f757fad1420) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7f757ff17e38) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7f757fad13c0) 0 + primary-for QSocketNotifier (0x0x7f757ff17e38) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f757fad1480) 0 + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f757fad15a0) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7f757ff17ea0) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7f757fad1540) 0 + primary-for QTimer (0x0x7f757ff17ea0) + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f757fad1720) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7f757ff17f70) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7f757fad16c0) 0 + primary-for QTranslator (0x0x7f757ff17f70) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f757fad1780) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f757fad1960) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f757fad19c0) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f757fad1ae0) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7f757ff17c98) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7f757fad1a80) 0 + primary-for QLibrary (0x0x7f757ff17c98) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f757fad1c00) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f757fad1de0) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7f757fbab0d0) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7f757fad1d80) 0 + primary-for QPluginLoader (0x0x7f757fbab0d0) + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f757fad1e40) 0 + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f757fbf7060) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7f757fbab1a0) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7f757fbf7000) 0 + primary-for QAbstractState (0x0x7f757fbab1a0) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f757fbf7120) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7f757fbab208) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7f757fbf70c0) 0 + primary-for QAbstractTransition (0x0x7f757fbab208) + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f757fbf71e0) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7f757fbab270) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7f757fbab2d8) 0 + primary-for QEventTransition (0x0x7f757fbab270) + QObject (0x0x7f757fbf7180) 0 + primary-for QAbstractTransition (0x0x7f757fbab2d8) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f757fbf72a0) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7f757fbab340) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7f757fbab3a8) 0 + primary-for QFinalState (0x0x7f757fbab340) + QObject (0x0x7f757fbf7240) 0 + primary-for QAbstractState (0x0x7f757fbab3a8) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f757fbf7360) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7f757fbab410) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7f757fbab478) 0 + primary-for QHistoryState (0x0x7f757fbab410) + QObject (0x0x7f757fbf7300) 0 + primary-for QAbstractState (0x0x7f757fbab478) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f757fbf7420) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7f757fbab4e0) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7f757fbab548) 0 + primary-for QSignalTransition (0x0x7f757fbab4e0) + QObject (0x0x7f757fbf73c0) 0 + primary-for QAbstractTransition (0x0x7f757fbab548) + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f757fbf74e0) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7f757fbab5b0) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7f757fbab618) 0 + primary-for QState (0x0x7f757fbab5b0) + QObject (0x0x7f757fbf7480) 0 + primary-for QAbstractState (0x0x7f757fbab618) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f757fbf7600) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7f757fbab7b8) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7f757fbf7660) 0 + primary-for QStateMachine::SignalEvent (0x0x7f757fbab7b8) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7f757fbab820) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7f757fbf76c0) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f757fbab820) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7f757fbab680) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7f757fbab6e8) 0 + primary-for QStateMachine (0x0x7f757fbab680) + QAbstractState (0x0x7f757fbab750) 0 + primary-for QState (0x0x7f757fbab6e8) + QObject (0x0x7f757fbf75a0) 0 + primary-for QAbstractState (0x0x7f757fbab750) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7f757fbab888) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7f757fbf7720) 0 nearly-empty + primary-for QException (0x0x7f757fbab888) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7f757fbab8f0) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7f757fbab958) 0 nearly-empty + primary-for QUnhandledException (0x0x7f757fbab8f0) + std::exception (0x0x7f757fbf7780) 0 nearly-empty + primary-for QException (0x0x7f757fbab958) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f757fbf77e0) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f757fbf78a0) 0 + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f757fbf7900) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f757fbf7960) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f757fbabaf8) 0 + QBasicMutex (0x0x7f757fbf7ae0) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f757fbf7b40) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f757fbf7c00) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f757fbf7c60) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7f757fbf7de0) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7f757fbf7ea0) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f757f976240) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 0u +48 0u +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7f757f9373a8) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7f757f9761e0) 0 + primary-for QFutureWatcherBase (0x0x7f757f9373a8) + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f757f976360) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f757f9763c0) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f757f976420) 0 + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f757f976480) 0 + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f757f976540) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7f757f937820) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7f757f9764e0) 0 + primary-for QThread (0x0x7f757f937820) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f757f976600) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7f757f937888) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7f757f9765a0) 0 + primary-for QThreadPool (0x0x7f757f937888) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f757f976660) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f757f976720) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f757f976c00) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f757f976de0) 0 + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f757f6fb060) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f757f6fb000) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f757f6fb1e0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f757f6fb2a0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f757f6fb540) 0 + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f757f6fb720) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f757f6fb780) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f757f6fb7e0) 0 + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f757f6fb840) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f757f6fb9c0) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f757f6fbb40) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f757f6fbcc0) 0 + +Class QLinkedListData + size=32 align=8 + base size=32 base align=8 +QLinkedListData (0x0x7f757f6fbe40) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f757f44d600) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7f757f44d780) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f757f44d900) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f757f44d9c0) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f757f44dc00) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f757f44de40) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f757f631000) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f757f631180) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f757f6314e0) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f757f6316c0) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f757f631a80) 0 empty + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f757f2f04e0) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f757f2f0660) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7f757f258bc8) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7f757f2f0600) 0 + primary-for QTimeLine (0x0x7f757f258bc8) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f757f2f0720) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f757f2f06c0) 0 + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7f757f2f0a80) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7f757f2f0a20) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f757f2f0d80) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f757f2f0f00) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f757f02d068) 0 + QVector (0x0x7f757f012180) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f757f0121e0) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f757f012360) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f757f0124e0) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7f757f012660) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f757f0126c0) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f757f0127e0) 0 + +Class QGeoAddress + size=8 align=8 + base size=8 base align=8 +QGeoAddress (0x0x7f757f012900) 0 + +Class QGeoCoordinate + size=8 align=8 + base size=8 base align=8 +QGeoCoordinate (0x0x7f757f012c00) 0 + +Class QGeoShape + size=8 align=8 + base size=8 base align=8 +QGeoShape (0x0x7f757f012f00) 0 + +Class QGeoAreaMonitorInfo + size=8 align=8 + base size=8 base align=8 +QGeoAreaMonitorInfo (0x0x7f757f118240) 0 + +Class QGeoPositionInfo + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfo (0x0x7f757f118300) 0 + +Class QGeoPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoPositionInfoSource::QPrivateSignal (0x0x7f757f1183c0) 0 empty + +Vtable for QGeoPositionInfoSource +QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QGeoPositionInfoSource) +16 (int (*)(...))QGeoPositionInfoSource::metaObject +24 (int (*)(...))QGeoPositionInfoSource::qt_metacast +32 (int (*)(...))QGeoPositionInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoPositionInfoSource (0x0x7f757f02d340) 0 + vptr=((& QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource) + 16u) + QObject (0x0x7f757f118360) 0 + primary-for QGeoPositionInfoSource (0x0x7f757f02d340) + +Class QGeoAreaMonitorSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoAreaMonitorSource::QPrivateSignal (0x0x7f757f118540) 0 empty + +Vtable for QGeoAreaMonitorSource +QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QGeoAreaMonitorSource) +16 (int (*)(...))QGeoAreaMonitorSource::metaObject +24 (int (*)(...))QGeoAreaMonitorSource::qt_metacast +32 (int (*)(...))QGeoAreaMonitorSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoAreaMonitorSource::setPositionInfoSource +120 (int (*)(...))QGeoAreaMonitorSource::positionInfoSource +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoAreaMonitorSource + size=24 align=8 + base size=24 base align=8 +QGeoAreaMonitorSource (0x0x7f757f02d478) 0 + vptr=((& QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource) + 16u) + QObject (0x0x7f757f1184e0) 0 + primary-for QGeoAreaMonitorSource (0x0x7f757f02d478) + +Class QGeoCircle + size=8 align=8 + base size=8 base align=8 +QGeoCircle (0x0x7f757f02d4e0) 0 + QGeoShape (0x0x7f757f1185a0) 0 + +Class QGeoLocation + size=8 align=8 + base size=8 base align=8 +QGeoLocation (0x0x7f757f118840) 0 + +Class QGeoSatelliteInfo + size=8 align=8 + base size=8 base align=8 +QGeoSatelliteInfo (0x0x7f757f118b40) 0 + +Class QGeoSatelliteInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoSatelliteInfoSource::QPrivateSignal (0x0x7f757f118c00) 0 empty + +Vtable for QGeoSatelliteInfoSource +QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QGeoSatelliteInfoSource) +16 (int (*)(...))QGeoSatelliteInfoSource::metaObject +24 (int (*)(...))QGeoSatelliteInfoSource::qt_metacast +32 (int (*)(...))QGeoSatelliteInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoSatelliteInfoSource::setUpdateInterval +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual + +Class QGeoSatelliteInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoSatelliteInfoSource (0x0x7f757f02d618) 0 + vptr=((& QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource) + 16u) + QObject (0x0x7f757f118ba0) 0 + primary-for QGeoSatelliteInfoSource (0x0x7f757f02d618) + +Vtable for QGeoPositionInfoSourceFactory +QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI29QGeoPositionInfoSourceFactory) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactory + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactory (0x0x7f757f118cc0) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory) + 16u) + +Class QGeoRectangle + size=8 align=8 + base size=8 base align=8 +QGeoRectangle (0x0x7f757f02d680) 0 + QGeoShape (0x0x7f757f118d80) 0 + +Class QNmeaPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNmeaPositionInfoSource::QPrivateSignal (0x0x7f757eded1e0) 0 empty + +Vtable for QNmeaPositionInfoSource +QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource: 24u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QNmeaPositionInfoSource) +16 (int (*)(...))QNmeaPositionInfoSource::metaObject +24 (int (*)(...))QNmeaPositionInfoSource::qt_metacast +32 (int (*)(...))QNmeaPositionInfoSource::qt_metacall +40 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +48 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QNmeaPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))QNmeaPositionInfoSource::lastKnownPosition +136 (int (*)(...))QNmeaPositionInfoSource::supportedPositioningMethods +144 (int (*)(...))QNmeaPositionInfoSource::minimumUpdateInterval +152 (int (*)(...))QNmeaPositionInfoSource::error +160 (int (*)(...))QNmeaPositionInfoSource::startUpdates +168 (int (*)(...))QNmeaPositionInfoSource::stopUpdates +176 (int (*)(...))QNmeaPositionInfoSource::requestUpdate +184 (int (*)(...))QNmeaPositionInfoSource::parsePosInfoFromNmeaData + +Class QNmeaPositionInfoSource + size=32 align=8 + base size=32 base align=8 +QNmeaPositionInfoSource (0x0x7f757f02d820) 0 + vptr=((& QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource) + 16u) + QGeoPositionInfoSource (0x0x7f757f02d888) 0 + primary-for QNmeaPositionInfoSource (0x0x7f757f02d820) + QObject (0x0x7f757eded180) 0 + primary-for QGeoPositionInfoSource (0x0x7f757f02d888) + diff --git a/tests/auto/bic/data/QtPositioning.5.7.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtPositioning.5.7.0.linux-gcc-amd64.txt new file mode 100644 index 0000000..cf3f81f --- /dev/null +++ b/tests/auto/bic/data/QtPositioning.5.7.0.linux-gcc-amd64.txt @@ -0,0 +1,4400 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7ff717ebbd80) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7ff717f63540) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7ff717f63780) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7ff717f639c0) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7ff717f63c00) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7ff717f63d80) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7ff717f97180) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7ff715c1b900) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7ff715c1b9c0) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7ff715c1bd20) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7ff715c1bde0) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7ff715c1bea0) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7ff715c1bf60) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7ff715c52240) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7ff715c523c0) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7ff715c52840) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7ff715c528a0) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7ff715cfb540) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7ff715cfb5a0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7ff715c1f750) 0 empty + std::input_iterator_tag (0x0x7ff715cfb600) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7ff715c1f7b8) 0 empty + std::forward_iterator_tag (0x0x7ff715c1f820) 0 empty + std::input_iterator_tag (0x0x7ff715cfb660) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7ff715c1f888) 0 empty + std::bidirectional_iterator_tag (0x0x7ff715c1f8f0) 0 empty + std::forward_iterator_tag (0x0x7ff715c1f958) 0 empty + std::input_iterator_tag (0x0x7ff715cfb6c0) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7ff715d3d360) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7ff715d3d3c0) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7ff715d3d420) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7ff715d3d480) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7ff715d3d4e0) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7ff715a65000) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7ff715a65240) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7ff715a65300) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7ff715a65360) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7ff715a65420) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7ff715a65480) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7ff715a65900) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7ff715a65960) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7ff715a659c0) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7ff715c1fea0) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7ff715a65a20) 0 nearly-empty + primary-for std::bad_exception (0x0x7ff715c1fea0) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7ff715a65a80) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7ff715a65ae0) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16u) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7ff715b6f0d0) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7ff715a65f00) 0 nearly-empty + primary-for std::bad_alloc (0x0x7ff715b6f0d0) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7ff715b6f138) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16u) + std::bad_alloc (0x0x7ff715b6f1a0) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7ff715b6f138) + std::exception (0x0x7ff715a65f60) 0 nearly-empty + primary-for std::bad_alloc (0x0x7ff715b6f1a0) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7ff715b81000) 0 empty + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7ff715b81c00) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7ff715982900) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7ff715982960) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7ff715678840) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7ff7156788a0) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7ff715678960) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7ff7156789c0) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7ff715678a20) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7ff715678a80) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7ff715678ba0) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7ff715678c00) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7ff71542f060) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7ff71542f0c0) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7ff7151ca8a0) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7ff7151ca900) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7ff7151fc8a0) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7ff714ff96c0) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7ff7151d5f08) 0 + std::iterator (0x0x7ff714ff9780) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7ff7151d5f70) 0 + std::_Bit_iterator_base (0x0x7ff7151d56e8) 0 + std::iterator (0x0x7ff714ff97e0) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7ff7151d5750) 0 + std::_Bit_iterator_base (0x0x7ff7151d5a28) 0 + std::iterator (0x0x7ff714ff9840) 0 empty + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7ff714e26660) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7ff714f21420) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7ff714f213c0) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7ff714cc13c0) 0 + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7ff713a87e40) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7ff713a87ea0) 0 + +Class QtPrivate::big_ + size=2 align=1 + base size=2 base align=1 +QtPrivate::big_ (0x0x7ff71383c2a0) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7ff7138f3780) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7ff7138f37e0) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7ff7138f3840) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7ff7138f38a0) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7ff7138f3a20) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7ff7138f3e40) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7ff713948138) 0 + std::__atomic_flag_base (0x0x7ff7138f3ea0) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7ff713948888) 0 + QAtomicInteger (0x0x7ff7139488f0) 0 + QBasicAtomicInteger (0x0x7ff71349c420) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7ff7132d4cc0) 0 empty + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7ff713115ba0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7ff713291b60) 0 + QGenericArgument (0x0x7ff713115c00) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7ff713115d80) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7ff713115e40) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7ff712df1ea0) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7ff712df1f00) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7ff712e970c0) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7ff712e97180) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7ff712e975a0) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7ff712e97600) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7ff712e97660) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7ff712e976c0) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7ff712e97720) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7ff712e97ae0) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7ff712e10d00) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16u) + std::exception (0x0x7ff712e97ba0) 0 nearly-empty + primary-for std::logic_error (0x0x7ff712e10d00) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7ff712e10dd0) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16u) + std::logic_error (0x0x7ff712fa9000) 0 + primary-for std::domain_error (0x0x7ff712e10dd0) + std::exception (0x0x7ff712e97c00) 0 nearly-empty + primary-for std::logic_error (0x0x7ff712fa9000) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7ff712fa9068) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16u) + std::logic_error (0x0x7ff712fa90d0) 0 + primary-for std::invalid_argument (0x0x7ff712fa9068) + std::exception (0x0x7ff712e97c60) 0 nearly-empty + primary-for std::logic_error (0x0x7ff712fa90d0) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7ff712fa9138) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16u) + std::logic_error (0x0x7ff712fa91a0) 0 + primary-for std::length_error (0x0x7ff712fa9138) + std::exception (0x0x7ff712e97cc0) 0 nearly-empty + primary-for std::logic_error (0x0x7ff712fa91a0) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7ff712fa9208) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16u) + std::logic_error (0x0x7ff712fa9270) 0 + primary-for std::out_of_range (0x0x7ff712fa9208) + std::exception (0x0x7ff712e97d20) 0 nearly-empty + primary-for std::logic_error (0x0x7ff712fa9270) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7ff712fa92d8) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16u) + std::exception (0x0x7ff712e97d80) 0 nearly-empty + primary-for std::runtime_error (0x0x7ff712fa92d8) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7ff712fa9340) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16u) + std::runtime_error (0x0x7ff712fa93a8) 0 + primary-for std::range_error (0x0x7ff712fa9340) + std::exception (0x0x7ff712e97de0) 0 nearly-empty + primary-for std::runtime_error (0x0x7ff712fa93a8) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7ff712fa9410) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16u) + std::runtime_error (0x0x7ff712fa9478) 0 + primary-for std::overflow_error (0x0x7ff712fa9410) + std::exception (0x0x7ff712e97e40) 0 nearly-empty + primary-for std::runtime_error (0x0x7ff712fa9478) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7ff712fa94e0) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16u) + std::runtime_error (0x0x7ff712fa9548) 0 + primary-for std::underflow_error (0x0x7ff712fa94e0) + std::exception (0x0x7ff712e97ea0) 0 nearly-empty + primary-for std::runtime_error (0x0x7ff712fa9548) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7ff712bcb060) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16u) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7ff712bcb2a0) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7ff712bcb420) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7ff712fa9a28) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16u) + std::runtime_error (0x0x7ff712fa9a90) 0 + primary-for std::system_error (0x0x7ff712fa9a28) + std::exception (0x0x7ff712bcb660) 0 nearly-empty + primary-for std::runtime_error (0x0x7ff712fa9a90) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7ff712c27680) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16u) + std::system_error (0x0x7ff712c276e8) 0 + primary-for std::ios_base::failure (0x0x7ff712c27680) + std::runtime_error (0x0x7ff712c27750) 0 + primary-for std::system_error (0x0x7ff712c276e8) + std::exception (0x0x7ff712bcb960) 0 nearly-empty + primary-for std::runtime_error (0x0x7ff712c27750) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7ff712bcb9c0) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7ff712bcba20) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7ff712bcba80) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7ff712bcb900) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7ff712cff240) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7ff712cff900) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7ff71291b000 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7ff71291b0d0 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7ff71291b478 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7ff71291b548 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7ff7129391e0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7ff712939240) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7ff712637660) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7ff712637840) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7ff712637a80) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7ff712637b40) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7ff712637ae0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7ff712463ae0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7ff7121f6660) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7ff7121f6a80) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7ff7121f6ae0) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7ff7121f6b40) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7ff7121f6f00) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7ff7121f6f60) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7ff7121fc618) 0 empty + QListData::NotIndirectLayout (0x0x7ff711ff3000) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7ff711fec850) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7ff711ff3060) 0 empty + QListData::NotIndirectLayout (0x0x7ff711ff30c0) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7ff7121fc680) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7ff711ff3120) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7ff711ff3180) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7ff7121f6ea0) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7ff711ff3d20) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7ff712181e40) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7ff712181de0) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7ff712186f08) 0 + QList (0x0x7ff712186f70) 0 + QListSpecialMethods (0x0x7ff7121bc060) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7ff7121bc360) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7ff7121bc780) 0 + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7ff7121bcde0) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7ff7121bcf60) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7ff711c36060) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7ff711dfdf70) 0 + std::__uses_alloc_base (0x0x7ff711c36000) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7ff711d2c0c0) 0 empty + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7ff711d2c300) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7ff711d2c3c0) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7ff711d2c4e0) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7ff711d2c660) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7ff711d2ca20) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7ff711d2cb40) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7ff711ab54e0) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7ff711ab58a0) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7ff711ab5ae0) 0 + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7ff7118cf840) 0 + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7ff7118cf9c0) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7ff7118cfba0) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7ff7118cfb40) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7ff7118cff00) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7ff7118cff60) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7ff7115d6060) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7ff711b9c8f0) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7ff7115d6000) 0 + primary-for QAbstractAnimation (0x0x7ff711b9c8f0) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7ff7115d6120) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7ff711b9c958) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7ff7115d60c0) 0 + primary-for QAnimationDriver (0x0x7ff711b9c958) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7ff7115d61e0) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7ff711b9c9c0) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7ff711b9ca28) 0 + primary-for QAnimationGroup (0x0x7ff711b9c9c0) + QObject (0x0x7ff7115d6180) 0 + primary-for QAbstractAnimation (0x0x7ff711b9ca28) + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7ff7115d62a0) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7ff711b9ca90) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7ff711b9caf8) 0 + primary-for QParallelAnimationGroup (0x0x7ff711b9ca90) + QAbstractAnimation (0x0x7ff711b9cb60) 0 + primary-for QAnimationGroup (0x0x7ff711b9caf8) + QObject (0x0x7ff7115d6240) 0 + primary-for QAbstractAnimation (0x0x7ff711b9cb60) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7ff7115d6360) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7ff711b9cbc8) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7ff711b9cc30) 0 + primary-for QPauseAnimation (0x0x7ff711b9cbc8) + QObject (0x0x7ff7115d6300) 0 + primary-for QAbstractAnimation (0x0x7ff711b9cc30) + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7ff7116b36c0) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7ff711782780) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7ff711782840) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7ff711782c00) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7ff711782ba0) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7ff711782c60) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7ff7114ba6c0) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7ff7114ba780) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7ff7114ba720) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7ff7114ba7e0) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7ff7114ba660) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7ff71123cae0) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7ff71123ccc0) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7ff71123cc60) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7ff71123cd80) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7ff71123cd20) 0 + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7ff710fcc720) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7ff710fd7208) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7ff710fd7270) 0 + primary-for QVariantAnimation (0x0x7ff710fd7208) + QObject (0x0x7ff710fcc6c0) 0 + primary-for QAbstractAnimation (0x0x7ff710fd7270) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7ff710fcc7e0) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7ff710fd7340) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7ff710fd73a8) 0 + primary-for QPropertyAnimation (0x0x7ff710fd7340) + QAbstractAnimation (0x0x7ff710fd7410) 0 + primary-for QVariantAnimation (0x0x7ff710fd73a8) + QObject (0x0x7ff710fcc780) 0 + primary-for QAbstractAnimation (0x0x7ff710fd7410) + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7ff710fcc8a0) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7ff710fd7478) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7ff710fd74e0) 0 + primary-for QSequentialAnimationGroup (0x0x7ff710fd7478) + QAbstractAnimation (0x0x7ff710fd7548) 0 + primary-for QAnimationGroup (0x0x7ff710fd74e0) + QObject (0x0x7ff710fcc840) 0 + primary-for QAbstractAnimation (0x0x7ff710fd7548) + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7ff710fcc960) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 0u +64 0u + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7ff710fcc900) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7ff710fccae0) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7ff710fccb40) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7ff710fccba0) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7ff710fccd80) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7ff710fccf00) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7ff7111170c0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7ff7111172a0) 0 empty + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7ff711117360) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7ff710fd77b8) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7ff711117300) 0 + primary-for QIODevice (0x0x7ff710fd77b8) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7ff711117540) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7ff710fd78f0) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7ff710fd7958) 0 + primary-for QBuffer (0x0x7ff710fd78f0) + QObject (0x0x7ff7111174e0) 0 + primary-for QIODevice (0x0x7ff710fd7958) + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7ff7111175a0) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7ff711117660) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7ff711117960) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7ff711117ba0) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7ff711117de0) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7ff710b800c0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7ff710b80240) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7ff710b806c0) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7ff710b80660) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7ff710d08780) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7ff710d08840) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7ff710d08900) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7ff710d09888) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7ff710d098f0) 0 + primary-for QFileDevice (0x0x7ff710d09888) + QObject (0x0x7ff710d088a0) 0 + primary-for QIODevice (0x0x7ff710d098f0) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7ff710d08ae0) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7ff710d09a28) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7ff710d09a90) 0 + primary-for QFile (0x0x7ff710d09a28) + QIODevice (0x0x7ff710d09af8) 0 + primary-for QFileDevice (0x0x7ff710d09a90) + QObject (0x0x7ff710d08a80) 0 + primary-for QIODevice (0x0x7ff710d09af8) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7ff710d08c60) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7ff710d08f60) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7ff710a503c0) 0 + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7ff710a50600) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7ff710af2000) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7ff710a505a0) 0 + primary-for QFileSelector (0x0x7ff710af2000) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7ff710a506c0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7ff710af2068) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7ff710a50660) 0 + primary-for QFileSystemWatcher (0x0x7ff710af2068) + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7ff710a50720) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7ff710a508a0) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7ff710a50840) 0 + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7ff710a50a20) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16u) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7ff710af2138) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16u) + std::exception (0x0x7ff710a50a80) 0 nearly-empty + primary-for std::bad_cast (0x0x7ff710af2138) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7ff710af21a0) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16u) + std::exception (0x0x7ff710a50ae0) 0 nearly-empty + primary-for std::bad_typeid (0x0x7ff710af21a0) + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7ff7108d5410) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16u) + std::exception (0x0x7ff710873ba0) 0 nearly-empty + primary-for std::bad_function_call (0x0x7ff7108d5410) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7ff710873c60) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7ff710873cc0) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7ff710873de0) 0 + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7ff71093d300) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7ff71093d540) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7ff7108d5c30) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7ff7108d5c98) 0 + primary-for QProcess (0x0x7ff7108d5c30) + QObject (0x0x7ff71093d4e0) 0 + primary-for QIODevice (0x0x7ff7108d5c98) + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7ff71093d5a0) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7ff71093d720) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7ff7108d5d00) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7ff7108d5d68) 0 + primary-for QSaveFile (0x0x7ff7108d5d00) + QIODevice (0x0x7ff7108d5dd0) 0 + primary-for QFileDevice (0x0x7ff7108d5d68) + QObject (0x0x7ff71093d6c0) 0 + primary-for QIODevice (0x0x7ff7108d5dd0) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7ff71093d7e0) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7ff7108d5e38) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7ff71093d780) 0 + primary-for QSettings (0x0x7ff7108d5e38) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7ff71093d840) 0 empty + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7ff71093d9c0) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7ff71093dcc0) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7ff71093dde0) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7ff71066b000) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7ff71066b068) 0 + primary-for QTemporaryFile (0x0x7ff71066b000) + QFileDevice (0x0x7ff71066b0d0) 0 + primary-for QFile (0x0x7ff71066b068) + QIODevice (0x0x7ff71066b138) 0 + primary-for QFileDevice (0x0x7ff71066b0d0) + QObject (0x0x7ff71093dd80) 0 + primary-for QIODevice (0x0x7ff71066b138) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7ff71093df00) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7ff71037f3c0) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7ff71037f5a0) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7ff71037f720) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7ff710498600) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7ff710484f70) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7ff7104985a0) 0 + primary-for QAbstractItemModel (0x0x7ff710484f70) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7ff710498960) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractTableModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7ff7104f71a0) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7ff7104f7208) 0 + primary-for QAbstractTableModel (0x0x7ff7104f71a0) + QObject (0x0x7ff710498900) 0 + primary-for QAbstractItemModel (0x0x7ff7104f7208) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7ff710498a20) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractListModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7ff7104f7270) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7ff7104f72d8) 0 + primary-for QAbstractListModel (0x0x7ff7104f7270) + QObject (0x0x7ff7104989c0) 0 + primary-for QAbstractItemModel (0x0x7ff7104f72d8) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7ff710498d20) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7ff7104f7410) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7ff7104f7478) 0 + primary-for QAbstractProxyModel (0x0x7ff7104f7410) + QObject (0x0x7ff710498cc0) 0 + primary-for QAbstractItemModel (0x0x7ff7104f7478) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7ff710498de0) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7ff7104f74e0) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7ff7104f7548) 0 + primary-for QIdentityProxyModel (0x0x7ff7104f74e0) + QAbstractItemModel (0x0x7ff7104f75b0) 0 + primary-for QAbstractProxyModel (0x0x7ff7104f7548) + QObject (0x0x7ff710498d80) 0 + primary-for QAbstractItemModel (0x0x7ff7104f75b0) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7ff710498e40) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7ff71021d0c0) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7ff7104f7820) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7ff71021d060) 0 + primary-for QItemSelectionModel (0x0x7ff7104f7820) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7ff7104f7a28) 0 + QList (0x0x7ff7104f7a90) 0 + QListSpecialMethods (0x0x7ff71021d360) 0 empty + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7ff71021d780) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7ff7104f7b60) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7ff7104f7bc8) 0 + primary-for QSortFilterProxyModel (0x0x7ff7104f7b60) + QAbstractItemModel (0x0x7ff7104f7c30) 0 + primary-for QAbstractProxyModel (0x0x7ff7104f7bc8) + QObject (0x0x7ff71021d720) 0 + primary-for QAbstractItemModel (0x0x7ff7104f7c30) + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7ff71021d840) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7ff7104f7c98) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7ff7104f7d00) 0 + primary-for QStringListModel (0x0x7ff7104f7c98) + QAbstractItemModel (0x0x7ff7104f7d68) 0 + primary-for QAbstractListModel (0x0x7ff7104f7d00) + QObject (0x0x7ff71021d7e0) 0 + primary-for QAbstractItemModel (0x0x7ff7104f7d68) + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7ff71021d8a0) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7ff71021d960) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7ff71021da20) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7ff71021da80) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7ff71021db40) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7ff71021dba0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7ff71021dae0) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7ff71021dc60) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7ff71021dcc0) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7ff71021dd80) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7ff71021dde0) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7ff71021dd20) 0 + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7ff71002d000) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7ff7104f7f70) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7ff71021df60) 0 + primary-for QEventLoop (0x0x7ff7104f7f70) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7ff71002d180) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7ff71002d240) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7ff71002d2a0) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7ff7100380d0) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7ff71002d1e0) 0 + primary-for QAbstractEventDispatcher (0x0x7ff7100380d0) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7ff71002d300) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7ff71002d360) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7ff71002d4e0) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7ff7100381a0) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7ff71002d540) 0 + primary-for QTimerEvent (0x0x7ff7100381a0) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7ff710038208) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7ff71002d5a0) 0 + primary-for QChildEvent (0x0x7ff710038208) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7ff710038270) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7ff71002d600) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7ff710038270) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7ff7100382d8) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7ff71002d660) 0 + primary-for QDeferredDeleteEvent (0x0x7ff7100382d8) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7ff71002d720) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7ff710038340) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7ff71002d6c0) 0 + primary-for QCoreApplication (0x0x7ff710038340) + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7ff71002d7e0) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7ff71002d960) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7ff71002db40) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7ff71002dba0) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7ff71002dd80) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7ff7100384e0) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7ff71002dd20) 0 + primary-for QMimeData (0x0x7ff7100384e0) + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7ff71002de40) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7ff710038548) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7ff71002dde0) 0 + primary-for QObjectCleanupHandler (0x0x7ff710038548) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7ff70fd690c0) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7ff7100385b0) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7ff70fd69060) 0 + primary-for QSharedMemory (0x0x7ff7100385b0) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7ff70fd69180) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7ff710038618) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7ff70fd69120) 0 + primary-for QSignalMapper (0x0x7ff710038618) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7ff70fd69240) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7ff710038680) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7ff70fd691e0) 0 + primary-for QSocketNotifier (0x0x7ff710038680) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7ff70fd692a0) 0 + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7ff70fd693c0) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7ff7100386e8) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7ff70fd69360) 0 + primary-for QTimer (0x0x7ff7100386e8) + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7ff70fd69540) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7ff7100387b8) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7ff70fd694e0) 0 + primary-for QTranslator (0x0x7ff7100387b8) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7ff70fd695a0) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7ff70fd69780) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7ff70fd697e0) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7ff70fd69900) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7ff710038888) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7ff70fd698a0) 0 + primary-for QLibrary (0x0x7ff710038888) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7ff70fd69a80) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7ff70fd69c60) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7ff710038a28) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7ff70fd69c00) 0 + primary-for QPluginLoader (0x0x7ff710038a28) + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7ff70fd69cc0) 0 + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7ff70fd69ea0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7ff710038af8) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7ff70fd69e40) 0 + primary-for QAbstractState (0x0x7ff710038af8) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7ff70fd69f60) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7ff710038b60) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7ff70fd69f00) 0 + primary-for QAbstractTransition (0x0x7ff710038b60) + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7ff70febb060) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7ff710038bc8) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7ff710038c30) 0 + primary-for QEventTransition (0x0x7ff710038bc8) + QObject (0x0x7ff70febb000) 0 + primary-for QAbstractTransition (0x0x7ff710038c30) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7ff70febb120) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7ff710038c98) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7ff710038d00) 0 + primary-for QFinalState (0x0x7ff710038c98) + QObject (0x0x7ff70febb0c0) 0 + primary-for QAbstractState (0x0x7ff710038d00) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7ff70febb1e0) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7ff710038d68) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7ff710038dd0) 0 + primary-for QHistoryState (0x0x7ff710038d68) + QObject (0x0x7ff70febb180) 0 + primary-for QAbstractState (0x0x7ff710038dd0) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7ff70febb2a0) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7ff710038e38) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7ff710038ea0) 0 + primary-for QSignalTransition (0x0x7ff710038e38) + QObject (0x0x7ff70febb240) 0 + primary-for QAbstractTransition (0x0x7ff710038ea0) + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7ff70febb360) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7ff710038f08) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7ff710038f70) 0 + primary-for QState (0x0x7ff710038f08) + QObject (0x0x7ff70febb300) 0 + primary-for QAbstractState (0x0x7ff710038f70) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7ff70febb480) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7ff70ff22138) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7ff70febb4e0) 0 + primary-for QStateMachine::SignalEvent (0x0x7ff70ff22138) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7ff70ff221a0) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7ff70febb540) 0 + primary-for QStateMachine::WrappedEvent (0x0x7ff70ff221a0) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7ff70ff22000) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7ff70ff22068) 0 + primary-for QStateMachine (0x0x7ff70ff22000) + QAbstractState (0x0x7ff70ff220d0) 0 + primary-for QState (0x0x7ff70ff22068) + QObject (0x0x7ff70febb420) 0 + primary-for QAbstractState (0x0x7ff70ff220d0) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7ff70ff22208) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7ff70febb5a0) 0 nearly-empty + primary-for QException (0x0x7ff70ff22208) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7ff70ff22270) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7ff70ff222d8) 0 nearly-empty + primary-for QUnhandledException (0x0x7ff70ff22270) + std::exception (0x0x7ff70febb600) 0 nearly-empty + primary-for QException (0x0x7ff70ff222d8) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7ff70febb660) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7ff70febb720) 0 + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7ff70febb780) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7ff70febb7e0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7ff70ff22410) 0 + QBasicMutex (0x0x7ff70febba20) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7ff70febba80) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7ff70febbb40) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7ff70febbba0) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7ff70febbd20) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7ff70febbde0) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7ff70fc9f180) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 0u +48 0u +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7ff70ff22c98) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7ff70fc9f120) 0 + primary-for QFutureWatcherBase (0x0x7ff70ff22c98) + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7ff70fc9f2a0) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7ff70fc9f540) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7ff70fc9f5a0) 0 + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7ff70fc9f600) 0 + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7ff70fc9f6c0) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7ff70fd07270) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7ff70fc9f660) 0 + primary-for QThread (0x0x7ff70fd07270) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7ff70fc9f780) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7ff70fd072d8) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7ff70fc9f720) 0 + primary-for QThreadPool (0x0x7ff70fd072d8) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7ff70fc9f7e0) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7ff70fc9f8a0) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7ff70fc9fd80) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7ff70fa64000) 0 + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7ff70fa64240) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7ff70fa641e0) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7ff70fa643c0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7ff70fa64480) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7ff70fb2e240) 0 + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7ff70fb2e420) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7ff70fb2e480) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7ff70fb2e4e0) 0 + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7ff70fb2e540) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7ff70fb2e6c0) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7ff70fb2e840) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7ff70fb2e9c0) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7ff70fb2eb40) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7ff70f8a3300) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7ff70f8a3480) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7ff70f8a3600) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7ff70f8a36c0) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7ff70f8a3900) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7ff70f8a3b40) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7ff70f8a3cc0) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7ff70f8a3e40) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7ff70f72c2a0) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7ff70f72c480) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7ff70f72c840) 0 empty + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7ff70f4102a0) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7ff70f410480) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7ff70f4410d0) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7ff70f410420) 0 + primary-for QTimeLine (0x0x7ff70f4410d0) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7ff70f410540) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7ff70f4104e0) 0 + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7ff70f4108a0) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7ff70f410840) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7ff70f53e660) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7ff70f20d360) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7ff70f20b8f0) 0 + QVector (0x0x7ff70f20d600) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7ff70f20d660) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7ff70f20d7e0) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7ff70f20d960) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7ff70f20dae0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7ff70f20db40) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7ff70f20dc60) 0 + +Class QGeoAddress + size=8 align=8 + base size=8 base align=8 +QGeoAddress (0x0x7ff70f20dd80) 0 + +Class QGeoCoordinate + size=8 align=8 + base size=8 base align=8 +QGeoCoordinate (0x0x7ff70f32b0c0) 0 + +Class QGeoShape + size=8 align=8 + base size=8 base align=8 +QGeoShape (0x0x7ff70f32b3c0) 0 + +Class QGeoAreaMonitorInfo + size=8 align=8 + base size=8 base align=8 +QGeoAreaMonitorInfo (0x0x7ff70f32b6c0) 0 + +Class QGeoPositionInfo + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfo (0x0x7ff70f32b780) 0 + +Class QGeoPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoPositionInfoSource::QPrivateSignal (0x0x7ff70f32b840) 0 empty + +Vtable for QGeoPositionInfoSource +QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QGeoPositionInfoSource) +16 (int (*)(...))QGeoPositionInfoSource::metaObject +24 (int (*)(...))QGeoPositionInfoSource::qt_metacast +32 (int (*)(...))QGeoPositionInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoPositionInfoSource (0x0x7ff70f20bf70) 0 + vptr=((& QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource) + 16u) + QObject (0x0x7ff70f32b7e0) 0 + primary-for QGeoPositionInfoSource (0x0x7ff70f20bf70) + +Class QGeoAreaMonitorSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoAreaMonitorSource::QPrivateSignal (0x0x7ff70f32ba20) 0 empty + +Vtable for QGeoAreaMonitorSource +QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QGeoAreaMonitorSource) +16 (int (*)(...))QGeoAreaMonitorSource::metaObject +24 (int (*)(...))QGeoAreaMonitorSource::qt_metacast +32 (int (*)(...))QGeoAreaMonitorSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoAreaMonitorSource::setPositionInfoSource +120 (int (*)(...))QGeoAreaMonitorSource::positionInfoSource +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoAreaMonitorSource + size=24 align=8 + base size=24 base align=8 +QGeoAreaMonitorSource (0x0x7ff70f20bb60) 0 + vptr=((& QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource) + 16u) + QObject (0x0x7ff70f32b9c0) 0 + primary-for QGeoAreaMonitorSource (0x0x7ff70f20bb60) + +Class QGeoCircle + size=8 align=8 + base size=8 base align=8 +QGeoCircle (0x0x7ff70f20bc98) 0 + QGeoShape (0x0x7ff70f32ba80) 0 + +Class QGeoLocation + size=8 align=8 + base size=8 base align=8 +QGeoLocation (0x0x7ff70f32bd20) 0 + +Class QGeoSatelliteInfo + size=8 align=8 + base size=8 base align=8 +QGeoSatelliteInfo (0x0x7ff70f004060) 0 + +Class QGeoSatelliteInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoSatelliteInfoSource::QPrivateSignal (0x0x7ff70f004120) 0 empty + +Vtable for QGeoSatelliteInfoSource +QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QGeoSatelliteInfoSource) +16 (int (*)(...))QGeoSatelliteInfoSource::metaObject +24 (int (*)(...))QGeoSatelliteInfoSource::qt_metacast +32 (int (*)(...))QGeoSatelliteInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoSatelliteInfoSource::setUpdateInterval +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual + +Class QGeoSatelliteInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoSatelliteInfoSource (0x0x7ff70effc068) 0 + vptr=((& QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource) + 16u) + QObject (0x0x7ff70f0040c0) 0 + primary-for QGeoSatelliteInfoSource (0x0x7ff70effc068) + +Vtable for QGeoPositionInfoSourceFactory +QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI29QGeoPositionInfoSourceFactory) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactory + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactory (0x0x7ff70f0041e0) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory) + 16u) + +Class QGeoRectangle + size=8 align=8 + base size=8 base align=8 +QGeoRectangle (0x0x7ff70effc0d0) 0 + QGeoShape (0x0x7ff70f0042a0) 0 + +Class QNmeaPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNmeaPositionInfoSource::QPrivateSignal (0x0x7ff70f0046c0) 0 empty + +Vtable for QNmeaPositionInfoSource +QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource: 24u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QNmeaPositionInfoSource) +16 (int (*)(...))QNmeaPositionInfoSource::metaObject +24 (int (*)(...))QNmeaPositionInfoSource::qt_metacast +32 (int (*)(...))QNmeaPositionInfoSource::qt_metacall +40 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +48 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QNmeaPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))QNmeaPositionInfoSource::lastKnownPosition +136 (int (*)(...))QNmeaPositionInfoSource::supportedPositioningMethods +144 (int (*)(...))QNmeaPositionInfoSource::minimumUpdateInterval +152 (int (*)(...))QNmeaPositionInfoSource::error +160 (int (*)(...))QNmeaPositionInfoSource::startUpdates +168 (int (*)(...))QNmeaPositionInfoSource::stopUpdates +176 (int (*)(...))QNmeaPositionInfoSource::requestUpdate +184 (int (*)(...))QNmeaPositionInfoSource::parsePosInfoFromNmeaData + +Class QNmeaPositionInfoSource + size=32 align=8 + base size=32 base align=8 +QNmeaPositionInfoSource (0x0x7ff70effc270) 0 + vptr=((& QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource) + 16u) + QGeoPositionInfoSource (0x0x7ff70effc2d8) 0 + primary-for QNmeaPositionInfoSource (0x0x7ff70effc270) + QObject (0x0x7ff70f004660) 0 + primary-for QGeoPositionInfoSource (0x0x7ff70effc2d8) + diff --git a/tests/auto/bic/data/QtPositioning.5.8.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtPositioning.5.8.0.linux-gcc-amd64.txt new file mode 100644 index 0000000..9c9d1d8 --- /dev/null +++ b/tests/auto/bic/data/QtPositioning.5.8.0.linux-gcc-amd64.txt @@ -0,0 +1,4425 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7fe59698d300) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7fe5969d5a80) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7fe5969d5cc0) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7fe5969d5f00) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7fe596a03180) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7fe596a03300) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7fe596a036c0) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7fe59468fe40) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7fe59468ff00) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7fe5946be2a0) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7fe5946be360) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7fe5946be420) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7fe5946be4e0) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7fe5946be780) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7fe5946be960) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7fe5946bede0) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7fe5946bee40) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7fe594775ae0) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7fe594775b40) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7fe594666a90) 0 empty + std::input_iterator_tag (0x0x7fe594775ba0) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7fe594666af8) 0 empty + std::forward_iterator_tag (0x0x7fe594666b60) 0 empty + std::input_iterator_tag (0x0x7fe594775c00) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7fe594666bc8) 0 empty + std::bidirectional_iterator_tag (0x0x7fe594666c30) 0 empty + std::forward_iterator_tag (0x0x7fe594666c98) 0 empty + std::input_iterator_tag (0x0x7fe594775c60) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7fe5947b1900) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7fe5947b1960) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7fe5947b19c0) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7fe5947b1a20) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7fe5947b1a80) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7fe59448c5a0) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7fe59448c7e0) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7fe59448c8a0) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7fe59448c900) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7fe59448c9c0) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7fe59448ca20) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7fe59448cea0) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7fe59448cf00) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7fe59448cf60) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7fe5947e9208) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7fe5945ce000) 0 nearly-empty + primary-for std::bad_exception (0x0x7fe5947e9208) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7fe5945ce060) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7fe5945ce0c0) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16u) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7fe5947e9410) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7fe5945ce4e0) 0 nearly-empty + primary-for std::bad_alloc (0x0x7fe5947e9410) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7fe5947e9478) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16u) + std::bad_alloc (0x0x7fe5947e94e0) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7fe5947e9478) + std::exception (0x0x7fe5945ce540) 0 nearly-empty + primary-for std::bad_alloc (0x0x7fe5947e94e0) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7fe5945ce5a0) 0 empty + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7fe5942a31e0) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7fe5942a3ea0) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7fe5942a3f00) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7fe5940e4de0) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7fe5940e4e40) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7fe5940e4f00) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7fe5940e4f60) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7fe59416a000) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7fe59416a060) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7fe59416a180) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7fe59416a1e0) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7fe59416a600) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7fe59416a660) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7fe593fa1e40) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7fe593fa1ea0) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7fe593c77e40) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7fe593e16c60) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7fe593ade0d0) 0 + std::iterator (0x0x7fe593e16d20) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7fe593ade138) 0 + std::_Bit_iterator_base (0x0x7fe593ade1a0) 0 + std::iterator (0x0x7fe593e16d80) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7fe593ade208) 0 + std::_Bit_iterator_base (0x0x7fe593ade270) 0 + std::iterator (0x0x7fe593e16de0) 0 empty + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7fe593c02c00) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7fe5939359c0) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7fe593935960) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7fe5936be960) 0 + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7fe59228c420) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7fe59228c480) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7fe59234a6c0) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7fe59234a720) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7fe59234a780) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7fe5923a1240) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7fe5923a1540) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7fe5923a1ae0) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7fe5923a0680) 0 + std::__atomic_flag_base (0x0x7fe5923a1b40) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7fe5923a0dd0) 0 + QAtomicInteger (0x0x7fe5923a0e38) 0 + QBasicAtomicInteger (0x0x7fe591f412a0) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7fe591d5eb40) 0 empty + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7fe591b94ba0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7fe591b5f270) 0 + QGenericArgument (0x0x7fe591b94c00) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7fe591b94d80) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7fe591b94e40) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7fe59186eea0) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7fe59186ef00) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7fe5919163c0) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7fe591916480) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7fe5919168a0) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7fe591916900) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7fe591916960) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7fe5919169c0) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7fe591916a20) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7fe591916de0) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7fe591992820) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16u) + std::exception (0x0x7fe591916ea0) 0 nearly-empty + primary-for std::logic_error (0x0x7fe591992820) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7fe591992888) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16u) + std::logic_error (0x0x7fe5919928f0) 0 + primary-for std::domain_error (0x0x7fe591992888) + std::exception (0x0x7fe591916f00) 0 nearly-empty + primary-for std::logic_error (0x0x7fe5919928f0) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7fe591992958) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16u) + std::logic_error (0x0x7fe5919929c0) 0 + primary-for std::invalid_argument (0x0x7fe591992958) + std::exception (0x0x7fe591916f60) 0 nearly-empty + primary-for std::logic_error (0x0x7fe5919929c0) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7fe591992a28) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16u) + std::logic_error (0x0x7fe591992a90) 0 + primary-for std::length_error (0x0x7fe591992a28) + std::exception (0x0x7fe591a38000) 0 nearly-empty + primary-for std::logic_error (0x0x7fe591992a90) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7fe591992af8) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16u) + std::logic_error (0x0x7fe591992b60) 0 + primary-for std::out_of_range (0x0x7fe591992af8) + std::exception (0x0x7fe591a38060) 0 nearly-empty + primary-for std::logic_error (0x0x7fe591992b60) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7fe591992bc8) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16u) + std::exception (0x0x7fe591a380c0) 0 nearly-empty + primary-for std::runtime_error (0x0x7fe591992bc8) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7fe591992c30) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16u) + std::runtime_error (0x0x7fe591992c98) 0 + primary-for std::range_error (0x0x7fe591992c30) + std::exception (0x0x7fe591a38120) 0 nearly-empty + primary-for std::runtime_error (0x0x7fe591992c98) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7fe591992d00) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16u) + std::runtime_error (0x0x7fe591992d68) 0 + primary-for std::overflow_error (0x0x7fe591992d00) + std::exception (0x0x7fe591a38180) 0 nearly-empty + primary-for std::runtime_error (0x0x7fe591992d68) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7fe591992dd0) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16u) + std::runtime_error (0x0x7fe591992e38) 0 + primary-for std::underflow_error (0x0x7fe591992dd0) + std::exception (0x0x7fe591a381e0) 0 nearly-empty + primary-for std::runtime_error (0x0x7fe591992e38) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7fe591a38360) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16u) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7fe591a385a0) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7fe591a38720) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7fe591678270) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16u) + std::runtime_error (0x0x7fe5916782d8) 0 + primary-for std::system_error (0x0x7fe591678270) + std::exception (0x0x7fe591a38960) 0 nearly-empty + primary-for std::runtime_error (0x0x7fe5916782d8) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7fe591678ea0) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16u) + std::system_error (0x0x7fe591678f08) 0 + primary-for std::ios_base::failure (0x0x7fe591678ea0) + std::runtime_error (0x0x7fe591678f70) 0 + primary-for std::system_error (0x0x7fe591678f08) + std::exception (0x0x7fe591a38c60) 0 nearly-empty + primary-for std::runtime_error (0x0x7fe591678f70) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7fe591a38cc0) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7fe591a38d20) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7fe591a38d80) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7fe591a38c00) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7fe591785540) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7fe591785c00) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7fe59133e888 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7fe59133e958 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7fe59133ed00 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7fe59133edd0 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7fe5913294e0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7fe591329540) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7fe5910b5960) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7fe5910b5cc0) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7fe5911b20c0) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7fe5911b2180) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7fe5911b2120) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7fe590f8a120) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7fe590f8af60) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7fe590d08660) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7fe590d086c0) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7fe590d08720) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7fe590d08ae0) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7fe590d08b40) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7fe590d7e340) 0 empty + QListData::NotIndirectLayout (0x0x7fe590d08ba0) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7fe590af8af0) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7fe590d08c00) 0 empty + QListData::NotIndirectLayout (0x0x7fe590d08c60) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7fe590d7e3a8) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7fe590d08cc0) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7fe590d08d20) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7fe590d08a80) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7fe590b6d900) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7fe5908a5ba0) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7fe5908a5b40) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7fe5908a4d68) 0 + QList (0x0x7fe5908a4dd0) 0 + QListSpecialMethods (0x0x7fe5908a5d80) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7fe590920240) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7fe590920660) 0 + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7fe590920cc0) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7fe590920e40) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7fe590920f00) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7fe59091fe38) 0 + std::__uses_alloc_base (0x0x7fe590920ea0) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7fe590755f60) 0 empty + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7fe5904541e0) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7fe5904542a0) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7fe5904543c0) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7fe590454540) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7fe590454900) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7fe590454a20) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7fe59060f3c0) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7fe59060f900) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7fe59060fcc0) 0 + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7fe5903cfd80) 0 + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7fe5903cff00) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7fe590042120) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7fe5900420c0) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7fe5900426c0) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7fe590042720) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7fe5900427e0) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7fe5902abdd0) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7fe590042780) 0 + primary-for QAbstractAnimation (0x0x7fe5902abdd0) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7fe5900428a0) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7fe5902abe38) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7fe590042840) 0 + primary-for QAnimationDriver (0x0x7fe5902abe38) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7fe590042960) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7fe5902abea0) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7fe590042900) 0 + primary-for QEventLoop (0x0x7fe5902abea0) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7fe590042ae0) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7fe590042ba0) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7fe590042c00) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7fe5902ab9c0) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7fe590042b40) 0 + primary-for QAbstractEventDispatcher (0x0x7fe5902ab9c0) + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7fe590042c60) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7fe590042ea0) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7fe5901c62a0) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7fe5901c6240) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7fe5901c6300) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7fe5901c6ea0) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7fe5901c6f60) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7fe5901c6f00) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7fe58ffa9000) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7fe5901c6e40) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7fe58fc37480) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7fe58fc377e0) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7fe58fc37780) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7fe58fc378a0) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7fe58fc37840) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7fe58fa69300) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7fe58fa69600) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7fe58fb44660) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7fe58fb43888) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7fe58fb44600) 0 + primary-for QAbstractItemModel (0x0x7fe58fb43888) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7fe58fb449c0) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractTableModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7fe58fb43a90) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7fe58fb43af8) 0 + primary-for QAbstractTableModel (0x0x7fe58fb43a90) + QObject (0x0x7fe58fb44960) 0 + primary-for QAbstractItemModel (0x0x7fe58fb43af8) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7fe58fb44a80) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractListModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7fe58fb43b60) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7fe58fb43bc8) 0 + primary-for QAbstractListModel (0x0x7fe58fb43b60) + QObject (0x0x7fe58fb44a20) 0 + primary-for QAbstractItemModel (0x0x7fe58fb43bc8) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7fe58fb44d20) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7fe58fb44de0) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7fe58fb43d00) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7fe58fb43d68) 0 + primary-for QAbstractProxyModel (0x0x7fe58fb43d00) + QObject (0x0x7fe58fb44d80) 0 + primary-for QAbstractItemModel (0x0x7fe58fb43d68) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7fe58fb44ea0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7fe58fb43dd0) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7fe58fb44e40) 0 + primary-for QAbstractState (0x0x7fe58fb43dd0) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7fe58fb44f60) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7fe58fb43e38) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7fe58fb44f00) 0 + primary-for QAbstractTransition (0x0x7fe58fb43e38) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7fe58f89d060) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7fe58fb43ea0) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7fe58fb43f08) 0 + primary-for QAnimationGroup (0x0x7fe58fb43ea0) + QObject (0x0x7fe58f89d000) 0 + primary-for QAbstractAnimation (0x0x7fe58fb43f08) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7fe58f89d540) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7fe58f89d840) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7fe58f89da80) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7fe58f89de40) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7fe58f8caf08) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7fe58f89dde0) 0 + primary-for QIODevice (0x0x7fe58f8caf08) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7fe58f9ae060) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7fe58f98a068) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7fe58f98a0d0) 0 + primary-for QBuffer (0x0x7fe58f98a068) + QObject (0x0x7fe58f9ae000) 0 + primary-for QIODevice (0x0x7fe58f98a0d0) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7fe58f9ae120) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7fe58f9ae0c0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7fe58f9ae2a0) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7fe58f9ae480) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7fe58f9ae900) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7fe58f9ae9c0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7fe58f76ba80) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7fe58f76bf00) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7fe58f7a2208) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7fe58f76bf60) 0 + primary-for QTimerEvent (0x0x7fe58f7a2208) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7fe58f7a2270) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7fe58f7e9000) 0 + primary-for QChildEvent (0x0x7fe58f7a2270) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7fe58f7a23a8) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7fe58f7e91e0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7fe58f7a23a8) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7fe58f7a2410) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7fe58f7e9240) 0 + primary-for QDeferredDeleteEvent (0x0x7fe58f7a2410) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7fe58f7e9300) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7fe58f7a2478) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7fe58f7e92a0) 0 + primary-for QCoreApplication (0x0x7fe58f7a2478) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7fe58f7e9360) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7fe58f7e93c0) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7fe58f7e9660) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7fe58f7e96c0) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7fe58f7e9780) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7fe58f7e9960) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7fe58f7e9c60) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7fe58f4fd180) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7fe58f4fd1e0) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7fe58f4fd120) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7fe58f5ae000) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7fe58f2223c0) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7fe58f368240) 0 empty + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7fe58f3682a0) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7fe58f0a9120) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7fe58f0a9360) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7fe58f0a95a0) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7fe58f0a9720) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7fe58f0a9ba0) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7fe58f0a9b40) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7fe58eef1de0) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7fe58eef1ea0) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7fe58eef1f60) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7fe58ef03b60) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7fe58ef03bc8) 0 + primary-for QFileDevice (0x0x7fe58ef03b60) + QObject (0x0x7fe58eef1f00) 0 + primary-for QIODevice (0x0x7fe58ef03bc8) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7fe58efb1180) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7fe58ef03d00) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7fe58ef03d68) 0 + primary-for QFile (0x0x7fe58ef03d00) + QIODevice (0x0x7fe58ef03dd0) 0 + primary-for QFileDevice (0x0x7fe58ef03d68) + QObject (0x0x7fe58efb1120) 0 + primary-for QIODevice (0x0x7fe58ef03dd0) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7fe58efb1300) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7fe58efb1780) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7fe58efb1d20) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7fe58efb1f00) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7fe58ed8d1e0) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7fe58ed7cbc8) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7fe58ed7cc30) 0 + primary-for QEventTransition (0x0x7fe58ed7cbc8) + QObject (0x0x7fe58ed8d180) 0 + primary-for QAbstractTransition (0x0x7fe58ed7cc30) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7fe58ed7cc98) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7fe58ed8d240) 0 nearly-empty + primary-for QException (0x0x7fe58ed7cc98) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7fe58ed7cd00) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7fe58ed7cd68) 0 nearly-empty + primary-for QUnhandledException (0x0x7fe58ed7cd00) + std::exception (0x0x7fe58ed8d2a0) 0 nearly-empty + primary-for QException (0x0x7fe58ed7cd68) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7fe58ed8d300) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7fe58ed8d3c0) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7fe58ed8d420) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7fe58ed8d540) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7fe58ed7cdd0) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7fe58ed8d4e0) 0 + primary-for QFileSelector (0x0x7fe58ed7cdd0) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7fe58ed8d600) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7fe58ed7ce38) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7fe58ed8d5a0) 0 + primary-for QFileSystemWatcher (0x0x7fe58ed7ce38) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7fe58ed8d6c0) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7fe58ed7cea0) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7fe58ed7cf08) 0 + primary-for QFinalState (0x0x7fe58ed7cea0) + QObject (0x0x7fe58ed8d660) 0 + primary-for QAbstractState (0x0x7fe58ed7cf08) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7fe58ed8d720) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7fe58ed8d780) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7fe58ea54068) 0 + QBasicMutex (0x0x7fe58ed8d9c0) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7fe58ed8dd80) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7fe58ed8de40) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7fe58ed8dea0) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7fe58eaf7060) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7fe58eaf7120) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7fe58eaf7480) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 0u +48 0u +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7fe58ea54c30) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7fe58eaf7420) 0 + primary-for QFutureWatcherBase (0x0x7fe58ea54c30) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7fe58eaf7600) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7fe58e7db068) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7fe58e7db0d0) 0 + primary-for QHistoryState (0x0x7fe58e7db068) + QObject (0x0x7fe58eaf75a0) 0 + primary-for QAbstractState (0x0x7fe58e7db0d0) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7fe58eaf76c0) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7fe58e7db138) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7fe58e7db1a0) 0 + primary-for QIdentityProxyModel (0x0x7fe58e7db138) + QAbstractItemModel (0x0x7fe58e7db208) 0 + primary-for QAbstractProxyModel (0x0x7fe58e7db1a0) + QObject (0x0x7fe58eaf7660) 0 + primary-for QAbstractItemModel (0x0x7fe58e7db208) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7fe58eaf7720) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7fe58eaf7ae0) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7fe58e7db548) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7fe58eaf7a80) 0 + primary-for QItemSelectionModel (0x0x7fe58e7db548) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7fe58e7db750) 0 + QList (0x0x7fe58e7db7b8) 0 + QListSpecialMethods (0x0x7fe58eaf7d80) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7fe58e8c8300) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7fe58e8c8540) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7fe58e8c8600) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7fe58e8c8660) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7fe58e8c8720) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7fe58e8c8780) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7fe58e8c86c0) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7fe58e8c8840) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7fe58e8c88a0) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7fe58e8c8960) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7fe58e8c89c0) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7fe58e8c8900) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7fe58e8c8ba0) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7fe58e7dbbc8) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7fe58e8c8b40) 0 + primary-for QLibrary (0x0x7fe58e7dbbc8) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7fe58e8c8d80) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7fe58e8c8d20) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7fe58e6f5b40) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7fe58e6f5ba0) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7fe58e6f5ea0) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7fe58e7931e0) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7fe58e7934e0) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7fe58e7937e0) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7fe58e793f60) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7fe58e4d6120) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7fe58e4d60c0) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7fe58e4d62a0) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7fe58e4d65a0) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7fe58e4d6900) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7fe58e4d6960) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7fe58e4d6c60) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7fe58e217000) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7fe58e217060) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7fe58e2173c0) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7fe58e7c58f0) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7fe58e217360) 0 + primary-for QMimeData (0x0x7fe58e7c58f0) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7fe58e217420) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7fe58e217780) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7fe58e217840) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7fe58e7c5a90) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7fe58e2177e0) 0 + primary-for QObjectCleanupHandler (0x0x7fe58e7c5a90) + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7fe58e217900) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7fe58e7c5af8) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7fe58e7c5b60) 0 + primary-for QParallelAnimationGroup (0x0x7fe58e7c5af8) + QAbstractAnimation (0x0x7fe58e7c5bc8) 0 + primary-for QAnimationGroup (0x0x7fe58e7c5b60) + QObject (0x0x7fe58e2178a0) 0 + primary-for QAbstractAnimation (0x0x7fe58e7c5bc8) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7fe58e2179c0) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7fe58e7c5c30) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7fe58e7c5c98) 0 + primary-for QPauseAnimation (0x0x7fe58e7c5c30) + QObject (0x0x7fe58e217960) 0 + primary-for QAbstractAnimation (0x0x7fe58e7c5c98) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7fe58e217ba0) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7fe58e217f00) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7fe58e7c5e38) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7fe58e217ea0) 0 + primary-for QPluginLoader (0x0x7fe58e7c5e38) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7fe58e217f60) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16u) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7fe58e7c5ea0) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16u) + std::exception (0x0x7fe58e2cb000) 0 nearly-empty + primary-for std::bad_cast (0x0x7fe58e7c5ea0) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7fe58e7c5f08) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16u) + std::exception (0x0x7fe58e2cb060) 0 nearly-empty + primary-for std::bad_typeid (0x0x7fe58e7c5f08) + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7fe58e03e1a0) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16u) + std::exception (0x0x7fe58e04f120) 0 nearly-empty + primary-for std::bad_function_call (0x0x7fe58e03e1a0) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7fe58e04f1e0) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7fe58e04f240) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7fe58e04f360) 0 + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7fe58e04f840) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7fe58e04fc00) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7fe58e03ea90) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7fe58e03eaf8) 0 + primary-for QProcess (0x0x7fe58e03ea90) + QObject (0x0x7fe58e04fba0) 0 + primary-for QIODevice (0x0x7fe58e03eaf8) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7fe58e04fcc0) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7fe58e03eb60) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7fe58e03ebc8) 0 + primary-for QVariantAnimation (0x0x7fe58e03eb60) + QObject (0x0x7fe58e04fc60) 0 + primary-for QAbstractAnimation (0x0x7fe58e03ebc8) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7fe58e04fd80) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7fe58e03ec98) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7fe58e03ed00) 0 + primary-for QPropertyAnimation (0x0x7fe58e03ec98) + QAbstractAnimation (0x0x7fe58e03ed68) 0 + primary-for QVariantAnimation (0x0x7fe58e03ed00) + QObject (0x0x7fe58e04fd20) 0 + primary-for QAbstractAnimation (0x0x7fe58e03ed68) + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7fe58e04fe40) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7fe58e199120) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7fe58e199180) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7fe58e1991e0) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7fe58e1995a0) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7fe58e199960) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7fe58e199c60) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7fe58e199f60) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7fe58df99540) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7fe58df998a0) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7fe58df99c00) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7fe58df99d80) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7fe58ddead68) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7fe58ddeadd0) 0 + primary-for QSaveFile (0x0x7fe58ddead68) + QIODevice (0x0x7fe58ddeae38) 0 + primary-for QFileDevice (0x0x7fe58ddeadd0) + QObject (0x0x7fe58df99d20) 0 + primary-for QIODevice (0x0x7fe58ddeae38) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7fe58df99e40) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7fe58df99f00) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7fe58ddeaea0) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7fe58ddeaf08) 0 + primary-for QSequentialAnimationGroup (0x0x7fe58ddeaea0) + QAbstractAnimation (0x0x7fe58ddeaf70) 0 + primary-for QAnimationGroup (0x0x7fe58ddeaf08) + QObject (0x0x7fe58df99ea0) 0 + primary-for QAbstractAnimation (0x0x7fe58ddeaf70) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7fe58dc7f000) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7fe58dc7b000) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7fe58df99f60) 0 + primary-for QSettings (0x0x7fe58dc7b000) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7fe58dc7f0c0) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7fe58dc7b068) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7fe58dc7f060) 0 + primary-for QSharedMemory (0x0x7fe58dc7b068) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7fe58dc7f180) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7fe58dc7b0d0) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7fe58dc7f120) 0 + primary-for QSignalMapper (0x0x7fe58dc7b0d0) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7fe58dc7f240) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7fe58dc7b138) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7fe58dc7b1a0) 0 + primary-for QSignalTransition (0x0x7fe58dc7b138) + QObject (0x0x7fe58dc7f1e0) 0 + primary-for QAbstractTransition (0x0x7fe58dc7b1a0) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7fe58dc7f300) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7fe58dc7b208) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7fe58dc7f2a0) 0 + primary-for QSocketNotifier (0x0x7fe58dc7b208) + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7fe58dc7f3c0) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7fe58dc7b270) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7fe58dc7b2d8) 0 + primary-for QSortFilterProxyModel (0x0x7fe58dc7b270) + QAbstractItemModel (0x0x7fe58dc7b340) 0 + primary-for QAbstractProxyModel (0x0x7fe58dc7b2d8) + QObject (0x0x7fe58dc7f360) 0 + primary-for QAbstractItemModel (0x0x7fe58dc7b340) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7fe58dc7f5a0) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7fe58dc7f780) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7fe58dc7b4e0) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7fe58dc7b548) 0 + primary-for QState (0x0x7fe58dc7b4e0) + QObject (0x0x7fe58dc7f720) 0 + primary-for QAbstractState (0x0x7fe58dc7b548) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7fe58dc7f8a0) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7fe58dc7b6e8) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7fe58dc7f900) 0 + primary-for QStateMachine::SignalEvent (0x0x7fe58dc7b6e8) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7fe58dc7b750) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7fe58dc7f960) 0 + primary-for QStateMachine::WrappedEvent (0x0x7fe58dc7b750) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7fe58dc7b5b0) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7fe58dc7b618) 0 + primary-for QStateMachine (0x0x7fe58dc7b5b0) + QAbstractState (0x0x7fe58dc7b680) 0 + primary-for QState (0x0x7fe58dc7b618) + QObject (0x0x7fe58dc7f840) 0 + primary-for QAbstractState (0x0x7fe58dc7b680) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7fe58dc7f9c0) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7fe58dc7fe40) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7fe58d9d5900) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7fe58da30208) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7fe58da30270) 0 + primary-for QStringListModel (0x0x7fe58da30208) + QAbstractItemModel (0x0x7fe58da302d8) 0 + primary-for QAbstractListModel (0x0x7fe58da30270) + QObject (0x0x7fe58d9d58a0) 0 + primary-for QAbstractItemModel (0x0x7fe58da302d8) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7fe58d9d5960) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7fe58d9d5a20) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7fe58d9d5b40) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7fe58da30340) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7fe58da303a8) 0 + primary-for QTemporaryFile (0x0x7fe58da30340) + QFileDevice (0x0x7fe58da30410) 0 + primary-for QFile (0x0x7fe58da303a8) + QIODevice (0x0x7fe58da30478) 0 + primary-for QFileDevice (0x0x7fe58da30410) + QObject (0x0x7fe58d9d5ae0) 0 + primary-for QIODevice (0x0x7fe58da30478) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7fe58d9d5ba0) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7fe58d9d5d80) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 0u +64 0u + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7fe58d9d5d20) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7fe58d9d5f00) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7fe58d9d5f60) 0 + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7fe58db15060) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7fe58da30680) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7fe58db15000) 0 + primary-for QThread (0x0x7fe58da30680) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7fe58db15120) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7fe58da306e8) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7fe58db150c0) 0 + primary-for QThreadPool (0x0x7fe58da306e8) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7fe58db15180) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7fe58db152a0) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7fe58da30750) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7fe58db15240) 0 + primary-for QTimeLine (0x0x7fe58da30750) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7fe58db15360) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7fe58da307b8) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7fe58db15300) 0 + primary-for QTimer (0x0x7fe58da307b8) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7fe58dbaf180) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7fe58dbaf120) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7fe58dbaf7e0) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7fe58dba2958) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7fe58dbaf780) 0 + primary-for QTranslator (0x0x7fe58dba2958) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7fe58dbaf900) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7fe58d8e3f00) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7fe58d9892a0) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7fe58d9895a0) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7fe58d989600) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7fe58d626ba0) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7fe58d6661a0) 0 + QVector (0x0x7fe58d696000) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7fe58d696060) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7fe58d696360) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7fe58d696660) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7fe58d696960) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7fe58d6969c0) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7fe58d696de0) 0 + +Class QGeoAddress + size=8 align=8 + base size=8 base align=8 +QGeoAddress (0x0x7fe58d696f00) 0 + +Class QGeoCoordinate + size=8 align=8 + base size=8 base align=8 +QGeoCoordinate (0x0x7fe58d76a3c0) 0 + +Class QGeoShape + size=8 align=8 + base size=8 base align=8 +QGeoShape (0x0x7fe58d76a840) 0 + +Class QGeoAreaMonitorInfo + size=8 align=8 + base size=8 base align=8 +QGeoAreaMonitorInfo (0x0x7fe58d76acc0) 0 + +Class QGeoPositionInfo + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfo (0x0x7fe58d76ad80) 0 + +Class QGeoPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoPositionInfoSource::QPrivateSignal (0x0x7fe58d76ae40) 0 empty + +Vtable for QGeoPositionInfoSource +QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QGeoPositionInfoSource) +16 (int (*)(...))QGeoPositionInfoSource::metaObject +24 (int (*)(...))QGeoPositionInfoSource::qt_metacast +32 (int (*)(...))QGeoPositionInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoPositionInfoSource (0x0x7fe58d666ea0) 0 + vptr=((& QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource) + 16u) + QObject (0x0x7fe58d76ade0) 0 + primary-for QGeoPositionInfoSource (0x0x7fe58d666ea0) + +Class QGeoAreaMonitorSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoAreaMonitorSource::QPrivateSignal (0x0x7fe58d41e060) 0 empty + +Vtable for QGeoAreaMonitorSource +QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QGeoAreaMonitorSource) +16 (int (*)(...))QGeoAreaMonitorSource::metaObject +24 (int (*)(...))QGeoAreaMonitorSource::qt_metacast +32 (int (*)(...))QGeoAreaMonitorSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoAreaMonitorSource::setPositionInfoSource +120 (int (*)(...))QGeoAreaMonitorSource::positionInfoSource +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoAreaMonitorSource + size=24 align=8 + base size=24 base align=8 +QGeoAreaMonitorSource (0x0x7fe58d6664e0) 0 + vptr=((& QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource) + 16u) + QObject (0x0x7fe58d41e000) 0 + primary-for QGeoAreaMonitorSource (0x0x7fe58d6664e0) + +Class QGeoCircle + size=8 align=8 + base size=8 base align=8 +QGeoCircle (0x0x7fe58d6666e8) 0 + QGeoShape (0x0x7fe58d41e0c0) 0 + +Class QGeoLocation + size=8 align=8 + base size=8 base align=8 +QGeoLocation (0x0x7fe58d41e4e0) 0 + +Class QGeoSatelliteInfo + size=8 align=8 + base size=8 base align=8 +QGeoSatelliteInfo (0x0x7fe58d41e960) 0 + +Class QGeoSatelliteInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoSatelliteInfoSource::QPrivateSignal (0x0x7fe58d41ea20) 0 empty + +Vtable for QGeoSatelliteInfoSource +QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QGeoSatelliteInfoSource) +16 (int (*)(...))QGeoSatelliteInfoSource::metaObject +24 (int (*)(...))QGeoSatelliteInfoSource::qt_metacast +32 (int (*)(...))QGeoSatelliteInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoSatelliteInfoSource::setUpdateInterval +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual + +Class QGeoSatelliteInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoSatelliteInfoSource (0x0x7fe58d440208) 0 + vptr=((& QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource) + 16u) + QObject (0x0x7fe58d41e9c0) 0 + primary-for QGeoSatelliteInfoSource (0x0x7fe58d440208) + +Vtable for QGeoPositionInfoSourceFactory +QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI29QGeoPositionInfoSourceFactory) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactory + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactory (0x0x7fe58d41eae0) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory) + 16u) + +Class QGeoRectangle + size=8 align=8 + base size=8 base align=8 +QGeoRectangle (0x0x7fe58d440270) 0 + QGeoShape (0x0x7fe58d41eba0) 0 + +Class QNmeaPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNmeaPositionInfoSource::QPrivateSignal (0x0x7fe58d4d2180) 0 empty + +Vtable for QNmeaPositionInfoSource +QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource: 24u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QNmeaPositionInfoSource) +16 (int (*)(...))QNmeaPositionInfoSource::metaObject +24 (int (*)(...))QNmeaPositionInfoSource::qt_metacast +32 (int (*)(...))QNmeaPositionInfoSource::qt_metacall +40 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +48 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QNmeaPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))QNmeaPositionInfoSource::lastKnownPosition +136 (int (*)(...))QNmeaPositionInfoSource::supportedPositioningMethods +144 (int (*)(...))QNmeaPositionInfoSource::minimumUpdateInterval +152 (int (*)(...))QNmeaPositionInfoSource::error +160 (int (*)(...))QNmeaPositionInfoSource::startUpdates +168 (int (*)(...))QNmeaPositionInfoSource::stopUpdates +176 (int (*)(...))QNmeaPositionInfoSource::requestUpdate +184 (int (*)(...))QNmeaPositionInfoSource::parsePosInfoFromNmeaData + +Class QNmeaPositionInfoSource + size=32 align=8 + base size=32 base align=8 +QNmeaPositionInfoSource (0x0x7fe58d4404e0) 0 + vptr=((& QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource) + 16u) + QGeoPositionInfoSource (0x0x7fe58d440548) 0 + primary-for QNmeaPositionInfoSource (0x0x7fe58d4404e0) + QObject (0x0x7fe58d4d2120) 0 + primary-for QGeoPositionInfoSource (0x0x7fe58d440548) + diff --git a/tests/auto/bic/data/QtPositioning.5.9.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtPositioning.5.9.0.linux-gcc-amd64.txt new file mode 100644 index 0000000..db5f7e8 --- /dev/null +++ b/tests/auto/bic/data/QtPositioning.5.9.0.linux-gcc-amd64.txt @@ -0,0 +1,4446 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7fd646d253c0) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7fd646d6eb40) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7fd646d6ed80) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7fd646d9a000) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7fd646d9a240) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7fd646d9a3c0) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7fd646d9a780) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7fd644a28f00) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7fd644a56000) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7fd644a56360) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7fd644a56420) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7fd644a564e0) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7fd644a565a0) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7fd644a56840) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7fd644a56a20) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7fd644a56ea0) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7fd644a56f00) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7fd644b0eba0) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7fd644b0ec00) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7fd6449fdbc8) 0 empty + std::input_iterator_tag (0x0x7fd644b0ec60) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7fd6449fdc30) 0 empty + std::forward_iterator_tag (0x0x7fd6449fdc98) 0 empty + std::input_iterator_tag (0x0x7fd644b0ecc0) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7fd6449fdd00) 0 empty + std::bidirectional_iterator_tag (0x0x7fd6449fdd68) 0 empty + std::forward_iterator_tag (0x0x7fd6449fddd0) 0 empty + std::input_iterator_tag (0x0x7fd644b0ed20) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7fd644b3c9c0) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7fd644b3ca20) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7fd644b3ca80) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7fd644b3cae0) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7fd644b3cb40) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7fd644822660) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7fd6448228a0) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7fd644822960) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7fd6448229c0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7fd644822a80) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7fd644822ae0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7fd644822f60) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7fd6448af000) 0 + +Vtable for std::exception +std::exception::_ZTVSt9exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9exception) +16 (int (*)(...))std::exception::~exception +24 (int (*)(...))std::exception::~exception +32 (int (*)(...))std::exception::what + +Class std::exception + size=8 align=8 + base size=8 base align=8 +std::exception (0x0x7fd6448af060) 0 nearly-empty + vptr=((& std::exception::_ZTVSt9exception) + 16u) + +Vtable for std::bad_exception +std::bad_exception::_ZTVSt13bad_exception: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13bad_exception) +16 (int (*)(...))std::bad_exception::~bad_exception +24 (int (*)(...))std::bad_exception::~bad_exception +32 (int (*)(...))std::bad_exception::what + +Class std::bad_exception + size=8 align=8 + base size=8 base align=8 +std::bad_exception (0x0x7fd644b4d340) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7fd6448af0c0) 0 nearly-empty + primary-for std::bad_exception (0x0x7fd644b4d340) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7fd6448af120) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7fd6448af180) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16u) + +Vtable for std::bad_alloc +std::bad_alloc::_ZTVSt9bad_alloc: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9bad_alloc) +16 (int (*)(...))std::bad_alloc::~bad_alloc +24 (int (*)(...))std::bad_alloc::~bad_alloc +32 (int (*)(...))std::bad_alloc::what + +Class std::bad_alloc + size=8 align=8 + base size=8 base align=8 +std::bad_alloc (0x0x7fd644b4d548) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7fd6448af5a0) 0 nearly-empty + primary-for std::bad_alloc (0x0x7fd644b4d548) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7fd644b4d5b0) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16u) + std::bad_alloc (0x0x7fd644b4d618) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7fd644b4d5b0) + std::exception (0x0x7fd6448af600) 0 nearly-empty + primary-for std::bad_alloc (0x0x7fd644b4d618) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7fd6448af660) 0 empty + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7fd6446342a0) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7fd644634f60) 0 + +Vtable for __cxxabiv1::__forced_unwind +__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7fd64446f000) 0 nearly-empty + vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16u) + +Class sched_param + size=4 align=4 + base size=4 base align=4 +sched_param (0x0x7fd64446fea0) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7fd64446ff00) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7fd644501000) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7fd644501060) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7fd6445010c0) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7fd644501120) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7fd644501240) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7fd6445012a0) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7fd6445016c0) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7fd644501720) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7fd644337f00) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7fd644337f60) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7fd64400ef00) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7fd6441b0d20) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7fd6441af208) 0 + std::iterator (0x0x7fd6441b0de0) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7fd6441af270) 0 + std::_Bit_iterator_base (0x0x7fd6441af2d8) 0 + std::iterator (0x0x7fd6441b0e40) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7fd6441af340) 0 + std::_Bit_iterator_base (0x0x7fd6441af3a8) 0 + std::iterator (0x0x7fd6441b0ea0) 0 empty + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7fd643f5acc0) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7fd643ccca80) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7fd643ccca20) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7fd643a38a20) 0 + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7fd6426244e0) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7fd642624540) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7fd6426f5060) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7fd6426f50c0) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7fd6426f5120) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7fd6426f5180) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7fd6426f5420) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7fd6426f5960) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7fd642743208) 0 + std::__atomic_flag_base (0x0x7fd6426f59c0) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7fd642743958) 0 + QAtomicInteger (0x0x7fd6427439c0) 0 + QBasicAtomicInteger (0x0x7fd64231d120) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7fd642191600) 0 empty + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7fd641f87660) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7fd641f29270) 0 + QGenericArgument (0x0x7fd641f876c0) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7fd641f87840) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7fd641f87900) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7fd641c4a960) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7fd641c4a9c0) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7fd641c4ac60) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7fd641c4ad20) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7fd641d5b1e0) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7fd641d5b240) 0 + +Vtable for std::locale::facet +std::locale::facet::_ZTVNSt6locale5facetE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6locale5facetE) +16 (int (*)(...))std::locale::facet::~facet +24 (int (*)(...))std::locale::facet::~facet + +Class std::locale::facet + size=16 align=8 + base size=12 base align=8 +std::locale::facet (0x0x7fd641d5b2a0) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7fd641d5b300) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7fd641d5b360) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7fd641d5b720) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7fd641d63888) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16u) + std::exception (0x0x7fd641d5b7e0) 0 nearly-empty + primary-for std::logic_error (0x0x7fd641d63888) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7fd641d638f0) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16u) + std::logic_error (0x0x7fd641d63958) 0 + primary-for std::domain_error (0x0x7fd641d638f0) + std::exception (0x0x7fd641d5b840) 0 nearly-empty + primary-for std::logic_error (0x0x7fd641d63958) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7fd641d639c0) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16u) + std::logic_error (0x0x7fd641d63a28) 0 + primary-for std::invalid_argument (0x0x7fd641d639c0) + std::exception (0x0x7fd641d5b8a0) 0 nearly-empty + primary-for std::logic_error (0x0x7fd641d63a28) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7fd641d63a90) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16u) + std::logic_error (0x0x7fd641d63af8) 0 + primary-for std::length_error (0x0x7fd641d63a90) + std::exception (0x0x7fd641d5b900) 0 nearly-empty + primary-for std::logic_error (0x0x7fd641d63af8) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7fd641d63b60) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16u) + std::logic_error (0x0x7fd641d63bc8) 0 + primary-for std::out_of_range (0x0x7fd641d63b60) + std::exception (0x0x7fd641d5b960) 0 nearly-empty + primary-for std::logic_error (0x0x7fd641d63bc8) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7fd641d63c30) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16u) + std::exception (0x0x7fd641d5b9c0) 0 nearly-empty + primary-for std::runtime_error (0x0x7fd641d63c30) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7fd641d63c98) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16u) + std::runtime_error (0x0x7fd641d63d00) 0 + primary-for std::range_error (0x0x7fd641d63c98) + std::exception (0x0x7fd641d5ba20) 0 nearly-empty + primary-for std::runtime_error (0x0x7fd641d63d00) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7fd641d63d68) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16u) + std::runtime_error (0x0x7fd641d63dd0) 0 + primary-for std::overflow_error (0x0x7fd641d63d68) + std::exception (0x0x7fd641d5ba80) 0 nearly-empty + primary-for std::runtime_error (0x0x7fd641d63dd0) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7fd641d63e38) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16u) + std::runtime_error (0x0x7fd641d63ea0) 0 + primary-for std::underflow_error (0x0x7fd641d63e38) + std::exception (0x0x7fd641d5bae0) 0 nearly-empty + primary-for std::runtime_error (0x0x7fd641d63ea0) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7fd641d5bc60) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16u) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7fd641d5bea0) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7fd641a4b060) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7fd641a472d8) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16u) + std::runtime_error (0x0x7fd641a47340) 0 + primary-for std::system_error (0x0x7fd641a472d8) + std::exception (0x0x7fd641a4b2a0) 0 nearly-empty + primary-for std::runtime_error (0x0x7fd641a47340) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +16 (int (*)(...))std::ios_base::failure::~failure +24 (int (*)(...))std::ios_base::failure::~failure +32 (int (*)(...))std::ios_base::failure::what + +Class std::ios_base::failure + size=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7fd641a47f08) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16u) + std::system_error (0x0x7fd641a47f70) 0 + primary-for std::ios_base::failure (0x0x7fd641a47f08) + std::runtime_error (0x0x7fd641ab2000) 0 + primary-for std::system_error (0x0x7fd641a47f70) + std::exception (0x0x7fd641a4b5a0) 0 nearly-empty + primary-for std::runtime_error (0x0x7fd641ab2000) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7fd641a4b600) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7fd641a4b660) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7fd641a4b6c0) 0 empty + +Vtable for std::ios_base +std::ios_base::_ZTVSt8ios_base: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8ios_base) +16 (int (*)(...))std::ios_base::~ios_base +24 (int (*)(...))std::ios_base::~ios_base + +Class std::ios_base + size=216 align=8 + base size=216 base align=8 +std::ios_base (0x0x7fd641a4b540) 0 + vptr=((& std::ios_base::_ZTVSt8ios_base) + 16u) + +Class std::ctype_base + size=1 align=1 + base size=0 base align=1 +std::ctype_base (0x0x7fd641a4be40) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7fd641bc2540) 0 empty + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSo: 2u entries +0 ((& std::basic_ostream::_ZTVSo) + 24u) +8 ((& std::basic_ostream::_ZTVSo) + 64u) + +VTT for std::basic_ostream +std::basic_ostream::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_ostream::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSi: 2u entries +0 ((& std::basic_istream::_ZTVSi) + 24u) +8 ((& std::basic_istream::_ZTVSi) + 64u) + +VTT for std::basic_istream +std::basic_istream::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2u entries +0 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_istream::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64u) + +Construction vtable for std::basic_istream (0x0x7fd6417089c0 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7fd641708a90 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSd: 7u entries +0 ((& std::basic_iostream::_ZTVSd) + 24u) +8 ((& std::basic_iostream::_ZTCSd0_Si) + 24u) +16 ((& std::basic_iostream::_ZTCSd0_Si) + 64u) +24 ((& std::basic_iostream::_ZTCSd16_So) + 24u) +32 ((& std::basic_iostream::_ZTCSd16_So) + 64u) +40 ((& std::basic_iostream::_ZTVSd) + 104u) +48 ((& std::basic_iostream::_ZTVSd) + 64u) + +Construction vtable for std::basic_istream (0x0x7fd641708e38 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7fd641708f08 instance) in std::basic_iostream +std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0u +72 0u + +VTT for std::basic_iostream +std::basic_iostream::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7u entries +0 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24u) +8 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24u) +16 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64u) +24 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24u) +32 ((& std::basic_iostream::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64u) +40 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104u) +48 ((& std::basic_iostream::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64u) + +Class QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7fd641957de0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7fd641957e40) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7fd6414b5300) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7fd6414b5600) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7fd6414b5960) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7fd6414b5a20) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7fd6414b59c0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7fd6412e4a20) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7fd6410727e0) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7fd641072d20) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7fd641072d80) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7fd641072de0) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7fd640e3d1e0) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7fd640e3d240) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7fd641106478) 0 empty + QListData::NotIndirectLayout (0x0x7fd640e3d2a0) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7fd640ed2af0) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7fd640e3d300) 0 empty + QListData::NotIndirectLayout (0x0x7fd640e3d360) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7fd6411064e0) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7fd640e3d3c0) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7fd640e3d420) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7fd640e3d180) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7fd640bfa000) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7fd640c7e240) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7fd640c7e1e0) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7fd640c6df08) 0 + QList (0x0x7fd640c6df70) 0 + QListSpecialMethods (0x0x7fd640c7e420) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7fd640c7e840) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7fd640c7ec60) 0 + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7fd640a52300) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7fd640a52480) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7fd640a52540) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7fd640cd4888) 0 + std::__uses_alloc_base (0x0x7fd640a524e0) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7fd6407fe5a0) 0 empty + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7fd6407fe7e0) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7fd6407fe8a0) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7fd6407fe9c0) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7fd6407feb40) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7fd6407fef60) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7fd6409530c0) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7fd640953a20) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7fd640953f00) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7fd64062f2a0) 0 + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7fd6403e7180) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7fd640464660) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7fd6405b04e0) 0 empty + +Vtable for QObjectData +QObjectData::_ZTV11QObjectData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QObjectData) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))__cxa_pure_virtual + +Class QObjectData + size=48 align=8 + base size=48 base align=8 +QObjectData (0x0x7fd6405b0540) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7fd6405b0720) 0 empty + +Vtable for QObject +QObject::_ZTV7QObject: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QObject) +16 (int (*)(...))QObject::metaObject +24 (int (*)(...))QObject::qt_metacast +32 (int (*)(...))QObject::qt_metacall +40 (int (*)(...))QObject::~QObject +48 (int (*)(...))QObject::~QObject +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObject + size=16 align=8 + base size=16 base align=8 +QObject (0x0x7fd6405b06c0) 0 + vptr=((& QObject::_ZTV7QObject) + 16u) + +Vtable for QObjectUserData +QObjectUserData::_ZTV15QObjectUserData: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QObjectUserData) +16 (int (*)(...))QObjectUserData::~QObjectUserData +24 (int (*)(...))QObjectUserData::~QObjectUserData + +Class QObjectUserData + size=8 align=8 + base size=8 base align=8 +QObjectUserData (0x0x7fd6405b0e40) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7fd6405b0ea0) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7fd6405b0f60) 0 empty + +Vtable for QAbstractAnimation +QAbstractAnimation::_ZTV18QAbstractAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractAnimation) +16 (int (*)(...))QAbstractAnimation::metaObject +24 (int (*)(...))QAbstractAnimation::qt_metacast +32 (int (*)(...))QAbstractAnimation::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAbstractAnimation + size=16 align=8 + base size=16 base align=8 +QAbstractAnimation (0x0x7fd6401ae888) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7fd6405b0f00) 0 + primary-for QAbstractAnimation (0x0x7fd6401ae888) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7fd6402b2060) 0 empty + +Vtable for QAnimationDriver +QAnimationDriver::_ZTV16QAnimationDriver: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QAnimationDriver) +16 (int (*)(...))QAnimationDriver::metaObject +24 (int (*)(...))QAnimationDriver::qt_metacast +32 (int (*)(...))QAnimationDriver::qt_metacall +40 (int (*)(...))QAnimationDriver::~QAnimationDriver +48 (int (*)(...))QAnimationDriver::~QAnimationDriver +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAnimationDriver::advance +120 (int (*)(...))QAnimationDriver::elapsed +128 (int (*)(...))QAnimationDriver::start +136 (int (*)(...))QAnimationDriver::stop + +Class QAnimationDriver + size=16 align=8 + base size=16 base align=8 +QAnimationDriver (0x0x7fd6401ae8f0) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7fd6402b2000) 0 + primary-for QAnimationDriver (0x0x7fd6401ae8f0) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7fd6402b2120) 0 empty + +Vtable for QEventLoop +QEventLoop::_ZTV10QEventLoop: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QEventLoop) +16 (int (*)(...))QEventLoop::metaObject +24 (int (*)(...))QEventLoop::qt_metacast +32 (int (*)(...))QEventLoop::qt_metacall +40 (int (*)(...))QEventLoop::~QEventLoop +48 (int (*)(...))QEventLoop::~QEventLoop +56 (int (*)(...))QEventLoop::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QEventLoop + size=16 align=8 + base size=16 base align=8 +QEventLoop (0x0x7fd6401ae958) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7fd6402b20c0) 0 + primary-for QEventLoop (0x0x7fd6401ae958) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7fd6402b2300) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7fd6402b23c0) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7fd6402b2420) 0 + +Vtable for QAbstractEventDispatcher +QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher) +16 (int (*)(...))QAbstractEventDispatcher::metaObject +24 (int (*)(...))QAbstractEventDispatcher::qt_metacast +32 (int (*)(...))QAbstractEventDispatcher::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual +184 (int (*)(...))__cxa_pure_virtual +192 (int (*)(...))__cxa_pure_virtual +200 (int (*)(...))__cxa_pure_virtual +208 (int (*)(...))QAbstractEventDispatcher::startingUp +216 (int (*)(...))QAbstractEventDispatcher::closingDown + +Class QAbstractEventDispatcher + size=16 align=8 + base size=16 base align=8 +QAbstractEventDispatcher (0x0x7fd6401aea90) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7fd6402b2360) 0 + primary-for QAbstractEventDispatcher (0x0x7fd6401aea90) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7fd6402b2480) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16u) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7fd6401aeaf8) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16u) + std::exception (0x0x7fd6402b24e0) 0 nearly-empty + primary-for std::bad_cast (0x0x7fd6401aeaf8) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7fd6401aeb60) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16u) + std::exception (0x0x7fd6402b2540) 0 nearly-empty + primary-for std::bad_typeid (0x0x7fd6401aeb60) + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7fd63ffc4d68) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16u) + std::exception (0x0x7fd64008d600) 0 nearly-empty + primary-for std::bad_function_call (0x0x7fd63ffc4d68) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7fd64008d6c0) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7fd64008d720) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7fd64008d840) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7fd64008dd20) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7fd64008dde0) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7fd6401881e0) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7fd640188180) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7fd640188240) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7fd640188d80) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7fd640188e40) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7fd640188de0) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7fd640188ea0) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7fd640188d20) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7fd63fc211e0) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7fd63fc214e0) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7fd63fc21480) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7fd63fc215a0) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7fd63fc21540) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7fd63fa78000) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7fd63fa782a0) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7fd63fb1b2a0) 0 empty + +Vtable for QAbstractItemModel +QAbstractItemModel::_ZTV18QAbstractItemModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractItemModel) +16 (int (*)(...))QAbstractItemModel::metaObject +24 (int (*)(...))QAbstractItemModel::qt_metacast +32 (int (*)(...))QAbstractItemModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractItemModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractItemModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractItemModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractItemModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractItemModel + size=16 align=8 + base size=16 base align=8 +QAbstractItemModel (0x0x7fd63fb0bf08) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7fd63fb1b240) 0 + primary-for QAbstractItemModel (0x0x7fd63fb0bf08) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7fd63fb1b600) 0 empty + +Vtable for QAbstractTableModel +QAbstractTableModel::_ZTV19QAbstractTableModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTableModel) +16 (int (*)(...))QAbstractTableModel::metaObject +24 (int (*)(...))QAbstractTableModel::qt_metacast +32 (int (*)(...))QAbstractTableModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractTableModel::index +120 (int (*)(...))QAbstractTableModel::parent +128 (int (*)(...))QAbstractTableModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractTableModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractTableModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractTableModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractTableModel + size=16 align=8 + base size=16 base align=8 +QAbstractTableModel (0x0x7fd63fb75138) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7fd63fb751a0) 0 + primary-for QAbstractTableModel (0x0x7fd63fb75138) + QObject (0x0x7fd63fb1b5a0) 0 + primary-for QAbstractItemModel (0x0x7fd63fb751a0) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7fd63fb1b6c0) 0 empty + +Vtable for QAbstractListModel +QAbstractListModel::_ZTV18QAbstractListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QAbstractListModel) +16 (int (*)(...))QAbstractListModel::metaObject +24 (int (*)(...))QAbstractListModel::qt_metacast +32 (int (*)(...))QAbstractListModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QAbstractListModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))QAbstractItemModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QAbstractItemModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QAbstractListModel::flags +328 (int (*)(...))QAbstractItemModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QAbstractListModel + size=16 align=8 + base size=16 base align=8 +QAbstractListModel (0x0x7fd63fb75208) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7fd63fb75270) 0 + primary-for QAbstractListModel (0x0x7fd63fb75208) + QObject (0x0x7fd63fb1b660) 0 + primary-for QAbstractItemModel (0x0x7fd63fb75270) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7fd63fb1b960) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7fd63fb1ba20) 0 empty + +Vtable for QAbstractProxyModel +QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractProxyModel) +16 (int (*)(...))QAbstractProxyModel::metaObject +24 (int (*)(...))QAbstractProxyModel::qt_metacast +32 (int (*)(...))QAbstractProxyModel::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractProxyModel::sibling +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QAbstractProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QAbstractProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QAbstractItemModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QAbstractItemModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QAbstractProxyModel::setSourceModel +392 (int (*)(...))__cxa_pure_virtual +400 (int (*)(...))__cxa_pure_virtual +408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource +416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource + +Class QAbstractProxyModel + size=16 align=8 + base size=16 base align=8 +QAbstractProxyModel (0x0x7fd63fb753a8) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7fd63fb75410) 0 + primary-for QAbstractProxyModel (0x0x7fd63fb753a8) + QObject (0x0x7fd63fb1b9c0) 0 + primary-for QAbstractItemModel (0x0x7fd63fb75410) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7fd63fb1bae0) 0 empty + +Vtable for QAbstractState +QAbstractState::_ZTV14QAbstractState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QAbstractState) +16 (int (*)(...))QAbstractState::metaObject +24 (int (*)(...))QAbstractState::qt_metacast +32 (int (*)(...))QAbstractState::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractState + size=16 align=8 + base size=16 base align=8 +QAbstractState (0x0x7fd63fb75478) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7fd63fb1ba80) 0 + primary-for QAbstractState (0x0x7fd63fb75478) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7fd63fb1bba0) 0 empty + +Vtable for QAbstractTransition +QAbstractTransition::_ZTV19QAbstractTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QAbstractTransition) +16 (int (*)(...))QAbstractTransition::metaObject +24 (int (*)(...))QAbstractTransition::qt_metacast +32 (int (*)(...))QAbstractTransition::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAbstractTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QAbstractTransition + size=16 align=8 + base size=16 base align=8 +QAbstractTransition (0x0x7fd63fb754e0) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7fd63fb1bb40) 0 + primary-for QAbstractTransition (0x0x7fd63fb754e0) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7fd63fb1bc60) 0 empty + +Vtable for QAnimationGroup +QAnimationGroup::_ZTV15QAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QAnimationGroup) +16 (int (*)(...))QAnimationGroup::metaObject +24 (int (*)(...))QAnimationGroup::qt_metacast +32 (int (*)(...))QAnimationGroup::qt_metacall +40 0u +48 0u +56 (int (*)(...))QAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QAnimationGroup + size=16 align=8 + base size=16 base align=8 +QAnimationGroup (0x0x7fd63fb75548) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7fd63fb755b0) 0 + primary-for QAnimationGroup (0x0x7fd63fb75548) + QObject (0x0x7fd63fb1bc00) 0 + primary-for QAbstractAnimation (0x0x7fd63fb755b0) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7fd63f8b3180) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7fd63f8b3420) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7fd63f8b3660) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7fd63f8b39c0) 0 empty + +Vtable for QIODevice +QIODevice::_ZTV9QIODevice: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QIODevice) +16 (int (*)(...))QIODevice::metaObject +24 (int (*)(...))QIODevice::qt_metacast +32 (int (*)(...))QIODevice::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QIODevice::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QIODevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))__cxa_pure_virtual +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))__cxa_pure_virtual + +Class QIODevice + size=16 align=8 + base size=16 base align=8 +QIODevice (0x0x7fd63f8af680) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7fd63f8b3960) 0 + primary-for QIODevice (0x0x7fd63f8af680) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7fd63f8b3c00) 0 empty + +Vtable for QBuffer +QBuffer::_ZTV7QBuffer: 30u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QBuffer) +16 (int (*)(...))QBuffer::metaObject +24 (int (*)(...))QBuffer::qt_metacast +32 (int (*)(...))QBuffer::qt_metacall +40 (int (*)(...))QBuffer::~QBuffer +48 (int (*)(...))QBuffer::~QBuffer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QBuffer::connectNotify +104 (int (*)(...))QBuffer::disconnectNotify +112 (int (*)(...))QIODevice::isSequential +120 (int (*)(...))QBuffer::open +128 (int (*)(...))QBuffer::close +136 (int (*)(...))QBuffer::pos +144 (int (*)(...))QBuffer::size +152 (int (*)(...))QBuffer::seek +160 (int (*)(...))QBuffer::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QBuffer::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QBuffer::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QBuffer::writeData + +Class QBuffer + size=16 align=8 + base size=16 base align=8 +QBuffer (0x0x7fd63f8af7b8) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7fd63f8af820) 0 + primary-for QBuffer (0x0x7fd63f8af7b8) + QObject (0x0x7fd63f8b3ba0) 0 + primary-for QIODevice (0x0x7fd63f8af820) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7fd63f8b3cc0) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7fd63f8b3c60) 0 + +Class QStaticByteArrayMatcherBase::Skiptable + size=256 align=1 + base size=256 base align=1 +QStaticByteArrayMatcherBase::Skiptable (0x0x7fd63f8b3de0) 0 + +Class QStaticByteArrayMatcherBase + size=256 align=16 + base size=256 base align=16 +QStaticByteArrayMatcherBase (0x0x7fd63f8b3d80) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7fd63f5d4000) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7fd63f5d41e0) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7fd63f5d4660) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7fd63f5d4720) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7fd63f75c720) 0 + +Vtable for QEvent +QEvent::_ZTV6QEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QEvent) +16 (int (*)(...))QEvent::~QEvent +24 (int (*)(...))QEvent::~QEvent + +Class QEvent + size=24 align=8 + base size=20 base align=8 +QEvent (0x0x7fd63f75cba0) 0 + vptr=((& QEvent::_ZTV6QEvent) + 16u) + +Vtable for QTimerEvent +QTimerEvent::_ZTV11QTimerEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTimerEvent) +16 (int (*)(...))QTimerEvent::~QTimerEvent +24 (int (*)(...))QTimerEvent::~QTimerEvent + +Class QTimerEvent + size=24 align=8 + base size=24 base align=8 +QTimerEvent (0x0x7fd63f759bc8) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7fd63f75cc00) 0 + primary-for QTimerEvent (0x0x7fd63f759bc8) + +Vtable for QChildEvent +QChildEvent::_ZTV11QChildEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QChildEvent) +16 (int (*)(...))QChildEvent::~QChildEvent +24 (int (*)(...))QChildEvent::~QChildEvent + +Class QChildEvent + size=32 align=8 + base size=32 base align=8 +QChildEvent (0x0x7fd63f759c30) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7fd63f75cc60) 0 + primary-for QChildEvent (0x0x7fd63f759c30) + +Vtable for QDynamicPropertyChangeEvent +QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI27QDynamicPropertyChangeEvent) +16 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent +24 (int (*)(...))QDynamicPropertyChangeEvent::~QDynamicPropertyChangeEvent + +Class QDynamicPropertyChangeEvent + size=32 align=8 + base size=32 base align=8 +QDynamicPropertyChangeEvent (0x0x7fd63f759c98) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7fd63f75ccc0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7fd63f759c98) + +Vtable for QDeferredDeleteEvent +QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QDeferredDeleteEvent) +16 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent +24 (int (*)(...))QDeferredDeleteEvent::~QDeferredDeleteEvent + +Class QDeferredDeleteEvent + size=24 align=8 + base size=24 base align=8 +QDeferredDeleteEvent (0x0x7fd63f759d00) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7fd63f75cd20) 0 + primary-for QDeferredDeleteEvent (0x0x7fd63f759d00) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7fd63f75cde0) 0 empty + +Vtable for QCoreApplication +QCoreApplication::_ZTV16QCoreApplication: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QCoreApplication) +16 (int (*)(...))QCoreApplication::metaObject +24 (int (*)(...))QCoreApplication::qt_metacast +32 (int (*)(...))QCoreApplication::qt_metacall +40 (int (*)(...))QCoreApplication::~QCoreApplication +48 (int (*)(...))QCoreApplication::~QCoreApplication +56 (int (*)(...))QCoreApplication::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QCoreApplication::notify +120 (int (*)(...))QCoreApplication::compressEvent + +Class QCoreApplication + size=16 align=8 + base size=16 base align=8 +QCoreApplication (0x0x7fd63f759d68) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7fd63f75cd80) 0 + primary-for QCoreApplication (0x0x7fd63f759d68) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7fd63f75ce40) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7fd63f75cea0) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7fd63f3e0180) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7fd63f3e01e0) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7fd63f3e02a0) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7fd63f3e0300) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7fd63f3e05a0) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7fd63f3e08a0) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7fd63f3e0900) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7fd63f3e0840) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7fd63f56c6c0) 0 + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7fd63f56c720) 0 + +Vtable for QTextStream +QTextStream::_ZTV11QTextStream: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTextStream) +16 (int (*)(...))QTextStream::~QTextStream +24 (int (*)(...))QTextStream::~QTextStream + +Class QTextStream + size=16 align=8 + base size=16 base align=8 +QTextStream (0x0x7fd63f2aa360) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7fd63f2aa600) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7fd63f2aa840) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7fd63f2aa9c0) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7fd63f2aae40) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7fd63f2aade0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7fd63f14f060) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7fd63f14f120) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7fd63f14f1e0) 0 empty + +Vtable for QFileDevice +QFileDevice::_ZTV11QFileDevice: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFileDevice) +16 (int (*)(...))QFileDevice::metaObject +24 (int (*)(...))QFileDevice::qt_metacast +32 (int (*)(...))QFileDevice::qt_metacall +40 (int (*)(...))QFileDevice::~QFileDevice +48 (int (*)(...))QFileDevice::~QFileDevice +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QIODevice::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFileDevice::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QFileDevice + size=16 align=8 + base size=16 base align=8 +QFileDevice (0x0x7fd63f10dd00) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7fd63f10dd68) 0 + primary-for QFileDevice (0x0x7fd63f10dd00) + QObject (0x0x7fd63f14f180) 0 + primary-for QIODevice (0x0x7fd63f10dd68) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7fd63f14f420) 0 empty + +Vtable for QFile +QFile::_ZTV5QFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI5QFile) +16 (int (*)(...))QFile::metaObject +24 (int (*)(...))QFile::qt_metacast +32 (int (*)(...))QFile::qt_metacall +40 (int (*)(...))QFile::~QFile +48 (int (*)(...))QFile::~QFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QFile + size=16 align=8 + base size=16 base align=8 +QFile (0x0x7fd63f10dea0) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7fd63f10df08) 0 + primary-for QFile (0x0x7fd63f10dea0) + QIODevice (0x0x7fd63f10df70) 0 + primary-for QFileDevice (0x0x7fd63f10df08) + QObject (0x0x7fd63f14f3c0) 0 + primary-for QIODevice (0x0x7fd63f10df70) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7fd63f14f600) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7fd63f14fa20) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7fd63ee83420) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7fd63ee83660) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7fd63eb9c8a0) 0 empty + +Vtable for QEventTransition +QEventTransition::_ZTV16QEventTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QEventTransition) +16 (int (*)(...))QEventTransition::metaObject +24 (int (*)(...))QEventTransition::qt_metacast +32 (int (*)(...))QEventTransition::qt_metacall +40 (int (*)(...))QEventTransition::~QEventTransition +48 (int (*)(...))QEventTransition::~QEventTransition +56 (int (*)(...))QEventTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QEventTransition::eventTest +120 (int (*)(...))QEventTransition::onTransition + +Class QEventTransition + size=16 align=8 + base size=16 base align=8 +QEventTransition (0x0x7fd63eba5270) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7fd63eba52d8) 0 + primary-for QEventTransition (0x0x7fd63eba5270) + QObject (0x0x7fd63eb9c840) 0 + primary-for QAbstractTransition (0x0x7fd63eba52d8) + +Vtable for QException +QException::_ZTV10QException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QException) +16 (int (*)(...))QException::~QException +24 (int (*)(...))QException::~QException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QException::raise +48 (int (*)(...))QException::clone + +Class QException + size=8 align=8 + base size=8 base align=8 +QException (0x0x7fd63eba5340) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7fd63eb9c900) 0 nearly-empty + primary-for QException (0x0x7fd63eba5340) + +Vtable for QUnhandledException +QUnhandledException::_ZTV19QUnhandledException: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QUnhandledException) +16 (int (*)(...))QUnhandledException::~QUnhandledException +24 (int (*)(...))QUnhandledException::~QUnhandledException +32 (int (*)(...))std::exception::what +40 (int (*)(...))QUnhandledException::raise +48 (int (*)(...))QUnhandledException::clone + +Class QUnhandledException + size=8 align=8 + base size=8 base align=8 +QUnhandledException (0x0x7fd63eba53a8) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7fd63eba5410) 0 nearly-empty + primary-for QUnhandledException (0x0x7fd63eba53a8) + std::exception (0x0x7fd63eb9c960) 0 nearly-empty + primary-for QException (0x0x7fd63eba5410) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7fd63eb9c9c0) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7fd63eb9ca80) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7fd63eb9cae0) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7fd63eb9cc00) 0 empty + +Vtable for QFileSelector +QFileSelector::_ZTV13QFileSelector: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QFileSelector) +16 (int (*)(...))QFileSelector::metaObject +24 (int (*)(...))QFileSelector::qt_metacast +32 (int (*)(...))QFileSelector::qt_metacall +40 (int (*)(...))QFileSelector::~QFileSelector +48 (int (*)(...))QFileSelector::~QFileSelector +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSelector + size=16 align=8 + base size=16 base align=8 +QFileSelector (0x0x7fd63eba5478) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7fd63eb9cba0) 0 + primary-for QFileSelector (0x0x7fd63eba5478) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7fd63eb9ccc0) 0 empty + +Vtable for QFileSystemWatcher +QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFileSystemWatcher) +16 (int (*)(...))QFileSystemWatcher::metaObject +24 (int (*)(...))QFileSystemWatcher::qt_metacast +32 (int (*)(...))QFileSystemWatcher::qt_metacall +40 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +48 (int (*)(...))QFileSystemWatcher::~QFileSystemWatcher +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QFileSystemWatcher + size=16 align=8 + base size=16 base align=8 +QFileSystemWatcher (0x0x7fd63eba54e0) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7fd63eb9cc60) 0 + primary-for QFileSystemWatcher (0x0x7fd63eba54e0) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7fd63eb9cd80) 0 empty + +Vtable for QFinalState +QFinalState::_ZTV11QFinalState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QFinalState) +16 (int (*)(...))QFinalState::metaObject +24 (int (*)(...))QFinalState::qt_metacast +32 (int (*)(...))QFinalState::qt_metacall +40 (int (*)(...))QFinalState::~QFinalState +48 (int (*)(...))QFinalState::~QFinalState +56 (int (*)(...))QFinalState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFinalState::onEntry +120 (int (*)(...))QFinalState::onExit + +Class QFinalState + size=16 align=8 + base size=16 base align=8 +QFinalState (0x0x7fd63eba5548) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7fd63eba55b0) 0 + primary-for QFinalState (0x0x7fd63eba5548) + QObject (0x0x7fd63eb9cd20) 0 + primary-for QAbstractState (0x0x7fd63eba55b0) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7fd63eb9cde0) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7fd63eb9ce40) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7fd63eba56e8) 0 + QBasicMutex (0x0x7fd63ec6f0c0) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7fd63ec6f180) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7fd63ec6f240) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7fd63ec6f2a0) 0 + +Vtable for QtPrivate::ResultStoreBase +QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9QtPrivate15ResultStoreBaseE) +16 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase +24 (int (*)(...))QtPrivate::ResultStoreBase::~ResultStoreBase + +Class QtPrivate::ResultStoreBase + size=48 align=8 + base size=44 base align=8 +QtPrivate::ResultStoreBase (0x0x7fd63ec6f3c0) 0 + vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16u) + +Vtable for QFutureInterfaceBase +QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI20QFutureInterfaceBase) +16 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase +24 (int (*)(...))QFutureInterfaceBase::~QFutureInterfaceBase + +Class QFutureInterfaceBase + size=16 align=8 + base size=16 base align=8 +QFutureInterfaceBase (0x0x7fd63ec6f420) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7fd63ec6f780) 0 empty + +Vtable for QFutureWatcherBase +QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QFutureWatcherBase) +16 (int (*)(...))QFutureWatcherBase::metaObject +24 (int (*)(...))QFutureWatcherBase::qt_metacast +32 (int (*)(...))QFutureWatcherBase::qt_metacall +40 0u +48 0u +56 (int (*)(...))QFutureWatcherBase::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QFutureWatcherBase::connectNotify +104 (int (*)(...))QFutureWatcherBase::disconnectNotify +112 (int (*)(...))__cxa_pure_virtual +120 (int (*)(...))__cxa_pure_virtual + +Class QFutureWatcherBase + size=16 align=8 + base size=16 base align=8 +QFutureWatcherBase (0x0x7fd63eba5af8) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7fd63ec6f720) 0 + primary-for QFutureWatcherBase (0x0x7fd63eba5af8) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7fd63ec6f900) 0 empty + +Vtable for QHistoryState +QHistoryState::_ZTV13QHistoryState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QHistoryState) +16 (int (*)(...))QHistoryState::metaObject +24 (int (*)(...))QHistoryState::qt_metacast +32 (int (*)(...))QHistoryState::qt_metacall +40 (int (*)(...))QHistoryState::~QHistoryState +48 (int (*)(...))QHistoryState::~QHistoryState +56 (int (*)(...))QHistoryState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QHistoryState::onEntry +120 (int (*)(...))QHistoryState::onExit + +Class QHistoryState + size=16 align=8 + base size=16 base align=8 +QHistoryState (0x0x7fd63eba5f08) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7fd63eba5f70) 0 + primary-for QHistoryState (0x0x7fd63eba5f08) + QObject (0x0x7fd63ec6f8a0) 0 + primary-for QAbstractState (0x0x7fd63eba5f70) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7fd63ec6f9c0) 0 empty + +Vtable for QIdentityProxyModel +QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QIdentityProxyModel) +16 (int (*)(...))QIdentityProxyModel::metaObject +24 (int (*)(...))QIdentityProxyModel::qt_metacast +32 (int (*)(...))QIdentityProxyModel::qt_metacall +40 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +48 (int (*)(...))QIdentityProxyModel::~QIdentityProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QIdentityProxyModel::index +120 (int (*)(...))QIdentityProxyModel::parent +128 (int (*)(...))QIdentityProxyModel::sibling +136 (int (*)(...))QIdentityProxyModel::rowCount +144 (int (*)(...))QIdentityProxyModel::columnCount +152 (int (*)(...))QAbstractProxyModel::hasChildren +160 (int (*)(...))QAbstractProxyModel::data +168 (int (*)(...))QAbstractProxyModel::setData +176 (int (*)(...))QIdentityProxyModel::headerData +184 (int (*)(...))QAbstractProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QAbstractProxyModel::mimeTypes +216 (int (*)(...))QAbstractProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QIdentityProxyModel::dropMimeData +240 (int (*)(...))QAbstractProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QIdentityProxyModel::insertRows +264 (int (*)(...))QIdentityProxyModel::insertColumns +272 (int (*)(...))QIdentityProxyModel::removeRows +280 (int (*)(...))QIdentityProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractProxyModel::fetchMore +312 (int (*)(...))QAbstractProxyModel::canFetchMore +320 (int (*)(...))QAbstractProxyModel::flags +328 (int (*)(...))QAbstractProxyModel::sort +336 (int (*)(...))QAbstractProxyModel::buddy +344 (int (*)(...))QIdentityProxyModel::match +352 (int (*)(...))QAbstractProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QIdentityProxyModel::setSourceModel +392 (int (*)(...))QIdentityProxyModel::mapToSource +400 (int (*)(...))QIdentityProxyModel::mapFromSource +408 (int (*)(...))QIdentityProxyModel::mapSelectionToSource +416 (int (*)(...))QIdentityProxyModel::mapSelectionFromSource + +Class QIdentityProxyModel + size=16 align=8 + base size=16 base align=8 +QIdentityProxyModel (0x0x7fd63eba5750) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7fd63e9e8000) 0 + primary-for QIdentityProxyModel (0x0x7fd63eba5750) + QAbstractItemModel (0x0x7fd63e9e8068) 0 + primary-for QAbstractProxyModel (0x0x7fd63e9e8000) + QObject (0x0x7fd63ec6f960) 0 + primary-for QAbstractItemModel (0x0x7fd63e9e8068) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7fd63ec6fa20) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7fd63ec6fd80) 0 empty + +Vtable for QItemSelectionModel +QItemSelectionModel::_ZTV19QItemSelectionModel: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI19QItemSelectionModel) +16 (int (*)(...))QItemSelectionModel::metaObject +24 (int (*)(...))QItemSelectionModel::qt_metacast +32 (int (*)(...))QItemSelectionModel::qt_metacall +40 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +48 (int (*)(...))QItemSelectionModel::~QItemSelectionModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QItemSelectionModel::setCurrentIndex +120 (int (*)(...))QItemSelectionModel::select +128 (int (*)(...))QItemSelectionModel::select +136 (int (*)(...))QItemSelectionModel::clear +144 (int (*)(...))QItemSelectionModel::reset +152 (int (*)(...))QItemSelectionModel::clearCurrentIndex + +Class QItemSelectionModel + size=16 align=8 + base size=16 base align=8 +QItemSelectionModel (0x0x7fd63e9e8410) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7fd63ec6fd20) 0 + primary-for QItemSelectionModel (0x0x7fd63e9e8410) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7fd63e9e8618) 0 + QList (0x0x7fd63e9e8680) 0 + QListSpecialMethods (0x0x7fd63ea860c0) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7fd63ea865a0) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7fd63ea86660) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7fd63ea86720) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7fd63ea86780) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7fd63ea86840) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7fd63ea868a0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7fd63ea867e0) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7fd63ea86960) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7fd63ea869c0) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7fd63ea86a80) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7fd63ea86ae0) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7fd63ea86a20) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7fd63ea86cc0) 0 empty + +Vtable for QLibrary +QLibrary::_ZTV8QLibrary: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QLibrary) +16 (int (*)(...))QLibrary::metaObject +24 (int (*)(...))QLibrary::qt_metacast +32 (int (*)(...))QLibrary::qt_metacall +40 (int (*)(...))QLibrary::~QLibrary +48 (int (*)(...))QLibrary::~QLibrary +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QLibrary + size=32 align=8 + base size=25 base align=8 +QLibrary (0x0x7fd63e9e8a28) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7fd63ea86c60) 0 + primary-for QLibrary (0x0x7fd63e9e8a28) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7fd63ea86f00) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7fd63ea86ea0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7fd63e8dfc60) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7fd63e8dfcc0) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7fd63e8dff60) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7fd63e57d240) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7fd63e57d4e0) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7fd63e57d780) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7fd63e57df00) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7fd63e6ce0c0) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7fd63e6ce060) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7fd63e6ce240) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7fd63e6ce4e0) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7fd63e6ce7e0) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7fd63e6ce840) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7fd63e6ceae0) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7fd63e6cede0) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7fd63e6cee40) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7fd63e414180) 0 empty + +Vtable for QMimeData +QMimeData::_ZTV9QMimeData: 17u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QMimeData) +16 (int (*)(...))QMimeData::metaObject +24 (int (*)(...))QMimeData::qt_metacast +32 (int (*)(...))QMimeData::qt_metacall +40 (int (*)(...))QMimeData::~QMimeData +48 (int (*)(...))QMimeData::~QMimeData +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QMimeData::hasFormat +120 (int (*)(...))QMimeData::formats +128 (int (*)(...))QMimeData::retrieveData + +Class QMimeData + size=16 align=8 + base size=16 base align=8 +QMimeData (0x0x7fd63e5b4b60) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7fd63e414120) 0 + primary-for QMimeData (0x0x7fd63e5b4b60) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7fd63e4141e0) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7fd63e4144e0) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7fd63e4145a0) 0 empty + +Vtable for QObjectCleanupHandler +QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QObjectCleanupHandler) +16 (int (*)(...))QObjectCleanupHandler::metaObject +24 (int (*)(...))QObjectCleanupHandler::qt_metacast +32 (int (*)(...))QObjectCleanupHandler::qt_metacall +40 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +48 (int (*)(...))QObjectCleanupHandler::~QObjectCleanupHandler +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QObjectCleanupHandler + size=24 align=8 + base size=24 base align=8 +QObjectCleanupHandler (0x0x7fd63e5b4d68) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7fd63e414540) 0 + primary-for QObjectCleanupHandler (0x0x7fd63e5b4d68) + +Class QOperatingSystemVersion + size=16 align=4 + base size=16 base align=4 +QOperatingSystemVersion (0x0x7fd63e414600) 0 + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7fd63e4146c0) 0 empty + +Vtable for QParallelAnimationGroup +QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QParallelAnimationGroup) +16 (int (*)(...))QParallelAnimationGroup::metaObject +24 (int (*)(...))QParallelAnimationGroup::qt_metacast +32 (int (*)(...))QParallelAnimationGroup::qt_metacall +40 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +48 (int (*)(...))QParallelAnimationGroup::~QParallelAnimationGroup +56 (int (*)(...))QParallelAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QParallelAnimationGroup::duration +120 (int (*)(...))QParallelAnimationGroup::updateCurrentTime +128 (int (*)(...))QParallelAnimationGroup::updateState +136 (int (*)(...))QParallelAnimationGroup::updateDirection + +Class QParallelAnimationGroup + size=16 align=8 + base size=16 base align=8 +QParallelAnimationGroup (0x0x7fd63e5b4e38) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7fd63e5b4ea0) 0 + primary-for QParallelAnimationGroup (0x0x7fd63e5b4e38) + QAbstractAnimation (0x0x7fd63e5b4f08) 0 + primary-for QAnimationGroup (0x0x7fd63e5b4ea0) + QObject (0x0x7fd63e414660) 0 + primary-for QAbstractAnimation (0x0x7fd63e5b4f08) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7fd63e414780) 0 empty + +Vtable for QPauseAnimation +QPauseAnimation::_ZTV15QPauseAnimation: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QPauseAnimation) +16 (int (*)(...))QPauseAnimation::metaObject +24 (int (*)(...))QPauseAnimation::qt_metacast +32 (int (*)(...))QPauseAnimation::qt_metacall +40 (int (*)(...))QPauseAnimation::~QPauseAnimation +48 (int (*)(...))QPauseAnimation::~QPauseAnimation +56 (int (*)(...))QPauseAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QPauseAnimation::duration +120 (int (*)(...))QPauseAnimation::updateCurrentTime +128 (int (*)(...))QAbstractAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection + +Class QPauseAnimation + size=16 align=8 + base size=16 base align=8 +QPauseAnimation (0x0x7fd63e5b4f70) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7fd63e5b4dd0) 0 + primary-for QPauseAnimation (0x0x7fd63e5b4f70) + QObject (0x0x7fd63e414720) 0 + primary-for QAbstractAnimation (0x0x7fd63e5b4dd0) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7fd63e414960) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7fd63e414c60) 0 empty + +Vtable for QPluginLoader +QPluginLoader::_ZTV13QPluginLoader: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QPluginLoader) +16 (int (*)(...))QPluginLoader::metaObject +24 (int (*)(...))QPluginLoader::qt_metacast +32 (int (*)(...))QPluginLoader::qt_metacall +40 (int (*)(...))QPluginLoader::~QPluginLoader +48 (int (*)(...))QPluginLoader::~QPluginLoader +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QPluginLoader + size=32 align=8 + base size=25 base align=8 +QPluginLoader (0x0x7fd63e4b31a0) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7fd63e414c00) 0 + primary-for QPluginLoader (0x0x7fd63e4b31a0) + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7fd63e414cc0) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7fd63e4e1060) 0 empty + +Vtable for QProcess +QProcess::_ZTV8QProcess: 31u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI8QProcess) +16 (int (*)(...))QProcess::metaObject +24 (int (*)(...))QProcess::qt_metacast +32 (int (*)(...))QProcess::qt_metacall +40 (int (*)(...))QProcess::~QProcess +48 (int (*)(...))QProcess::~QProcess +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QProcess::isSequential +120 (int (*)(...))QProcess::open +128 (int (*)(...))QProcess::close +136 (int (*)(...))QIODevice::pos +144 (int (*)(...))QIODevice::size +152 (int (*)(...))QIODevice::seek +160 (int (*)(...))QProcess::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QProcess::bytesAvailable +184 (int (*)(...))QProcess::bytesToWrite +192 (int (*)(...))QProcess::canReadLine +200 (int (*)(...))QProcess::waitForReadyRead +208 (int (*)(...))QProcess::waitForBytesWritten +216 (int (*)(...))QProcess::readData +224 (int (*)(...))QIODevice::readLineData +232 (int (*)(...))QProcess::writeData +240 (int (*)(...))QProcess::setupChildProcess + +Class QProcess + size=16 align=8 + base size=16 base align=8 +QProcess (0x0x7fd63e4b33a8) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7fd63e4b3410) 0 + primary-for QProcess (0x0x7fd63e4b33a8) + QObject (0x0x7fd63e4e1000) 0 + primary-for QIODevice (0x0x7fd63e4b3410) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7fd63e4e1120) 0 empty + +Vtable for QVariantAnimation +QVariantAnimation::_ZTV17QVariantAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QVariantAnimation) +16 (int (*)(...))QVariantAnimation::metaObject +24 (int (*)(...))QVariantAnimation::qt_metacast +32 (int (*)(...))QVariantAnimation::qt_metacall +40 (int (*)(...))QVariantAnimation::~QVariantAnimation +48 (int (*)(...))QVariantAnimation::~QVariantAnimation +56 (int (*)(...))QVariantAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QVariantAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QVariantAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QVariantAnimation + size=16 align=8 + base size=16 base align=8 +QVariantAnimation (0x0x7fd63e4b3478) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7fd63e4b34e0) 0 + primary-for QVariantAnimation (0x0x7fd63e4b3478) + QObject (0x0x7fd63e4e10c0) 0 + primary-for QAbstractAnimation (0x0x7fd63e4b34e0) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7fd63e4e11e0) 0 empty + +Vtable for QPropertyAnimation +QPropertyAnimation::_ZTV18QPropertyAnimation: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI18QPropertyAnimation) +16 (int (*)(...))QPropertyAnimation::metaObject +24 (int (*)(...))QPropertyAnimation::qt_metacast +32 (int (*)(...))QPropertyAnimation::qt_metacall +40 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +48 (int (*)(...))QPropertyAnimation::~QPropertyAnimation +56 (int (*)(...))QPropertyAnimation::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QVariantAnimation::duration +120 (int (*)(...))QVariantAnimation::updateCurrentTime +128 (int (*)(...))QPropertyAnimation::updateState +136 (int (*)(...))QAbstractAnimation::updateDirection +144 (int (*)(...))QPropertyAnimation::updateCurrentValue +152 (int (*)(...))QVariantAnimation::interpolated + +Class QPropertyAnimation + size=16 align=8 + base size=16 base align=8 +QPropertyAnimation (0x0x7fd63e4b35b0) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7fd63e4b3618) 0 + primary-for QPropertyAnimation (0x0x7fd63e4b35b0) + QAbstractAnimation (0x0x7fd63e4b3680) 0 + primary-for QVariantAnimation (0x0x7fd63e4b3618) + QObject (0x0x7fd63e4e1180) 0 + primary-for QAbstractAnimation (0x0x7fd63e4b3680) + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7fd63e4e12a0) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7fd63e4e1540) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7fd63e4e15a0) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7fd63e4e1600) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7fd63e4e1960) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7fd63e4e1cc0) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7fd63e4e1f60) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7fd63e303240) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7fd63e303840) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7fd63e303b40) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7fd63e303e40) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7fd63e032000) 0 empty + +Vtable for QSaveFile +QSaveFile::_ZTV9QSaveFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSaveFile) +16 (int (*)(...))QSaveFile::metaObject +24 (int (*)(...))QSaveFile::qt_metacast +32 (int (*)(...))QSaveFile::qt_metacall +40 (int (*)(...))QSaveFile::~QSaveFile +48 (int (*)(...))QSaveFile::~QSaveFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QSaveFile::open +128 (int (*)(...))QSaveFile::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFileDevice::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QSaveFile::writeData +240 (int (*)(...))QSaveFile::fileName +248 (int (*)(...))QFileDevice::resize +256 (int (*)(...))QFileDevice::permissions +264 (int (*)(...))QFileDevice::setPermissions + +Class QSaveFile + size=16 align=8 + base size=16 base align=8 +QSaveFile (0x0x7fd63e26e958) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7fd63e26e9c0) 0 + primary-for QSaveFile (0x0x7fd63e26e958) + QIODevice (0x0x7fd63e26ea28) 0 + primary-for QFileDevice (0x0x7fd63e26e9c0) + QObject (0x0x7fd63e303f60) 0 + primary-for QIODevice (0x0x7fd63e26ea28) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7fd63e0320c0) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7fd63e032180) 0 empty + +Vtable for QSequentialAnimationGroup +QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI25QSequentialAnimationGroup) +16 (int (*)(...))QSequentialAnimationGroup::metaObject +24 (int (*)(...))QSequentialAnimationGroup::qt_metacast +32 (int (*)(...))QSequentialAnimationGroup::qt_metacall +40 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +48 (int (*)(...))QSequentialAnimationGroup::~QSequentialAnimationGroup +56 (int (*)(...))QSequentialAnimationGroup::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSequentialAnimationGroup::duration +120 (int (*)(...))QSequentialAnimationGroup::updateCurrentTime +128 (int (*)(...))QSequentialAnimationGroup::updateState +136 (int (*)(...))QSequentialAnimationGroup::updateDirection + +Class QSequentialAnimationGroup + size=16 align=8 + base size=16 base align=8 +QSequentialAnimationGroup (0x0x7fd63e26ea90) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7fd63e26eaf8) 0 + primary-for QSequentialAnimationGroup (0x0x7fd63e26ea90) + QAbstractAnimation (0x0x7fd63e26eb60) 0 + primary-for QAnimationGroup (0x0x7fd63e26eaf8) + QObject (0x0x7fd63e032120) 0 + primary-for QAbstractAnimation (0x0x7fd63e26eb60) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7fd63e032240) 0 empty + +Vtable for QSettings +QSettings::_ZTV9QSettings: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QSettings) +16 (int (*)(...))QSettings::metaObject +24 (int (*)(...))QSettings::qt_metacast +32 (int (*)(...))QSettings::qt_metacall +40 (int (*)(...))QSettings::~QSettings +48 (int (*)(...))QSettings::~QSettings +56 (int (*)(...))QSettings::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSettings + size=16 align=8 + base size=16 base align=8 +QSettings (0x0x7fd63e26ebc8) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7fd63e0321e0) 0 + primary-for QSettings (0x0x7fd63e26ebc8) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7fd63e032300) 0 empty + +Vtable for QSharedMemory +QSharedMemory::_ZTV13QSharedMemory: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSharedMemory) +16 (int (*)(...))QSharedMemory::metaObject +24 (int (*)(...))QSharedMemory::qt_metacast +32 (int (*)(...))QSharedMemory::qt_metacall +40 (int (*)(...))QSharedMemory::~QSharedMemory +48 (int (*)(...))QSharedMemory::~QSharedMemory +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSharedMemory + size=16 align=8 + base size=16 base align=8 +QSharedMemory (0x0x7fd63e26ec30) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7fd63e0322a0) 0 + primary-for QSharedMemory (0x0x7fd63e26ec30) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7fd63e0323c0) 0 empty + +Vtable for QSignalMapper +QSignalMapper::_ZTV13QSignalMapper: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QSignalMapper) +16 (int (*)(...))QSignalMapper::metaObject +24 (int (*)(...))QSignalMapper::qt_metacast +32 (int (*)(...))QSignalMapper::qt_metacall +40 (int (*)(...))QSignalMapper::~QSignalMapper +48 (int (*)(...))QSignalMapper::~QSignalMapper +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSignalMapper + size=16 align=8 + base size=16 base align=8 +QSignalMapper (0x0x7fd63e26ec98) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7fd63e032360) 0 + primary-for QSignalMapper (0x0x7fd63e26ec98) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7fd63e032480) 0 empty + +Vtable for QSignalTransition +QSignalTransition::_ZTV17QSignalTransition: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QSignalTransition) +16 (int (*)(...))QSignalTransition::metaObject +24 (int (*)(...))QSignalTransition::qt_metacast +32 (int (*)(...))QSignalTransition::qt_metacall +40 (int (*)(...))QSignalTransition::~QSignalTransition +48 (int (*)(...))QSignalTransition::~QSignalTransition +56 (int (*)(...))QSignalTransition::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSignalTransition::eventTest +120 (int (*)(...))QSignalTransition::onTransition + +Class QSignalTransition + size=16 align=8 + base size=16 base align=8 +QSignalTransition (0x0x7fd63e26ed00) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7fd63e26ed68) 0 + primary-for QSignalTransition (0x0x7fd63e26ed00) + QObject (0x0x7fd63e032420) 0 + primary-for QAbstractTransition (0x0x7fd63e26ed68) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7fd63e032540) 0 empty + +Vtable for QSocketNotifier +QSocketNotifier::_ZTV15QSocketNotifier: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI15QSocketNotifier) +16 (int (*)(...))QSocketNotifier::metaObject +24 (int (*)(...))QSocketNotifier::qt_metacast +32 (int (*)(...))QSocketNotifier::qt_metacall +40 (int (*)(...))QSocketNotifier::~QSocketNotifier +48 (int (*)(...))QSocketNotifier::~QSocketNotifier +56 (int (*)(...))QSocketNotifier::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QSocketNotifier + size=16 align=8 + base size=16 base align=8 +QSocketNotifier (0x0x7fd63e26edd0) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7fd63e0324e0) 0 + primary-for QSocketNotifier (0x0x7fd63e26edd0) + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7fd63e032600) 0 empty + +Vtable for QSortFilterProxyModel +QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QSortFilterProxyModel) +16 (int (*)(...))QSortFilterProxyModel::metaObject +24 (int (*)(...))QSortFilterProxyModel::qt_metacast +32 (int (*)(...))QSortFilterProxyModel::qt_metacall +40 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +48 (int (*)(...))QSortFilterProxyModel::~QSortFilterProxyModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QSortFilterProxyModel::index +120 (int (*)(...))QSortFilterProxyModel::parent +128 (int (*)(...))QSortFilterProxyModel::sibling +136 (int (*)(...))QSortFilterProxyModel::rowCount +144 (int (*)(...))QSortFilterProxyModel::columnCount +152 (int (*)(...))QSortFilterProxyModel::hasChildren +160 (int (*)(...))QSortFilterProxyModel::data +168 (int (*)(...))QSortFilterProxyModel::setData +176 (int (*)(...))QSortFilterProxyModel::headerData +184 (int (*)(...))QSortFilterProxyModel::setHeaderData +192 (int (*)(...))QAbstractProxyModel::itemData +200 (int (*)(...))QAbstractProxyModel::setItemData +208 (int (*)(...))QSortFilterProxyModel::mimeTypes +216 (int (*)(...))QSortFilterProxyModel::mimeData +224 (int (*)(...))QAbstractProxyModel::canDropMimeData +232 (int (*)(...))QSortFilterProxyModel::dropMimeData +240 (int (*)(...))QSortFilterProxyModel::supportedDropActions +248 (int (*)(...))QAbstractProxyModel::supportedDragActions +256 (int (*)(...))QSortFilterProxyModel::insertRows +264 (int (*)(...))QSortFilterProxyModel::insertColumns +272 (int (*)(...))QSortFilterProxyModel::removeRows +280 (int (*)(...))QSortFilterProxyModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QSortFilterProxyModel::fetchMore +312 (int (*)(...))QSortFilterProxyModel::canFetchMore +320 (int (*)(...))QSortFilterProxyModel::flags +328 (int (*)(...))QSortFilterProxyModel::sort +336 (int (*)(...))QSortFilterProxyModel::buddy +344 (int (*)(...))QSortFilterProxyModel::match +352 (int (*)(...))QSortFilterProxyModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractProxyModel::submit +376 (int (*)(...))QAbstractProxyModel::revert +384 (int (*)(...))QSortFilterProxyModel::setSourceModel +392 (int (*)(...))QSortFilterProxyModel::mapToSource +400 (int (*)(...))QSortFilterProxyModel::mapFromSource +408 (int (*)(...))QSortFilterProxyModel::mapSelectionToSource +416 (int (*)(...))QSortFilterProxyModel::mapSelectionFromSource +424 (int (*)(...))QSortFilterProxyModel::filterAcceptsRow +432 (int (*)(...))QSortFilterProxyModel::filterAcceptsColumn +440 (int (*)(...))QSortFilterProxyModel::lessThan + +Class QSortFilterProxyModel + size=16 align=8 + base size=16 base align=8 +QSortFilterProxyModel (0x0x7fd63e26ee38) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7fd63e26eea0) 0 + primary-for QSortFilterProxyModel (0x0x7fd63e26ee38) + QAbstractItemModel (0x0x7fd63e26ef08) 0 + primary-for QAbstractProxyModel (0x0x7fd63e26eea0) + QObject (0x0x7fd63e0325a0) 0 + primary-for QAbstractItemModel (0x0x7fd63e26ef08) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7fd63e0327e0) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7fd63e032a20) 0 empty + +Vtable for QState +QState::_ZTV6QState: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QState) +16 (int (*)(...))QState::metaObject +24 (int (*)(...))QState::qt_metacast +32 (int (*)(...))QState::qt_metacall +40 (int (*)(...))QState::~QState +48 (int (*)(...))QState::~QState +56 (int (*)(...))QState::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QState::onEntry +120 (int (*)(...))QState::onExit + +Class QState + size=16 align=8 + base size=16 base align=8 +QState (0x0x7fd63e1030d0) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7fd63e103138) 0 + primary-for QState (0x0x7fd63e1030d0) + QObject (0x0x7fd63e0329c0) 0 + primary-for QAbstractState (0x0x7fd63e103138) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7fd63e032b40) 0 empty + +Vtable for QStateMachine::SignalEvent +QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine11SignalEventE) +16 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent +24 (int (*)(...))QStateMachine::SignalEvent::~SignalEvent + +Class QStateMachine::SignalEvent + size=48 align=8 + base size=48 base align=8 +QStateMachine::SignalEvent (0x0x7fd63e1032d8) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7fd63e032ba0) 0 + primary-for QStateMachine::SignalEvent (0x0x7fd63e1032d8) + +Vtable for QStateMachine::WrappedEvent +QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN13QStateMachine12WrappedEventE) +16 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent +24 (int (*)(...))QStateMachine::WrappedEvent::~WrappedEvent + +Class QStateMachine::WrappedEvent + size=40 align=8 + base size=40 base align=8 +QStateMachine::WrappedEvent (0x0x7fd63e103340) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7fd63e032c00) 0 + primary-for QStateMachine::WrappedEvent (0x0x7fd63e103340) + +Vtable for QStateMachine +QStateMachine::_ZTV13QStateMachine: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI13QStateMachine) +16 (int (*)(...))QStateMachine::metaObject +24 (int (*)(...))QStateMachine::qt_metacast +32 (int (*)(...))QStateMachine::qt_metacall +40 (int (*)(...))QStateMachine::~QStateMachine +48 (int (*)(...))QStateMachine::~QStateMachine +56 (int (*)(...))QStateMachine::event +64 (int (*)(...))QStateMachine::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QStateMachine::onEntry +120 (int (*)(...))QStateMachine::onExit +128 (int (*)(...))QStateMachine::beginSelectTransitions +136 (int (*)(...))QStateMachine::endSelectTransitions +144 (int (*)(...))QStateMachine::beginMicrostep +152 (int (*)(...))QStateMachine::endMicrostep + +Class QStateMachine + size=16 align=8 + base size=16 base align=8 +QStateMachine (0x0x7fd63e1031a0) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7fd63e103208) 0 + primary-for QStateMachine (0x0x7fd63e1031a0) + QAbstractState (0x0x7fd63e103270) 0 + primary-for QState (0x0x7fd63e103208) + QObject (0x0x7fd63e032ae0) 0 + primary-for QAbstractState (0x0x7fd63e103270) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7fd63e032c60) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7fd63ddaa0c0) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7fd63ddaab40) 0 empty + +Vtable for QStringListModel +QStringListModel::_ZTV16QStringListModel: 48u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI16QStringListModel) +16 (int (*)(...))QStringListModel::metaObject +24 (int (*)(...))QStringListModel::qt_metacast +32 (int (*)(...))QStringListModel::qt_metacall +40 (int (*)(...))QStringListModel::~QStringListModel +48 (int (*)(...))QStringListModel::~QStringListModel +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QAbstractListModel::index +120 (int (*)(...))QAbstractListModel::parent +128 (int (*)(...))QStringListModel::sibling +136 (int (*)(...))QStringListModel::rowCount +144 (int (*)(...))QAbstractListModel::columnCount +152 (int (*)(...))QAbstractListModel::hasChildren +160 (int (*)(...))QStringListModel::data +168 (int (*)(...))QStringListModel::setData +176 (int (*)(...))QAbstractItemModel::headerData +184 (int (*)(...))QAbstractItemModel::setHeaderData +192 (int (*)(...))QAbstractItemModel::itemData +200 (int (*)(...))QAbstractItemModel::setItemData +208 (int (*)(...))QAbstractItemModel::mimeTypes +216 (int (*)(...))QAbstractItemModel::mimeData +224 (int (*)(...))QAbstractItemModel::canDropMimeData +232 (int (*)(...))QAbstractListModel::dropMimeData +240 (int (*)(...))QStringListModel::supportedDropActions +248 (int (*)(...))QAbstractItemModel::supportedDragActions +256 (int (*)(...))QStringListModel::insertRows +264 (int (*)(...))QAbstractItemModel::insertColumns +272 (int (*)(...))QStringListModel::removeRows +280 (int (*)(...))QAbstractItemModel::removeColumns +288 (int (*)(...))QAbstractItemModel::moveRows +296 (int (*)(...))QAbstractItemModel::moveColumns +304 (int (*)(...))QAbstractItemModel::fetchMore +312 (int (*)(...))QAbstractItemModel::canFetchMore +320 (int (*)(...))QStringListModel::flags +328 (int (*)(...))QStringListModel::sort +336 (int (*)(...))QAbstractItemModel::buddy +344 (int (*)(...))QAbstractItemModel::match +352 (int (*)(...))QAbstractItemModel::span +360 (int (*)(...))QAbstractItemModel::roleNames +368 (int (*)(...))QAbstractItemModel::submit +376 (int (*)(...))QAbstractItemModel::revert + +Class QStringListModel + size=24 align=8 + base size=24 base align=8 +QStringListModel (0x0x7fd63e103dd0) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7fd63e103e38) 0 + primary-for QStringListModel (0x0x7fd63e103dd0) + QAbstractItemModel (0x0x7fd63e103ea0) 0 + primary-for QAbstractListModel (0x0x7fd63e103e38) + QObject (0x0x7fd63ddaaae0) 0 + primary-for QAbstractItemModel (0x0x7fd63e103ea0) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7fd63ddaaba0) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7fd63ddaac60) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7fd63ddaad80) 0 empty + +Vtable for QTemporaryFile +QTemporaryFile::_ZTV14QTemporaryFile: 34u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI14QTemporaryFile) +16 (int (*)(...))QTemporaryFile::metaObject +24 (int (*)(...))QTemporaryFile::qt_metacast +32 (int (*)(...))QTemporaryFile::qt_metacall +40 (int (*)(...))QTemporaryFile::~QTemporaryFile +48 (int (*)(...))QTemporaryFile::~QTemporaryFile +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QFileDevice::isSequential +120 (int (*)(...))QTemporaryFile::open +128 (int (*)(...))QFileDevice::close +136 (int (*)(...))QFileDevice::pos +144 (int (*)(...))QFile::size +152 (int (*)(...))QFileDevice::seek +160 (int (*)(...))QFileDevice::atEnd +168 (int (*)(...))QIODevice::reset +176 (int (*)(...))QIODevice::bytesAvailable +184 (int (*)(...))QIODevice::bytesToWrite +192 (int (*)(...))QIODevice::canReadLine +200 (int (*)(...))QIODevice::waitForReadyRead +208 (int (*)(...))QIODevice::waitForBytesWritten +216 (int (*)(...))QFileDevice::readData +224 (int (*)(...))QFileDevice::readLineData +232 (int (*)(...))QFileDevice::writeData +240 (int (*)(...))QTemporaryFile::fileName +248 (int (*)(...))QFile::resize +256 (int (*)(...))QFile::permissions +264 (int (*)(...))QFile::setPermissions + +Class QTemporaryFile + size=16 align=8 + base size=16 base align=8 +QTemporaryFile (0x0x7fd63e103f08) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7fd63e103f70) 0 + primary-for QTemporaryFile (0x0x7fd63e103f08) + QFileDevice (0x0x7fd63de51000) 0 + primary-for QFile (0x0x7fd63e103f70) + QIODevice (0x0x7fd63de51068) 0 + primary-for QFileDevice (0x0x7fd63de51000) + QObject (0x0x7fd63ddaad20) 0 + primary-for QIODevice (0x0x7fd63de51068) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7fd63ddaade0) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7fd63de9e060) 0 + +Vtable for QTextCodec +QTextCodec::_ZTV10QTextCodec: 9u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI10QTextCodec) +16 (int (*)(...))__cxa_pure_virtual +24 (int (*)(...))QTextCodec::aliases +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual +56 0u +64 0u + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7fd63de9e000) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7fd63de9e240) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7fd63de9e2a0) 0 + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7fd63de9e360) 0 empty + +Vtable for QThread +QThread::_ZTV7QThread: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI7QThread) +16 (int (*)(...))QThread::metaObject +24 (int (*)(...))QThread::qt_metacast +32 (int (*)(...))QThread::qt_metacall +40 (int (*)(...))QThread::~QThread +48 (int (*)(...))QThread::~QThread +56 (int (*)(...))QThread::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QThread::run + +Class QThread + size=16 align=8 + base size=16 base align=8 +QThread (0x0x7fd63de51270) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7fd63de9e300) 0 + primary-for QThread (0x0x7fd63de51270) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7fd63de9e420) 0 empty + +Vtable for QThreadPool +QThreadPool::_ZTV11QThreadPool: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QThreadPool) +16 (int (*)(...))QThreadPool::metaObject +24 (int (*)(...))QThreadPool::qt_metacast +32 (int (*)(...))QThreadPool::qt_metacall +40 (int (*)(...))QThreadPool::~QThreadPool +48 (int (*)(...))QThreadPool::~QThreadPool +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QThreadPool + size=16 align=8 + base size=16 base align=8 +QThreadPool (0x0x7fd63de512d8) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7fd63de9e3c0) 0 + primary-for QThreadPool (0x0x7fd63de512d8) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7fd63de9e480) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7fd63de9e5a0) 0 empty + +Vtable for QTimeLine +QTimeLine::_ZTV9QTimeLine: 15u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QTimeLine) +16 (int (*)(...))QTimeLine::metaObject +24 (int (*)(...))QTimeLine::qt_metacast +32 (int (*)(...))QTimeLine::qt_metacall +40 (int (*)(...))QTimeLine::~QTimeLine +48 (int (*)(...))QTimeLine::~QTimeLine +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimeLine::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTimeLine::valueForTime + +Class QTimeLine + size=16 align=8 + base size=16 base align=8 +QTimeLine (0x0x7fd63de51340) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7fd63de9e540) 0 + primary-for QTimeLine (0x0x7fd63de51340) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7fd63de9e660) 0 empty + +Vtable for QTimer +QTimer::_ZTV6QTimer: 14u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI6QTimer) +16 (int (*)(...))QTimer::metaObject +24 (int (*)(...))QTimer::qt_metacast +32 (int (*)(...))QTimer::qt_metacall +40 (int (*)(...))QTimer::~QTimer +48 (int (*)(...))QTimer::~QTimer +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QTimer::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify + +Class QTimer + size=32 align=8 + base size=29 base align=8 +QTimer (0x0x7fd63de513a8) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7fd63de9e600) 0 + primary-for QTimer (0x0x7fd63de513a8) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7fd63db75480) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7fd63db75420) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7fd63db75a20) 0 empty + +Vtable for QTranslator +QTranslator::_ZTV11QTranslator: 16u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI11QTranslator) +16 (int (*)(...))QTranslator::metaObject +24 (int (*)(...))QTranslator::qt_metacast +32 (int (*)(...))QTranslator::qt_metacall +40 (int (*)(...))QTranslator::~QTranslator +48 (int (*)(...))QTranslator::~QTranslator +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QTranslator::translate +120 (int (*)(...))QTranslator::isEmpty + +Class QTranslator + size=16 align=8 + base size=16 base align=8 +QTranslator (0x0x7fd63db7d618) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7fd63db759c0) 0 + primary-for QTranslator (0x0x7fd63db7d618) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7fd63db75b40) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7fd63dcdf240) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7fd63dcdf540) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7fd63dcdf7e0) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7fd63dcdf840) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7fd63d9fdc60) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7fd63da00c30) 0 + QVector (0x0x7fd63da50060) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7fd63da500c0) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7fd63da50360) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7fd63da50600) 0 + +Vtable for QXmlStreamEntityResolver +QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI24QXmlStreamEntityResolver) +16 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +24 (int (*)(...))QXmlStreamEntityResolver::~QXmlStreamEntityResolver +32 (int (*)(...))QXmlStreamEntityResolver::resolveEntity +40 (int (*)(...))QXmlStreamEntityResolver::resolveUndeclaredEntity + +Class QXmlStreamEntityResolver + size=8 align=8 + base size=8 base align=8 +QXmlStreamEntityResolver (0x0x7fd63da508a0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7fd63da50900) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7fd63da50a20) 0 + +Class QGeoAddress + size=8 align=8 + base size=8 base align=8 +QGeoAddress (0x0x7fd63da50b40) 0 + +Class QGeoCoordinate + size=8 align=8 + base size=8 base align=8 +QGeoCoordinate (0x0x7fd63da50f60) 0 + +Class QGeoShape + size=8 align=8 + base size=8 base align=8 +QGeoShape (0x0x7fd63db523c0) 0 + +Class QGeoAreaMonitorInfo + size=8 align=8 + base size=8 base align=8 +QGeoAreaMonitorInfo (0x0x7fd63db527e0) 0 + +Class QGeoPositionInfo + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfo (0x0x7fd63db528a0) 0 + +Class QGeoPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoPositionInfoSource::QPrivateSignal (0x0x7fd63db52960) 0 empty + +Vtable for QGeoPositionInfoSource +QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI22QGeoPositionInfoSource) +16 (int (*)(...))QGeoPositionInfoSource::metaObject +24 (int (*)(...))QGeoPositionInfoSource::qt_metacast +32 (int (*)(...))QGeoPositionInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoPositionInfoSource (0x0x7fd63da81d00) 0 + vptr=((& QGeoPositionInfoSource::_ZTV22QGeoPositionInfoSource) + 16u) + QObject (0x0x7fd63db52900) 0 + primary-for QGeoPositionInfoSource (0x0x7fd63da81d00) + +Class QGeoAreaMonitorSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoAreaMonitorSource::QPrivateSignal (0x0x7fd63db52ba0) 0 empty + +Vtable for QGeoAreaMonitorSource +QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource: 23u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI21QGeoAreaMonitorSource) +16 (int (*)(...))QGeoAreaMonitorSource::metaObject +24 (int (*)(...))QGeoAreaMonitorSource::qt_metacast +32 (int (*)(...))QGeoAreaMonitorSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoAreaMonitorSource::setPositionInfoSource +120 (int (*)(...))QGeoAreaMonitorSource::positionInfoSource +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual +160 (int (*)(...))__cxa_pure_virtual +168 (int (*)(...))__cxa_pure_virtual +176 (int (*)(...))__cxa_pure_virtual + +Class QGeoAreaMonitorSource + size=24 align=8 + base size=24 base align=8 +QGeoAreaMonitorSource (0x0x7fd63da81e38) 0 + vptr=((& QGeoAreaMonitorSource::_ZTV21QGeoAreaMonitorSource) + 16u) + QObject (0x0x7fd63db52b40) 0 + primary-for QGeoAreaMonitorSource (0x0x7fd63da81e38) + +Class QGeoRectangle + size=8 align=8 + base size=8 base align=8 +QGeoRectangle (0x0x7fd63da81ea0) 0 + QGeoShape (0x0x7fd63db52c00) 0 + +Class QGeoCircle + size=8 align=8 + base size=8 base align=8 +QGeoCircle (0x0x7fd63d81b068) 0 + QGeoShape (0x0x7fd63d843120) 0 + +Class QGeoLocation + size=8 align=8 + base size=8 base align=8 +QGeoLocation (0x0x7fd63d8434e0) 0 + +Class QGeoPath + size=8 align=8 + base size=8 base align=8 +QGeoPath (0x0x7fd63d81b410) 0 + QGeoShape (0x0x7fd63d843900) 0 + +Class QGeoSatelliteInfo + size=8 align=8 + base size=8 base align=8 +QGeoSatelliteInfo (0x0x7fd63d843cc0) 0 + +Class QGeoSatelliteInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QGeoSatelliteInfoSource::QPrivateSignal (0x0x7fd63d843d80) 0 empty + +Vtable for QGeoSatelliteInfoSource +QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource: 20u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QGeoSatelliteInfoSource) +16 (int (*)(...))QGeoSatelliteInfoSource::metaObject +24 (int (*)(...))QGeoSatelliteInfoSource::qt_metacast +32 (int (*)(...))QGeoSatelliteInfoSource::qt_metacall +40 0u +48 0u +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QGeoSatelliteInfoSource::setUpdateInterval +120 (int (*)(...))__cxa_pure_virtual +128 (int (*)(...))__cxa_pure_virtual +136 (int (*)(...))__cxa_pure_virtual +144 (int (*)(...))__cxa_pure_virtual +152 (int (*)(...))__cxa_pure_virtual + +Class QGeoSatelliteInfoSource + size=24 align=8 + base size=24 base align=8 +QGeoSatelliteInfoSource (0x0x7fd63d81b618) 0 + vptr=((& QGeoSatelliteInfoSource::_ZTV23QGeoSatelliteInfoSource) + 16u) + QObject (0x0x7fd63d843d20) 0 + primary-for QGeoSatelliteInfoSource (0x0x7fd63d81b618) + +Vtable for QGeoPositionInfoSourceFactory +QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory: 7u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI29QGeoPositionInfoSourceFactory) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))__cxa_pure_virtual +48 (int (*)(...))__cxa_pure_virtual + +Class QGeoPositionInfoSourceFactory + size=8 align=8 + base size=8 base align=8 +QGeoPositionInfoSourceFactory (0x0x7fd63d843e40) 0 nearly-empty + vptr=((& QGeoPositionInfoSourceFactory::_ZTV29QGeoPositionInfoSourceFactory) + 16u) + +Class QNmeaPositionInfoSource::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNmeaPositionInfoSource::QPrivateSignal (0x0x7fd63d843f60) 0 empty + +Vtable for QNmeaPositionInfoSource +QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource: 24u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI23QNmeaPositionInfoSource) +16 (int (*)(...))QNmeaPositionInfoSource::metaObject +24 (int (*)(...))QNmeaPositionInfoSource::qt_metacast +32 (int (*)(...))QNmeaPositionInfoSource::qt_metacall +40 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +48 (int (*)(...))QNmeaPositionInfoSource::~QNmeaPositionInfoSource +56 (int (*)(...))QObject::event +64 (int (*)(...))QObject::eventFilter +72 (int (*)(...))QObject::timerEvent +80 (int (*)(...))QObject::childEvent +88 (int (*)(...))QObject::customEvent +96 (int (*)(...))QObject::connectNotify +104 (int (*)(...))QObject::disconnectNotify +112 (int (*)(...))QNmeaPositionInfoSource::setUpdateInterval +120 (int (*)(...))QGeoPositionInfoSource::setPreferredPositioningMethods +128 (int (*)(...))QNmeaPositionInfoSource::lastKnownPosition +136 (int (*)(...))QNmeaPositionInfoSource::supportedPositioningMethods +144 (int (*)(...))QNmeaPositionInfoSource::minimumUpdateInterval +152 (int (*)(...))QNmeaPositionInfoSource::error +160 (int (*)(...))QNmeaPositionInfoSource::startUpdates +168 (int (*)(...))QNmeaPositionInfoSource::stopUpdates +176 (int (*)(...))QNmeaPositionInfoSource::requestUpdate +184 (int (*)(...))QNmeaPositionInfoSource::parsePosInfoFromNmeaData + +Class QNmeaPositionInfoSource + size=32 align=8 + base size=32 base align=8 +QNmeaPositionInfoSource (0x0x7fd63d81b680) 0 + vptr=((& QNmeaPositionInfoSource::_ZTV23QNmeaPositionInfoSource) + 16u) + QGeoPositionInfoSource (0x0x7fd63d81b6e8) 0 + primary-for QNmeaPositionInfoSource (0x0x7fd63d81b680) + QObject (0x0x7fd63d843f00) 0 + primary-for QGeoPositionInfoSource (0x0x7fd63d81b6e8) + diff --git a/tests/auto/cmake/CMakeLists.txt b/tests/auto/cmake/CMakeLists.txt new file mode 100644 index 0000000..2246867 --- /dev/null +++ b/tests/auto/cmake/CMakeLists.txt @@ -0,0 +1,47 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# This is an automatic test for the CMake configuration files. +# To run it manually, +# 1) mkdir build # Create a build directory +# 2) cd build +# 3) # Run cmake on this directory +# `$qt_prefix/bin/qt-cmake ..` or `cmake -DCMAKE_PREFIX_PATH=/path/to/qt ..` +# 4) ctest # Run ctest + +cmake_minimum_required(VERSION 3.16) +project(positioning_cmake_tests) +enable_testing() + +set(required_packages Core Positioning) + +# Setup the test when called as a completely standalone project. +if(TARGET Qt6::Core) + # Tests are built as part of the repository's build tree. + # Setup paths so that the Qt packages are found. + qt_internal_set_up_build_dir_package_paths() +endif() + +find_package(Qt6 REQUIRED COMPONENTS ${required_packages}) + +# Setup common test variables which were previously set by ctest_testcase_common.prf. +set(CMAKE_MODULES_UNDER_TEST "${required_packages}") + +foreach(qt_package ${CMAKE_MODULES_UNDER_TEST}) + set(package_name "${QT_CMAKE_EXPORT_NAMESPACE}${qt_package}") + if(${package_name}_FOUND) + set(CMAKE_${qt_package}_MODULE_MAJOR_VERSION "${${package_name}_VERSION_MAJOR}") + set(CMAKE_${qt_package}_MODULE_MINOR_VERSION "${${package_name}_VERSION_MINOR}") + set(CMAKE_${qt_package}_MODULE_PATCH_VERSION "${${package_name}_VERSION_PATCH}") + endif() +endforeach() + +include("${_Qt6CTestMacros}") + +set(module_includes + Positioning QGeoRectangle +) + +_qt_internal_test_module_includes( + ${module_includes} +) diff --git a/tests/auto/declarative_geolocation/CMakeLists.txt b/tests/auto/declarative_geolocation/CMakeLists.txt new file mode 100644 index 0000000..19fa436 --- /dev/null +++ b/tests/auto/declarative_geolocation/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# special case begin + +# Collect test data + +qt_internal_add_test(tst_declarative_geolocation + QMLTEST + SOURCES + main.cpp + LIBRARIES + Qt::Positioning + Qt::Quick + TESTDATA + tst_declarativegeolocation.qml +) + +# special case end diff --git a/tests/auto/declarative_geolocation/main.cpp b/tests/auto/declarative_geolocation/main.cpp new file mode 100644 index 0000000..0244b37 --- /dev/null +++ b/tests/auto/declarative_geolocation/main.cpp @@ -0,0 +1,23 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include + +static void initializeLibraryPath() +{ +#if QT_CONFIG(library) + // Set custom path since CI doesn't install test plugins +#ifdef Q_OS_WIN + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../../plugins")); +#else + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../plugins")); +#endif +#endif +} + +Q_COREAPP_STARTUP_FUNCTION(initializeLibraryPath) + +QUICK_TEST_MAIN(declarative_geolocation) diff --git a/tests/auto/declarative_geolocation/tst_declarativegeolocation.qml b/tests/auto/declarative_geolocation/tst_declarativegeolocation.qml new file mode 100644 index 0000000..b6b2fb3 --- /dev/null +++ b/tests/auto/declarative_geolocation/tst_declarativegeolocation.qml @@ -0,0 +1,136 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QtQuick 2.0 +import QtTest 1.0 +import QtPositioning 6.2 + +Item { + id: testCase + + property var topLeft: QtPositioning.coordinate(1.0, 2.0) + property var bottomRight: QtPositioning.coordinate(2.0, 1.0) + property var centerPoint: QtPositioning.coordinate(1.5, 1.5) + + Location { + id: defaultConstructed + } + + Location { + id: location + } + + // Use property bindings insetead of signal spies + property var addressObserver: location.address + property int addressChangedCount: 0 + onAddressObserverChanged: { + ++addressChangedCount + } + + property var coordObserver: location.coordinate + property int coordChangedCount: 0 + onCoordObserverChanged: { + ++coordChangedCount + } + + property var shapeObserver: location.boundingShape + property int shapeChangedCount: 0 + onShapeObserverChanged: { + ++shapeChangedCount + } + + property var attrsObserver: location.extendedAttributes + property int attrsChangedCount: 0 + onAttrsObserverChanged: { + ++attrsChangedCount + } + + Address { + id: emptyAddress + } + + Address { + id: addr1 + country: "Germany" + city: "Berlin" + street: "Erich-Thilo-Str" + streetNumber: "10" + postalCode: "12489" + } + + Location { + id: completeLocation + address: addr1 + coordinate: centerPoint + boundingShape: QtPositioning.rectangle(topLeft, bottomRight) + } + + Location { + id: fromGeoLocation + } + + TestCase { + name: "DeclarativeGeoLocation" + + function test_default_construction() { + compare(defaultConstructed.address.address, emptyAddress.address) + compare(defaultConstructed.coordinate, QtPositioning.coordinate()) + compare(defaultConstructed.boundingShape, QtPositioning.shape()) + } + + function test_address_changed() { + addressChangedCount = 0 + location.address = addr1 + compare(addressChangedCount, 1) + compare(location.address.address, addr1.address) + } + + function test_coordinate_changed() { + var coord1 = QtPositioning.coordinate(1.0, 2.0) + var emptyCoord = QtPositioning.coordinate() + coordChangedCount = 0 + compare(location.coordinate, emptyCoord) + location.coordinate = coord1 + compare(coordChangedCount, 1) + compare(location.coordinate, coord1) + } + + function test_bounding_box_changed() { + var emptyShape = QtPositioning.shape() + shapeChangedCount = 0 + compare(location.boundingShape, emptyShape) + + var box = QtPositioning.rectangle(topLeft, bottomRight) + location.boundingShape = box + compare(shapeChangedCount, 1) + compare(QtPositioning.shapeToRectangle(location.boundingShape), box) + // verify that shape's boundingGeoRectangle() matches the box. + compare(location.boundingShape.boundingGeoRectangle(), box) + + var circle = QtPositioning.circle(centerPoint, 100) + location.boundingShape = circle + compare(shapeChangedCount, 2) + compare(QtPositioning.shapeToCircle(location.boundingShape), circle) + } + + function test_from_geolocation() { + fromGeoLocation.location = completeLocation.location + compare(fromGeoLocation.location, completeLocation.location) + compare(fromGeoLocation.address.address, completeLocation.address.address) + compare(fromGeoLocation.coordinate, completeLocation.coordinate) + compare(fromGeoLocation.boundingShape, completeLocation.boundingShape) + } + + function test_extended_attributes() { + attrsChangedCount = 0 + + var attributes = { "foo" : 42 } + location.extendedAttributes = attributes; + compare(location.extendedAttributes, attributes) + compare(attrsChangedCount, 1) + + attributes["bar"] = 41 + verify(location.extendedAttributes !== attributes) + } + } +} diff --git a/tests/auto/declarative_positioning_core/BLACKLIST b/tests/auto/declarative_positioning_core/BLACKLIST new file mode 100644 index 0000000..4bafd5e --- /dev/null +++ b/tests/auto/declarative_positioning_core/BLACKLIST @@ -0,0 +1,6 @@ +# QTBUG-59074 and QTBUG-93761: flaky test +[CoordinateAnimation::test_west_direction_coordinate_animation] +osx +# QTBUG-59074 and QTBUG-93761: flaky test +[CoordinateAnimation::test_east_direction_coordinate_animation] +osx diff --git a/tests/auto/declarative_positioning_core/CMakeLists.txt b/tests/auto/declarative_positioning_core/CMakeLists.txt new file mode 100644 index 0000000..e098b40 --- /dev/null +++ b/tests/auto/declarative_positioning_core/CMakeLists.txt @@ -0,0 +1,49 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from declarative_positioning_core.pro. + +##################################################################### +## tst_declarative_positioning_core Test: +##################################################################### + +# Collect test data +file(GLOB_RECURSE test_data_glob + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + *.qml) +list(APPEND test_data ${test_data_glob}) + +qt_internal_add_test(tst_declarative_positioning_core + QMLTEST + SOURCES + main.cpp + factory.cpp + factory.h + properties.cpp + properties.h + LIBRARIES + Qt::Positioning + Qt::Quick + TESTDATA ${test_data} +) + +qt_add_qml_module(tst_declarative_positioning_core + URI TestFactory + VERSION 1.0 + QML_FILES + tst_address.qml + tst_coordinate.qml + tst_geoshape.qml + tst_position.qml + tst_positionsource.qml + NO_RESOURCE_TARGET_PATH +) + +add_dependencies(tst_declarative_positioning_core QGeoPositionInfoSourceFactoryTestPlugin + DummyPluginForTestsFactoryPlugin) +if(ANDROID) + # We depend on 2 plugins, but they both will be installed in the same dir + set_target_properties(tst_declarative_positioning_core PROPERTIES + QT_ANDROID_EXTRA_PLUGINS "$" + ) +endif() diff --git a/tests/auto/declarative_positioning_core/factory.cpp b/tests/auto/declarative_positioning_core/factory.cpp new file mode 100644 index 0000000..9989c16 --- /dev/null +++ b/tests/auto/declarative_positioning_core/factory.cpp @@ -0,0 +1,25 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include "factory.h" +#include +#include + +QT_BEGIN_NAMESPACE + +Factory::Factory(QObject *parent) : QObject(parent) +{ + +} + +QGeoShape Factory::createShape(const QGeoCoordinate &topLeft, const QGeoCoordinate &bottomRight) +{ + return QGeoRectangle(topLeft, bottomRight); +} + +QGeoShape Factory::createShape(const QGeoCoordinate ¢er, qreal radius) const +{ + return QGeoCircle(center, radius); +} + +QT_END_NAMESPACE diff --git a/tests/auto/declarative_positioning_core/factory.h b/tests/auto/declarative_positioning_core/factory.h new file mode 100644 index 0000000..758a95b --- /dev/null +++ b/tests/auto/declarative_positioning_core/factory.h @@ -0,0 +1,30 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#ifndef FACTORY_H +#define FACTORY_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class QGeoShape; +class QGeoCoordinate; + +class Factory : public QObject +{ + Q_OBJECT + QML_ELEMENT + +public: + explicit Factory(QObject *parent = nullptr); + + Q_INVOKABLE QGeoShape createShape(const QGeoCoordinate &topLeft, const QGeoCoordinate &bottomRight); + Q_INVOKABLE QGeoShape createShape(const QGeoCoordinate ¢er, qreal radius) const; +}; + +QT_END_NAMESPACE + +#endif // FACTORY_H diff --git a/tests/auto/declarative_positioning_core/main.cpp b/tests/auto/declarative_positioning_core/main.cpp new file mode 100644 index 0000000..b12d972 --- /dev/null +++ b/tests/auto/declarative_positioning_core/main.cpp @@ -0,0 +1,24 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include + +static void initializeLibraryPath() +{ +#if QT_CONFIG(library) + // Set custom path since CI doesn't install test plugins +#ifdef Q_OS_WIN + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../../plugins")); +#else + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../plugins")); +#endif +#endif +} + +Q_COREAPP_STARTUP_FUNCTION(initializeLibraryPath) + +QUICK_TEST_MAIN(declarative_positioning_core) diff --git a/tests/auto/declarative_positioning_core/properties.cpp b/tests/auto/declarative_positioning_core/properties.cpp new file mode 100644 index 0000000..3ccae1f --- /dev/null +++ b/tests/auto/declarative_positioning_core/properties.cpp @@ -0,0 +1,43 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include "properties.h" + +Properties::Properties(QObject *parent) + : QObject(parent) +{ +} + +void Properties::setCoordinate(const QGeoCoordinate &c) +{ + if (m_coordinate == c) + return; + m_coordinate = c; + emit coordinateChanged(m_coordinate); +} + +void Properties::setCoordinates(const QList &values) +{ + if (m_coordinates == values) + return; + m_coordinates = values; + emit coordinatesChanged(m_coordinates); +} + +void Properties::setRectangle(const QGeoRectangle &r) +{ + if (m_rectangle == r) + return; + m_rectangle = r; + emit rectangleChanged(m_rectangle); +} + +void Properties::setRegion(const QList ®ion) +{ + if (m_region == region) + return; + m_region = region; + emit regionChanged(m_region); +} + +#include "moc_properties.cpp" diff --git a/tests/auto/declarative_positioning_core/properties.h b/tests/auto/declarative_positioning_core/properties.h new file mode 100644 index 0000000..1f36b6d --- /dev/null +++ b/tests/auto/declarative_positioning_core/properties.h @@ -0,0 +1,54 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef PROPERTIES_H +#define PROPERTIES_H + +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Properties : public QObject +{ + Q_OBJECT + Q_PROPERTY(QGeoCoordinate coordinate READ coordinate WRITE setCoordinate NOTIFY coordinateChanged) + Q_PROPERTY(QList coordinates READ coordinates WRITE setCoordinates NOTIFY coordinatesChanged) + Q_PROPERTY(QGeoRectangle rectangle READ rectangle WRITE setRectangle NOTIFY rectangleChanged) + Q_PROPERTY(QList region READ region WRITE setRegion NOTIFY regionChanged) + QML_ELEMENT + +public: + explicit Properties(QObject *parent = nullptr); + + QGeoCoordinate coordinate() const { return m_coordinate; } + void setCoordinate(const QGeoCoordinate &c); + + QList coordinates() const { return m_coordinates; } + void setCoordinates(const QList &values); + + QGeoRectangle rectangle() const { return m_rectangle; } + void setRectangle(const QGeoRectangle &r); + + QList region() const { return m_region; } + void setRegion(const QList ®ion); + +signals: + void coordinateChanged(const QGeoCoordinate &); + void coordinatesChanged(const QList &); + void rectangleChanged(const QGeoRectangle &); + void regionChanged(const QList &); + +private: + QGeoCoordinate m_coordinate; + QList m_coordinates; + QGeoRectangle m_rectangle; + QList m_region; +}; + +QT_END_NAMESPACE + +#endif // FACTORY_H diff --git a/tests/auto/declarative_positioning_core/tst_address.qml b/tests/auto/declarative_positioning_core/tst_address.qml new file mode 100644 index 0000000..f0ce0c2 --- /dev/null +++ b/tests/auto/declarative_positioning_core/tst_address.qml @@ -0,0 +1,70 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QtTest 1.0 +import QtPositioning 6.2 + +TestCase { + id: testCase + + name: "Address" + + Address { + id: address + + street: "Evergreen Tce" + streetNumber: "742" + district: "Pressboard Estates" + city: "Springfield" + state: "Oregon" + postalCode: "8900" + country: "United States" + countryCode: "USA" + } + + function test_qmlAddressText() { + compare(address.isTextGenerated, true); + compare(address.text, "742 Evergreen Tce
Springfield, Oregon 8900
United States"); + var textChangedSpy = Qt.createQmlObject('import QtTest 1.0; SignalSpy {}', testCase, "SignalSpy"); + textChangedSpy.target = address; + textChangedSpy.signalName = "textChanged" + + var isTextGeneratedSpy = Qt.createQmlObject('import QtTest 1.0; SignalSpy {}', testCase, "SignalSpy"); + isTextGeneratedSpy.target = address + isTextGeneratedSpy.signalName = "isTextGeneratedChanged" + + address.countryCode = "FRA"; + compare(address.text, "742 Evergreen Tce
8900 Springfield
United States"); + compare(textChangedSpy.count, 1); + textChangedSpy.clear(); + compare(isTextGeneratedSpy.count, 0); + + address.countryCode = "DEU"; // the street number should go after the street name + compare(address.text, "Evergreen Tce 742
8900 Springfield
United States"); + compare(textChangedSpy.count, 1); + textChangedSpy.clear(); + compare(isTextGeneratedSpy.count, 0); + + address.text = "address label"; + compare(address.isTextGenerated, false); + compare(address.text, "address label"); + compare(textChangedSpy.count, 1); + textChangedSpy.clear(); + compare(isTextGeneratedSpy.count, 1); + isTextGeneratedSpy.clear(); + + address.countryCode = "USA"; + compare(address.text, "address label"); + compare(textChangedSpy.count, 0); + textChangedSpy.clear(); + compare(isTextGeneratedSpy.count, 0); + + address.text = ""; + compare(address.isTextGenerated, true); + compare(address.text, "742 Evergreen Tce
Springfield, Oregon 8900
United States"); + compare(textChangedSpy.count, 1); + textChangedSpy.clear(); + compare(isTextGeneratedSpy.count, 1); + isTextGeneratedSpy.clear(); + } +} diff --git a/tests/auto/declarative_positioning_core/tst_coordinate.qml b/tests/auto/declarative_positioning_core/tst_coordinate.qml new file mode 100644 index 0000000..769f14e --- /dev/null +++ b/tests/auto/declarative_positioning_core/tst_coordinate.qml @@ -0,0 +1,379 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QtQuick 2.0 +import QtTest 1.0 +import QtPositioning 6.2 + +Item { + id: item + + property var empty: QtPositioning.coordinate() + property var base: QtPositioning.coordinate(1.0, 1.0, 5.0) + property var zero: QtPositioning.coordinate(0, 0) + property var plusone: QtPositioning.coordinate(0, 1) + property var minusone: QtPositioning.coordinate(0, -1) + property var north: QtPositioning.coordinate(3, 0) + + SignalSpy { id: coordSpy; target: item; signalName: "baseChanged" } + + property var inside: QtPositioning.coordinate(0.5, 0.5) + property var outside: QtPositioning.coordinate(2, 2) + property var tl: QtPositioning.coordinate(1, 0) + property var br: QtPositioning.coordinate(0, 1) + property var box: QtPositioning.rectangle(tl, br) + + + Address { + id: validTestAddress + street: "Brandl St" + streetNumber: "53" + city: "Eight Mile Plains" + country: "Australia" + countryCode: "AUS" + } + + Location { + id: testLocation + coordinate: inside + boundingShape: box + address: validTestAddress + } + + Location { + id: invalidLocation + } + + + Item { + id: coordinateItem + property variant coordinate + property int animationDuration: 100 + property var coordinateList: [] + property int coordinateCount: 0 + + CoordinateAnimation { + id: coordinateAnimation + target: coordinateItem + property: "coordinate" + duration: coordinateItem.animationDuration + } + onCoordinateChanged: { + if (!coordinateList) { + coordinateList = [] + } + coordinateList[coordinateCount] = QtPositioning.coordinate(coordinate.latitude,coordinate.longitude) + coordinateCount++ + } + + SignalSpy { id: coordinateAnimationStartSpy; target: coordinateAnimation; signalName: "started" } + SignalSpy { id: coordinateAnimationStopSpy; target: coordinateAnimation; signalName: "stopped" } + SignalSpy { id: coordinateAnimationDirectionSpy; target: coordinateAnimation; signalName: "directionChanged" } + } + + TestCase { + name: "GeoLocation" + + function test_Location_complete() + { + compare (testLocation.coordinate.longitude, inside.longitude) + compare (testLocation.coordinate.latitude, inside.latitude) + + compare (testLocation.boundingShape.contains(inside), true) + compare (testLocation.boundingShape.contains(outside), false) + var shapeRectangle = testLocation.boundingShape.boundingGeoRectangle() + compare (shapeRectangle.bottomRight.longitude, br.longitude) + compare (shapeRectangle.bottomRight.latitude, br.latitude) + compare (shapeRectangle.topLeft.longitude, tl.longitude) + compare (shapeRectangle.topLeft.latitude, tl.latitude) + + compare (testLocation.address.country, "Australia") + compare (testLocation.address.countryCode, "AUS") + compare (testLocation.address.city, "Eight Mile Plains") + compare (testLocation.address.street, "Brandl St") + compare (testLocation.address.streetNumber, "53") + } + + function test_Location_invalid() + { + compare(invalidLocation.coordinate.isValid, false) + compare(invalidLocation.boundingShape.isEmpty, true) + compare(invalidLocation.boundingShape.isValid, false) + compare(invalidLocation.address.city, "") + } + } + + TestCase { + name: "Coordinate" + + function test_validity() + { + compare(empty.isValid, false) + + empty.longitude = 0.0; + empty.latitude = 0.0; + + compare(empty.isValid, true) + } + + function test_accessors() + { + compare(base.longitude, 1.0) + compare(base.latitude, 1.0) + compare(base.altitude, 5.0) + + coordSpy.clear() + + base.longitude = 2.0 + base.latitude = 3.0 + base.altitude = 6.0 + + compare(base.longitude, 2.0) + compare(base.latitude, 3.0) + compare(base.altitude, 6.0) + // changing individual properties does *not* trigger + // change notification + compare(coordSpy.count, 0) + + // updating the whole object *does* trigger change notification + base = QtPositioning.coordinate(3.0, 4.0, 5.0) + compare(base.latitude, 3.0) + compare(base.longitude, 4.0) + compare(base.altitude, 5.0) + compare(coordSpy.count, 1) + } + + function test_comparison_data() + { + return [ + { tag: "empty", coord1: empty, coord2: QtPositioning.coordinate(), result: true }, + { tag: "zero", coord1: zero, coord2: QtPositioning.coordinate(0, 0), result: true }, + { tag: "plusone", coord1: plusone, coord2: QtPositioning.coordinate(0, 1), result: true }, + { tag: "minusone", coord1: minusone, coord2: QtPositioning.coordinate(0, -1), result: true }, + { tag: "north", coord1: north, coord2: QtPositioning.coordinate(3, 0), result: true }, + { tag: "lat,long.alt", coord1: QtPositioning.coordinate(1.1, 2.2, 3.3), coord2: QtPositioning.coordinate(1.1, 2.2, 3.3), result: true }, + { tag: "not equal1", coord1: plusone, coord2: minusone, result: false }, + { tag: "not equal2", coord1: plusone, coord2: north, result: false } + ] + } + + function test_comparison(data) + { + compare(data.coord1 === data.coord2, data.result) + compare(data.coord1 !== data.coord2, !data.result) + compare(data.coord1 == data.coord2, data.result) + compare(data.coord1 != data.coord2, !data.result) + } + + function test_distance() + { + compare(zero.distanceTo(plusone), zero.distanceTo(minusone)) + compare(2*plusone.distanceTo(zero), plusone.distanceTo(minusone)) + compare(zero.distanceTo(plusone) > 0, true) + } + + function test_azimuth() + { + compare(zero.azimuthTo(north), 0) + compare(zero.azimuthTo(plusone), 90) + compare(zero.azimuthTo(minusone), 270) + compare(minusone.azimuthTo(plusone), 360 - plusone.azimuthTo(minusone)) + } + + function test_atDistanceAndAzimuth() + { + // 112km is approximately one degree of arc + + var coord_0d = zero.atDistanceAndAzimuth(112000, 0) + compare(coord_0d.latitude > 0.95, true) + compare(coord_0d.latitude < 1.05, true) + compare(coord_0d.longitude < 0.05, true) + compare(coord_0d.longitude > -0.05, true) + compare(zero.distanceTo(coord_0d), 112000) + compare(zero.azimuthTo(coord_0d), 0) + + var coord_90d = zero.atDistanceAndAzimuth(112000, 90) + compare(coord_90d.longitude > 0.95, true) + compare(coord_90d.longitude < 1.05, true) + compare(coord_90d.latitude < 0.05, true) + compare(coord_90d.latitude > -0.05, true) + compare(zero.distanceTo(coord_90d), 112000) + compare(zero.azimuthTo(coord_90d), 90) + + var coord_30d = zero.atDistanceAndAzimuth(20000, 30) + compare(coord_30d.longitude > 0, true) + compare(coord_30d.latitude > 0, true) + compare(zero.distanceTo(coord_30d), 20000) + compare(zero.azimuthTo(coord_30d), 30) + + var coord_30d2 = coord_30d.atDistanceAndAzimuth(200, 30) + compare(zero.distanceTo(coord_30d2), 20200) + } + } + + TestCase { + name: "CoordinateAnimation" + + function init() + { + coordinateAnimation.stop() + coordinateAnimationStartSpy.clear() + coordinateAnimationStopSpy.clear() + coordinateAnimationDirectionSpy.clear() + coordinateAnimation.from = QtPositioning.coordinate(50,50) + coordinateAnimation.to = QtPositioning.coordinate(50,50) + coordinateAnimation.direction = CoordinateAnimation.Shortest + coordinateItem.coordinate = QtPositioning.coordinate(50,50) + coordinateItem.coordinateList = [] + coordinateItem.coordinateCount = 0 + } + + function initTestCase() + { + compare(coordinateAnimation.direction, CoordinateAnimation.Shortest) + compare(coordinateAnimationDirectionSpy.count,0) + coordinateAnimation.direction = CoordinateAnimation.Shortest + compare(coordinateAnimationDirectionSpy.count,0) + coordinateAnimation.direction = CoordinateAnimation.West + compare(coordinateAnimationDirectionSpy.count,1) + coordinateAnimation.direction = CoordinateAnimation.East + compare(coordinateAnimationDirectionSpy.count,2) + } + + function toMercator(coord) + { + var p = QtPositioning.coordToMercator(coord) + var lat = p.y + var lon = p.x + return {'latitude': lat, 'longitude': lon}; + } + + function coordinate_animation(from, to, movingEast) + { + var fromMerc = toMercator(from) + var toMerc = toMercator(to) + var delta = (toMerc.latitude - fromMerc.latitude) / (toMerc.longitude - fromMerc.longitude) + + compare(coordinateItem.coordinateList.length, 0); + coordinateAnimation.from = from + coordinateAnimation.to = to + coordinateAnimation.start() + tryCompare(coordinateAnimationStartSpy,"count",1) + tryCompare(coordinateAnimationStopSpy,"count",1) + + //check correct start position + verify(coordinateItem.coordinateList.length != 0) + compare(coordinateItem.coordinateList[0], from) + //check correct end position + compare(coordinateItem.coordinateList[coordinateItem.coordinateList.length - 1],to) + + var i + var lastLongitude + for (i in coordinateItem.coordinateList) { + var coordinate = coordinateItem.coordinateList[i] + var mercCoordinate = toMercator(coordinate) + + //check that coordinates from the animation is along a straight line between from and to + var estimatedLatitude = fromMerc.latitude + (mercCoordinate.longitude - fromMerc.longitude) * delta + verify(mercCoordinate.latitude - estimatedLatitude < 0.00000000001); + + //check that each step has moved in the right direction + + if (lastLongitude) { + var errorMessage = "movingEast: " + movingEast + "; From: " + from + "; To: " + to + "; i: " + i + "; crdList: " + coordinateItem.coordinateList + if (movingEast) { + if (coordinate.longitude < 0 && lastLongitude > 0) + verify(coordinate.longitude + 360 > lastLongitude, errorMessage) + else + verify(coordinate.longitude > lastLongitude, errorMessage) + } else { + if (coordinate.longitude > 0 && lastLongitude < 0) + verify(coordinate.longitude < lastLongitude + 360, errorMessage) + else + verify(coordinate.longitude < lastLongitude, errorMessage) + } + } + lastLongitude = coordinate.longitude + } + } + + function test_default_coordinate_animation(data) + { + //shortest + coordinate_animation(data.from, data.to, data.east) + } + + function test_default_coordinate_animation_data() + { + return [ + { + from: QtPositioning.coordinate(58.0, 12.0), + to: QtPositioning.coordinate(62.0, 24.0), + east: true + }, + { + from: QtPositioning.coordinate(58.0, 24.0), + to: QtPositioning.coordinate(42.0, 12.0), + east: false + }, + // cross 0 + { + from: QtPositioning.coordinate(30, 10), + to: QtPositioning.coordinate(20, -10), + east: false + }, + { + from: QtPositioning.coordinate(30, -20), + to: QtPositioning.coordinate(20, 10), + east: true + }, + // cross 180 + { + from: QtPositioning.coordinate(30, 170), + to: QtPositioning.coordinate(30, -170), + east: true + }, + { + from: QtPositioning.coordinate(30, -170), + to: QtPositioning.coordinate(30, 170), + east: false + }, + ] + } + + function test_east_direction_coordinate_animation(data) + { + coordinateAnimation.direction = CoordinateAnimation.East + coordinate_animation(data.from, + data.to, + true) + } + + function test_east_direction_coordinate_animation_data() + { + return [ + { from: QtPositioning.coordinate(58.0,24.0), to: QtPositioning.coordinate(58.0,12.0) }, + { from: QtPositioning.coordinate(58.0,12.0), to: QtPositioning.coordinate(58.0,24.0) }, + ] + } + + + function test_west_direction_coordinate_animation(data) + { + coordinateAnimation.direction = CoordinateAnimation.West + coordinate_animation(data.from, + data.to, + false) + } + + function test_west_direction_coordinate_animation_data() + { + return [ + { from: QtPositioning.coordinate(58.0,24.0),to: QtPositioning.coordinate(58.0,12.0) }, + { from: QtPositioning.coordinate(58.0,12.0),to: QtPositioning.coordinate(58.0,24.0) }, + ] + } + + + } +} diff --git a/tests/auto/declarative_positioning_core/tst_geoshape.qml b/tests/auto/declarative_positioning_core/tst_geoshape.qml new file mode 100644 index 0000000..fa0b8a4 --- /dev/null +++ b/tests/auto/declarative_positioning_core/tst_geoshape.qml @@ -0,0 +1,318 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QtQuick 2.0 +import QtTest 1.0 +import QtPositioning 5.2 +import TestFactory 1.0 + +Item { + id: testCase + + property var coordinate1: QtPositioning.coordinate(1, 1) + property var coordinate2: QtPositioning.coordinate(2, 2) + property var coordinate3: QtPositioning.coordinate(80, 80) + + property var emptyCircle: QtPositioning.circle() + property var circle1: QtPositioning.circle(coordinate1, 200000) + + SignalSpy { id: circleChangedSpy; target: testCase; signalName: "emptyCircleChanged" } + + TestCase { + name: "Bounding circle" + function test_circle_defaults_and_setters() { + circleChangedSpy.clear(); + compare (emptyCircle.radius, -1) + compare (circle1.radius, 200000) + + emptyCircle.radius = 200 + compare(emptyCircle.radius, 200) + + emptyCircle.center = coordinate1 + compare(emptyCircle.center, coordinate1) + + emptyCircle.center = coordinate2 + compare(emptyCircle.center, coordinate2) + + emptyCircle = QtPositioning.circle(coordinate1, 200000) + compare(emptyCircle.center, coordinate1) + compare(emptyCircle.radius, 200000) + // signal is triggered only when we update the whole object + compare(circleChangedSpy.count, 1) + + compare(emptyCircle.contains(coordinate1), true); + compare(emptyCircle.contains(coordinate2), true); + compare(emptyCircle.contains(coordinate3), false); + } + } + + property var trace1 : [ QtPositioning.coordinate(43.773175, 11.255386), + QtPositioning.coordinate(43.773546 , 11.255372) ] + property var trace2 : [ QtPositioning.coordinate(43.773175, 11.255386), + QtPositioning.coordinate(43.773546 , 11.255372), + QtPositioning.coordinate(43.77453 , 11.255734) ] + + + // coordinate unit square + property var bl: QtPositioning.coordinate(0, 0) + property var tl: QtPositioning.coordinate(1, 0) + property var tr: QtPositioning.coordinate(1, 1) + property var br: QtPositioning.coordinate(0, 1) + property var ntr: QtPositioning.coordinate(3, 3) + + property var invalid: QtPositioning.coordinate(100, 190) + property var inside: QtPositioning.coordinate(0.5, 0.5) + property var outside: QtPositioning.coordinate(2, 2) + + property var box: QtPositioning.rectangle(tl, br) + + property var coordinates: [bl, tl, tr, br] + property var coordinates2: [bl, tl, tr, br, ntr] + property var coordinates3: [tr] + property var coordinates4: [invalid] + property var coordinates5: [] + + property var listBox: QtPositioning.rectangle(coordinates) + property var listBox2: QtPositioning.rectangle(coordinates2) + property var listBox3: QtPositioning.rectangle(coordinates3) + property var listBox4: QtPositioning.rectangle(coordinates4) + property var listBox5: QtPositioning.rectangle(coordinates5) + + property var widthBox: QtPositioning.rectangle(inside, 1, 1); + + // C++ auto test exists for basics of bounding box, testing here + // only added functionality + TestCase { + name: "Bounding box" + function test_box_defaults_and_setters() { + compare (box.bottomRight.longitude, br.longitude) // sanity + compare (box.contains(bl), true) + compare (box.contains(inside), true) + compare (box.contains(outside), false) + box.topRight = ntr + compare (box.contains(outside), true) + + compare (listBox.isValid, true) + compare (listBox.contains(outside), false) + compare (listBox2.contains(outside), true) + compare (listBox3.isValid, true) + compare (listBox3.isEmpty, true) + compare (listBox4.isValid, false) + compare (listBox5.isValid, false) + + compare (widthBox.contains(inside), true) + compare (widthBox.contains(outside), false) + } + } + + TestCase { + name: "Shape" + + function test_shape_comparison_data() { + return [ + { tag: "invalid shape", shape1: QtPositioning.shape(), shape2: QtPositioning.shape(), result: true }, + { tag: "box equal", shape1: box, shape2: QtPositioning.rectangle(tl, br), result: true }, + { tag: "box not equal", shape1: box, shape2: QtPositioning.rectangle([inside, outside]), result: false }, + { tag: "box invalid shape", rect1: box, shape2: QtPositioning.shape(), result: false }, + { tag: "invalid rectangle", shape1: QtPositioning.rectangle(), shape2: QtPositioning.rectangle(), result: true }, + { tag: "invalid rectangle2", shape1: QtPositioning.rectangle(), shape2: QtPositioning.shape(), result: false }, + { tag: "circle1 equal", shape1: circle1, shape2: QtPositioning.circle(coordinate1, 200000), result: true }, + { tag: "circle1 not equal", shape1: circle1, shape2: QtPositioning.circle(coordinate2, 2000), result: false }, + { tag: "circle1 invalid shape", shape1: circle1, shape2: QtPositioning.shape(), result: false }, + { tag: "invalid circle", shape1: QtPositioning.circle(), shape2: QtPositioning.circle(), result: true }, + { tag: "invalid circle2", shape1: QtPositioning.circle(), shape2: QtPositioning.shape(), result: false } + ] + } + + function test_shape_comparison(data) { + compare(data.shape1 === data.shape2, data.result) + compare(data.shape1 !== data.shape2, !data.result) + compare(data.shape1 == data.shape2, data.result) + compare(data.shape1 != data.shape2, !data.result) + } + } + + TestCase { + name: "Conversions" + + function test_shape_circle_conversions() { + var circle = QtPositioning.shapeToCircle(QtPositioning.shape()) + verify(!circle.isValid) + circle = QtPositioning.shapeToCircle(QtPositioning.circle()) + verify(!circle.isValid) + circle = QtPositioning.shapeToCircle(QtPositioning.circle(tl, 10000)) + verify(circle.isValid) + compare(circle.center, tl) + compare(circle.radius, 10000) + circle = QtPositioning.shapeToCircle(QtPositioning.rectangle()) + verify(!circle.isValid) + circle = QtPositioning.shapeToCircle(QtPositioning.rectangle(tl, br)) + verify(!circle.isValid) + circle = QtPositioning.shapeToCircle(listBox) + verify(!circle.isValid) + } + + function test_shape_rectangle_conversions() { + var rectangle = QtPositioning.shapeToRectangle(QtPositioning.shape()) + verify(!rectangle.isValid) + rectangle = QtPositioning.shapeToRectangle(QtPositioning.circle()) + verify(!rectangle.isValid) + rectangle = QtPositioning.shapeToRectangle(QtPositioning.circle(tl, 10000)) + verify(!rectangle.isValid) + rectangle = QtPositioning.shapeToRectangle(QtPositioning.rectangle()) + verify(!rectangle.isValid) + rectangle = QtPositioning.shapeToRectangle(QtPositioning.rectangle(tl, br)) + verify(rectangle.isValid) + compare(rectangle.topLeft, tl) + compare(rectangle.bottomRight, br) + rectangle = QtPositioning.shapeToRectangle(listBox) + verify(rectangle.isValid) + } + + function test_shape_path_conversions() { + var path = QtPositioning.shapeToPath(QtPositioning.shape()) + verify(!path.isValid) + path = QtPositioning.shapeToPath(QtPositioning.circle()) + verify(!path.isValid) + path = QtPositioning.shapeToPath(QtPositioning.circle(tl, 10000)) + verify(!path.isValid) + path = QtPositioning.shapeToPath(QtPositioning.rectangle()) + verify(!path.isValid) + path = QtPositioning.shapeToPath(QtPositioning.rectangle(tl, br)) + verify(!path.isValid) + + path = QtPositioning.shapeToPath(QtPositioning.path()) + verify(!path.isValid) + path = QtPositioning.shapeToPath(QtPositioning.path(trace1, 1)) + verify(path.isValid) + path = QtPositioning.shapeToPath(QtPositioning.path(trace2, 2)) + verify(path.isValid) + verify(path !== QtPositioning.shapeToPath(QtPositioning.path(trace1, 1))) + compare(path, QtPositioning.shapeToPath(QtPositioning.path(trace2, 2))) + } + + function test_shape_polygon_conversions() { + var polygon = QtPositioning.shapeToPolygon(QtPositioning.shape()) + verify(!polygon.isValid) + polygon = QtPositioning.shapeToPolygon(QtPositioning.circle()) + verify(!polygon.isValid) + polygon = QtPositioning.shapeToPolygon(QtPositioning.circle(tl, 10000)) + verify(polygon.isValid) // fixed, polygon copy constructor can now initialize from a circle. + polygon = QtPositioning.shapeToPolygon(QtPositioning.rectangle()) + verify(!polygon.isValid) + polygon = QtPositioning.shapeToPolygon(QtPositioning.rectangle(tl, br)) + verify(polygon.isValid) // fixed, polygon copy constructor can now initialize from a rectangle. + + polygon = QtPositioning.shapeToPolygon(QtPositioning.polygon()) + verify(!polygon.isValid) + polygon = QtPositioning.shapeToPolygon(QtPositioning.polygon(trace1)) + verify(!polygon.isValid) // polygon needs 3 coords at least + polygon = QtPositioning.shapeToPolygon(QtPositioning.polygon(trace2)) + verify(polygon.isValid) + verify(polygon !== QtPositioning.shapeToPolygon(QtPositioning.polygon(trace1))) + compare(polygon, QtPositioning.shapeToPolygon(QtPositioning.polygon(trace2))) + } + } + + TestCase { + name: "Properties" + Properties { + id: properties + coordinate: QtPositioning.coordinate(12.5, 23.6) + coordinates: [ + { latitude: 1.1, longitude: 2.2 }, + { latitude: 3.3, longitude: 4.4, altitude: 5.5 } + ] + rectangle: box + region: [ + { + topLeft: { latitude: 3.3, longitude: 2.2 }, + bottomRight: { latitude: 1.1, longitude: 4.4 } + }, + { + bottomLeft: { latitude: 1.1, longitude: 2.2 }, + topRight: { latitude: 3.3, longitude: 4.4 } + }, + { + center: { latitude: 5.5, longitude: 6.6 }, + width: 0.5, + height: 0.1 + } + ] + } + + function test_initialization() { + compare(properties.coordinate, QtPositioning.coordinate(12.5, 23.6)) + compare(properties.coordinates.length, 2) + compare(properties.coordinates[0], QtPositioning.coordinate(1.1, 2.2)) + compare(properties.coordinates[1], QtPositioning.coordinate(3.3, 4.4, 5.5)) + + compare(properties.rectangle, box) + compare(properties.region.length, 3) + var r = QtPositioning.rectangle(QtPositioning.coordinate(3.3, 2.2), + QtPositioning.coordinate(1.1, 4.4)) + compare(properties.region[0], r) + compare(properties.region[1], r) + compare(properties.region[2], QtPositioning.rectangle(QtPositioning.coordinate(5.5, 6.6), 0.5, 0.1)) + } + } + + TestCase { + name: "GeoPath path" + function test_qgeopath_path_operations() { + var geopath = QtPositioning.path() + + geopath.path = trace2 + compare(geopath.path.length, trace2.length) + + geopath.path = trace2 + geopath.path[0].longitude = 11.0 + compare(geopath.path.length, trace2.length) + compare(geopath.coordinateAt(0).latitude, trace2[0].latitude) + expectFail("", "Longitude comparison fails") + compare(geopath.coordinateAt(0).longitude, 11) + } + } + + TestCase { + name: "GeoPolygon path" + function test_qgeopolygon_path_operations() { + var geopolygon = QtPositioning.polygon() + + geopolygon.perimeter = trace2 + compare(geopolygon.perimeter.length, trace2.length) + + geopolygon.perimeter = trace2 + compare(geopolygon.perimeter.length, trace2.length) + compare(geopolygon.coordinateAt(0).latitude, trace2[0].latitude) + compare(geopolygon.coordinateAt(0).longitude, trace2[0].longitude) + } + } + + Factory { + id: factory + } + + TestCase { + name: "GeoShape factory" + function test_geoshape_factory_construction() { + // Both createShape() methods return QGeoShape. We check that + // invokable methods and properties are called for correct + // objects + var c0 = QtPositioning.coordinate(1.0, 1.0) + var c1 = QtPositioning.coordinate(1.0001, 1.0001) + var c2 = QtPositioning.coordinate(0.5, 0.5) + var circle = factory.createShape(c0, 100.0) + verify(circle.contains(c1)) + verify(!circle.contains(c2)) + compare(circle.center, c0) + + var rectangle = factory.createShape(QtPositioning.coordinate(1.0, 0.0), QtPositioning.coordinate(0.0, 1.0)) + verify(rectangle.contains(c2)) + verify(!rectangle.contains(c1)) + compare(rectangle.center, c2) + + verify(rectangle.center !== circle.center) + } + } +} diff --git a/tests/auto/declarative_positioning_core/tst_position.qml b/tests/auto/declarative_positioning_core/tst_position.qml new file mode 100644 index 0000000..8b1cacd --- /dev/null +++ b/tests/auto/declarative_positioning_core/tst_position.qml @@ -0,0 +1,27 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QtQuick 2.0 +import QtTest 1.0 +import QtPositioning 5.3 + +TestCase { + id: testCase + + name: "Position" + + Position { id: defaultPosition } + + function test_defaults() { + compare(defaultPosition.latitudeValid, false); + compare(defaultPosition.longitudeValid, false); + compare(defaultPosition.altitudeValid, false); + compare(defaultPosition.speedValid, false); + compare(defaultPosition.horizontalAccuracyValid, false); + compare(defaultPosition.verticalAccuracyValid, false); + verify(!defaultPosition.directionValid); + verify(isNaN(defaultPosition.direction)); + verify(!defaultPosition.verticalSpeedValid); + verify(isNaN(defaultPosition.verticalSpeed)); + } +} diff --git a/tests/auto/declarative_positioning_core/tst_positionsource.qml b/tests/auto/declarative_positioning_core/tst_positionsource.qml new file mode 100644 index 0000000..d153dd3 --- /dev/null +++ b/tests/auto/declarative_positioning_core/tst_positionsource.qml @@ -0,0 +1,420 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QtQuick 2.0 +import QtTest 1.0 +import QtPositioning 5.14 + +TestCase { + id: testCase + + name: "PositionSource" + + PositionSource { id: defaultSource } + PositionSource + { + id: activeDefaultSource + active: true + } + + SignalSpy { id: defaultSourceSpy; target: defaultSource; signalName: "positionChanged" } + + function test_activeDefaultSource() { + wait(0); + verify(activeDefaultSource.name !== ""); + compare(activeDefaultSource.active, true); + } + + function test_invalidSource() { + activeDefaultSource.name = "invalid_positioning_source"; + verify(!activeDefaultSource.active); + verify(!activeDefaultSource.valid); + } + + function test_defaults() { + // at least the test.source plugin should be available + verify(defaultSource.name != ""); + compare(defaultSource.active, false); + } + + function test_inactive() { + defaultSourceSpy.clear(); + compare(defaultSourceSpy.count, 0); + wait(1000); + compare(defaultSourceSpy.count, 0); + } + + PositionSource { id: testSetSource; name: "nonexistent bogus plugin" } + SignalSpy { id: testingSourcePluginSpy; target: testSetSource; signalName: "nameChanged" } + + function test_setplugin() { + testingSourcePluginSpy.clear(); + + // On construction, if the provided source name is invalid, the default source will be + // used. Test that the source is valid as expected. + verify(testSetSource.name !== ""); + //we don't really know what the default source is named. + //It may not be "test.source" + var defaultSourceName = testSetSource.name; + verify(testSetSource.valid); + + // Test that setting name to "" will still use the default. + testSetSource.name = ""; + compare(testingSourcePluginSpy.count, 0); + compare(testSetSource.name, defaultSourceName); + verify(testSetSource.valid); + + testSetSource.name = "test.source"; + if (defaultSourceName === "test.source") + compare(testingSourcePluginSpy.count, 0); + compare(testSetSource.name, "test.source"); + verify(testSetSource.valid); + testingSourcePluginSpy.clear(); + + testSetSource.name = "bogus"; + compare(testingSourcePluginSpy.count, 1); + verify(!testSetSource.valid); + } + + PositionSource { id: testingSource; name: "test.source"; updateInterval: 1000 } + + PositionSource { + id: testingSourceWParams + name: "test.source" + updateInterval: 200 + PluginParameter { + id: altitudeParameter + name: "test.source.altitude" + value: 42.42 + } + } + + // use property bindings instead of SignalSpy + property bool directionWParamsValid: testingSourceWParams.position.directionValid + property int directionWParamsValidChangedCount: 0 + onDirectionWParamsValidChanged: { + ++directionWParamsValidChangedCount + } + + property real directionWParams: testingSourceWParams.position.direction + property int directionWParamsChangedCount: 0 + onDirectionWParamsChanged: { + ++directionWParamsChangedCount + } + + SignalSpy { id: updateSpyWParams; target: testingSourceWParams; signalName: "positionChanged" } + + PositionSource { id: testingSourceV1; name: "test.source"; updateInterval: 200 } + + // use property bindings instead of SignalSpy + property bool directionV1Valid: testingSourceV1.position.directionValid + property int directionV1ValidChangedCount: 0 + onDirectionV1ValidChanged: { + ++directionV1ValidChangedCount + } + + property real directionV1: testingSourceV1.position.direction + property int directionV1ChangedCount: 0 + onDirectionV1Changed: { + ++directionV1ChangedCount + } + + SignalSpy { id: updateSpyV1; target: testingSourceV1; signalName: "positionChanged" } + + function test_updateInterval() { + testingSource.updateInterval = 200; + compare(testingSource.updateInterval, 200); + testingSource.updateInterval = 300; + compare(testingSource.updateInterval, 300); + testingSource.updateInterval = 100; + compare(testingSource.updateInterval, 200); + } + + function test_preferredPositioningMethods() { + testingSource.preferredPositioningMethods = PositionSource.AllPositioningMethods; + compare(testingSource.preferredPositioningMethods, PositionSource.AllPositioningMethods); + testingSource.preferredPositioningMethods = PositionSource.SatellitePositioningMethods; + compare(testingSource.preferredPositioningMethods, PositionSource.SatellitePositioningMethods); + testingSource.preferredPositioningMethods = PositionSource.NonSatellitePositioningMethods; + compare(testingSource.preferredPositioningMethods, PositionSource.NonSatellitePositioningMethods); + } + + function test_updates() { + updateSpyV1.clear(); + + directionV1ChangedCount = 0 + directionV1ValidChangedCount = 0 + + testingSourceV1.active = true; + + tryCompare(updateSpyV1, "count", 1, 300); + compare(testingSourceV1.position.coordinate.longitude, 0.1); + compare(testingSourceV1.position.coordinate.latitude, 0.1); + compare(directionV1ValidChangedCount, 1) + compare(directionV1ChangedCount, 1) + fuzzyCompare(testingSourceV1.position.direction, 45, 0.1) + verify(!testingSourceV1.position.speedValid) + verify(isNaN(testingSourceV1.position.speed)) + + tryCompare(updateSpyV1, "count", 2, 300); + compare(testingSourceV1.position.coordinate.longitude, 0.2); + compare(testingSourceV1.position.coordinate.latitude, 0.2); + compare(directionV1ValidChangedCount, 1) + compare(directionV1ChangedCount, 2) + fuzzyCompare(testingSourceV1.position.direction, 45, 0.1) + verify(testingSourceV1.position.speedValid) + verify(testingSourceV1.position.speed > 10000) + + testingSourceV1.active = false; + wait(300); + compare(updateSpyV1.count, 2); + compare(testingSourceV1.position.coordinate.longitude, 0.2); + compare(testingSourceV1.position.coordinate.latitude, 0.2); + compare(directionV1ValidChangedCount, 1) + compare(directionV1ChangedCount, 2) + fuzzyCompare(testingSourceV1.position.direction, 45, 0.1) + verify(testingSourceV1.position.speedValid) + verify(testingSourceV1.position.speed > 10000) + } + + function test_updates_w_params() { + updateSpyWParams.clear(); + + directionWParamsChangedCount = 0 + directionWParamsValidChangedCount = 0 + compare(testingSourceWParams.backendProperty("altitude"), altitudeParameter.value) + testingSourceWParams.active = true; + + tryCompare(updateSpyWParams, "count", 1, 300); + compare(testingSourceWParams.position.coordinate.longitude, 0.1); + compare(testingSourceWParams.position.coordinate.latitude, 0.1); + compare(testingSourceWParams.position.coordinate.altitude, altitudeParameter.value); + compare(directionWParamsValidChangedCount, 1) + compare(directionWParamsChangedCount, 1) + fuzzyCompare(testingSourceWParams.position.direction, 45, 0.1) + verify(!testingSourceWParams.position.speedValid) + verify(isNaN(testingSourceWParams.position.speed)) + testingSourceWParams.setBackendProperty("altitude", 24.24) + + tryCompare(updateSpyWParams, "count", 2, 300); + compare(testingSourceWParams.position.coordinate.longitude, 0.2); + compare(testingSourceWParams.position.coordinate.latitude, 0.2); + compare(testingSourceWParams.position.coordinate.altitude, 24.24); + compare(directionWParamsValidChangedCount, 1) + compare(directionWParamsChangedCount, 2) + fuzzyCompare(testingSourceWParams.position.direction, 45, 0.1) + verify(testingSourceWParams.position.speedValid) + verify(testingSourceWParams.position.speed > 10000) + compare(testingSourceWParams.backendProperty("altitude"), 24.24) + + testingSourceWParams.active = false; + wait(300); + compare(updateSpyWParams.count, 2); + compare(testingSourceWParams.position.coordinate.longitude, 0.2); + compare(testingSourceWParams.position.coordinate.latitude, 0.2); + compare(testingSourceWParams.position.coordinate.altitude, 24.24); + compare(directionWParamsValidChangedCount, 1) + compare(directionWParamsChangedCount, 2) + fuzzyCompare(testingSourceWParams.position.direction, 45, 0.1) + verify(testingSourceWParams.position.speedValid) + verify(testingSourceWParams.position.speed > 10000) + } + + // tests for bindings + PositionSource { + id: testSourceForBindings + name: "test.source" + } + + property var positionObserver: testSourceForBindings.position + SignalSpy { + id: positionObserverSpy; target: testSourceForBindings; signalName: "positionChanged" + } + + property bool activeObserver: testSourceForBindings.active + SignalSpy { + id: activeObserverSpy; target: testSourceForBindings; signalName: "activeChanged" + } + + property bool validObserver: testSourceForBindings.valid + SignalSpy { + id: validObserverSpy; target: testSourceForBindings; signalName: "validityChanged" + } + + property int updateIntervalObserver: testSourceForBindings.updateInterval + SignalSpy { + id: updateIntervalObserverSpy; target: testSourceForBindings; signalName: "updateIntervalChanged" + } + + property int supportedMethodsObserver: testSourceForBindings.supportedPositioningMethods + SignalSpy { + id: supportedMethodsObserverSpy; target: testSourceForBindings; signalName: "supportedPositioningMethodsChanged" + } + + property int preferredMethodsObserver: testSourceForBindings.preferredPositioningMethods + SignalSpy { + id: preferredMethodsObserverSpy; + target: testSourceForBindings; + signalName: "preferredPositioningMethodsChanged" + } + + property int errorObserver: testSourceForBindings.sourceError + SignalSpy { + id: errorObserverSpy; target: testSourceForBindings; signalName: "sourceErrorChanged" + } + + property string nameObserver: testSourceForBindings.name + SignalSpy { + id: nameObserverSpy; target: testSourceForBindings; signalName: "nameChanged" + } + + function test_bindingsToPositionSource() { + positionObserverSpy.clear() + activeObserverSpy.clear() + validObserverSpy.clear() + updateIntervalObserverSpy.clear() + supportedMethodsObserverSpy.clear() + preferredMethodsObserverSpy.clear() + errorObserverSpy.clear() + nameObserverSpy.clear() + + verify(testSourceForBindings.valid) + compare(testSourceForBindings.supportedPositioningMethods, PositionSource.AllPositioningMethods) + + testSourceForBindings.preferredPositioningMethods = PositionSource.SatellitePositioningMethods + compare(preferredMethodsObserver, PositionSource.SatellitePositioningMethods) + compare(preferredMethodsObserverSpy.count, 1) + + testSourceForBindings.updateInterval = 210; + compare(updateIntervalObserver, 210) + compare(updateIntervalObserverSpy.count, 1) + + testSourceForBindings.start(); + compare(activeObserver, true) + compare(activeObserverSpy.count, 1) + + tryCompare(positionObserverSpy, "count", 1, 300); + verify(testSourceForBindings.position.coordinate !== QtPositioning.coordinate()) + + testSourceForBindings.update(50) // small timeout will result in an error + tryCompare(errorObserverSpy, "count", 1, 200) + compare(errorObserver, PositionSource.UpdateTimeoutError) + + var newSourceName = "some invalid name" + testSourceForBindings.name = newSourceName + + compare(validObserver, false) + compare(validObserverSpy.count, 1) + + compare(nameObserver, newSourceName) + compare(nameObserverSpy.count, 1) + + compare(supportedMethodsObserver, PositionSource.NoPositioningMethods) + compare(supportedMethodsObserverSpy.count, 1) + } + + property bool activeSetter: false + property string nameSetter: "test.source" + property int updateIntervalSetter: 200 + property int preferredMethodsSetter: PositionSource.NonSatellitePositioningMethods + + PositionSource { + id: sourceWithBindings + name: nameSetter + active: activeSetter + updateInterval: updateIntervalSetter + preferredPositioningMethods: preferredMethodsSetter + } + + function test_bindPositionSourceProperties() { + compare(sourceWithBindings.name, "test.source") + compare(sourceWithBindings.active, false) + compare(sourceWithBindings.updateInterval, 200) + compare(sourceWithBindings.preferredPositioningMethods, PositionSource.NonSatellitePositioningMethods) + + updateIntervalSetter = 210; + preferredMethodsSetter = PositionSource.AllPositioningMethods + activeSetter = true + + wait(0) // to trigger event processing + + compare(sourceWithBindings.active, true) + compare(sourceWithBindings.updateInterval, 210) + compare(sourceWithBindings.preferredPositioningMethods, PositionSource.AllPositioningMethods) + + activeSetter = false; + + compare(sourceWithBindings.active, false) + + // check how call to update() effects the binding + sourceWithBindings.update(updateIntervalSetter) + compare(sourceWithBindings.active, true) + + wait(300) + compare(sourceWithBindings.active, false) + + activeSetter = true; + wait(0) // to trigger event processing + // the binding is *not* broken by calling update() + compare(sourceWithBindings.active, true) + } + + function test_updateIntervalBindings() { + var updateIntervalSpy = Qt.createQmlObject('import QtTest; SignalSpy { }', testCase) + updateIntervalSpy.target = sourceWithBindings + updateIntervalSpy.signalName = "updateIntervalChanged" + verify(updateIntervalSpy.valid) + + nameSetter = "invalid name" + updateIntervalSetter = 100; + compare(sourceWithBindings.updateInterval, 100) + compare(updateIntervalSpy.count, 1) + + nameSetter = "test.source" + // "test.source" has a minimum update interval of 200 + compare(sourceWithBindings.updateInterval, 200) + compare(updateIntervalSpy.count, 2) + + nameSetter = "dummy.source" + // "dummy.source" has a minimum udpate interval of 100, so we expect + // the updateInterval to be set to 100 + compare(sourceWithBindings.updateInterval, 100) + compare(updateIntervalSpy.count, 3) + + // The binding still works + updateIntervalSetter = 110 + compare(sourceWithBindings.updateInterval, 110) + compare(updateIntervalSpy.count, 4) + } + + function test_preferredPositioningMethodsBindings() { + var preferredMethodsSpy = Qt.createQmlObject('import QtTest; SignalSpy { }', testCase) + preferredMethodsSpy.target = sourceWithBindings + preferredMethodsSpy.signalName = "preferredPositioningMethodsChanged" + verify(preferredMethodsSpy.valid) + + nameSetter = "invalid name" + preferredMethodsSetter = PositionSource.SatellitePositioningMethods + compare(sourceWithBindings.preferredPositioningMethods, PositionSource.SatellitePositioningMethods) + compare(preferredMethodsSpy.count, 1) + + nameSetter = "dummy.source" + // "dummy.source" has only NonSatellitePositioningMethods, so we expect + // the value to be set to NonSatellitePositioningMethods (see + // QGeoPositionInfoSource::setPreferredPositioningMethods for details) + compare(sourceWithBindings.preferredPositioningMethods, PositionSource.NonSatellitePositioningMethods) + compare(preferredMethodsSpy.count, 2) + + nameSetter = "test.source" + // "test.source" has all positioning methods, so we expect the value to + // be set to the desired SatellitePositioningMethods + compare(sourceWithBindings.preferredPositioningMethods, PositionSource.SatellitePositioningMethods) + compare(preferredMethodsSpy.count, 3) + + // The binding still works + preferredMethodsSetter = PositionSource.AllPositioningMethods + compare(sourceWithBindings.preferredPositioningMethods, PositionSource.AllPositioningMethods) + compare(preferredMethodsSpy.count, 4) + } + +} diff --git a/tests/auto/declarative_satellitesource/CMakeLists.txt b/tests/auto/declarative_satellitesource/CMakeLists.txt new file mode 100644 index 0000000..b794b03 --- /dev/null +++ b/tests/auto/declarative_satellitesource/CMakeLists.txt @@ -0,0 +1,37 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +file(GLOB_RECURSE test_data_glob + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + *.qml) +list(APPEND test_data ${test_data_glob}) + +qt_internal_add_test(tst_declarative_satellitesource + QMLTEST + SOURCES + main.cpp + LIBRARIES + Qt::Positioning + Qt::Qml + Qt::Quick + TESTDATA + ${test_data} +) + +qt_add_qml_module(tst_declarative_satellitesource + URI TestFactory + VERSION 1.0 + QML_FILES + tst_satellite.qml + tst_satellitesource.qml + NO_RESOURCE_TARGET_PATH +) + +add_dependencies(tst_declarative_satellitesource + QGeoSatelliteInfoSourceTestPlugin DummyPluginForTestsFactoryPlugin) +if(ANDROID) + # we have two plugins as dependencies, but they are in the same dir + set_target_properties(tst_declarative_satellitesource PROPERTIES + QT_ANDROID_EXTRA_PLUGINS "$" + ) +endif() diff --git a/tests/auto/declarative_satellitesource/main.cpp b/tests/auto/declarative_satellitesource/main.cpp new file mode 100644 index 0000000..338bb80 --- /dev/null +++ b/tests/auto/declarative_satellitesource/main.cpp @@ -0,0 +1,24 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include + +static void initializeLibraryPath() +{ +#if QT_CONFIG(library) + // Set custom path since CI doesn't install test plugins +#ifdef Q_OS_WIN + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../../plugins")); +#else + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../plugins")); +#endif +#endif +} + +Q_COREAPP_STARTUP_FUNCTION(initializeLibraryPath) + +QUICK_TEST_MAIN(declarative_satellitesource) diff --git a/tests/auto/declarative_satellitesource/tst_satellite.qml b/tests/auto/declarative_satellitesource/tst_satellite.qml new file mode 100644 index 0000000..891b24a --- /dev/null +++ b/tests/auto/declarative_satellitesource/tst_satellite.qml @@ -0,0 +1,23 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QtPositioning +import QtQml +import QtQuick +import QtTest + +TestCase { + name: "Satellite" + id: top + property geoSatelliteInfo sat + + function test_default() { + compare(sat.satelliteSystem, GeoSatelliteInfo.Undefined) + compare(sat.satelliteIdentifier, -1) + compare(sat.signalStrength, -1) + compare(sat.hasAttribute(GeoSatelliteInfo.Azimuth), false) + compare(sat.attribute(GeoSatelliteInfo.Azimuth), -1) + compare(sat.hasAttribute(GeoSatelliteInfo.Elevation), false) + compare(sat.attribute(GeoSatelliteInfo.Elevation), -1) + } +} diff --git a/tests/auto/declarative_satellitesource/tst_satellitesource.qml b/tests/auto/declarative_satellitesource/tst_satellitesource.qml new file mode 100644 index 0000000..cf18724 --- /dev/null +++ b/tests/auto/declarative_satellitesource/tst_satellitesource.qml @@ -0,0 +1,478 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QtPositioning +import QtQml +import QtQuick +import QtTest + +TestCase { + name: "SatelliteSource" + + id: top + + Component { + id: defaultSource + SatelliteSource { + } + } + + Component { + id: sourceWithParameters + SatelliteSource { + name: "satellitesource.test" + PluginParameter { name: "satellitesystem"; value: GeoSatelliteInfo.GALILEO } + } + } + + Component { + id: sourceWithIncompleteParameter + SatelliteSource { + name: "satellitesource.test" + PluginParameter { + objectName: "incompleteProperty" + name: "satellitesystem" + } + } + } + + SignalSpy { id: inViewSpy; signalName: "satellitesInViewChanged" } + SignalSpy { id: inUseSpy; signalName: "satellitesInUseChanged" } + SignalSpy { id: activeSpy; signalName: "activeChanged" } + SignalSpy { id: validSpy; signalName: "validityChanged" } + SignalSpy { id: updateIntervalSpy; signalName: "updateIntervalChanged" } + SignalSpy { id: errorSpy; signalName: "sourceErrorChanged" } + SignalSpy { id: nameSpy; signalName: "nameChanged" } + + function test_default_construct() { + var source = defaultSource.createObject(top, {}) + // empty name resulted in picking a default source, which is valid + compare(source.valid, true) + compare(source.active, false) + verify(source.name !== "") + compare(source.sourceError, SatelliteSource.NoError) + compare(source.satellitesInView.length, 0) + compare(source.satellitesInUse.length, 0) + } + + function test_unknown_plugin() { + var source = defaultSource.createObject(top, { name: "invalid_plugin" }) + compare(source.valid, false) + compare(source.active, false) + compare(source.name, "invalid_plugin") + compare(source.sourceError, SatelliteSource.NoError) + compare(source.satellitesInView.length, 0) + compare(source.satellitesInUse.length, 0) + } + + function test_backend_properties() { + var source = defaultSource.createObject(top, { name: "satellitesource.test" }) + + var inView = source.backendProperty("desiredInViewCount") + var inUse = source.backendProperty("desiredInUseCount") + var useElevation = source.backendProperty("useElevation") + var useAzimuth = source.backendProperty("useAzimuth") + var unknownParam = source.backendProperty("unknown") + + // check defaults + compare(inView, 5) + compare(inUse, 3) + compare(useElevation, false) + compare(useAzimuth, false) + compare(unknownParam, undefined) + + // modify + compare(source.setBackendProperty("desiredInViewCount", 10), true) + compare(source.setBackendProperty("desiredInUseCount", 5), true) + compare(source.setBackendProperty("useElevation", true), true) + compare(source.setBackendProperty("useAzimuth", true), true) + compare(source.setBackendProperty("unknown", "val"), false) + + // check that parameters are updated + inView = source.backendProperty("desiredInViewCount") + inUse = source.backendProperty("desiredInUseCount") + useElevation = source.backendProperty("useElevation") + useAzimuth = source.backendProperty("useAzimuth") + + compare(inView, 10) + compare(inUse, 5) + compare(useElevation, true) + compare(useAzimuth, true) + } + + function test_regular_updates() { + var source = defaultSource.createObject(top, { name: "satellitesource.test" }) + inViewSpy.target = source + inUseSpy.target = source + inViewSpy.clear() + inUseSpy.clear() + + var expectedInView = source.backendProperty("desiredInViewCount") + var expectedInUse = source.backendProperty("desiredInUseCount") + verify(expectedInView > 0) + verify(expectedInUse > 0) + + source.start() + tryCompare(inViewSpy, "count", 1) + tryCompare(inUseSpy, "count", 1) + + compare(source.satellitesInView.length, expectedInView) + compare(source.satellitesInUse.length, expectedInUse) + + for (var idx = 0; idx < expectedInView; ++idx) { + var satInView = source.satellitesInView[idx] + compare(satInView.satelliteSystem, GeoSatelliteInfo.GPS) + compare(satInView.satelliteIdentifier, idx + 1) + compare(satInView.signalStrength, 5 * (idx + 1)) + compare(satInView.hasAttribute(GeoSatelliteInfo.Elevation), false) + compare(satInView.attribute(GeoSatelliteInfo.Elevation), -1) + compare(satInView.hasAttribute(GeoSatelliteInfo.Azimuth), false) + compare(satInView.attribute(GeoSatelliteInfo.Azimuth), -1) + + if (idx < expectedInUse) { + var satInUse = source.satellitesInUse[idx] + compare(satInUse, satInView) + } + } + } + + function test_update_with_plugin_parameters_and_properties() { + var source = sourceWithParameters.createObject(top, {}) + inViewSpy.target = source + inUseSpy.target = source + inViewSpy.clear() + inUseSpy.clear() + + source.setBackendProperty("useElevation", true) + source.setBackendProperty("useAzimuth", true) + + var expectedInView = source.backendProperty("desiredInViewCount") + var expectedInUse = source.backendProperty("desiredInUseCount") + + source.update() + tryCompare(inViewSpy, "count", 1) + tryCompare(inUseSpy, "count", 1) + + for (var idx = 0; idx < expectedInView; ++idx) { + var satInView = source.satellitesInView[idx] + compare(satInView.satelliteSystem, GeoSatelliteInfo.GALILEO) + compare(satInView.satelliteIdentifier, idx + 1) + compare(satInView.signalStrength, 5 * (idx + 1)) + compare(satInView.hasAttribute(GeoSatelliteInfo.Elevation), true) + compare(satInView.attribute(GeoSatelliteInfo.Elevation), 3.0 * (idx + 1)) + compare(satInView.hasAttribute(GeoSatelliteInfo.Azimuth), true) + compare(satInView.attribute(GeoSatelliteInfo.Azimuth), 0.5 * (idx + 1)) + + if (idx < expectedInUse) { + var satInUse = source.satellitesInUse[idx] + compare(satInUse, satInView) + } + } + } + + function test_signals() { + var source = defaultSource.createObject(top, { name: "satellitesource.test" }) + activeSpy.target = source + activeSpy.clear() + validSpy.target = source + validSpy.clear() + updateIntervalSpy.target = source + updateIntervalSpy.clear() + nameSpy.target = source + nameSpy.clear() + errorSpy.target = source + errorSpy.clear() + + compare(source.valid, true) + + source.updateInterval = 1000 + tryCompare(updateIntervalSpy, "count", 1) + compare(source.updateInterval, 1000) + + source.active = true + tryCompare(activeSpy, "count", 1) + compare(source.active, true) + + // should trigger an error, because it's less than minimumUpdateInterval + source.update(100) + tryCompare(errorSpy, "count", 1) + compare(source.sourceError, SatelliteSource.UpdateTimeoutError) + + source.name = "invalid_plugin" + tryCompare(nameSpy, "count", 1) + compare(source.name, "invalid_plugin") + tryCompare(activeSpy, "count", 2) + compare(source.active, false) + tryCompare(validSpy, "count", 1) + compare(source.valid, false) + } + + function test_create_active() { + // create a default source, active by default - should be working fine + var source = defaultSource.createObject(top, { active: true }) + inViewSpy.target = source + inViewSpy.clear() + inUseSpy.target = source + inUseSpy.clear() + + tryCompare(source, "active", true) + tryCompare(source, "valid", true) + + tryVerify(function() { return inViewSpy.count > 0 && inUseSpy.count > 0 }) + + verify(source.satellitesInView.length > 0) + verify(source.satellitesInUse.length > 0) + + // create an invalid source, active by default - should fail + var invalidSource = defaultSource.createObject(top, { name: "invalid", active: true }) + tryCompare(invalidSource, "active", false) + tryCompare(invalidSource, "valid", false) + } + + function test_set_plugin() { + // When creating with no name specified, some default plugin will + // be chosen + var source = defaultSource.createObject(top, {}) + nameSpy.target = source + nameSpy.clear() + activeSpy.target = source + activeSpy.clear() + + compare(source.valid, true) + var defaultPluginName = source.name + + source.active = true + tryCompare(activeSpy, "count", 1) + + // check that setting an empty name will do nothing, as we are already + // using the default + source.name = "" + compare(nameSpy.count, 0) + compare(source.name, defaultPluginName) + compare(source.active, true) + + // Set another valid plugin name. Source will be set to inactive state, + // but will be valid + var otherPluginName = (defaultPluginName === "satellitesource.test") + ? "dummy.source" : "satellitesource.test"; + source.name = otherPluginName + compare(nameSpy.count, 1) + compare(source.name, otherPluginName) + tryCompare(activeSpy, "count", 2) + compare(source.active, false) + compare(source.valid, true) + + source.active = true + tryCompare(activeSpy, "count", 3) + compare(source.active, true) + + // Set invalid name. Source will be set to inactive state, and will be + // invalid + source.name = "invalid_name" + compare(nameSpy.count, 2) + compare(source.name, "invalid_name") + tryCompare(activeSpy, "count", 4) + compare(source.active, false) + compare(source.valid, false) + } + + function test_update_after_start() { + // When update() is called after start(), it should not invalidate any + // state. The active state must still be true when the single update() + // is completed. + var source = defaultSource.createObject(top, { name: "satellitesource.test" }) + errorSpy.target = source + errorSpy.clear() + inViewSpy.target = source + inViewSpy.clear() + compare(source.active, false) + + source.start() + tryCompare(source, "active", true) + + source.update(300) // default update interval == 200 + tryVerify(function() { return errorSpy.count > 0 || inViewSpy.count > 0 }) + + // at this point update() is completed, source should still be active + compare(source.active, true) + + source.stop() + tryCompare(source, "active", false) + } + + function test_start_after_update() { + // When start() is called after update(), the source should remain + // active even when the single update is completed. + var source = defaultSource.createObject(top, { name: "satellitesource.test" }) + errorSpy.target = source + errorSpy.clear() + inViewSpy.target = source + inViewSpy.clear() + compare(source.active, false) + + source.update(300) + tryCompare(source, "active", true) + + source.start() + tryVerify(function() { return errorSpy.count > 0 || inViewSpy.count > 0 }) + + // at this point update() is completed, source should still be active + compare(source.active, true) + + source.stop() + tryCompare(source, "active", false) + } + + function test_stop_after_update() { + // When stop() is called after update(), and the update() is still in + // progress, the source should remain active until the update() + // is completed. + var source = defaultSource.createObject(top, { name: "satellitesource.test" }) + errorSpy.target = source + errorSpy.clear() + inViewSpy.target = source + inViewSpy.clear() + compare(source.active, false) + + source.start() + tryCompare(source, "active", true) + + source.update(300) // default update interval == 200 + source.stop(); + compare(source.active, true) + + tryVerify(function() { return errorSpy.count > 0 || inViewSpy.count > 0 }) + // at this point update() is completed, source should switch to inactive + compare(source.active, false) + } + + function test_start_stop_after_update() { + // Calling start() and stop() after update(), while still waiting for + // the update() to complete, should still result in the source to be + // active until the update() is completed. + var source = defaultSource.createObject(top, { name: "satellitesource.test" }) + errorSpy.target = source + errorSpy.clear() + inViewSpy.target = source + inViewSpy.clear() + compare(source.active, false) + + source.update(300) + tryCompare(source, "active", true) + + source.start() + source.stop() + compare(source.active, true) + + tryVerify(function() { return errorSpy.count > 0 || inViewSpy.count > 0 }) + // at this point update() is completed, source should switch to inactive + compare(source.active, false) + } + + function test_update_timed_out() { + // This test checks that source resets to inactive state when the single + // update() request times out without providing the position info + var source = defaultSource.createObject(top, { name: "satellitesource.test" }) + errorSpy.target = source + errorSpy.clear() + compare(source.active, false) + + source.update(50) // too small interval + compare(source.active, true) + + tryCompare(errorSpy, "count", 1) + compare(source.active, false) + } + + function test_update_with_start_timed_out() { + // This test checks that if single update() times out, but the regular + // updates are running, we still remain in active state. + var source = defaultSource.createObject(top, { name: "satellitesource.test" }) + errorSpy.target = source + errorSpy.clear() + compare(source.active, false) + + source.start() + source.update(100) // too small interval + tryCompare(source, "active", true) + + tryCompare(errorSpy, "count", 1) + compare(source.active, true) // still active + + source.stop() + tryCompare(source, "active", false) + } + + function test_start_update_stop_with_no_intervals() { + // This test checks that calls start() -> update() -> stop() without + // any waits between them will result in expected behavior. + // Specifically, the source should remain active until it gets + // the satellite updates. + var source = defaultSource.createObject(top, { name: "satellitesource.test" }) + inViewSpy.target = source + inViewSpy.clear() + compare(source.active, false) + + source.start() + source.update(300) + source.stop() + tryCompare(source, "active", true) + + tryCompare(inViewSpy, "count", 1) + // after the update is received, the source switches to inactive state + compare(source.active, false) + } + + function test_start_when_incomplete() { + var source = sourceWithIncompleteParameter.createObject(top, {}) + inViewSpy.target = source + inViewSpy.clear() + var parameterObj = findChild(source, "incompleteProperty") + + source.start() // does nothing, as the parameter is not initialized + compare(source.active, false) + + // init parameter + parameterObj.value = GeoSatelliteInfo.BEIDOU + // source created - should start providing updates + tryCompare(source, "active", true) + + tryVerify(function() { return inViewSpy.count > 0 }) + + source.stop() + tryCompare(source, "active", false) + } + + function test_start_stop_when_incomplete() { + var source = sourceWithIncompleteParameter.createObject(top, {}) + var parameterObj = findChild(source, "incompleteProperty") + + source.start() // does nothing, as the parameter is not initialized + compare(source.active, false) + source.stop() // calling stop() should invalidate request for start + + // init parameter + parameterObj.value = GeoSatelliteInfo.BEIDOU + // source still should be inactive + tryCompare(source, "active", false) + } + + function test_update_when_incomplete() { + var source = sourceWithIncompleteParameter.createObject(top, {}) + inViewSpy.target = source + inViewSpy.clear() + var parameterObj = findChild(source, "incompleteProperty") + + source.update() // does nothing, as the parameter is not initialized + compare(source.active, false) + + // init parameter + parameterObj.value = GeoSatelliteInfo.BEIDOU + // source created - should provide exactly 1 update + tryCompare(source, "active", true) + + tryVerify(function() { return inViewSpy.count == 1 }) + tryCompare(source, "active", false) + } +} + diff --git a/tests/auto/doublevectors/CMakeLists.txt b/tests/auto/doublevectors/CMakeLists.txt new file mode 100644 index 0000000..710a394 --- /dev/null +++ b/tests/auto/doublevectors/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from doublevectors.pro. + +##################################################################### +## tst_doublevectors Test: +##################################################################### + +qt_internal_add_test(tst_doublevectors + SOURCES + tst_doublevectors.cpp + LIBRARIES + Qt::Core + Qt::PositioningPrivate +) + +#### Keys ignored in scope 1:.:.:doublevectors.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/doublevectors/tst_doublevectors.cpp b/tests/auto/doublevectors/tst_doublevectors.cpp new file mode 100644 index 0000000..1eecc45 --- /dev/null +++ b/tests/auto/doublevectors/tst_doublevectors.cpp @@ -0,0 +1,268 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include + +#include +#include + +QT_USE_NAMESPACE + +class tst_doubleVectors : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + // 2D + void constructor2dTest(); + void basicFunctions2dTest(); + void unaryOperator2dTest(); + void binaryOperator2dTest(); + + // 3D + void constructor3dTest(); + void basicFunctions3dTest(); + void unaryOperator3dTest(); + void binaryOperator3dTest(); +}; + +// DoubleVector2D + +void tst_doubleVectors::constructor2dTest() +{ + // empty constructor, since it sets to 0, we should check, in case people rely on it + QDoubleVector2D v1; + QCOMPARE(v1.x(), 0.0); + QCOMPARE(v1.y(), 0.0); + QCOMPARE(v1.isNull(), true); + v1 = QDoubleVector2D(1.1, -2.5); // assignment and constructor + QCOMPARE(v1.x(), 1.1); + QCOMPARE(v1.y(), -2.5); + QDoubleVector2D v2(v1); // copy constructor + QCOMPARE(v2.x(), 1.1); + QCOMPARE(v2.y(), -2.5); + const QDoubleVector3D v3d(2.2, 3.3, 4.4); + QDoubleVector2D v3(v3d); // constructor from 3d vector, just copies x and y + QCOMPARE(v3.x(), 2.2); + QCOMPARE(v3.y(), 3.3); + QCOMPARE(v3.isNull(), false); +} + +void tst_doubleVectors::basicFunctions2dTest() +{ + QDoubleVector2D v1; + v1.setX(3.0); + v1.setY(4.0); + QCOMPARE(v1.x(), 3.0); + QCOMPARE(v1.y(), 4.0); + QCOMPARE(v1.length(), 5.0); + QDoubleVector2D v2 = v1.normalized(); + QCOMPARE(v1.lengthSquared(), 25.0); + v1.normalize(); + QCOMPARE(v1.x(), 3.0/5.0); + QCOMPARE(v1.y(), 4.0/5.0); + QCOMPARE(v2.x(), 3.0/5.0); + QCOMPARE(v2.y(), 4.0/5.0); + + QDoubleVector3D v3d = v1.toVector3D(); + QCOMPARE(v3d.x(), 3.0/5.0); + QCOMPARE(v3d.y(), 4.0/5.0); + QCOMPARE(v3d.z(), 0.0); +} + +void tst_doubleVectors::unaryOperator2dTest() +{ + QDoubleVector2D v1(1.1, 2.2); + QDoubleVector2D v2 = -v1; + QCOMPARE(v2.x(), -1.1); + QCOMPARE(v2.y(), -2.2); + + v1 *= 2.0; + QCOMPARE(v1.x(), 2.2); + QCOMPARE(v1.y(), 4.4); + + v2 /= 2.0; + QCOMPARE(v2.x(), -0.55); + QCOMPARE(v2.y(), -1.1); + + v1 += v2; + QCOMPARE(v1.x(), 1.65); + QCOMPARE(v1.y(), 3.3); + + v1 -= v2; + QCOMPARE(v1.x(), 2.2); + QCOMPARE(v1.y(), 4.4); + + v1 *= v2; + QCOMPARE(v1.x(), -1.21); + QCOMPARE(v1.y(), -4.84); +} + +void tst_doubleVectors::binaryOperator2dTest() +{ + QDoubleVector2D v1(1.1, 2.2); + QDoubleVector2D v2(3.4, 4.4); + QDoubleVector2D v3 = v1 + v2; + QCOMPARE(v3.x(), 4.5); + QCOMPARE(v3.y(), 6.6); + + QDoubleVector2D v4 = v1 - v2; + QCOMPARE(v4.x(), -2.3); + QCOMPARE(v4.y(), -2.2); + + QDoubleVector2D v5 = v2 * 2; + QCOMPARE(v5.x(), 6.8); + QCOMPARE(v5.y(), 8.8); + + QDoubleVector2D v6 = 2 * v2; + QCOMPARE(v6.x(), 6.8); + QCOMPARE(v6.y(), 8.8); + + QDoubleVector2D v7 = v2 / 2; + QCOMPARE(v7.x(), 1.7); + QCOMPARE(v7.y(), 2.2); + + double d = QDoubleVector2D::dotProduct(v1, v2); + QCOMPARE(d, 13.42); + + QCOMPARE(v5 == v6, true); + QCOMPARE(v5 != v6, false); + QCOMPARE(v6 == v7, false); + QCOMPARE(v6 != v7, true); +} + + + +// DoubleVector3D + + +void tst_doubleVectors::constructor3dTest() +{ + // empty constructor, since it sets to 0, we should check, in case people rely on it + QDoubleVector3D v1; + QCOMPARE(v1.x(), 0.0); + QCOMPARE(v1.y(), 0.0); + QCOMPARE(v1.z(), 0.0); + QCOMPARE(v1.isNull(), true); + v1 = QDoubleVector3D(1.1, -2.5, 3.2); // assignment and constructor + QCOMPARE(v1.x(), 1.1); + QCOMPARE(v1.y(), -2.5); + QCOMPARE(v1.z(), 3.2); + QDoubleVector3D v2(v1); // copy constructor + QCOMPARE(v2.x(), 1.1); + QCOMPARE(v2.y(), -2.5); + QCOMPARE(v2.z(), 3.2); + const QDoubleVector2D v2d(2.2, 3.3); + QDoubleVector3D v3(v2d); // constructor from 3d vector, just copies x and y + QCOMPARE(v3.x(), 2.2); + QCOMPARE(v3.y(), 3.3); + QCOMPARE(v3.z(), 0.0); + QCOMPARE(v3.isNull(), false); + const QDoubleVector2D v2d2(2.2, 3.3); + QDoubleVector3D v4(v2d2, -13.6); // constructor from 2d vector + QCOMPARE(v4.x(), 2.2); + QCOMPARE(v4.y(), 3.3); + QCOMPARE(v4.z(), -13.6); +} + +void tst_doubleVectors::basicFunctions3dTest() +{ + QDoubleVector3D v1; + v1.setX(2.0); + v1.setY(3.0); + v1.setZ(6.0); + QCOMPARE(v1.x(), 2.0); + QCOMPARE(v1.y(), 3.0); + QCOMPARE(v1.z(), 6.0); + QCOMPARE(v1.length(), 7.0); + QDoubleVector3D v2 = v1.normalized(); + QCOMPARE(v1.lengthSquared(), 49.0); + v1.normalize(); + QCOMPARE(v1.x(), 2.0/7.0); + QCOMPARE(v1.y(), 3.0/7.0); + QCOMPARE(v1.z(), 6.0/7.0); + QCOMPARE(v2.x(), 2.0/7.0); + QCOMPARE(v2.y(), 3.0/7.0); + QCOMPARE(v2.z(), 6.0/7.0); + + QDoubleVector2D v2d = v1.toVector2D(); + QCOMPARE(v2d.x(), 2.0/7.0); + QCOMPARE(v2d.y(), 3.0/7.0); +} + +void tst_doubleVectors::unaryOperator3dTest() +{ + QDoubleVector3D v1(1.1, 2.2, 3.3); + QDoubleVector3D v2 = -v1; + QCOMPARE(v2.x(), -1.1); + QCOMPARE(v2.y(), -2.2); + QCOMPARE(v2.z(), -3.3); + + v1 *= 2.0; + QCOMPARE(v1.x(), 2.2); + QCOMPARE(v1.y(), 4.4); + QCOMPARE(v1.z(), 6.6); + + v2 /= 2.0; + QCOMPARE(v2.x(), -0.55); + QCOMPARE(v2.y(), -1.1); + QCOMPARE(v2.z(), -1.65); + + v1 += v2; + QCOMPARE(v1.x(), 1.65); + QCOMPARE(v1.y(), 3.3); + QCOMPARE(v1.z(), 4.95); + + v1 -= v2; + QCOMPARE(v1.x(), 2.2); + QCOMPARE(v1.y(), 4.4); + QCOMPARE(v1.z(), 6.6); + + v1 *= v2; + QCOMPARE(v1.x(), -1.21); + QCOMPARE(v1.y(), -4.84); + QCOMPARE(v1.z(), -10.89); +} + +void tst_doubleVectors::binaryOperator3dTest() +{ + QDoubleVector3D v1(1.1, 2.2, 3.3); + QDoubleVector3D v2(3.4, 4.4, 5.5); + QDoubleVector3D v3 = v1 + v2; + QCOMPARE(v3.x(), 4.5); + QCOMPARE(v3.y(), 6.6); + QCOMPARE(v3.z(), 8.8); + + QDoubleVector3D v4 = v1 - v2; + QCOMPARE(v4.x(), -2.3); + QCOMPARE(v4.y(), -2.2); + QCOMPARE(v4.z(), -2.2); + + QDoubleVector3D v5 = v2 * 2; + QCOMPARE(v5.x(), 6.8); + QCOMPARE(v5.y(), 8.8); + QCOMPARE(v5.z(), 11.0); + + QDoubleVector3D v6 = 2 * v2; + QCOMPARE(v6.x(), 6.8); + QCOMPARE(v6.y(), 8.8); + QCOMPARE(v6.z(), 11.0); + + QDoubleVector3D v7 = v2 / 2; + QCOMPARE(v7.x(), 1.7); + QCOMPARE(v7.y(), 2.2); + QCOMPARE(v7.z(), 2.75); + + double d = QDoubleVector3D::dotProduct(v1, v2); + QCOMPARE(d, 31.57); + + QCOMPARE(v5 == v6, true); + QCOMPARE(v5 != v6, false); + QCOMPARE(v6 == v7, false); + QCOMPARE(v6 != v7, true); +} + +QTEST_APPLESS_MAIN(tst_doubleVectors) + +#include "tst_doublevectors.moc" diff --git a/tests/auto/dummypositionplugin/CMakeLists.txt b/tests/auto/dummypositionplugin/CMakeLists.txt new file mode 100644 index 0000000..141a605 --- /dev/null +++ b/tests/auto/dummypositionplugin/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from positionplugin.pro. + +##################################################################### +## QGeoPositionInfoSourceFactoryTest Plugin: +##################################################################### + +qt_internal_add_plugin(DummyPluginForTestsFactoryPlugin + OUTPUT_NAME qtposition_testplugin2 + CLASS_NAME DummyPluginForTestsFactory + PLUGIN_TYPE position + DEFAULT_IF FALSE + SOURCES + plugin.cpp + LIBRARIES + Qt::Core + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:positionplugin.pro:: +# OTHER_FILES = "plugin.json" +# PLUGIN_EXTENDS = "-" diff --git a/tests/auto/dummypositionplugin/plugin.cpp b/tests/auto/dummypositionplugin/plugin.cpp new file mode 100644 index 0000000..5f8e567 --- /dev/null +++ b/tests/auto/dummypositionplugin/plugin.cpp @@ -0,0 +1,188 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include +#include + +QT_USE_NAMESPACE + +// This is a dummy plugin that is created mostly to test some features of +// QDeclarativePositionSource. It does not provide any position updates. +// Use plugin from positionplugin subdirectory, if you need to simulate some +// positioning updates. + +class DummyPluginSource : public QGeoPositionInfoSource +{ + Q_OBJECT + +public: + DummyPluginSource(const QVariantMap ¶meters, QObject *parent = 0); + ~DummyPluginSource(); + + void startUpdates() override; + void stopUpdates() override; + void requestUpdate(int timeout = 5000) override; + + QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const override; + PositioningMethods supportedPositioningMethods() const override; + + void setUpdateInterval(int msec) override; + int minimumUpdateInterval() const override; + Error error() const override; + +private: + Error lastError = QGeoPositionInfoSource::NoError; +}; + +DummyPluginSource::DummyPluginSource(const QVariantMap ¶meters, QObject *parent) + : QGeoPositionInfoSource(parent) +{ + Q_UNUSED(parameters) +} + +QGeoPositionInfoSource::Error DummyPluginSource::error() const +{ + return lastError; +} + +void DummyPluginSource::setUpdateInterval(int msec) +{ + if (msec < minimumUpdateInterval()) + msec = minimumUpdateInterval(); + + QGeoPositionInfoSource::setUpdateInterval(msec); +} + +int DummyPluginSource::minimumUpdateInterval() const +{ + return 100; +} + +QGeoPositionInfo +DummyPluginSource::lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const +{ + Q_UNUSED(fromSatellitePositioningMethodsOnly); + return QGeoPositionInfo(); +} + +QGeoPositionInfoSource::PositioningMethods DummyPluginSource::supportedPositioningMethods() const +{ + return QGeoPositionInfoSource::NonSatellitePositioningMethods; +} + +void DummyPluginSource::startUpdates() +{ + lastError = QGeoPositionInfoSource::NoError; +} + +void DummyPluginSource::stopUpdates() { } + +void DummyPluginSource::requestUpdate(int timeout) +{ + lastError = QGeoPositionInfoSource::NoError; + if (timeout < minimumUpdateInterval()) { + lastError = QGeoPositionInfoSource::UpdateTimeoutError; + emit QGeoPositionInfoSource::errorOccurred(lastError); + } +} + +DummyPluginSource::~DummyPluginSource() { } + +class DummySatelliteSourcePlugin : public QGeoSatelliteInfoSource +{ + Q_OBJECT +public: + DummySatelliteSourcePlugin(const QVariantMap ¶meters, QObject *parent = 0); + ~DummySatelliteSourcePlugin(); + + int minimumUpdateInterval() const override; + Error error() const override; + +public slots: + void startUpdates() override; + void stopUpdates() override; + void requestUpdate(int timeout = 0) override; + +private: + Error lastError = QGeoSatelliteInfoSource::NoError; +}; + +DummySatelliteSourcePlugin::DummySatelliteSourcePlugin(const QVariantMap ¶meters, + QObject *parent) + : QGeoSatelliteInfoSource(parent) +{ + Q_UNUSED(parameters) +} + +DummySatelliteSourcePlugin::~DummySatelliteSourcePlugin() +{ +} + +int DummySatelliteSourcePlugin::minimumUpdateInterval() const +{ + return 100; +} + +QGeoSatelliteInfoSource::Error DummySatelliteSourcePlugin::error() const +{ + return lastError; +} + +void DummySatelliteSourcePlugin::startUpdates() +{ + lastError = QGeoSatelliteInfoSource::NoError; +} + +void DummySatelliteSourcePlugin::stopUpdates() +{ + lastError = QGeoSatelliteInfoSource::NoError; +} + +void DummySatelliteSourcePlugin::requestUpdate(int timeout) +{ + lastError = QGeoSatelliteInfoSource::NoError; + if (timeout < minimumUpdateInterval()) { + lastError = QGeoSatelliteInfoSource::UpdateTimeoutError; + emit errorOccurred(lastError); + } +} + + +class DummyPluginForTestsFactory : public QObject, public QGeoPositionInfoSourceFactory +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0" FILE "plugin.json") + Q_INTERFACES(QGeoPositionInfoSourceFactory) + +public: + QGeoPositionInfoSource *positionInfoSource(QObject *parent, + const QVariantMap ¶meters) override; + QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, + const QVariantMap ¶meters) override; + QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override; +}; + +QGeoPositionInfoSource * +DummyPluginForTestsFactory::positionInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + return new DummyPluginSource(parameters, parent); +} + +QGeoSatelliteInfoSource * +DummyPluginForTestsFactory::satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + return new DummySatelliteSourcePlugin(parameters, parent); +} + +QGeoAreaMonitorSource *DummyPluginForTestsFactory::areaMonitor(QObject *parent, + const QVariantMap ¶meters) +{ + Q_UNUSED(parent); + Q_UNUSED(parameters); + return nullptr; +} + +#include "plugin.moc" diff --git a/tests/auto/dummypositionplugin/plugin.json b/tests/auto/dummypositionplugin/plugin.json new file mode 100644 index 0000000..56a2ea6 --- /dev/null +++ b/tests/auto/dummypositionplugin/plugin.json @@ -0,0 +1,9 @@ +{ + "Keys": ["dummy.source"], + "Provider": "dummy.source", + "Position": true, + "Satellite": true, + "Monitor": false, + "Priority": 1, + "Testable": true +} diff --git a/tests/auto/positionplugin/CMakeLists.txt b/tests/auto/positionplugin/CMakeLists.txt new file mode 100644 index 0000000..703064a --- /dev/null +++ b/tests/auto/positionplugin/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from positionplugin.pro. + +##################################################################### +## QGeoPositionInfoSourceFactoryTest Plugin: +##################################################################### + +qt_internal_add_plugin(QGeoPositionInfoSourceFactoryTestPlugin + OUTPUT_NAME qtposition_testplugin + CLASS_NAME QGeoPositionInfoSourceFactoryTest + PLUGIN_TYPE position + DEFAULT_IF FALSE + SOURCES + plugin.cpp + LIBRARIES + Qt::Core + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:positionplugin.pro:: +# OTHER_FILES = "plugin.json" +# PLUGIN_EXTENDS = "-" diff --git a/tests/auto/positionplugin/plugin.cpp b/tests/auto/positionplugin/plugin.cpp new file mode 100644 index 0000000..4d6fd1d --- /dev/null +++ b/tests/auto/positionplugin/plugin.cpp @@ -0,0 +1,223 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include +#include + +QT_USE_NAMESPACE + +class DummySourcePrivate; +class DummySource : public QGeoPositionInfoSource +{ + Q_OBJECT + +public: + DummySource(const QVariantMap ¶meters, QObject *parent=0); + ~DummySource(); + + void startUpdates() override; + void stopUpdates() override; + void requestUpdate(int timeout = 5000) override; + + QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const override; + PositioningMethods supportedPositioningMethods() const override; + + void setUpdateInterval(int msec) override; + int minimumUpdateInterval() const override; + Error error() const override; + + bool setBackendProperty(const QString &name, const QVariant &value) override; + QVariant backendProperty(const QString &name) const override; + +private: + QTimer *timer; + QTimer *timeoutTimer; + QTimer *singleTimer; + QGeoPositionInfo lastPosition; + QDateTime lastUpdateTime; + Error lastError = QGeoPositionInfoSource::NoError; + qreal altitude = 0.0; + +private slots: + void updatePosition(); + void doTimeout(); +}; + +DummySource::DummySource(const QVariantMap ¶meters, QObject *parent) : + QGeoPositionInfoSource(parent), + timer(new QTimer(this)), + timeoutTimer(new QTimer(this)), + singleTimer(new QTimer(this)), + lastPosition(QGeoCoordinate(0,0), QDateTime::currentDateTime()) +{ + if (parameters.contains(QStringLiteral("test.source.altitude"))) { + const qreal alti = parameters.value(QStringLiteral("test.source.altitude")).toReal(); + altitude = alti; + QGeoCoordinate crd = lastPosition.coordinate(); + crd.setAltitude(alti); + lastPosition.setCoordinate(crd); + } + timer->setInterval(200); + connect(timer, SIGNAL(timeout()), + this, SLOT(updatePosition())); + connect(singleTimer, SIGNAL(timeout()), + this, SLOT(updatePosition())); + connect(timeoutTimer, SIGNAL(timeout()), + this, SLOT(doTimeout())); +} + +QGeoPositionInfoSource::Error DummySource::error() const +{ + return lastError; +} + +bool DummySource::setBackendProperty(const QString &name, const QVariant &value) +{ + if (name == QStringLiteral("altitude")) { + altitude = value.toReal(); + return true; + } + return false; +} + +QVariant DummySource::backendProperty(const QString &name) const +{ + if (name == QStringLiteral("altitude")) + return altitude; + return QVariant(); +} + + +void DummySource::setUpdateInterval(int msec) +{ + const int minInterval = minimumUpdateInterval(); + if (msec == 0) { + timer->setInterval(minInterval); + } else if (msec < minInterval) { + msec = minInterval; + timer->setInterval(msec); + } else { + timer->setInterval(msec); + } + + QGeoPositionInfoSource::setUpdateInterval(msec); +} + +int DummySource::minimumUpdateInterval() const +{ + return 200; +} + +QGeoPositionInfo DummySource::lastKnownPosition(bool fromSatellitePositioningMethodsOnly) const +{ + Q_UNUSED(fromSatellitePositioningMethodsOnly); + return lastPosition; +} + +QGeoPositionInfoSource::PositioningMethods DummySource::supportedPositioningMethods() const +{ + return QGeoPositionInfoSource::AllPositioningMethods; +} + +void DummySource::startUpdates() +{ + lastError = QGeoPositionInfoSource::NoError; + timer->start(); +} + +void DummySource::stopUpdates() +{ + timer->stop(); +} + +void DummySource::requestUpdate(int timeout) +{ + lastError = QGeoPositionInfoSource::NoError; + if (timeout == 0) + timeout = 5000; + if (timeout < 0) + timeout = 0; + + timeoutTimer->setInterval(timeout); + timeoutTimer->start(); + + if (timer->isActive()) { + timer->stop(); + timer->start(); + } + + singleTimer->setInterval(minimumUpdateInterval()); + singleTimer->start(); +} + +DummySource::~DummySource() +{} + +void DummySource::updatePosition() +{ + timeoutTimer->stop(); + singleTimer->stop(); + + const QDateTime now = QDateTime::currentDateTime(); + + QGeoCoordinate coord(lastPosition.coordinate().latitude() + 0.1, + lastPosition.coordinate().longitude() + 0.1, + altitude); + + QGeoPositionInfo info(coord, now); + info.setAttribute(QGeoPositionInfo::Direction, lastPosition.coordinate().azimuthTo(coord)); + if (lastUpdateTime.isValid()) { + double speed = lastPosition.coordinate().distanceTo(coord) / lastUpdateTime.msecsTo(now); + info.setAttribute(QGeoPositionInfo::GroundSpeed, 1000 * speed); + } + + lastUpdateTime = now; + lastPosition = info; + emit positionUpdated(info); +} + +void DummySource::doTimeout() +{ + timeoutTimer->stop(); + singleTimer->stop(); + lastError = QGeoPositionInfoSource::UpdateTimeoutError; + emit QGeoPositionInfoSource::errorOccurred(lastError); +} + + +class QGeoPositionInfoSourceFactoryTest : public QObject, public QGeoPositionInfoSourceFactory +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0" + FILE "plugin.json") + Q_INTERFACES(QGeoPositionInfoSourceFactory) + +public: + QGeoPositionInfoSource *positionInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) override; + QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override; +}; + +QGeoPositionInfoSource *QGeoPositionInfoSourceFactoryTest::positionInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + return new DummySource(parameters, parent); +} + +QGeoSatelliteInfoSource *QGeoPositionInfoSourceFactoryTest::satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent); + Q_UNUSED(parameters); + return nullptr; +} + +QGeoAreaMonitorSource *QGeoPositionInfoSourceFactoryTest::areaMonitor(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent); + Q_UNUSED(parameters); + return nullptr; +} + +#include "plugin.moc" diff --git a/tests/auto/positionplugin/plugin.json b/tests/auto/positionplugin/plugin.json new file mode 100644 index 0000000..4e7df0e --- /dev/null +++ b/tests/auto/positionplugin/plugin.json @@ -0,0 +1,9 @@ +{ + "Keys": ["test.source"], + "Provider": "test.source", + "Position": true, + "Satellite": false, + "Monitor": false, + "Priority": 2, + "Testable": true +} diff --git a/tests/auto/positionplugintest/CMakeLists.txt b/tests/auto/positionplugintest/CMakeLists.txt new file mode 100644 index 0000000..12d67b6 --- /dev/null +++ b/tests/auto/positionplugintest/CMakeLists.txt @@ -0,0 +1,26 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from positionplugintest.pro. + +##################################################################### +## tst_positionplugin Test: +##################################################################### + +qt_internal_add_test(tst_positionplugin + SOURCES + tst_positionplugin.cpp + LIBRARIES + Qt::Core + Qt::Positioning +) + +add_dependencies(tst_positionplugin QGeoPositionInfoSourceFactoryTestPlugin) +if(ANDROID) + set_target_properties(tst_positionplugin PROPERTIES + QT_ANDROID_EXTRA_PLUGINS "$" + ) +endif() + +#### Keys ignored in scope 1:.:.:positionplugintest.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/positionplugintest/tst_positionplugin.cpp b/tests/auto/positionplugintest/tst_positionplugin.cpp new file mode 100644 index 0000000..e256c19 --- /dev/null +++ b/tests/auto/positionplugintest/tst_positionplugin.cpp @@ -0,0 +1,84 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +//TESTED_COMPONENT=src/location + +#include +#include +#include +#include +#include +#include + +QT_USE_NAMESPACE + +class tst_PositionPlugin : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + + void availableSources(); + void create(); + void getUpdates(); +}; + +void tst_PositionPlugin::initTestCase() +{ +#if QT_CONFIG(library) + /* + * Set custom path since CI doesn't install test plugins + */ +#ifdef Q_OS_WIN + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../../plugins")); +#else + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../plugins")); +#endif +#endif +} + +void tst_PositionPlugin::availableSources() +{ + QVERIFY(QGeoPositionInfoSource::availableSources().contains("test.source")); + QVERIFY(!QGeoSatelliteInfoSource::availableSources().contains("test.source")); + QVERIFY(!QGeoAreaMonitorSource::availableSources().contains("test.source")); +} + +void tst_PositionPlugin::create() +{ + std::unique_ptr src = nullptr; + src.reset(QGeoPositionInfoSource::createSource("test.source", 0)); + QVERIFY(src != nullptr); + + QVERIFY(src->minimumUpdateInterval() == 200); + + src.reset(QGeoPositionInfoSource::createSource("invalid source that will never exist", 0)); + QVERIFY(src == 0); + + std::unique_ptr ssrc = nullptr; + ssrc.reset(QGeoSatelliteInfoSource::createSource("test.source", 0)); + QVERIFY(ssrc == nullptr); +} + +void tst_PositionPlugin::getUpdates() +{ + std::unique_ptr src(QGeoPositionInfoSource::createSource("test.source", 0)); + src->setUpdateInterval(200); + + QSignalSpy spy(src.get(), SIGNAL(positionUpdated(QGeoPositionInfo))); + src->startUpdates(); + QTRY_COMPARE_WITH_TIMEOUT(spy.size(), 1, 5000); + QCOMPARE(spy[0].size(), 1); + + QGeoPositionInfo info = qvariant_cast(spy[0][0]); + QCOMPARE(info.coordinate().latitude(), 0.1); + QCOMPARE(info.coordinate().longitude(), 0.1); +} + + + +QTEST_GUILESS_MAIN(tst_PositionPlugin) +#include "tst_positionplugin.moc" diff --git a/tests/auto/qdeclarativegeolocation/CMakeLists.txt b/tests/auto/qdeclarativegeolocation/CMakeLists.txt new file mode 100644 index 0000000..469d06f --- /dev/null +++ b/tests/auto/qdeclarativegeolocation/CMakeLists.txt @@ -0,0 +1,12 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_test(tst_qdeclarativegeolocation + SOURCES + tst_qdeclarativegeolocation.cpp + LIBRARIES + Qt::Core + Qt::Positioning + Qt::PositioningQuickPrivate + Qt::TestPrivate +) diff --git a/tests/auto/qdeclarativegeolocation/tst_qdeclarativegeolocation.cpp b/tests/auto/qdeclarativegeolocation/tst_qdeclarativegeolocation.cpp new file mode 100644 index 0000000..f7e2e32 --- /dev/null +++ b/tests/auto/qdeclarativegeolocation/tst_qdeclarativegeolocation.cpp @@ -0,0 +1,156 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#include +#include +#include +#include +#include + +QT_USE_NAMESPACE + +class tst_DeclarativeGeoLocation : public QObject +{ + Q_OBJECT + +private slots: + void locationProperty(); + void addressBinding(); + void coordinateBinding(); + void shapeBinding(); + void attributesBinding(); +}; + +void tst_DeclarativeGeoLocation::locationProperty() +{ + // This test calls setLocation() with different preconditions, providing + // coverage for different branches of the setLocation() method. + + QGeoAddress addr; + addr.setCountryCode("DEU"); + addr.setCountry("Germany"); + addr.setCity("Berlin"); + addr.setStreet("Erich-Thilo-Str"); + addr.setStreetNumber("10"); + addr.setPostalCode("12489"); + + const QGeoCoordinate c(52.43, 13.53); + + const QVariantMap attrs { { "string_proprty", "value" }, { "int_property", 5 } }; + + QGeoLocation loc1; + loc1.setAddress(addr); + loc1.setCoordinate(c); + loc1.setBoundingShape(QGeoCircle(c, 100)); + loc1.setExtendedAttributes(attrs); + + QDeclarativeGeoLocation location; + qsizetype addrChangedCount = 0; + qsizetype coordChangedCount = 0; + qsizetype shapeChangedCount = 0; + qsizetype attrChangedCount = 0; + + auto addrChangedHandler = location.bindableAddress().onValueChanged( + [&addrChangedCount]() { ++addrChangedCount; }); + Q_UNUSED(addrChangedHandler) + auto coordChangedHandler = location.bindableCoordinate().onValueChanged( + [&coordChangedCount]() { ++coordChangedCount; }); + Q_UNUSED(coordChangedHandler) + auto shapeChangedHandler = location.bindableBoundingShape().onValueChanged( + [&shapeChangedCount]() { ++shapeChangedCount; }); + Q_UNUSED(shapeChangedHandler) + auto attrChangedHandler = location.bindableExtendedAttributes().onValueChanged( + [&attrChangedCount]() { ++attrChangedCount; }); + Q_UNUSED(attrChangedHandler) + + // By default an empty m_address is created in the default constructor. + // So m_address contains a valid pointer, m_address->parent() == this. + location.setLocation(loc1); + QCOMPARE(addrChangedCount, 0); // the pointer didn't change + QCOMPARE(coordChangedCount, 1); + QCOMPARE(shapeChangedCount, 1); + QCOMPARE(attrChangedCount, 1); + QCOMPARE(location.location(), loc1); + QCOMPARE(location.address()->parent(), &location); + + // m_address contains a nullptr + location.setAddress(nullptr); + QVERIFY(!location.address()); + addrChangedCount = 0; + coordChangedCount = 0; + shapeChangedCount = 0; + attrChangedCount = 0; + + location.setLocation(loc1); + QCOMPARE(addrChangedCount, 1); // only the pointer has changed + QCOMPARE(coordChangedCount, 0); + QCOMPARE(shapeChangedCount, 0); + QCOMPARE(attrChangedCount, 0); + QCOMPARE(location.location(), loc1); + QCOMPARE(location.address()->parent(), &location); + + // m_address contains a valid pointer, m_address->parent() != this + QGeoAddress addr1; + addr1.setCountryCode("USA"); + addr1.setCountry("United States"); + addr1.setPostalCode("8900"); + addr1.setState("Oregon"); + addr1.setCity("Springfield"); + addr1.setDistrict("Pressboard Estates"); + addr1.setStreet("Evergreen Tce"); + addr1.setStreetNumber("742"); + + QDeclarativeGeoAddress geoAddr(addr1); + + location.setAddress(&geoAddr); + QVERIFY(location.address()); + QCOMPARE(location.address()->parent(), nullptr); + addrChangedCount = 0; + + location.setLocation(loc1); + QCOMPARE(addrChangedCount, 1); // only the pointer has changed + QCOMPARE(coordChangedCount, 0); + QCOMPARE(shapeChangedCount, 0); + QCOMPARE(attrChangedCount, 0); + QCOMPARE(location.location(), loc1); + QCOMPARE(location.address()->parent(), &location); +} + +void tst_DeclarativeGeoLocation::addressBinding() +{ + QDeclarativeGeoLocation location; + QDeclarativeGeoAddress addr1; + QDeclarativeGeoAddress addr2; + QTestPrivate::testReadWritePropertyBasics( + location, &addr1, &addr2, "address"); +} + +void tst_DeclarativeGeoLocation::coordinateBinding() +{ + QDeclarativeGeoLocation location; + const QGeoCoordinate c1(2.0, 1.0); + const QGeoCoordinate c2(1.0, 2.0); + QTestPrivate::testReadWritePropertyBasics( + location, c1, c2, "coordinate"); +} + +void tst_DeclarativeGeoLocation::shapeBinding() +{ + QDeclarativeGeoLocation location; + const QGeoCircle circle(QGeoCoordinate(2.0, 1.0), 10); + const QGeoRectangle rectangle(QGeoCoordinate(2.0, 1.0), QGeoCoordinate(1.0, 2.0)); + QTestPrivate::testReadWritePropertyBasics( + location, circle, rectangle, "boundingShape"); +} + +void tst_DeclarativeGeoLocation::attributesBinding() +{ + QDeclarativeGeoLocation location; + const QVariantMap m1 { { "string_proprty", "value" }, { "int_property", 5 } }; + const QVariantMap m2 { { "int_property", 10 }, { "double_property", 15.5 } }; + QTestPrivate::testReadWritePropertyBasics( + location, m1, m2, "extendedAttributes"); +} + +QTEST_APPLESS_MAIN(tst_DeclarativeGeoLocation) + +#include "tst_qdeclarativegeolocation.moc" diff --git a/tests/auto/qdeclarativeposition/CMakeLists.txt b/tests/auto/qdeclarativeposition/CMakeLists.txt new file mode 100644 index 0000000..92d0fb1 --- /dev/null +++ b/tests/auto/qdeclarativeposition/CMakeLists.txt @@ -0,0 +1,11 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_test(tst_qdeclarativeposition + SOURCES + tst_qdeclarativeposition.cpp + LIBRARIES + Qt::Core + Qt::PositioningQuickPrivate + Qt::TestPrivate +) diff --git a/tests/auto/qdeclarativeposition/tst_qdeclarativeposition.cpp b/tests/auto/qdeclarativeposition/tst_qdeclarativeposition.cpp new file mode 100644 index 0000000..76d2feb --- /dev/null +++ b/tests/auto/qdeclarativeposition/tst_qdeclarativeposition.cpp @@ -0,0 +1,219 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include + +QT_USE_NAMESPACE + +class tst_QDeclarativePosition : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void init(); + + void latitudeValidBinding(); + void longitudeValidBinding(); + void altitudeValidBinding(); + void coordinateBinding(); + void timestampBinding(); + void speedBinding(); + void speedValidBinding(); + void horizontalAccuracyValidBinding(); + void horizontalAccuracyBinding(); + void verticalAccuracyValidBinding(); + void verticalAccuracyBinding(); + void directionValidBinding(); + void directionBinding(); + void verticalSpeedValidBinding(); + void verticalSpeedBinding(); + void magneticVariationValidBinding(); + void magneticVariationBinding(); + void directionAccuracyBinding(); + void directionAccuracyValidBinding(); + +private: + QDeclarativePosition m_declarativePosition; + QGeoPositionInfo m_positionInfo; + std::function m_mutatorFunc = nullptr; + std::function m_doubleComparator = nullptr; +}; + +void tst_QDeclarativePosition::initTestCase() +{ + m_mutatorFunc = [&]() { m_declarativePosition.setPosition(m_positionInfo); }; + m_doubleComparator = [](const double &lhs, const double &rhs) { + return (qIsNaN(lhs) && qIsNaN(rhs)) || qFuzzyCompare(lhs, rhs); + }; +} + +void tst_QDeclarativePosition::init() +{ + // reset position before each test + m_declarativePosition.setPosition(QGeoPositionInfo()); +} + +void tst_QDeclarativePosition::latitudeValidBinding() +{ + QCOMPARE(m_declarativePosition.isLatitudeValid(), false); + m_positionInfo.setCoordinate(QGeoCoordinate(1.0, 2.0)); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, false, true, "latitudeValid", m_mutatorFunc); +} + +void tst_QDeclarativePosition::longitudeValidBinding() +{ + QCOMPARE(m_declarativePosition.isLongitudeValid(), false); + m_positionInfo.setCoordinate(QGeoCoordinate(1.0, 2.0)); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, false, true, "longitudeValid", m_mutatorFunc); +} + +void tst_QDeclarativePosition::altitudeValidBinding() +{ + QCOMPARE(m_declarativePosition.isAltitudeValid(), false); + m_positionInfo.setCoordinate(QGeoCoordinate(1.0, 2.0, 3.0)); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, false, true, "altitudeValid", m_mutatorFunc); +} + +void tst_QDeclarativePosition::coordinateBinding() +{ + QCOMPARE(m_declarativePosition.coordinate(), QGeoCoordinate()); + m_positionInfo.setCoordinate(QGeoCoordinate(1.0, 2.0, 3.0)); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, QGeoCoordinate(), QGeoCoordinate(1.0, 2.0, 3.0), "coordinate", + m_mutatorFunc); +} + +void tst_QDeclarativePosition::timestampBinding() +{ + QCOMPARE(m_declarativePosition.timestamp(), QDateTime()); + const auto timestamp = QDateTime::currentDateTimeUtc(); + m_positionInfo.setTimestamp(timestamp); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, QDateTime(), timestamp, "timestamp", m_mutatorFunc); +} + +void tst_QDeclarativePosition::speedBinding() +{ + QCOMPARE(m_declarativePosition.speed(), qQNaN()); + m_positionInfo.setAttribute(QGeoPositionInfo::GroundSpeed, 10.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, qQNaN(), 10.0, "speed", m_mutatorFunc, m_doubleComparator); +} + +void tst_QDeclarativePosition::speedValidBinding() +{ + QCOMPARE(m_declarativePosition.isSpeedValid(), false); + m_positionInfo.setAttribute(QGeoPositionInfo::GroundSpeed, 10.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, false, true, "speedValid", m_mutatorFunc); +} + +void tst_QDeclarativePosition::horizontalAccuracyValidBinding() +{ + QCOMPARE(m_declarativePosition.isHorizontalAccuracyValid(), false); + m_positionInfo.setAttribute(QGeoPositionInfo::HorizontalAccuracy, 1.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, false, true, "horizontalAccuracyValid", m_mutatorFunc); +} + +void tst_QDeclarativePosition::horizontalAccuracyBinding() +{ + QCOMPARE(m_declarativePosition.horizontalAccuracy(), qQNaN()); + m_positionInfo.setAttribute(QGeoPositionInfo::HorizontalAccuracy, 10.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, qQNaN(), 10.0, "horizontalAccuracy", m_mutatorFunc, + m_doubleComparator); +} + +void tst_QDeclarativePosition::verticalAccuracyValidBinding() +{ + QCOMPARE(m_declarativePosition.isVerticalAccuracyValid(), false); + m_positionInfo.setAttribute(QGeoPositionInfo::VerticalAccuracy, 1.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, false, true, "verticalAccuracyValid", m_mutatorFunc); +} + +void tst_QDeclarativePosition::verticalAccuracyBinding() +{ + QCOMPARE(m_declarativePosition.verticalAccuracy(), qQNaN()); + m_positionInfo.setAttribute(QGeoPositionInfo::VerticalAccuracy, 10.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, qQNaN(), 10.0, "verticalAccuracy", m_mutatorFunc, + m_doubleComparator); +} + +void tst_QDeclarativePosition::directionValidBinding() +{ + QCOMPARE(m_declarativePosition.isDirectionValid(), false); + m_positionInfo.setAttribute(QGeoPositionInfo::Direction, 1.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, false, true, "directionValid", m_mutatorFunc); +} + +void tst_QDeclarativePosition::directionBinding() +{ + QCOMPARE(m_declarativePosition.direction(), qQNaN()); + m_positionInfo.setAttribute(QGeoPositionInfo::Direction, 10.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, qQNaN(), 10.0, "direction", m_mutatorFunc, m_doubleComparator); +} + +void tst_QDeclarativePosition::verticalSpeedValidBinding() +{ + QCOMPARE(m_declarativePosition.isVerticalSpeedValid(), false); + m_positionInfo.setAttribute(QGeoPositionInfo::VerticalSpeed, 1.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, false, true, "verticalSpeedValid", m_mutatorFunc); +} + +void tst_QDeclarativePosition::verticalSpeedBinding() +{ + QCOMPARE(m_declarativePosition.verticalSpeed(), qQNaN()); + m_positionInfo.setAttribute(QGeoPositionInfo::VerticalSpeed, 10.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, qQNaN(), 10.0, "verticalSpeed", m_mutatorFunc, + m_doubleComparator); +} + +void tst_QDeclarativePosition::magneticVariationValidBinding() +{ + QCOMPARE(m_declarativePosition.isMagneticVariationValid(), false); + m_positionInfo.setAttribute(QGeoPositionInfo::MagneticVariation, 1.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, false, true, "magneticVariationValid", m_mutatorFunc); +} + +void tst_QDeclarativePosition::magneticVariationBinding() +{ + QCOMPARE(m_declarativePosition.magneticVariation(), qQNaN()); + m_positionInfo.setAttribute(QGeoPositionInfo::MagneticVariation, 10.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, qQNaN(), 10.0, "magneticVariation", m_mutatorFunc, + m_doubleComparator); +} + +void tst_QDeclarativePosition::directionAccuracyBinding() +{ + QCOMPARE(m_declarativePosition.directionAccuracy(), qQNaN()); + m_positionInfo.setAttribute(QGeoPositionInfo::DirectionAccuracy, 10.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, qQNaN(), 10.0, "directionAccuracy", m_mutatorFunc, + m_doubleComparator); +} + +void tst_QDeclarativePosition::directionAccuracyValidBinding() +{ + QCOMPARE(m_declarativePosition.isDirectionAccuracyValid(), false); + m_positionInfo.setAttribute(QGeoPositionInfo::DirectionAccuracy, 10.0); + QTestPrivate::testReadOnlyPropertyBasics( + m_declarativePosition, false, true, "directionAccuracyValid", m_mutatorFunc); +} + +QTEST_GUILESS_MAIN(tst_QDeclarativePosition) +#include "tst_qdeclarativeposition.moc" diff --git a/tests/auto/qdeclarativepositionsource/BLACKLIST b/tests/auto/qdeclarativepositionsource/BLACKLIST new file mode 100644 index 0000000..2231aa8 --- /dev/null +++ b/tests/auto/qdeclarativepositionsource/BLACKLIST @@ -0,0 +1,52 @@ +# See qtbase/src/testlib/qtestblacklist.cpp for format +#QTBUG-101345 +[supportedMethodsBinding] +qnx +#QTBUG-101345 +[updateAfterStart] +qnx +#QTBUG-101345 +[stopAfterUpdate] +qnx +#QTBUG-101345 +[updateWithStartTimedOut] +qnx +#QTBUG-101345 +[startUpdateStopWithNoIntervals] +qnx +#QTBUG-101345 +[startStopAfterUpdate] +qnx +#QTBUG-101345 +[activeBindingBreak] +qnx +#QTBUG-101345 +[preferredMethodsOnSourceDependency] +qnx +#QTBUG-101345 +[updateTimedOut] +qnx +#QTBUG-101345 +[startBreaksActiveBinding] +qnx +#QTBUG-101345 +[positionBinding] +qnx +#QTBUG-101345 +[sourceErrorBinding] +qnx +#QTBUG-101345 +[intervalOnSourceDependency] +qnx +#QTBUG-101345 +[startAfterUpdate] +qnx +#QTBUG-101345 +[validBinding] +qnx +#QTBUG-101345 +[activeBinding] +qnx +#QTBUG-101345 +[activeBindingAutomated] +qnx diff --git a/tests/auto/qdeclarativepositionsource/CMakeLists.txt b/tests/auto/qdeclarativepositionsource/CMakeLists.txt new file mode 100644 index 0000000..97db928 --- /dev/null +++ b/tests/auto/qdeclarativepositionsource/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_test(tst_qdeclarativepositionsource + SOURCES + tst_qdeclarativepositionsource.cpp + LIBRARIES + Qt::Core + Qt::Positioning + Qt::PositioningQuickPrivate + Qt::TestPrivate +) + +add_dependencies(tst_qdeclarativepositionsource QGeoPositionInfoSourceFactoryTestPlugin + DummyPluginForTestsFactoryPlugin) +if(ANDROID) + # We depend on 2 plugins, but they both will be installed in the same dir + set_target_properties(tst_qdeclarativepositionsource PROPERTIES + QT_ANDROID_EXTRA_PLUGINS "$" + ) +endif() diff --git a/tests/auto/qdeclarativepositionsource/tst_qdeclarativepositionsource.cpp b/tests/auto/qdeclarativepositionsource/tst_qdeclarativepositionsource.cpp new file mode 100644 index 0000000..76fa41a --- /dev/null +++ b/tests/auto/qdeclarativepositionsource/tst_qdeclarativepositionsource.cpp @@ -0,0 +1,512 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#include +#include +#include + +QT_USE_NAMESPACE + +class tst_DeclarativePositionSource : public QObject +{ + Q_OBJECT + +private slots: + void init(); + + void nameBinding(); + void supportedMethodsBinding(); + void sourceErrorBinding(); + void validBinding(); + void positionBinding(); + void activeBinding(); + void activeBindingAutomated(); + void startBreaksActiveBinding(); + void activeBindingBreak(); + + void intervalOnSourceDependency(); + void preferredMethodsOnSourceDependency(); + + void updateAfterStart(); + void startAfterUpdate(); + void stopAfterUpdate(); + void startStopAfterUpdate(); + void updateTimedOut(); + void updateWithStartTimedOut(); + void startUpdateStopWithNoIntervals(); + +private: + std::unique_ptr m_positionSource = nullptr; +}; + +void tst_DeclarativePositionSource::init() +{ + // create a fresh instance of QDeclarativePositionSource before each test + m_positionSource.reset(new QDeclarativePositionSource); + m_positionSource->componentComplete(); // simulate QML loading +} + +void tst_DeclarativePositionSource::nameBinding() +{ + m_positionSource->setName("test.source"); + QTestPrivate::testReadWritePropertyBasics( + *m_positionSource.get(), "invalid source", "test.source", "name"); +} + +void tst_DeclarativePositionSource::supportedMethodsBinding() +{ + // Invalid source has no positioning methods. + // "test.source" has all positioning methods. + m_positionSource->setName("invalid name"); + QTestPrivate::testReadOnlyPropertyBasics( + *m_positionSource.get(), QDeclarativePositionSource::NoPositioningMethods, + QDeclarativePositionSource::AllPositioningMethods, "supportedPositioningMethods", + [&]() { m_positionSource->setName("test.source"); }); +} + +void tst_DeclarativePositionSource::sourceErrorBinding() +{ + // "dummy.source" has a minimum update interval of 100, and calling + // update() with a smaller timeout immediately result in a timeout error + m_positionSource->setName("dummy.source"); + QTestPrivate::testReadOnlyPropertyBasics( + *m_positionSource.get(), QDeclarativePositionSource::NoError, + QDeclarativePositionSource::UpdateTimeoutError, "sourceError", + [&]() { m_positionSource->update(10); }); + if (QTest::currentTestFailed()) + return; + + // Test that we can't bind sourceError to smth, as it's read-only + QProperty errorSetter; + m_positionSource->bindableSourceError().setBinding(Qt::makePropertyBinding(errorSetter)); + QCOMPARE(m_positionSource->bindableSourceError().hasBinding(), false); +} + +void tst_DeclarativePositionSource::validBinding() +{ + // Invalid source name results in no position source -> invalid object. + // Setting the name to "test.source" results in creating a new position + // source -> valid object + m_positionSource->setName("invalid name"); + QTestPrivate::testReadOnlyPropertyBasics( + *m_positionSource.get(), false, true, "valid", + [&]() { m_positionSource->setName("test.source"); }); +} + +static char *printPosition(const QDeclarativePosition *position) +{ + // For this test we need to print only coordinate, so that we get a nice + // error message if the below test fails. + QString str; + QDebug dbg(&str); + dbg << position->coordinate(); + const auto dataArray = str.toLatin1(); + const auto msgSize = dataArray.size() + 1; + char *msg = new char[msgSize]; + memset(msg, 0, msgSize); + qsnprintf(msg, msgSize, "%s", dataArray.constData()); + return msg; +} + +void tst_DeclarativePositionSource::positionBinding() +{ + // "test.source" udpates its position, starting from (0, 0) coordinate, and + // adding 0.1 lat and 0.1 log at every step + m_positionSource->setName("test.source"); + m_positionSource->setUpdateInterval(200); + const QGeoCoordinate c1(0.1, 0.1, 0); + const QGeoCoordinate c2(0.2, 0.2, 0); + m_positionSource->update(); + QTRY_COMPARE_WITH_TIMEOUT(m_positionSource->position()->coordinate(), c1, 5000); + + QGeoPositionInfo posInfo; + posInfo.setCoordinate(c1); + QDeclarativePosition pos1; + pos1.setPosition(posInfo); + + posInfo.setCoordinate(c2); + QDeclarativePosition pos2; + pos2.setPosition(posInfo); + + QTestPrivate::testReadOnlyPropertyBasics( + *m_positionSource.get(), &pos1, &pos2, "position", + [&]() { + QSignalSpy spy(m_positionSource.get(), + &QDeclarativePositionSource::positionChanged); + m_positionSource->update(); + // Wait for the update to happen. It should take around 200 ms, + // but we want to be on a safe side in case of high CI load. + QTRY_COMPARE_WITH_TIMEOUT(spy.size(), 1, 5000); + }, + [](const QDeclarativePosition *p1, const QDeclarativePosition *p2) { + return p1->coordinate() == p2->coordinate(); + }, + printPosition); + if (QTest::currentTestFailed()) + return; + + QProperty prop(nullptr); + m_positionSource->bindablePosition().setBinding(Qt::makePropertyBinding(prop)); + // We can't have bindings on read-only properties + QCOMPARE(m_positionSource->bindablePosition().hasBinding(), false); +} + +void tst_DeclarativePositionSource::activeBinding() +{ + m_positionSource->setName("test.source"); + + QProperty activeObserver; + activeObserver.setBinding(m_positionSource->bindableActive().makeBinding()); + + QProperty activeLambdaObserver; + activeLambdaObserver.setBinding([&]() { return m_positionSource->isActive(); }); + + QSignalSpy activeSpy(m_positionSource.get(), &QDeclarativePositionSource::activeChanged); + + QCOMPARE(activeSpy.size(), 0); + QCOMPARE(activeObserver.value(), false); + QCOMPARE(activeLambdaObserver.value(), false); + + QProperty activeSetter(false); + m_positionSource->bindableActive().setBinding(Qt::makePropertyBinding(activeSetter)); + + activeSetter = true; + QTest::qWait(0); // to trigger singleShot timer in setActive + + QCOMPARE(activeSpy.size(), 1); + QCOMPARE(activeObserver.value(), true); + QCOMPARE(activeLambdaObserver.value(), true); + + activeSetter = false; + + QCOMPARE(activeSpy.size(), 2); + QCOMPARE(activeObserver.value(), false); + QCOMPARE(activeLambdaObserver.value(), false); + + // calling update() does not break the binding + m_positionSource->update(50); + QCOMPARE(activeSpy.size(), 3); + QCOMPARE(activeObserver.value(), true); + QCOMPARE(activeLambdaObserver.value(), true); + + QTRY_COMPARE_WITH_TIMEOUT(m_positionSource->sourceError(), + QDeclarativePositionSource::UpdateTimeoutError, 5000); + + QCOMPARE(activeSpy.size(), 4); + QCOMPARE(activeObserver.value(), false); + QCOMPARE(activeLambdaObserver.value(), false); + + activeSetter = true; + QTest::qWait(0); // to trigger singleShot timer in setActive + + QCOMPARE(activeSpy.size(), 5); + QCOMPARE(activeObserver.value(), true); + QCOMPARE(activeLambdaObserver.value(), true); + + // calling stop() will break the binding + m_positionSource->stop(); + + QCOMPARE(activeSpy.size(), 6); + QCOMPARE(m_positionSource->isActive(), false); + QCOMPARE(activeObserver.value(), false); + QCOMPARE(activeLambdaObserver.value(), false); + + activeSetter = false; + activeSetter = true; + QTest::qWait(0); // to trigger singleShot timer in setActive + + // nothing changed, as the binding is broken + QCOMPARE(activeSpy.size(), 6); + QCOMPARE(m_positionSource->isActive(), false); + QCOMPARE(activeObserver.value(), false); + QCOMPARE(activeLambdaObserver.value(), false); +} + +void tst_DeclarativePositionSource::activeBindingAutomated() +{ + QTestPrivate::testReadWritePropertyBasics(*m_positionSource.get(), true, false, "active"); +} + +void tst_DeclarativePositionSource::startBreaksActiveBinding() +{ + m_positionSource->setName("test.source"); + QSignalSpy activeSpy(m_positionSource.get(), &QDeclarativePositionSource::activeChanged); + + QProperty activeSetter(true); + m_positionSource->bindableActive().setBinding(Qt::makePropertyBinding(activeSetter)); + + QTest::qWait(0); // to trigger singleShot timer in setActive + + QCOMPARE(m_positionSource->isActive(), true); + QCOMPARE(activeSpy.size(), 1); + QVERIFY(m_positionSource->bindableActive().hasBinding()); + + // Call start() explicitly, which should break the binding for 'active' + // property. + m_positionSource->start(); + activeSetter = false; // this should have no effect + QTest::qWait(0); // to trigger singleShot timer in setActive + + QCOMPARE(m_positionSource->isActive(), true); + QCOMPARE(activeSpy.size(), 1); + QVERIFY(!m_positionSource->bindableActive().hasBinding()); +} + +void tst_DeclarativePositionSource::activeBindingBreak() +{ + // This test checks a tricky scenario of breaking the binding for + // 'active' property. + // 0. active has a binding to some property Prop. + // 1. Prop is set to true => active = true => start getting position info. + // 2. Calling update() for a single update => the binding of active is not + // broken. + // 3. Calling stop() explicitly before the update() call is finished => + // the active binding is supposed to be broken, but the active state + // should still be true, because we have a pending update. + // 4. The pending update finishes => the active is set to false. + + m_positionSource->setName("test.source"); + + QProperty setter(false); + m_positionSource->bindableActive().setBinding(Qt::makePropertyBinding(setter)); + QVERIFY(m_positionSource->bindableActive().hasBinding()); + + setter = true; + QTest::qWait(0); // to trigger singleShot timer in setActive + QCOMPARE(m_positionSource->isActive(), true); + + QSignalSpy posSpy(m_positionSource.get(), &QDeclarativePositionSource::positionChanged); + QSignalSpy errSpy(m_positionSource.get(), &QDeclarativePositionSource::sourceErrorChanged); + m_positionSource->update(210); + + m_positionSource->stop(); + QVERIFY(!m_positionSource->bindableActive().hasBinding()); + QCOMPARE(m_positionSource->isActive(), true); + + // Wait for the single update to complete. It can be either position update + // or timeout. + QTRY_VERIFY_WITH_TIMEOUT(posSpy.size() > 0 || errSpy.size() > 0, 5000); + + QCOMPARE(m_positionSource->isActive(), false); + QVERIFY(!m_positionSource->bindableActive().hasBinding()); +} + +void tst_DeclarativePositionSource::intervalOnSourceDependency() +{ + // updateInterval can be modified if the new source does not support that + // large one, or implements some calculation + m_positionSource->setName("invalid_source"); // reset the source + + QSignalSpy intervalSpy(m_positionSource.get(), + &QDeclarativePositionSource::updateIntervalChanged); + + m_positionSource->setUpdateInterval(100); + QCOMPARE(m_positionSource->updateInterval(), 100); + QCOMPARE(intervalSpy.size(), 1); + + // "test.source" has a minimum update interval of 200 + m_positionSource->setName("test.source"); + QCOMPARE(m_positionSource->updateInterval(), 200); + QCOMPARE(intervalSpy.size(), 2); + + // "dummy.source" has a minimum update interval of 100, so we expect our + // desired interval to be applied + m_positionSource->setName("dummy.source"); + QCOMPARE(m_positionSource->updateInterval(), 100); + QCOMPARE(intervalSpy.size(), 3); +} + +void tst_DeclarativePositionSource::preferredMethodsOnSourceDependency() +{ + m_positionSource->setName("invalid_source"); // reset the source + + QSignalSpy methodsSpy(m_positionSource.get(), + &QDeclarativePositionSource::preferredPositioningMethodsChanged); + + m_positionSource->setPreferredPositioningMethods( + QDeclarativePositionSource::SatellitePositioningMethods); + QCOMPARE(m_positionSource->preferredPositioningMethods(), + QDeclarativePositionSource::SatellitePositioningMethods); + QCOMPARE(methodsSpy.size(), 1); + + // "dummy.source" has only non-satellite methods, so they will be used + m_positionSource->setName("dummy.source"); + QCOMPARE(m_positionSource->preferredPositioningMethods(), + QDeclarativePositionSource::NonSatellitePositioningMethods); + QCOMPARE(methodsSpy.size(), 2); + + // "test.source" has all positioning methods, so satellite will be used, + // as we initially wanted + m_positionSource->setName("test.source"); + QCOMPARE(m_positionSource->preferredPositioningMethods(), + QDeclarativePositionSource::SatellitePositioningMethods); + QCOMPARE(methodsSpy.size(), 3); +} + +void tst_DeclarativePositionSource::updateAfterStart() +{ + // When update() is called after start(), it should not invalidate any + // state. The active state must still be true when the single update() is + // completed. + + m_positionSource->setName("test.source"); + + QCOMPARE(m_positionSource->isActive(), false); + + m_positionSource->start(); + QCOMPARE(m_positionSource->isActive(), true); + + QSignalSpy posSpy(m_positionSource.get(), &QDeclarativePositionSource::positionChanged); + QSignalSpy errSpy(m_positionSource.get(), &QDeclarativePositionSource::sourceErrorChanged); + m_positionSource->update(210); + // Wait for the single update to complete. It can be either position update + // or timeout. + QTRY_VERIFY_WITH_TIMEOUT(posSpy.size() > 0 || errSpy.size() > 0, 5000); + QCOMPARE(m_positionSource->isActive(), true); + + m_positionSource->stop(); + QCOMPARE(m_positionSource->isActive(), false); +} + +void tst_DeclarativePositionSource::startAfterUpdate() +{ + // When start() is called after update(), the position source should remain + // active even when the signle update is completed. + + m_positionSource->setName("test.source"); + + QCOMPARE(m_positionSource->isActive(), false); + + QSignalSpy posSpy(m_positionSource.get(), &QDeclarativePositionSource::positionChanged); + QSignalSpy errSpy(m_positionSource.get(), &QDeclarativePositionSource::sourceErrorChanged); + m_positionSource->update(210); + QCOMPARE(m_positionSource->isActive(), true); + + m_positionSource->start(); + // Wait for the single update to complete. It can be either position update + // or timeout. + QTRY_VERIFY_WITH_TIMEOUT(posSpy.size() > 0 || errSpy.size() > 0, 5000); + QCOMPARE(m_positionSource->isActive(), true); + + m_positionSource->stop(); + QCOMPARE(m_positionSource->isActive(), false); +} + +void tst_DeclarativePositionSource::stopAfterUpdate() +{ + // When stop() is called after update(), and the update() is still in + // progress, the position source should remain active until the update() + // is completed. + + m_positionSource->setName("test.source"); + + QCOMPARE(m_positionSource->isActive(), false); + + QSignalSpy posSpy(m_positionSource.get(), &QDeclarativePositionSource::positionChanged); + QSignalSpy errSpy(m_positionSource.get(), &QDeclarativePositionSource::sourceErrorChanged); + m_positionSource->update(210); + QCOMPARE(m_positionSource->isActive(), true); + + m_positionSource->stop(); + QCOMPARE(m_positionSource->isActive(), true); + + // Wait for the single update to complete. It can be either position update + // or timeout. + QTRY_VERIFY_WITH_TIMEOUT(posSpy.size() > 0 || errSpy.size() > 0, 5000); + QCOMPARE(m_positionSource->isActive(), false); +} + +void tst_DeclarativePositionSource::startStopAfterUpdate() +{ + // Quite artificial example. Calling start() and stop() after update(), + // while still waiting for the update() to complete, should still result in + // the position source to be active until the update() is completed. + + m_positionSource->setName("test.source"); + + QCOMPARE(m_positionSource->isActive(), false); + + QSignalSpy posSpy(m_positionSource.get(), &QDeclarativePositionSource::positionChanged); + QSignalSpy errSpy(m_positionSource.get(), &QDeclarativePositionSource::sourceErrorChanged); + m_positionSource->update(210); + QCOMPARE(m_positionSource->isActive(), true); + + m_positionSource->start(); + m_positionSource->stop(); + + QCOMPARE(m_positionSource->isActive(), true); + + // Wait for the single update to complete. It can be either position update + // or timeout. + QTRY_VERIFY_WITH_TIMEOUT(posSpy.size() > 0 || errSpy.size() > 0, 5000); + QCOMPARE(m_positionSource->isActive(), false); +} + +void tst_DeclarativePositionSource::updateTimedOut() +{ + // This test checks that we reset to inactive state when the single update() + // request times out without providing the position info + + m_positionSource->setName("test.source"); + + QCOMPARE(m_positionSource->isActive(), false); + + m_positionSource->update(50); // too small timeout -> will return an error + QCOMPARE(m_positionSource->isActive(), true); + + QTRY_COMPARE_WITH_TIMEOUT(m_positionSource->sourceError(), + QDeclarativePositionSource::UpdateTimeoutError, 5000); + QCOMPARE(m_positionSource->isActive(), false); +} + +void tst_DeclarativePositionSource::updateWithStartTimedOut() +{ + // This test checks that if single update() times out, but the regular + // updates are running, we still remain in active state. + + m_positionSource->setName("test.source"); + + QCOMPARE(m_positionSource->isActive(), false); + + m_positionSource->start(); + + m_positionSource->update(50); // too small timeout -> will return an error + QCOMPARE(m_positionSource->isActive(), true); + + QTRY_COMPARE_WITH_TIMEOUT(m_positionSource->sourceError(), + QDeclarativePositionSource::UpdateTimeoutError, 5000); + QCOMPARE(m_positionSource->isActive(), true); + + m_positionSource->stop(); + QCOMPARE(m_positionSource->isActive(), false); +} + +void tst_DeclarativePositionSource::startUpdateStopWithNoIntervals() +{ + // This test checks that a sequence of calls start() -> update() -> stop() + // without any waits between them will result in expected behavior. + // Specifically, the position source should remain active until it gets + // the position response. + + m_positionSource->setName("test.source"); + + QCOMPARE(m_positionSource->isActive(), false); + + m_positionSource->start(); + QSignalSpy posSpy(m_positionSource.get(), &QDeclarativePositionSource::positionChanged); + QSignalSpy errSpy(m_positionSource.get(), &QDeclarativePositionSource::sourceErrorChanged); + m_positionSource->update(210); + QCOMPARE(m_positionSource->isActive(), true); + m_positionSource->stop(); + QCOMPARE(m_positionSource->isActive(), true); + + // Wait for the single update to complete. It can be either position update + // or timeout. + QTRY_VERIFY_WITH_TIMEOUT(posSpy.size() > 0 || errSpy.size() > 0, 5000); + QCOMPARE(m_positionSource->isActive(), false); +} + +QTEST_MAIN(tst_DeclarativePositionSource) + +#include "tst_qdeclarativepositionsource.moc" diff --git a/tests/auto/qgeoaddress/CMakeLists.txt b/tests/auto/qgeoaddress/CMakeLists.txt new file mode 100644 index 0000000..335add9 --- /dev/null +++ b/tests/auto/qgeoaddress/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeoaddress.pro. + +##################################################################### +## tst_qgeoaddress Test: +##################################################################### + +qt_internal_add_test(tst_qgeoaddress + SOURCES + tst_qgeoaddress.cpp + LIBRARIES + Qt::Core + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:qgeoaddress.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/qgeoaddress/tst_qgeoaddress.cpp b/tests/auto/qgeoaddress/tst_qgeoaddress.cpp new file mode 100644 index 0000000..c55b322 --- /dev/null +++ b/tests/auto/qgeoaddress/tst_qgeoaddress.cpp @@ -0,0 +1,622 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include + +#include + +QT_USE_NAMESPACE + +class tst_QGeoAddress : public QObject +{ + Q_OBJECT + +public: + tst_QGeoAddress(); + +private Q_SLOTS: + void constructorTest(); + void moveConstructTest(); + void moveAssignTest(); + void textTest(); + void cityTest(); + void countryCodeTest(); + void countryTest(); + void countyTest(); + void districtTest(); + void postalCodeTest(); + void stateTest(); + void streetTest(); + void streetNumberTest(); + void generatedText(); + void generatedText_data(); + void operatorsTest(); + void emptyClearTest(); + void hashingTest(); + void hashingTest_data(); +}; + +tst_QGeoAddress::tst_QGeoAddress() +{ +} + +void tst_QGeoAddress::constructorTest() +{ + QGeoAddress testObj; + + testObj.setStreet("testId"); + auto testObjPtr = std::make_unique(testObj); + QVERIFY2(testObjPtr != NULL, "Copy constructor - null"); + QVERIFY2(*testObjPtr == testObj, "Copy constructor - compare"); +} + +void tst_QGeoAddress::moveConstructTest() +{ + QGeoAddress address; + address.setCountry("country"); + address.setCity("city"); + address.setPostalCode("postcode"); + address.setStreet("street"); + address.setStreetNumber("number"); + + const QGeoAddress addressCopy = address; + QCOMPARE(QGeoAddress(std::move(address)), addressCopy); +} + +void tst_QGeoAddress::moveAssignTest() +{ + QGeoAddress address; + address.setCountry("country"); + address.setCity("city"); + address.setPostalCode("postcode"); + address.setStreet("street"); + address.setStreetNumber("number"); + + QGeoAddress addressCopy = address; + + QGeoAddress otherAddress; + otherAddress = std::move(address); + QCOMPARE(otherAddress, addressCopy); + + // Check that (move)assigning to a moved-from object is fine + address = std::move(addressCopy); + QCOMPARE(address, otherAddress); +} + +void tst_QGeoAddress::textTest() +{ + QGeoAddress address; + QVERIFY(address.text().isEmpty()); + address.setText(QStringLiteral("123 Fake Street\nSpringfield")); + QCOMPARE(address.text(), QStringLiteral("123 Fake Street\nSpringfield")); +} + +void tst_QGeoAddress::cityTest() +{ + QGeoAddress testObj; + QVERIFY2(testObj.city() == QString(), "Wrong default value"); + testObj.setCity("testText"); + QVERIFY2(testObj.city() == "testText", "Wrong value returned"); +} + +void tst_QGeoAddress::countryCodeTest() +{ + QGeoAddress testObj; + QVERIFY2(testObj.countryCode() == QString(), "Wrong default value"); + testObj.setCountryCode("testText"); + QVERIFY2(testObj.countryCode() == "testText", "Wrong value returned"); +} + +void tst_QGeoAddress::countryTest() +{ + QGeoAddress testObj; + QVERIFY2(testObj.country() == QString(), "Wrong default value"); + testObj.setCountry("testText"); + QVERIFY2(testObj.country() == "testText", "Wrong value returned"); +} + +void tst_QGeoAddress::countyTest() +{ + QGeoAddress testObj; + QVERIFY2(testObj.county() == QString(), "Wrong default value"); + testObj.setCounty("testText"); + QVERIFY2(testObj.county() == "testText", "Wrong value returned"); +} + +void tst_QGeoAddress::districtTest() +{ + QGeoAddress testObj; + QVERIFY2(testObj.district() == QString(), "Wrong default value"); + testObj.setDistrict("testText"); + QVERIFY2(testObj.district() == "testText", "Wrong value returned"); +} + +void tst_QGeoAddress::postalCodeTest() +{ + QGeoAddress testObj; + QVERIFY2(testObj.postalCode() == QString(), "Wrong default value"); + testObj.setPostalCode("testText"); + QVERIFY2(testObj.postalCode() == "testText", "Wrong value returned"); +} + +void tst_QGeoAddress::stateTest() +{ + QGeoAddress testObj; + QVERIFY2(testObj.state() == QString(), "Wrong default value"); + testObj.setState("testText"); + QVERIFY2(testObj.state() == "testText", "Wrong value returned"); +} + +void tst_QGeoAddress::streetTest() +{ + QGeoAddress testObj; + QVERIFY2(testObj.street() == QString(), "Wrong default value"); + testObj.setStreet("testText"); + QVERIFY2(testObj.street() == "testText", "Wrong value returned"); +} + +void tst_QGeoAddress::streetNumberTest() +{ + QGeoAddress testObj; + QVERIFY2(testObj.streetNumber() == QString(), "Wrong default value"); + const auto streetNumber = QStringLiteral("some street number"); + testObj.setStreetNumber(streetNumber); + QVERIFY2(testObj.streetNumber() == streetNumber, "Wrong value returned"); +} + +void tst_QGeoAddress::generatedText() +{ + QFETCH(QString, countryCode); + QFETCH(QString, expectedPostalCodeOnly); + QFETCH(QString, expectedFullAddress); + + QGeoAddress streetOnly; + streetOnly.setStreet("street"); + streetOnly.setCountryCode(countryCode); + + QCOMPARE(streetOnly.text(), QStringLiteral("street")); + + QGeoAddress cityOnly; + cityOnly.setCity("city"); + cityOnly.setCountryCode(countryCode); + if (countryCode == QLatin1String("CYM") || countryCode == QLatin1String("IRL")) + QCOMPARE(cityOnly.text(), QString()); + else + QCOMPARE(cityOnly.text(), QStringLiteral("city")); + + QGeoAddress postalCodeOnly; + postalCodeOnly.setPostalCode("postcode"); + postalCodeOnly.setCountryCode(countryCode); + QCOMPARE(postalCodeOnly.text(), expectedPostalCodeOnly); + + QGeoAddress fullAddress; + fullAddress.setStreet("street"); + fullAddress.setStreetNumber("number"); + fullAddress.setDistrict("district"); + fullAddress.setPostalCode("postcode"); + fullAddress.setCity("city"); + fullAddress.setState("state"); + fullAddress.setCountry("country"); + fullAddress.setCountryCode(countryCode); + + QCOMPARE(fullAddress.text(), expectedFullAddress); +} + +void tst_QGeoAddress::generatedText_data() +{ + QTest::addColumn("countryCode"); + QTest::addColumn("expectedPostalCodeOnly"); + QTest::addColumn("expectedFullAddress"); + + QTest::newRow("Albania") << QString::fromLatin1("ALB") + << QString::fromLatin1("postcode") /* postal code only */ + << QString::fromLatin1("street number
" /* full address */ + "postcode, city
" + "country"); + + QTest::newRow("Andorra") << QString::fromLatin1("AND") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "postcode city
" + "country"); + QTest::newRow("United Arab Emirates") << QString::fromLatin1("ARE") + << QString() + << QString::fromLatin1("street number
" + "district city
" + "country"); + QTest::newRow("Australia") << QString::fromLatin1("AUS") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "district state postcode
" + "country"); + QTest::newRow("Austria") << QString::fromLatin1("AUT") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "postcode city
" + "country"); + QTest::newRow("Bahamas") << QString::fromLatin1("BHS") + << QString() + << QString::fromLatin1("street number
" + "district city
" + "country"); + QTest::newRow("Bahrain") << QString::fromLatin1("BHR") + << QString() + << QString::fromLatin1("street number
" + "district, city, state
" + "country"); + QTest::newRow("Brazil") << QString::fromLatin1("BRA") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "district city-state postcode
" + "country"); + QTest::newRow("Brunei Darussalam") << QString::fromLatin1("BRN") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "district city postcode
" + "country"); + QTest::newRow("Canada") << QString::fromLatin1("CAN") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "city, state postcode
" + "country"); + QTest::newRow("China") << QString::fromLatin1("CHN") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number, city
" + "postcode state
" + "country"); + QTest::newRow("Chile") << QString::fromLatin1("CHL") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "postcode district, city, state
" + "country"); + QTest::newRow("Cayman Islands") << QString::fromLatin1("CYM") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "state postcode
" + "country"); + QTest::newRow("France") << QString::fromLatin1("FRA") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "postcode city
" + "country"); + + QTest::newRow("United Kingdom") << QString::fromLatin1("GBR") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "district, city, postcode
" + "country"); + QTest::newRow("Gibraltar") << QString::fromLatin1("GIB") + << QString() + << QString::fromLatin1("number street
" + "city
" + "country"); + QTest::newRow("Guadeloupe") << QString::fromLatin1("GLP") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "postcode city
" + "country"); + QTest::newRow("French Guiana") << QString::fromLatin1("GUF") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "postcode city
" + "country"); + QTest::newRow("Hong Kong") << QString::fromLatin1("HKG") + << QString() + << QString::fromLatin1("number street
" + "district
" + "city"); + QTest::newRow("India") << QString::fromLatin1("IND") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "city postcode state
" + "country"); + QTest::newRow("Indonesia") << QString::fromLatin1("IDN") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "city, postcode
" + "country"); + QTest::newRow("Ireland") << QString::fromLatin1("IRL") + << QString() + << QString::fromLatin1("number street
" + "district, state
" + "country"); + QTest::newRow("Italy") << QString::fromLatin1("ITA") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "postcode city
" + "country"); + QTest::newRow("Jersey") << QString::fromLatin1("JEY") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "city, postcode
" + "country"); + QTest::newRow("Jordan") << QString::fromLatin1("JOR") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "district city postcode
" + "country"); + QTest::newRow("Kuwait") << QString::fromLatin1("KWT") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "postcode, district, city
" + "country"); + QTest::newRow("Latvia") << QString::fromLatin1("LVA") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "city, postcode
" + "country"); + QTest::newRow("Lebanon") << QString::fromLatin1("LBN") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "district city postcode
" + "country"); + QTest::newRow("Luxembourg") << QString::fromLatin1("LUX") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "postcode city
" + "country"); + QTest::newRow("Malta") << QString::fromLatin1("MLT") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "city postcode
" + "country"); + QTest::newRow("Monaco") << QString::fromLatin1("MCO") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "postcode city
" + "country"); + QTest::newRow("Mexico") << QString::fromLatin1("MEX") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "district
" + "postcode city, state
" + "country"); + QTest::newRow("Martinique") << QString::fromLatin1("MTQ") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "postcode, city
" + "country"); + QTest::newRow("Malaysia") << QString::fromLatin1("MYS") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "postcode city
" + "state
" + "country"); + QTest::newRow("New Zealand") << QString::fromLatin1("NZL") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "district city postcode
" + "country"); + QTest::newRow("Oman") << QString::fromLatin1("OMN") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "district, postcode, city, country"); + QTest::newRow("Puerto Rico") << QString::fromLatin1("PRI") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "district, city, state, postcode
" + "country"); + QTest::newRow("Qatar") << QString::fromLatin1("QAT") + << QString() + << QString::fromLatin1("street number
" + "district city, country"); + QTest::newRow("Reunion") << QString::fromLatin1("REU") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "postcode city
" + "country"); + QTest::newRow("Russian Federation") << QString::fromLatin1("RUS") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "postcode city
" + "country"); + QTest::newRow("Saudi Arabia") << QString::fromLatin1("SAU") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street district
" + "city postcode
" + "country"); + QTest::newRow("Singapore") << QString::fromLatin1("SGP") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "city postcode
" + "country"); + QTest::newRow("Marino") << QString::fromLatin1("SMR") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "postcode city
" + "country"); + QTest::newRow("Taiwan") << QString::fromLatin1("TWN") + << QString() + << QString::fromLatin1("street number, district, city
" + "country"); + QTest::newRow("Thailand") << QString::fromLatin1("THA") + << QString("postcode") + << QString::fromLatin1("street number
" + "district, city postcode
" + "country"); + QTest::newRow("Turkey") << QString::fromLatin1("TUR") + << QString("postcode") + << QString::fromLatin1("street number
" + "postcode district, city
" + "country"); + QTest::newRow("Ukraine") << QString::fromLatin1("UKR") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "city postcode
" + "country"); + QTest::newRow("United States") << QString::fromLatin1("USA") + << QString::fromLatin1("postcode") + << QString::fromLatin1("number street
" + "city, state postcode
" + "country"); + QTest::newRow("Virgin Islands, US") << QString::fromLatin1("VIR") + << QString("postcode") + << QString::fromLatin1("number street
" + "city, state postcode
" + "country"); + QTest::newRow("Vatican City State") << QString::fromLatin1("VAT") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "postcode city
" + "country"); + QTest::newRow("Venezuela") << QString::fromLatin1("VEN") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "city postcode, state
" + "country"); + QTest::newRow("South Africa") << QString::fromLatin1("ZAF") + << QString() + << QString::fromLatin1("street number
" + "district, city
" + "country"); + QTest::newRow("Finland") << QString::fromLatin1("FIN") + << QString::fromLatin1("postcode") + << QString::fromLatin1("street number
" + "postcode city
" + "country"); +} + +void tst_QGeoAddress::operatorsTest() +{ + QGeoAddress testObj; + testObj.setStreet("testValue"); + QGeoAddress testObj2; + testObj2 = testObj; + QVERIFY2(testObj == testObj2, "Not copied correctly"); + testObj2.setCountry("testValue2"); + QVERIFY2(testObj != testObj2, "Object should be different"); +} + +void tst_QGeoAddress::emptyClearTest() +{ + QGeoAddress testObj; + QVERIFY(testObj.isEmpty()); + + testObj.setCountry(QStringLiteral("country")); + QVERIFY(!testObj.isEmpty()); + testObj.clear(); + + testObj.setCountryCode(QStringLiteral("countryCode")); + QVERIFY(!testObj.isEmpty()); + testObj.clear(); + + testObj.setState(QStringLiteral("state")); + QVERIFY(!testObj.isEmpty()); + testObj.clear(); + + testObj.setCounty(QStringLiteral("county")); + QVERIFY(!testObj.isEmpty()); + testObj.clear(); + + testObj.setCity(QStringLiteral("city")); + QVERIFY(!testObj.isEmpty()); + testObj.clear(); + + testObj.setDistrict(QStringLiteral("district")); + QVERIFY(!testObj.isEmpty()); + testObj.clear(); + + testObj.setPostalCode(QStringLiteral("postalCode")); + QVERIFY(!testObj.isEmpty()); + testObj.clear(); + + testObj.setStreet(QStringLiteral("street")); + QVERIFY(!testObj.isEmpty()); + testObj.clear(); + + testObj.setStreetNumber(QStringLiteral("street number")); + QVERIFY(!testObj.isEmpty()); + testObj.clear(); + + testObj.setText(QStringLiteral("formatted address")); + QVERIFY(!testObj.isEmpty()); + testObj.clear(); + + QVERIFY(testObj.isEmpty()); +} + +void tst_QGeoAddress::hashingTest() +{ + QFETCH(QGeoAddress, leftAddress); + QFETCH(QGeoAddress, rightAddress); + QFETCH(bool, result); + + const size_t leftHash = qHash(leftAddress); + const size_t rightHash = qHash(rightAddress); + QCOMPARE(leftHash == rightHash, result); +} + +void tst_QGeoAddress::hashingTest_data() +{ + QTest::addColumn("leftAddress"); + QTest::addColumn("rightAddress"); + QTest::addColumn("result"); + + QGeoAddress leftAddress; + QGeoAddress rightAddress; + + QTest::newRow("empty") << leftAddress << rightAddress << true; + // country + leftAddress.setCountry("country"); + QTest::newRow("different country") << leftAddress << rightAddress << false; + rightAddress.setCountry("country"); + QTest::newRow("same country") << leftAddress << rightAddress << true; + // country code + leftAddress.setCountryCode("country code"); + QTest::newRow("different code") << leftAddress << rightAddress << false; + rightAddress.setCountryCode("country code"); + QTest::newRow("same code") << leftAddress << rightAddress << true; + // state + leftAddress.setState("state"); + QTest::newRow("different state") << leftAddress << rightAddress << false; + rightAddress.setState("state"); + QTest::newRow("same state") << leftAddress << rightAddress << true; + // county + leftAddress.setCounty("county"); + QTest::newRow("different county") << leftAddress << rightAddress << false; + rightAddress.setCounty("county"); + QTest::newRow("same county") << leftAddress << rightAddress << true; + // city + leftAddress.setCity("city"); + QTest::newRow("different city") << leftAddress << rightAddress << false; + rightAddress.setCity("city"); + QTest::newRow("same city") << leftAddress << rightAddress << true; + // district + leftAddress.setDistrict("district"); + QTest::newRow("different district") << leftAddress << rightAddress << false; + rightAddress.setDistrict("district"); + QTest::newRow("same district") << leftAddress << rightAddress << true; + // street + leftAddress.setStreet("street"); + QTest::newRow("different street") << leftAddress << rightAddress << false; + rightAddress.setStreet("street"); + QTest::newRow("same street") << leftAddress << rightAddress << true; + // street number + leftAddress.setStreetNumber("number"); + QTest::newRow("different number") << leftAddress << rightAddress << false; + rightAddress.setStreetNumber("number"); + QTest::newRow("same number") << leftAddress << rightAddress << true; + // postal code + leftAddress.setPostalCode("postal code"); + QTest::newRow("different postcode") << leftAddress << rightAddress << false; + rightAddress.setPostalCode("postal code"); + QTest::newRow("same postcode") << leftAddress << rightAddress << true; + // custom text + leftAddress.setText("some custom text"); + QTest::newRow("different custom text") << leftAddress << rightAddress << false; + rightAddress.setText("some custom text"); + QTest::newRow("same custom text") << leftAddress << rightAddress << true; + + // empty with custom text + leftAddress.clear(); + leftAddress.setText("some custom text"); + rightAddress.clear(); + QTest::newRow("empty with different custom text") << leftAddress << rightAddress << false; + rightAddress.setText("some custom text"); + QTest::newRow("empty with same custom text") << leftAddress << rightAddress << true; +} + +QTEST_APPLESS_MAIN(tst_QGeoAddress) + +#include "tst_qgeoaddress.moc" diff --git a/tests/auto/qgeoareamonitor/BLACKLIST b/tests/auto/qgeoareamonitor/BLACKLIST new file mode 100644 index 0000000..1cd00b5 --- /dev/null +++ b/tests/auto/qgeoareamonitor/BLACKLIST @@ -0,0 +1,2 @@ +# QTBUG-116920 - fails to deploy a needed plugin +android ci diff --git a/tests/auto/qgeoareamonitor/CMakeLists.txt b/tests/auto/qgeoareamonitor/CMakeLists.txt new file mode 100644 index 0000000..1e81785 --- /dev/null +++ b/tests/auto/qgeoareamonitor/CMakeLists.txt @@ -0,0 +1,36 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeoareamonitor.pro. + +##################################################################### +## tst_qgeoareamonitor Test: +##################################################################### + +list(APPEND test_data "simplelog.txt") + +qt_internal_add_test(tst_qgeoareamonitor + SOURCES + logfilepositionsource.cpp logfilepositionsource.h + positionconsumerthread.cpp positionconsumerthread.h + tst_qgeoareamonitor.cpp + LIBRARIES + Qt::Core + Qt::Positioning + TESTDATA ${test_data} +) + +# QGeoAreaMonitor positionpoll plugin requires the presence of a +# QGeoPositionInfoSource object. It could be provided by android position +# plugin, but that plugin is not loaded for unit-tests, so we have to explicitly +# use a test position plugin. +add_dependencies(tst_qgeoareamonitor QGeoPositionInfoSourceFactoryTestPlugin) +if(ANDROID) + set_target_properties(tst_qgeoareamonitor PROPERTIES + QT_ANDROID_EXTRA_PLUGINS "$" + ) +endif() + +#### Keys ignored in scope 1:.:.:qgeoareamonitor.pro:: +# OTHER_FILES = "*.txt" +# TEMPLATE = "app" diff --git a/tests/auto/qgeoareamonitor/logfilepositionsource.cpp b/tests/auto/qgeoareamonitor/logfilepositionsource.cpp new file mode 100644 index 0000000..6ec8c83 --- /dev/null +++ b/tests/auto/qgeoareamonitor/logfilepositionsource.cpp @@ -0,0 +1,107 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include "logfilepositionsource.h" + +LogFilePositionSource::LogFilePositionSource(const QList &data, QObject *parent) + : QGeoPositionInfoSource(parent), + timer(new QTimer(this)), + lines(data) +{ + connect(timer, SIGNAL(timeout()), this, SLOT(readNextPosition())); + + if (lines.isEmpty()) + qWarning() << "Error: the input data is empty!"; + else + index = 0; // ready to read +} + +QGeoPositionInfo LogFilePositionSource::lastKnownPosition(bool /*fromSatellitePositioningMethodsOnly*/) const +{ + return lastPosition; +} + +LogFilePositionSource::PositioningMethods LogFilePositionSource::supportedPositioningMethods() const +{ + return AllPositioningMethods; +} + +int LogFilePositionSource::minimumUpdateInterval() const +{ + return 50; +} + +void LogFilePositionSource::startUpdates() +{ + lastError = QGeoPositionInfoSource::NoError; + int interval = updateInterval(); + if (interval < minimumUpdateInterval()) + interval = minimumUpdateInterval(); + + if (!timer->isActive()) { + if (QMetaObject::invokeMethod(timer, "start", Q_ARG(int, interval))) + emit updatesStarted(); + } +} + +void LogFilePositionSource::stopUpdates() +{ + if (timer->isActive()) { + if (QMetaObject::invokeMethod(timer, "stop")) + emit updatesStopped(); + } +} + +void LogFilePositionSource::requestUpdate(int /*timeout*/) +{ + // For simplicity, ignore timeout - assume that if data is not available + // now, no data will be added to the file later + lastError = QGeoPositionInfoSource::NoError; + if (canReadLine()) { + readNextPosition(); + } else { + lastError = QGeoPositionInfoSource::UpdateTimeoutError; + emit errorOccurred(lastError); + } +} + +void LogFilePositionSource::readNextPosition() +{ + if (canReadLine()) { + const QByteArray line = lines.at(index); + if (!line.isEmpty()) { + QList data = line.split(' '); + double latitude; + double longitude; + bool hasLatitude = false; + bool hasLongitude = false; + QDateTime timestamp = QDateTime::fromString(QString(data.value(0)), Qt::ISODate); + latitude = data.value(1).toDouble(&hasLatitude); + longitude = data.value(2).toDouble(&hasLongitude); + + if (hasLatitude && hasLongitude && timestamp.isValid()) { + QGeoCoordinate coordinate(latitude, longitude); + QGeoPositionInfo info(coordinate, timestamp); + if (info.isValid()) { + lastPosition = info; + emit positionUpdated(info); + } + } + } + index++; + } else if (!noDataEmitted) { + emit noDataLeft(); + noDataEmitted = true; + } +} + +bool LogFilePositionSource::canReadLine() const +{ + return (index >= 0) && (index < lines.size()); +} + +QGeoPositionInfoSource::Error LogFilePositionSource::error() const +{ + return lastError; +} diff --git a/tests/auto/qgeoareamonitor/logfilepositionsource.h b/tests/auto/qgeoareamonitor/logfilepositionsource.h new file mode 100644 index 0000000..7a6e105 --- /dev/null +++ b/tests/auto/qgeoareamonitor/logfilepositionsource.h @@ -0,0 +1,56 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef LOGFILEPOSITIONSOURCE_H +#define LOGFILEPOSITIONSOURCE_H + +#include + +QT_BEGIN_NAMESPACE +class QTimer; +QT_END_NAMESPACE + +class LogFilePositionSource : public QGeoPositionInfoSource +{ + Q_OBJECT +public: + // This class is optimized to reduce the file IO. + // Initially it was reading the file line-by-line. + // It does not modify the data, so it was optimized to just hold the + // const reference to the pre-existing data, that can now be read once + // for all the instances of this class (for example, during the + // initTestCase() call). + LogFilePositionSource(const QList &data, QObject *parent = 0); + + QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const override; + + PositioningMethods supportedPositioningMethods() const override; + int minimumUpdateInterval() const override; + Error error() const override; + +signals: + void noDataLeft(); + void updatesStarted(); + void updatesStopped(); + +public slots: + virtual void startUpdates() override; + virtual void stopUpdates() override; + + virtual void requestUpdate(int timeout = 5000) override; + +private slots: + void readNextPosition(); + +private: + bool canReadLine() const; + + QTimer *timer; + QGeoPositionInfo lastPosition; + Error lastError = QGeoPositionInfoSource::NoError; + const QList &lines; + qsizetype index = -1; + bool noDataEmitted = false; +}; + +#endif diff --git a/tests/auto/qgeoareamonitor/positionconsumerthread.cpp b/tests/auto/qgeoareamonitor/positionconsumerthread.cpp new file mode 100644 index 0000000..2703d63 --- /dev/null +++ b/tests/auto/qgeoareamonitor/positionconsumerthread.cpp @@ -0,0 +1,48 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include "positionconsumerthread.h" + +PositionConsumerThread::PositionConsumerThread(QGeoAreaMonitorSource *source, QObject *parent) + : QThread(parent), m_source(source) +{ +} + +PositionConsumerThread::~PositionConsumerThread() +{ + stopProcessing(); + wait(); +} + +int PositionConsumerThread::detectedEnterCount() const +{ + QMutexLocker locker(&m_mutex); + return m_detectedEnterCount; +} + +int PositionConsumerThread::detectedExitCount() const +{ + QMutexLocker locker(&m_mutex); + return m_detectedExitCount; +} + +void PositionConsumerThread::stopProcessing() +{ + m_mutex.lock(); + m_waitCondition.wakeOne(); + m_mutex.unlock(); +} + +void PositionConsumerThread::run() +{ + QSignalSpy enterSpy(m_source, &QGeoAreaMonitorSource::areaEntered); + QSignalSpy exitSpy(m_source, &QGeoAreaMonitorSource::areaExited); + + m_mutex.lock(); + m_waitCondition.wait(&m_mutex); + m_detectedEnterCount = enterSpy.size(); + m_detectedExitCount = exitSpy.size(); + m_mutex.unlock(); +} diff --git a/tests/auto/qgeoareamonitor/positionconsumerthread.h b/tests/auto/qgeoareamonitor/positionconsumerthread.h new file mode 100644 index 0000000..aba98ab --- /dev/null +++ b/tests/auto/qgeoareamonitor/positionconsumerthread.h @@ -0,0 +1,49 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef POSITIONCONSUMERTHREAD_H +#define POSITIONCONSUMERTHREAD_H + +#include +#include +#include + +QT_BEGIN_NAMESPACE +class QGeoAreaMonitorSource; +QT_END_NAMESPACE + +// This class is created to test the behavior of QGeoAreaMonitorPolling class, +// that reimplements the connectNotify() and disconnetNotify() methods, by +// triggering these methods from multiple threads. +// The thread creates two QSignalSpy instances, that connect to the signals of +// QGeoAreaMonitorSource. Once constructed, they trigger connectNotify(). +// Once destroyed, they trigger disconnectNotify. +// With the previous implementation of these overridden methods, that could lead +// to a deadlock in a rare case. +class PositionConsumerThread : public QThread +{ + Q_OBJECT +public: + explicit PositionConsumerThread(QGeoAreaMonitorSource *source, QObject *parent = nullptr); + ~PositionConsumerThread(); + + int detectedEnterCount() const; + int detectedExitCount() const; + +public slots: + void stopProcessing(); + +protected: + void run() override; + +private: + QGeoAreaMonitorSource *m_source; + + int m_detectedEnterCount = 0; + int m_detectedExitCount = 0; + + mutable QMutex m_mutex; + QWaitCondition m_waitCondition; +}; + +#endif // POSITIONCONSUMERTHREAD_H diff --git a/tests/auto/qgeoareamonitor/simplelog.txt b/tests/auto/qgeoareamonitor/simplelog.txt new file mode 100644 index 0000000..5a14fb8 --- /dev/null +++ b/tests/auto/qgeoareamonitor/simplelog.txt @@ -0,0 +1,87 @@ +2009-08-24T22:24:34 -27.54 153.090718 +2009-08-24T22:24:35 -27.55 153.090718 +2009-08-24T22:24:36 -27.56 153.090718 +2009-08-24T22:24:37 -27.57 153.090718 +2009-08-24T22:24:38 -27.58 153.090783 +2009-08-24T22:24:39 -27.59 153.090845 +2009-08-24T22:24:40 -27.60 153.090908 +2009-08-24T22:24:41 -27.61 153.090971 +2009-08-24T22:24:42 -27.62 153.091036 +2009-08-24T22:24:43 -27.63 153.091102 +2009-08-24T22:24:44 -27.64 153.091167 +2009-08-24T22:24:45 -27.65 153.091232 +2009-08-24T22:24:46 -27.65 153.091298 +2009-08-24T22:24:47 -27.65 153.091366 +2009-08-24T22:24:48 -27.65 153.091435 +2009-08-24T22:24:49 -27.66 153.091507 +2009-08-24T22:24:50 -27.67 153.091581 +2009-08-24T22:24:51 -27.68 153.091654 +2009-08-24T22:24:52 -27.69 153.091729 +2009-08-24T22:24:53 -27.70 153.091800 +2009-08-24T22:24:54 -27.71 153.091870 +2009-08-24T22:24:55 -27.72 153.091940 +2009-08-24T22:24:56 -27.73 153.092010 +2009-08-24T22:24:57 -27.74 153.092078 +2009-08-24T22:24:58 -27.75 153.092144 +2009-08-24T22:24:59 -27.78 153.092218 +2009-08-24T22:25:00 -27.79 153.092308 +2009-08-24T22:25:01 -27.80 153.092415 +2009-08-24T22:25:02 -27.81 153.092530 +2009-08-24T22:25:03 -27.82 153.092648 +2009-08-24T22:25:04 -27.83 153.092763 +2009-08-24T22:25:05 -27.84 153.092879 +2009-08-24T22:25:06 -27.85 153.092990 +2009-08-24T22:25:07 -27.84 153.093099 +2009-08-24T22:25:08 -27.83 153.093204 +2009-08-24T22:25:09 -27.82 153.093303 +2009-08-24T22:25:10 -27.81 153.093396 +2009-08-24T22:25:11 -27.80 153.093484 +2009-08-24T22:25:12 -27.79 153.093568 +2009-08-24T22:25:13 -27.78 153.093647 +2009-08-24T22:25:14 -27.77 153.093727 +2009-08-24T22:25:15 -27.76 153.093810 +2009-08-24T22:25:16 -27.75 153.093896 +2009-08-24T22:25:17 -27.74 153.093984 +2009-08-24T22:25:18 -27.72 153.094074 +2009-08-24T22:25:19 -27.70 153.094168 +2009-08-24T22:25:20 -27.71 153.094267 +2009-08-24T22:25:21 -27.69 153.094370 +2009-08-24T22:25:22 -27.68 153.094474 +2009-08-24T22:25:23 -27.67 153.094581 +2009-08-24T22:25:24 -27.66 153.094688 +2009-08-24T22:25:25 -27.65 153.094796 +2009-08-24T22:25:26 -27.64 153.094905 +2009-08-24T22:25:27 -27.63 153.095012 +2009-08-24T22:25:28 -27.62 153.095121 +2009-08-24T22:25:29 -27.61 153.095231 +2009-08-24T22:25:30 -27.60 153.095340 +2009-08-24T22:25:31 -27.59 153.095449 +2009-08-24T22:25:32 -27.58 153.095558 +2009-08-24T22:25:33 -27.57 153.095667 +2009-08-24T22:25:34 -27.56 153.095776 +2009-08-24T22:25:35 -27.55 153.095885 +2009-08-24T22:25:36 -27.54 153.095995 +2009-08-24T22:25:37 -27.53 153.096109 +2009-08-24T22:25:38 -27.52 153.096226 +2009-08-24T22:25:39 -27.51 153.096337 +2009-08-24T22:25:40 -27.50 153.096441 +2009-08-24T22:25:41 -27.49 153.096537 +2009-08-24T22:25:42 -27.48 153.096628 +2009-08-24T22:25:43 -27.47 153.096714 +2009-08-24T22:25:44 -27.46 153.096795 +2009-08-24T22:25:45 -27.45 153.096847 +2009-08-24T22:25:46 -27.44 153.096855 +2009-08-24T22:25:47 -27.43 153.096873 +2009-08-24T22:25:48 -27.42 153.096875 +2009-08-24T22:25:49 -27.41 153.096878 +2009-08-24T22:25:50 -27.40 153.096880 +2009-08-24T22:25:51 -27.39 153.096880 +2009-08-24T22:25:52 -27.38 153.096881 +2009-08-24T22:25:53 -27.37 153.096882 +2009-08-24T22:25:54 -27.36 153.096883 +2009-08-24T22:25:55 -27.35 153.096883 +2009-08-24T22:25:56 -27.34 153.096883 +2009-08-24T22:25:57 -27.33 153.096890 +2009-08-24T22:25:58 -27.32 153.096919 +2009-08-24T22:25:59 -27.31 153.096985 +2009-08-24T22:26:00 -27.30 153.097060 diff --git a/tests/auto/qgeoareamonitor/tst_qgeoareamonitor.cpp b/tests/auto/qgeoareamonitor/tst_qgeoareamonitor.cpp new file mode 100644 index 0000000..90dffa1 --- /dev/null +++ b/tests/auto/qgeoareamonitor/tst_qgeoareamonitor.cpp @@ -0,0 +1,925 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +//TESTED_COMPONENT=src/location + +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "logfilepositionsource.h" +#include "positionconsumerthread.h" + +#include + +QT_USE_NAMESPACE +#define UPDATE_INTERVAL 50 + +QString tst_qgeoareamonitorinfo_debug; + +void tst_qgeoareamonitorinfo_messageHandler(QtMsgType type, + const QMessageLogContext &, + const QString &msg) +{ + switch (type) { + case QtDebugMsg : + tst_qgeoareamonitorinfo_debug = msg; + break; + default: + break; + } +} + +static QList readFileData(const QString &fileName) +{ + QList data; + QFile logFile(fileName); + if (logFile.open(QIODevice::ReadOnly)) { + data = logFile.readAll().split('\n'); + logFile.close(); + } else { + qWarning() << "Error: cannot open source file" << logFile.fileName(); + } + return data; +} + +class DummyMonitorSource : public QGeoAreaMonitorSource +{ + Q_OBJECT +public: + static const QString kTestProperty; + + DummyMonitorSource(QObject *parent = nullptr) : QGeoAreaMonitorSource(parent) + {} + + Error error() const override + { + return NoError; + } + AreaMonitorFeatures supportedAreaMonitorFeatures() const override + { + return AnyAreaMonitorFeature; + } + + bool startMonitoring(const QGeoAreaMonitorInfo &monitor) override + { + Q_UNUSED(monitor); + return false; + } + bool stopMonitoring(const QGeoAreaMonitorInfo &monitor) override + { + Q_UNUSED(monitor); + return false; + } + bool requestUpdate(const QGeoAreaMonitorInfo &monitor, const char *signal) override + { + Q_UNUSED(monitor); + Q_UNUSED(signal); + return false; + } + + QList activeMonitors() const override + { + return {}; + } + QList activeMonitors(const QGeoShape &lookupArea) const override + { + Q_UNUSED(lookupArea); + return {}; + } + + bool setBackendProperty(const QString &name, const QVariant &value) override + { + if (name == kTestProperty) { + m_testPropertyValue = value.toInt(); + return true; + } + return false; + } + QVariant backendProperty(const QString &name) const override + { + if (name == kTestProperty) + return m_testPropertyValue; + return QVariant(); + } + +private: + int m_testPropertyValue = 0; +}; + +const QString DummyMonitorSource::kTestProperty = "TestProperty"; + +class tst_QGeoAreaMonitorSource : public QObject +{ + Q_OBJECT + +private: + QList m_fileData; + +private slots: + void initTestCase() + { +#if QT_CONFIG(library) + /* + * Set custom path since CI doesn't install plugins + */ +#ifdef Q_OS_WIN + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../../plugins")); +#else + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../plugins")); +#endif +#endif + qRegisterMetaType(); + m_fileData = readFileData(QFINDTESTDATA("simplelog.txt")); + } + + void init() + { + } + + void cleanup() + { + std::unique_ptr obj( + QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); + QVERIFY(obj != nullptr); + QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); + + const QList list = obj->activeMonitors(); + if (list.size() > 0) { + //cleanup installed monitors + for (const QGeoAreaMonitorInfo& info : list) { + QVERIFY(obj->stopMonitoring(info)); + } + } + QVERIFY(obj->activeMonitors().size() == 0); + } + + void cleanupTestCase() + { + } + + void tst_monitor() + { + QGeoAreaMonitorInfo defaultMonitor; + QVERIFY(defaultMonitor.name().isEmpty()); + QVERIFY(!defaultMonitor.identifier().isEmpty()); + QCOMPARE(defaultMonitor.isPersistent(), false); + QVERIFY(!defaultMonitor.area().isValid()); + QVERIFY(!defaultMonitor.isValid()); + QCOMPARE(defaultMonitor.expiration(), QDateTime()); + QCOMPARE(defaultMonitor.notificationParameters(), QVariantMap()); + + std::unique_ptr obj( + QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); + QVERIFY(obj != nullptr); + QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); + QVERIFY(!obj->startMonitoring(defaultMonitor)); + QCOMPARE(obj->activeMonitors().size(), 0); + QVERIFY(!obj->requestUpdate(defaultMonitor, + SIGNAL(areaEntered(QGeoMonitorInfo,QGeoAreaPositionInfo)))); + + //copy constructor based + QGeoAreaMonitorInfo copy(defaultMonitor); + QVERIFY(copy.name().isEmpty()); + QCOMPARE(copy.identifier(), defaultMonitor.identifier()); + QVERIFY(copy == defaultMonitor); + QVERIFY(!(copy != defaultMonitor)); + QCOMPARE(copy.isPersistent(), false); + + copy.setName(QString("my name")); + QCOMPARE(copy.name(), QString("my name")); + + + QDateTime now = QDateTime::currentDateTime().addSecs(1000); //little bit in the future + copy.setExpiration(now); + QVERIFY(copy != defaultMonitor); + QCOMPARE(copy.expiration(), now); + + QCOMPARE(copy.isPersistent(), defaultMonitor.isPersistent()); + copy.setPersistent(true); + QCOMPARE(copy.isPersistent(), true); + QCOMPARE(defaultMonitor.isPersistent(), false); + copy.setPersistent(false); + + QVERIFY(copy.area() == defaultMonitor.area()); + QVERIFY(!copy.area().isValid()); + copy.setArea(QGeoCircle(QGeoCoordinate(1, 2), 4)); + QVERIFY(copy.area().isValid()); + QVERIFY(copy.area() != defaultMonitor.area()); + QVERIFY(copy.area().contains(QGeoCoordinate(1, 2))); + + QVERIFY(copy.notificationParameters().isEmpty()); + QVariantMap map; + map.insert(QString("MyKey"), QVariant(123)); + copy.setNotificationParameters(map); + QVERIFY(!copy.notificationParameters().isEmpty()); + QCOMPARE(copy.notificationParameters().value(QString("MyKey")).toInt(), 123); + QCOMPARE(defaultMonitor.notificationParameters().value(QString("MyKey")).toInt(), 0); + + QCOMPARE(defaultMonitor.identifier(), copy.identifier()); + + //assignment operator based + QGeoAreaMonitorInfo assignmentCopy; + assignmentCopy = copy; + QVERIFY(copy == assignmentCopy); + QVERIFY(assignmentCopy != defaultMonitor); + + QVERIFY(assignmentCopy.area().contains(QGeoCoordinate(1, 2))); + QCOMPARE(assignmentCopy.expiration(), now); + QCOMPARE(assignmentCopy.isPersistent(), false); + QCOMPARE(assignmentCopy.notificationParameters().value(QString("MyKey")).toInt(), 123); + QCOMPARE(defaultMonitor.identifier(), assignmentCopy.identifier()); + QCOMPARE(assignmentCopy.name(), QString("my name")); + + //validity checks for requestUpdate() + obj.reset(QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); + QVERIFY(obj != nullptr); + QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); + QCOMPARE(obj->activeMonitors().size(), 0); + //reference -> should work + QVERIFY(obj->requestUpdate(copy, SIGNAL(areaEntered(QGeoAreaMonitorInfo,QGeoPositionInfo)))); + QCOMPARE(obj->activeMonitors().size(), 1); + //replaces areaEntered single shot + QVERIFY(obj->requestUpdate(copy, SIGNAL(areaExited(QGeoAreaMonitorInfo,QGeoPositionInfo)))); + QCOMPARE(obj->activeMonitors().size(), 1); + //replaces areaExited single shot + QVERIFY(obj->startMonitoring(copy)); + QCOMPARE(obj->activeMonitors().size(), 1); + + + //invalid signal + QVERIFY(!obj->requestUpdate(copy, 0)); + QCOMPARE(obj->activeMonitors().size(), 1); + + //signal that doesn't exist + QVERIFY(!obj->requestUpdate(copy, SIGNAL(areaEntered(QGeoMonitor)))); + QCOMPARE(obj->activeMonitors().size(), 1); + + QVERIFY(!obj->requestUpdate(copy, "SIGNAL(areaEntered(QGeoMonitor))")); + QCOMPARE(obj->activeMonitors().size(), 1); + + //ensure that we cannot add a persistent monitor to a source + //that doesn't support persistence + QGeoAreaMonitorInfo persistenceMonitor(copy); + persistenceMonitor.setPersistent(obj->supportedAreaMonitorFeatures() & QGeoAreaMonitorSource::PersistentAreaMonitorFeature); + persistenceMonitor.setPersistent(!persistenceMonitor.isPersistent()); + + QVERIFY(!obj->requestUpdate(persistenceMonitor, SIGNAL(areaEntered(QGeoAreaMonitorInfo,QGeoPositionInfo)))); + QCOMPARE(obj->activeMonitors().size(), 1); + QVERIFY(!obj->startMonitoring(persistenceMonitor)); + QCOMPARE(obj->activeMonitors().size(), 1); + + //ensure that persistence was only reason for rejection + persistenceMonitor.setPersistent(!persistenceMonitor.isPersistent()); + QVERIFY(obj->startMonitoring(persistenceMonitor)); + //persistenceMonitor is copy of already added monitor + //the last call was an update + QCOMPARE(obj->activeMonitors().size(), 1); + } + + void tst_monitor_move_semantics() + { + QGeoAreaMonitorInfo info1("test"); + info1.setArea(QGeoCircle(QGeoCoordinate(1.0, 1.0), 100)); + info1.setExpiration(QDateTime::currentDateTimeUtc()); + QGeoAreaMonitorInfo infoCopy(info1); + + QGeoAreaMonitorInfo info2(std::move(info1)); + QCOMPARE(info2, infoCopy); + + QGeoAreaMonitorInfo info3; + info3.setName("name"); + info3.setArea(QGeoRectangle(QGeoCoordinate(1, 2), QGeoCoordinate(2, 1))); + info3.setPersistent(true); + infoCopy = info3; + + // check that (move)assigning to the moved-from object is ok + info1 = std::move(info3); + QCOMPARE(info1, infoCopy); + + // The moved-from object info3 will go out of scope and will be + // destroyed here, so we also implicitly check that moved-from object's + // destructor is called without any issues. + } + + void tst_monitorValid() + { + QGeoAreaMonitorInfo mon; + QVERIFY(!mon.isValid()); + QCOMPARE(mon.name(), QString()); + QCOMPARE(mon.area().isValid(), false); + + QGeoAreaMonitorInfo mon2 = mon; + QVERIFY(!mon2.isValid()); + + QGeoShape invalidShape; + QGeoCircle emptyCircle(QGeoCoordinate(0,1), 0); + QGeoCircle validCircle(QGeoCoordinate(0,1), 1); + + //all invalid since no name set yet + mon2.setArea(invalidShape); + QVERIFY(mon2.area() == invalidShape); + QVERIFY(!mon2.isValid()); + + mon2.setArea(emptyCircle); + QVERIFY(mon2.area() == emptyCircle); + QVERIFY(!mon2.isValid()); + + mon2.setArea(validCircle); + QVERIFY(mon2.area() == validCircle); + QVERIFY(!mon2.isValid()); + + //valid since name and non-empy shape has been set + QGeoAreaMonitorInfo validMonitor("TestMonitor"); + QVERIFY(validMonitor.name() == QString("TestMonitor")); + QVERIFY(!validMonitor.isValid()); + + validMonitor.setArea(invalidShape); + QVERIFY(validMonitor.area() == invalidShape); + QVERIFY(!validMonitor.isValid()); + + validMonitor.setArea(emptyCircle); + QVERIFY(validMonitor.area() == emptyCircle); + QVERIFY(!validMonitor.isValid()); + + validMonitor.setArea(validCircle); + QVERIFY(validCircle == validMonitor.area()); + QVERIFY(validMonitor.isValid()); + } + + void tst_monitorStreaming() + { + QByteArray container; + QDataStream stream(&container, QIODevice::ReadWrite); + + QGeoAreaMonitorInfo monitor("someName"); + monitor.setArea(QGeoCircle(QGeoCoordinate(1,3), 5.4)); + const QDateTime expirationTime = QDateTime::currentDateTime().addSecs(60); + monitor.setExpiration(expirationTime); + monitor.setPersistent(true); + const QVariantMap params { {"string_param", "some string"}, + {"int_param", 1}, {"double_param", 3.5} }; + monitor.setNotificationParameters(params); + QVERIFY(monitor.isValid()); + QCOMPARE(monitor.name(), QString("someName")); + QCOMPARE(monitor.expiration(), expirationTime); + QVERIFY(monitor.isPersistent()); + QCOMPARE(monitor.notificationParameters(), params); + + QGeoAreaMonitorInfo target; + QVERIFY(!target.isValid()); + QVERIFY(target.name().isEmpty()); + + QVERIFY(target != monitor); + + stream << monitor; + stream.device()->seek(0); + stream >> target; + + QVERIFY(target == monitor); + QVERIFY(target.isValid()); + QCOMPARE(target.name(), QString("someName")); + QVERIFY(target.area() == QGeoCircle(QGeoCoordinate(1,3), 5.4)); + QCOMPARE(target.expiration(), expirationTime); + QVERIFY(target.isPersistent()); + QCOMPARE(target.notificationParameters(), params); + } + + void tst_createDefaultSource() + { + std::unique_ptr parent(new QObject); + + // Have to use a raw pointer here, because otherwise we'd end up + // deleting the obj twice when deleting the parent + QGeoAreaMonitorSource *obj = QGeoAreaMonitorSource::createDefaultSource(parent.get()); + QVERIFY(obj != nullptr); + QVERIFY(obj->parent() == parent.get()); + delete obj; + + const QStringList monitors = QGeoAreaMonitorSource::availableSources(); + QVERIFY(!monitors.isEmpty()); + QVERIFY(monitors.contains(QStringLiteral("positionpoll"))); + + obj = QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), parent.get()); + QVERIFY(obj != nullptr); + QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); + parent.reset(); + + // using a smart pointer will cause a double delete here + obj = QGeoAreaMonitorSource::createSource(QStringLiteral("randomNonExistingName"), 0); + QVERIFY(obj == nullptr); + } + + void tst_activeMonitors() + { + std::unique_ptr obj( + QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); + QVERIFY(obj != nullptr); + QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); + + // using this -> no need for smart pointer + LogFilePositionSource *source = new LogFilePositionSource(m_fileData, this); + source->setUpdateInterval(UPDATE_INTERVAL); + obj->setPositionInfoSource(source); + QCOMPARE(obj->positionInfoSource(), source); + + + QVERIFY(obj->activeMonitors().isEmpty()); + + QGeoAreaMonitorInfo mon("Monitor_Circle"); + mon.setArea(QGeoCircle(QGeoCoordinate(1,1), 1000)); + QVERIFY(obj->startMonitoring(mon)); + + QGeoAreaMonitorInfo mon2("Monitor_rectangle_below"); + QGeoRectangle r_below(QGeoCoordinate(1,1),2,2); + mon2.setArea(r_below); + QVERIFY(obj->startMonitoring(mon2)); + + QGeoAreaMonitorInfo mon3("Monitor_rectangle_above"); + QGeoRectangle r_above(QGeoCoordinate(2,1),2,2); + mon3.setArea(r_above); + QVERIFY(obj->startMonitoring(mon3)); + +#define CHECK(o, args, ...) do { \ + const QList results = o ->activeMonitors args; \ + const std::initializer_list expected = __VA_ARGS__ ; \ + QCOMPARE(results.size(), int(expected.size())); \ + QVERIFY(std::is_permutation(results.begin(), results.end(), \ + expected.begin(), expected.end())); \ + } while (false) + + CHECK(obj, (), {mon, mon2, mon3}); + CHECK(obj, (QGeoShape{}), {}); + CHECK(obj, (QGeoRectangle{QGeoCoordinate{1, 1}, 0.2, 0.2}), {mon, mon2}); + CHECK(obj, (QGeoCircle{QGeoCoordinate{1, 1}, 1000}), {mon, mon2}); + CHECK(obj, (QGeoCircle{QGeoCoordinate{2, 1},1000}), {mon3}); + + //same as above except that we use a different monitor source object instance + //all monitor objects of same type share same active monitors + std::unique_ptr secondObj( + QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); + QVERIFY(secondObj != nullptr); + QCOMPARE(secondObj->sourceName(), QStringLiteral("positionpoll")); + + CHECK(secondObj, (), {mon, mon2, mon3}); + CHECK(secondObj, (QGeoShape{}), {}); + CHECK(secondObj, (QGeoRectangle{QGeoCoordinate{1, 1}, 0.2, 0.2}), {mon, mon2}); + CHECK(secondObj, (QGeoCircle{QGeoCoordinate{1, 1}, 1000}), {mon, mon2}); + CHECK(secondObj, (QGeoCircle{QGeoCoordinate{2, 1}, 1000}), {mon3}); + +#undef CHECK + } + + void tst_testExpiryTimeout() + { + std::unique_ptr obj( + QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); + QVERIFY(obj != nullptr); + QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); + + std::unique_ptr secondObj( + QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); + QVERIFY(secondObj != nullptr); + QCOMPARE(secondObj->sourceName(), QStringLiteral("positionpoll")); + + // using this -> no need for smart pointer + LogFilePositionSource *source = new LogFilePositionSource(m_fileData, this); + source->setUpdateInterval(UPDATE_INTERVAL); + obj->setPositionInfoSource(source); + + //Singleton pattern behind QGeoAreaMonitorSource ensures same position info source + QCOMPARE(obj->positionInfoSource(), source); + QCOMPARE(secondObj->positionInfoSource(), source); + + QSignalSpy expirySpy(obj.get(), SIGNAL(monitorExpired(QGeoAreaMonitorInfo))); + QSignalSpy expirySpy2(secondObj.get(), SIGNAL(monitorExpired(QGeoAreaMonitorInfo))); + + QDateTime now = QDateTime::currentDateTime(); + + const int monitorCount = 4; + for (int i = 1; i <= monitorCount; i++) { + QGeoAreaMonitorInfo mon(QString::number(i)); + mon.setArea(QGeoRectangle(QGeoCoordinate(i,i), i, i)); + mon.setExpiration(now.addSecs(i*2)); + QVERIFY(mon.isValid()); + QVERIFY(obj->startMonitoring(mon)); + } + + + + QCOMPARE(obj->activeMonitors().size(), monitorCount); + QCOMPARE(secondObj->activeMonitors().size(), monitorCount); + + QGeoAreaMonitorInfo info("InvalidExpiry"); + info.setArea(QGeoRectangle(QGeoCoordinate(10,10), 1, 1 )); + QVERIFY(info.isValid()); + info.setExpiration(now.addSecs(-1000)); + QVERIFY(info.expiration() < now); + QVERIFY(!obj->startMonitoring(info)); + QCOMPARE(obj->activeMonitors().size(), monitorCount); + QVERIFY(!obj->requestUpdate(info, SIGNAL(areaEntered(QGeoAreaMonitorInfo,QGeoPositionInfo)))); + QCOMPARE(obj->activeMonitors().size(), monitorCount); + + for (int i = 1; i <= monitorCount; i++) { + QTRY_VERIFY_WITH_TIMEOUT(expirySpy.size() == 1, 3000); //each expiry within 2 s + QGeoAreaMonitorInfo mon = expirySpy.takeFirst().at(0).value(); + QCOMPARE(obj->activeMonitors().size(), monitorCount-i); + QCOMPARE(mon.name(), QString::number(i)); + } + + QCOMPARE(expirySpy2.size(), monitorCount); + QCOMPARE(secondObj->activeMonitors().size(), 0); //all monitors expired + for (int i = 1; i <= monitorCount; i++) { + QGeoAreaMonitorInfo mon = expirySpy2.takeFirst().at(0).value(); + QCOMPARE(mon.name(), QString::number(i)); + } + } + + void tst_enteredExitedSignal() + { + std::unique_ptr obj( + QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); + QVERIFY(obj != nullptr); + QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); + obj->setObjectName("firstObject"); + QSignalSpy enteredSpy(obj.get(), + SIGNAL(areaEntered(QGeoAreaMonitorInfo, QGeoPositionInfo))); + QSignalSpy exitedSpy(obj.get(), SIGNAL(areaExited(QGeoAreaMonitorInfo, QGeoPositionInfo))); + + // using this -> no need for smart pointer + LogFilePositionSource *source = new LogFilePositionSource(m_fileData, this); + source->setUpdateInterval(UPDATE_INTERVAL); + obj->setPositionInfoSource(source); + QCOMPARE(obj->positionInfoSource(), source); + + std::unique_ptr secondObj( + QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); + QVERIFY(secondObj != nullptr); + QCOMPARE(secondObj->sourceName(), QStringLiteral("positionpoll")); + QSignalSpy enteredSpy2(secondObj.get(), + SIGNAL(areaEntered(QGeoAreaMonitorInfo, QGeoPositionInfo))); + QSignalSpy exitedSpy2(secondObj.get(), + SIGNAL(areaExited(QGeoAreaMonitorInfo, QGeoPositionInfo))); + secondObj->setObjectName("secondObject"); + + QGeoAreaMonitorInfo infoRectangle("Rectangle"); + infoRectangle.setArea(QGeoRectangle(QGeoCoordinate(-27.65, 153.093), 0.2, 0.2)); + QVERIFY(infoRectangle.isValid()); + QVERIFY(obj->startMonitoring(infoRectangle)); + + QGeoAreaMonitorInfo infoCircle("Circle"); + infoCircle.setArea(QGeoCircle(QGeoCoordinate(-27.70, 153.093),10000)); + QVERIFY(infoCircle.isValid()); + QVERIFY(obj->startMonitoring(infoCircle)); + + QGeoAreaMonitorInfo singleShot_enter("SingleShot_on_Entered"); + singleShot_enter.setArea(QGeoRectangle(QGeoCoordinate(-27.67, 153.093), 0.2, 0.2)); + QVERIFY(singleShot_enter.isValid()); + QVERIFY(obj->requestUpdate(singleShot_enter, + SIGNAL(areaEntered(QGeoAreaMonitorInfo,QGeoPositionInfo)))); + + QGeoAreaMonitorInfo singleShot_exit("SingleShot_on_Exited"); + singleShot_exit.setArea(QGeoRectangle(QGeoCoordinate(-27.70, 153.093), 0.2, 0.2)); + QVERIFY(singleShot_exit.isValid()); + QVERIFY(obj->requestUpdate(singleShot_exit, + SIGNAL(areaExited(QGeoAreaMonitorInfo,QGeoPositionInfo)))); + + QVERIFY(obj->activeMonitors().size() == 4); //all monitors active + QVERIFY(secondObj->activeMonitors().size() == 4); //all monitors active + + static const int Number_Of_Entered_Events = 6; + static const int Number_Of_Exited_Events = 5; + //takes 87 (lines)*50(timeout)/1000 seconds to finish + QTRY_VERIFY_WITH_TIMEOUT(enteredSpy.size() == Number_Of_Entered_Events, 5000); + QTRY_VERIFY_WITH_TIMEOUT(exitedSpy.size() == Number_Of_Exited_Events, 5000); + QCOMPARE(enteredSpy.size(), Number_Of_Entered_Events); + QCOMPARE(exitedSpy.size(), Number_Of_Exited_Events); + + QList monitorsInExpectedEnteredEventOrder; + monitorsInExpectedEnteredEventOrder << infoRectangle << singleShot_enter << singleShot_exit + << infoCircle << infoCircle << infoRectangle; + + QList monitorsInExpectedExitedEventOrder; + monitorsInExpectedExitedEventOrder << infoRectangle << infoCircle + << singleShot_exit << infoCircle << infoRectangle; + + QList enteredEventCoordinateOrder; + enteredEventCoordinateOrder << QGeoCoordinate(-27.55, 153.090718) //infoRectangle + << QGeoCoordinate(-27.57, 153.090718) //singleshot_enter + << QGeoCoordinate(-27.60, 153.090908) //singleshot_exit + << QGeoCoordinate(-27.62, 153.091036) //infoCircle + << QGeoCoordinate(-27.78, 153.093647) //infoCircle + << QGeoCoordinate(-27.75, 153.093896);//infoRectangle + QCOMPARE(enteredEventCoordinateOrder.size(), Number_Of_Entered_Events); + QCOMPARE(monitorsInExpectedEnteredEventOrder.size(), Number_Of_Entered_Events); + + QList exitedEventCoordinateOrder; + exitedEventCoordinateOrder << QGeoCoordinate(-27.78, 153.092218) //infoRectangle + << QGeoCoordinate(-27.79, 153.092308) //infoCircle + << QGeoCoordinate(-27.81, 153.092530) //singleshot_exit + << QGeoCoordinate(-27.61, 153.095231) //infoCircle + << QGeoCoordinate(-27.54, 153.095995);//infoCircle + QCOMPARE(exitedEventCoordinateOrder.size(), Number_Of_Exited_Events); + QCOMPARE(monitorsInExpectedExitedEventOrder.size(), Number_Of_Exited_Events); + + //verify that both sources got the same signals + for (int i = 0; i < Number_Of_Entered_Events; i++) { + //first source + QGeoAreaMonitorInfo monInfo = enteredSpy.first().at(0).value(); + QGeoPositionInfo posInfo = enteredSpy.takeFirst().at(1).value(); + QVERIFY2(monInfo == monitorsInExpectedEnteredEventOrder.at(i), + qPrintable(QString::number(i) + ": " + monInfo.name())); + QVERIFY2(posInfo.coordinate() == enteredEventCoordinateOrder.at(i), + qPrintable(QString::number(i) + ". posInfo")); + + //reset info objects to avoid comparing the same + monInfo = QGeoAreaMonitorInfo(); + posInfo = QGeoPositionInfo(); + + //second source + monInfo = enteredSpy2.first().at(0).value(); + posInfo = enteredSpy2.takeFirst().at(1).value(); + QVERIFY2(monInfo == monitorsInExpectedEnteredEventOrder.at(i), + qPrintable(QString::number(i) + ": " + monInfo.name())); + QVERIFY2(posInfo.coordinate() == enteredEventCoordinateOrder.at(i), + qPrintable(QString::number(i) + ". posInfo")); + } + + for (int i = 0; i < Number_Of_Exited_Events; i++) { + //first source + QGeoAreaMonitorInfo monInfo = exitedSpy.first().at(0).value(); + QGeoPositionInfo posInfo = exitedSpy.takeFirst().at(1).value(); + QVERIFY2(monInfo == monitorsInExpectedExitedEventOrder.at(i), + qPrintable(QString::number(i) + ": " + monInfo.name())); + QVERIFY2(posInfo.coordinate() == exitedEventCoordinateOrder.at(i), + qPrintable(QString::number(i) + ". posInfo")); + + //reset info objects to avoid comparing the same + monInfo = QGeoAreaMonitorInfo(); + posInfo = QGeoPositionInfo(); + + //second source + monInfo = exitedSpy2.first().at(0).value(); + posInfo = exitedSpy2.takeFirst().at(1).value(); + QVERIFY2(monInfo == monitorsInExpectedExitedEventOrder.at(i), + qPrintable(QString::number(i) + ": " + monInfo.name())); + QVERIFY2(posInfo.coordinate() == exitedEventCoordinateOrder.at(i), + qPrintable(QString::number(i) + ". posInfo")); + } + + QCOMPARE(obj->activeMonitors().size(), 2); //single shot monitors have been removed + QCOMPARE(secondObj->activeMonitors().size(), 2); + } + + void tst_swapOfPositionSource() + { + std::unique_ptr obj( + QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); + QVERIFY(obj != nullptr); + QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); + obj->setObjectName("firstObject"); + QSignalSpy enteredSpy(obj.get(), + SIGNAL(areaEntered(QGeoAreaMonitorInfo, QGeoPositionInfo))); + QSignalSpy exitedSpy(obj.get(), SIGNAL(areaExited(QGeoAreaMonitorInfo, QGeoPositionInfo))); + + std::unique_ptr obj2( + QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); + QVERIFY(obj2 != nullptr); + QCOMPARE(obj2->sourceName(), QStringLiteral("positionpoll")); + obj2->setObjectName("secondObject"); + QSignalSpy enteredSpy2(obj2.get(), + SIGNAL(areaEntered(QGeoAreaMonitorInfo, QGeoPositionInfo))); + QSignalSpy exitedSpy2(obj2.get(), + SIGNAL(areaExited(QGeoAreaMonitorInfo, QGeoPositionInfo))); + + // using this -> no need for smart pointer + LogFilePositionSource *source = new LogFilePositionSource(m_fileData, this); + source->setUpdateInterval(UPDATE_INTERVAL); + source->setObjectName("FirstLogFileSource"); + + // using this -> no need for smart pointer + LogFilePositionSource *source2 = new LogFilePositionSource(m_fileData, this); + source2->setUpdateInterval(UPDATE_INTERVAL); + source2->setObjectName("SecondLogFileSource"); + + obj->setPositionInfoSource(source); + QCOMPARE(obj->positionInfoSource(), obj2->positionInfoSource()); + QCOMPARE(obj2->positionInfoSource(), source); + + QGeoAreaMonitorInfo infoRectangle("Rectangle"); + infoRectangle.setArea(QGeoRectangle(QGeoCoordinate(-27.70, 153.092), 0.2, 0.2)); + QVERIFY(infoRectangle.isValid()); + QVERIFY(obj->startMonitoring(infoRectangle)); + + QCOMPARE(obj->activeMonitors().size(), 1); + QCOMPARE(obj2->activeMonitors().size(), 1); + + QGeoCoordinate firstBorder(-27.6, 153.090908); + QGeoCoordinate secondBorder(-27.81, 153.092530); + + /***********************************/ + //1. trigger events on source (until areaExit + QTRY_VERIFY_WITH_TIMEOUT(exitedSpy.size() == 1, 5000); + QCOMPARE(enteredSpy.size(), enteredSpy2.size()); + QCOMPARE(exitedSpy.size(), exitedSpy2.size()); + + //compare entered event + QVERIFY(enteredSpy.first().at(0).value() == + enteredSpy2.first().at(0).value()); + QGeoPositionInfo info = enteredSpy.takeFirst().at(1).value(); + QVERIFY(info == enteredSpy2.takeFirst().at(1).value()); + QVERIFY(info.coordinate() == firstBorder); + //compare exit event + QVERIFY(exitedSpy.first().at(0).value() == + exitedSpy2.first().at(0).value()); + info = exitedSpy.takeFirst().at(1).value(); + QVERIFY(info == exitedSpy2.takeFirst().at(1).value()); + QVERIFY(info.coordinate() == secondBorder); + + QCOMPARE(exitedSpy.size(), 0); + QCOMPARE(enteredSpy.size(), 0); + QCOMPARE(exitedSpy2.size(), 0); + QCOMPARE(enteredSpy2.size(), 0); + + /***********************************/ + //2. change position source -> which restarts at beginning again + obj2->setPositionInfoSource(source2); + QCOMPARE(obj->positionInfoSource(), obj2->positionInfoSource()); + QCOMPARE(obj2->positionInfoSource(), source2); + + QTRY_VERIFY_WITH_TIMEOUT(exitedSpy.size() == 1, 5000); + QCOMPARE(enteredSpy.size(), enteredSpy2.size()); + QCOMPARE(exitedSpy.size(), exitedSpy2.size()); + + //compare entered event + QVERIFY(enteredSpy.first().at(0).value() == + enteredSpy2.first().at(0).value()); + info = enteredSpy.takeFirst().at(1).value(); + QVERIFY(info == enteredSpy2.takeFirst().at(1).value()); + QVERIFY(info.coordinate() == firstBorder); + //compare exit event + QVERIFY(exitedSpy.first().at(0).value() == + exitedSpy2.first().at(0).value()); + info = exitedSpy.takeFirst().at(1).value(); + QVERIFY(info == exitedSpy2.takeFirst().at(1).value()); + QVERIFY(info.coordinate() == secondBorder); + } + + void debug_data() + { + QTest::addColumn("info"); + QTest::addColumn("nextValue"); + QTest::addColumn("debugString"); + + QGeoAreaMonitorInfo info; + QTest::newRow("uninitialized") << info << 45 + << QString("QGeoAreaMonitorInfo(\"\", QGeoShape(Unknown), " + "persistent: false, expiry: QDateTime(Invalid)) 45"); + + info.setArea(QGeoRectangle()); + info.setPersistent(true); + info.setName("RectangleAreaMonitor"); + QTest::newRow("Rectangle Test") << info << 45 + << QString("QGeoAreaMonitorInfo(\"RectangleAreaMonitor\", QGeoShape(Rectangle), " + "persistent: true, expiry: QDateTime(Invalid)) 45"); + + info = QGeoAreaMonitorInfo(); + info.setArea(QGeoCircle()); + info.setPersistent(false); + info.setName("CircleAreaMonitor"); + QVariantMap map; + map.insert(QString("foobarKey"), QVariant(45)); //should be ignored + info.setNotificationParameters(map); + QTest::newRow("Circle Test") << info << 45 + << QString("QGeoAreaMonitorInfo(\"CircleAreaMonitor\", QGeoShape(Circle), " + "persistent: false, expiry: QDateTime(Invalid)) 45"); + + // we ignore any further QDateTime related changes to avoid depending on QDateTime related + // failures in case its QDebug string changes + } + + void debug() + { + QFETCH(QGeoAreaMonitorInfo, info); + QFETCH(int, nextValue); + QFETCH(QString, debugString); + + qInstallMessageHandler(tst_qgeoareamonitorinfo_messageHandler); + qDebug() << info << nextValue; + qInstallMessageHandler(0); + QCOMPARE(tst_qgeoareamonitorinfo_debug, debugString); + } + + void multipleThreads() + { +#if defined(Q_OS_MACOS) && defined(Q_PROCESSOR_ARM) + QSKIP("This test randomly hangs on macOS ARM (QTBUG-110931)"); +#endif + std::unique_ptr obj( + QGeoAreaMonitorSource::createSource(QStringLiteral("positionpoll"), 0)); + QVERIFY(obj != nullptr); + QCOMPARE(obj->sourceName(), QStringLiteral("positionpoll")); + + QVERIFY(obj->activeMonitors().isEmpty()); + + LogFilePositionSource *source = new LogFilePositionSource(m_fileData, this); + source->setUpdateInterval(UPDATE_INTERVAL); + obj->setPositionInfoSource(source); + QCOMPARE(obj->positionInfoSource(), source); + + QSignalSpy noDataSpy(source, &LogFilePositionSource::noDataLeft); + QSignalSpy updatesStartedSpy(source, &LogFilePositionSource::updatesStarted); + QSignalSpy updatesStoppedSpy(source, &LogFilePositionSource::updatesStopped); + + // generate threads + const int threadCount = 10; + QList threads; + for (int i = 0; i < threadCount; ++i) { + auto threadObj = new PositionConsumerThread(obj.get(), this); + threadObj->start(); + threads.push_back(threadObj); + } + + // generate objects to monitor + QGeoAreaMonitorInfo infoRectangle("Rectangle"); + infoRectangle.setArea(QGeoRectangle(QGeoCoordinate(-27.65, 153.093), 0.2, 0.2)); + QVERIFY(infoRectangle.isValid()); + QVERIFY(obj->startMonitoring(infoRectangle)); + + QGeoAreaMonitorInfo infoCircle("Circle"); + infoCircle.setArea(QGeoCircle(QGeoCoordinate(-27.70, 153.093), 10000)); + QVERIFY(infoCircle.isValid()); + QVERIFY(obj->startMonitoring(infoCircle)); + + QGeoAreaMonitorInfo singleShot_enter("SingleShot_on_Entered"); + singleShot_enter.setArea(QGeoRectangle(QGeoCoordinate(-27.67, 153.093), 0.2, 0.2)); + QVERIFY(singleShot_enter.isValid()); + QVERIFY(obj->requestUpdate(singleShot_enter, + SIGNAL(areaEntered(QGeoAreaMonitorInfo, QGeoPositionInfo)))); + + QGeoAreaMonitorInfo singleShot_exit("SingleShot_on_Exited"); + singleShot_exit.setArea(QGeoRectangle(QGeoCoordinate(-27.70, 153.093), 0.2, 0.2)); + QVERIFY(singleShot_exit.isValid()); + QVERIFY(obj->requestUpdate(singleShot_exit, + SIGNAL(areaExited(QGeoAreaMonitorInfo, QGeoPositionInfo)))); + + // wait until we read all data + QTRY_COMPARE_WITH_TIMEOUT(noDataSpy.size(), 1, 5000); + + // first request all the threads to terminate + for (int i = 0; i < threadCount; ++i) + threads[i]->stopProcessing(); + + static const int Number_Of_Entered_Events = 6; + static const int Number_Of_Exited_Events = 5; + // wait until each thread is stopped, and compare the result values + for (int i = 0; i < threadCount; ++i) { + threads[i]->wait(); + QCOMPARE(threads[i]->detectedEnterCount(), Number_Of_Entered_Events); + QCOMPARE(threads[i]->detectedExitCount(), Number_Of_Exited_Events); + } + + // Verify that the source started and stopped updates only once. + // This is needed to check that the connection tracking logic in + // connectNotify()/disconnectNotify() is working properly. + QCOMPARE(updatesStartedSpy.size(), 1); + QCOMPARE(updatesStoppedSpy.size(), 1); + } + + void backendProperties() + { + std::unique_ptr obj = std::make_unique(); + + const QString invalidProperty = "SomePropertyName"; + + QCOMPARE(obj->backendProperty(DummyMonitorSource::kTestProperty), 0); + QCOMPARE(obj->backendProperty(invalidProperty), QVariant()); + + QVERIFY(obj->setBackendProperty(DummyMonitorSource::kTestProperty, 10)); + QVERIFY(!obj->setBackendProperty(invalidProperty, 15)); + + QCOMPARE(obj->backendProperty(DummyMonitorSource::kTestProperty), 10); + QCOMPARE(obj->backendProperty(invalidProperty), QVariant()); + } +}; + + +QTEST_GUILESS_MAIN(tst_QGeoAreaMonitorSource) +#include "tst_qgeoareamonitor.moc" diff --git a/tests/auto/qgeocircle/CMakeLists.txt b/tests/auto/qgeocircle/CMakeLists.txt new file mode 100644 index 0000000..b296469 --- /dev/null +++ b/tests/auto/qgeocircle/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeocircle.pro. + +##################################################################### +## tst_qgeocircle Test: +##################################################################### + +qt_internal_add_test(tst_qgeocircle + SOURCES + tst_qgeocircle.cpp + LIBRARIES + Qt::Core + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:qgeocircle.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/qgeocircle/tst_qgeocircle.cpp b/tests/auto/qgeocircle/tst_qgeocircle.cpp new file mode 100644 index 0000000..a699a24 --- /dev/null +++ b/tests/auto/qgeocircle/tst_qgeocircle.cpp @@ -0,0 +1,448 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include + +QT_USE_NAMESPACE + +class tst_QGeoCircle : public QObject +{ + Q_OBJECT + +private slots: + void defaultConstructor(); + void centerRadiusConstructor(); + void assignment(); + + void comparison(); + void type(); + + void radius(); + void center(); + + void translate_data(); + void translate(); + + void valid_data(); + void valid(); + + void empty_data(); + void empty(); + + void contains_data(); + void contains(); + + void boundingGeoRectangle_data(); + void boundingGeoRectangle(); + + void extendCircle(); + void extendCircle_data(); + + void areaComparison(); + void areaComparison_data(); + + void boxComparison(); + void boxComparison_data(); + + void hashing(); +}; + +void tst_QGeoCircle::defaultConstructor() +{ + QGeoCircle c; + QVERIFY(!c.center().isValid()); + QCOMPARE(c.radius(), qreal(-1.0)); +} + +void tst_QGeoCircle::centerRadiusConstructor() +{ + QGeoCircle c(QGeoCoordinate(1,1), qreal(50.0)); + QCOMPARE(c.center(), QGeoCoordinate(1,1)); + QCOMPARE(c.radius(), qreal(50.0)); +} + +void tst_QGeoCircle::assignment() +{ + QGeoCircle c1 = QGeoCircle(QGeoCoordinate(10.0, 0.0), 20.0); + QGeoCircle c2 = QGeoCircle(QGeoCoordinate(20.0, 0.0), 30.0); + + QVERIFY(c1 != c2); + + c2 = c1; + QCOMPARE(c2.center(), QGeoCoordinate(10.0, 0.0)); + QCOMPARE(c2.radius(), 20.0); + QCOMPARE(c1, c2); + + c2.setCenter(QGeoCoordinate(30.0, 0.0)); + c2.setRadius(15.0); + QCOMPARE(c1.center(), QGeoCoordinate(10.0, 0.0)); + QCOMPARE(c1.radius(), 20.0); + + // Assign c1 to an area + QGeoShape area = c1; + QCOMPARE(area.type(), c1.type()); + QVERIFY(area == c1); + + // Assign the area back to a bounding circle + QGeoCircle ca = area; + QCOMPARE(ca.center(), c1.center()); + QCOMPARE(ca.radius(), c1.radius()); + + // Check that the copy is not modified when modifying the original. + c1.setCenter(QGeoCoordinate(15.0, 15.0)); + QVERIFY(ca.center() != c1.center()); + QVERIFY(ca != c1); +} + +void tst_QGeoCircle::comparison() +{ + QGeoCircle c1(QGeoCoordinate(1,1), qreal(50.0)); + QGeoCircle c2(QGeoCoordinate(1,1), qreal(50.0)); + QGeoCircle c3(QGeoCoordinate(1,1), qreal(35.0)); + QGeoCircle c4(QGeoCoordinate(1,2), qreal(50.0)); + + QVERIFY(c1 == c2); + QVERIFY(!(c1 != c2)); + + QVERIFY(!(c1 == c3)); + QVERIFY(c1 != c3); + + QVERIFY(!(c1 == c4)); + QVERIFY(c1 != c4); + + QVERIFY(!(c2 == c3)); + QVERIFY(c2 != c3); + + QGeoRectangle b1(QGeoCoordinate(20,20),QGeoCoordinate(10,30)); + QVERIFY(!(c1 == b1)); + QVERIFY(c1 != b1); + + QGeoShape *c2Ptr = &c2; + QVERIFY(c1 == *c2Ptr); + QVERIFY(!(c1 != *c2Ptr)); + + QGeoShape *c3Ptr = &c3; + QVERIFY(!(c1 == *c3Ptr)); + QVERIFY(c1 != *c3Ptr); +} + +void tst_QGeoCircle::type() +{ + QGeoCircle c; + QCOMPARE(c.type(), QGeoShape::CircleType); +} + +void tst_QGeoCircle::radius() +{ + QGeoCircle c; + c.setRadius(1.0); + QCOMPARE(c.radius(), qreal(1.0)); + c.setRadius(5.0); + QCOMPARE(c.radius(), qreal(5.0)); +} + +void tst_QGeoCircle::center() +{ + QGeoCircle c; + c.setCenter(QGeoCoordinate(1,1)); + QCOMPARE(c.center(), QGeoCoordinate(1,1)); + + QGeoShape shape = c; + QCOMPARE(shape.center(), c.center()); + + c.setCenter(QGeoCoordinate(5,10)); + QCOMPARE(c.center(), QGeoCoordinate(5,10)); +} + +void tst_QGeoCircle::translate_data() +{ + QTest::addColumn("center"); + QTest::addColumn("radius"); + QTest::addColumn("lat"); + QTest::addColumn("lon"); + QTest::addColumn("newCenter"); + + QTest::newRow("from 0,0") << QGeoCoordinate(0,0) << qreal(10.0) << + 5.0 << 5.0 << QGeoCoordinate(5.0, 5.0); + QTest::newRow("across 0,0") << QGeoCoordinate(-2, -2) << qreal(20.0) << + 5.0 << 5.0 << QGeoCoordinate(3.0, 3.0); + QTest::newRow("backwards across 0,0") << QGeoCoordinate(5,5) << qreal(50.0) + << -13.0 << 5.0 + << QGeoCoordinate(-8.0, 10.0); +} + +void tst_QGeoCircle::translate() +{ + QFETCH(QGeoCoordinate, center); + QFETCH(qreal, radius); + QFETCH(double, lat); + QFETCH(double, lon); + QFETCH(QGeoCoordinate, newCenter); + + QGeoCircle c(center, radius); + QGeoCircle d = c; + + c.translate(lat, lon); + + QCOMPARE(c.radius(), radius); + QCOMPARE(c.center(), newCenter); + + c = d.translated(lat, lon); + d.setRadius(1.0); + + QCOMPARE(c.radius(), radius); + QCOMPARE(d.center(), center); + QCOMPARE(c.center(), newCenter); +} + +void tst_QGeoCircle::valid_data() +{ + QTest::addColumn("center"); + QTest::addColumn("radius"); + QTest::addColumn("valid"); + + QTest::newRow("default") << QGeoCoordinate() << qreal(-1.0) << false; + QTest::newRow("empty coord") << QGeoCoordinate() << qreal(5.0) << false; + QTest::newRow("NaN coord") << QGeoCoordinate(500, 500) << qreal(5.0) << false; + QTest::newRow("bad radius") << QGeoCoordinate(10, 10) << qreal(-5.0) << false; + QTest::newRow("NaN radius") << QGeoCoordinate(10, 10) << qreal(qQNaN()) << false; + QTest::newRow("zero radius") << QGeoCoordinate(10, 10) << qreal(0.0) << true; + QTest::newRow("good") << QGeoCoordinate(10, 10) << qreal(5.0) << true; +} + +void tst_QGeoCircle::valid() +{ + QFETCH(QGeoCoordinate, center); + QFETCH(qreal, radius); + QFETCH(bool, valid); + + QGeoCircle c(center, radius); + QCOMPARE(c.isValid(), valid); + + QGeoShape area = c; + QCOMPARE(area.isValid(), valid); +} + +void tst_QGeoCircle::empty_data() +{ + QTest::addColumn("center"); + QTest::addColumn("radius"); + QTest::addColumn("empty"); + + QTest::newRow("default") << QGeoCoordinate() << qreal(-1.0) << true; + QTest::newRow("empty coord") << QGeoCoordinate() << qreal(5.0) << true; + QTest::newRow("NaN coord") << QGeoCoordinate(500, 500) << qreal(5.0) << true; + QTest::newRow("bad radius") << QGeoCoordinate(10, 10) << qreal(-5.0) << true; + QTest::newRow("NaN radius") << QGeoCoordinate(10, 10) << qreal(qQNaN()) << true; + QTest::newRow("zero radius") << QGeoCoordinate(10, 10) << qreal(0.0) << true; + QTest::newRow("good") << QGeoCoordinate(10, 10) << qreal(5.0) << false; +} + +void tst_QGeoCircle::empty() +{ + QFETCH(QGeoCoordinate, center); + QFETCH(qreal, radius); + QFETCH(bool, empty); + + QGeoCircle c(center, radius); + QCOMPARE(c.isEmpty(), empty); + + QGeoShape area = c; + QCOMPARE(area.isEmpty(), empty); +} + +void tst_QGeoCircle::contains_data() +{ + QTest::addColumn("center"); + QTest::addColumn("radius"); + QTest::addColumn("probe"); + QTest::addColumn("result"); + + QTest::newRow("own center") << QGeoCoordinate(1,1) << qreal(100.0) << + QGeoCoordinate(1,1) << true; + QTest::newRow("over the hills") << QGeoCoordinate(1,1) << qreal(100.0) << + QGeoCoordinate(30, 40) << false; + QTest::newRow("at 0.5*radius") << QGeoCoordinate(1,1) << qreal(100.0) << + QGeoCoordinate(1.00015374,1.00015274) << true; + QTest::newRow("at 0.99*radius") << QGeoCoordinate(1,1) << qreal(100.0) << + QGeoCoordinate(1.00077538, 0.99955527) << true; + QTest::newRow("at 1.01*radius") << QGeoCoordinate(1,1) << qreal(100.0) << + QGeoCoordinate(1.00071413, 0.99943423) << false; + // TODO: add tests for edge circle cases: cross 1 pole, cross both poles +} + +void tst_QGeoCircle::contains() +{ + QFETCH(QGeoCoordinate, center); + QFETCH(qreal, radius); + QFETCH(QGeoCoordinate, probe); + QFETCH(bool, result); + + QGeoCircle c(center, radius); + QCOMPARE(c.contains(probe), result); + + QGeoShape area = c; + QCOMPARE(area.contains(probe), result); +} + +void tst_QGeoCircle::boundingGeoRectangle_data() +{ + QTest::addColumn("center"); + QTest::addColumn("radius"); + QTest::addColumn("probe"); + QTest::addColumn("result"); + + QTest::newRow("own center") << QGeoCoordinate(1,1) << qreal(100.0) << + QGeoCoordinate(1,1) << true; + QTest::newRow("over the hills") << QGeoCoordinate(1,1) << qreal(100.0) << + QGeoCoordinate(30, 40) << false; + QTest::newRow("at 0.5*radius") << QGeoCoordinate(1,1) << qreal(100.0) << + QGeoCoordinate(1.00015374,1.00015274) << true; + QTest::newRow("at 0.99*radius") << QGeoCoordinate(1,1) << qreal(100.0) << + QGeoCoordinate(1.00077538, 0.99955527) << true; + QTest::newRow("Outside the box") << QGeoCoordinate(1,1) << qreal(100.0) << + QGeoCoordinate(1.00071413, 0.99903423) << false; + // TODO: add tests for edge circle cases: cross 1 pole, cross both poles +} + +void tst_QGeoCircle::boundingGeoRectangle() +{ + QFETCH(QGeoCoordinate, center); + QFETCH(qreal, radius); + QFETCH(QGeoCoordinate, probe); + QFETCH(bool, result); + + QGeoCircle c(center, radius); + QGeoRectangle box = c.boundingGeoRectangle(); + QCOMPARE(box.contains(probe), result); +} + +void tst_QGeoCircle::extendCircle() +{ + QFETCH(QGeoCircle, circle); + QFETCH(QGeoCoordinate, coord); + QFETCH(bool, containsFirst); + QFETCH(bool, containsExtended); + + QCOMPARE(circle.contains(coord), containsFirst); + circle.extendCircle(coord); + QCOMPARE(circle.contains(coord), containsExtended); + +} + +void tst_QGeoCircle::extendCircle_data() +{ + QTest::addColumn("circle"); + QTest::addColumn("coord"); + QTest::addColumn("containsFirst"); + QTest::addColumn("containsExtended"); + + QGeoCoordinate co1(20.0, 20.0); + + QTest::newRow("own center") + << QGeoCircle(co1, 100) + << QGeoCoordinate(20.0, 20.0) + << true + << true; + QTest::newRow("inside") + << QGeoCircle(co1, 100) + << QGeoCoordinate(20.0001, 20.0001) + << true + << true; + QTest::newRow("far away") + << QGeoCircle(co1, 100) + << QGeoCoordinate(50.0001, 50.0001) + << false + << true; + QTest::newRow("invalid circle") + << QGeoCircle() + << QGeoCoordinate(20.0, 20.0) + << false + << false; + QTest::newRow("invalid coordinate") + << QGeoCircle(co1, 100) + << QGeoCoordinate(99.0, 190.0) + << false + << false; +} + +void tst_QGeoCircle::areaComparison_data() +{ + QTest::addColumn("area"); + QTest::addColumn("circle"); + QTest::addColumn("equal"); + + QGeoCircle c1(QGeoCoordinate(10.0, 0.0), 10.0); + QGeoCircle c2(QGeoCoordinate(20.0, 10.0), 20.0); + QGeoRectangle b(QGeoCoordinate(10.0, 0.0), QGeoCoordinate(0.0, 10.0)); + + QTest::newRow("default constructed") << QGeoShape() << QGeoCircle() << false; + QTest::newRow("c1 c1") << QGeoShape(c1) << c1 << true; + QTest::newRow("c1 c2") << QGeoShape(c1) << c2 << false; + QTest::newRow("c2 c1") << QGeoShape(c2) << c1 << false; + QTest::newRow("c2 c2") << QGeoShape(c2) << c2 << true; + QTest::newRow("b c1") << QGeoShape(b) << c1 << false; +} + +void tst_QGeoCircle::areaComparison() +{ + QFETCH(QGeoShape, area); + QFETCH(QGeoCircle, circle); + QFETCH(bool, equal); + + QCOMPARE((area == circle), equal); + QCOMPARE((area != circle), !equal); + + QCOMPARE((circle == area), equal); + QCOMPARE((circle != area), !equal); +} + +void tst_QGeoCircle::boxComparison_data() +{ + QTest::addColumn("box"); + QTest::addColumn("circle"); + QTest::addColumn("equal"); + + QGeoCircle c(QGeoCoordinate(10.0, 0.0), 10.0); + QGeoRectangle b(QGeoCoordinate(10.0, 0.0), QGeoCoordinate(0.0, 10.0)); + + QTest::newRow("default constructed") << QGeoRectangle() << QGeoCircle() << false; + QTest::newRow("b c") << b << c << false; +} + +void tst_QGeoCircle::boxComparison() +{ + QFETCH(QGeoRectangle, box); + QFETCH(QGeoCircle, circle); + QFETCH(bool, equal); + + QCOMPARE((box == circle), equal); + QCOMPARE((box != circle), !equal); + + QCOMPARE((circle == box), equal); + QCOMPARE((circle != box), !equal); +} + +void tst_QGeoCircle::hashing() +{ + const QGeoCircle circle(QGeoCoordinate(1, 1), 10); + const size_t circleHash = qHash(circle); + + QGeoCircle otherCenterCircle = circle; + otherCenterCircle.setCenter(QGeoCoordinate(1, 2)); + QVERIFY(qHash(otherCenterCircle) != circleHash); + + QGeoCircle otherRadiusCircle = circle; + otherRadiusCircle.setRadius(100); + QVERIFY(qHash(otherRadiusCircle) != circleHash); + + // Do not assign, so that they do not share same d_ptr + QGeoCircle similarCircle(QGeoCoordinate(1, 1), 10); + QCOMPARE(qHash(similarCircle), circleHash); +} + +QTEST_MAIN(tst_QGeoCircle) +#include "tst_qgeocircle.moc" diff --git a/tests/auto/qgeocoordinate/CMakeLists.txt b/tests/auto/qgeocoordinate/CMakeLists.txt new file mode 100644 index 0000000..fe1815f --- /dev/null +++ b/tests/auto/qgeocoordinate/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeocoordinate.pro. + +##################################################################### +## tst_qgeocoordinate Test: +##################################################################### + +qt_internal_add_test(tst_qgeocoordinate + SOURCES + ../utils/qlocationtestutils.cpp ../utils/qlocationtestutils_p.h + tst_qgeocoordinate.cpp + LIBRARIES + Qt::Core + Qt::Positioning +) diff --git a/tests/auto/qgeocoordinate/tst_qgeocoordinate.cpp b/tests/auto/qgeocoordinate/tst_qgeocoordinate.cpp new file mode 100644 index 0000000..de78937 --- /dev/null +++ b/tests/auto/qgeocoordinate/tst_qgeocoordinate.cpp @@ -0,0 +1,975 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +//TESTED_COMPONENT=src/location + +#include "../utils/qlocationtestutils_p.h" + +#include +#include + +#include +#include + +#include + +QT_USE_NAMESPACE + +Q_DECLARE_METATYPE(QGeoCoordinate::CoordinateFormat) +Q_DECLARE_METATYPE(QGeoCoordinate::CoordinateType) + +static const QGeoCoordinate BRISBANE(-27.46758, 153.027892); +static const QGeoCoordinate MELBOURNE(-37.814251, 144.963169); +static const QGeoCoordinate LONDON(51.500152, -0.126236); +static const QGeoCoordinate NEW_YORK(40.71453, -74.00713); +static const QGeoCoordinate NORTH_POLE(90, 0); +static const QGeoCoordinate SOUTH_POLE(-90, 0); + +static const QChar DEGREES_SYMB(0x00B0); + + +QByteArray tst_qgeocoordinate_debug; + +void tst_qgeocoordinate_messageHandler(QtMsgType type, const QMessageLogContext &, const QString &msg) +{ + switch (type) { + case QtDebugMsg : + tst_qgeocoordinate_debug = msg.toLocal8Bit(); + break; + default: + break; + } +} + + +class tst_QGeoCoordinate : public QObject +{ + Q_OBJECT + +private: + enum TestDataType { + Latitude, + Longitude, + Altitude + }; + +private slots: + void initTestcase() + { + qRegisterMetaType(); + } + + void constructor() + { + QGeoCoordinate c; + QVERIFY(!c.isValid()); + QCOMPARE(c, QGeoCoordinate()); + } + + void constructor_lat_long() + { + QFETCH(double, latitude); + QFETCH(double, longitude); + QFETCH(QGeoCoordinate::CoordinateType, type); + + QGeoCoordinate c(latitude, longitude); + QCOMPARE(c.type(), type); + if (type != QGeoCoordinate::InvalidCoordinate) { + QVERIFY(c.isValid()); + QCOMPARE(c.latitude(), latitude); + QCOMPARE(c.longitude(), longitude); + } else { + QVERIFY(!c.isValid()); + QVERIFY(c.latitude() != latitude); + QVERIFY(c.longitude() != longitude); + } + } + + void constructor_lat_long_data() + { + QTest::addColumn("latitude"); + QTest::addColumn("longitude"); + QTest::addColumn("type"); + + QTest::newRow("both zero") << 0.0 << 0.0 << QGeoCoordinate::Coordinate2D; + QTest::newRow("both negative") << -1.0 << -1.0 << QGeoCoordinate::Coordinate2D; + QTest::newRow("both positive") << 1.0 << 1.0 << QGeoCoordinate::Coordinate2D; + QTest::newRow("latitude negative") << -1.0 << 1.0 << QGeoCoordinate::Coordinate2D; + QTest::newRow("longitude negative") << 1.0 << -1.0 << QGeoCoordinate::Coordinate2D; + + QTest::newRow("both too high") << 90.1 << 180.1 << QGeoCoordinate::InvalidCoordinate; + QTest::newRow("latitude too high") << 90.1 << 0.1 << QGeoCoordinate::InvalidCoordinate; + QTest::newRow("longitude too high") << 0.1 << 180.1 << QGeoCoordinate::InvalidCoordinate; + + QTest::newRow("both too low") << -90.1 << -180.1 << QGeoCoordinate::InvalidCoordinate; + QTest::newRow("latitude too low") << -90.1 << 0.1 << QGeoCoordinate::InvalidCoordinate; + QTest::newRow("longitude too low") << 0.1 << -180.1 << QGeoCoordinate::InvalidCoordinate; + + QTest::newRow("both not too high") << 90.0 << 180.0 << QGeoCoordinate::Coordinate2D; + QTest::newRow("both not too low") << -90.0 << -180.0 << QGeoCoordinate::Coordinate2D; + + QTest::newRow("latitude too high and longitude too low") << 90.1 << -180.1 << QGeoCoordinate::InvalidCoordinate; + QTest::newRow("latitude too low and longitude too high") << -90.1 << 180.1 << QGeoCoordinate::InvalidCoordinate; + } + + void constructor_lat_long_alt() + { + QFETCH(double, latitude); + QFETCH(double, longitude); + QFETCH(double, altitude); + QFETCH(QGeoCoordinate::CoordinateType, type); + + QGeoCoordinate c(latitude, longitude, altitude); + QCOMPARE(c.type(), type); + if (type != QGeoCoordinate::InvalidCoordinate) { + QCOMPARE(c.latitude(), latitude); + QCOMPARE(c.longitude(), longitude); + QCOMPARE(c.altitude(), altitude); + } else { + QVERIFY(!c.isValid()); + QVERIFY(c.latitude() != latitude); + QVERIFY(c.longitude() != longitude); + QVERIFY(c.altitude() != altitude); + } + } + + void constructor_lat_long_alt_data() + { + QTest::addColumn("latitude"); + QTest::addColumn("longitude"); + QTest::addColumn("altitude"); + QTest::addColumn("type"); + + QTest::newRow("all zero") << 0.0 << 0.0 << 0.0 << QGeoCoordinate::Coordinate3D; + QTest::newRow("all negative") << -1.0 << -1.0 << -2.0 << QGeoCoordinate::Coordinate3D; + QTest::newRow("all positive") << 1.0 << 1.0 << 4.0 << QGeoCoordinate::Coordinate3D; + + QTest::newRow("latitude negative") << -1.0 << 1.0 << 1.0 << QGeoCoordinate::Coordinate3D; + QTest::newRow("longitude negative") << 1.0 << -1.0 << 1.0 << QGeoCoordinate::Coordinate3D; + QTest::newRow("altitude negative") << 1.0 << 1.0 << -1.0 << QGeoCoordinate::Coordinate3D; + + QTest::newRow("altitude not too high") << 1.0 << 1.0 << DBL_MAX << QGeoCoordinate::Coordinate3D; + QTest::newRow("altitude not too low") << 1.0 << 1.0 << DBL_MIN << QGeoCoordinate::Coordinate3D; + + QTest::newRow("all not too high") << 90.0 << 180.0 << DBL_MAX << QGeoCoordinate::Coordinate3D; + QTest::newRow("all not too low") << -90.0 << -180.0 << DBL_MIN << QGeoCoordinate::Coordinate3D; + + QTest::newRow("all too high") << 90.1 << 180.1 << DBL_MAX << QGeoCoordinate::InvalidCoordinate; + QTest::newRow("all too low") << -90.1 << -180.1 << DBL_MIN << QGeoCoordinate::InvalidCoordinate; + } + + void copy_constructor() + { + QFETCH(QGeoCoordinate, c); + + QGeoCoordinate copy(c); + QCOMPARE(copy.type(), c.type()); + if (c.type() != QGeoCoordinate::InvalidCoordinate) { + QCOMPARE(copy.latitude(), c.latitude()); + QCOMPARE(copy.longitude(), c.longitude()); + if (c.type() == QGeoCoordinate::Coordinate3D) + QCOMPARE(copy.altitude(), c.altitude()); + } + } + + void copy_constructor_data() + { + QTest::addColumn("c"); + + QTest::newRow("no argument") << QGeoCoordinate(); + QTest::newRow("latitude, longitude arguments all zero") << QGeoCoordinate(0.0, 0.0); + + QTest::newRow("latitude, longitude arguments not too high") << QGeoCoordinate(90.0, 180.0); + QTest::newRow("latitude, longitude arguments not too low") << QGeoCoordinate(-90.0, -180.0); + QTest::newRow("latitude, longitude arguments too high") << QGeoCoordinate(90.1, 180.1); + QTest::newRow("latitude, longitude arguments too low") << QGeoCoordinate(-90.1, -180.1); + + QTest::newRow("latitude, longitude, altitude arguments all zero") << QGeoCoordinate(0.0, 0.0, 0.0); + QTest::newRow("latitude, longitude, altitude arguments not too high values") << QGeoCoordinate(90.0, 180.0, DBL_MAX); + QTest::newRow("latitude, longitude, altitude arguments not too low values") << QGeoCoordinate(-90.0, -180.0, DBL_MIN); + + QTest::newRow("latitude, longitude, altitude arguments too high latitude & longitude") << QGeoCoordinate(90.1, 180.1, DBL_MAX); + QTest::newRow("latitude, longitude, altitude arguments too low latitude & longitude") << QGeoCoordinate(-90.1, -180.1, DBL_MAX); + } + + void move_constructor() + { + QFETCH(QGeoCoordinate, c); + + const QGeoCoordinate coordinateCopy = c; + QCOMPARE(std::move(c), coordinateCopy); + } + + void move_constructor_data() + { + copy_constructor_data(); + } + + void destructor() + { + QGeoCoordinate *coordinate; + + coordinate = new QGeoCoordinate(); + delete coordinate; + + coordinate = new QGeoCoordinate(0.0, 0.0); + delete coordinate; + + coordinate = new QGeoCoordinate(0.0, 0.0, 0.0); + delete coordinate; + + coordinate = new QGeoCoordinate(90.0, 180.0); + delete coordinate; + + coordinate = new QGeoCoordinate(-90.0, -180.0); + delete coordinate; + + coordinate = new QGeoCoordinate(90.1, 180.1); + delete coordinate; + + coordinate = new QGeoCoordinate(-90.1, -180.1); + delete coordinate; + } + + void destructor2() + { + QFETCH(QGeoCoordinate, c); + QGeoCoordinate *coordinate = new QGeoCoordinate(c); + delete coordinate; + } + + void destructor2_data() + { + copy_constructor_data(); + } + + void assign() + { + QFETCH(QGeoCoordinate, c); + + QGeoCoordinate c1 = c; + QCOMPARE(c.type(), c1.type()); + if (c.isValid()) { + QCOMPARE(c.latitude(), c.latitude()); + QCOMPARE(c.longitude(), c.longitude()); + if (c.type() == QGeoCoordinate::Coordinate3D) + QCOMPARE(c.altitude(), c.altitude()); + } + } + + void assign_data() + { + copy_constructor_data(); + } + + void move_assign() + { + QFETCH(QGeoCoordinate, c); + + QGeoCoordinate copy = c; + + QGeoCoordinate otherCoordinate; + otherCoordinate = std::move(c); + QCOMPARE(otherCoordinate, copy); + + // check that (move)assinging to a moved-from object is fine + c = std::move(copy); + QCOMPARE(c, otherCoordinate); + } + + void move_assign_data() + { + copy_constructor_data(); + } + + void comparison() + { + QFETCH(QGeoCoordinate, c1); + QFETCH(QGeoCoordinate, c2); + QFETCH(bool, result); + + QCOMPARE(c1 == c2, result); + QVariant v1 = QVariant::fromValue(c1); + QVariant v2 = QVariant::fromValue(c2); + QCOMPARE(v2 == v1, result); + } + + void comparison_data() + { + QTest::addColumn("c1"); + QTest::addColumn("c2"); + QTest::addColumn("result"); + + QTest::newRow("Invalid != BRISBANE") + << QGeoCoordinate(-190,-1000) << BRISBANE << false; + QTest::newRow("BRISBANE != MELBOURNE") + << BRISBANE << MELBOURNE << false; + QTest::newRow("equal") + << BRISBANE << BRISBANE << true; + QTest::newRow("LONDON != uninitialized data") + << LONDON << QGeoCoordinate() << false; + QTest::newRow("uninitialized data == uninitialized data") + << QGeoCoordinate() << QGeoCoordinate() << true; + QTest::newRow("invalid == same invalid") + << QGeoCoordinate(-190,-1000) << QGeoCoordinate(-190,-1000) << true; + QTest::newRow("invalid == different invalid") + << QGeoCoordinate(-190,-1000) << QGeoCoordinate(190,1000) << true; + QTest::newRow("valid != another valid") + << QGeoCoordinate(-90,-180) << QGeoCoordinate(-45,+45) << false; + QTest::newRow("valid == same valid") + << QGeoCoordinate(-90,-180) << QGeoCoordinate(-90,-180) << true; + QTest::newRow("different longitudes at north pole are equal") + << QGeoCoordinate(90, 0) << QGeoCoordinate(90, 45) << true; + QTest::newRow("different longitudes at south pole are equal") + << QGeoCoordinate(-90, 0) << QGeoCoordinate(-90, 45) << true; + } + + void type() + { + QFETCH(QGeoCoordinate, c); + QFETCH(QGeoCoordinate::CoordinateType, type); + + QCOMPARE(c.type(), type); + } + + void type_data() + { + QTest::addColumn("c"); + QTest::addColumn("type"); + + QGeoCoordinate c; + + QTest::newRow("no values set") << c << QGeoCoordinate::InvalidCoordinate; + + c.setAltitude(1.0); + QTest::newRow("only altitude is set") << c << QGeoCoordinate::InvalidCoordinate; + + c.setLongitude(1.0); + QTest::newRow("only latitude and altitude is set") << c << QGeoCoordinate::InvalidCoordinate; + + c.setLatitude(-1.0); + QTest::newRow("all valid: 3D Coordinate") << c << QGeoCoordinate::Coordinate3D; + + c.setLatitude(-90.1); + QTest::newRow("too low latitude and valid longitude") << c << QGeoCoordinate::InvalidCoordinate; + + c.setLongitude(-180.1); + c.setLatitude(90.0); + QTest::newRow("valid latitude and too low longitude") << c << QGeoCoordinate::InvalidCoordinate; + + c.setLatitude(90.1); + c.setLongitude(-180.0); + QTest::newRow("too high latitude and valid longitude") << c << QGeoCoordinate::InvalidCoordinate; + + c.setLatitude(-90.0); + c.setLongitude(180.1); + QTest::newRow("valid latitude and too high longitude") << c << QGeoCoordinate::InvalidCoordinate; + } + + void valid() + { + QFETCH(QGeoCoordinate, c); + QCOMPARE(c.isValid(), c.type() != QGeoCoordinate::InvalidCoordinate); + } + + void valid_data() + { + type_data(); + } + + void addDataValues(TestDataType type) + { + QTest::addColumn("value"); + QTest::addColumn("valid"); + + QTest::newRow("negative") << -1.0 << true; + QTest::newRow("zero") << 0.0 << true; + QTest::newRow("positive") << 1.0 << true; + + switch (type) { + case Latitude: + QTest::newRow("too low") << -90.1 << false; + QTest::newRow("not too low") << -90.0 << true; + QTest::newRow("not too hight") << 90.0 << true; + QTest::newRow("too high") << 90.1; + break; + case Longitude: + QTest::newRow("too low") << -180.1 << false; + QTest::newRow("not too low") << -180.0 << true; + QTest::newRow("not too hight") << 180.0 << true; + QTest::newRow("too high") << 180.1; + break; + case Altitude: + break; + } + } + + void latitude() + { + QFETCH(double, value); + QGeoCoordinate c; + c.setLatitude(value); + QCOMPARE(c.latitude(), value); + + QGeoCoordinate c2 = c; + QCOMPARE(c.latitude(), value); + QCOMPARE(c2, c); + } + void latitude_data() { addDataValues(Latitude); } + + void longitude() + { + QFETCH(double, value); + QGeoCoordinate c; + c.setLongitude(value); + QCOMPARE(c.longitude(), value); + + QGeoCoordinate c2 = c; + QCOMPARE(c.longitude(), value); + QCOMPARE(c2, c); + } + void longitude_data() { addDataValues(Longitude); } + + void altitude() + { + QFETCH(double, value); + QGeoCoordinate c; + c.setAltitude(value); + QCOMPARE(c.altitude(), value); + + QGeoCoordinate c2 = c; + QCOMPARE(c.altitude(), value); + QCOMPARE(c2, c); + } + void altitude_data() { addDataValues(Altitude); } + + void distanceTo() + { + QFETCH(QGeoCoordinate, c1); + QFETCH(QGeoCoordinate, c2); + QFETCH(qreal, distance); + + QCOMPARE(QString::number(c1.distanceTo(c2)), QString::number(distance)); + } + + void distanceTo_data() + { + QTest::addColumn("c1"); + QTest::addColumn("c2"); + QTest::addColumn("distance"); + + QTest::newRow("invalid coord 1") + << QGeoCoordinate() << BRISBANE << qreal(0.0); + QTest::newRow("invalid coord 2") + << BRISBANE << QGeoCoordinate() << qreal(0.0); + QTest::newRow("brisbane -> melbourne") + << BRISBANE << MELBOURNE << qreal(1374820.1618767744); + QTest::newRow("london -> new york") + << LONDON << NEW_YORK << qreal(5570538.4987236429); + QTest::newRow("north pole -> south pole") + << NORTH_POLE << SOUTH_POLE << qreal(20015109.4154876769); + } + + void azimuthTo() + { + QFETCH(QGeoCoordinate, c1); + QFETCH(QGeoCoordinate, c2); + QFETCH(qreal, azimuth); + + qreal result = c1.azimuthTo(c2); + QVERIFY(result >= 0.0); + QVERIFY(result < 360.0); + QCOMPARE(QString::number(result), QString::number(azimuth)); + } + + void azimuthTo_data() + { + QTest::addColumn("c1"); + QTest::addColumn("c2"); + QTest::addColumn("azimuth"); + + QTest::newRow("invalid coord 1") + << QGeoCoordinate() << BRISBANE << qreal(0.0); + QTest::newRow("invalid coord 2") + << BRISBANE << QGeoCoordinate() << qreal(0.0); + QTest::newRow("brisbane -> melbourne") + << BRISBANE << MELBOURNE << qreal(211.1717286649); + QTest::newRow("london -> new york") + << LONDON << NEW_YORK << qreal(288.3388804508); + QTest::newRow("north pole -> south pole") + << NORTH_POLE << SOUTH_POLE << qreal(180.0); + QTest::newRow("Almost 360degrees bearing") + << QGeoCoordinate(0.5,45.0,0.0) << QGeoCoordinate(0.5,-134.9999651,0.0) << qreal(359.998); + } + + void atDistanceAndAzimuth() + { + QFETCH(QGeoCoordinate, origin); + QFETCH(qreal, distance); + QFETCH(qreal, azimuth); + QFETCH(QGeoCoordinate, result); + + QCOMPARE(result, origin.atDistanceAndAzimuth(distance, azimuth)); + } + + void atDistanceAndAzimuth_data() + { + QTest::addColumn("origin"); + QTest::addColumn("distance"); + QTest::addColumn("azimuth"); + QTest::addColumn("result"); + + QTest::newRow("invalid coord") + << QGeoCoordinate() + << qreal(1000.0) + << qreal(10.0) + << QGeoCoordinate(); + if (sizeof(qreal) == sizeof(double)) { + QTest::newRow("brisbane -> melbourne") + << BRISBANE + << qreal(1374820.1618767744) + << qreal(211.1717286649) + << MELBOURNE; + QTest::newRow("london -> new york") + << LONDON + << qreal(5570538.4987236429) + << qreal(288.3388804508) + << NEW_YORK; + QTest::newRow("north pole -> south pole") + << NORTH_POLE + << qreal(20015109.4154876769) + << qreal(180.0) + << SOUTH_POLE; + } else { + QTest::newRow("brisbane -> melbourne") + << BRISBANE + << qreal(1374820.1618767744) + << qreal(211.1717286649) + << QGeoCoordinate(-37.8142515084775, 144.963170622944); + QTest::newRow("london -> new york") + << LONDON + << qreal(5570538.4987236429) + << qreal(288.3388804508) + << QGeoCoordinate(40.7145220608416, -74.0071216045375); + QTest::newRow("north pole -> south pole") + << NORTH_POLE + << qreal(20015109.4154876769) + << qreal(180.0) + << QGeoCoordinate(-89.9999947369857, -90.0); + } + } + + void degreesToString() + { + QFETCH(QGeoCoordinate, coord); + QFETCH(QGeoCoordinate::CoordinateFormat, format); + QFETCH(QString, string); + + QCOMPARE(coord.toString(format), string); + } + + void degreesToString_data() + { + QTest::addColumn("coord"); + QTest::addColumn("format"); + QTest::addColumn("string"); + + QGeoCoordinate northEast(27.46758, 153.027892); + QGeoCoordinate northEastWithAlt(27.46758, 153.027892, 28.23411); + QGeoCoordinate southEast(-27.46758, 153.027892); + QGeoCoordinate southEastWithAlt(-27.46758, 153.027892, 28.23411); + QGeoCoordinate northWest(27.46758, -153.027892); + QGeoCoordinate northWestWithAlt(27.46758, -153.027892, 28.23411); + QGeoCoordinate southWest(-27.46758, -153.027892); + QGeoCoordinate southWestWithAlt(-27.46758, -153.027892, 28.23411); + + QGeoCoordinate empty; + QGeoCoordinate toohigh(90.1, 180.1); + QGeoCoordinate toolow(-90.1, -180.1); + QGeoCoordinate zeroLatLong(0.0, 0.0); + QGeoCoordinate allZero(0.0, 0.0, 0.0); + + QTest::newRow("empty, dd, no hemisphere") + << empty << QGeoCoordinate::Degrees + << QString(); + QTest::newRow("empty, dd, hemisphere") + << empty << QGeoCoordinate::DegreesWithHemisphere + << QString(); + QTest::newRow("empty, dm, no hemisphere") + << empty << QGeoCoordinate::DegreesMinutes + << QString(); + QTest::newRow("empty, dm, hemisphere") + << empty << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString(); + QTest::newRow("empty, dms, no hemisphere") + << empty << QGeoCoordinate::DegreesMinutesSeconds + << QString(); + QTest::newRow("empty, dms, hemisphere") + << empty << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString(); + + QTest::newRow("too low, dd, no hemisphere") + << toolow << QGeoCoordinate::Degrees + << QString(); + QTest::newRow("too low, dd, hemisphere") + << toolow << QGeoCoordinate::DegreesWithHemisphere + << QString(); + QTest::newRow("too low, dm, no hemisphere") + << toolow << QGeoCoordinate::DegreesMinutes + << QString(); + QTest::newRow("too low, dm, hemisphere") + << toolow << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString(); + QTest::newRow("too low, dms, no hemisphere") + << toolow << QGeoCoordinate::DegreesMinutesSeconds + << QString(); + QTest::newRow("too low, dms, hemisphere") + << toolow << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString(); + + QTest::newRow("too high, dd, no hemisphere") + << toohigh << QGeoCoordinate::Degrees + << QString(); + QTest::newRow("too high, dd, hemisphere") + << toohigh << QGeoCoordinate::DegreesWithHemisphere + << QString(); + QTest::newRow("too high, dm, no hemisphere") + << toohigh << QGeoCoordinate::DegreesMinutes + << QString(); + QTest::newRow("too high, dm, hemisphere") + << toohigh << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString(); + QTest::newRow("too high, dms, no hemisphere") + << toohigh << QGeoCoordinate::DegreesMinutesSeconds + << QString(); + QTest::newRow("too high, dms, hemisphere") + << toohigh << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString(); + + QTest::newRow("zeroLatLong, dd, no hemisphere") + << zeroLatLong << QGeoCoordinate::Degrees + << QString("0.00000%1, 0.00000%1").arg(DEGREES_SYMB); + QTest::newRow("zeroLatLong, dd, hemisphere") + << zeroLatLong << QGeoCoordinate::DegreesWithHemisphere + << QString("0.00000%1, 0.00000%1").arg(DEGREES_SYMB); + QTest::newRow("zeroLatLong, dm, no hemisphere") + << zeroLatLong << QGeoCoordinate::DegreesMinutes + << QString("0%1 0.000', 0%1 0.000'").arg(DEGREES_SYMB); + QTest::newRow("zeroLatLong, dm, hemisphere") + << zeroLatLong << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString("0%1 0.000', 0%1 0.000'").arg(DEGREES_SYMB); + QTest::newRow("zeroLatLong, dms, no hemisphere") + << zeroLatLong << QGeoCoordinate::DegreesMinutesSeconds + << QString("0%1 0' 0.0\", 0%1 0' 0.0\"").arg(DEGREES_SYMB); + QTest::newRow("zeroLatLong, dms, hemisphere") + << zeroLatLong << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString("0%1 0' 0.0\", 0%1 0' 0.0\"").arg(DEGREES_SYMB); + + QTest::newRow("allZero, dd, no hemisphere") + << allZero << QGeoCoordinate::Degrees + << QString("0.00000%1, 0.00000%1, 0m").arg(DEGREES_SYMB); + QTest::newRow("allZero, dd, hemisphere") + << allZero << QGeoCoordinate::DegreesWithHemisphere + << QString("0.00000%1, 0.00000%1, 0m").arg(DEGREES_SYMB); + QTest::newRow("allZero, dm, no hemisphere") + << allZero << QGeoCoordinate::DegreesMinutes + << QString("0%1 0.000', 0%1 0.000', 0m").arg(DEGREES_SYMB); + QTest::newRow("allZero, dm, hemisphere") + << allZero << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString("0%1 0.000', 0%1 0.000', 0m").arg(DEGREES_SYMB); + QTest::newRow("allZero, dms, no hemisphere") + << allZero << QGeoCoordinate::DegreesMinutesSeconds + << QString("0%1 0' 0.0\", 0%1 0' 0.0\", 0m").arg(DEGREES_SYMB); + QTest::newRow("allZero, dms, hemisphere") + << allZero << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString("0%1 0' 0.0\", 0%1 0' 0.0\", 0m").arg(DEGREES_SYMB); + + QTest::newRow("NE, dd, no hemisphere") + << northEast << QGeoCoordinate::Degrees + << QString("27.46758%1, 153.02789%1").arg(DEGREES_SYMB); + QTest::newRow("NE, dd, hemisphere") + << northEast << QGeoCoordinate::DegreesWithHemisphere + << QString("27.46758%1 N, 153.02789%1 E").arg(DEGREES_SYMB); + QTest::newRow("NE, dm, no hemisphere") + << northEast << QGeoCoordinate::DegreesMinutes + << QString("27%1 28.055', 153%1 1.674'").arg(DEGREES_SYMB); + QTest::newRow("NE, dm, hemisphere") + << northEast << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString("27%1 28.055' N, 153%1 1.674' E").arg(DEGREES_SYMB); + QTest::newRow("NE, dms, no hemisphere") + << northEast << QGeoCoordinate::DegreesMinutesSeconds + << QString("27%1 28' 3.3\", 153%1 1' 40.4\"").arg(DEGREES_SYMB); + QTest::newRow("NE, dms, hemisphere") + << northEast << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString("27%1 28' 3.3\" N, 153%1 1' 40.4\" E").arg(DEGREES_SYMB); + + QTest::newRow("NE with alt, dd, no hemisphere") + << northEastWithAlt << QGeoCoordinate::Degrees + << QString("27.46758%1, 153.02789%1, 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("NE with alt, dd, hemisphere") + << northEastWithAlt << QGeoCoordinate::DegreesWithHemisphere + << QString("27.46758%1 N, 153.02789%1 E, 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("NE with alt, dm, no hemisphere") + << northEastWithAlt << QGeoCoordinate::DegreesMinutes + << QString("27%1 28.055', 153%1 1.674', 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("NE with alt, dm, hemisphere") + << northEastWithAlt << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString("27%1 28.055' N, 153%1 1.674' E, 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("NE with alt, dms, no hemisphere") + << northEastWithAlt << QGeoCoordinate::DegreesMinutesSeconds + << QString("27%1 28' 3.3\", 153%1 1' 40.4\", 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("NE with alt, dms, hemisphere") + << northEastWithAlt << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString("27%1 28' 3.3\" N, 153%1 1' 40.4\" E, 28.2341m").arg(DEGREES_SYMB); + + QTest::newRow("SE, dd, no hemisphere") + << southEast << QGeoCoordinate::Degrees + << QString("-27.46758%1, 153.02789%1").arg(DEGREES_SYMB); + QTest::newRow("SE, dd, hemisphere") + << southEast << QGeoCoordinate::DegreesWithHemisphere + << QString("27.46758%1 S, 153.02789%1 E").arg(DEGREES_SYMB); + QTest::newRow("SE, dm, no hemisphere") + << southEast << QGeoCoordinate::DegreesMinutes + << QString("-27%1 28.055', 153%1 1.674'").arg(DEGREES_SYMB); + QTest::newRow("SE, dm, hemisphere") + << southEast << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString("27%1 28.055' S, 153%1 1.674' E").arg(DEGREES_SYMB); + QTest::newRow("SE, dms, no hemisphere") + << southEast << QGeoCoordinate::DegreesMinutesSeconds + << QString("-27%1 28' 3.3\", 153%1 1' 40.4\"").arg(DEGREES_SYMB); + QTest::newRow("SE, dms, hemisphere") + << southEast << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString("27%1 28' 3.3\" S, 153%1 1' 40.4\" E").arg(DEGREES_SYMB); + + QTest::newRow("SE with alt, dd, no hemisphere, 28.2341m") + << southEastWithAlt << QGeoCoordinate::Degrees + << QString("-27.46758%1, 153.02789%1, 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("SE with alt, dd, hemisphere, 28.2341m") + << southEastWithAlt << QGeoCoordinate::DegreesWithHemisphere + << QString("27.46758%1 S, 153.02789%1 E, 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("SE with alt, dm, no hemisphere, 28.2341m") + << southEastWithAlt << QGeoCoordinate::DegreesMinutes + << QString("-27%1 28.055', 153%1 1.674', 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("SE with alt, dm, hemisphere, 28.2341m") + << southEastWithAlt << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString("27%1 28.055' S, 153%1 1.674' E, 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("SE with alt, dms, no hemisphere, 28.2341m") + << southEastWithAlt << QGeoCoordinate::DegreesMinutesSeconds + << QString("-27%1 28' 3.3\", 153%1 1' 40.4\", 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("SE with alt, dms, hemisphere, 28.2341m") + << southEastWithAlt << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString("27%1 28' 3.3\" S, 153%1 1' 40.4\" E, 28.2341m").arg(DEGREES_SYMB);; + + QTest::newRow("NW, dd, no hemisphere") + << northWest << QGeoCoordinate::Degrees + << QString("27.46758%1, -153.02789%1").arg(DEGREES_SYMB); + QTest::newRow("NW, dd, hemisphere") + << northWest << QGeoCoordinate::DegreesWithHemisphere + << QString("27.46758%1 N, 153.02789%1 W").arg(DEGREES_SYMB); + QTest::newRow("NW, dm, no hemisphere") + << northWest << QGeoCoordinate::DegreesMinutes + << QString("27%1 28.055', -153%1 1.674'").arg(DEGREES_SYMB); + QTest::newRow("NW, dm, hemisphere") + << northWest << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString("27%1 28.055' N, 153%1 1.674' W").arg(DEGREES_SYMB); + QTest::newRow("NW, dms, no hemisphere") + << northWest << QGeoCoordinate::DegreesMinutesSeconds + << QString("27%1 28' 3.3\", -153%1 1' 40.4\"").arg(DEGREES_SYMB); + QTest::newRow("NW, dms, hemisphere") + << northWest << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString("27%1 28' 3.3\" N, 153%1 1' 40.4\" W").arg(DEGREES_SYMB); + + QTest::newRow("NW with alt, dd, no hemisphere, 28.2341m") + << northWestWithAlt << QGeoCoordinate::Degrees + << QString("27.46758%1, -153.02789%1, 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("NW with alt, dd, hemisphere, 28.2341m") + << northWestWithAlt << QGeoCoordinate::DegreesWithHemisphere + << QString("27.46758%1 N, 153.02789%1 W, 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("NW with alt, dm, no hemisphere, 28.2341m") + << northWestWithAlt << QGeoCoordinate::DegreesMinutes + << QString("27%1 28.055', -153%1 1.674', 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("NW with alt, dm, hemisphere, 28.2341m") + << northWestWithAlt << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString("27%1 28.055' N, 153%1 1.674' W, 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("NW with alt, dms, no hemisphere, 28.2341m") + << northWestWithAlt << QGeoCoordinate::DegreesMinutesSeconds + << QString("27%1 28' 3.3\", -153%1 1' 40.4\", 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("NW with alt, dms, hemisphere, 28.2341m") + << northWestWithAlt << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString("27%1 28' 3.3\" N, 153%1 1' 40.4\" W, 28.2341m").arg(DEGREES_SYMB); + + QTest::newRow("SW, dd, no hemisphere") + << southWest << QGeoCoordinate::Degrees + << QString("-27.46758%1, -153.02789%1").arg(DEGREES_SYMB); + QTest::newRow("SW, dd, hemisphere") + << southWest << QGeoCoordinate::DegreesWithHemisphere + << QString("27.46758%1 S, 153.02789%1 W").arg(DEGREES_SYMB); + QTest::newRow("SW, dm, no hemisphere") + << southWest << QGeoCoordinate::DegreesMinutes + << QString("-27%1 28.055', -153%1 1.674'").arg(DEGREES_SYMB); + QTest::newRow("SW, dm, hemisphere") + << southWest << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString("27%1 28.055' S, 153%1 1.674' W").arg(DEGREES_SYMB); + QTest::newRow("SW, dms, no hemisphere") + << southWest << QGeoCoordinate::DegreesMinutesSeconds + << QString("-27%1 28' 3.3\", -153%1 1' 40.4\"").arg(DEGREES_SYMB); + QTest::newRow("SW, dms, hemisphere") + << southWest << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString("27%1 28' 3.3\" S, 153%1 1' 40.4\" W").arg(DEGREES_SYMB); + + QTest::newRow("SW with alt, dd, no hemisphere, 28.2341m") + << southWestWithAlt << QGeoCoordinate::Degrees + << QString("-27.46758%1, -153.02789%1, 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("SW with alt, dd, hemisphere, 28.2341m") + << southWestWithAlt << QGeoCoordinate::DegreesWithHemisphere + << QString("27.46758%1 S, 153.02789%1 W, 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("SW with alt, dm, no hemisphere, 28.2341m") + << southWestWithAlt << QGeoCoordinate::DegreesMinutes + << QString("-27%1 28.055', -153%1 1.674', 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("SW with alt, dm, hemisphere, 28.2341m") + << southWestWithAlt << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString("27%1 28.055' S, 153%1 1.674' W, 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("SW with alt, dms, no hemisphere, 28.2341m") + << southWestWithAlt << QGeoCoordinate::DegreesMinutesSeconds + << QString("-27%1 28' 3.3\", -153%1 1' 40.4\", 28.2341m").arg(DEGREES_SYMB); + QTest::newRow("SW with alt, dms, hemisphere, 28.2341m") + << southWestWithAlt << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString("27%1 28' 3.3\" S, 153%1 1' 40.4\" W, 28.2341m").arg(DEGREES_SYMB); + + QTest::newRow("Wrap seconds to Minutes DMSH") + << QGeoCoordinate(1.1333333, 1.1333333) << QGeoCoordinate::DegreesMinutesSecondsWithHemisphere + << QString( "1%1 8' 0.0\" N, 1%1 8' 0.0\" E").arg(DEGREES_SYMB); + QTest::newRow("Wrap seconds to Minutes DMS") + << QGeoCoordinate(1.1333333, 1.1333333) << QGeoCoordinate::DegreesMinutesSeconds + << QString( "1%1 8' 0.0\", 1%1 8' 0.0\"").arg(DEGREES_SYMB); + QTest::newRow("Wrap minutes to Degrees DMH") + << QGeoCoordinate(1.999999, 1.999999) << QGeoCoordinate::DegreesMinutesWithHemisphere + << QString( "2%1 0.000' N, 2%1 0.000' E").arg(DEGREES_SYMB); + QTest::newRow("Wrap minutes to Degrees DM") + << QGeoCoordinate(1.999999, 1.999999) << QGeoCoordinate::DegreesMinutes + << QString( "2%1 0.000', 2%1 0.000'").arg(DEGREES_SYMB); + + QTest::newRow("Wrap seconds to minutes to Degrees DM -> above valid long/lat values") + << QGeoCoordinate(89.999999, 179.999999) << QGeoCoordinate::DegreesMinutesSeconds + << QString( "90%1 0' 0.0\", 180%1 0' 0.0\"").arg(DEGREES_SYMB); + + QTest::newRow("Seconds and minutes near valid long/lat values border") + << QGeoCoordinate(89.9999, 179.9999) << QGeoCoordinate::DegreesMinutesSeconds + << QString("89%1 59' 59.6\", 179%1 59' 59.6\"").arg(DEGREES_SYMB); + + QTest::newRow("Wrap minutes to Degrees DM ->above valid long/lat values") + << QGeoCoordinate(89.999999, 179.999999) << QGeoCoordinate::DegreesMinutes + << QString( "90%1 0.000', 180%1 0.000'").arg(DEGREES_SYMB); + + QTest::newRow("Minutes near valid long/lat values border") + << QGeoCoordinate(89.9999, 179.9999) << QGeoCoordinate::DegreesMinutes + << QString("89%1 59.994', 179%1 59.994'").arg(DEGREES_SYMB); + + QTest::newRow("Fix incorrect wrap minutes to degrees") + << QGeoCoordinate(0.995833, 0.995833) << QGeoCoordinate::DegreesMinutes + << QString("0%1 59.750', 0%1 59.750'").arg(DEGREES_SYMB); + + QTest::newRow("Fix incorrect wrap seconds to minutes") + << QGeoCoordinate(0.9832222, 0.9832222) << QGeoCoordinate::DegreesMinutesSeconds + << QString("0%1 58' 59.6\", 0%1 58' 59.6\"").arg(DEGREES_SYMB); + + } + + void datastream() + { + QFETCH(QGeoCoordinate, c); + + QByteArray ba; + QDataStream out(&ba, QIODevice::WriteOnly); + out << c; + + QDataStream in(&ba, QIODevice::ReadOnly); + QGeoCoordinate inCoord; + in >> inCoord; + QCOMPARE(inCoord, c); + } + + void datastream_data() + { + QTest::addColumn("c"); + + QTest::newRow("invalid") << QGeoCoordinate(); + QTest::newRow("valid lat, long") << BRISBANE; + QTest::newRow("valid lat, long, alt") << QGeoCoordinate(-1, -1, -1); + QTest::newRow("valid lat, long, alt again") << QGeoCoordinate(1, 1, 1); + } + + void debug() + { + QFETCH(QGeoCoordinate, c); + QFETCH(int, nextValue); + QFETCH(QByteArray, debugString); + + qInstallMessageHandler(tst_qgeocoordinate_messageHandler); + qDebug() << c << nextValue; + qInstallMessageHandler(0); + QCOMPARE(tst_qgeocoordinate_debug, debugString); + } + + void debug_data() + { + QTest::addColumn("c"); + QTest::addColumn("nextValue"); + QTest::addColumn("debugString"); + + QTest::newRow("uninitialized") << QGeoCoordinate() << 45 + << QByteArray("QGeoCoordinate(?, ?) 45"); + QTest::newRow("initialized without altitude") << BRISBANE << 45 + << (QString("QGeoCoordinate(%1, %2) 45").arg(BRISBANE.latitude(), 0, 'g', 9) + .arg(BRISBANE.longitude(), 0, 'g', 9)).toLatin1(); + QTest::newRow("invalid initialization") << QGeoCoordinate(-100,-200) << 45 + << QByteArray("QGeoCoordinate(?, ?) 45"); + QTest::newRow("initialized with altitude") << QGeoCoordinate(1,2,3) << 45 + << QByteArray("QGeoCoordinate(1, 2, 3) 45"); + QTest::newRow("extra long coordinates") << QGeoCoordinate(89.123412341, 179.123412341) + << 45 << QByteArray("QGeoCoordinate(89.123412341, 179.12341234) 45"); + } + + void hash() + { + auto s1 = qHash(QGeoCoordinate(1, 1, 2)); + auto s2 = qHash(QGeoCoordinate(2, 1, 1)); + auto s3 = qHash(QGeoCoordinate(1, 2, 1)); + auto s10 = qHash(QGeoCoordinate(0, 0, 2)); + auto s20 = qHash(QGeoCoordinate(2, 0, 0)); + auto s30 = qHash(QGeoCoordinate(0, 2, 0)); + auto s30NoAlt = qHash(QGeoCoordinate(0, 2)); + auto s30WithSeed = qHash(QGeoCoordinate(0, 2, 0), 1); + auto nullCoordinate = qHash(QGeoCoordinate()); + + auto north1 = qHash(QGeoCoordinate(90.0, 34.7, 0)); + auto north2 = qHash(QGeoCoordinate(90.0, 180, 0)); + + auto south1 = qHash(QGeoCoordinate(90.0, 67.7, 34.0)); + auto south2 = qHash(QGeoCoordinate(90.0, 111, 34.0)); + + QVERIFY(s1 != s2); + QVERIFY(s2 != s3); + QVERIFY(s1 != s3); + QVERIFY(s10 != s20); + QVERIFY(s20 != s30); + QVERIFY(s10 != s30); + QVERIFY(s30NoAlt != s30); + QVERIFY(s30WithSeed != s30); + + QVERIFY(nullCoordinate != s1); + QVERIFY(nullCoordinate != s2); + QVERIFY(nullCoordinate != s3); + QVERIFY(nullCoordinate != s10); + QVERIFY(nullCoordinate != s20); + QVERIFY(nullCoordinate != s30); + QVERIFY(nullCoordinate != s30NoAlt); + QVERIFY(nullCoordinate != s30WithSeed); + + QVERIFY(north1 == north2); + QVERIFY(south1 == south2); + } +}; + +QTEST_GUILESS_MAIN(tst_QGeoCoordinate) +#include "tst_qgeocoordinate.moc" diff --git a/tests/auto/qgeocoordinateobject/CMakeLists.txt b/tests/auto/qgeocoordinateobject/CMakeLists.txt new file mode 100644 index 0000000..340e606 --- /dev/null +++ b/tests/auto/qgeocoordinateobject/CMakeLists.txt @@ -0,0 +1,11 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_test(tst_qgeocoordinateobject + SOURCES + tst_qgeocoordinateobject.cpp + LIBRARIES + Qt::Core + Qt::PositioningPrivate + Qt::TestPrivate +) diff --git a/tests/auto/qgeocoordinateobject/tst_qgeocoordinateobject.cpp b/tests/auto/qgeocoordinateobject/tst_qgeocoordinateobject.cpp new file mode 100644 index 0000000..6653632 --- /dev/null +++ b/tests/auto/qgeocoordinateobject/tst_qgeocoordinateobject.cpp @@ -0,0 +1,74 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include + +QT_USE_NAMESPACE + +class tst_QGeoCoordinateObject : public QObject +{ + Q_OBJECT +private slots: + void constructor(); + void equality(); + void equality_data(); + void coordinateBinding(); +}; + +void tst_QGeoCoordinateObject::constructor() +{ + QGeoCoordinateObject defaultConstructed; + QCOMPARE(defaultConstructed.coordinate(), QGeoCoordinate()); + + QGeoCoordinate c(1.0, 2.0, 3.0); + QGeoCoordinateObject co(c); + QCOMPARE(co.coordinate(), c); +} + +void tst_QGeoCoordinateObject::equality() +{ + QFETCH(QGeoCoordinate, lhs); + QFETCH(QGeoCoordinate, rhs); + QFETCH(bool, expectedResult); + + QGeoCoordinateObject leftObj(lhs); + QGeoCoordinateObject rightObj(rhs); + + QVERIFY(leftObj == lhs); + QVERIFY(rightObj == rhs); + + QCOMPARE(leftObj == rhs, expectedResult); + QCOMPARE(leftObj != rhs, !expectedResult); + QCOMPARE(rightObj == lhs, expectedResult); + QCOMPARE(rightObj != lhs, !expectedResult); + QCOMPARE(leftObj == rightObj, expectedResult); + QCOMPARE(leftObj != rightObj, !expectedResult); +} + +void tst_QGeoCoordinateObject::equality_data() +{ + QTest::addColumn("lhs"); + QTest::addColumn("rhs"); + QTest::addColumn("expectedResult"); + + QTest::newRow("two invalid") << QGeoCoordinate() << QGeoCoordinate() << true; + QTest::newRow("same valid") << QGeoCoordinate(1.0, 2.0, 3.0) << QGeoCoordinate(1.0, 2.0, 3.0) + << true; + QTest::newRow("invalid vs valid") << QGeoCoordinate() << QGeoCoordinate(1.0, 2.0, 3.0) << false; + QTest::newRow("different valid") + << QGeoCoordinate(1.0, 2.0, 3.0) << QGeoCoordinate(2.0, 3.0, 4.0) << false; +} + +void tst_QGeoCoordinateObject::coordinateBinding() +{ + QGeoCoordinateObject obj; + const QGeoCoordinate initial(1, 2, 3); + const QGeoCoordinate changed(4, 5, 6); + QTestPrivate::testReadWritePropertyBasics( + obj, initial, changed, "coordinate"); +} + +QTEST_GUILESS_MAIN(tst_QGeoCoordinateObject) +#include "tst_qgeocoordinateobject.moc" diff --git a/tests/auto/qgeolocation/CMakeLists.txt b/tests/auto/qgeolocation/CMakeLists.txt new file mode 100644 index 0000000..3f400ab --- /dev/null +++ b/tests/auto/qgeolocation/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeolocation.pro. + +##################################################################### +## tst_qgeolocation Test: +##################################################################### + +qt_internal_add_test(tst_qgeolocation + SOURCES + ../utils/qlocationtestutils.cpp ../utils/qlocationtestutils_p.h + tst_qgeolocation.cpp tst_qgeolocation.h + LIBRARIES + Qt::Core + Qt::Positioning +) diff --git a/tests/auto/qgeolocation/tst_qgeolocation.cpp b/tests/auto/qgeolocation/tst_qgeolocation.cpp new file mode 100644 index 0000000..14c28f6 --- /dev/null +++ b/tests/auto/qgeolocation/tst_qgeolocation.cpp @@ -0,0 +1,387 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include "tst_qgeolocation.h" +#include +#include + +QT_USE_NAMESPACE + +tst_QGeoLocation::tst_QGeoLocation() +{ +} + +void tst_QGeoLocation::initTestCase() +{ + +} + +void tst_QGeoLocation::cleanupTestCase() +{ + +} + +void tst_QGeoLocation::init() +{ +} + +void tst_QGeoLocation::cleanup() +{ +} + +void tst_QGeoLocation::constructor() +{ + QCOMPARE(m_location.address(), m_address); + QCOMPARE(m_location.coordinate(), m_coordinate); + QCOMPARE(m_location.boundingShape(), m_viewport); + QCOMPARE(m_location.extendedAttributes(), m_extendedAttributes); +} + +void tst_QGeoLocation::copy_constructor() +{ + auto qgeolocationcopy = std::make_unique(m_location); + QCOMPARE(m_location, *qgeolocationcopy); +} + +void tst_QGeoLocation::move_constructor() +{ + QGeoAddress address; + address.setCity("Berlin"); + address.setCountry("Germany"); + address.setCountryCode("DEU"); + address.setDistrict("Adlershof"); + address.setPostalCode("12489"); + address.setStreet("Erich-Thilo-Strasse"); + + QGeoLocation location; + location.setAddress(address); + location.setCoordinate(QGeoCoordinate(1.3, 2.4, 3.1)); + location.setBoundingShape(QGeoCircle(QGeoCoordinate(1.3, 2.4), 100)); + + QGeoLocation locationCopy = location; + QCOMPARE(std::move(location), locationCopy); +} + +void tst_QGeoLocation::move_assignment() +{ + QGeoAddress address; + address.setCity("Berlin"); + address.setCountry("Germany"); + address.setCountryCode("DEU"); + address.setDistrict("Adlershof"); + address.setPostalCode("12489"); + address.setStreet("Erich-Thilo-Strasse"); + + QGeoLocation location; + location.setAddress(address); + location.setCoordinate(QGeoCoordinate(1.3, 2.4, 3.1)); + location.setBoundingShape(QGeoCircle(QGeoCoordinate(1.3, 2.4), 100)); + + QGeoLocation locationCopy = location; + + QGeoLocation otherLocation; + otherLocation = std::move(location); + QCOMPARE(otherLocation, locationCopy); + + // Check that (move)assignment to a moved-from object is fine + location = std::move(locationCopy); + QCOMPARE(location, otherLocation); +} + +void tst_QGeoLocation::destructor() +{ + QGeoLocation *qgeolocationcopy; + + qgeolocationcopy = new QGeoLocation(); + delete qgeolocationcopy; + + qgeolocationcopy = new QGeoLocation(m_location); + delete qgeolocationcopy; +} + +void tst_QGeoLocation::address() +{ + m_address.setCity("Berlin"); + m_address.setCountry("Germany"); + m_address.setCountryCode("DEU"); + m_address.setDistrict("Mitte"); + m_address.setPostalCode("10115"); + m_address.setStreet("Invalidenstrasse"); + + m_location.setAddress(m_address); + + QCOMPARE(m_location.address(),m_address); + + m_address.setPostalCode("10125"); + QVERIFY(m_location.address() != m_address); +} + +void tst_QGeoLocation::coordinate() +{ + m_coordinate.setLatitude(13.3851); + m_coordinate.setLongitude(52.5312); + m_coordinate.setAltitude(134.23); + + m_location.setCoordinate(m_coordinate); + + QCOMPARE(m_location.coordinate(), m_coordinate); + + m_coordinate.setAltitude(0); + QVERIFY(m_location.coordinate() != m_coordinate); +} + +void tst_QGeoLocation::viewport() +{ + m_coordinate.setLatitude(13.3851); + m_coordinate.setLongitude(52.5312); + + // rectangle bounding box + QGeoRectangle qgeoboundingboxcopy(m_coordinate, 0.4, 0.4); + m_location.setBoundingShape(qgeoboundingboxcopy); + + QCOMPARE(m_location.boundingShape(), qgeoboundingboxcopy); + // test that QGeoShape::boundingGeoRectangle() matches with + // the qgeoboundingboxcopy. It simplifies code porting + QCOMPARE(m_location.boundingShape().boundingGeoRectangle(), qgeoboundingboxcopy); + + qgeoboundingboxcopy.setHeight(1); + + QVERIFY(m_location.boundingShape() != qgeoboundingboxcopy); + + // circle bounding box + QGeoCircle circle(m_coordinate, 10); + m_location.setBoundingShape(circle); + + QCOMPARE(m_location.boundingShape(), circle); + + auto point = QGeoCoordinate(0.5, 0.5); + QVERIFY(!circle.contains(point)); + circle.extendCircle(point); + + QVERIFY(m_location.boundingShape() != circle); + QVERIFY(!m_location.boundingShape().contains(point)); + + // polygon bounding box + const QList points = {QGeoCoordinate(1.0, 1.0), QGeoCoordinate(1.0, 2.0), QGeoCoordinate(2.0, 2.0)}; + QGeoPolygon polygon(points); + + point = QGeoCoordinate(1.75, 1.25); + QVERIFY(!polygon.contains(point)); + + m_location.setBoundingShape(polygon); + QCOMPARE(m_location.boundingShape(), polygon); + + polygon.addCoordinate(QGeoCoordinate(2.0, 1.0)); + QVERIFY(m_location.boundingShape() != polygon); + QVERIFY(polygon.contains(point)); + QVERIFY(!m_location.boundingShape().contains(point)); +} + +void tst_QGeoLocation::extendedAttributes() +{ + m_extendedAttributes = QVariantMap({{ "foo" , 42 }}); + m_location.setExtendedAttributes(m_extendedAttributes); + QCOMPARE(m_location.extendedAttributes(), m_extendedAttributes); + + m_extendedAttributes["foo"] = 41; + QVERIFY(m_location.extendedAttributes() != m_extendedAttributes); +} + +void tst_QGeoLocation::operators() +{ + QGeoAddress qgeoaddresscopy; + qgeoaddresscopy.setCity("Berlin"); + qgeoaddresscopy.setCountry("Germany"); + qgeoaddresscopy.setCountryCode("DEU"); + + QGeoCoordinate qgeocoordinatecopy (32.324 , 41.324 , 24.55); + QVariantMap extendedAttributesCopy {{ "foo" , 42 }}; + + m_address.setCity("Madrid"); + m_address.setCountry("Spain"); + m_address.setCountryCode("SPA"); + + m_coordinate.setLatitude(21.3434); + m_coordinate.setLongitude(38.43443); + m_coordinate.setAltitude(634.21); + + m_extendedAttributes["foo"] = 43; + + m_location.setAddress(m_address); + m_location.setCoordinate(m_coordinate); + m_location.setExtendedAttributes(m_extendedAttributes); + + //Create a copy and see that they are the same + QGeoLocation qgeolocationcopy(m_location); + QVERIFY(m_location == qgeolocationcopy); + QVERIFY(!(m_location != qgeolocationcopy)); + + //Modify one and test if they are different + qgeolocationcopy.setAddress(qgeoaddresscopy); + QVERIFY(!(m_location == qgeolocationcopy)); + QVERIFY(m_location != qgeolocationcopy); + qgeolocationcopy.setAddress(m_address); + qgeolocationcopy.setCoordinate(qgeocoordinatecopy); + QVERIFY(!(m_location == qgeolocationcopy)); + QVERIFY(m_location != qgeolocationcopy); + qgeolocationcopy.setCoordinate(m_coordinate); + qgeolocationcopy.setExtendedAttributes(extendedAttributesCopy); + QVERIFY(!(m_location == qgeolocationcopy)); + QVERIFY(m_location != qgeolocationcopy); + + + //delete qgeolocationcopy; + //Asign and test that they are the same + qgeolocationcopy = m_location; + QVERIFY(m_location ==qgeolocationcopy); + QVERIFY(!(m_location != qgeolocationcopy)); +} + +void tst_QGeoLocation::comparison() +{ + QFETCH(QString, dataField); + + QGeoLocation location; + + //set address + QGeoAddress address; + address.setStreet("21 jump st"); + address.setCountry("USA"); + location.setAddress(address); + + //set coordinate + location.setCoordinate(QGeoCoordinate(5,10)); + + //set viewport + location.setBoundingShape(QGeoRectangle(QGeoCoordinate(5,5),0.4,0.4)); + + QGeoLocation otherLocation(location); + + if (dataField == "no change") { + QCOMPARE(location, otherLocation); + } else { + if (dataField == "address") { + QGeoAddress otherAddress; + otherAddress.setStreet("42 evergreen tce"); + otherAddress.setCountry("USA"); + otherLocation.setAddress(otherAddress); + } else if (dataField == "coordinate") { + otherLocation.setCoordinate(QGeoCoordinate(12,13)); + } else if (dataField == "viewport"){ + otherLocation.setBoundingShape(QGeoRectangle(QGeoCoordinate(1,2), 0.5,0.5)); + } else if (dataField == "extendedAttributes"){ + otherLocation.setExtendedAttributes(QVariantMap({{"foo", 44}})); + } else { + qFatal("Unknown data field to test"); + } + + QVERIFY(location != otherLocation); + } +} + +void tst_QGeoLocation::comparison_data() +{ + QTest::addColumn ("dataField"); + QTest::newRow("no change") << "no change"; + QTest::newRow("address") << "address"; + QTest::newRow("coordinate") << "coordinate"; + QTest::newRow("extendedAttributes") << "extendedAttributes"; +} + +void tst_QGeoLocation::isEmpty() +{ + QGeoAddress address; + address.setCity(QStringLiteral("Braunschweig")); + QVERIFY(!address.isEmpty()); + + QGeoRectangle boundingBox; + boundingBox.setTopLeft(QGeoCoordinate(1, -1)); + boundingBox.setBottomRight(QGeoCoordinate(-1, 1)); + QVERIFY(!boundingBox.isEmpty()); + + QVariantMap extendedAttributes({{"foo", 11}}); + + QGeoLocation location; + + QVERIFY(location.isEmpty()); + + // address + location.setAddress(address); + QVERIFY(!location.isEmpty()); + location.setAddress(QGeoAddress()); + QVERIFY(location.isEmpty()); + + // coordinate + location.setCoordinate(QGeoCoordinate(1, 2)); + QVERIFY(!location.isEmpty()); + location.setCoordinate(QGeoCoordinate()); + QVERIFY(location.isEmpty()); + + // bounding box + location.setBoundingShape(boundingBox); + QVERIFY(!location.isEmpty()); + location.setBoundingShape(QGeoRectangle()); + QVERIFY(location.isEmpty()); + + // extended attributes + location.setExtendedAttributes(extendedAttributes); + QVERIFY(!location.isEmpty()); + location.setExtendedAttributes(QVariantMap()); + QVERIFY(location.isEmpty()); +} + +void tst_QGeoLocation::hashing() +{ + QFETCH(QGeoLocation, leftLocation); + QFETCH(QGeoLocation, rightLocation); + QFETCH(bool, result); + + const size_t leftHash = qHash(leftLocation); + const size_t rightHash = qHash(rightLocation); + QCOMPARE(leftHash == rightHash, result); +} + +void tst_QGeoLocation::hashing_data() +{ + QTest::addColumn("leftLocation"); + QTest::addColumn("rightLocation"); + QTest::addColumn("result"); + + QTest::newRow("empty") << QGeoLocation() << QGeoLocation() << true; + + QGeoAddress address; + address.setCity("city"); + address.setPostalCode("1234"); + address.setDistrict("district"); + address.setStreet("street"); + address.setStreetNumber("12"); + + QGeoLocation leftLocation; + leftLocation.setAddress(address); + leftLocation.setCoordinate(QGeoCoordinate(1, 1)); + leftLocation.setBoundingShape(QGeoCircle(QGeoCoordinate(1, 1), 10)); + + // do not copy, so that they have different d_ptr's + QGeoLocation rightLocation; + rightLocation.setAddress(address); + rightLocation.setCoordinate(QGeoCoordinate(1, 1)); + rightLocation.setBoundingShape(QGeoCircle(QGeoCoordinate(1, 1), 10)); + + QTest::newRow("same locations") << leftLocation << rightLocation << true; + + QGeoLocation rightLocationCopy = rightLocation; + rightLocationCopy.setBoundingShape(QGeoRectangle(QGeoCoordinate(2, 0), QGeoCoordinate(0, 2))); + QTest::newRow("different shapes") << leftLocation << rightLocationCopy << false; + + rightLocationCopy = rightLocation; + rightLocationCopy.setCoordinate(QGeoCoordinate(2, 1)); + QTest::newRow("different coordinates") << leftLocation << rightLocationCopy << false; + + rightLocationCopy = rightLocation; + address.setState("state"); + rightLocationCopy.setAddress(address); + QTest::newRow("different addresses") << leftLocation << rightLocationCopy << false; +} + +QTEST_APPLESS_MAIN(tst_QGeoLocation); + diff --git a/tests/auto/qgeolocation/tst_qgeolocation.h b/tests/auto/qgeolocation/tst_qgeolocation.h new file mode 100644 index 0000000..eefcadf --- /dev/null +++ b/tests/auto/qgeolocation/tst_qgeolocation.h @@ -0,0 +1,65 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef TST_QGEOLOCATION_H +#define TST_QGEOLOCATION_H + +#include +#include +#include +#include + +#include "../utils/qlocationtestutils_p.h" +#include +#include +#include +#include + +QT_USE_NAMESPACE + +class tst_QGeoLocation : public QObject +{ + Q_OBJECT + +public: + tst_QGeoLocation(); + +private Q_SLOTS: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + //Start Unit Tests for qgeolocation.h + void constructor(); + void copy_constructor(); + void move_constructor(); + void move_assignment(); + void destructor(); + void address(); + void coordinate(); + void viewport(); + void extendedAttributes(); + void operators(); + void comparison(); + void comparison_data(); + void isEmpty(); + void hashing(); + void hashing_data(); + //End Unit Tests for qgeolocation.h + +private: + QGeoLocation m_location; + + QGeoAddress m_address; + QGeoCoordinate m_coordinate; + QGeoShape m_viewport; + QVariantMap m_extendedAttributes; +}; + +Q_DECLARE_METATYPE( QGeoCoordinate::CoordinateFormat); +Q_DECLARE_METATYPE( QGeoCoordinate::CoordinateType); +Q_DECLARE_METATYPE( QList); + +#endif + diff --git a/tests/auto/qgeopath/CMakeLists.txt b/tests/auto/qgeopath/CMakeLists.txt new file mode 100644 index 0000000..e5e1dd5 --- /dev/null +++ b/tests/auto/qgeopath/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeopath.pro. + +##################################################################### +## tst_qgeopath Test: +##################################################################### + +qt_internal_add_test(tst_qgeopath + SOURCES + tst_qgeopath.cpp + LIBRARIES + Qt::Core + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:qgeopath.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/qgeopath/tst_qgeopath.cpp b/tests/auto/qgeopath/tst_qgeopath.cpp new file mode 100644 index 0000000..14ce2a3 --- /dev/null +++ b/tests/auto/qgeopath/tst_qgeopath.cpp @@ -0,0 +1,367 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include + +QT_USE_NAMESPACE + +class tst_QGeoPath : public QObject +{ + Q_OBJECT + +private slots: + void defaultConstructor(); + void listConstructor(); + void assignment(); + + void comparison(); + void type(); + + void path(); + void width(); + void size(); + + void translate_data(); + void translate(); + + void valid_data(); + void valid(); + + void contains_data(); + void contains(); + + void boundingGeoRectangle_data(); + void boundingGeoRectangle(); + + void hashing(); +}; + +void tst_QGeoPath::defaultConstructor() +{ + QGeoPath p; + QVERIFY(!p.path().size()); + QCOMPARE(p.width(), qreal(0.0)); + QCOMPARE(p.length(), double(0.0)); +} + +void tst_QGeoPath::listConstructor() +{ + QList coords; + coords.append(QGeoCoordinate(1,1)); + coords.append(QGeoCoordinate(2,2)); + coords.append(QGeoCoordinate(3,0)); + + QGeoPath p(coords, 1.0); + QCOMPARE(p.width(), qreal(1.0)); + QCOMPARE(p.path().size(), 3); + + for (const QGeoCoordinate &c : coords) { + QCOMPARE(p.path().contains(c), true); + } +} + +void tst_QGeoPath::assignment() +{ + QGeoPath p1; + QList coords; + coords.append(QGeoCoordinate(1,1)); + coords.append(QGeoCoordinate(2,2)); + coords.append(QGeoCoordinate(3,0)); + QGeoPath p2(coords, 1.0); + + QVERIFY(p1 != p2); + + p1 = p2; + QCOMPARE(p1.path(), coords); + QCOMPARE(p1.width(), 1.0); + QCOMPARE(p1, p2); + + // Assign c1 to an area + QGeoShape area = p1; + QCOMPARE(area.type(), p1.type()); + QVERIFY(area == p1); + + // Assign the area back to a bounding circle + QGeoPath p3 = area; + QCOMPARE(p3.path(), coords); + QCOMPARE(p3.width(), 1.0); + + // Check that the copy is not modified when modifying the original. + p1.setWidth(2.0); + QVERIFY(p3.width() != p1.width()); + QVERIFY(p3 != p1); +} + +void tst_QGeoPath::comparison() +{ + QList coords; + coords.append(QGeoCoordinate(1,1)); + coords.append(QGeoCoordinate(2,2)); + coords.append(QGeoCoordinate(3,0)); + QList coords2; + coords2.append(QGeoCoordinate(3,1)); + coords2.append(QGeoCoordinate(4,2)); + coords2.append(QGeoCoordinate(3,0)); + QGeoPath c1(coords, qreal(50.0)); + QGeoPath c2(coords, qreal(50.0)); + QGeoPath c3(coords, qreal(35.0)); + QGeoPath c4(coords2, qreal(50.0)); + + QVERIFY(c1 == c2); + QVERIFY(!(c1 != c2)); + + QVERIFY(!(c1 == c3)); + QVERIFY(c1 != c3); + + QVERIFY(!(c1 == c4)); + QVERIFY(c1 != c4); + + QVERIFY(!(c2 == c3)); + QVERIFY(c2 != c3); + + QGeoRectangle b1(QGeoCoordinate(20,20),QGeoCoordinate(10,30)); + QVERIFY(!(c1 == b1)); + QVERIFY(c1 != b1); + + QGeoShape *c2Ptr = &c2; + QVERIFY(c1 == *c2Ptr); + QVERIFY(!(c1 != *c2Ptr)); + + QGeoShape *c3Ptr = &c3; + QVERIFY(!(c1 == *c3Ptr)); + QVERIFY(c1 != *c3Ptr); +} + +void tst_QGeoPath::type() +{ + QGeoPath c; + QCOMPARE(c.type(), QGeoShape::PathType); +} + +void tst_QGeoPath::path() +{ + QList coords; + coords.append(QGeoCoordinate(1,1)); + coords.append(QGeoCoordinate(2,2)); + coords.append(QGeoCoordinate(3,0)); + + QGeoPath p; + p.setPath(coords); + QCOMPARE(p.path().size(), 3); + + for (const QGeoCoordinate &c : coords) { + QCOMPARE(p.path().contains(c), true); + } + + p.clearPath(); + QCOMPARE(p.path().size(), 0); + QVERIFY(p.boundingGeoRectangle().isEmpty()); +} + +void tst_QGeoPath::width() +{ + QGeoPath p; + p.setWidth(10.0); + QCOMPARE(p.width(), qreal(10.0)); +} + +void tst_QGeoPath::size() +{ + QList coords; + + QGeoPath p1(coords, 3); + QCOMPARE(p1.size(), coords.size()); + + coords.append(QGeoCoordinate(1,1)); + QGeoPath p2(coords, 3); + QCOMPARE(p2.size(), coords.size()); + + coords.append(QGeoCoordinate(2,2)); + QGeoPath p3(coords, 3); + QCOMPARE(p3.size(), coords.size()); + + coords.append(QGeoCoordinate(3,0)); + QGeoPath p4(coords, 3); + QCOMPARE(p4.size(), coords.size()); + + p4.removeCoordinate(2); + QCOMPARE(p4.size(), coords.size() - 1); + + p4.removeCoordinate(coords.first()); + QCOMPARE(p4.size(), coords.size() - 2); +} + +void tst_QGeoPath::translate_data() +{ + QTest::addColumn("c1"); + QTest::addColumn("c2"); + QTest::addColumn("c3"); + QTest::addColumn("lat"); + QTest::addColumn("lon"); + + QTest::newRow("Simple") << QGeoCoordinate(1,1) << QGeoCoordinate(2,2) << + QGeoCoordinate(3,0) << 5.0 << 4.0; + QTest::newRow("Backward") << QGeoCoordinate(1,1) << QGeoCoordinate(2,2) << + QGeoCoordinate(3,0) << -5.0 << -4.0; +} + +void tst_QGeoPath::translate() +{ + QFETCH(QGeoCoordinate, c1); + QFETCH(QGeoCoordinate, c2); + QFETCH(QGeoCoordinate, c3); + QFETCH(double, lat); + QFETCH(double, lon); + + QList coords; + coords.append(c1); + coords.append(c2); + coords.append(c3); + QGeoPath p(coords); + + p.translate(lat, lon); + + for (int i = 0; i < p.path().size(); i++) { + QCOMPARE(coords[i].latitude(), p.path()[i].latitude() - lat ); + QCOMPARE(coords[i].longitude(), p.path()[i].longitude() - lon ); + } +} + +void tst_QGeoPath::valid_data() +{ + QTest::addColumn("c1"); + QTest::addColumn("c2"); + QTest::addColumn("c3"); + QTest::addColumn("width"); + QTest::addColumn("valid"); + + QTest::newRow("empty coords") << QGeoCoordinate() << QGeoCoordinate() << QGeoCoordinate() << qreal(5.0) << false; + QTest::newRow("invalid coord") << QGeoCoordinate(50, 50) << QGeoCoordinate(60, 60) << QGeoCoordinate(700, 700) << qreal(5.0) << false; + QTest::newRow("bad width") << QGeoCoordinate(10, 10) << QGeoCoordinate(11, 11) << QGeoCoordinate(10, 12) << qreal(-5.0) << true; + QTest::newRow("NaN width") << QGeoCoordinate(10, 10) << QGeoCoordinate(11, 11) << QGeoCoordinate(10, 12) << qreal(qQNaN()) << true; + QTest::newRow("zero width") << QGeoCoordinate(10, 10) << QGeoCoordinate(11, 11) << QGeoCoordinate(10, 12) << qreal(0) << true; + QTest::newRow("good") << QGeoCoordinate(10, 10) << QGeoCoordinate(11, 11) << QGeoCoordinate(10, 12) << qreal(5) << true; +} + +void tst_QGeoPath::valid() +{ + QFETCH(QGeoCoordinate, c1); + QFETCH(QGeoCoordinate, c2); + QFETCH(QGeoCoordinate, c3); + QFETCH(qreal, width); + QFETCH(bool, valid); + + QList coords; + coords.append(c1); + coords.append(c2); + coords.append(c3); + QGeoPath p(coords, width); + + QCOMPARE(p.isValid(), valid); + + QGeoShape area = p; + QCOMPARE(area.isValid(), valid); +} + +void tst_QGeoPath::contains_data() +{ + QTest::addColumn("c1"); + QTest::addColumn("c2"); + QTest::addColumn("c3"); + QTest::addColumn("width"); + QTest::addColumn("probe"); + QTest::addColumn("result"); + + QList c; + c.append(QGeoCoordinate(1,1)); + c.append(QGeoCoordinate(2,2)); + c.append(QGeoCoordinate(3,0)); + + QTest::newRow("One of the points") << c[0] << c[1] << c[2] << 0.0 << QGeoCoordinate(2, 2) << true; + QTest::newRow("Not so far away") << c[0] << c[1] << c[2] << 0.0 << QGeoCoordinate(0.8, 0.8) << false; + QTest::newRow("Not so far away and large line") << c[0] << c[1] << c[2] << 100000.0 << QGeoCoordinate(0.8, 0.8) << true; +} + +void tst_QGeoPath::contains() +{ + QFETCH(QGeoCoordinate, c1); + QFETCH(QGeoCoordinate, c2); + QFETCH(QGeoCoordinate, c3); + QFETCH(qreal, width); + QFETCH(QGeoCoordinate, probe); + QFETCH(bool, result); + + QList coords; + coords.append(c1); + coords.append(c2); + coords.append(c3); + QGeoPath p(coords, width); + + QCOMPARE(p.contains(probe), result); + + QGeoShape area = p; + QCOMPARE(area.contains(probe), result); +} + +void tst_QGeoPath::boundingGeoRectangle_data() +{ + QTest::addColumn("c1"); + QTest::addColumn("c2"); + QTest::addColumn("c3"); + QTest::addColumn("width"); + QTest::addColumn("probe"); + QTest::addColumn("result"); + + QList c; + c.append(QGeoCoordinate(1,1)); + c.append(QGeoCoordinate(2,2)); + c.append(QGeoCoordinate(3,0)); + + QTest::newRow("One of the points") << c[0] << c[1] << c[2] << 0.0 << QGeoCoordinate(2, 2) << true; + QTest::newRow("Not so far away") << c[0] << c[1] << c[2] << 0.0 << QGeoCoordinate(0, 0) << false; + QTest::newRow("Inside the bounds") << c[0] << c[1] << c[2] << 100.0 << QGeoCoordinate(1, 0) << true; + QTest::newRow("Inside the bounds") << c[0] << c[1] << c[2] << 100.0 << QGeoCoordinate(1.1, 0.1) << true; +} + +void tst_QGeoPath::boundingGeoRectangle() +{ + QFETCH(QGeoCoordinate, c1); + QFETCH(QGeoCoordinate, c2); + QFETCH(QGeoCoordinate, c3); + QFETCH(qreal, width); + QFETCH(QGeoCoordinate, probe); + QFETCH(bool, result); + + QList coords; + coords.append(c1); + coords.append(c2); + coords.append(c3); + QGeoPath p(coords, width); + + QGeoRectangle box = p.boundingGeoRectangle(); + QCOMPARE(box.contains(probe), result); +} + +void tst_QGeoPath::hashing() +{ + const QGeoPath path({ QGeoCoordinate(1, 1), QGeoCoordinate(1, 2), QGeoCoordinate(2, 5) }, 1.0); + const size_t pathHash = qHash(path); + + QGeoPath otherCoordsPath = path; + otherCoordsPath.addCoordinate(QGeoCoordinate(3, 5)); + QVERIFY(qHash(otherCoordsPath) != pathHash); + + QGeoPath otherWidthPath = path; + otherWidthPath.setWidth(1.5); + QVERIFY(qHash(otherWidthPath) != pathHash); + + // Do not assign, so that they do not share same d_ptr + QGeoPath similarPath({ QGeoCoordinate(1, 1), QGeoCoordinate(1, 2), QGeoCoordinate(2, 5) }, 1.0); + QCOMPARE(qHash(similarPath), pathHash); +} + +QTEST_MAIN(tst_QGeoPath) +#include "tst_qgeopath.moc" diff --git a/tests/auto/qgeopolygon/CMakeLists.txt b/tests/auto/qgeopolygon/CMakeLists.txt new file mode 100644 index 0000000..996f981 --- /dev/null +++ b/tests/auto/qgeopolygon/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeopolygon.pro. + +##################################################################### +## tst_qgeopolygon Test: +##################################################################### + +qt_internal_add_test(tst_qgeopolygon + SOURCES + tst_qgeopolygon.cpp + LIBRARIES + Qt::Core + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:qgeopolygon.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/qgeopolygon/tst_qgeopolygon.cpp b/tests/auto/qgeopolygon/tst_qgeopolygon.cpp new file mode 100644 index 0000000..794aa79 --- /dev/null +++ b/tests/auto/qgeopolygon/tst_qgeopolygon.cpp @@ -0,0 +1,384 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include + +QT_USE_NAMESPACE + +class tst_QGeoPolygon : public QObject +{ + Q_OBJECT + +private slots: + void defaultConstructor(); + void listConstructor(); + void assignment(); + + void comparison(); + void type(); + + void path(); + void size(); + + void translate_data(); + void translate(); + + void valid_data(); + void valid(); + + void contains_data(); + void contains(); + + void containsAfterCopy(); + + void boundingGeoRectangle_data(); + void boundingGeoRectangle(); + + void hashing(); +}; + +void tst_QGeoPolygon::defaultConstructor() +{ + QGeoPolygon p; + QVERIFY(!p.perimeter().size()); + QVERIFY(!p.size()); + QVERIFY(!p.isValid()); + QVERIFY(p.isEmpty()); +} + +void tst_QGeoPolygon::listConstructor() +{ + QList coords; + coords.append(QGeoCoordinate(1,1)); + coords.append(QGeoCoordinate(2,2)); + QGeoPolygon p2(coords); + QCOMPARE(p2.perimeter().size(), 2); + QCOMPARE(p2.size(), 2); + QVERIFY(!p2.isValid()); // a polygon can't have only 2 coords + QVERIFY(!p2.isEmpty()); + + coords.append(QGeoCoordinate(3,0)); + + QGeoPolygon p(coords); + QCOMPARE(p.perimeter().size(), 3); + QCOMPARE(p.size(), 3); + QVERIFY(p.isValid()); + QVERIFY(!p.isEmpty()); + + + for (const QGeoCoordinate &c : coords) { + QCOMPARE(p.perimeter().contains(c), true); + QCOMPARE(p.containsCoordinate(c), true); + } +} + +void tst_QGeoPolygon::assignment() +{ + QGeoPolygon p1; + QList coords; + coords.append(QGeoCoordinate(1,1)); + coords.append(QGeoCoordinate(2,2)); + coords.append(QGeoCoordinate(3,0)); + QGeoPolygon p2(coords); + + QVERIFY(p1 != p2); + + p1 = p2; + QCOMPARE(p1.perimeter(), coords); + QCOMPARE(p1, p2); + + // Assign c1 to an area + QGeoShape area = p1; + QCOMPARE(area.type(), p1.type()); + QVERIFY(area == p1); + + // Assign the area back to a polygon + QGeoPolygon p3 = area; + QCOMPARE(p3.perimeter(), coords); + QVERIFY(p3 == p1); + + // Check that the copy is not modified when modifying the original. + p1.addCoordinate(QGeoCoordinate(4,0)); + QVERIFY(p3 != p1); +} + +void tst_QGeoPolygon::comparison() +{ + QList coords; + coords.append(QGeoCoordinate(1,1)); + coords.append(QGeoCoordinate(2,2)); + coords.append(QGeoCoordinate(3,0)); + QList coords2; + coords2.append(QGeoCoordinate(3,1)); + coords2.append(QGeoCoordinate(4,2)); + coords2.append(QGeoCoordinate(3,0)); + QGeoPolygon c1(coords); + QGeoPolygon c2(coords); + QGeoPolygon c3(coords2); + + QVERIFY(c1 == c2); + QVERIFY(!(c1 != c2)); + + QVERIFY(!(c1 == c3)); + QVERIFY(c1 != c3); + + QVERIFY(!(c2 == c3)); + QVERIFY(c2 != c3); + + QGeoRectangle b1(QGeoCoordinate(20,20),QGeoCoordinate(10,30)); + QVERIFY(!(c1 == b1)); + QVERIFY(c1 != b1); + + QGeoShape *c2Ptr = &c2; + QVERIFY(c1 == *c2Ptr); + QVERIFY(!(c1 != *c2Ptr)); + + QGeoShape *c3Ptr = &c3; + QVERIFY(!(c1 == *c3Ptr)); + QVERIFY(c1 != *c3Ptr); +} + +void tst_QGeoPolygon::type() +{ + QGeoPolygon c; + QCOMPARE(c.type(), QGeoShape::PolygonType); +} + +void tst_QGeoPolygon::path() +{ + QList coords; + coords.append(QGeoCoordinate(1,1)); + coords.append(QGeoCoordinate(2,2)); + coords.append(QGeoCoordinate(3,0)); + + QGeoPolygon p; + p.setPerimeter(coords); + QCOMPARE(p.perimeter().size(), 3); + QCOMPARE(p.size(), 3); + + for (const QGeoCoordinate &c : coords) { + QCOMPARE(p.perimeter().contains(c), true); + QCOMPARE(p.containsCoordinate(c), true); + } +} + +void tst_QGeoPolygon::size() +{ + QList coords; + + QGeoPolygon p1(coords); + QCOMPARE(p1.size(), coords.size()); + + coords.append(QGeoCoordinate(1,1)); + QGeoPolygon p2(coords); + QCOMPARE(p2.size(), coords.size()); + + coords.append(QGeoCoordinate(2,2)); + QGeoPolygon p3(coords); + QCOMPARE(p3.size(), coords.size()); + + coords.append(QGeoCoordinate(3,0)); + QGeoPolygon p4(coords); + QCOMPARE(p4.size(), coords.size()); + + p4.removeCoordinate(2); + QCOMPARE(p4.size(), coords.size() - 1); + + p4.removeCoordinate(coords.first()); + QCOMPARE(p4.size(), coords.size() - 2); +} + +void tst_QGeoPolygon::translate_data() +{ + QTest::addColumn("c1"); + QTest::addColumn("c2"); + QTest::addColumn("c3"); + QTest::addColumn("lat"); + QTest::addColumn("lon"); + + QTest::newRow("Simple") << QGeoCoordinate(1,1) << QGeoCoordinate(2,2) << + QGeoCoordinate(3,0) << 5.0 << 4.0; + QTest::newRow("Backward") << QGeoCoordinate(1,1) << QGeoCoordinate(2,2) << + QGeoCoordinate(3,0) << -5.0 << -4.0; +} + +void tst_QGeoPolygon::translate() +{ + QFETCH(QGeoCoordinate, c1); + QFETCH(QGeoCoordinate, c2); + QFETCH(QGeoCoordinate, c3); + QFETCH(double, lat); + QFETCH(double, lon); + + QList coords; + coords.append(c1); + coords.append(c2); + coords.append(c3); + QGeoPolygon p(coords); + + p.translate(lat, lon); + + for (int i = 0; i < p.perimeter().size(); i++) { + QCOMPARE(coords[i].latitude(), p.perimeter()[i].latitude() - lat ); + QCOMPARE(coords[i].longitude(), p.perimeter()[i].longitude() - lon ); + } +} + +void tst_QGeoPolygon::valid_data() +{ + QTest::addColumn("c1"); + QTest::addColumn("c2"); + QTest::addColumn("c3"); + QTest::addColumn("valid"); + + QTest::newRow("empty coords") << QGeoCoordinate() << QGeoCoordinate() << QGeoCoordinate() << false; + QTest::newRow("invalid coord") << QGeoCoordinate(50, 50) << QGeoCoordinate(60, 60) << QGeoCoordinate(700, 700) << false; + QTest::newRow("good") << QGeoCoordinate(10, 10) << QGeoCoordinate(11, 11) << QGeoCoordinate(10, 12) << true; +} + +void tst_QGeoPolygon::valid() +{ + QFETCH(QGeoCoordinate, c1); + QFETCH(QGeoCoordinate, c2); + QFETCH(QGeoCoordinate, c3); + QFETCH(bool, valid); + + QList coords; + coords.append(c1); + coords.append(c2); + coords.append(c3); + QGeoPolygon p(coords); + + QCOMPARE(p.isValid(), valid); + + QGeoShape area = p; + QCOMPARE(area.isValid(), valid); +} + +void tst_QGeoPolygon::contains_data() +{ + QTest::addColumn("c1"); + QTest::addColumn("c2"); + QTest::addColumn("c3"); + QTest::addColumn("probe"); + QTest::addColumn("result"); + + QList c; + c.append(QGeoCoordinate(1,1)); + c.append(QGeoCoordinate(2,2)); + c.append(QGeoCoordinate(3,0)); + + QTest::newRow("One of the points") << c[0] << c[1] << c[2] << QGeoCoordinate(2, 2) << true; + QTest::newRow("Not so far away") << c[0] << c[1] << c[2] << QGeoCoordinate(0.8, 0.8) << false; + QTest::newRow("Not so far away and large line") << c[0] << c[1] << c[2] << QGeoCoordinate(0.8, 0.8) << false; + QTest::newRow("Inside") << c[0] << c[1] << c[2] << QGeoCoordinate(2.0, 1.0) << true; +} + +void tst_QGeoPolygon::contains() +{ + QFETCH(QGeoCoordinate, c1); + QFETCH(QGeoCoordinate, c2); + QFETCH(QGeoCoordinate, c3); + QFETCH(QGeoCoordinate, probe); + QFETCH(bool, result); + + QList coords; + coords.append(c1); + coords.append(c2); + coords.append(c3); + QGeoPolygon p(coords); + + QCOMPARE(p.contains(probe), result); + + QGeoShape area = p; + QCOMPARE(area.contains(probe), result); +} + +void tst_QGeoPolygon::containsAfterCopy() +{ + // This test is to make sure that we copy the QClipperUtils in the + // QGeoPolygonPrivate correctly. + QList coords; + coords.append(QGeoCoordinate(1, 1)); + coords.append(QGeoCoordinate(2, 2)); + coords.append(QGeoCoordinate(3, 0)); + + const QGeoCoordinate testPoint(2.0, 1.0); + + QGeoPolygon p1(coords); + QVERIFY(p1.contains(testPoint)); + + QGeoPolygon p2 = p1; + QVERIFY(p2.contains(testPoint)); + + p2.translate(10, 10); // does not contain testPoint any more + QVERIFY(!p2.contains(testPoint)); + QVERIFY(p1.contains(testPoint)); + // This check is intentional! Needed to make sure that p1 does not modify + // the internals of p2 somehow. + QVERIFY(!p2.contains(testPoint)); +} + +void tst_QGeoPolygon::boundingGeoRectangle_data() +{ + QTest::addColumn("c1"); + QTest::addColumn("c2"); + QTest::addColumn("c3"); + QTest::addColumn("probe"); + QTest::addColumn("result"); + + QList c; + c.append(QGeoCoordinate(1,1)); + c.append(QGeoCoordinate(2,2)); + c.append(QGeoCoordinate(3,0)); + + QTest::newRow("One of the points") << c[0] << c[1] << c[2] << QGeoCoordinate(2, 2) << true; + QTest::newRow("Not so far away") << c[0] << c[1] << c[2] << QGeoCoordinate(0, 0) << false; + QTest::newRow("Inside the bounds") << c[0] << c[1] << c[2] << QGeoCoordinate(1, 0) << true; + QTest::newRow("Inside the bounds") << c[0] << c[1] << c[2] << QGeoCoordinate(1.1, 0.1) << true; +} + +void tst_QGeoPolygon::boundingGeoRectangle() +{ + QFETCH(QGeoCoordinate, c1); + QFETCH(QGeoCoordinate, c2); + QFETCH(QGeoCoordinate, c3); + QFETCH(QGeoCoordinate, probe); + QFETCH(bool, result); + + QList coords; + coords.append(c1); + coords.append(c2); + coords.append(c3); + QGeoPolygon p(coords); + + QGeoRectangle box = p.boundingGeoRectangle(); + QCOMPARE(box.contains(probe), result); +} + +void tst_QGeoPolygon::hashing() +{ + const QGeoPolygon polygon({ QGeoCoordinate(1, 1), QGeoCoordinate(2, 2), + QGeoCoordinate(3, 0) }); + const size_t polygonHash = qHash(polygon); + + QGeoPolygon otherCoordsPolygon = polygon; + otherCoordsPolygon.addCoordinate(QGeoCoordinate(4, 1)); + QVERIFY(qHash(otherCoordsPolygon) != polygonHash); + + QGeoPolygon otherHolesPolygon = polygon; + otherHolesPolygon.addHole({ QGeoCoordinate(1.1, 1), QGeoCoordinate(2, 1.8), + QGeoCoordinate(2, 1) }); + QVERIFY(qHash(otherHolesPolygon) != polygonHash); + + // Do not assign, so that they do not share same d_ptr + QGeoPolygon similarPolygon({ QGeoCoordinate(1, 1), QGeoCoordinate(2, 2), + QGeoCoordinate(3, 0) }); + QCOMPARE(qHash(similarPolygon), polygonHash); +} + +QTEST_MAIN(tst_QGeoPolygon) +#include "tst_qgeopolygon.moc" diff --git a/tests/auto/qgeopositioninfo/CMakeLists.txt b/tests/auto/qgeopositioninfo/CMakeLists.txt new file mode 100644 index 0000000..6783368 --- /dev/null +++ b/tests/auto/qgeopositioninfo/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeopositioninfo.pro. + +##################################################################### +## tst_qgeopositioninfo Test: +##################################################################### + +qt_internal_add_test(tst_qgeopositioninfo + SOURCES + tst_qgeopositioninfo.cpp + LIBRARIES + Qt::Core + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:qgeopositioninfo.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/qgeopositioninfo/tst_qgeopositioninfo.cpp b/tests/auto/qgeopositioninfo/tst_qgeopositioninfo.cpp new file mode 100644 index 0000000..d3fdfcb --- /dev/null +++ b/tests/auto/qgeopositioninfo/tst_qgeopositioninfo.cpp @@ -0,0 +1,395 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +//TESTED_COMPONENT=src/location + +#include + +#include +#include +#include +#include +#include + +#include + +QT_USE_NAMESPACE + +Q_DECLARE_METATYPE(QGeoPositionInfo::Attribute) + +QByteArray tst_qgeopositioninfo_debug; + +void tst_qgeopositioninfo_messageHandler(QtMsgType type, const QMessageLogContext&, const QString &msg) +{ + switch (type) { + case QtDebugMsg : + tst_qgeopositioninfo_debug = msg.toLocal8Bit(); + break; + default: + break; + } +} + +QList tst_qgeopositioninfo_qrealTestValues() +{ + QList values; + + if (qreal(DBL_MIN) == DBL_MIN) + values << DBL_MIN; + + values << FLT_MIN; + values << -1.0 << 0.0 << 1.0; + values << FLT_MAX; + + if (qreal(DBL_MAX) == DBL_MAX) + values << DBL_MAX; + + return values; +} + +QList tst_qgeopositioninfo_getAttributes() +{ + QList attributes; + attributes << QGeoPositionInfo::Direction + << QGeoPositionInfo::GroundSpeed + << QGeoPositionInfo::VerticalSpeed + << QGeoPositionInfo::MagneticVariation + << QGeoPositionInfo::HorizontalAccuracy + << QGeoPositionInfo::VerticalAccuracy; + return attributes; +} + + +class tst_QGeoPositionInfo : public QObject +{ + Q_OBJECT + +private: + QGeoPositionInfo infoWithAttribute(QGeoPositionInfo::Attribute attribute, qreal value) + { + QGeoPositionInfo info; + info.setAttribute(attribute, value); + return info; + } + + void addTestData_info() + { + QTest::addColumn("info"); + + QTest::newRow("invalid") << QGeoPositionInfo(); + + QTest::newRow("coord") << QGeoPositionInfo(QGeoCoordinate(-27.3422,150.2342), QDateTime()); + QTest::newRow("datetime") << QGeoPositionInfo(QGeoCoordinate(), QDateTime::currentDateTime()); + + QList attributes = tst_qgeopositioninfo_getAttributes(); + QList values = tst_qgeopositioninfo_qrealTestValues(); + for (int i=0; i("coord"); + QTest::addColumn("dateTime"); + QTest::addColumn("valid"); + + QTest::newRow("both null") << QGeoCoordinate() << QDateTime() << false; + QTest::newRow("both valid") << QGeoCoordinate(1,1) << QDateTime::currentDateTime() << true; + QTest::newRow("valid coord") << QGeoCoordinate(1,1) << QDateTime() << false; + QTest::newRow("valid datetime") << QGeoCoordinate() << QDateTime::currentDateTime() << false; + QTest::newRow("valid time but not date == invalid") + << QGeoCoordinate() << QDateTime(QDate(), QTime::currentTime()) << false; + QTest::newRow("valid date but not time == valid due to QDateTime constructor") + << QGeoCoordinate() << QDateTime(QDate::currentDate(), QTime()) << false; + } + + void constructor_copy() + { + QFETCH(QGeoPositionInfo, info); + + QCOMPARE(QGeoPositionInfo(info), info); + } + + void constructor_copy_data() + { + addTestData_info(); + } + + void constructor_move() + { + QFETCH(QGeoPositionInfo, info); + QGeoPositionInfo infoCopy = info; + QCOMPARE(QGeoPositionInfo(std::move(info)), infoCopy); + // The moved-from object will go out of scope and will be destroyed + // here, so we also implicitly check that moved-from object's destructor + // is called without any issues. + } + + void constructor_move_data() + { + addTestData_info(); + } + + void operator_assign() + { + QFETCH(QGeoPositionInfo, info); + + QGeoPositionInfo info2; + info2 = info; + QCOMPARE(info2, info); + } + + void operator_assign_data() + { + addTestData_info(); + } + + void operator_move_assign() + { + QFETCH(QGeoPositionInfo, info); + QGeoPositionInfo infoCopy = info; + + QGeoPositionInfo obj; + obj = std::move(info); + QCOMPARE(obj, infoCopy); + + // check that (move)assigning to the moved-from object is ok + info = std::move(infoCopy); + QCOMPARE(info, obj); + } + + void operator_move_assign_data() + { + addTestData_info(); + } + + void operator_equals() + { + QFETCH(QGeoPositionInfo, info); + + QVERIFY(info == info); + if (info.isValid()) + QCOMPARE(info == QGeoPositionInfo(), false); + } + + void operator_equals_data() + { + addTestData_info(); + } + + void operator_notEquals() + { + QFETCH(QGeoPositionInfo, info); + + QCOMPARE(info != info, false); + if (info.isValid()) + QCOMPARE(info != QGeoPositionInfo(), true); + } + + void operator_notEquals_data() + { + addTestData_info(); + } + + void setDateTime() + { + QFETCH(QDateTime, dateTime); + + QGeoPositionInfo info; + info.setTimestamp(dateTime); + QCOMPARE(info.timestamp(), dateTime); + } + + void setDateTime_data() + { + QTest::addColumn("dateTime"); + QTest::newRow("invalid") << QDateTime(); + QTest::newRow("now") << QDateTime::currentDateTime(); + } + + void dateTime() + { + QGeoPositionInfo info; + QVERIFY(info.timestamp().isNull()); + } + + void setCoordinate() + { + + QFETCH(QGeoCoordinate, coord); + + QGeoPositionInfo info; + info.setCoordinate(coord); + QCOMPARE(info.coordinate(), coord); + } + + void setCoordinate_data() + { + QTest::addColumn("coord"); + + QTest::newRow("invalid") << QGeoCoordinate(); + QTest::newRow("valid") << QGeoCoordinate(30,30); + } + + void attribute() + { + QFETCH(QGeoPositionInfo::Attribute, attribute); + QFETCH(qreal, value); + + QGeoPositionInfo info; + QVERIFY(qIsNaN(info.attribute(attribute))); + + info.setAttribute(attribute, value); + QCOMPARE(info.attribute(attribute), value); + + info.removeAttribute(attribute); + QVERIFY(qIsNaN(info.attribute(attribute))); + } + + void attribute_data() + { + QTest::addColumn("attribute"); + QTest::addColumn("value"); + + QList attributes = tst_qgeopositioninfo_getAttributes(); + QList values = tst_qgeopositioninfo_qrealTestValues(); + for (int i=0; i> inInfo; + QCOMPARE(inInfo, info); + } + + void datastream_data() + { + addTestData_info(); + } + + void debug() + { + QFETCH(QGeoPositionInfo, info); + QFETCH(int, nextValue); + QFETCH(QByteArray, debugStringEnd); + + qInstallMessageHandler(tst_qgeopositioninfo_messageHandler); + qDebug() << info << nextValue; + qInstallMessageHandler(0); + + // use endsWith() so we don't depend on QDateTime's debug() implementation + QVERIFY2(tst_qgeopositioninfo_debug.endsWith(debugStringEnd), + qPrintable(QString::fromLatin1("'%1' does not end with '%2'"). + arg(QLatin1String(tst_qgeopositioninfo_debug), + QLatin1String(debugStringEnd)))); + } + + void debug_data() + { + QTest::addColumn("info"); + QTest::addColumn("nextValue"); + QTest::addColumn("debugStringEnd"); + + QTest::newRow("no values") << QGeoPositionInfo() << 40 + << QString("QGeoCoordinate(?, ?)) 40").toLatin1(); + + QGeoCoordinate coord(1, 1); + QTest::newRow("coord, time") << QGeoPositionInfo(coord, QDateTime::currentDateTime()) + << 40 << QByteArray("QGeoCoordinate(1, 1)) 40"); + + QGeoPositionInfo info; + info.setAttribute(QGeoPositionInfo::Direction, 1.1); + info.setAttribute(QGeoPositionInfo::GroundSpeed, 2.1); + info.setAttribute(QGeoPositionInfo::VerticalSpeed, 3.1); + info.setAttribute(QGeoPositionInfo::MagneticVariation, 4.1); + info.setAttribute(QGeoPositionInfo::HorizontalAccuracy, 5.1); + info.setAttribute(QGeoPositionInfo::VerticalAccuracy, 6.1); + QTest::newRow("all attributes") << info << 40 + << QByteArray("QGeoCoordinate(?, ?), Direction=1.1, GroundSpeed=2.1, VerticalSpeed=3.1, MagneticVariation=4.1, HorizontalAccuracy=5.1, VerticalAccuracy=6.1) 40"); + } +}; + + +QTEST_APPLESS_MAIN(tst_QGeoPositionInfo) +#include "tst_qgeopositioninfo.moc" diff --git a/tests/auto/qgeopositioninfosource/CMakeLists.txt b/tests/auto/qgeopositioninfosource/CMakeLists.txt new file mode 100644 index 0000000..15fca1b --- /dev/null +++ b/tests/auto/qgeopositioninfosource/CMakeLists.txt @@ -0,0 +1,30 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeopositioninfosource.pro. + +##################################################################### +## tst_qgeopositioninfosource Test: +##################################################################### + +qt_internal_add_test(tst_qgeopositioninfosource + SOURCES + ../utils/qlocationtestutils.cpp ../utils/qlocationtestutils_p.h + testqgeopositioninfosource.cpp testqgeopositioninfosource_p.h + tst_qgeopositioninfosource.cpp + LIBRARIES + Qt::Core + Qt::Positioning + Qt::TestPrivate +) + +add_dependencies(tst_qgeopositioninfosource QGeoPositionInfoSourceFactoryTestPlugin) +if(ANDROID) + set_target_properties(tst_qgeopositioninfosource PROPERTIES + QT_ANDROID_EXTRA_PLUGINS "$" + ) +endif() + +#### Keys ignored in scope 1:.:.:qgeopositioninfosource.pro:: +# TEMPLATE = "app" +# testcase.timeout = "400" diff --git a/tests/auto/qgeopositioninfosource/testqgeopositioninfosource.cpp b/tests/auto/qgeopositioninfosource/testqgeopositioninfosource.cpp new file mode 100644 index 0000000..be9e48a --- /dev/null +++ b/tests/auto/qgeopositioninfosource/testqgeopositioninfosource.cpp @@ -0,0 +1,790 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include "testqgeopositioninfosource_p.h" +#include "../utils/qlocationtestutils_p.h" + +Q_DECLARE_METATYPE(QGeoPositionInfoSource::PositioningMethod) +Q_DECLARE_METATYPE(QGeoPositionInfoSource::PositioningMethods) + +#define MAX_WAITING_TIME 50000 + +// Must provide a valid source, unless testing the source +// returned by QGeoPositionInfoSource::createDefaultSource() on a system +// that has no default source +#define CHECK_SOURCE_VALID { \ + if (!m_source) { \ + if (m_testingDefaultSource && QGeoPositionInfoSource::createDefaultSource(0) == 0) \ + QSKIP("No default position source on this system"); \ + else \ + QFAIL("createTestSource() must return a valid source!"); \ + } \ + } + +class MyPositionSource : public QGeoPositionInfoSource +{ + Q_OBJECT +public: + MyPositionSource(QObject *parent = 0) + : QGeoPositionInfoSource(parent) { + } + + QGeoPositionInfo lastKnownPosition(bool /*fromSatellitePositioningMethodsOnly = false*/) const override { + return QGeoPositionInfo(); + } + + void setSupportedPositioningMethods(PositioningMethods methods) { + m_methods = methods; + } + + virtual PositioningMethods supportedPositioningMethods() const override { + return m_methods; + } + virtual int minimumUpdateInterval() const override { + return 0; + } + + virtual void startUpdates() override {} + virtual void stopUpdates() override {} + + virtual void requestUpdate(int) override {} + + Error error() const override { return QGeoPositionInfoSource::NoError; } + +private: + PositioningMethods m_methods; +}; + +class DefaultSourceTest : public TestQGeoPositionInfoSource +{ + Q_OBJECT +protected: + QGeoPositionInfoSource *createTestSource() override { + return QGeoPositionInfoSource::createSource(QStringLiteral("test.source"), 0); + } +}; + + +TestQGeoPositionInfoSource::TestQGeoPositionInfoSource(QObject *parent) + : QObject(parent) +{ + m_testingDefaultSource = false; +#if QT_CONFIG(library) + /* + * Set custom path since CI doesn't install test plugins + */ +#ifdef Q_OS_WIN + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../../plugins")); +#else + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../plugins")); +#endif +#endif +} + +TestQGeoPositionInfoSource *TestQGeoPositionInfoSource::createDefaultSourceTest() +{ + DefaultSourceTest *test = new DefaultSourceTest; + test->m_testingDefaultSource = true; + return test; +} + +void TestQGeoPositionInfoSource::test_slot1() +{ +} + +void TestQGeoPositionInfoSource::test_slot2() +{ + m_testSlot2Called = true; +} + +void TestQGeoPositionInfoSource::base_initTestCase() +{ + +} + +void TestQGeoPositionInfoSource::base_init() +{ + m_source = createTestSource(); + m_testSlot2Called = false; +} + +void TestQGeoPositionInfoSource::base_cleanup() +{ + delete m_source; + m_source = 0; +} + +void TestQGeoPositionInfoSource::base_cleanupTestCase() +{ +} + +void TestQGeoPositionInfoSource::initTestCase() +{ + base_initTestCase(); +} + +void TestQGeoPositionInfoSource::init() +{ + base_init(); +} + +void TestQGeoPositionInfoSource::cleanup() +{ + base_cleanup(); +} + +void TestQGeoPositionInfoSource::cleanupTestCase() +{ + base_cleanupTestCase(); +} + +// TC_ID_3_x_1 +void TestQGeoPositionInfoSource::constructor_withParent() +{ + auto parent = std::make_unique(); + new MyPositionSource(parent.get()); +} + +// TC_ID_3_x_2 +void TestQGeoPositionInfoSource::constructor_noParent() +{ + MyPositionSource *obj = new MyPositionSource(); + delete obj; +} + +void TestQGeoPositionInfoSource::updateInterval() +{ + MyPositionSource s; + QCOMPARE(s.updateInterval(), 0); +} + +void TestQGeoPositionInfoSource::setPreferredPositioningMethods() +{ + QFETCH(QGeoPositionInfoSource::PositioningMethod, supported); + QFETCH(QGeoPositionInfoSource::PositioningMethod, preferred); + QFETCH(QGeoPositionInfoSource::PositioningMethod, resulting); + + MyPositionSource s; + s.setSupportedPositioningMethods(supported); + s.setPreferredPositioningMethods(preferred); + QCOMPARE(s.preferredPositioningMethods(), resulting); +} + +void TestQGeoPositionInfoSource::setPreferredPositioningMethods_data() +{ + QTest::addColumn("supported"); + QTest::addColumn("preferred"); + QTest::addColumn("resulting"); + + QTest::newRow("Sat supported, Sat preferred") + << QGeoPositionInfoSource::SatellitePositioningMethods + << QGeoPositionInfoSource::SatellitePositioningMethods + << QGeoPositionInfoSource::SatellitePositioningMethods; + QTest::newRow("Sat supported, Non-Sat preferred") + << QGeoPositionInfoSource::SatellitePositioningMethods + << QGeoPositionInfoSource::NonSatellitePositioningMethods + << QGeoPositionInfoSource::SatellitePositioningMethods; + QTest::newRow("Sat supported, All preferred") + << QGeoPositionInfoSource::SatellitePositioningMethods + << QGeoPositionInfoSource::AllPositioningMethods + << QGeoPositionInfoSource::SatellitePositioningMethods; + + QTest::newRow("Non-Sat supported, Sat preferred") + << QGeoPositionInfoSource::NonSatellitePositioningMethods + << QGeoPositionInfoSource::SatellitePositioningMethods + << QGeoPositionInfoSource::NonSatellitePositioningMethods; + QTest::newRow("Non-Sat supported, Non-Sat preferred") + << QGeoPositionInfoSource::NonSatellitePositioningMethods + << QGeoPositionInfoSource::NonSatellitePositioningMethods + << QGeoPositionInfoSource::NonSatellitePositioningMethods; + QTest::newRow("Non-Sat supported, All preferred") + << QGeoPositionInfoSource::NonSatellitePositioningMethods + << QGeoPositionInfoSource::AllPositioningMethods + << QGeoPositionInfoSource::NonSatellitePositioningMethods; + + QTest::newRow("All supported, Sat preferred") + << QGeoPositionInfoSource::AllPositioningMethods + << QGeoPositionInfoSource::SatellitePositioningMethods + << QGeoPositionInfoSource::SatellitePositioningMethods; + QTest::newRow("All supported, Non-Sat preferred") + << QGeoPositionInfoSource::AllPositioningMethods + << QGeoPositionInfoSource::NonSatellitePositioningMethods + << QGeoPositionInfoSource::NonSatellitePositioningMethods; + QTest::newRow("All supported, All preferred") + << QGeoPositionInfoSource::AllPositioningMethods + << QGeoPositionInfoSource::AllPositioningMethods + << QGeoPositionInfoSource::AllPositioningMethods; +} + +void TestQGeoPositionInfoSource::preferredPositioningMethods() +{ + MyPositionSource s; + QCOMPARE(s.preferredPositioningMethods(), 0); +} + +//TC_ID_3_x_1 : Create a position source with the given parent that reads from the system's default +// sources of location data +void TestQGeoPositionInfoSource::createDefaultSource() +{ + auto parent = std::make_unique(); + + // source will be deleted when parent goes out of scope + QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(parent.get()); + // now all platforms have the dummy plugin at least + QVERIFY(source != nullptr); +} + +void TestQGeoPositionInfoSource::setUpdateInterval() +{ + CHECK_SOURCE_VALID; + + QFETCH(int, interval); + QFETCH(int, expectedInterval); + + m_source->setUpdateInterval(interval); + QCOMPARE(m_source->updateInterval(), expectedInterval); +} + +void TestQGeoPositionInfoSource::setUpdateInterval_data() +{ + QTest::addColumn("interval"); + QTest::addColumn("expectedInterval"); + QGeoPositionInfoSource *source = createTestSource(); + int minUpdateInterval = source ? source->minimumUpdateInterval() : -1; + if (source) + delete source; + + QTest::newRow("0") << 0 << 0; + + if (minUpdateInterval > -1) { + QTest::newRow("INT_MIN") << INT_MIN << minUpdateInterval; + QTest::newRow("-1") << -1 << minUpdateInterval; + } + + if (minUpdateInterval > 0) { + QTest::newRow("more than minInterval") << minUpdateInterval + 1 << minUpdateInterval + 1; + QTest::newRow("equal to minInterval") << minUpdateInterval << minUpdateInterval; + } + + if (minUpdateInterval > 1) { + QTest::newRow("less then minInterval") << minUpdateInterval - 1 << minUpdateInterval; + QTest::newRow("in btw zero and minInterval") << 1 << minUpdateInterval; + } +} + +void TestQGeoPositionInfoSource::lastKnownPosition() +{ + CHECK_SOURCE_VALID; + QFETCH(QGeoPositionInfoSource::PositioningMethod, positioningMethod); + QFETCH(bool, lastKnownPositionArgument); + + if ((m_source->supportedPositioningMethods() & positioningMethod) == 0) + QSKIP("Not a supported positioning method for this position source"); + + m_source->setPreferredPositioningMethods(positioningMethod); + + QSignalSpy spy(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy timeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + m_source->setUpdateInterval(1000); + m_source->startUpdates(); + + // Use QEventLoop instead of qWait() to ensure we stop as soon as a + // position is emitted (otherwise the lastKnownPosition() may have + // changed by the time it is checked) + QEventLoop loop; + QTimer timer; + //simulated CI tests will quickly return -> real GPS tests take 2 minutes for satellite systems + //use a 5 min timeout + timer.setInterval(300000); + connect(m_source, SIGNAL(positionUpdated(QGeoPositionInfo)), + &loop, SLOT(quit())); + connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); + timer.start(); + loop.exec(); + + QVERIFY((spy.size() > 0) && (timeout.size() == 0)); + + QList list = spy.takeFirst(); + QGeoPositionInfo info = list.at(0).value(); + QGeoPositionInfo lastPositioninfo = m_source->lastKnownPosition(lastKnownPositionArgument); + + // lastPositioninfo is only gauranteed to be valid in all cases when only using satelite + // positioning methods or when lastKnownPositionArgument is false + if (!lastKnownPositionArgument || + positioningMethod == QGeoPositionInfoSource::SatellitePositioningMethods) { + QVERIFY(lastPositioninfo.isValid()); + } + + if (lastPositioninfo.isValid()) { + QCOMPARE(info.coordinate(), lastPositioninfo.coordinate()); + // On some CI machines the above evenloop code is not sufficient as positionUpdated + // still fires causing last know position and last update to be out of sync. + // To accommodate we check that the time stamps are no more than 1s apart + // ideally they should be the same + // doesn't work: QCOMPARE(info.timestamp(), lastPositioninfo.timestamp()); + const qint64 diff = qAbs(info.timestamp().msecsTo(lastPositioninfo.timestamp())); + QCOMPARE(diff < 1000, true); + + QCOMPARE(info.hasAttribute(QGeoPositionInfo::HorizontalAccuracy), + lastPositioninfo.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)); + + if (info.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) { + bool isNaN1 = qIsNaN(info.attribute(QGeoPositionInfo::HorizontalAccuracy)); + bool isNaN2 = qIsNaN(lastPositioninfo.attribute(QGeoPositionInfo::HorizontalAccuracy)); + QCOMPARE(isNaN1, isNaN2); + if (!isNaN1) { + QCOMPARE(qFuzzyCompare(info.attribute(QGeoPositionInfo::HorizontalAccuracy), + lastPositioninfo.attribute(QGeoPositionInfo::HorizontalAccuracy)), true); + } + } + + QCOMPARE(info.hasAttribute(QGeoPositionInfo::VerticalAccuracy), + lastPositioninfo.hasAttribute(QGeoPositionInfo::VerticalAccuracy)); + + if (info.hasAttribute(QGeoPositionInfo::VerticalAccuracy)) { + bool isNaN1 = qIsNaN(info.attribute(QGeoPositionInfo::VerticalAccuracy)); + bool isNaN2 = qIsNaN(lastPositioninfo.attribute(QGeoPositionInfo::VerticalAccuracy)); + QCOMPARE(isNaN1, isNaN2); + if (!isNaN1) { + QCOMPARE(qFuzzyCompare(info.attribute(QGeoPositionInfo::VerticalAccuracy), + lastPositioninfo.attribute(QGeoPositionInfo::VerticalAccuracy)), true); + } + } + } + + m_source->stopUpdates(); +} + +void TestQGeoPositionInfoSource::lastKnownPosition_data() +{ + QTest::addColumn("positioningMethod"); + QTest::addColumn("lastKnownPositionArgument"); + + // no good way to determine on MeeGo what are supported. If we ask for all or non-satellites, we + // typically get geoclue-example provider, which is not suitable for this test. + QTest::newRow("all - false") << QGeoPositionInfoSource::AllPositioningMethods << false; + QTest::newRow("all - true") << QGeoPositionInfoSource::AllPositioningMethods << true; + QTest::newRow("satellite - false") << QGeoPositionInfoSource::SatellitePositioningMethods << false; + QTest::newRow("satellite - true") << QGeoPositionInfoSource::SatellitePositioningMethods << true; +} + +void TestQGeoPositionInfoSource::minimumUpdateInterval() +{ + CHECK_SOURCE_VALID; + + QVERIFY(m_source->minimumUpdateInterval() > 0); +} + +//TC_ID_3_x_1 +void TestQGeoPositionInfoSource::startUpdates_testIntervals() +{ + CHECK_SOURCE_VALID; + QSignalSpy spy(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy timeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + m_source->setUpdateInterval(1000); + const int interval = 15000; + + m_source->startUpdates(); + + QTRY_COMPARE_WITH_TIMEOUT(spy.size(), 1, interval); + for (int i = 0; i < 6; i++) { + QTRY_VERIFY_WITH_TIMEOUT((spy.size() == 1) && (timeout.size() == 0), interval); + spy.clear(); + } + + m_source->stopUpdates(); +} + + +void TestQGeoPositionInfoSource::startUpdates_testIntervalChangesWhileRunning() +{ + // There are two ways of dealing with an interval change, and we have left it system dependent. + // The interval can be changed will running or after the next update. + // WinCE uses the first method, S60 uses the second method. + + CHECK_SOURCE_VALID; + + QSignalSpy spy(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy timeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + m_source->setUpdateInterval(0); + m_source->startUpdates(); + m_source->setUpdateInterval(0); + + QTRY_VERIFY_WITH_TIMEOUT(spy.size() > 0, 3000); + QCOMPARE(timeout.size(), 0); + spy.clear(); + + m_source->setUpdateInterval(1000); + + QTRY_VERIFY_WITH_TIMEOUT((spy.size() == 2) && (timeout.size() == 0), 15000); + spy.clear(); + + m_source->setUpdateInterval(2000); + + QTRY_VERIFY_WITH_TIMEOUT((spy.size() == 2) && (timeout.size() == 0), 30000); + spy.clear(); + + m_source->setUpdateInterval(1000); + + QTRY_VERIFY_WITH_TIMEOUT((spy.size() == 2) && (timeout.size() == 0), 15000); + spy.clear(); + + m_source->setUpdateInterval(1000); + + QTRY_VERIFY_WITH_TIMEOUT((spy.size() == 2) && (timeout.size() == 0), 15000); + spy.clear(); + + m_source->setUpdateInterval(0); + + QTRY_VERIFY_WITH_TIMEOUT((spy.size() > 0) && (timeout.size() == 0), 7000); + spy.clear(); + + m_source->setUpdateInterval(0); + + QTRY_VERIFY_WITH_TIMEOUT((spy.size() > 0) && (timeout.size() == 0), 7000); + spy.clear(); + + m_source->stopUpdates(); +} + +//TC_ID_3_x_2 +void TestQGeoPositionInfoSource::startUpdates_testDefaultInterval() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spy(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy timeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + m_source->startUpdates(); + for (int i = 0; i < 3; i++) { + + QTRY_VERIFY_WITH_TIMEOUT((spy.size() > 0) && (timeout.size() == 0), 7000); + spy.clear(); + } + m_source->stopUpdates(); +} + +//TC_ID_3_x_3 +void TestQGeoPositionInfoSource::startUpdates_testZeroInterval() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spy(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy timeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + m_source->setUpdateInterval(0); + m_source->startUpdates(); + for (int i = 0; i < 3; i++) { + QTRY_VERIFY_WITH_TIMEOUT((spy.size() > 0) && (timeout.size() == 0), 7000); + spy.clear(); + } + m_source->stopUpdates(); +} + +void TestQGeoPositionInfoSource::startUpdates_moreThanOnce() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spy(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy timeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + m_source->setUpdateInterval(0); + m_source->startUpdates(); + + m_source->startUpdates(); // check there is no crash + + QTRY_VERIFY_WITH_TIMEOUT((spy.size() > 0) && (timeout.size() == 0), 7000); + + m_source->startUpdates(); // check there is no crash + + m_source->stopUpdates(); +} + +//TC_ID_3_x_1 +void TestQGeoPositionInfoSource::stopUpdates() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spy(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy timeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + m_source->setUpdateInterval(1000); + m_source->startUpdates(); + for (int i = 0; i < 2; i++) { + QTRY_VERIFY_WITH_TIMEOUT((spy.size() > 0) && (timeout.size() == 0), 9500); + spy.clear(); + } + m_source->stopUpdates(); + QTest::qWait(2000); + QCOMPARE(spy.size(), 0); + spy.clear(); + + m_source->setUpdateInterval(0); + m_source->startUpdates(); + m_source->stopUpdates(); + QTRY_COMPARE_WITH_TIMEOUT(spy.size(), 0, 9500); +} + +//TC_ID_3_x_2 +void TestQGeoPositionInfoSource::stopUpdates_withoutStart() +{ + CHECK_SOURCE_VALID; + m_source->stopUpdates(); // check there is no crash +} + +void TestQGeoPositionInfoSource::requestUpdate() +{ + CHECK_SOURCE_VALID; + QFETCH(int, timeout); + QSignalSpy spy(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + m_source->requestUpdate(timeout); + QTRY_COMPARE(spy.size(), 1); + const QList arguments = spy.takeFirst(); + const auto error = arguments.at(0).value(); + QCOMPARE(error, QGeoPositionInfoSource::UpdateTimeoutError); +} + +void TestQGeoPositionInfoSource::requestUpdate_data() +{ + QTest::addColumn("timeout"); + QTest::newRow("less than zero") << -1; //TC_ID_3_x_7 +} + +// TC_ID_3_x_1 : Create position source and call requestUpdate with valid timeout value +void TestQGeoPositionInfoSource::requestUpdate_validTimeout() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyUpdate(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy spyTimeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + + // currently all the sources have a minimumUpdateInterval <= 1000 + m_source->requestUpdate(1500); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() > 0) && (spyTimeout.size() == 0), 7000); +} + +void TestQGeoPositionInfoSource::requestUpdate_defaultTimeout() +{ + CHECK_SOURCE_VALID; + QSignalSpy spyUpdate(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy spyTimeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + + m_source->requestUpdate(0); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() > 0) && (spyTimeout.size() == 0), 7000); +} + +// TC_ID_3_x_2 : Create position source and call requestUpdate with a timeout less than +// minimumupdateInterval +void TestQGeoPositionInfoSource::requestUpdate_timeoutLessThanMinimumInterval() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyTimeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + m_source->requestUpdate(1); + + QTRY_COMPARE_WITH_TIMEOUT(spyTimeout.size(), 1, 1000); + const QList arguments = spyTimeout.takeFirst(); + const auto error = arguments.at(0).value(); + QCOMPARE(error, QGeoPositionInfoSource::UpdateTimeoutError); +} + +// TC_ID_3_x_3 : Call requestUpdate() with same value repeatedly +void TestQGeoPositionInfoSource::requestUpdate_repeatedCalls() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyUpdate(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy spyTimeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + + // currently all the sources have a minimumUpdateInterval <= 1000 + m_source->requestUpdate(1500); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() > 0) && (spyTimeout.size() == 0), 7000); + spyUpdate.clear(); + m_source->requestUpdate(1500); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() > 0) && (spyTimeout.size() == 0), 7000); +} + +void TestQGeoPositionInfoSource::requestUpdate_overlappingCalls() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyUpdate(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy spyTimeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + + // currently all the sources have a minimumUpdateInterval <= 1000 + m_source->requestUpdate(1500); + m_source->requestUpdate(1500); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() > 0) && (spyTimeout.size() == 0), 7000); +} + +//TC_ID_3_x_4 +void TestQGeoPositionInfoSource::requestUpdateAfterStartUpdates_ZeroInterval() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyUpdate(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy spyTimeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + + m_source->setUpdateInterval(0); + m_source->startUpdates(); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() > 0) && (spyTimeout.size() == 0), 7000); + spyUpdate.clear(); + + m_source->requestUpdate(1500); + QTest::qWait(7000); + + QVERIFY((spyUpdate.size() > 0) && (spyTimeout.size() == 0)); + spyUpdate.clear(); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() > 0) && (spyTimeout.size() == 0), MAX_WAITING_TIME); + + m_source->stopUpdates(); +} + +void TestQGeoPositionInfoSource::requestUpdateAfterStartUpdates_SmallInterval() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyUpdate(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy spyTimeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + + m_source->setUpdateInterval(2000); + m_source->startUpdates(); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() == 1) && (spyTimeout.size() == 0), 20000); + spyUpdate.clear(); + + m_source->requestUpdate(1500); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() == 1) && (spyTimeout.size() == 0), 7000); + spyUpdate.clear(); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() == 1) && (spyTimeout.size() == 0), 20000); + + m_source->stopUpdates(); +} + +void TestQGeoPositionInfoSource::requestUpdateBeforeStartUpdates_ZeroInterval() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyUpdate(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy spyTimeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + + m_source->requestUpdate(1500); + + m_source->setUpdateInterval(0); + m_source->startUpdates(); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() >= 2) && (spyTimeout.size() == 0), 14000); + spyUpdate.clear(); + + QTest::qWait(1500); + + QCOMPARE(spyTimeout.size(), 0); + + m_source->stopUpdates(); +} + +void TestQGeoPositionInfoSource::requestUpdateBeforeStartUpdates_SmallInterval() +{ + CHECK_SOURCE_VALID; + QSignalSpy spyUpdate(m_source, SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy spyTimeout(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + + m_source->requestUpdate(1500); + + m_source->setUpdateInterval(3000); + m_source->startUpdates(); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() > 0) && (spyTimeout.size() == 0), 7000); + spyUpdate.clear(); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() > 0) && (spyTimeout.size() == 0), 20000); + + m_source->stopUpdates(); +} + +void TestQGeoPositionInfoSource::removeSlotForRequestTimeout() +{ + CHECK_SOURCE_VALID; + + bool i = connect(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error)), + this, SLOT(test_slot1())); + QVERIFY(i == true); + i = connect(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error)), + this, SLOT(test_slot2())); + QVERIFY(i == true); + i = disconnect(m_source, SIGNAL(errorOccurred(QGeoPositionInfoSource::Error)), + this, SLOT(test_slot1())); + QVERIFY(i == true); + + m_source->requestUpdate(-1); + QTRY_VERIFY_WITH_TIMEOUT((m_testSlot2Called == true), 1000); +} + +void TestQGeoPositionInfoSource::removeSlotForPositionUpdated() +{ + CHECK_SOURCE_VALID; + + bool i = connect(m_source, SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(test_slot1())); + QVERIFY(i == true); + i = connect(m_source, SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(test_slot2())); + QVERIFY(i == true); + i = disconnect(m_source, SIGNAL(positionUpdated(QGeoPositionInfo)), this, SLOT(test_slot1())); + QVERIFY(i == true); + + m_source->requestUpdate(1500); + + QTRY_VERIFY_WITH_TIMEOUT((m_testSlot2Called == true), 7000); +} + +void TestQGeoPositionInfoSource::updateIntervalBinding() +{ + auto parent = std::make_unique(); + // source will be deleted when parent goes out of scope + QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(parent.get()); + QVERIFY(source != nullptr); + + QTestPrivate::testReadWritePropertyBasics( + *source, 1000, 2000, "updateInterval", + []() { + return std::unique_ptr( + QGeoPositionInfoSource::createDefaultSource(nullptr)); + }); +} + +void TestQGeoPositionInfoSource::preferredMethodsBinding() +{ + auto parent = std::make_unique(); + // source will be deleted when parent goes out of scope + QGeoPositionInfoSource *source = + QGeoPositionInfoSource::createSource("test.source", parent.get()); + QVERIFY(source != nullptr); + + QTestPrivate::testReadWritePropertyBasics( + *source, QGeoPositionInfoSource::SatellitePositioningMethods, + QGeoPositionInfoSource::AllPositioningMethods, "preferredPositioningMethods", + []() { + return std::unique_ptr( + QGeoPositionInfoSource::createSource("test.source", nullptr)); + }); +} + +#include "testqgeopositioninfosource.moc" diff --git a/tests/auto/qgeopositioninfosource/testqgeopositioninfosource_p.h b/tests/auto/qgeopositioninfosource/testqgeopositioninfosource_p.h new file mode 100644 index 0000000..34eca5d --- /dev/null +++ b/tests/auto/qgeopositioninfosource/testqgeopositioninfosource_p.h @@ -0,0 +1,104 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef TESTQGEOPOSITIONINFOSOURCE_P_H +#define TESTQGEOPOSITIONINFOSOURCE_P_H + +#ifdef TST_GEOCLUEMOCK_ENABLED +#include "geocluemock.h" +#include +#endif + +#include +#include +#include + +QT_BEGIN_NAMESPACE +class QGeoPositionInfoSource; +QT_END_NAMESPACE + +class TestQGeoPositionInfoSource : public QObject +{ + Q_OBJECT + +public: + TestQGeoPositionInfoSource(QObject *parent = 0); + + static TestQGeoPositionInfoSource *createDefaultSourceTest(); + +public slots: + void test_slot1(); + void test_slot2(); + +protected: + virtual QGeoPositionInfoSource *createTestSource() = 0; + + // MUST be called by subclasses if they override respective test slots + void base_initTestCase(); + void base_init(); + void base_cleanup(); + void base_cleanupTestCase(); + +private slots: + void initTestCase(); + void init(); + void cleanup(); + void cleanupTestCase(); + + void constructor_withParent(); + + void constructor_noParent(); + + void updateInterval(); + + void setPreferredPositioningMethods(); + void setPreferredPositioningMethods_data(); + + void preferredPositioningMethods(); + + void createDefaultSource(); + + void setUpdateInterval(); + void setUpdateInterval_data(); + + void lastKnownPosition(); + void lastKnownPosition_data(); + + void minimumUpdateInterval(); + + void startUpdates_testIntervals(); + void startUpdates_testIntervalChangesWhileRunning(); + void startUpdates_testDefaultInterval(); + void startUpdates_testZeroInterval(); + void startUpdates_moreThanOnce(); + + void stopUpdates(); + void stopUpdates_withoutStart(); + + void requestUpdate(); + void requestUpdate_data(); + + void requestUpdate_validTimeout(); + void requestUpdate_defaultTimeout(); + void requestUpdate_timeoutLessThanMinimumInterval(); + void requestUpdate_repeatedCalls(); + void requestUpdate_overlappingCalls(); + + void requestUpdateAfterStartUpdates_ZeroInterval(); + void requestUpdateAfterStartUpdates_SmallInterval(); + void requestUpdateBeforeStartUpdates_ZeroInterval(); + void requestUpdateBeforeStartUpdates_SmallInterval(); + + void removeSlotForRequestTimeout(); + void removeSlotForPositionUpdated(); + + void updateIntervalBinding(); + void preferredMethodsBinding(); + +private: + QGeoPositionInfoSource *m_source; + bool m_testingDefaultSource; + bool m_testSlot2Called; +}; + +#endif diff --git a/tests/auto/qgeopositioninfosource/tst_qgeopositioninfosource.cpp b/tests/auto/qgeopositioninfosource/tst_qgeopositioninfosource.cpp new file mode 100644 index 0000000..c952d0f --- /dev/null +++ b/tests/auto/qgeopositioninfosource/tst_qgeopositioninfosource.cpp @@ -0,0 +1,12 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include "testqgeopositioninfosource_p.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + std::unique_ptr test( + TestQGeoPositionInfoSource::createDefaultSourceTest()); + return QTest::qExec(test.get(), argc, argv); +} diff --git a/tests/auto/qgeorectangle/CMakeLists.txt b/tests/auto/qgeorectangle/CMakeLists.txt new file mode 100644 index 0000000..51cac34 --- /dev/null +++ b/tests/auto/qgeorectangle/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeorectangle.pro. + +##################################################################### +## tst_qgeorectangle Test: +##################################################################### + +qt_internal_add_test(tst_qgeorectangle + SOURCES + tst_qgeorectangle.cpp + LIBRARIES + Qt::Core + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:qgeorectangle.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/qgeorectangle/tst_qgeorectangle.cpp b/tests/auto/qgeorectangle/tst_qgeorectangle.cpp new file mode 100644 index 0000000..c4bd05d --- /dev/null +++ b/tests/auto/qgeorectangle/tst_qgeorectangle.cpp @@ -0,0 +1,2394 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +//TESTED_COMPONENT=src/location + +#include +#include +#include +#include + +QT_USE_NAMESPACE + +class tst_QGeoRectangle : public QObject +{ + Q_OBJECT + +private slots: + void default_constructor(); + void center_constructor(); + void corner_constructor(); + void list_constructor(); + void copy_constructor(); + void assignment(); + void destructor(); + + void equality(); + void equality_data(); + + void isValid(); + void isValid_data(); + + void isEmpty(); + void isEmpty_data(); + + void corners(); + void corners_data(); + + void setCorners(); + + void width(); + void width_data(); + + void height(); + void height_data(); + + void center(); + void center_data(); + + void boundingGeoRectangle(); + void boundingGeoRectangle_data(); + + void containsCoord(); + void containsCoord_data(); + + void containsBoxAndIntersects(); + void containsBoxAndIntersects_data(); + + void translate(); + void translate_data(); + + void unite(); + void unite_data(); + + void extendRectangle(); + void extendRectangle_data(); + + void areaComparison(); + void areaComparison_data(); + + void circleComparison(); + void circleComparison_data(); + + void hashing(); +}; + +void tst_QGeoRectangle::default_constructor() +{ + QGeoRectangle box; + QCOMPARE(box.topLeft().isValid(), false); + QCOMPARE(box.bottomRight().isValid(), false); +} + +void tst_QGeoRectangle::center_constructor() +{ + QGeoRectangle b1 = QGeoRectangle(QGeoCoordinate(5.0, 5.0), 10.0, 10.0); + + QCOMPARE(b1.topLeft(), QGeoCoordinate(10.0, 0.0)); + QCOMPARE(b1.bottomRight(), QGeoCoordinate(0.0, 10.0)); +} + +void tst_QGeoRectangle::corner_constructor() +{ + QGeoRectangle b1 = QGeoRectangle(QGeoCoordinate(10.0, 0.0), + QGeoCoordinate(0.0, 10.0)); + + QCOMPARE(b1.topLeft(), QGeoCoordinate(10.0, 0.0)); + QCOMPARE(b1.bottomRight(), QGeoCoordinate(0.0, 10.0)); +} + +void tst_QGeoRectangle::list_constructor() +{ + QList coordinates; + QGeoRectangle b1 = QGeoRectangle(coordinates); + QCOMPARE(b1.isValid(), false); + + coordinates << QGeoCoordinate(10.0, 0.0); + b1 = QGeoRectangle(coordinates); + QCOMPARE(b1.isValid(), true); + QCOMPARE(b1.isEmpty(), true); + + coordinates << QGeoCoordinate(0.0, 10.0) << QGeoCoordinate(0.0, 5.0); + b1 = QGeoRectangle(coordinates); + QCOMPARE(b1.topLeft(), QGeoCoordinate(10.0,0.0)); + QCOMPARE(b1.bottomRight(), QGeoCoordinate(0.0, 10.0)); +} + +void tst_QGeoRectangle::copy_constructor() +{ + QGeoRectangle b1 = QGeoRectangle(QGeoCoordinate(10.0, 0.0), + QGeoCoordinate(0.0, 10.0)); + QGeoRectangle b2 = QGeoRectangle(b1); + + QCOMPARE(b2.topLeft(), QGeoCoordinate(10.0, 0.0)); + QCOMPARE(b2.bottomRight(), QGeoCoordinate(0.0, 10.0)); + + b2.setTopLeft(QGeoCoordinate(30.0, 0.0)); + b2.setBottomRight(QGeoCoordinate(0.0, 30.0)); + QCOMPARE(b1.topLeft(), QGeoCoordinate(10.0, 0.0)); + QCOMPARE(b1.bottomRight(), QGeoCoordinate(0.0, 10.0)); + + QGeoShape area; + QGeoRectangle areaBox(area); + QVERIFY(!areaBox.isValid()); + QVERIFY(areaBox.isEmpty()); + + QGeoCircle circle; + QGeoRectangle circleBox(circle); + QVERIFY(!circleBox.isValid()); + QVERIFY(circleBox.isEmpty()); +} + +void tst_QGeoRectangle::destructor() +{ + QGeoRectangle *box = new QGeoRectangle(); + delete box; + // checking for a crash +} + +void tst_QGeoRectangle::assignment() +{ + QGeoRectangle b1 = QGeoRectangle(QGeoCoordinate(10.0, 0.0), + QGeoCoordinate(0.0, 10.0)); + QGeoRectangle b2 = QGeoRectangle(QGeoCoordinate(20.0, 0.0), + QGeoCoordinate(0.0, 20.0)); + + QVERIFY(b1 != b2); + + b2 = b1; + QCOMPARE(b2.topLeft(), QGeoCoordinate(10.0, 0.0)); + QCOMPARE(b2.bottomRight(), QGeoCoordinate(0.0, 10.0)); + QCOMPARE(b1, b2); + + b2.setTopLeft(QGeoCoordinate(30.0, 0.0)); + b2.setBottomRight(QGeoCoordinate(0.0, 30.0)); + QCOMPARE(b1.topLeft(), QGeoCoordinate(10.0, 0.0)); + QCOMPARE(b1.bottomRight(), QGeoCoordinate(0.0, 10.0)); + + // Assign b1 to an area + QGeoShape area = b1; + QCOMPARE(area.type(), b1.type()); + QVERIFY(area == b1); + + // Assign the area back to a bounding box + QGeoRectangle ba = area; + QCOMPARE(ba.topLeft(), b1.topLeft()); + QCOMPARE(ba.bottomRight(), b1.bottomRight()); + + // Check that the copy is not modified when modifying the original. + b1.setTopLeft(QGeoCoordinate(80, 30)); + QVERIFY(ba.topLeft() != b1.topLeft()); + QVERIFY(ba != b1); +} + +void tst_QGeoRectangle::equality() +{ + QFETCH(QGeoRectangle, box1); + QFETCH(QGeoRectangle, box2); + QFETCH(QGeoShape, area1); + QFETCH(QGeoShape, area2); + QFETCH(bool, equal); + + // compare boxes + QCOMPARE((box1 == box2), equal); + QCOMPARE((box1 != box2), !equal); + + // compare areas + QCOMPARE((area1 == area2), equal); + QCOMPARE((area1 != area2), !equal); + + // compare area to box + QCOMPARE((area1 == box2), equal); + QCOMPARE((area1 != box2), !equal); + + // compare box to area + QCOMPARE((box1 == area2), equal); + QCOMPARE((box1 != area2), !equal); +} + +void tst_QGeoRectangle::equality_data() +{ + QTest::addColumn("box1"); + QTest::addColumn("box2"); + QTest::addColumn("area1"); + QTest::addColumn("area2"); + QTest::addColumn("equal"); + + QGeoCoordinate c1(10, 5); + QGeoCoordinate c2(5, 10); + QGeoCoordinate c3(20, 15); + QGeoCoordinate c4(15, 20); + + QGeoRectangle b1(c1, c2); + QGeoRectangle b2(c3, c4); + QGeoRectangle b3(c3, c2); + QGeoRectangle b4(c1, c3); + QGeoRectangle b5(c1, c2); + + QGeoShape a1(b1); + QGeoShape a2(b2); + QGeoShape a3(b3); + QGeoShape a4(b4); + QGeoShape a5(b5); + + QTest::newRow("all unequal") + << b1 << b2 << a1 << a2 << false; + QTest::newRow("top left unequal") + << b1 << b3 << a1 << a3 << false; + QTest::newRow("bottom right unequal") + << b1 << b4 << a1 << a4 << false; + QTest::newRow("equal") + << b1 << b5 << a1 << a5 << true; +} + +void tst_QGeoRectangle::isValid() +{ + QFETCH(QGeoRectangle, input); + QFETCH(bool, valid); + + QCOMPARE(input.isValid(), valid); + + QGeoShape area = input; + QCOMPARE(area.isValid(), valid); +} + +void tst_QGeoRectangle::isValid_data() +{ + QTest::addColumn("input"); + QTest::addColumn("valid"); + + QGeoCoordinate c0; + QGeoCoordinate c1(10, 5); + QGeoCoordinate c2(5, 10); + + QTest::newRow("both corners invalid") + << QGeoRectangle(c0, c0) << false; + QTest::newRow("top left corner invalid") + << QGeoRectangle(c0, c2) << false; + QTest::newRow("bottom right corner invalid") + << QGeoRectangle(c1, c0) << false; + QTest::newRow("height in wrong order") + << QGeoRectangle(c2, c1) << false; + QTest::newRow("both corners valid") + << QGeoRectangle(c1, c2) << true; +} + +void tst_QGeoRectangle::isEmpty() +{ + QFETCH(QGeoRectangle, input); + QFETCH(bool, empty); + + QCOMPARE(input.isEmpty(), empty); + + QGeoShape area = input; + QCOMPARE(area.isEmpty(), empty); +} + +void tst_QGeoRectangle::isEmpty_data() +{ + QTest::addColumn("input"); + QTest::addColumn("empty"); + + QGeoCoordinate c0; + QGeoCoordinate c1(10, 5); + QGeoCoordinate c2(5, 10); + QGeoCoordinate c3(10, 10); + + QTest::newRow("both corners invalid") + << QGeoRectangle(c0, c0) << true; + QTest::newRow("top left corner invalid") + << QGeoRectangle(c0, c2) << true; + QTest::newRow("bottom right corner invalid") + << QGeoRectangle(c1, c0) << true; + QTest::newRow("zero width") + << QGeoRectangle(c1, c3) << true; + QTest::newRow("zero height") + << QGeoRectangle(c3, c2) << true; + QTest::newRow("zero width and height") + << QGeoRectangle(c1, c1) << true; + QTest::newRow("non-zero width and height") + << QGeoRectangle(c1, c2) << false; +} + +void tst_QGeoRectangle::corners() +{ + QFETCH(QGeoRectangle, box); + QFETCH(QGeoCoordinate, topLeft); + QFETCH(QGeoCoordinate, topRight); + QFETCH(QGeoCoordinate, bottomLeft); + QFETCH(QGeoCoordinate, bottomRight); + + QCOMPARE(box.topLeft(), topLeft); + QCOMPARE(box.topRight(), topRight); + QCOMPARE(box.bottomLeft(), bottomLeft); + QCOMPARE(box.bottomRight(), bottomRight); +} + +void tst_QGeoRectangle::corners_data() +{ + QTest::addColumn("box"); + QTest::addColumn("topLeft"); + QTest::addColumn("topRight"); + QTest::addColumn("bottomLeft"); + QTest::addColumn("bottomRight"); + + QGeoCoordinate c0; + QGeoCoordinate tl(10, 5); + QGeoCoordinate br(5, 10); + QGeoCoordinate tr(10, 10); + QGeoCoordinate bl(5, 5); + + QTest::newRow("both invalid") + << QGeoRectangle(c0, c0) + << c0 + << c0 + << c0 + << c0; + QTest::newRow("top left invalid") + << QGeoRectangle(c0, br) + << c0 + << c0 + << c0 + << br; + QTest::newRow("bottom right invalid") + << QGeoRectangle(tl, c0) + << tl + << c0 + << c0 + << c0; + QTest::newRow("both valid") + << QGeoRectangle(tl, br) + << tl + << tr + << bl + << br; +} + +void tst_QGeoRectangle::setCorners() +{ + QGeoRectangle box(QGeoCoordinate(10.0, 0.0), + QGeoCoordinate(0.0, 10.0)); + + box.setTopLeft(QGeoCoordinate(20.0, -10.0)); + + QCOMPARE(box.topLeft(), QGeoCoordinate(20.0, -10.0)); + QCOMPARE(box.topRight(), QGeoCoordinate(20.0, 10.0)); + QCOMPARE(box.bottomLeft(), QGeoCoordinate(0.0, -10.0)); + QCOMPARE(box.bottomRight(), QGeoCoordinate(0.0, 10.0)); + + box.setTopRight(QGeoCoordinate(30.0, 20.0)); + + QCOMPARE(box.topLeft(), QGeoCoordinate(30.0, -10.0)); + QCOMPARE(box.topRight(), QGeoCoordinate(30.0, 20.0)); + QCOMPARE(box.bottomLeft(), QGeoCoordinate(0.0, -10.0)); + QCOMPARE(box.bottomRight(), QGeoCoordinate(0.0, 20.0)); + + box.setBottomRight(QGeoCoordinate(-10.0, 30.0)); + + QCOMPARE(box.topLeft(), QGeoCoordinate(30.0, -10.0)); + QCOMPARE(box.topRight(), QGeoCoordinate(30.0, 30.0)); + QCOMPARE(box.bottomLeft(), QGeoCoordinate(-10.0, -10.0)); + QCOMPARE(box.bottomRight(), QGeoCoordinate(-10.0, 30.0)); + + box.setBottomLeft(QGeoCoordinate(-20.0, -20.0)); + + QCOMPARE(box.topLeft(), QGeoCoordinate(30.0, -20.0)); + QCOMPARE(box.topRight(), QGeoCoordinate(30.0, 30.0)); + QCOMPARE(box.bottomLeft(), QGeoCoordinate(-20.0, -20.0)); + QCOMPARE(box.bottomRight(), QGeoCoordinate(-20.0, 30.0)); + + +} + +void tst_QGeoRectangle::width() +{ + QFETCH(QGeoRectangle, box); + QFETCH(double, oldWidth); + QFETCH(double, newWidth); + QFETCH(QGeoRectangle, newBox); + + if (qIsNaN(oldWidth)) + QVERIFY(qIsNaN(box.width())); + else + QCOMPARE(box.width(), oldWidth); + + box.setWidth(newWidth); + + QCOMPARE(box, newBox); +} + +void tst_QGeoRectangle::width_data() +{ + QTest::addColumn("box"); + QTest::addColumn("oldWidth"); + QTest::addColumn("newWidth"); + QTest::addColumn("newBox"); + + QTest::newRow("invalid box") + << QGeoRectangle() + << qQNaN() + << 100.0 + << QGeoRectangle(); + + QTest::newRow("0 width -> negative width") + << QGeoRectangle(QGeoCoordinate(10.0, 90.0), + QGeoCoordinate(5.0, 90.0)) + << 0.0 + << -1.0 + << QGeoRectangle(QGeoCoordinate(10.0, 90.0), + QGeoCoordinate(5.0, 90.0)); + + QTest::newRow("0 width -> 0 width") + << QGeoRectangle(QGeoCoordinate(10.0, 90.0), + QGeoCoordinate(5.0, 90.0)) + << 0.0 + << 0.0 + << QGeoRectangle(QGeoCoordinate(10.0, 90.0), + QGeoCoordinate(5.0, 90.0)); + + QTest::newRow("0 width -> non wrapping width") + << QGeoRectangle(QGeoCoordinate(10.0, 90.0), + QGeoCoordinate(5.0, 90.0)) + << 0.0 + << 10.0 + << QGeoRectangle(QGeoCoordinate(10.0, 85.0), + QGeoCoordinate(5.0, 95.0)); + + QTest::newRow("0 width -> wrapping width positive") + << QGeoRectangle(QGeoCoordinate(10.0, 90.0), + QGeoCoordinate(5.0, 90.0)) + << 0.0 + << 190.0 + << QGeoRectangle(QGeoCoordinate(10.0, -5.0), + QGeoCoordinate(5.0, -175.0)); + + QTest::newRow("0 width -> wrapping width negative") + << QGeoRectangle(QGeoCoordinate(10.0, -90.0), + QGeoCoordinate(5.0, -90.0)) + << 0.0 + << 190.0 + << QGeoRectangle(QGeoCoordinate(10.0, 175.0), + QGeoCoordinate(5.0, 5.0)); + + QTest::newRow("0 width -> 360 width") + << QGeoRectangle(QGeoCoordinate(10.0, 90.0), + QGeoCoordinate(5.0, 90.0)) + << 0.0 + << 360.0 + << QGeoRectangle(QGeoCoordinate(10.0, -180.0), + QGeoCoordinate(5.0, 180.0)); + + QTest::newRow("0 width -> 360+ width") + << QGeoRectangle(QGeoCoordinate(10.0, 90.0), + QGeoCoordinate(5.0, 90.0)) + << 0.0 + << 370.0 + << QGeoRectangle(QGeoCoordinate(10.0, -180.0), + QGeoCoordinate(5.0, 180.0)); + + QTest::newRow("non wrapping width -> negative width") + << QGeoRectangle(QGeoCoordinate(10.0, 85.0), + QGeoCoordinate(5.0, 95.0)) + << 10.0 + << -1.0 + << QGeoRectangle(QGeoCoordinate(10.0, 85.0), + QGeoCoordinate(5.0, 95.0)); + + QTest::newRow("non wrapping width -> 0 width") + << QGeoRectangle(QGeoCoordinate(10.0, 85.0), + QGeoCoordinate(5.0, 95.0)) + << 10.0 + << 0.0 + << QGeoRectangle(QGeoCoordinate(10.0, 90.0), + QGeoCoordinate(5.0, 90.0)); + + QTest::newRow("non wrapping width -> non wrapping width") + << QGeoRectangle(QGeoCoordinate(10.0, 85.0), + QGeoCoordinate(5.0, 95.0)) + << 10.0 + << 20.0 + << QGeoRectangle(QGeoCoordinate(10.0, 80.0), + QGeoCoordinate(5.0, 100.0)); + + QTest::newRow("non wrapping width -> wrapping width positive") + << QGeoRectangle(QGeoCoordinate(10.0, 85.0), + QGeoCoordinate(5.0, 95.0)) + << 10.0 + << 190.0 + << QGeoRectangle(QGeoCoordinate(10.0, -5.0), + QGeoCoordinate(5.0, -175.0)); + + QTest::newRow("non wrapping width -> wrapping width negative") + << QGeoRectangle(QGeoCoordinate(10.0, -95.0), + QGeoCoordinate(5.0, -85.0)) + << 10.0 + << 190.0 + << QGeoRectangle(QGeoCoordinate(10.0, 175.0), + QGeoCoordinate(5.0, 5.0)); + + QTest::newRow("non wrapping width -> 360 width") + << QGeoRectangle(QGeoCoordinate(10.0, 85.0), + QGeoCoordinate(5.0, 95.0)) + << 10.0 + << 360.0 + << QGeoRectangle(QGeoCoordinate(10.0, -180.0), + QGeoCoordinate(5.0, 180.0)); + + QTest::newRow("non wrapping width width -> 360+ width") + << QGeoRectangle(QGeoCoordinate(10.0, 85.0), + QGeoCoordinate(5.0, 95.0)) + << 10.0 + << 370.0 + << QGeoRectangle(QGeoCoordinate(10.0, -180.0), + QGeoCoordinate(5.0, 180.0)); + + QTest::newRow("wrapping width -> negative width") + << QGeoRectangle(QGeoCoordinate(10.0, 175.0), + QGeoCoordinate(5.0, -85.0)) + << 100.0 + << -1.0 + << QGeoRectangle(QGeoCoordinate(10.0, 175.0), + QGeoCoordinate(5.0, -85.0)); + + QTest::newRow("wrapping width -> 0 width") + << QGeoRectangle(QGeoCoordinate(10.0, 175.0), + QGeoCoordinate(5.0, -85.0)) + << 100.0 + << 0.0 + << QGeoRectangle(QGeoCoordinate(10.0, -135.0), + QGeoCoordinate(5.0, -135.0)); + + QTest::newRow("wrapping width -> non wrapping width") + << QGeoRectangle(QGeoCoordinate(10.0, 175.0), + QGeoCoordinate(5.0, -85.0)) + << 100.0 + << 80.0 + << QGeoRectangle(QGeoCoordinate(10.0, -175.0), + QGeoCoordinate(5.0, -95.0)); + + QTest::newRow("wrapping width -> wrapping width") + << QGeoRectangle(QGeoCoordinate(10.0, 175.0), + QGeoCoordinate(5.0, -85.0)) + << 100.0 + << 120.0 + << QGeoRectangle(QGeoCoordinate(10.0, 165.0), + QGeoCoordinate(5.0, -75.0)); + + QTest::newRow("wrapping width -> 360 width") + << QGeoRectangle(QGeoCoordinate(10.0, 175.0), + QGeoCoordinate(5.0, -85.0)) + << 100.0 + << 360.0 + << QGeoRectangle(QGeoCoordinate(10.0, -180.0), + QGeoCoordinate(5.0, 180.0)); + + QTest::newRow("wrapping width width -> 360+ width") + << QGeoRectangle(QGeoCoordinate(10.0, 175.0), + QGeoCoordinate(5.0, -85.0)) + << 100.0 + << 370.0 + << QGeoRectangle(QGeoCoordinate(10.0, -180.0), + QGeoCoordinate(5.0, 180.0)); +} + +void tst_QGeoRectangle::height() +{ + QFETCH(QGeoRectangle, box); + QFETCH(double, oldHeight); + QFETCH(double, newHeight); + QFETCH(QGeoRectangle, newBox); + + if (qIsNaN(oldHeight)) + QVERIFY(qIsNaN(box.height())); + else + QCOMPARE(box.height(), oldHeight); + + box.setHeight(newHeight); + QCOMPARE(box, newBox); +} + +void tst_QGeoRectangle::height_data() +{ + QTest::addColumn("box"); + QTest::addColumn("oldHeight"); + QTest::addColumn("newHeight"); + QTest::addColumn("newBox"); + + QTest::newRow("invalid box") + << QGeoRectangle() + << qQNaN() + << 100.0 + << QGeoRectangle(); + + QTest::newRow("0 height -> negative height") + << QGeoRectangle(QGeoCoordinate(10.0, 5.0), + QGeoCoordinate(10.0, 10.0)) + << 0.0 + << -1.0 + << QGeoRectangle(QGeoCoordinate(10.0, 5.0), + QGeoCoordinate(10.0, 10.0)); + + QTest::newRow("0 height -> 0 height") + << QGeoRectangle(QGeoCoordinate(10.0, 5.0), + QGeoCoordinate(10.0, 10.0)) + << 0.0 + << 0.0 + << QGeoRectangle(QGeoCoordinate(10.0, 5.0), + QGeoCoordinate(10.0, 10.0)); + + QTest::newRow("0 height -> non zero height") + << QGeoRectangle(QGeoCoordinate(10.0, 5.0), + QGeoCoordinate(10.0, 10.0)) + << 0.0 + << 20.0 + << QGeoRectangle(QGeoCoordinate(20.0, 5.0), + QGeoCoordinate(0.0, 10.0)); + + QTest::newRow("0 height -> squash top") + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(70.0, 70.0)) + << 0.0 + << 60.0 + << QGeoRectangle(QGeoCoordinate(90.0, 30.0), + QGeoCoordinate(50.0, 70.0)); + + QTest::newRow("0 height -> squash bottom") + << QGeoRectangle(QGeoCoordinate(-70.0, 30.0), + QGeoCoordinate(-70.0, 70.0)) + << 0.0 + << 60.0 + << QGeoRectangle(QGeoCoordinate(-50.0, 30.0), + QGeoCoordinate(-90.0, 70.0)); + + QTest::newRow("0 height -> 180") + << QGeoRectangle(QGeoCoordinate(0.0, 5.0), + QGeoCoordinate(0.0, 10.0)) + << 0.0 + << 180.0 + << QGeoRectangle(QGeoCoordinate(90.0, 5.0), + QGeoCoordinate(-90.0, 10.0)); + + QTest::newRow("0 height -> 180 squash top") + << QGeoRectangle(QGeoCoordinate(20.0, 5.0), + QGeoCoordinate(20.0, 10.0)) + << 0.0 + << 180.0 + << QGeoRectangle(QGeoCoordinate(90.0, 5.0), + QGeoCoordinate(-50.0, 10.0)); + + QTest::newRow("0 height -> 180 squash bottom") + << QGeoRectangle(QGeoCoordinate(-20.0, 5.0), + QGeoCoordinate(-20.0, 10.0)) + << 0.0 + << 180.0 + << QGeoRectangle(QGeoCoordinate(50.0, 5.0), + QGeoCoordinate(-90.0, 10.0)); + + QTest::newRow("0 height -> 180+") + << QGeoRectangle(QGeoCoordinate(0.0, 5.0), + QGeoCoordinate(0.0, 10.0)) + << 0.0 + << 190.0 + << QGeoRectangle(QGeoCoordinate(90.0, 5.0), + QGeoCoordinate(-90.0, 10.0)); + + QTest::newRow("0 height -> 180+ squash top") + << QGeoRectangle(QGeoCoordinate(20.0, 5.0), + QGeoCoordinate(20.0, 10.0)) + << 0.0 + << 190.0 + << QGeoRectangle(QGeoCoordinate(90.0, 5.0), + QGeoCoordinate(-50.0, 10.0)); + + QTest::newRow("0 height -> 180+ squash bottom") + << QGeoRectangle(QGeoCoordinate(-20.0, 5.0), + QGeoCoordinate(-20.0, 10.0)) + << 0.0 + << 190.0 + << QGeoRectangle(QGeoCoordinate(50.0, 5.0), + QGeoCoordinate(-90.0, 10.0)); + + QTest::newRow("non zero height -> negative height") + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(30.0, 70.0)) + << 40.0 + << -1.0 + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(30.0, 70.0)); + + QTest::newRow("non zero height -> 0 height") + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(30.0, 70.0)) + << 40.0 + << 0.0 + << QGeoRectangle(QGeoCoordinate(50.0, 30.0), + QGeoCoordinate(50.0, 70.0)); + + QTest::newRow("non zero height -> non zero height") + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(30.0, 70.0)) + << 40.0 + << 20.0 + << QGeoRectangle(QGeoCoordinate(60.0, 30.0), + QGeoCoordinate(40.0, 70.0)); + + QTest::newRow("non zero height -> squash top") + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(30.0, 70.0)) + << 40.0 + << 100.0 + << QGeoRectangle(QGeoCoordinate(90.0, 30.0), + QGeoCoordinate(10.0, 70.0)); + + QTest::newRow("non zero height -> squash bottom") + << QGeoRectangle(QGeoCoordinate(-30.0, 30.0), + QGeoCoordinate(-70.0, 70.0)) + << 40.0 + << 100.0 + << QGeoRectangle(QGeoCoordinate(-10.0, 30.0), + QGeoCoordinate(-90.0, 70.0)); + + QTest::newRow("non zero height -> 180") + << QGeoRectangle(QGeoCoordinate(20.0, 30.0), + QGeoCoordinate(-20.0, 70.0)) + << 40.0 + << 180.0 + << QGeoRectangle(QGeoCoordinate(90.0, 30.0), + QGeoCoordinate(-90.0, 70.0)); + + QTest::newRow("non zero height -> 180 squash top") + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(30.0, 70.0)) + << 40.0 + << 180.0 + << QGeoRectangle(QGeoCoordinate(90.0, 30.0), + QGeoCoordinate(10.0, 70.0)); + + QTest::newRow("non zero height -> 180 squash bottom") + << QGeoRectangle(QGeoCoordinate(-30.0, 30.0), + QGeoCoordinate(-70.0, 70.0)) + << 40.0 + << 180.0 + << QGeoRectangle(QGeoCoordinate(-10.0, 30.0), + QGeoCoordinate(-90.0, 70.0)); + + QTest::newRow("non zero height -> 180+") + << QGeoRectangle(QGeoCoordinate(20.0, 30.0), + QGeoCoordinate(-20.0, 70.0)) + << 40.0 + << 190.0 + << QGeoRectangle(QGeoCoordinate(90.0, 30.0), + QGeoCoordinate(-90.0, 70.0)); + + QTest::newRow("non zero height -> 180+ squash top") + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(30.0, 70.0)) + << 40.0 + << 190.0 + << QGeoRectangle(QGeoCoordinate(90.0, 30.0), + QGeoCoordinate(10.0, 70.0)); + + QTest::newRow("non zero height -> 180+ squash bottom") + << QGeoRectangle(QGeoCoordinate(-30.0, 30.0), + QGeoCoordinate(-70.0, 70.0)) + << 40.0 + << 190.0 + << QGeoRectangle(QGeoCoordinate(-10.0, 30.0), + QGeoCoordinate(-90.0, 70.0)); +} + +void tst_QGeoRectangle::center() +{ + QFETCH(QGeoRectangle, box); + QFETCH(QGeoCoordinate, oldCenter); + QFETCH(QGeoCoordinate, newCenter); + QFETCH(QGeoRectangle, newBox); + + QGeoShape shape = box; + QCOMPARE(box.center(), oldCenter); + QCOMPARE(shape.center(), oldCenter); + box.setCenter(newCenter); + QCOMPARE(box, newBox); +} + +void tst_QGeoRectangle::center_data() +{ + QTest::addColumn("box"); + QTest::addColumn("oldCenter"); + QTest::addColumn("newCenter"); + QTest::addColumn("newBox"); + + QTest::newRow("invalid") + << QGeoRectangle() + << QGeoCoordinate() + << QGeoCoordinate(0.0, 0.0) + << QGeoRectangle(QGeoCoordinate(0.0, 0.0), 0.0, 0.0); + + QTest::newRow("zero width") + << QGeoRectangle(QGeoCoordinate(10.0, 5.0), + QGeoCoordinate(5.0, 5.0)) + << QGeoCoordinate(7.5, 5.0) + << QGeoCoordinate(20.0, 20.0) + << QGeoRectangle(QGeoCoordinate(22.5, 20.0), + QGeoCoordinate(17.5, 20.0)); + + QTest::newRow("360 width") + << QGeoRectangle(QGeoCoordinate(10.0, -180.0), + QGeoCoordinate(5.0, 180.0)) + << QGeoCoordinate(7.5, 0.0) + << QGeoCoordinate(20.0, 20.0) + << QGeoRectangle(QGeoCoordinate(22.5, -180.0), + QGeoCoordinate(17.5, 180.0)); + + QTest::newRow("zero height") + << QGeoRectangle(QGeoCoordinate(5.0, 5.0), + QGeoCoordinate(5.0, 10.0)) + << QGeoCoordinate(5.0, 7.5) + << QGeoCoordinate(20.0, 20.0) + << QGeoRectangle(QGeoCoordinate(20.0, 17.5), + QGeoCoordinate(20.0, 22.5)); + + QTest::newRow("180 height -> move") + << QGeoRectangle(QGeoCoordinate(90.0, 5.0), + QGeoCoordinate(-90.0, 10.0)) + << QGeoCoordinate(0.0, 7.5) + << QGeoCoordinate(0.0, 20.0) + << QGeoRectangle(QGeoCoordinate(90.0, 17.5), + QGeoCoordinate(-90.0, 22.5)); + + QTest::newRow("180 height -> squash top") + << QGeoRectangle(QGeoCoordinate(90.0, 5.0), + QGeoCoordinate(-90.0, 10.0)) + << QGeoCoordinate(0.0, 7.5) + << QGeoCoordinate(-20.0, 20.0) + << QGeoRectangle(QGeoCoordinate(50.0, 17.5), + QGeoCoordinate(-90.0, 22.5)); + + QTest::newRow("180 height -> squash bottom") + << QGeoRectangle(QGeoCoordinate(90.0, 5.0), + QGeoCoordinate(-90.0, 10.0)) + << QGeoCoordinate(0.0, 7.5) + << QGeoCoordinate(20.0, 20.0) + << QGeoRectangle(QGeoCoordinate(90.0, 17.5), + QGeoCoordinate(-50.0, 22.5)); + + QTest::newRow("non wrapping -> non wrapping") + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(30.0, 70.0)) + << QGeoCoordinate(50.0, 50.0) + << QGeoCoordinate(10.0, 10.0) + << QGeoRectangle(QGeoCoordinate(30.0, -10.0), + QGeoCoordinate(-10.0, 30.0)); + + QTest::newRow("non wrapping -> wrapping") + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(30.0, 70.0)) + << QGeoCoordinate(50.0, 50.0) + << QGeoCoordinate(10.0, 170.0) + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-10.0, -170.0)); + + QTest::newRow("non wrapping -> squash top") + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(30.0, 70.0)) + << QGeoCoordinate(50.0, 50.0) + << QGeoCoordinate(80.0, 50.0) + << QGeoRectangle(QGeoCoordinate(90.0, 30.0), + QGeoCoordinate(70.0, 70.0)); + + QTest::newRow("non wrapping -> squash bottom") + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(30.0, 70.0)) + << QGeoCoordinate(50.0, 50.0) + << QGeoCoordinate(-80.0, 50.0) + << QGeoRectangle(QGeoCoordinate(-70.0, 30.0), + QGeoCoordinate(-90.0, 70.0)); + + QTest::newRow("wrapping -> non wrapping") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-10.0, -170.0)) + << QGeoCoordinate(10.0, 170.0) + << QGeoCoordinate(50.0, 50.0) + << QGeoRectangle(QGeoCoordinate(70.0, 30.0), + QGeoCoordinate(30.0, 70.0)); + + QTest::newRow("wrapping -> wrapping") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-10.0, -170.0)) + << QGeoCoordinate(10.0, 170.0) + << QGeoCoordinate(10.0, -170.0) + << QGeoRectangle(QGeoCoordinate(30.0, 170.0), + QGeoCoordinate(-10.0, -150.0)); + + QTest::newRow("wrapping -> squash top") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-10.0, -170.0)) + << QGeoCoordinate(10.0, 170.0) + << QGeoCoordinate(80.0, 170.0) + << QGeoRectangle(QGeoCoordinate(90.0, 150.0), + QGeoCoordinate(70.0, -170.0)); + + QTest::newRow("wrapping -> squash bottom") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-10.0, -170.0)) + << QGeoCoordinate(10.0, 170.0) + << QGeoCoordinate(-80.0, 170.0) + << QGeoRectangle(QGeoCoordinate(-70.0, 150.0), + QGeoCoordinate(-90.0, -170.0)); +} + +void tst_QGeoRectangle::boundingGeoRectangle_data() +{ + QTest::addColumn("rectangle"); + + QGeoRectangle b1(QGeoCoordinate(70, 30), QGeoCoordinate(30, 70)); + QGeoRectangle b2(QGeoCoordinate(70, 150), QGeoCoordinate(30, -170)); + QGeoRectangle b3(QGeoCoordinate(90, 30), QGeoCoordinate(50, 70)); + QGeoRectangle b4(QGeoCoordinate(-50, 30), QGeoCoordinate(-90, 70)); + + QTest::newRow("Box 1") << b1; + QTest::newRow("Box 2") << b2; + QTest::newRow("Box 3") << b3; + QTest::newRow("Box 4") << b4; +} + +void tst_QGeoRectangle::boundingGeoRectangle() +{ + QFETCH(QGeoRectangle, rectangle); + + QGeoRectangle box = rectangle.boundingGeoRectangle(); + QCOMPARE(box, rectangle); +} + +void tst_QGeoRectangle::containsCoord() +{ + QFETCH(QGeoRectangle, box); + QFETCH(QGeoCoordinate, coord); + QFETCH(bool, contains); + + QCOMPARE(box.contains(coord), contains); + + QGeoShape area = box; + QCOMPARE(area.contains(coord), contains); +} + +void tst_QGeoRectangle::containsCoord_data() +{ + QTest::addColumn("box"); + QTest::addColumn("coord"); + QTest::addColumn("contains"); + + QGeoRectangle b1(QGeoCoordinate(70, 30), QGeoCoordinate(30, 70)); + + double lonLO1 = 20.0; + double lonL1 = 30.0; + double lonLI1 = 40.0; + double lonC1 = 50.0; + double lonRI1 = 60.0; + double lonR1 = 70.0; + double lonRO1 = 80.0; + + double latTO1 = 80.0; + double latT1 = 70.0; + double latTI1 = 60.0; + double latC1 = 50.0; + double latBI1 = 40.0; + double latB1 = 30.0; + double latBO1 = 20.0; + + QTest::newRow("non wrapped - in center") + << b1 << QGeoCoordinate(latC1, lonC1) << true; + QTest::newRow("non wrapped - left edge - inside") + << b1 << QGeoCoordinate(latC1, lonLI1) << true; + QTest::newRow("non wrapped - left edge") + << b1 << QGeoCoordinate(latC1, lonL1) << true; + QTest::newRow("non wrapped - left edge - outside") + << b1 << QGeoCoordinate(latC1, lonLO1) << false; + QTest::newRow("non wrapped - right edge - inside") + << b1 << QGeoCoordinate(latC1, lonRI1) << true; + QTest::newRow("non wrapped - right edge") + << b1 << QGeoCoordinate(latC1, lonR1) << true; + QTest::newRow("non wrapped - right edge - outside") + << b1 << QGeoCoordinate(latC1, lonRO1) << false; + QTest::newRow("non wrapped - top edge - inside") + << b1 << QGeoCoordinate(latTI1, lonC1) << true; + QTest::newRow("non wrapped - top edge") + << b1 << QGeoCoordinate(latT1, lonC1) << true; + QTest::newRow("non wrapped - top edge - outside") + << b1 << QGeoCoordinate(latTO1, lonC1) << false; + QTest::newRow("non wrapped - bottom edge - inside") + << b1 << QGeoCoordinate(latBI1, lonC1) << true; + QTest::newRow("non wrapped - bottom edge") + << b1 << QGeoCoordinate(latB1, lonC1) << true; + QTest::newRow("non wrapped - bottom edge - outside") + << b1 << QGeoCoordinate(latBO1, lonC1) << false; + QTest::newRow("non wrapped - top left - inside") + << b1 << QGeoCoordinate(latTI1, lonLI1) << true; + QTest::newRow("non wrapped - top left") + << b1 << QGeoCoordinate(latT1, lonL1) << true; + QTest::newRow("non wrapped - top left - outside") + << b1 << QGeoCoordinate(latTO1, lonLO1) << false; + QTest::newRow("non wrapped - top right - inside") + << b1 << QGeoCoordinate(latTI1, lonRI1) << true; + QTest::newRow("non wrapped - top right") + << b1 << QGeoCoordinate(latT1, lonR1) << true; + QTest::newRow("non wrapped - top right - outside") + << b1 << QGeoCoordinate(latTO1, lonRO1) << false; + QTest::newRow("non wrapped - bottom left - inside") + << b1 << QGeoCoordinate(latBI1, lonLI1) << true; + QTest::newRow("non wrapped - bottom left") + << b1 << QGeoCoordinate(latB1, lonL1) << true; + QTest::newRow("non wrapped - bottom left - outside") + << b1 << QGeoCoordinate(latBO1, lonLO1) << false; + QTest::newRow("non wrapped - bottom right - inside") + << b1 << QGeoCoordinate(latBI1, lonRI1) << true; + QTest::newRow("non wrapped - bottom right") + << b1 << QGeoCoordinate(latB1, lonR1) << true; + QTest::newRow("non wrapped - bottom right - outside") + << b1 << QGeoCoordinate(latBO1, lonRO1) << false; + + QGeoRectangle b2(QGeoCoordinate(70, 150), QGeoCoordinate(30, -170)); + + double lonLO2 = 140.0; + double lonL2 = 150.0; + double lonLI2 = 160.0; + double lonC2 = 170.0; + double lonRI2 = 180.0; + double lonR2 = -170.0; + double lonRO2 = -160.0; + + double latTO2 = 80.0; + double latT2 = 70.0; + double latTI2 = 60.0; + double latC2 = 50.0; + double latBI2 = 40.0; + double latB2 = 30.0; + double latBO2 = 20.0; + + QTest::newRow("wrapped - in center") + << b2 << QGeoCoordinate(latC2, lonC2) << true; + QTest::newRow("wrapped - left edge - inside") + << b2 << QGeoCoordinate(latC2, lonLI2) << true; + QTest::newRow("wrapped - left edge") + << b2 << QGeoCoordinate(latC2, lonL2) << true; + QTest::newRow("wrapped - left edge - outside") + << b2 << QGeoCoordinate(latC2, lonLO2) << false; + QTest::newRow("wrapped - right edge - inside") + << b2 << QGeoCoordinate(latC2, lonRI2) << true; + QTest::newRow("wrapped - right edge") + << b2 << QGeoCoordinate(latC2, lonR2) << true; + QTest::newRow("wrapped - right edge - outside") + << b2 << QGeoCoordinate(latC2, lonRO2) << false; + QTest::newRow("wrapped - top edge - inside") + << b2 << QGeoCoordinate(latTI2, lonC2) << true; + QTest::newRow("wrapped - top edge") + << b2 << QGeoCoordinate(latT2, lonC2) << true; + QTest::newRow("wrapped - top edge - outside") + << b2 << QGeoCoordinate(latTO2, lonC2) << false; + QTest::newRow("wrapped - bottom edge - inside") + << b2 << QGeoCoordinate(latBI2, lonC2) << true; + QTest::newRow("wrapped - bottom edge") + << b2 << QGeoCoordinate(latB2, lonC2) << true; + QTest::newRow("wrapped - bottom edge - outside") + << b2 << QGeoCoordinate(latBO2, lonC2) << false; + QTest::newRow("wrapped - top left - inside") + << b2 << QGeoCoordinate(latTI2, lonLI2) << true; + QTest::newRow("wrapped - top left") + << b2 << QGeoCoordinate(latT2, lonL2) << true; + QTest::newRow("wrapped - top left - outside") + << b2 << QGeoCoordinate(latTO2, lonLO2) << false; + QTest::newRow("wrapped - top right - inside") + << b2 << QGeoCoordinate(latTI2, lonRI2) << true; + QTest::newRow("wrapped - top right") + << b2 << QGeoCoordinate(latT2, lonR2) << true; + QTest::newRow("wrapped - top right - outside") + << b2 << QGeoCoordinate(latTO2, lonRO2) << false; + QTest::newRow("wrapped - bottom left - inside") + << b2 << QGeoCoordinate(latBI2, lonLI2) << true; + QTest::newRow("wrapped - bottom left") + << b2 << QGeoCoordinate(latB2, lonL2) << true; + QTest::newRow("wrapped - bottom left - outside") + << b2 << QGeoCoordinate(latBO2, lonLO2) << false; + QTest::newRow("wrapped - bottom right - inside") + << b2 << QGeoCoordinate(latBI2, lonRI2) << true; + QTest::newRow("wrapped - bottom right") + << b2 << QGeoCoordinate(latB2, lonR2) << true; + QTest::newRow("wrapped - bottom right - outside") + << b2 << QGeoCoordinate(latBO2, lonRO2) << false; + + QGeoRectangle b3(QGeoCoordinate(90, 30), QGeoCoordinate(50, 70)); + + double lonLO3 = 20.0; + double lonL3 = 30.0; + double lonLI3 = 40.0; + double lonC3 = 50.0; + double lonRI3 = 60.0; + double lonR3 = 70.0; + double lonRO3 = 80.0; + + double latT3 = 90.0; + double latTI3 = 80.0; + double latC3 = 70.0; + /* current unused: + double latBI3 = 60.0; + double latB3 = 50.0; + double latBO3 = 40.0; + */ + + QTest::newRow("north pole - in center") + << b3 << QGeoCoordinate(latC3, lonC3) << true; + QTest::newRow("north pole - left edge - inside") + << b3 << QGeoCoordinate(latC3, lonLI3) << true; + QTest::newRow("north pole - left edge") + << b3 << QGeoCoordinate(latC3, lonL3) << true; + QTest::newRow("north pole - left edge - outside") + << b3 << QGeoCoordinate(latC3, lonLO3) << false; + QTest::newRow("north pole - right edge - inside") + << b3 << QGeoCoordinate(latC3, lonRI3) << true; + QTest::newRow("north pole - right edge") + << b3 << QGeoCoordinate(latC3, lonR3) << true; + QTest::newRow("north pole - right edge - outside") + << b3 << QGeoCoordinate(latC3, lonRO3) << false; + QTest::newRow("north pole - top edge - inside") + << b3 << QGeoCoordinate(latTI3, lonC3) << true; + QTest::newRow("north pole - top edge") + << b3 << QGeoCoordinate(latT3, lonC3) << true; + QTest::newRow("north pole - top left - inside") + << b3 << QGeoCoordinate(latTI3, lonLI3) << true; + QTest::newRow("north pole - top left") + << b3 << QGeoCoordinate(latT3, lonL3) << true; + QTest::newRow("north pole - top left - outside") + << b3 << QGeoCoordinate(latT3, lonLO3) << true; + QTest::newRow("north pole - top right - inside") + << b3 << QGeoCoordinate(latTI3, lonRI3) << true; + QTest::newRow("north pole - top right") + << b3 << QGeoCoordinate(latT3, lonR3) << true; + QTest::newRow("north pole - top right - outside") + << b3 << QGeoCoordinate(latT3, lonRO3) << true; + + QGeoRectangle b4(QGeoCoordinate(-50, 30), QGeoCoordinate(-90, 70)); + + double lonLO4 = 20.0; + double lonL4 = 30.0; + double lonLI4 = 40.0; + double lonC4 = 50.0; + double lonRI4 = 60.0; + double lonR4 = 70.0; + double lonRO4 = 80.0; + + /* currently unused: + double latTO4 = -40.0; + double latT4 = -50.0; + double latTI4 = -60.0; + */ + double latC4 = -70.0; + double latBI4 = -80.0; + double latB4 = -90.0; + + QTest::newRow("south pole - in center") + << b4 << QGeoCoordinate(latC4, lonC4) << true; + QTest::newRow("south pole - left edge - inside") + << b4 << QGeoCoordinate(latC4, lonLI4) << true; + QTest::newRow("south pole - left edge") + << b4 << QGeoCoordinate(latC4, lonL4) << true; + QTest::newRow("south pole - left edge - outside") + << b4 << QGeoCoordinate(latC4, lonLO4) << false; + QTest::newRow("south pole - right edge - inside") + << b4 << QGeoCoordinate(latC4, lonRI4) << true; + QTest::newRow("south pole - right edge") + << b4 << QGeoCoordinate(latC4, lonR4) << true; + QTest::newRow("south pole - right edge - outside") + << b4 << QGeoCoordinate(latC4, lonRO4) << false; + QTest::newRow("south pole - bottom edge - inside") + << b4 << QGeoCoordinate(latBI4, lonC4) << true; + QTest::newRow("south pole - bottom edge") + << b4 << QGeoCoordinate(latB4, lonC4) << true; + QTest::newRow("south pole - bottom left - inside") + << b4 << QGeoCoordinate(latBI4, lonLI4) << true; + QTest::newRow("south pole - bottom left") + << b4 << QGeoCoordinate(latB4, lonL4) << true; + QTest::newRow("south pole - bottom left - outside") + << b4 << QGeoCoordinate(latB4, lonLO4) << true; + QTest::newRow("south pole - bottom right - inside") + << b4 << QGeoCoordinate(latBI4, lonRI4) << true; + QTest::newRow("south pole - bottom right") + << b4 << QGeoCoordinate(latB4, lonR4) << true; + QTest::newRow("south pole - bottom right - outside") + << b4 << QGeoCoordinate(latB4, lonRO4) << true; +} + +void tst_QGeoRectangle::containsBoxAndIntersects() +{ + QFETCH(QGeoRectangle, box1); + QFETCH(QGeoRectangle, box2); + QFETCH(bool, contains); + QFETCH(bool, intersects); + + QCOMPARE(box1.contains(box2), contains); + QCOMPARE(box1.intersects(box2), intersects); +} + +void tst_QGeoRectangle::containsBoxAndIntersects_data() +{ + QTest::addColumn("box1"); + QTest::addColumn("box2"); + QTest::addColumn("contains"); + QTest::addColumn("intersects"); + + QGeoRectangle b1(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)); + + QTest::newRow("non wrapped same") + << b1 + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << true << true; + + QTest::newRow("non wrapped smaller") + << b1 + << QGeoRectangle(QGeoCoordinate(20.0, -20.0), + QGeoCoordinate(-20.0, 20.0)) + << true << true; + + QTest::newRow("non wrapped larger") + << b1 + << QGeoRectangle(QGeoCoordinate(40.0, -40.0), + QGeoCoordinate(-40.0, 40.0)) + << false << true; + + QTest::newRow("non wrapped outside top") + << b1 + << QGeoRectangle(QGeoCoordinate(80.0, -30.0), + QGeoCoordinate(50.0, 30.0)) + << false << false; + + QTest::newRow("non wrapped outside bottom") + << b1 + << QGeoRectangle(QGeoCoordinate(-50.0, -30.0), + QGeoCoordinate(-80.0, 30.0)) + << false << false; + + QTest::newRow("non wrapped outside left") + << b1 + << QGeoRectangle(QGeoCoordinate(30.0, -80.0), + QGeoCoordinate(-30.0, -50.0)) + << false << false; + + QTest::newRow("non wrapped outside wrapped") + << b1 + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << false << false; + + QTest::newRow("non wrapped outside right") + << b1 + << QGeoRectangle(QGeoCoordinate(30.0, 50.0), + QGeoCoordinate(-30.0, 80.0)) + << false << false; + + QTest::newRow("non wrapped top left cross") + << b1 + << QGeoRectangle(QGeoCoordinate(40.0, -40.0), + QGeoCoordinate(20.0, -20.0)) + << false << true; + + QTest::newRow("non wrapped top cross") + << b1 + << QGeoRectangle(QGeoCoordinate(40.0, -10.0), + QGeoCoordinate(20.0, 10.0)) + << false << true; + + QTest::newRow("non wrapped top right cross") + << b1 + << QGeoRectangle(QGeoCoordinate(40.0, 20.0), + QGeoCoordinate(20.0, 40.0)) + << false << true; + + QTest::newRow("non wrapped left cross") + << b1 + << QGeoRectangle(QGeoCoordinate(10.0, -40.0), + QGeoCoordinate(-10.0, -20.0)) + << false << true; + + QTest::newRow("non wrapped right cross") + << b1 + << QGeoRectangle(QGeoCoordinate(10.0, 20.0), + QGeoCoordinate(-10.0, 40.0)) + << false << true; + + QTest::newRow("non wrapped bottom left cross") + << b1 + << QGeoRectangle(QGeoCoordinate(-20.0, -40.0), + QGeoCoordinate(-40.0, -20.0)) + << false << true; + + QTest::newRow("non wrapped bottom cross") + << b1 + << QGeoRectangle(QGeoCoordinate(-20.0, -10.0), + QGeoCoordinate(-40.0, 10.0)) + << false << true; + + QTest::newRow("non wrapped bottom right cross") + << b1 + << QGeoRectangle(QGeoCoordinate(-20.0, 20.0), + QGeoCoordinate(-40.0, 40.0)) + << false << true; + + QTest::newRow("non wrapped top left touch outside") + << b1 + << QGeoRectangle(QGeoCoordinate(50.0, -50.0), + QGeoCoordinate(30.0, -30.0)) + << false << true; + + QTest::newRow("non wrapped top touch outside") + << b1 + << QGeoRectangle(QGeoCoordinate(50.0, -10.0), + QGeoCoordinate(30.0, 10.0)) + << false << true; + + QTest::newRow("non wrapped top right touch outside") + << b1 + << QGeoRectangle(QGeoCoordinate(50.0, 30.0), + QGeoCoordinate(30.0, 50.0)) + << false << true; + + QTest::newRow("non wrapped left touch outside") + << b1 + << QGeoRectangle(QGeoCoordinate(10.0, -50.0), + QGeoCoordinate(-10.0, -30.0)) + << false << true; + + QTest::newRow("non wrapped right touch outside") + << b1 + << QGeoRectangle(QGeoCoordinate(10.0, 30.0), + QGeoCoordinate(-10.0, 50.0)) + << false << true; + + QTest::newRow("non wrapped bottom left touch outside") + << b1 + << QGeoRectangle(QGeoCoordinate(-30.0, -30.0), + QGeoCoordinate(-50.0, -50.0)) + << false << true; + + QTest::newRow("non wrapped bottom touch outside") + << b1 + << QGeoRectangle(QGeoCoordinate(-30.0, -10.0), + QGeoCoordinate(-50.0, 10.0)) + << false << true; + + QTest::newRow("non wrapped bottom right touch outside") + << b1 + << QGeoRectangle(QGeoCoordinate(-30.0, 30.0), + QGeoCoordinate(-50.0, 50.0)) + << false << true; + + QTest::newRow("non wrapped top left touch inside") + << b1 + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(10.0, -10.0)) + << true << true; + + QTest::newRow("non wrapped top touch inside") + << b1 + << QGeoRectangle(QGeoCoordinate(30.0, -10.0), + QGeoCoordinate(10.0, 10.0)) + << true << true; + + QTest::newRow("non wrapped top right touch inside") + << b1 + << QGeoRectangle(QGeoCoordinate(30.0, 10.0), + QGeoCoordinate(10.0, 30.0)) + << true << true; + + QTest::newRow("non wrapped left touch inside") + << b1 + << QGeoRectangle(QGeoCoordinate(10.0, -30.0), + QGeoCoordinate(-10.0, -10.0)) + << true << true; + + QTest::newRow("non wrapped right touch inside") + << b1 + << QGeoRectangle(QGeoCoordinate(10.0, 10.0), + QGeoCoordinate(-10.0, 30.0)) + << true << true; + + QTest::newRow("non wrapped bottom left touch inside") + << b1 + << QGeoRectangle(QGeoCoordinate(-10.0, -30.0), + QGeoCoordinate(-30.0, -10.0)) + << true << true; + + QTest::newRow("non wrapped bottom touch inside") + << b1 + << QGeoRectangle(QGeoCoordinate(-10.0, -10.0), + QGeoCoordinate(-30.0, 10.0)) + << true << true; + + QTest::newRow("non wrapped bottom right touch inside") + << b1 + << QGeoRectangle(QGeoCoordinate(-10.0, 10.0), + QGeoCoordinate(-30.0, 30.0)) + << true << true; + + QTest::newRow("non wrapped top lon strip") + << b1 + << QGeoRectangle(QGeoCoordinate(40.0, -40.0), + QGeoCoordinate(20.0, 40.0)) + << false << true; + + QTest::newRow("non wrapped center lon strip") + << b1 + << QGeoRectangle(QGeoCoordinate(10.0, -40.0), + QGeoCoordinate(-10.0, 40.0)) + << false << true; + + QTest::newRow("non wrapped bottom lon strip") + << b1 + << QGeoRectangle(QGeoCoordinate(-20.0, -40.0), + QGeoCoordinate(-40.0, 40.0)) + << false << true; + + QTest::newRow("non wrapped left lat strip") + << b1 + << QGeoRectangle(QGeoCoordinate(40.0, -40.0), + QGeoCoordinate(-40.0, -20.0)) + << false << true; + + QTest::newRow("non wrapped center lat strip") + << b1 + << QGeoRectangle(QGeoCoordinate(40.0, -10.0), + QGeoCoordinate(-40.0, 10.0)) + << false << true; + + QTest::newRow("non wrapped right lat strip") + << b1 + << QGeoRectangle(QGeoCoordinate(40.0, 20.0), + QGeoCoordinate(-40.0, 40.0)) + << false << true; + + QGeoRectangle b2(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)); + + QTest::newRow("wrapped same") + << b2 + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << true << true; + + QTest::newRow("wrapped smaller") + << b2 + << QGeoRectangle(QGeoCoordinate(20.0, 160.0), + QGeoCoordinate(-20.0, -160.0)) + << true << true; + + QTest::newRow("wrapped larger") + << b2 + << QGeoRectangle(QGeoCoordinate(40.0, 140.0), + QGeoCoordinate(-40.0, -140.0)) + << false << true; + + QTest::newRow("wrapped outside top") + << b2 + << QGeoRectangle(QGeoCoordinate(80.0, 150.0), + QGeoCoordinate(50.0, -150.0)) + << false << false; + + QTest::newRow("wrapped outside bottom") + << b2 + << QGeoRectangle(QGeoCoordinate(-50.0, 150.0), + QGeoCoordinate(-80.0, -150.0)) + << false << false; + + QTest::newRow("wrapped outside left") + << b2 + << QGeoRectangle(QGeoCoordinate(30.0, 70.0), + QGeoCoordinate(-30.0, 130.0)) + << false << false; + + QTest::newRow("wrapped outside right") + << b2 + << QGeoRectangle(QGeoCoordinate(30.0, -130.0), + QGeoCoordinate(-30.0, -70.0)) + << false << false; + + QTest::newRow("wrapped top left cross") + << b2 + << QGeoRectangle(QGeoCoordinate(40.0, 140.0), + QGeoCoordinate(20.0, 160.0)) + << false << true; + + QTest::newRow("wrapped top cross") + << b2 + << QGeoRectangle(QGeoCoordinate(40.0, 170.0), + QGeoCoordinate(20.0, -170.0)) + << false << true; + + QTest::newRow("wrapped top right cross") + << b2 + << QGeoRectangle(QGeoCoordinate(40.0, -160.0), + QGeoCoordinate(20.0, -140.0)) + << false << true; + + QTest::newRow("wrapped left cross") + << b2 + << QGeoRectangle(QGeoCoordinate(10.0, 140.0), + QGeoCoordinate(-10.0, 160.0)) + << false << true; + + QTest::newRow("wrapped right cross") + << b2 + << QGeoRectangle(QGeoCoordinate(10.0, -160.0), + QGeoCoordinate(-10.0, -140.0)) + << false << true; + + QTest::newRow("wrapped bottom left cross") + << b2 + << QGeoRectangle(QGeoCoordinate(-20.0, 140.0), + QGeoCoordinate(-40.0, 160.0)) + << false << true; + + QTest::newRow("wrapped bottom cross") + << b2 + << QGeoRectangle(QGeoCoordinate(-20.0, 170.0), + QGeoCoordinate(-40.0, -170.0)) + << false << true; + + QTest::newRow("wrapped bottom right cross") + << b2 + << QGeoRectangle(QGeoCoordinate(-20.0, -160.0), + QGeoCoordinate(-40.0, -140.0)) + << false << true; + + QTest::newRow("wrapped top left touch outside") + << b2 + << QGeoRectangle(QGeoCoordinate(50.0, 130.0), + QGeoCoordinate(30.0, 150.0)) + << false << true; + + QTest::newRow("wrapped top touch outside") + << b2 + << QGeoRectangle(QGeoCoordinate(50.0, 170.0), + QGeoCoordinate(30.0, -170.0)) + << false << true; + + QTest::newRow("wrapped top right touch outside") + << b2 + << QGeoRectangle(QGeoCoordinate(50.0, -150.0), + QGeoCoordinate(30.0, -130.0)) + << false << true; + + QTest::newRow("wrapped left touch outside") + << b2 + << QGeoRectangle(QGeoCoordinate(10.0, 130.0), + QGeoCoordinate(-10.0, 150.0)) + << false << true; + + QTest::newRow("wrapped right touch outside") + << b2 + << QGeoRectangle(QGeoCoordinate(10.0, -150.0), + QGeoCoordinate(-10.0, -130.0)) + << false << true; + + QTest::newRow("wrapped bottom left touch outside") + << b2 + << QGeoRectangle(QGeoCoordinate(-30.0, 150.0), + QGeoCoordinate(-50.0, 130.0)) + << false << true; + + QTest::newRow("wrapped bottom touch outside") + << b2 + << QGeoRectangle(QGeoCoordinate(-30.0, 170.0), + QGeoCoordinate(-50.0, -170.0)) + << false << true; + + QTest::newRow("wrapped bottom right touch outside") + << b2 + << QGeoRectangle(QGeoCoordinate(-30.0, -150.0), + QGeoCoordinate(-50.0, -130.0)) + << false << true; + + QTest::newRow("wrapped top left touch inside") + << b2 + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(10.0, 170.0)) + << true << true; + + QTest::newRow("wrapped top touch inside") + << b2 + << QGeoRectangle(QGeoCoordinate(30.0, 170.0), + QGeoCoordinate(10.0, -170.0)) + << true << true; + + QTest::newRow("wrapped top right touch inside") + << b2 + << QGeoRectangle(QGeoCoordinate(30.0, -170.0), + QGeoCoordinate(10.0, -150.0)) + << true << true; + + QTest::newRow("wrapped left touch inside") + << b2 + << QGeoRectangle(QGeoCoordinate(10.0, 150.0), + QGeoCoordinate(-10.0, 170.0)) + << true << true; + + QTest::newRow("wrapped right touch inside") + << b2 + << QGeoRectangle(QGeoCoordinate(10.0, -170.0), + QGeoCoordinate(-10.0, -150.0)) + << true << true; + + QTest::newRow("wrapped bottom left touch inside") + << b2 + << QGeoRectangle(QGeoCoordinate(-10.0, 150.0), + QGeoCoordinate(-30.0, 170.0)) + << true << true; + + QTest::newRow("wrapped bottom touch inside") + << b2 + << QGeoRectangle(QGeoCoordinate(-10.0, 170.0), + QGeoCoordinate(-30.0, -170.0)) + << true << true; + + QTest::newRow("wrapped bottom right touch inside") + << b2 + << QGeoRectangle(QGeoCoordinate(-10.0, -170.0), + QGeoCoordinate(-30.0, -150.0)) + << true << true; + + QTest::newRow("wrapped top lon strip") + << b2 + << QGeoRectangle(QGeoCoordinate(40.0, 140.0), + QGeoCoordinate(20.0, -140.0)) + << false << true; + + QTest::newRow("wrapped center lon strip") + << b2 + << QGeoRectangle(QGeoCoordinate(10.0, 140.0), + QGeoCoordinate(-10.0, -140.0)) + << false << true; + + QTest::newRow("wrapped bottom lon strip") + << b2 + << QGeoRectangle(QGeoCoordinate(-20.0, 140.0), + QGeoCoordinate(-40.0, -140.0)) + << false << true; + + QTest::newRow("wrapped left lat strip") + << b2 + << QGeoRectangle(QGeoCoordinate(40.0, 140.0), + QGeoCoordinate(-40.0, 160.0)) + << false << true; + + QTest::newRow("wrapped center lat strip") + << b2 + << QGeoRectangle(QGeoCoordinate(40.0, 170.0), + QGeoCoordinate(-40.0, -170.0)) + << false << true; + + QTest::newRow("wrapped right lat strip") + << b2 + << QGeoRectangle(QGeoCoordinate(40.0, -160.0), + QGeoCoordinate(-40.0, -140.0)) + << false << true; + + QTest::newRow("north pole touching") + << QGeoRectangle(QGeoCoordinate(90.0, 20.0), + QGeoCoordinate(40.0, 40.0)) + << QGeoRectangle(QGeoCoordinate(90.0, 60.0), + QGeoCoordinate(30.0, 80.0)) + << false << true; + + QTest::newRow("south pole touching") + << QGeoRectangle(QGeoCoordinate(40.0, 20.0), + QGeoCoordinate(-90.0, 40.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 60.0), + QGeoCoordinate(-90.0, 80.0)) + << false << true; +} + +void tst_QGeoRectangle::translate() +{ + QFETCH(QGeoRectangle, box); + QFETCH(double, degreesLatitude); + QFETCH(double, degreesLongitude); + QFETCH(QGeoRectangle, newBox); + + QGeoRectangle test = box.translated(degreesLatitude, degreesLongitude); + QCOMPARE(test, newBox); + box.translate(degreesLatitude, degreesLongitude); + QCOMPARE(box, newBox); + +} + +void tst_QGeoRectangle::translate_data() +{ + QTest::addColumn("box"); + QTest::addColumn("degreesLatitude"); + QTest::addColumn("degreesLongitude"); + QTest::addColumn("newBox"); + + QTest::newRow("invalid") + << QGeoRectangle() + << 20.0 + << 20.0 + << QGeoRectangle(); + + QTest::newRow("360 width") + << QGeoRectangle(QGeoCoordinate(30.0, -180.0), + QGeoCoordinate(-30.0, 180.0)) + << 20.0 + << 20.0 + << QGeoRectangle(QGeoCoordinate(50.0, -180.0), + QGeoCoordinate(-10.0, 180.0)); + + QTest::newRow("180 height") + << QGeoRectangle(QGeoCoordinate(90.0, -30.0), + QGeoCoordinate(-90.0, 30.0)) + << 20.0 + << 20.0 + << QGeoRectangle(QGeoCoordinate(90.0, -10.0), + QGeoCoordinate(-90.0, 50.0)); + + QTest::newRow("non wrapping -> non wrapping") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << 20.0 + << 20.0 + << QGeoRectangle(QGeoCoordinate(50.0, -10.0), + QGeoCoordinate(-10.0, 50.0)); + + QTest::newRow("non wrapping -> wrapping") + << QGeoRectangle(QGeoCoordinate(30.0, 110.0), + QGeoCoordinate(-30.0, 170.0)) + << 20.0 + << 20.0 + << QGeoRectangle(QGeoCoordinate(50.0, 130.0), + QGeoCoordinate(-10.0, -170.0)); + + QTest::newRow("non wrapping -> north clip") + << QGeoRectangle(QGeoCoordinate(80.0, -30.0), + QGeoCoordinate(20.0, 30.0)) + << 20.0 + << 20.0 + << QGeoRectangle(QGeoCoordinate(90.0, -10.0), + QGeoCoordinate(30.0, 50.0)); + + QTest::newRow("non wrapping -> south clip") + << QGeoRectangle(QGeoCoordinate(-20.0, -30.0), + QGeoCoordinate(-80.0, 30.0)) + << -20.0 + << 20.0 + << QGeoRectangle(QGeoCoordinate(-30.0, -10.0), + QGeoCoordinate(-90.0, 50.0)); + + QTest::newRow("wrapping -> non wrapping") + << QGeoRectangle(QGeoCoordinate(30.0, 130.0), + QGeoCoordinate(-30.0, -170.0)) + << 20.0 + << -20.0 + << QGeoRectangle(QGeoCoordinate(50.0, 110.0), + QGeoCoordinate(-10.0, 170.0)); + + QTest::newRow("wrapping -> wrapping") + << QGeoRectangle(QGeoCoordinate(30.0, 130.0), + QGeoCoordinate(-30.0, -170.0)) + << 20.0 + << 20.0 + << QGeoRectangle(QGeoCoordinate(50.0, 150.0), + QGeoCoordinate(-10.0, -150.0)); + + QTest::newRow("wrapping -> north clip") + << QGeoRectangle(QGeoCoordinate(80.0, 130.0), + QGeoCoordinate(20.0, -170.0)) + << 20.0 + << 20.0 + << QGeoRectangle(QGeoCoordinate(90.0, 150.0), + QGeoCoordinate(30.0, -150.0)); + + QTest::newRow("wrapping -> south clip") + << QGeoRectangle(QGeoCoordinate(-20.0, 130.0), + QGeoCoordinate(-80.0, -170.0)) + << -20.0 + << 20.0 + << QGeoRectangle(QGeoCoordinate(-30.0, 150.0), + QGeoCoordinate(-90.0, -150.0)); +} + +void tst_QGeoRectangle::unite() +{ + QFETCH(QGeoRectangle, in1); + QFETCH(QGeoRectangle, in2); + QFETCH(QGeoRectangle, out); + + QCOMPARE(in1.united(in2), out); + QCOMPARE(in2.united(in1), out); + + QCOMPARE(in1 | in2, out); + QCOMPARE(in2 | in1, out); + + QGeoRectangle united1 = QGeoRectangle(in1); + united1 |= in2; + QCOMPARE(united1, out); + + QGeoRectangle united2 = QGeoRectangle(in2); + united2 |= in1; + QCOMPARE(united2, out); +} + +void tst_QGeoRectangle::unite_data() +{ + QTest::addColumn("in1"); + QTest::addColumn("in2"); + QTest::addColumn("out"); + + QTest::newRow("central and taller") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(50.0, -30.0), + QGeoCoordinate(-50.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(50.0, -30.0), + QGeoCoordinate(-50.0, 30.0)); + + QTest::newRow("central and 180 high") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(90.0, -30.0), + QGeoCoordinate(-90.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(90.0, -30.0), + QGeoCoordinate(-90.0, 30.0)); + + QTest::newRow("central and non overlapping higher") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(60.0, -30.0), + QGeoCoordinate(50.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(60.0, -30.0), + QGeoCoordinate(-30.0, 30.0)); + + QTest::newRow("central and overlapping higher") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(60.0, -30.0), + QGeoCoordinate(0.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(60.0, -30.0), + QGeoCoordinate(-30.0, 30.0)); + + QTest::newRow("central and touching higher") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(60.0, -30.0), + QGeoCoordinate(30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(60.0, -30.0), + QGeoCoordinate(-30.0, 30.0)); + + QTest::newRow("central and non overlapping lower") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(-50.0, -30.0), + QGeoCoordinate(-60.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-60.0, 30.0)); + + QTest::newRow("central and overlapping lower") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(0.0, -30.0), + QGeoCoordinate(-60.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-60.0, 30.0)); + + QTest::newRow("central and touching lower") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(-30.0, -30.0), + QGeoCoordinate(-60.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-60.0, 30.0)); + + QTest::newRow("non wrapping central and wider") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -50.0), + QGeoCoordinate(-30.0, 50.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -50.0), + QGeoCoordinate(-30.0, 50.0)); + + QTest::newRow("non wrapping central and 360 width") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -180.0), + QGeoCoordinate(-30.0, 180.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -180.0), + QGeoCoordinate(-30.0, 180.0)); + + QTest::newRow("non wrapping central and non overlapping non wrapping left") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -110.0), + QGeoCoordinate(-30.0, -50.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -110.0), + QGeoCoordinate(-30.0, 30.0)); + + QTest::newRow("non wrapping central and overlapping non wrapping left") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -80.0), + QGeoCoordinate(-30.0, -20.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -80.0), + QGeoCoordinate(-30.0, 30.0)); + + QTest::newRow("non wrapping central and touching non wrapping left") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -90.0), + QGeoCoordinate(-30.0, -30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -90.0), + QGeoCoordinate(-30.0, 30.0)); + + QTest::newRow("non wrapping central and non overlapping non wrapping right") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 50.0), + QGeoCoordinate(-30.0, 110.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 110.0)); + + QTest::newRow("non wrapping central and overlapping non wrapping right") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 20.0), + QGeoCoordinate(-30.0, 80.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 80.0)); + + QTest::newRow("non wrapping central and touching non wrapping right") + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 30.0), + QGeoCoordinate(-30.0, 90.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 90.0)); + + QTest::newRow("wrapping and wider") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 130.0), + QGeoCoordinate(-30.0, -130.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 130.0), + QGeoCoordinate(-30.0, -130.0)); + + QTest::newRow("wrapping and 360 width") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -180.0), + QGeoCoordinate(-30.0, 180.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -180.0), + QGeoCoordinate(-30.0, 180.0)); + + QTest::newRow("wrapping and non overlapping right") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -130.0), + QGeoCoordinate(-30.0, -70.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -70.0)); + + QTest::newRow("wrapping and overlapping right") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -160.0), + QGeoCoordinate(-30.0, -70.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -70.0)); + + QTest::newRow("wrapping and touching right") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -150.0), + QGeoCoordinate(-30.0, -90.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -90.0)); + + QTest::newRow("wrapping and non overlapping left") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 70.0), + QGeoCoordinate(-30.0, 130.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 70.0), + QGeoCoordinate(-30.0, -150.0)); + + QTest::newRow("wrapping and overlapping left") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 100.0), + QGeoCoordinate(-30.0, 160.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 100.0), + QGeoCoordinate(-30.0, -150.0)); + + QTest::newRow("wrapping and touching left") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 90.0), + QGeoCoordinate(-30.0, 150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 90.0), + QGeoCoordinate(-30.0, -150.0)); + + QTest::newRow("wrapping and non overlapping center") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -30.0), + QGeoCoordinate(-30.0, 30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -180.0), + QGeoCoordinate(-30.0, 180.0)); + + QTest::newRow("wrapping and overlapping center") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -160.0), + QGeoCoordinate(-30.0, 160.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -180.0), + QGeoCoordinate(-30.0, 180.0)); + + QTest::newRow("wrapping and touching center") + << QGeoRectangle(QGeoCoordinate(30.0, 150.0), + QGeoCoordinate(-30.0, -150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -150.0), + QGeoCoordinate(-30.0, 150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -180.0), + QGeoCoordinate(-30.0, 180.0)); + + QTest::newRow("wrapping and one containing other") + << QGeoRectangle(QGeoCoordinate(30.0, 40.0), + QGeoCoordinate(-30.0, -40.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 160.0), + QGeoCoordinate(-30.0, 170.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 40.0), + QGeoCoordinate(-30.0, -40.0)); + + QTest::newRow("small gap over zero line") + << QGeoRectangle(QGeoCoordinate(30.0, -20.0), + QGeoCoordinate(-30.0, -10.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 10.0), + QGeoCoordinate(-30.0, 20.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -20.0), + QGeoCoordinate(-30.0, 20.0)); + + QTest::newRow("small gap before zero line") + << QGeoRectangle(QGeoCoordinate(30.0, -40.0), + QGeoCoordinate(-30.0, -30.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -20.0), + QGeoCoordinate(-30.0, -10.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -40.0), + QGeoCoordinate(-30.0, -10.0)); + + QTest::newRow("small gap after zero line") + << QGeoRectangle(QGeoCoordinate(30.0, 10.0), + QGeoCoordinate(-30.0, 20.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 30.0), + QGeoCoordinate(-30.0, 40.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 10.0), + QGeoCoordinate(-30.0, 40.0)); + + QTest::newRow("small gap over dateline") + << QGeoRectangle(QGeoCoordinate(30.0, 160.0), + QGeoCoordinate(-30.0, 170.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -170.0), + QGeoCoordinate(-30.0, -160.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 160.0), + QGeoCoordinate(-30.0, -160.0)); + + QTest::newRow("small gap before dateline") + << QGeoRectangle(QGeoCoordinate(30.0, 140.0), + QGeoCoordinate(-30.0, 150.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 160.0), + QGeoCoordinate(-30.0, 170.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 140.0), + QGeoCoordinate(-30.0, 170.0)); + + QTest::newRow("small gap after dateline") + << QGeoRectangle(QGeoCoordinate(30.0, -170.0), + QGeoCoordinate(-30.0, -160.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -150.0), + QGeoCoordinate(-30.0, -140.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -170.0), + QGeoCoordinate(-30.0, -140.0)); + + QTest::newRow("90-degree inner gap over zero line") + << QGeoRectangle(QGeoCoordinate(30.0, -55.0), + QGeoCoordinate(-30.0, -45.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 45.0), + QGeoCoordinate(-30.0, 55.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -55.0), + QGeoCoordinate(-30.0, 55.0)); + + QTest::newRow("90-degree inner gap before zero line") + << QGeoRectangle(QGeoCoordinate(30.0, -20.0), + QGeoCoordinate(-30.0, -10.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -65.0), + QGeoCoordinate(-30.0, -55.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -65.0), + QGeoCoordinate(-30.0, -10.0)); + + QTest::newRow("90-degree inner gap after zero line") + << QGeoRectangle(QGeoCoordinate(30.0, 65.0), + QGeoCoordinate(-30.0, 75.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 10.0), + QGeoCoordinate(-30.0, 20.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 10.0), + QGeoCoordinate(-30.0, 75.0)); + + QTest::newRow("90-degree inner gap over dateline") + << QGeoRectangle(QGeoCoordinate(30.0, 125.0), + QGeoCoordinate(-30.0, 135.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -135.0), + QGeoCoordinate(-30.0, -125.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 125.0), + QGeoCoordinate(-30.0, -125.0)); + + QTest::newRow("90-degree inner gap before dateline") + << QGeoRectangle(QGeoCoordinate(30.0, 160.0), + QGeoCoordinate(-30.0, 170.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 50.0), + QGeoCoordinate(-30.0, 60.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 50.0), + QGeoCoordinate(-30.0, 170.0)); + + QTest::newRow("90-degree inner gap after dateline") + << QGeoRectangle(QGeoCoordinate(30.0, -170.0), + QGeoCoordinate(-30.0, -160.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -60.0), + QGeoCoordinate(-30.0, -50.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -170.0), + QGeoCoordinate(-30.0, -50.0)); + + QTest::newRow("180-degree inner gap centered on zero line") + << QGeoRectangle(QGeoCoordinate(30.0, -100.0), + QGeoCoordinate(-30.0, -90.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 90.0), + QGeoCoordinate(-30.0, 100.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 90.0), + QGeoCoordinate(-30.0, -90.0)); + + QTest::newRow("180-degree outer gap cenetered on zero line") + << QGeoRectangle(QGeoCoordinate(30.0, -90.0), + QGeoCoordinate(-30.0, -80.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 80.0), + QGeoCoordinate(-30.0, 90.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -90.0), + QGeoCoordinate(-30.0, 90.0)); + + QTest::newRow("180-degree shift centered on zero line") + << QGeoRectangle(QGeoCoordinate(30.0, -100.0), + QGeoCoordinate(-30.0, -80.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 80.0), + QGeoCoordinate(-30.0, 100.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -180.0), + QGeoCoordinate(-30.0, 180.0)); + + QTest::newRow("180-degree inner gap centered on dateline") + << QGeoRectangle(QGeoCoordinate(30.0, 80.0), + QGeoCoordinate(-30.0, 90.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -90.0), + QGeoCoordinate(-30.0, -80.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -90.0), + QGeoCoordinate(-30.0, 90.0)); + + QTest::newRow("180-degree outer gap centered on dateline") + << QGeoRectangle(QGeoCoordinate(30.0, 90.0), + QGeoCoordinate(-30.0, 100.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -100.0), + QGeoCoordinate(-30.0, -90.0)) + << QGeoRectangle(QGeoCoordinate(30.0, 90.0), + QGeoCoordinate(-30.0, -90.0)); + + QTest::newRow("180-degree shift centered on dateline") + << QGeoRectangle(QGeoCoordinate(30.0, 80.0), + QGeoCoordinate(-30.0, 100.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -100.0), + QGeoCoordinate(-30.0, -80.0)) + << QGeoRectangle(QGeoCoordinate(30.0, -180.0), + QGeoCoordinate(-30.0, 180.0)); + + QTest::newRow("Small outer gap centered on dateline") + << QGeoRectangle(QGeoCoordinate(30, 160), QGeoCoordinate(-30, 170)) + << QGeoRectangle(QGeoCoordinate(30, -170), QGeoCoordinate(-30, 160)) + << QGeoRectangle(QGeoCoordinate(30, -170), QGeoCoordinate(-30, 170)); + + QTest::newRow("Overlapping over the dateline") + << QGeoRectangle(QGeoCoordinate(30, 160), QGeoCoordinate(-30, 170)) + << QGeoRectangle(QGeoCoordinate(30, 160), QGeoCoordinate(-30, -170)) + << QGeoRectangle(QGeoCoordinate(30, 160), QGeoCoordinate(-30, -170)); + + QTest::newRow("wrappinng, one containing other, overlapping center") + << QGeoRectangle(QGeoCoordinate(30, 170), QGeoCoordinate(-30, -30)) + << QGeoRectangle(QGeoCoordinate(30, -140), QGeoCoordinate(-30, -50)) + << QGeoRectangle(QGeoCoordinate(30, 170), QGeoCoordinate(-30, -30)); +} + + +void tst_QGeoRectangle::extendRectangle() +{ + QFETCH(QGeoRectangle, box); + QFETCH(QGeoCoordinate, coord); + QFETCH(QGeoRectangle, out); + + box.extendRectangle(coord); + QCOMPARE(box, out); +} + +void tst_QGeoRectangle::extendRectangle_data() +{ + QTest::addColumn("box"); + QTest::addColumn("coord"); + QTest::addColumn("out"); + + QTest::newRow("valid rect - invalid coordinate") + << QGeoRectangle(QGeoCoordinate(30.0, -20.0), + QGeoCoordinate(-30.0, 20.0)) + << QGeoCoordinate(100.0, 190.0) + << QGeoRectangle(QGeoCoordinate(30.0, -20.0), + QGeoCoordinate(-30.0, 20)); + QTest::newRow("invalid rect - valid coordinate") + << QGeoRectangle() + << QGeoCoordinate(10.0, 10.0) + << QGeoRectangle(); + QTest::newRow("inside rect - not wrapped") + << QGeoRectangle(QGeoCoordinate(30.0, -20.0), + QGeoCoordinate(-30.0, 20.0)) + << QGeoCoordinate(10.0, 10.0) + << QGeoRectangle(QGeoCoordinate(30.0, -20.0), + QGeoCoordinate(-30.0, 20)); + QTest::newRow("lat outside rect - not wrapped") + << QGeoRectangle(QGeoCoordinate(30.0, -20.0), + QGeoCoordinate(-30.0, 20.0)) + << QGeoCoordinate(40.0, 10.0) + << QGeoRectangle(QGeoCoordinate(40.0, -20.0), + QGeoCoordinate(-30.0, 20)); + QTest::newRow("positive lon outside rect - not wrapped") + << QGeoRectangle(QGeoCoordinate(30.0, -20.0), + QGeoCoordinate(-30.0, 20.0)) + << QGeoCoordinate(10.0, 40.0) + << QGeoRectangle(QGeoCoordinate(30.0, -20.0), + QGeoCoordinate(-30.0, 40)); + QTest::newRow("negative lon outside rect - not wrapped") + << QGeoRectangle(QGeoCoordinate(30.0, -20.0), + QGeoCoordinate(-30.0, 20.0)) + << QGeoCoordinate(10.0, -40.0) + << QGeoRectangle(QGeoCoordinate(30.0, -40.0), + QGeoCoordinate(-30.0, 20.0)); + QTest::newRow("inside rect - wrapped") + << QGeoRectangle(QGeoCoordinate(30.0, 160.0), + QGeoCoordinate(-30.0, -160.0)) + << QGeoCoordinate(10.0, -170.0) + << QGeoRectangle(QGeoCoordinate(30.0, 160.0), + QGeoCoordinate(-30.0, -160.0)); + QTest::newRow("lat outside rect - wrapped") + << QGeoRectangle(QGeoCoordinate(30.0, 160.0), + QGeoCoordinate(-30.0, -160.0)) + << QGeoCoordinate(-40.0, -170.0) + << QGeoRectangle(QGeoCoordinate(30.0, 160.0), + QGeoCoordinate(-40.0, -160.0)); + QTest::newRow("positive lon outside rect - wrapped") + << QGeoRectangle(QGeoCoordinate(30.0, 160.0), + QGeoCoordinate(-30.0, -160.0)) + << QGeoCoordinate(10.0, 140.0) + << QGeoRectangle(QGeoCoordinate(30.0, 140.0), + QGeoCoordinate(-30.0, -160.0)); + QTest::newRow("negative lon outside rect - wrapped") + << QGeoRectangle(QGeoCoordinate(30.0, 160.0), + QGeoCoordinate(-30.0, -160.0)) + << QGeoCoordinate(10.0, -140.0) + << QGeoRectangle(QGeoCoordinate(30.0, 160.0), + QGeoCoordinate(-30.0, -140.0)); + QTest::newRow("extending over 180 degree line eastward") + << QGeoRectangle(QGeoCoordinate(30.0, 130.0), + QGeoCoordinate(-30.0, 160.0)) + << QGeoCoordinate(10.0, -170.0) + << QGeoRectangle(QGeoCoordinate(30.0, 130.0), + QGeoCoordinate(-30.0, -170)); + QTest::newRow("extending over -180 degree line westward") + << QGeoRectangle(QGeoCoordinate(30.0, -160.0), + QGeoCoordinate(-30.0, -130.0)) + << QGeoCoordinate(10.0, 170.0) + << QGeoRectangle(QGeoCoordinate(30.0, 170.0), + QGeoCoordinate(-30.0, -130)); +} + +void tst_QGeoRectangle::areaComparison_data() +{ + QTest::addColumn("area"); + QTest::addColumn("box"); + QTest::addColumn("equal"); + + QGeoRectangle b1(QGeoCoordinate(10.0, 0.0), QGeoCoordinate(0.0, 10.0)); + QGeoRectangle b2(QGeoCoordinate(20.0, 0.0), QGeoCoordinate(0.0, 20.0)); + QGeoCircle c(QGeoCoordinate(0.0, 0.0), 10); + + QTest::newRow("default constructed") << QGeoShape() << QGeoRectangle() << false; + QTest::newRow("b1 b1") << QGeoShape(b1) << b1 << true; + QTest::newRow("b1 b2") << QGeoShape(b1) << b2 << false; + QTest::newRow("b2 b1") << QGeoShape(b2) << b1 << false; + QTest::newRow("b2 b2") << QGeoShape(b2) << b2 << true; + QTest::newRow("c b1") << QGeoShape(c) << b1 << false; +} + +void tst_QGeoRectangle::areaComparison() +{ + QFETCH(QGeoShape, area); + QFETCH(QGeoRectangle, box); + QFETCH(bool, equal); + + QCOMPARE((area == box), equal); + QCOMPARE((area != box), !equal); + + QCOMPARE((box == area), equal); + QCOMPARE((box != area), !equal); +} + +void tst_QGeoRectangle::circleComparison_data() +{ + QTest::addColumn("circle"); + QTest::addColumn("box"); + QTest::addColumn("equal"); + + QGeoRectangle b(QGeoCoordinate(10.0, 0.0), QGeoCoordinate(0.0, 10.0)); + QGeoCircle c(QGeoCoordinate(0.0, 0.0), 10); + + QTest::newRow("default constructed") << QGeoCircle() << QGeoRectangle() << false; + QTest::newRow("c b") << c << b << false; +} + +void tst_QGeoRectangle::circleComparison() +{ + QFETCH(QGeoCircle, circle); + QFETCH(QGeoRectangle, box); + QFETCH(bool, equal); + + QCOMPARE((circle == box), equal); + QCOMPARE((circle != box), !equal); + + QCOMPARE((box == circle), equal); + QCOMPARE((box != circle), !equal); +} + +void tst_QGeoRectangle::hashing() +{ + const QGeoRectangle rectangle(QGeoCoordinate(10.0, 0.0), QGeoCoordinate(0.0, 10.0)); + const size_t rectangleHash = qHash(rectangle); + + QGeoRectangle otherTopLeftRectangle = rectangle; + otherTopLeftRectangle.setTopLeft(QGeoCoordinate(20.0, 0.0)); + QVERIFY(qHash(otherTopLeftRectangle) != rectangleHash); + + QGeoRectangle otherBottomRightRectangle = rectangle; + otherBottomRightRectangle.setBottomRight(QGeoCoordinate(0.0, 5.0)); + QVERIFY(qHash(otherBottomRightRectangle) != rectangleHash); + + // Do not assign, so that they do not share same d_ptr + QGeoRectangle similarRectangle(QGeoCoordinate(10.0, 0.0), QGeoCoordinate(0.0, 10.0)); + QCOMPARE(qHash(similarRectangle), rectangleHash); +} + +QTEST_MAIN(tst_QGeoRectangle) +#include "tst_qgeorectangle.moc" + diff --git a/tests/auto/qgeosatelliteinfo/CMakeLists.txt b/tests/auto/qgeosatelliteinfo/CMakeLists.txt new file mode 100644 index 0000000..f556df4 --- /dev/null +++ b/tests/auto/qgeosatelliteinfo/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeosatelliteinfo.pro. + +##################################################################### +## tst_qgeosatelliteinfo Test: +##################################################################### + +qt_internal_add_test(tst_qgeosatelliteinfo + SOURCES + tst_qgeosatelliteinfo.cpp + LIBRARIES + Qt::Core + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:qgeosatelliteinfo.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/qgeosatelliteinfo/tst_qgeosatelliteinfo.cpp b/tests/auto/qgeosatelliteinfo/tst_qgeosatelliteinfo.cpp new file mode 100644 index 0000000..0cc92a5 --- /dev/null +++ b/tests/auto/qgeosatelliteinfo/tst_qgeosatelliteinfo.cpp @@ -0,0 +1,420 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +//TESTED_COMPONENT=src/location + +#include + +#include +#include +#include +#include + +#include +#include + +QT_USE_NAMESPACE +Q_DECLARE_METATYPE(QGeoSatelliteInfo::Attribute) + +QByteArray tst_qgeosatelliteinfo_debug; + +void tst_qgeosatelliteinfo_messageHandler(QtMsgType type, const QMessageLogContext &, const QString &msg) +{ + switch (type) { + case QtDebugMsg : + tst_qgeosatelliteinfo_debug = msg.toLocal8Bit(); + break; + default: + break; + } +} + + +QList tst_qgeosatelliteinfo_qrealTestValues() +{ + QList values; + + if (qreal(DBL_MIN) == DBL_MIN) + values << DBL_MIN; + + values << FLT_MIN; + values << -1.0 << 0.0 << 1.0; + values << FLT_MAX; + + if (qreal(DBL_MAX) == DBL_MAX) + values << DBL_MAX; + + return values; +} + +QList tst_qgeosatelliteinfo_intTestValues() +{ + QList values; + values << INT_MIN << -100 << 0 << 100 << INT_MAX; + return values; +} + +QList tst_qgeosatelliteinfo_getAttributes() +{ + QList attributes; + attributes << QGeoSatelliteInfo::Elevation + << QGeoSatelliteInfo::Azimuth; + return attributes; +} + + +class tst_QGeoSatelliteInfo : public QObject +{ + Q_OBJECT + +private: + QGeoSatelliteInfo updateWithAttribute(QGeoSatelliteInfo::Attribute attribute, qreal value) + { + QGeoSatelliteInfo info; + info.setAttribute(attribute, value); + return info; + } + + void addTestData_update() + { + QTest::addColumn("info"); + + QList intValues = tst_qgeosatelliteinfo_intTestValues(); + + for (int i=0; i attributes = tst_qgeosatelliteinfo_getAttributes(); + QList qrealValues = tst_qgeosatelliteinfo_qrealTestValues(); + for (int i=0; i attributes = tst_qgeosatelliteinfo_getAttributes(); + for (int i=0; i("signal"); + + QList intValues = tst_qgeosatelliteinfo_intTestValues(); + for (int i=0; i("satId"); + + QList intValues = tst_qgeosatelliteinfo_intTestValues(); + for (int i=0; i(system)); + QCOMPARE(info.satelliteSystem(), static_cast(system)); + } + + void setSatelliteSystem_data() + { + QTest::addColumn("system"); + + QTest::newRow("Sat system undefined") + << int(QGeoSatelliteInfo::Undefined); + QTest::newRow("Sat system GPS") + << int(QGeoSatelliteInfo::GPS); + QTest::newRow("Sat system GLONASS") + << int(QGeoSatelliteInfo::GLONASS); + } + + void attribute() + { + QFETCH(QGeoSatelliteInfo::Attribute, attribute); + QFETCH(qreal, value); + + QGeoSatelliteInfo u; + QCOMPARE(u.attribute(attribute), qreal(-1.0)); + + u.setAttribute(attribute, value); + QCOMPARE(u.attribute(attribute), value); + u.removeAttribute(attribute); + QCOMPARE(u.attribute(attribute), qreal(-1.0)); + } + + void attribute_data() + { + QTest::addColumn("attribute"); + QTest::addColumn("value"); + + QList props; + props << QGeoSatelliteInfo::Elevation + << QGeoSatelliteInfo::Azimuth; + for (int i=0; i> inInfo; + QCOMPARE(inInfo, info); + } + + void datastream_data() + { + addTestData_update(); + } + + void debug() + { + QFETCH(QGeoSatelliteInfo, info); + QFETCH(int, nextValue); + QFETCH(QByteArray, debugString); + + qInstallMessageHandler(tst_qgeosatelliteinfo_messageHandler); + qDebug() << info << nextValue; + qInstallMessageHandler(0); + QCOMPARE(QString(tst_qgeosatelliteinfo_debug), QString(debugString)); + } + + void debug_data() + { + QTest::addColumn("info"); + QTest::addColumn("nextValue"); + QTest::addColumn("debugString"); + + QGeoSatelliteInfo info; + + QTest::newRow("uninitialized") << info << 45 + << QByteArray("QGeoSatelliteInfo(system=QGeoSatelliteInfo::Undefined, " + "satId=-1, signal-strength=-1) 45"); + + info = QGeoSatelliteInfo(); + info.setSignalStrength(1); + QTest::newRow("with SignalStrength") << info << 60 + << QByteArray("QGeoSatelliteInfo(system=QGeoSatelliteInfo::Undefined, " + "satId=-1, signal-strength=1) 60"); + + info = QGeoSatelliteInfo(); + info.setSatelliteIdentifier(1); + QTest::newRow("with SatelliteIdentifier") << info << -1 + << QByteArray("QGeoSatelliteInfo(system=QGeoSatelliteInfo::Undefined, " + "satId=1, signal-strength=-1) -1"); + + info = QGeoSatelliteInfo(); + info.setSatelliteSystem(QGeoSatelliteInfo::GPS); + QTest::newRow("with System GPS") << info << 1 + << QByteArray("QGeoSatelliteInfo(system=QGeoSatelliteInfo::GPS, " + "satId=-1, signal-strength=-1) 1"); + + info = QGeoSatelliteInfo(); + info.setSatelliteSystem(QGeoSatelliteInfo::GLONASS); + QTest::newRow("with System GLONASS") << info << 56 + << QByteArray("QGeoSatelliteInfo(system=QGeoSatelliteInfo::GLONASS, " + "satId=-1, signal-strength=-1) 56"); + + info = QGeoSatelliteInfo(); + info.setAttribute(QGeoSatelliteInfo::Elevation, 1.1); + QTest::newRow("with Elevation") << info << 0 + << QByteArray("QGeoSatelliteInfo(system=QGeoSatelliteInfo::Undefined, " + "satId=-1, signal-strength=-1, Elevation=1.1) 0"); + + info = QGeoSatelliteInfo(); + info.setAttribute(QGeoSatelliteInfo::Azimuth, 1.1); + QTest::newRow("with Azimuth") << info << 45 + << QByteArray("QGeoSatelliteInfo(system=QGeoSatelliteInfo::Undefined, " + "satId=-1, signal-strength=-1, Azimuth=1.1) 45"); + } +}; + + +QTEST_APPLESS_MAIN(tst_QGeoSatelliteInfo) +#include "tst_qgeosatelliteinfo.moc" diff --git a/tests/auto/qgeosatelliteinfosource/CMakeLists.txt b/tests/auto/qgeosatelliteinfosource/CMakeLists.txt new file mode 100644 index 0000000..9de6dab --- /dev/null +++ b/tests/auto/qgeosatelliteinfosource/CMakeLists.txt @@ -0,0 +1,25 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeosatelliteinfosource.pro. + +##################################################################### +## tst_qgeosatelliteinfosource Binary: +##################################################################### + +qt_internal_add_test(tst_qgeosatelliteinfosource + SOURCES + ../utils/qlocationtestutils.cpp ../utils/qlocationtestutils_p.h + testqgeosatelliteinfosource.cpp testqgeosatelliteinfosource_p.h + tst_qgeosatelliteinfosource.cpp + LIBRARIES + Qt::Core + Qt::Positioning + Qt::TestPrivate +) + +#### Keys ignored in scope 1:.:.:qgeosatelliteinfosource.pro:: +# TEMPLATE = "app" + +## Scopes: +##################################################################### diff --git a/tests/auto/qgeosatelliteinfosource/testqgeosatelliteinfosource.cpp b/tests/auto/qgeosatelliteinfosource/testqgeosatelliteinfosource.cpp new file mode 100644 index 0000000..9391511 --- /dev/null +++ b/tests/auto/qgeosatelliteinfosource/testqgeosatelliteinfosource.cpp @@ -0,0 +1,745 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include + +#include +#include + +#include "testqgeosatelliteinfosource_p.h" +#include "../utils/qlocationtestutils_p.h" + +Q_DECLARE_METATYPE(QList) +Q_DECLARE_METATYPE(QGeoSatelliteInfoSource::Error) + +#define MAX_WAITING_TIME 50000 + +// Must provide a valid source, unless testing the source +// returned by QGeoSatelliteInfoSource::createDefaultSource() on a system +// that has no default source +#define CHECK_SOURCE_VALID { \ + if (!m_source) { \ + if (m_testingDefaultSource && QGeoSatelliteInfoSource::createDefaultSource(0) == 0) \ + QSKIP("No default satellite source on this system"); \ + else \ + QFAIL("createTestSource() must return a valid source!"); \ + } \ + } + +class MySatelliteSource : public QGeoSatelliteInfoSource +{ + Q_OBJECT +public: + MySatelliteSource(QObject *parent = 0) + : QGeoSatelliteInfoSource(parent) { + } + virtual void startUpdates() override {} + virtual void stopUpdates() override {} + virtual void requestUpdate(int) override {} + virtual int minimumUpdateInterval() const override { + return 0; + } + Error error() const override { return QGeoSatelliteInfoSource::NoError; } +}; + + +class DefaultSourceTest : public TestQGeoSatelliteInfoSource +{ + Q_OBJECT +protected: + QGeoSatelliteInfoSource *createTestSource() override { + return QGeoSatelliteInfoSource::createDefaultSource(0); + } +}; + +TestQGeoSatelliteInfoSource::TestQGeoSatelliteInfoSource(QObject *parent) + : QObject(parent) +{ + qRegisterMetaType(); + + m_testingDefaultSource = false; +} + +TestQGeoSatelliteInfoSource *TestQGeoSatelliteInfoSource::createDefaultSourceTest() +{ + DefaultSourceTest *test = new DefaultSourceTest; + test->m_testingDefaultSource = true; + return test; +} + +void TestQGeoSatelliteInfoSource::base_initTestCase() +{ + qRegisterMetaType >(); +} + +void TestQGeoSatelliteInfoSource::base_init() +{ + m_source = createTestSource(); + m_testSlot2Called = false; +} + +void TestQGeoSatelliteInfoSource::base_cleanup() +{ + delete m_source; + m_source = 0; +} + +void TestQGeoSatelliteInfoSource::base_cleanupTestCase() +{ +} + +void TestQGeoSatelliteInfoSource::initTestCase() +{ + base_initTestCase(); +} + +void TestQGeoSatelliteInfoSource::init() +{ + base_init(); +} + +void TestQGeoSatelliteInfoSource::cleanup() +{ + base_cleanup(); +} + +void TestQGeoSatelliteInfoSource::cleanupTestCase() +{ + base_cleanupTestCase(); +} + +void TestQGeoSatelliteInfoSource::test_slot1() +{ +} + +void TestQGeoSatelliteInfoSource::test_slot2() +{ + m_testSlot2Called = true; +} + +void TestQGeoSatelliteInfoSource::constructor_withParent() +{ + auto parent = std::make_unique(); + new MySatelliteSource(parent.get()); +} + +void TestQGeoSatelliteInfoSource::constructor_noParent() +{ + MySatelliteSource *obj = new MySatelliteSource(); + delete obj; +} + +void TestQGeoSatelliteInfoSource::createDefaultSource() +{ + auto parent = std::make_unique(); + // source will be deleted by parent + QGeoSatelliteInfoSource *source = QGeoSatelliteInfoSource::createDefaultSource(parent.get()); + + // Check that default satellite source is successfully created. + if (!QGeoSatelliteInfoSource::availableSources().isEmpty()) + QVERIFY(source); + else + QVERIFY(!source); +} + +void TestQGeoSatelliteInfoSource::createDefaultSource_noParent() +{ + std::unique_ptr source( + QGeoSatelliteInfoSource::createDefaultSource(0)); + + // Check that default satellite source is successfully created. + if (!QGeoSatelliteInfoSource::availableSources().isEmpty()) + QVERIFY(source); + else + QVERIFY(!source); +} + +void TestQGeoSatelliteInfoSource::updateInterval() +{ + MySatelliteSource s; + QCOMPARE(s.updateInterval(), 0); +} + +void TestQGeoSatelliteInfoSource::setUpdateInterval() +{ + CHECK_SOURCE_VALID; + + QFETCH(int, interval); + QFETCH(int, expectedInterval); + + m_source->setUpdateInterval(interval); + QCOMPARE(m_source->updateInterval(), expectedInterval); +} + +void TestQGeoSatelliteInfoSource::setUpdateInterval_data() +{ + QTest::addColumn("interval"); + QTest::addColumn("expectedInterval"); + QGeoSatelliteInfoSource *source = createTestSource(); + int minUpdateInterval = source ? source->minimumUpdateInterval() : -1; + if (source) + delete source; + + QTest::newRow("0") << 0 << 0; + + if (minUpdateInterval > -1) { + QTest::newRow("INT_MIN") << INT_MIN << minUpdateInterval; + QTest::newRow("-1") << -1 << minUpdateInterval; + } + + if (minUpdateInterval > 0) { + QTest::newRow("more than minInterval") << minUpdateInterval + 1 << minUpdateInterval + 1; + QTest::newRow("equal to minInterval") << minUpdateInterval << minUpdateInterval; + } + + if (minUpdateInterval > 1) { + QTest::newRow("less then minInterval") << minUpdateInterval - 1 << minUpdateInterval; + QTest::newRow("in btw zero and minInterval") << 1 << minUpdateInterval; + } +} + +void TestQGeoSatelliteInfoSource::minimumUpdateInterval() +{ + CHECK_SOURCE_VALID; + + QVERIFY(m_source->minimumUpdateInterval() > 0); +} + +void TestQGeoSatelliteInfoSource::startUpdates_testIntervals() +{ + CHECK_SOURCE_VALID; + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->setUpdateInterval(1000); + const int interval = 10000; + + m_source->startUpdates(); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() == 1) && (spyUse.size() == 1), interval); + for (int i = 0; i < 6; i++) { + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() == 1) && (spyUse.size() == 1) && (errorSpy.size() == 0), interval); + spyView.clear(); + spyUse.clear(); + } + m_source->stopUpdates(); +} + + +void TestQGeoSatelliteInfoSource::startUpdates_testIntervalChangesWhileRunning() +{ + // There are two ways of dealing with an interval change, and we have left it system dependent. + // The interval can be changed will running or after the next update. + // WinCE uses the first method, S60 uses the second method. + + // The minimum interval on the symbian emulator is 5000 msecs, which is why the times in + // this test are as high as they are. + + CHECK_SOURCE_VALID; + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->setUpdateInterval(0); + m_source->startUpdates(); + m_source->setUpdateInterval(0); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() > 0) && (spyUse.size() > 0), 7000); + QCOMPARE(errorSpy.size(), 0); + spyView.clear(); + spyUse.clear(); + + m_source->setUpdateInterval(1000); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() == 2) && (spyUse.size() == 2) && (errorSpy.size() == 0), 15000); + spyView.clear(); + spyUse.clear(); + + m_source->setUpdateInterval(2000); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() == 2) && (spyUse.size() == 2) && (errorSpy.size() == 0), 30000); + spyView.clear(); + spyUse.clear(); + + m_source->setUpdateInterval(1000); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() == 2) && (spyUse.size() == 2) && (errorSpy.size() == 0), 15000); + spyView.clear(); + spyUse.clear(); + + m_source->setUpdateInterval(1000); + + QTRY_VERIFY_WITH_TIMEOUT( (spyView.size() == 2) && (spyUse.size() == 2) && (errorSpy.size() == 0), 15000); + spyView.clear(); + spyUse.clear(); + + m_source->setUpdateInterval(0); + + QTRY_VERIFY_WITH_TIMEOUT( (spyView.size() > 0 ) && (spyUse.size() > 0) && (errorSpy.size() == 0), 7000); + spyView.clear(); + spyUse.clear(); + + m_source->setUpdateInterval(0); + + QTRY_VERIFY_WITH_TIMEOUT( (spyView.size() > 0 ) && (spyUse.size() > 0) && (errorSpy.size() == 0), 7000); + spyView.clear(); + spyUse.clear(); + m_source->stopUpdates(); +} + +void TestQGeoSatelliteInfoSource::startUpdates_testDefaultInterval() +{ + CHECK_SOURCE_VALID; + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->startUpdates(); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + for (int i = 0; i < 3; i++) { + QTRY_VERIFY_WITH_TIMEOUT( (spyView.size() > 0 ) && (spyUse.size() > 0) && (errorSpy.size() == 0), 7000); + spyView.clear(); + spyUse.clear(); + } + m_source->stopUpdates(); +} + +void TestQGeoSatelliteInfoSource::startUpdates_testZeroInterval() +{ + CHECK_SOURCE_VALID; + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->setUpdateInterval(0); + m_source->startUpdates(); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + for (int i = 0; i < 3; i++) { + QTRY_VERIFY_WITH_TIMEOUT( (spyView.size() > 0 ) && (spyUse.size() > 0) && (errorSpy.size() == 0), 7000); + spyView.clear(); + spyUse.clear(); + } + m_source->stopUpdates(); +} + +void TestQGeoSatelliteInfoSource::startUpdates_moreThanOnce() +{ + CHECK_SOURCE_VALID; + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->setUpdateInterval(0); + m_source->startUpdates(); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + m_source->startUpdates(); // check there is no crash + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() > 0) && (spyUse.size() > 0), MAX_WAITING_TIME); + + m_source->startUpdates(); // check there is no crash + + m_source->stopUpdates(); +} + +void TestQGeoSatelliteInfoSource::stopUpdates() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->setUpdateInterval(1000); + m_source->startUpdates(); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + for (int i = 0; i < 2; i++) { + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() == 1) && (spyUse.size() == 1), 12000); + spyView.clear(); + spyUse.clear(); + } + + m_source->stopUpdates(); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() == 0) && (spyUse.size() == 0), 12000); +} + +void TestQGeoSatelliteInfoSource::stopUpdates_withoutStart() +{ + CHECK_SOURCE_VALID; + + m_source->stopUpdates(); // check there is no crash +} + +void TestQGeoSatelliteInfoSource::requestUpdate() +{ + CHECK_SOURCE_VALID; + + QFETCH(int, timeout); + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->requestUpdate(timeout); + + if (!errorSpy.isEmpty()) { + // make sure that it's the UpdateTimeoutError + const auto error = errorSpy[0][0].value(); + QCOMPARE(error, QGeoSatelliteInfoSource::UpdateTimeoutError); + // errorSpy.clear(); // no need to clear the error, as we are expecting it + } + + // Geoclue may deliver update instantly if there is a satellite fix + QTRY_VERIFY_WITH_TIMEOUT(!errorSpy.isEmpty() || !spyView.isEmpty(), 10); + if (!errorSpy.isEmpty()) { + // make sure that it's the UpdateTimeoutError + const auto error = errorSpy[0][0].value(); + QCOMPARE(error, QGeoSatelliteInfoSource::UpdateTimeoutError); + } +} + +void TestQGeoSatelliteInfoSource::requestUpdate_data() +{ + QTest::addColumn("timeout"); + QTest::newRow("less than zero") << -1; + QTest::newRow("very small timeout") << 1; +} + +void TestQGeoSatelliteInfoSource::requestUpdate_validTimeout() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->requestUpdate(1500); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + QTRY_VERIFY_WITH_TIMEOUT( + (spyView.size() == 1) && (spyUse.size() == 1 && (errorSpy.size()) == 0), 7000); +} + +void TestQGeoSatelliteInfoSource::requestUpdate_defaultTimeout() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->requestUpdate(0); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + QTRY_VERIFY_WITH_TIMEOUT( + (spyView.size() == 1) && (spyUse.size() == 1 && (errorSpy.size()) == 0), + MAX_WAITING_TIME); +} + +void TestQGeoSatelliteInfoSource::requestUpdate_timeoutLessThanMinimumInterval() +{ + CHECK_SOURCE_VALID; + + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->requestUpdate(1); + + QTRY_COMPARE_WITH_TIMEOUT(errorSpy.size(), 1, 1000); + const auto error = errorSpy[0][0].value(); + QCOMPARE(error, QGeoSatelliteInfoSource::UpdateTimeoutError); +} + +void TestQGeoSatelliteInfoSource::requestUpdate_repeatedCalls() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->requestUpdate(1500); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() == 1) && (spyUse.size() == 1), 7000); + spyView.clear(); + spyUse.clear(); + + m_source->requestUpdate(1500); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() == 1) && (spyUse.size() == 1), 7000); +} + +void TestQGeoSatelliteInfoSource::requestUpdate_overlappingCalls() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->requestUpdate(1500); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + m_source->requestUpdate(1500); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() == 1) && (spyUse.size() == 1), 7000); +} + +void TestQGeoSatelliteInfoSource::requestUpdate_overlappingCallsWithTimeout() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->requestUpdate(0); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + m_source->requestUpdate(1); + + QTRY_COMPARE_WITH_TIMEOUT(errorSpy.size(), 0, 7000); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() == 1) && (spyUse.size() == 1), 7000); +} + +void TestQGeoSatelliteInfoSource::requestUpdateAfterStartUpdates_ZeroInterval() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->setUpdateInterval(0); + m_source->startUpdates(); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() >= 1) && (spyUse.size() >= 1), MAX_WAITING_TIME); + spyView.clear(); + spyUse.clear(); + + m_source->requestUpdate(1500); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() >= 1) && (spyUse.size() >= 1) + && (errorSpy.size() == 0), 7000); + + spyView.clear(); + spyUse.clear(); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() >= 1) && (spyUse.size() >= 1), 12000); + + m_source->stopUpdates(); +} + +void TestQGeoSatelliteInfoSource::requestUpdateAfterStartUpdates_SmallInterval() +{ + CHECK_SOURCE_VALID; + + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->setUpdateInterval(3000); + m_source->requestUpdate(1500); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + m_source->startUpdates(); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() > 0) && (spyUse.size() > 0) + && (errorSpy.size() == 0), 7000); + + spyView.clear(); + spyUse.clear(); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() == 1) && (spyUse.size() == 1), 12000); + + m_source->stopUpdates(); +} + +void TestQGeoSatelliteInfoSource::requestUpdateBeforeStartUpdates_ZeroInterval() +{ + CHECK_SOURCE_VALID; + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->requestUpdate(1500); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + m_source->setUpdateInterval(0); + m_source->startUpdates(); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() >= 2) && (spyUse.size() >= 2) && (errorSpy.size() == 0), 14000); + spyView.clear(); + spyUse.clear(); + + QTest::qWait(1500); + + QCOMPARE(errorSpy.size(), 0); + + m_source->stopUpdates(); +} + +void TestQGeoSatelliteInfoSource::requestUpdateBeforeStartUpdates_SmallInterval() +{ + CHECK_SOURCE_VALID; + QSignalSpy spyView(m_source, + SIGNAL(satellitesInViewUpdated(QList))); + QSignalSpy spyUse(m_source, + SIGNAL(satellitesInUseUpdated(QList))); + QSignalSpy errorSpy(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error))); + + m_source->requestUpdate(1500); + + if (!errorSpy.isEmpty()) + QSKIP("Error starting satellite updates."); + + m_source->setUpdateInterval(2000); + m_source->startUpdates(); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() > 0) && (spyUse.size() > 0) && (errorSpy.size() == 0), 7000); + spyView.clear(); + spyUse.clear(); + + QTRY_VERIFY_WITH_TIMEOUT((spyView.size() > 0) && (spyUse.size() > 0) && (errorSpy.size() == 0), 20000); + + m_source->stopUpdates(); +} + + + +void TestQGeoSatelliteInfoSource::removeSlotForRequestTimeout() +{ + CHECK_SOURCE_VALID; + + bool i = connect(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error)), + this, SLOT(test_slot1())); + QVERIFY(i==true); + i = connect(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error)), \ + this, SLOT(test_slot2())); + QVERIFY(i==true); + i = disconnect(m_source, SIGNAL(errorOccurred(QGeoSatelliteInfoSource::Error)), + this, SLOT(test_slot1())); + QVERIFY(i==true); + + m_source->requestUpdate(-1); + QTRY_VERIFY_WITH_TIMEOUT((m_testSlot2Called == true), 1000); +} + +void TestQGeoSatelliteInfoSource::removeSlotForSatellitesInUseUpdated() +{ + CHECK_SOURCE_VALID; + + bool i = connect(m_source, SIGNAL(satellitesInUseUpdated(QList)), this, SLOT(test_slot1())); + QVERIFY(i == true); + i = connect(m_source, SIGNAL(satellitesInUseUpdated(QList)), this, SLOT(test_slot2())); + QVERIFY(i == true); + i = disconnect(m_source, SIGNAL(satellitesInUseUpdated(QList)), this, SLOT(test_slot1())); + QVERIFY(i == true); + + m_source->requestUpdate(1500); + + if (m_source->error() != QGeoSatelliteInfoSource::NoError) + QSKIP("Error starting satellite updates."); + + QTRY_VERIFY_WITH_TIMEOUT((m_testSlot2Called == true), 7000); +} + +void TestQGeoSatelliteInfoSource::removeSlotForSatellitesInViewUpdated() +{ + CHECK_SOURCE_VALID; + + bool i = connect(m_source, SIGNAL(satellitesInViewUpdated(QList)), this, SLOT(test_slot1())); + QVERIFY(i == true); + i = connect(m_source, SIGNAL(satellitesInViewUpdated(QList)), this, SLOT(test_slot2())); + QVERIFY(i == true); + i = disconnect(m_source, SIGNAL(satellitesInViewUpdated(QList)), this, SLOT(test_slot1())); + QVERIFY(i == true); + + m_source->requestUpdate(1500); + + if (m_source->error() != QGeoSatelliteInfoSource::NoError) + QSKIP("Error starting satellite updates."); + + QTRY_VERIFY_WITH_TIMEOUT((m_testSlot2Called == true), 7000); +} + +void TestQGeoSatelliteInfoSource::bindings() +{ + CHECK_SOURCE_VALID; + + QTestPrivate::testReadWritePropertyBasics( + *m_source, 1000, 2000, "updateInterval", + []() { + return std::unique_ptr( + QGeoSatelliteInfoSource::createDefaultSource(nullptr)); + }); +} + +#include "testqgeosatelliteinfosource.moc" diff --git a/tests/auto/qgeosatelliteinfosource/testqgeosatelliteinfosource_p.h b/tests/auto/qgeosatelliteinfosource/testqgeosatelliteinfosource_p.h new file mode 100644 index 0000000..a49ddee --- /dev/null +++ b/tests/auto/qgeosatelliteinfosource/testqgeosatelliteinfosource_p.h @@ -0,0 +1,92 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef TESTQGEOSATELLITEINFOSOURCE_H +#define TESTQGEOSATELLITEINFOSOURCE_H + +#include +#include +#include + +QT_BEGIN_NAMESPACE +class QGeoSatelliteInfoSource; +QT_END_NAMESPACE + + +class TestQGeoSatelliteInfoSource : public QObject +{ + Q_OBJECT + +public: + TestQGeoSatelliteInfoSource(QObject *parent = 0); + + static TestQGeoSatelliteInfoSource *createDefaultSourceTest(); + +protected: + virtual QGeoSatelliteInfoSource *createTestSource() = 0; + + // MUST be called by subclasses if they override respective test slots + void base_initTestCase(); + void base_init(); + void base_cleanup(); + void base_cleanupTestCase(); + +public slots: + void test_slot1(); + void test_slot2(); + +private slots: + void initTestCase(); + void init(); + void cleanup(); + void cleanupTestCase(); + + void constructor_withParent(); + void constructor_noParent(); + + void updateInterval(); + + void setUpdateInterval(); + void setUpdateInterval_data(); + + void minimumUpdateInterval(); + + void createDefaultSource(); + void createDefaultSource_noParent(); + + void startUpdates_testIntervals(); + void startUpdates_testIntervalChangesWhileRunning(); + void startUpdates_testDefaultInterval(); + void startUpdates_testZeroInterval(); + void startUpdates_moreThanOnce(); + void stopUpdates(); + void stopUpdates_withoutStart(); + + void requestUpdate(); + void requestUpdate_data(); + + void requestUpdate_validTimeout(); + void requestUpdate_defaultTimeout(); + void requestUpdate_timeoutLessThanMinimumInterval(); + void requestUpdate_repeatedCalls(); + void requestUpdate_overlappingCalls(); + void requestUpdate_overlappingCallsWithTimeout(); + + void requestUpdateAfterStartUpdates_ZeroInterval(); + void requestUpdateAfterStartUpdates_SmallInterval(); + void requestUpdateBeforeStartUpdates_ZeroInterval(); + void requestUpdateBeforeStartUpdates_SmallInterval(); + + void removeSlotForRequestTimeout(); + void removeSlotForSatellitesInUseUpdated(); + void removeSlotForSatellitesInViewUpdated(); + + void bindings(); + +private: + QGeoSatelliteInfoSource *m_source; + bool m_testingDefaultSource; + bool m_testSlot2Called; +}; + +#endif // #ifndef TESTQGEOSATELLITEINFOSOURCE_H diff --git a/tests/auto/qgeosatelliteinfosource/tst_qgeosatelliteinfosource.cpp b/tests/auto/qgeosatelliteinfosource/tst_qgeosatelliteinfosource.cpp new file mode 100644 index 0000000..8886a7a --- /dev/null +++ b/tests/auto/qgeosatelliteinfosource/tst_qgeosatelliteinfosource.cpp @@ -0,0 +1,12 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include "testqgeosatelliteinfosource_p.h" +#include + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + std::unique_ptr test(TestQGeoSatelliteInfoSource::createDefaultSourceTest()); + return QTest::qExec(test.get(), argc, argv); +} diff --git a/tests/auto/qgeoshape/CMakeLists.txt b/tests/auto/qgeoshape/CMakeLists.txt new file mode 100644 index 0000000..5cc31de --- /dev/null +++ b/tests/auto/qgeoshape/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qgeoshape.pro. + +##################################################################### +## tst_qgeoshape Binary: +##################################################################### + +qt_internal_add_test(tst_qgeoshape + SOURCES + tst_qgeoshape.cpp + LIBRARIES + Qt::Core + Qt::Positioning + Qt::Test +) diff --git a/tests/auto/qgeoshape/tst_qgeoshape.cpp b/tests/auto/qgeoshape/tst_qgeoshape.cpp new file mode 100644 index 0000000..8328ed6 --- /dev/null +++ b/tests/auto/qgeoshape/tst_qgeoshape.cpp @@ -0,0 +1,218 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include +#include +#include +#include + +QString tst_qgeoshape_debug; + +void tst_qgeoshape_messageHandler(QtMsgType type, const QMessageLogContext&, + const QString &msg) +{ + switch (type) { + case QtDebugMsg : + tst_qgeoshape_debug = msg; + break; + default: + break; + } +} + +class tst_qgeoshape : public QObject +{ + Q_OBJECT + +private slots: + void testArea(); + void debug_data(); + void debug(); + void conversions(); + void serialization(); + void hashing(); +}; + +void tst_qgeoshape::testArea() +{ + QGeoShape area; + QVERIFY(!area.isValid()); + QVERIFY(area.isEmpty()); + QCOMPARE(area.type(), QGeoShape::UnknownType); + QVERIFY(!area.contains(QGeoCoordinate())); + + // QGeoShape never constructs a QGeoShapePrivate. Hence d_ptr is always 0. + + QGeoShape area2; + + QCOMPARE(area, area2); + + area = area2; + + QCOMPARE(area, area2); + + QGeoShape area3(area2); + + QCOMPARE(area2, area3); +} + +void tst_qgeoshape::debug_data() +{ + QTest::addColumn("shape"); + QTest::addColumn("nextValue"); + QTest::addColumn("debugString"); + + QTest::newRow("uninitialized") << QGeoShape() << 45 + << QString("QGeoShape(Unknown) 45"); + QTest::newRow("rectangle") << QGeoShape(QGeoRectangle()) << 45 + << QString("QGeoShape(Rectangle) 45"); + QTest::newRow("circle") << QGeoShape(QGeoCircle()) << 45 + << QString("QGeoShape(Circle) 45"); + QTest::newRow("polygon") << QGeoShape(QGeoPolygon()) << 45 + << QString("QGeoShape(Polygon) 45"); + QTest::newRow("path") << QGeoShape(QGeoPath()) << 45 + << QString("QGeoShape(Path) 45"); +} + + +void tst_qgeoshape::debug() +{ + QFETCH(QGeoShape, shape); + QFETCH(int, nextValue); + QFETCH(QString, debugString); + + qInstallMessageHandler(tst_qgeoshape_messageHandler); + qDebug() << shape << nextValue; + qInstallMessageHandler(0); + QCOMPARE(tst_qgeoshape_debug, debugString); +} + +void tst_qgeoshape::conversions() +{ + QVariant varShape = QVariant::fromValue(QGeoShape()); + QVariant varRect = QVariant::fromValue(QGeoRectangle( + QGeoCoordinate(1, 1), + QGeoCoordinate(2, 2))); + QVariant varCircle = QVariant::fromValue(QGeoCircle(QGeoCoordinate(3, 3), 1000)); + + QVERIFY(varShape.canConvert()); + QVERIFY(varShape.canConvert()); + QVERIFY(varShape.canConvert()); + QVERIFY(!varRect.canConvert()); + QVERIFY(varRect.canConvert()); + QVERIFY(varRect.canConvert()); + QVERIFY(varCircle.canConvert()); + QVERIFY(!varCircle.canConvert()); + QVERIFY(varCircle.canConvert()); +} + +void tst_qgeoshape::serialization() +{ + QByteArray data; + // empty shape + { + QGeoShape shape; + QDataStream writeStream(&data, QDataStream::WriteOnly); + writeStream << shape; + + QGeoShape otherShape; + QDataStream readStream(&data, QDataStream::ReadOnly); + readStream >> otherShape; + + QCOMPARE(otherShape, shape); + } + // circle + { + QGeoCircle circle(QGeoCoordinate(1.1, 2.2), 10.5); + QDataStream writeStream(&data, QDataStream::WriteOnly); + writeStream << circle; + + QGeoShape otherCircle; + QDataStream readStream(&data, QDataStream::ReadOnly); + readStream >> otherCircle; + + QCOMPARE(otherCircle, circle); + } + // rectangle + { + QGeoRectangle rectangle(QGeoCoordinate(30, 160), QGeoCoordinate(-30, 170)); + QDataStream writeStream(&data, QDataStream::WriteOnly); + writeStream << rectangle; + + QGeoShape otherRectangle; + QDataStream readStream(&data, QDataStream::ReadOnly); + readStream >> otherRectangle; + + QCOMPARE(otherRectangle, rectangle); + } + // polygon + { + QGeoPolygon polygon({ QGeoCoordinate(30, 160), + QGeoCoordinate(0, 170), + QGeoCoordinate(-30, 160) }); + QDataStream writeStream(&data, QDataStream::WriteOnly); + writeStream << polygon; + + QGeoShape otherPolygon; + QDataStream readStream(&data, QDataStream::ReadOnly); + readStream >> otherPolygon; + + QCOMPARE(otherPolygon, polygon); + } + // path + { + QGeoPath path({ QGeoCoordinate(30, 160), QGeoCoordinate(0, 170), + QGeoCoordinate(-30, 180) }, 0.5); + QDataStream writeStream(&data, QDataStream::WriteOnly); + writeStream << path; + + QGeoShape otherPath; + QDataStream readStream(&data, QDataStream::ReadOnly); + readStream >> otherPath; + + QCOMPARE(otherPath, path); + } +} + +void tst_qgeoshape::hashing() +{ + const size_t defaultShapeHash = qHash(QGeoShape()); + + const QGeoCircle circle(QGeoCoordinate(1, 2), 10); + const QGeoShape circleShape = circle; + const size_t circleShapeHash = qHash(circleShape); + QVERIFY(defaultShapeHash != circleShapeHash); + QCOMPARE(qHash(circle), circleShapeHash); + + const QGeoRectangle rectangle(QGeoCoordinate(30, 160), QGeoCoordinate(-30, 170)); + const QGeoShape rectangleShape = rectangle; + const size_t rectangleShapeHash = qHash(rectangleShape); + QVERIFY(defaultShapeHash != rectangleShapeHash); + QVERIFY(circleShapeHash != rectangleShapeHash); + QCOMPARE(qHash(rectangle), rectangleShapeHash); + + const QGeoPolygon polygon({ QGeoCoordinate(30, 160), QGeoCoordinate(0, 170), + QGeoCoordinate(-30, 160) }); + const QGeoShape polygonShape = polygon; + const size_t polygonShapeHash = qHash(polygonShape); + QVERIFY(defaultShapeHash != polygonShapeHash); + QVERIFY(circleShapeHash != polygonShapeHash); + QVERIFY(rectangleShapeHash != polygonShapeHash); + QCOMPARE(qHash(polygon), polygonShapeHash); + + const QGeoPath path({ QGeoCoordinate(30, 160), QGeoCoordinate(0, 170), + QGeoCoordinate(-30, 180) }, 0.5); + const QGeoShape pathShape = path; + const size_t pathShapeHash = qHash(pathShape); + QVERIFY(defaultShapeHash != pathShapeHash); + QVERIFY(circleShapeHash != pathShapeHash); + QVERIFY(rectangleShapeHash != pathShapeHash); + QVERIFY(polygonShapeHash != pathShapeHash); + QCOMPARE(qHash(path), pathShapeHash); +} + +QTEST_MAIN(tst_qgeoshape) +#include "tst_qgeoshape.moc" diff --git a/tests/auto/qnmeapositioninfosource/CMakeLists.txt b/tests/auto/qnmeapositioninfosource/CMakeLists.txt new file mode 100644 index 0000000..3d86585 --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qnmeapositioninfosource.pro. + +add_subdirectory(dummy) +add_subdirectory(realtime) +add_subdirectory(simulation) +add_subdirectory(realtime_generic) +add_subdirectory(simulation_generic) diff --git a/tests/auto/qnmeapositioninfosource/dummy/CMakeLists.txt b/tests/auto/qnmeapositioninfosource/dummy/CMakeLists.txt new file mode 100644 index 0000000..159a643 --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/dummy/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from dummynmeapositioninfosource.pro. + +##################################################################### +## tst_dummynmeapositioninfosource Test: +##################################################################### + +qt_internal_add_test(tst_dummynmeapositioninfosource + SOURCES + ../../utils/qlocationtestutils.cpp ../../utils/qlocationtestutils_p.h + ../../utils/qnmeaproxyfactory.cpp ../../utils/qnmeaproxyfactory.h + tst_dummynmeapositioninfosource.cpp + INCLUDE_DIRECTORIES + .. + LIBRARIES + Qt::Core + Qt::Network + Qt::Positioning +) + +#### Keys ignored in scope 1:.:.:dummynmeapositioninfosource.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/qnmeapositioninfosource/dummy/tst_dummynmeapositioninfosource.cpp b/tests/auto/qnmeapositioninfosource/dummy/tst_dummynmeapositioninfosource.cpp new file mode 100644 index 0000000..64a5ffa --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/dummy/tst_dummynmeapositioninfosource.cpp @@ -0,0 +1,139 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +//TESTED_COMPONENT=src/location + +#include "../utils/qnmeaproxyfactory.h" +#include "../utils/qlocationtestutils_p.h" + +#include +#include +#include + +Q_DECLARE_METATYPE(QNmeaPositionInfoSource::UpdateMode) + +class DummyNmeaPositionInfoSource : public QNmeaPositionInfoSource +{ + Q_OBJECT + +public: + DummyNmeaPositionInfoSource(QNmeaPositionInfoSource::UpdateMode mode, QObject *parent = 0); + +protected: +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) + bool parsePosInfoFromNmeaData(const char *data, + int size, + QGeoPositionInfo *posInfo, + bool *hasFix) + QT6_ONLY(override) + { + return parsePosInfoFromNmeaDataImpl(QByteArrayView{data, size}, posInfo, hasFix); + } +#else + bool parsePosInfoFromNmeaData(QByteArrayView data, + QGeoPositionInfo *posInfo, + bool *hasFix) + QT7_ONLY(override) + { + return parsePosInfoFromNmeaDataImpl(data, posInfo, hasFix); + } +#endif + +private: + int callCount; + + bool parsePosInfoFromNmeaDataImpl(QByteArrayView data, + QGeoPositionInfo *posInfo, + bool *hasFix); +}; + +DummyNmeaPositionInfoSource::DummyNmeaPositionInfoSource(QNmeaPositionInfoSource::UpdateMode mode, QObject *parent) : + QNmeaPositionInfoSource(mode, parent), + callCount(0) +{ +} + +bool DummyNmeaPositionInfoSource::parsePosInfoFromNmeaDataImpl(QByteArrayView data, + QGeoPositionInfo *posInfo, + bool *hasFix) +{ + Q_UNUSED(data); + posInfo->setCoordinate(QGeoCoordinate(callCount * 1.0, callCount * 1.0, callCount * 1.0)); + posInfo->setTimestamp(QDateTime::currentDateTimeUtc()); + *hasFix = true; + ++callCount; + + return true; +} + +class tst_DummyNmeaPositionInfoSource : public QObject +{ + Q_OBJECT + +public: + tst_DummyNmeaPositionInfoSource(); + +private slots: + void initTestCase(); + void testOverloadedParseFunction(); +}; + + +tst_DummyNmeaPositionInfoSource::tst_DummyNmeaPositionInfoSource() {} + +void tst_DummyNmeaPositionInfoSource::initTestCase() +{ + +} + +void tst_DummyNmeaPositionInfoSource::testOverloadedParseFunction() +{ + DummyNmeaPositionInfoSource source(QNmeaPositionInfoSource::RealTimeMode); + QNmeaProxyFactory factory; + // proxy is deleted by the source + QNmeaPositionInfoSourceProxy *proxy = static_cast( + factory.createPositionInfoSourceProxy(&source)); + + QSignalSpy spy(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); + + QGeoPositionInfo pos; + + proxy->source()->startUpdates(); + + proxy->feedBytes(QString("The parser converts\n").toLatin1()); + + QTRY_VERIFY_WITH_TIMEOUT((spy.size() == 1), 10000); + pos = spy.at(0).at(0).value(); + + QVERIFY((pos.coordinate().latitude() == 0.0) + && (pos.coordinate().longitude() == 0.0) + && (pos.coordinate().altitude() == 0.0)); + + spy.clear(); + + proxy->feedBytes(QString("any data it receives\n").toLatin1()); + + QTRY_VERIFY_WITH_TIMEOUT((spy.size() == 1), 10000); + pos = spy.at(0).at(0).value(); + + QVERIFY((pos.coordinate().latitude() == 1.0) + && (pos.coordinate().longitude() == 1.0) + && (pos.coordinate().altitude() == 1.0)); + + spy.clear(); + + proxy->feedBytes(QString("into positions\n").toLatin1()); + + QTRY_VERIFY_WITH_TIMEOUT((spy.size() == 1), 10000); + pos = spy.at(0).at(0).value(); + + QVERIFY((pos.coordinate().latitude() == 2.0) + && (pos.coordinate().longitude() == 2.0) + && (pos.coordinate().altitude() == 2.0)); + + spy.clear(); +} + +#include "tst_dummynmeapositioninfosource.moc" + +QTEST_GUILESS_MAIN(tst_DummyNmeaPositionInfoSource); diff --git a/tests/auto/qnmeapositioninfosource/realtime/CMakeLists.txt b/tests/auto/qnmeapositioninfosource/realtime/CMakeLists.txt new file mode 100644 index 0000000..4299905 --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/realtime/CMakeLists.txt @@ -0,0 +1,27 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qnmeapositioninfosource_realtime.pro. + +##################################################################### +## tst_qnmeapositioninfosource_realtime Test: +##################################################################### + +qt_internal_add_test(tst_qnmeapositioninfosource_realtime + SOURCES + ../../qgeopositioninfosource/testqgeopositioninfosource.cpp ../../qgeopositioninfosource/testqgeopositioninfosource_p.h + ../../utils/qlocationtestutils.cpp ../../utils/qlocationtestutils_p.h + ../../utils/qnmeaproxyfactory.cpp ../../utils/qnmeaproxyfactory.h + ../tst_qnmeapositioninfosource.cpp ../tst_qnmeapositioninfosource.h + tst_qnmeapositioninfosource_realtime.cpp + INCLUDE_DIRECTORIES + .. + LIBRARIES + Qt::Core + Qt::Network + Qt::Positioning + Qt::TestPrivate +) + +#### Keys ignored in scope 1:.:.:qnmeapositioninfosource_realtime.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/qnmeapositioninfosource/realtime/tst_qnmeapositioninfosource_realtime.cpp b/tests/auto/qnmeapositioninfosource/realtime/tst_qnmeapositioninfosource_realtime.cpp new file mode 100644 index 0000000..f3f6ebb --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/realtime/tst_qnmeapositioninfosource_realtime.cpp @@ -0,0 +1,19 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +//TESTED_COMPONENT=src/location + +#include "tst_qnmeapositioninfosource.h" + +class tst_QNmeaPositionInfoSource_RealTime : public tst_QNmeaPositionInfoSource +{ + Q_OBJECT + +public: + tst_QNmeaPositionInfoSource_RealTime() + : tst_QNmeaPositionInfoSource(QNmeaPositionInfoSource::RealTimeMode) {} +}; + +#include "tst_qnmeapositioninfosource_realtime.moc" + +QTEST_GUILESS_MAIN(tst_QNmeaPositionInfoSource_RealTime); diff --git a/tests/auto/qnmeapositioninfosource/realtime_generic/CMakeLists.txt b/tests/auto/qnmeapositioninfosource/realtime_generic/CMakeLists.txt new file mode 100644 index 0000000..a8883e7 --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/realtime_generic/CMakeLists.txt @@ -0,0 +1,38 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qnmeapositioninfosource_realtime_generic.pro. + +##################################################################### +## tst_qnmeapositioninfosource_realtime_generic Test: +##################################################################### + +qt_internal_add_test(tst_qnmeapositioninfosource_realtime_generic + SOURCES + ../../qgeopositioninfosource/testqgeopositioninfosource.cpp ../../qgeopositioninfosource/testqgeopositioninfosource_p.h + ../../utils/qlocationtestutils.cpp ../../utils/qlocationtestutils_p.h + ../../utils/qnmeaproxyfactory.cpp ../../utils/qnmeaproxyfactory.h + ../tst_qnmeapositioninfosource.cpp ../tst_qnmeapositioninfosource.h + tst_qnmeapositioninfosource_realtime_generic.cpp + INCLUDE_DIRECTORIES + .. + LIBRARIES + Qt::Core + Qt::Network + Qt::Positioning + Qt::TestPrivate +) + +# Default android position plugin is not loaded for unit-tests, so we have to +# explicitly use a test position plugin. +add_dependencies(tst_qnmeapositioninfosource_realtime_generic + QGeoPositionInfoSourceFactoryTestPlugin) +if(ANDROID) + set_target_properties(tst_qnmeapositioninfosource_realtime_generic PROPERTIES + QT_ANDROID_EXTRA_PLUGINS "$" + ) +endif() + +#### Keys ignored in scope 1:.:.:qnmeapositioninfosource_realtime_generic.pro:: +# TEMPLATE = "app" +# testcase.timeout = "400" diff --git a/tests/auto/qnmeapositioninfosource/realtime_generic/tst_qnmeapositioninfosource_realtime_generic.cpp b/tests/auto/qnmeapositioninfosource/realtime_generic/tst_qnmeapositioninfosource_realtime_generic.cpp new file mode 100644 index 0000000..825e055 --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/realtime_generic/tst_qnmeapositioninfosource_realtime_generic.cpp @@ -0,0 +1,52 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +//TESTED_COMPONENT=src/location + +#include "tst_qnmeapositioninfosource.h" + +class tst_QNmeaPositionInfoSource_RealTime_Generic : public TestQGeoPositionInfoSource +{ + Q_OBJECT + +public: + tst_QNmeaPositionInfoSource_RealTime_Generic() + { + m_factory = new QNmeaProxyFactory; +#if QT_CONFIG(library) + /* + * Set custom path since CI doesn't install test plugins + */ +#ifdef Q_OS_WIN + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../../plugins")); +#else + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../../plugins")); +#endif +#endif + } + + ~tst_QNmeaPositionInfoSource_RealTime_Generic() + { + delete m_factory; + } + +protected: + QGeoPositionInfoSource *createTestSource() override + { + QNmeaPositionInfoSource *source = new QNmeaPositionInfoSource(QNmeaPositionInfoSource::RealTimeMode); + QNmeaPositionInfoSourceProxy *proxy = static_cast( + m_factory->createPositionInfoSourceProxy(source)); + Feeder *feeder = new Feeder(source); + feeder->start(proxy); + return source; + } + +private: + QNmeaProxyFactory *m_factory; +}; + +#include "tst_qnmeapositioninfosource_realtime_generic.moc" + +QTEST_GUILESS_MAIN(tst_QNmeaPositionInfoSource_RealTime_Generic); diff --git a/tests/auto/qnmeapositioninfosource/simulation/CMakeLists.txt b/tests/auto/qnmeapositioninfosource/simulation/CMakeLists.txt new file mode 100644 index 0000000..4554f22 --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/simulation/CMakeLists.txt @@ -0,0 +1,27 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qnmeapositioninfosource_simulation.pro. + +##################################################################### +## tst_qnmeapositioninfosource_simulation Test: +##################################################################### + +qt_internal_add_test(tst_qnmeapositioninfosource_simulation + SOURCES + ../../qgeopositioninfosource/testqgeopositioninfosource.cpp ../../qgeopositioninfosource/testqgeopositioninfosource_p.h + ../../utils/qlocationtestutils.cpp ../../utils/qlocationtestutils_p.h + ../../utils/qnmeaproxyfactory.cpp ../../utils/qnmeaproxyfactory.h + ../tst_qnmeapositioninfosource.cpp ../tst_qnmeapositioninfosource.h + tst_qnmeapositioninfosource_simulation.cpp + INCLUDE_DIRECTORIES + .. + LIBRARIES + Qt::Core + Qt::Network + Qt::Positioning + Qt::TestPrivate +) + +#### Keys ignored in scope 1:.:.:qnmeapositioninfosource_simulation.pro:: +# TEMPLATE = "app" diff --git a/tests/auto/qnmeapositioninfosource/simulation/tst_qnmeapositioninfosource_simulation.cpp b/tests/auto/qnmeapositioninfosource/simulation/tst_qnmeapositioninfosource_simulation.cpp new file mode 100644 index 0000000..de7abb2 --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/simulation/tst_qnmeapositioninfosource_simulation.cpp @@ -0,0 +1,18 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +//TESTED_COMPONENT=src/location + +#include "tst_qnmeapositioninfosource.h" + +class tst_QNmeaPositionInfoSource_Simulation : public tst_QNmeaPositionInfoSource +{ + Q_OBJECT +public: + tst_QNmeaPositionInfoSource_Simulation() + : tst_QNmeaPositionInfoSource(QNmeaPositionInfoSource::SimulationMode) {} +}; + +#include "tst_qnmeapositioninfosource_simulation.moc" + +QTEST_GUILESS_MAIN(tst_QNmeaPositionInfoSource_Simulation); diff --git a/tests/auto/qnmeapositioninfosource/simulation_generic/CMakeLists.txt b/tests/auto/qnmeapositioninfosource/simulation_generic/CMakeLists.txt new file mode 100644 index 0000000..78251ea --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/simulation_generic/CMakeLists.txt @@ -0,0 +1,42 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Generated from qnmeapositioninfosource_simulation_generic.pro. + +##################################################################### +## tst_qnmeapositioninfosource_simulation_generic Test: +##################################################################### + +# special case begin + +# Renamed the target due to problems with the maximum full path on +# Windows systems (which is 250 characters only) +qt_internal_add_test(tst_qnmeaposinfosource_sim_generic +# special case end + SOURCES + ../../qgeopositioninfosource/testqgeopositioninfosource.cpp ../../qgeopositioninfosource/testqgeopositioninfosource_p.h + ../../utils/qlocationtestutils.cpp ../../utils/qlocationtestutils_p.h + ../../utils/qnmeaproxyfactory.cpp ../../utils/qnmeaproxyfactory.h + ../tst_qnmeapositioninfosource.cpp ../tst_qnmeapositioninfosource.h + tst_qnmeapositioninfosource_simulation_generic.cpp + INCLUDE_DIRECTORIES + .. + LIBRARIES + Qt::Core + Qt::Network + Qt::Positioning + Qt::TestPrivate +) + +# Default android position plugin is not loaded for unit-tests, so we have to +# explicitly use a test position plugin. +add_dependencies(tst_qnmeaposinfosource_sim_generic QGeoPositionInfoSourceFactoryTestPlugin) +if(ANDROID) + set_target_properties(tst_qnmeaposinfosource_sim_generic PROPERTIES + QT_ANDROID_EXTRA_PLUGINS "$" + ) +endif() + +#### Keys ignored in scope 1:.:.:qnmeapositioninfosource_simulation_generic.pro:: +# TEMPLATE = "app" +# testcase.timeout = "400" diff --git a/tests/auto/qnmeapositioninfosource/simulation_generic/tst_qnmeapositioninfosource_simulation_generic.cpp b/tests/auto/qnmeapositioninfosource/simulation_generic/tst_qnmeapositioninfosource_simulation_generic.cpp new file mode 100644 index 0000000..ce4f0b6 --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/simulation_generic/tst_qnmeapositioninfosource_simulation_generic.cpp @@ -0,0 +1,39 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +//TESTED_COMPONENT=src/location + +#include "tst_qnmeapositioninfosource.h" + +class tst_QNmeaPositionInfoSource_Simulation_Generic : public TestQGeoPositionInfoSource +{ + Q_OBJECT +public: + tst_QNmeaPositionInfoSource_Simulation_Generic() + { +#if QT_CONFIG(library) + /* + * Set custom path since CI doesn't install test plugins + */ +#ifdef Q_OS_WIN + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../../plugins")); +#else + QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() + + QStringLiteral("/../../../../plugins")); +#endif +#endif + } + +protected: + QGeoPositionInfoSource *createTestSource() override + { + QNmeaPositionInfoSource *source = new QNmeaPositionInfoSource(QNmeaPositionInfoSource::SimulationMode); + source->setDevice(new UnlimitedNmeaStream(source)); + return source; + } +}; + +#include "tst_qnmeapositioninfosource_simulation_generic.moc" + +QTEST_GUILESS_MAIN(tst_QNmeaPositionInfoSource_Simulation_Generic); diff --git a/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.cpp b/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.cpp new file mode 100644 index 0000000..b9c1bce --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.cpp @@ -0,0 +1,590 @@ +// Copyright (C) 2016 Jolla Ltd. +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +//TESTED_COMPONENT=src/location + +#include "tst_qnmeapositioninfosource.h" + +#include +#include +#include + +#ifdef Q_OS_WIN + +// Windows seems to require longer timeouts and step length +// We override the standard QTestCase related macros + +#ifdef QTRY_COMPARE_WITH_TIMEOUT +#undef QTRY_COMPARE_WITH_TIMEOUT +#endif +#define QTRY_COMPARE_WITH_TIMEOUT(__expr, __expected, __timeout) \ +do { \ + const int __step = 100; \ + const int __timeoutValue = __timeout; \ + if ((__expr) != (__expected)) { \ + QTest::qWait(0); \ + } \ + for (int __i = 0; __i < __timeoutValue && ((__expr) != (__expected)); __i+=__step) { \ + QTest::qWait(__step); \ + } \ + QCOMPARE(__expr, __expected); \ +} while (0) + +#ifdef QTRY_COMPARE +#undef QTRY_COMPARE +#endif +#define QTRY_COMPARE(__expr, __expected) QTRY_COMPARE_WITH_TIMEOUT(__expr, __expected, 10000) + +#endif + +tst_QNmeaPositionInfoSource::tst_QNmeaPositionInfoSource(QNmeaPositionInfoSource::UpdateMode mode, QObject *parent) + : QObject(parent), + m_mode(mode) +{ +} + +void tst_QNmeaPositionInfoSource::initTestCase() +{ + qRegisterMetaType(); +} + +void tst_QNmeaPositionInfoSource::constructor() +{ + QObject o; + QNmeaPositionInfoSource source(m_mode, &o); + QCOMPARE(source.updateMode(), m_mode); + QCOMPARE(source.parent(), &o); +} + +void tst_QNmeaPositionInfoSource::supportedPositioningMethods() +{ + QNmeaPositionInfoSource source(m_mode); + QCOMPARE(source.supportedPositioningMethods(), QNmeaPositionInfoSource::SatellitePositioningMethods); +} + +void tst_QNmeaPositionInfoSource::minimumUpdateInterval() +{ + QNmeaPositionInfoSource source(m_mode); + QCOMPARE(source.minimumUpdateInterval(), 2); +} + +void tst_QNmeaPositionInfoSource::userEquivalentRangeError() +{ + QNmeaPositionInfoSource source(m_mode); + QVERIFY(qIsNaN(source.userEquivalentRangeError())); + source.setUserEquivalentRangeError(5.1); + QVERIFY(qFuzzyCompare(source.userEquivalentRangeError(), 5.1)); +} + +void tst_QNmeaPositionInfoSource::setUpdateInterval_delayedUpdate() +{ + // If an update interval is set, and an update is not available at a + // particular interval, the source should emit the next update as soon + // as it becomes available + + QNmeaPositionInfoSource source(m_mode); + QNmeaProxyFactory factory; + QNmeaPositionInfoSourceProxy *proxy = static_cast( + factory.createPositionInfoSourceProxy(&source)); + + // Android emulator is slow, so increase the update interval and all + // timeouts for it. +#ifndef Q_OS_ANDROID + constexpr int updateInterval = 500; + constexpr int waitInterval = 600; + constexpr int maxDelay = 400; +#else + constexpr int updateInterval = 1000; + constexpr int waitInterval = 1100; + constexpr int maxDelay = 900; +#endif + + QSignalSpy spyUpdate(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); + proxy->source()->setUpdateInterval(updateInterval); + proxy->source()->startUpdates(); + + QTest::qWait(waitInterval); + QDateTime now = QDateTime::currentDateTime(); + proxy->feedUpdate(now); + QTRY_COMPARE(spyUpdate.size(), 1); + + // should have gotten the update immediately, and not have needed to + // wait until the next interval + QVERIFY(now.time().msecsTo(QDateTime::currentDateTime().time()) < maxDelay); +} + +void tst_QNmeaPositionInfoSource::lastKnownPosition() +{ + QNmeaPositionInfoSource source(m_mode); + QNmeaProxyFactory factory; + QNmeaPositionInfoSourceProxy *proxy = static_cast( + factory.createPositionInfoSourceProxy(&source)); + + QCOMPARE(proxy->source()->lastKnownPosition(), QGeoPositionInfo()); + + // source may need requestUpdate() or startUpdates() to be called to + // trigger reading of data channel + QSignalSpy spyTimeout(proxy->source(), SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + proxy->source()->requestUpdate(proxy->source()->minimumUpdateInterval()); + QTRY_COMPARE(spyTimeout.size(), 1); + const QList arguments = spyTimeout.takeFirst(); + const auto error = arguments.at(0).value(); + QCOMPARE(error, QGeoPositionInfoSource::UpdateTimeoutError); + + // If an update is received and startUpdates() or requestUpdate() hasn't + // been called, it should still be available through lastKnownPosition() + QDateTime dt = QDateTime::currentDateTimeUtc(); + proxy->feedUpdate(dt); + QTRY_COMPARE(proxy->source()->lastKnownPosition().timestamp(), dt); + + QList dateTimes = createDateTimes(5); + for (int i=0; isource()->requestUpdate(); // Irrelevant for this test + proxy->feedUpdate(dateTimes[i]); + QTRY_COMPARE(proxy->source()->lastKnownPosition().timestamp(), dateTimes[i]); + } + + proxy->source()->startUpdates(); + // if dateTimes are older than before, they will be ignored. + dateTimes = createDateTimes(dateTimes.last().addMSecs(100), 5); + for (int i=0; ifeedUpdate(dateTimes[i]); + QTRY_COMPARE(proxy->source()->lastKnownPosition().timestamp(), dateTimes[i]); + } +} + +void tst_QNmeaPositionInfoSource::beginWithBufferedData() +{ + // In SimulationMode, data stored in the QIODevice is read when + // startUpdates() or requestUpdate() is called. + // In RealTimeMode, all existing data in the QIODevice is ignored - + // only new data will be read. + + QFETCH(QList, dateTimes); + QFETCH(UpdateTriggerMethod, trigger); + + QByteArray bytes; + for (int i=0; i().timestamp(), dateTimes[i]); + } else if (trigger == RequestUpdatesMethod) { + QTRY_COMPARE(spy.size(), 1); + QCOMPARE(spy.at(0).at(0).value().timestamp(), dateTimes.first()); + } + } +} + +void tst_QNmeaPositionInfoSource::beginWithBufferedData_data() +{ + QTest::addColumn >("dateTimes"); + QTest::addColumn("trigger"); + + QList dateTimes; + dateTimes << QDateTime::currentDateTime().toUTC(); + + QTest::newRow("startUpdates(), 1 update in buffer") << dateTimes << StartUpdatesMethod; + QTest::newRow("requestUpdate(), 1 update in buffer") << dateTimes << RequestUpdatesMethod; + + for (int i=1; i<3; i++) + dateTimes << dateTimes[0].addMSecs(i * 100); + QTest::newRow("startUpdates(), multiple updates in buffer") << dateTimes << StartUpdatesMethod; + QTest::newRow("requestUpdate(), multiple updates in buffer") << dateTimes << RequestUpdatesMethod; +} + +void tst_QNmeaPositionInfoSource::startUpdates() +{ + QFETCH(QList, dateTimes); + + QNmeaPositionInfoSource source(m_mode); + QNmeaProxyFactory factory; + QNmeaPositionInfoSourceProxy *proxy = static_cast( + factory.createPositionInfoSourceProxy(&source)); + + QSignalSpy spyUpdate(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); + proxy->source()->startUpdates(); + + for (int i=0; ifeedUpdate(dateTimes[i]); + QTRY_COMPARE(spyUpdate.size(), dateTimes.size()); +} + +void tst_QNmeaPositionInfoSource::startUpdates_data() +{ + QTest::addColumn >("dateTimes"); + + QTest::newRow("1 update") << createDateTimes(1); + QTest::newRow("2 updates") << createDateTimes(2); + QTest::newRow("10 updates") << createDateTimes(10); +} + +void tst_QNmeaPositionInfoSource::startUpdates_withTimeout() +{ + QNmeaPositionInfoSource source(m_mode); + QNmeaProxyFactory factory; + QNmeaPositionInfoSourceProxy *proxy = static_cast( + factory.createPositionInfoSourceProxy(&source)); + + QSignalSpy spyUpdate(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy spyTimeout(proxy->source(), SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + + proxy->source()->setUpdateInterval(1000); + proxy->source()->startUpdates(); + + QDateTime dt = QDateTime::currentDateTimeUtc(); + + if (m_mode == QNmeaPositionInfoSource::SimulationMode) { + // the first sentence primes the simulation + proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt).toLatin1()); + proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addMSecs(10)).toLatin1()); + proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addMSecs(1100)).toLatin1()); + proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addMSecs(2200)).toLatin1()); + proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addSecs(9)).toLatin1()); + + QElapsedTimer t; + t.start(); + + for (int j = 1; j < 4; ++j) { + QTRY_COMPARE(spyUpdate.size(), j); + QCOMPARE(spyTimeout.size(), 0); + int time = t.elapsed(); + QVERIFY((time > j*1000 - 300) && (time < j*1000 + 300)); + } + + spyUpdate.clear(); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() == 0) && (spyTimeout.size() == 1), 7500); + const QList arguments = spyTimeout.takeFirst(); + const auto error = arguments.at(0).value(); + QCOMPARE(error, QGeoPositionInfoSource::UpdateTimeoutError); + spyTimeout.clear(); + + QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.size() == 1) && (spyTimeout.size() == 0), 7500); + + } else { + // dt + 900 + QTRY_VERIFY(spyUpdate.size() == 0 && spyTimeout.size() == 0); + + proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addSecs(1)).toLatin1()); + // dt + 1200 + QTRY_VERIFY(spyUpdate.size() == 1 && spyTimeout.size() == 0); + spyUpdate.clear(); + + // dt + 1900 + QTRY_VERIFY(spyUpdate.size() == 0 && spyTimeout.size() == 0); + proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addSecs(2)).toLatin1()); + + // dt + 2200 + QTRY_VERIFY(spyUpdate.size() == 1 && spyTimeout.size() == 0); + spyUpdate.clear(); + + // dt + 2900 + QTRY_VERIFY(spyUpdate.size() == 0 && spyTimeout.size() == 0); + proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addSecs(3)).toLatin1()); + + // dt + 3200 + QTRY_VERIFY(spyUpdate.size() == 1 && spyTimeout.size() == 0); + spyUpdate.clear(); + + // dt + 6900 + QTRY_VERIFY(spyUpdate.size() == 0 && spyTimeout.size() == 1); + const QList arguments = spyTimeout.takeFirst(); + const auto error = arguments.at(0).value(); + QCOMPARE(error, QGeoPositionInfoSource::UpdateTimeoutError); + spyTimeout.clear(); + proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addSecs(7)).toLatin1()); + + // dt + 7200 + QTRY_VERIFY(spyUpdate.size() == 1 && spyTimeout.size() == 0); + spyUpdate.clear(); + } +} + +void tst_QNmeaPositionInfoSource::startUpdates_expectLatestUpdateOnly() +{ + // If startUpdates() is called and an interval has been set, if multiple' + // updates are in the buffer, only the latest update should be emitted + + QNmeaPositionInfoSource source(m_mode); + QNmeaProxyFactory factory; + QNmeaPositionInfoSourceProxy *proxy = static_cast( + factory.createPositionInfoSourceProxy(&source)); + + QSignalSpy spyUpdate(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); + proxy->source()->setUpdateInterval(500); + proxy->source()->startUpdates(); + + QList dateTimes = createDateTimes(3); + for (int i=0; ifeedUpdate(dateTimes[i]); + + QTRY_COMPARE(spyUpdate.size(), 1); + QCOMPARE(spyUpdate[0][0].value().timestamp(), dateTimes.last()); +} + +void tst_QNmeaPositionInfoSource::startUpdates_waitForValidDateTime() +{ + // Tests that the class does not emit an update until it receives a + // sentences with a valid date *and* time. All sentences before this + // should be ignored, and any sentences received after this that do + // not have a date should use the known date. + + QFETCH(QByteArray, bytes); + QFETCH(QList, dateTimes); + QFETCH(QList, expectHorizontalAccuracy); + QFETCH(QList, expectVerticalAccuracy); + + QNmeaPositionInfoSource source(m_mode); + source.setUserEquivalentRangeError(5.1); + QNmeaProxyFactory factory; + QNmeaPositionInfoSourceProxy *proxy = static_cast( + factory.createPositionInfoSourceProxy(&source)); + + QSignalSpy spy(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); + QObject::connect(proxy->source(), &QNmeaPositionInfoSource::positionUpdated, this, + [](const QGeoPositionInfo &info) { qDebug() << info.timestamp(); }); + + proxy->source()->startUpdates(); + proxy->feedBytes(bytes); + QTest::qWait(1000); // default push delay is 20ms + QTRY_COMPARE(spy.size(), dateTimes.size()); + + for (int i=0; i(); + + QCOMPARE(pInfo.timestamp(), dateTimes[i]); + + // Generated GGA/GSA sentences have hard coded HDOP of 3.5, which corrisponds to a + // horizontal accuracy of 35.7, for the user equivalent range error of 5.1 set above. + QCOMPARE(pInfo.hasAttribute(QGeoPositionInfo::HorizontalAccuracy), + expectHorizontalAccuracy[i]); + if (pInfo.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) + QVERIFY(qFuzzyCompare(pInfo.attribute(QGeoPositionInfo::HorizontalAccuracy), 35.7)); + + // Generated GSA sentences have hard coded VDOP of 4.0, which corrisponds to a vertical + // accuracy of 40.8, for the user equivalent range error of 5.1 set above. + QCOMPARE(pInfo.hasAttribute(QGeoPositionInfo::VerticalAccuracy), + expectVerticalAccuracy[i]); + if (pInfo.hasAttribute(QGeoPositionInfo::VerticalAccuracy)) + QVERIFY(qFuzzyCompare(pInfo.attribute(QGeoPositionInfo::VerticalAccuracy), 40.8)); + } +} + +void tst_QNmeaPositionInfoSource::startUpdates_waitForValidDateTime_data() +{ + QTest::addColumn("bytes"); + QTest::addColumn >("dateTimes"); + QTest::addColumn >("expectHorizontalAccuracy"); + QTest::addColumn >("expectVerticalAccuracy"); + + QDateTime dt = QDateTime::currentDateTime().toUTC(); + QByteArray bytes; + + // should only receive RMC sentence and the GGA sentence *after* it + bytes += QLocationTestUtils::createGgaSentence(dt.addMSecs(100).time()).toLatin1(); + bytes += QLocationTestUtils::createRmcSentence(dt.addMSecs(200)).toLatin1(); + bytes += QLocationTestUtils::createGgaSentence(dt.addMSecs(300).time()).toLatin1(); + // The first GGA does not have date, and there's no cached date to inject, so that update will be invalid + QTest::newRow("Feed GGA,RMC,GGA; expect RMC, second GGA only") + << bytes << (QList() << dt.addMSecs(200) << dt.addMSecs(300)) + << (QList() << true << true) // accuracies are currently cached and injected in QGeoPositionInfos that do not have it + << (QList() << false << false); + + // should not receive ZDA (has no coordinates) but should get the GGA + // sentence after it since it got the date/time from ZDA + bytes.clear(); + bytes += QLocationTestUtils::createGgaSentence(dt.addMSecs(100).time()).toLatin1(); + bytes += QLocationTestUtils::createZdaSentence(dt.addMSecs(200)).toLatin1(); + bytes += QLocationTestUtils::createGgaSentence(dt.addMSecs(300).time()).toLatin1(); + QTest::newRow("Feed GGA,ZDA,GGA; expect second GGA only") + << bytes << (QList() << dt.addMSecs(300)) + << (QList() << true) + << (QList() << false); + + // Feed ZDA,GGA,GSA,GGA; expect vertical accuracy from second GGA. + bytes.clear(); + bytes += QLocationTestUtils::createZdaSentence(dt.addMSecs(100)).toLatin1(); + bytes += QLocationTestUtils::createGgaSentence(dt.addMSecs(200).time()).toLatin1(); + bytes += QLocationTestUtils::createGsaSentence().toLatin1(); + bytes += QLocationTestUtils::createGgaSentence(dt.addMSecs(300).time()).toLatin1(); + if (m_mode == QNmeaPositionInfoSource::SimulationMode) { + QTest::newRow("Feed ZDA,GGA,GSA,GGA; expect vertical accuracy from second GGA") + << bytes << (QList() << dt.addMSecs(200) << dt.addMSecs(300)) + << (QList() << true << true) + << (QList() << true << true); // First GGA gets VDOP from GSA bundled into previous, as it has no timestamp, second GGA gets the cached value. + } + + if (m_mode == QNmeaPositionInfoSource::SimulationMode) { + // In sim m_mode, should ignore sentence with a date/time before the known date/time + // (in real time m_mode, everything is passed on regardless) + bytes.clear(); + bytes += QLocationTestUtils::createRmcSentence(dt.addMSecs(100)).toLatin1(); + bytes += QLocationTestUtils::createRmcSentence(dt.addMSecs(-200)).toLatin1(); + bytes += QLocationTestUtils::createRmcSentence(dt.addMSecs(200)).toLatin1(); + QTest::newRow("Feed good RMC, RMC with bad date/time, good RMC; expect first and third RMC only") + << bytes << (QList() << dt.addMSecs(100) << dt.addMSecs(200)) + << (QList() << false << false) + << (QList() << false << false); + } +} + +void tst_QNmeaPositionInfoSource::requestUpdate_waitForValidDateTime() +{ + QFETCH(QByteArray, bytes); + QFETCH(QList, dateTimes); + + QNmeaPositionInfoSource source(m_mode); + QNmeaProxyFactory factory; + QNmeaPositionInfoSourceProxy *proxy = static_cast( + factory.createPositionInfoSourceProxy(&source)); + + QSignalSpy spy(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); + proxy->source()->requestUpdate(); + + proxy->feedBytes(bytes); + QTRY_COMPARE(spy.size(), 1); + QCOMPARE(spy[0][0].value().timestamp(), dateTimes[0]); +} + +void tst_QNmeaPositionInfoSource::requestUpdate_waitForValidDateTime_data() +{ + startUpdates_waitForValidDateTime_data(); +} + +void tst_QNmeaPositionInfoSource::requestUpdate() +{ + QNmeaPositionInfoSource source(m_mode); + QNmeaProxyFactory factory; + QNmeaPositionInfoSourceProxy *proxy = static_cast( + factory.createPositionInfoSourceProxy(&source)); + + QSignalSpy spyUpdate(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy spyTimeout(proxy->source(), SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + QDateTime dt; + + proxy->source()->requestUpdate(100); + QTRY_COMPARE(spyTimeout.size(), 1); + auto error = spyTimeout[0][0].value(); + QCOMPARE(error, QGeoPositionInfoSource::UpdateTimeoutError); + spyTimeout.clear(); + + dt = QDateTime::currentDateTimeUtc(); + proxy->feedUpdate(dt); + proxy->source()->requestUpdate(); + QTRY_COMPARE(spyUpdate.size(), 1); + QCOMPARE(spyUpdate[0][0].value().timestamp(), dt); + QCOMPARE(spyTimeout.size(), 0); + spyUpdate.clear(); + + // delay the update and expect it to be emitted after 300ms + dt = QDateTime::currentDateTimeUtc(); + proxy->source()->requestUpdate(1000); + QTest::qWait(300); + proxy->feedUpdate(dt); + QTRY_COMPARE(spyUpdate.size(), 1); + QCOMPARE(spyUpdate[0][0].value().timestamp(), dt); + QCOMPARE(spyTimeout.size(), 0); + spyUpdate.clear(); + + // delay the update and expect errorOccurred() to be emitted + dt = QDateTime::currentDateTimeUtc(); + proxy->source()->requestUpdate(500); + QTest::qWait(1000); + proxy->feedUpdate(dt); + QCOMPARE(spyTimeout.size(), 1); + error = spyTimeout[0][0].value(); + QCOMPARE(error, QGeoPositionInfoSource::UpdateTimeoutError); + QCOMPARE(spyUpdate.size(), 0); + spyUpdate.clear(); +} + +void tst_QNmeaPositionInfoSource::requestUpdate_after_start() +{ + QNmeaPositionInfoSource source(m_mode); + QNmeaProxyFactory factory; + QNmeaPositionInfoSourceProxy *proxy = static_cast( + factory.createPositionInfoSourceProxy(&source)); + + QSignalSpy spyUpdate(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); + QSignalSpy spyTimeout(proxy->source(), SIGNAL(errorOccurred(QGeoPositionInfoSource::Error))); + + // Start updates with 500ms interval and requestUpdate() with 100ms + // timeout. Feed an update, and it should be emitted immediately due to + // the requestUpdate(). The update should not be emitted again after that + // (i.e. the startUpdates() interval should not cause it to be re-emitted). + + QDateTime dt = QDateTime::currentDateTimeUtc(); + proxy->source()->setUpdateInterval(500); + proxy->source()->startUpdates(); + proxy->source()->requestUpdate(100); + proxy->feedUpdate(dt); + QTRY_COMPARE(spyUpdate.size(), 1); + QCOMPARE(spyUpdate[0][0].value().timestamp(), dt); + QCOMPARE(spyTimeout.size(), 0); + spyUpdate.clear(); + + // Update has been emitted for requestUpdate(), shouldn't be emitted for startUpdates() + QTRY_COMPARE_WITH_TIMEOUT(spyUpdate.size(), 0, 1000); +} + +void tst_QNmeaPositionInfoSource::testWithBadNmea() +{ + QFETCH(QByteArray, bytes); + QFETCH(QList, dateTimes); + QFETCH(UpdateTriggerMethod, trigger); + + QNmeaPositionInfoSource source(m_mode); + QNmeaProxyFactory factory; + QNmeaPositionInfoSourceProxy *proxy = static_cast( + factory.createPositionInfoSourceProxy(&source)); + + QSignalSpy spy(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); + if (trigger == StartUpdatesMethod) + proxy->source()->startUpdates(); + else + proxy->source()->requestUpdate(); + + proxy->feedBytes(bytes); + QTRY_COMPARE(spy.size(), dateTimes.size()); + for (int i=0; i().timestamp(), dateTimes[i]); +} + +void tst_QNmeaPositionInfoSource::testWithBadNmea_data() +{ + QTest::addColumn("bytes"); + QTest::addColumn >("dateTimes"); + QTest::addColumn("trigger"); + + QDateTime firstDateTime = QDateTime::currentDateTimeUtc(); + QByteArray bad = QLocationTestUtils::createRmcSentence(firstDateTime.addSecs(1)).toLatin1(); + bad = bad.mid(bad.size()/2); + QDateTime lastDateTime = firstDateTime.addSecs(2); + + QByteArray bytes; + bytes += QLocationTestUtils::createRmcSentence(firstDateTime).toLatin1(); + bytes += bad; + bytes += QLocationTestUtils::createRmcSentence(lastDateTime).toLatin1(); + QTest::newRow("requestUpdate(), bad second sentence") << bytes + << (QList() << firstDateTime) << RequestUpdatesMethod; + QTest::newRow("startUpdates(), bad second sentence") << bytes + << (QList() << firstDateTime << lastDateTime) << StartUpdatesMethod; +} diff --git a/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.h b/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.h new file mode 100644 index 0000000..6c69696 --- /dev/null +++ b/tests/auto/qnmeapositioninfosource/tst_qnmeapositioninfosource.h @@ -0,0 +1,157 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include "../qgeopositioninfosource/testqgeopositioninfosource_p.h" +#include "../utils/qnmeaproxyfactory.h" +#include "../utils/qlocationtestutils_p.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_USE_NAMESPACE +Q_DECLARE_METATYPE(QNmeaPositionInfoSource::UpdateMode) +Q_DECLARE_METATYPE(QList) + +class tst_QNmeaPositionInfoSource : public QObject +{ + Q_OBJECT + +public: + enum UpdateTriggerMethod + { + StartUpdatesMethod, + RequestUpdatesMethod + }; + + tst_QNmeaPositionInfoSource(QNmeaPositionInfoSource::UpdateMode mode, QObject *parent = 0); + +private: + QList createDateTimes(const QDateTime &dt, int count) const + { + QList dateTimes; + int interval = 100; + for (int i=0; i createDateTimes(int count) const + { + return createDateTimes(QDateTime::currentDateTime().toUTC(), count); + } + +private slots: + void initTestCase(); + + void constructor(); + + void supportedPositioningMethods(); + + void minimumUpdateInterval(); + + void userEquivalentRangeError(); + + void setUpdateInterval_delayedUpdate(); + + void lastKnownPosition(); + + void beginWithBufferedData(); + void beginWithBufferedData_data(); + + void startUpdates(); + void startUpdates_data(); + + void startUpdates_withTimeout(); + + void startUpdates_expectLatestUpdateOnly(); + + void startUpdates_waitForValidDateTime(); + void startUpdates_waitForValidDateTime_data(); + + void requestUpdate_waitForValidDateTime(); + void requestUpdate_waitForValidDateTime_data(); + + void requestUpdate(); + void requestUpdate_after_start(); + + void testWithBadNmea(); + void testWithBadNmea_data(); + +private: + QNmeaPositionInfoSource::UpdateMode m_mode; +}; + +Q_DECLARE_METATYPE(tst_QNmeaPositionInfoSource::UpdateTriggerMethod) + +//--------------------------------------------------- + +class Feeder : public QObject +{ + Q_OBJECT + +public: + Feeder(QObject *parent) + : QObject(parent) + { + } + + void start(QNmeaPositionInfoSourceProxy *proxy) + { + m_proxy = proxy; + QTimer *timer = new QTimer(this); + QObject::connect(timer, SIGNAL(timeout()), this, SLOT(timeout())); + timer->setInterval(proxy->source()->minimumUpdateInterval()*2); + timer->start(); + } + +public slots: + void timeout() + { + m_proxy->feedBytes(QLocationTestUtils::createRmcSentence(QDateTime::currentDateTime()).toLatin1()); + } + +private: + QNmeaPositionInfoSourceProxy *m_proxy; +}; + +//--------------------------------------------------- + + +class UnlimitedNmeaStream : public QIODevice +{ + Q_OBJECT + +public: + UnlimitedNmeaStream(QObject *parent) : QIODevice(parent) {} + +protected: + qint64 readData(char *data, qint64 maxSize) override + { + QByteArray bytes = QLocationTestUtils::createRmcSentence(QDateTime::currentDateTime()).toLatin1(); + qint64 sz = qMin(qint64(bytes.size()), maxSize); + memcpy(data, bytes.constData(), sz); + return sz; + } + + qint64 writeData(const char *, qint64) override + { + return -1; + } + + qint64 bytesAvailable() const override + { + return 1024 + QIODevice::bytesAvailable(); + } +}; diff --git a/tests/auto/qnmeasatelliteinfosource/CMakeLists.txt b/tests/auto/qnmeasatelliteinfosource/CMakeLists.txt new file mode 100644 index 0000000..8d41a9d --- /dev/null +++ b/tests/auto/qnmeasatelliteinfosource/CMakeLists.txt @@ -0,0 +1,7 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +add_subdirectory(dummy) +add_subdirectory(generic_realtime) +add_subdirectory(generic_simulation) +add_subdirectory(nmea) diff --git a/tests/auto/qnmeasatelliteinfosource/dummy/CMakeLists.txt b/tests/auto/qnmeasatelliteinfosource/dummy/CMakeLists.txt new file mode 100644 index 0000000..c902575 --- /dev/null +++ b/tests/auto/qnmeasatelliteinfosource/dummy/CMakeLists.txt @@ -0,0 +1,17 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# special case begin +qt_internal_add_test(tst_dummynmeasatelliteinfosource + SOURCES + ../../utils/qlocationtestutils.cpp ../../utils/qlocationtestutils_p.h + ../../utils/qnmeaproxyfactory.cpp ../../utils/qnmeaproxyfactory.h + tst_dummynmeasatelliteinfosource.cpp + INCLUDE_DIRECTORIES + .. + LIBRARIES + Qt::Core + Qt::Network + Qt::Positioning +) +# special case end diff --git a/tests/auto/qnmeasatelliteinfosource/dummy/tst_dummynmeasatelliteinfosource.cpp b/tests/auto/qnmeasatelliteinfosource/dummy/tst_dummynmeasatelliteinfosource.cpp new file mode 100644 index 0000000..cca8ee3 --- /dev/null +++ b/tests/auto/qnmeasatelliteinfosource/dummy/tst_dummynmeasatelliteinfosource.cpp @@ -0,0 +1,177 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include "../../utils/qnmeaproxyfactory.h" + +class DummyNmeaSatelliteInfoSource : public QNmeaSatelliteInfoSource +{ + Q_OBJECT + +public: + DummyNmeaSatelliteInfoSource(QObject *parent = 0); + +protected: +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) + QGeoSatelliteInfo::SatelliteSystem parseSatellitesInUseFromNmea(const char *data, int size, + QList &pnrsInUse) + QT6_ONLY(override) + { + return parseSatellitesInUseFromNmeaImpl(QByteArrayView{data, size}, pnrsInUse); + } + + SatelliteInfoParseStatus parseSatelliteInfoFromNmea(const char *data, int size, + QList &infos, + QGeoSatelliteInfo::SatelliteSystem &system) + QT6_ONLY(override) + { + return parseSatelliteInfoImpl(QByteArrayView{data, size}, infos, system); + } +#else + QGeoSatelliteInfo::SatelliteSystem parseSatellitesInUseFromNmea(QByteArrayView data, + QList &pnrsInUse) + QT7_ONLY(override) + { + return parseSatellitesInUseFromNmeaImpl(data, pnrsInUse); + } + SatelliteInfoParseStatus parseSatelliteInfoFromNmea(QByteArrayView data, + QList &infos, + QGeoSatelliteInfo::SatelliteSystem &system) + QT7_ONLY(override) + { + return parseSatelliteInfoImpl(data, infos, system); + } +#endif +private: + QGeoSatelliteInfo::SatelliteSystem parseSatellitesInUseFromNmeaImpl(QByteArrayView data, + QList &pnrsInUse); + SatelliteInfoParseStatus parseSatelliteInfoImpl(QByteArrayView data, + QList &infos, + QGeoSatelliteInfo::SatelliteSystem &system); +}; + +DummyNmeaSatelliteInfoSource::DummyNmeaSatelliteInfoSource(QObject *parent) + : QNmeaSatelliteInfoSource(QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode, parent) +{ +} + +QGeoSatelliteInfo::SatelliteSystem +DummyNmeaSatelliteInfoSource::parseSatellitesInUseFromNmeaImpl(QByteArrayView data, + QList &pnrsInUse) +{ + // expected format: "USE:num1;num2;num3\n" + // example: "USE:1;3;4;7\n" + if (data.isEmpty()) + return QGeoSatelliteInfo::Undefined; + + QString str = QLatin1String(data).toString(); + if (!str.startsWith("USE:")) + return QGeoSatelliteInfo::Undefined; + + const QStringList sl = str.mid(4).split(";", Qt::SkipEmptyParts); + + if (sl.empty()) + return QGeoSatelliteInfo::Undefined; + + for (const auto &str : sl) { + bool ok = false; + int value = str.toInt(&ok); + if (ok) { + pnrsInUse.push_back(value); + } + } + return QGeoSatelliteInfo::GPS; +} + +QNmeaSatelliteInfoSource::SatelliteInfoParseStatus +DummyNmeaSatelliteInfoSource::parseSatelliteInfoImpl(QByteArrayView data, + QList &infos, + QGeoSatelliteInfo::SatelliteSystem &system) +{ + // expected format: "INFO:system,identifier;system,identifier;system,identifier\n" + // example: "INFO:1,5;1,7;1,15\n" + if (data.isEmpty()) + return NotParsed; + + QString str = QLatin1String(data).toString(); + if (!str.startsWith("INFO:")) + return NotParsed; + + QStringList sat_infos = str.mid(5).split(";", Qt::SkipEmptyParts); + + if (sat_infos.empty()) + return NotParsed; + + for (const auto &sat_info : sat_infos) { + QStringList parameters = sat_info.split(",", Qt::SkipEmptyParts); + if (parameters.size() == 2) { + QGeoSatelliteInfo info; + info.setSatelliteSystem( + static_cast(parameters[0].toInt())); + info.setSatelliteIdentifier(parameters[1].toInt()); + infos.push_back(info); + } + } + + system = infos.isEmpty() ? QGeoSatelliteInfo::Undefined : infos.front().satelliteSystem(); + + return FullyParsed; +} + +class tst_DummyNmeaSatelliteInfoSource : public QObject +{ + Q_OBJECT + +private slots: + void testOverloadedParseFunction(); +}; + +void tst_DummyNmeaSatelliteInfoSource::testOverloadedParseFunction() +{ + DummyNmeaSatelliteInfoSource source; + QNmeaProxyFactory factory; + QScopedPointer proxy( + factory.createSatelliteInfoSourceProxy(&source)); + + QSignalSpy inUseSpy(proxy->source(), &QNmeaSatelliteInfoSource::satellitesInUseUpdated); + QSignalSpy inViewSpy(proxy->source(), &QNmeaSatelliteInfoSource::satellitesInViewUpdated); + + proxy->source()->startUpdates(); + + // first we need to send all satellites + proxy->feedBytes("INFO:1,5;1,7;1,15\n"); + // then - used ones + proxy->feedBytes("USE:5;15\n"); + + QTRY_VERIFY_WITH_TIMEOUT(inUseSpy.size() == 1, 10000); + QTRY_VERIFY_WITH_TIMEOUT(inViewSpy.size() == 1, 10000); + + QGeoSatelliteInfo info_1_5; + info_1_5.setSatelliteSystem(QGeoSatelliteInfo::GPS); + info_1_5.setSatelliteIdentifier(5); + + QGeoSatelliteInfo info_1_7; + info_1_7.setSatelliteSystem(QGeoSatelliteInfo::GPS); + info_1_7.setSatelliteIdentifier(7); + + QGeoSatelliteInfo info_1_15; + info_1_15.setSatelliteSystem(QGeoSatelliteInfo::GPS); + info_1_15.setSatelliteIdentifier(15); + + const QList desiredInView = { info_1_5, info_1_7, info_1_15 }; + const QList desiredInUse = { info_1_5, info_1_15 }; + + const QList inViewList = + inViewSpy.at(0).at(0).value>(); + const QList inUseList = + inUseSpy.at(0).at(0).value>(); + + QCOMPARE(inViewList, desiredInView); + QCOMPARE(inUseList, desiredInUse); +} + +#include "tst_dummynmeasatelliteinfosource.moc" + +QTEST_GUILESS_MAIN(tst_DummyNmeaSatelliteInfoSource); diff --git a/tests/auto/qnmeasatelliteinfosource/generic_realtime/CMakeLists.txt b/tests/auto/qnmeasatelliteinfosource/generic_realtime/CMakeLists.txt new file mode 100644 index 0000000..13dfb05 --- /dev/null +++ b/tests/auto/qnmeasatelliteinfosource/generic_realtime/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# special case begin +qt_internal_add_test(tst_nmeasatelliteinfosource_generic_rt + SOURCES + ../../qgeosatelliteinfosource/testqgeosatelliteinfosource.cpp ../../qgeosatelliteinfosource/testqgeosatelliteinfosource_p.h + ../../utils/qlocationtestutils.cpp ../../utils/qlocationtestutils_p.h + ../../utils/qnmeaproxyfactory.cpp ../../utils/qnmeaproxyfactory.h + tst_nmeasatelliteinfosource_generic_rt.cpp + INCLUDE_DIRECTORIES + .. + LIBRARIES + Qt::Core + Qt::Network + Qt::Positioning + Qt::TestPrivate +) +# special case end diff --git a/tests/auto/qnmeasatelliteinfosource/generic_realtime/tst_nmeasatelliteinfosource_generic_rt.cpp b/tests/auto/qnmeasatelliteinfosource/generic_realtime/tst_nmeasatelliteinfosource_generic_rt.cpp new file mode 100644 index 0000000..f680022 --- /dev/null +++ b/tests/auto/qnmeasatelliteinfosource/generic_realtime/tst_nmeasatelliteinfosource_generic_rt.cpp @@ -0,0 +1,68 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include "../../qgeosatelliteinfosource/testqgeosatelliteinfosource_p.h" +#include "../../utils/qnmeaproxyfactory.h" +#include "../../utils/qlocationtestutils_p.h" + +class Feeder : public QObject +{ + Q_OBJECT +public: + Feeder(QObject *parent) : QObject(parent) + { + } + + void start(QNmeaSatelliteInfoSourceProxy *proxy) + { + m_proxy = proxy; + QTimer *timer = new QTimer(this); + QObject::connect(timer, &QTimer::timeout, this, &Feeder::timeout); + timer->setInterval(proxy->source()->minimumUpdateInterval() * 2); + timer->start(); + } + +public slots: + void timeout() + { + // Here we need to provide different chunks of data, because the signals + // are emitted only when data changes. + if (has_data) { + m_proxy->feedBytes(QLocationTestUtils::createGsvLongSentence().toLatin1()); + m_proxy->feedBytes(QLocationTestUtils::createGsaLongSentence().toLatin1()); + } else { + m_proxy->feedBytes(QLocationTestUtils::createGsvSentence().toLatin1()); + m_proxy->feedBytes(QLocationTestUtils::createGsaSentence().toLatin1()); + } + has_data = !has_data; + } + +private: + QNmeaSatelliteInfoSourceProxy *m_proxy; + bool has_data = true; +}; + +class tst_QNmeaSatelliteInfoSource_Generic_Realtime : public TestQGeoSatelliteInfoSource +{ + Q_OBJECT +protected: + QGeoSatelliteInfoSource *createTestSource() override + { + QNmeaSatelliteInfoSource *source = + new QNmeaSatelliteInfoSource(QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode); + QNmeaSatelliteInfoSourceProxy *proxy = m_factory.createSatelliteInfoSourceProxy(source); + Feeder *feeder = new Feeder(source); + feeder->start(proxy); + return source; + } + +private: + QNmeaProxyFactory m_factory; +}; + +#include "tst_nmeasatelliteinfosource_generic_rt.moc" + +QTEST_GUILESS_MAIN(tst_QNmeaSatelliteInfoSource_Generic_Realtime) diff --git a/tests/auto/qnmeasatelliteinfosource/generic_simulation/CMakeLists.txt b/tests/auto/qnmeasatelliteinfosource/generic_simulation/CMakeLists.txt new file mode 100644 index 0000000..f6f29ef --- /dev/null +++ b/tests/auto/qnmeasatelliteinfosource/generic_simulation/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# special case begin +qt_internal_add_test(tst_nmeasatelliteinfosource_generic_sim + SOURCES + ../../qgeosatelliteinfosource/testqgeosatelliteinfosource.cpp ../../qgeosatelliteinfosource/testqgeosatelliteinfosource_p.h + ../../utils/qlocationtestutils.cpp ../../utils/qlocationtestutils_p.h + ../../utils/qnmeaproxyfactory.cpp ../../utils/qnmeaproxyfactory.h + tst_nmeasatelliteinfosource_generic_sim.cpp + INCLUDE_DIRECTORIES + .. + LIBRARIES + Qt::Core + Qt::Network + Qt::Positioning + Qt::TestPrivate +) +# special case end diff --git a/tests/auto/qnmeasatelliteinfosource/generic_simulation/tst_nmeasatelliteinfosource_generic_sim.cpp b/tests/auto/qnmeasatelliteinfosource/generic_simulation/tst_nmeasatelliteinfosource_generic_sim.cpp new file mode 100644 index 0000000..95381fa --- /dev/null +++ b/tests/auto/qnmeasatelliteinfosource/generic_simulation/tst_nmeasatelliteinfosource_generic_sim.cpp @@ -0,0 +1,70 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include "../../qgeosatelliteinfosource/testqgeosatelliteinfosource_p.h" +#include "../../utils/qlocationtestutils_p.h" + +class UnlimitedNmeaStream : public QIODevice +{ + Q_OBJECT + +public: + UnlimitedNmeaStream(QObject *parent) : QIODevice(parent) {} + +protected: + qint64 readData(char *data, qint64 maxSize) override + { + if (maxSize == 0) + return 0; + QByteArray bytes; + if (genSatInView) { + increaseSatId(); + bytes = QLocationTestUtils::createGsvVariableSentence(satId).toLatin1(); + } else { + bytes = QLocationTestUtils::createGsaVariableSentence(satId).toLatin1(); + } + genSatInView = !genSatInView; + qint64 sz = qMin(qint64(bytes.size()), maxSize); + memcpy(data, bytes.constData(), sz); + return sz; + } + + qint64 writeData(const char *, qint64) override + { + return -1; + } + + qint64 bytesAvailable() const override + { + return 1024 + QIODevice::bytesAvailable(); + } + +private: + void increaseSatId() + { + if (++satId == 0) + satId = 1; + } + + quint8 satId = 0; + bool genSatInView = true; +}; + +class tst_QNmeaSatelliteInfoSource_Generic_Simulation : public TestQGeoSatelliteInfoSource +{ + Q_OBJECT +protected: + QGeoSatelliteInfoSource *createTestSource() override + { + QNmeaSatelliteInfoSource *source = + new QNmeaSatelliteInfoSource(QNmeaSatelliteInfoSource::UpdateMode::SimulationMode); + source->setDevice(new UnlimitedNmeaStream(source)); + return source; + } +}; + +#include "tst_nmeasatelliteinfosource_generic_sim.moc" + +QTEST_GUILESS_MAIN(tst_QNmeaSatelliteInfoSource_Generic_Simulation) diff --git a/tests/auto/qnmeasatelliteinfosource/nmea/CMakeLists.txt b/tests/auto/qnmeasatelliteinfosource/nmea/CMakeLists.txt new file mode 100644 index 0000000..701c0fc --- /dev/null +++ b/tests/auto/qnmeasatelliteinfosource/nmea/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# special case begin +qt_internal_add_test(tst_nmeasatelliteinfosource + SOURCES + ../../utils/qlocationtestutils.cpp ../../utils/qlocationtestutils_p.h + tst_nmeasatelliteinfosource.cpp + INCLUDE_DIRECTORIES + .. + LIBRARIES + Qt::Core + Qt::Positioning +) +# special case end diff --git a/tests/auto/qnmeasatelliteinfosource/nmea/tst_nmeasatelliteinfosource.cpp b/tests/auto/qnmeasatelliteinfosource/nmea/tst_nmeasatelliteinfosource.cpp new file mode 100644 index 0000000..a804a52 --- /dev/null +++ b/tests/auto/qnmeasatelliteinfosource/nmea/tst_nmeasatelliteinfosource.cpp @@ -0,0 +1,531 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include +#include "../../utils/qlocationtestutils_p.h" + +class DataFeeder : public QIODevice +{ + Q_OBJECT +public: + DataFeeder(QNmeaSatelliteInfoSource *parent) + : QIODevice(parent), m_parentMode(parent->updateMode()) + { + } + + void setMessages(const QList &messages) + { + m_messages = messages; + m_canReadLine = true; + m_messageIndex = 0; + if (m_parentMode == QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode) + emit readyRead(); + } + +signals: + void messageSent(); + +protected: + qint64 readData(char *data, qint64 maxSize) override + { + if (maxSize == 0 || m_messageIndex < 0 || m_messageIndex >= m_messages.size()) + return 0; + + m_canReadLine = false; + + QByteArray bytes = m_messages.at(m_messageIndex); + qint64 sz = qMin(qint64(bytes.size()), maxSize); + memcpy(data, bytes.constData(), sz); + + m_messageIndex++; + + emit messageSent(); + QTimer::singleShot(10, this, &DataFeeder::onTimer); + + return sz; + } + + qint64 writeData(const char *, qint64) override { return -1; } + + qint64 bytesAvailable() const override { return 1024 + QIODevice::bytesAvailable(); } + + bool canReadLine() const override + { + return m_canReadLine && (m_messageIndex >= 0) && (m_messageIndex < m_messages.size()); + } + +private slots: + void onTimer() + { + m_canReadLine = true; + if (m_parentMode == QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode) + emit readyRead(); + } + +private: + QNmeaSatelliteInfoSource::UpdateMode m_parentMode; + QList m_messages; + qsizetype m_messageIndex = 0; + bool m_canReadLine = true; // To read each line separately +}; + +class tst_QNmeaSatelliteInfoSource : public QObject +{ + Q_OBJECT +private slots: + void backendProperty(); + void backendProperty_data(); + + void parseDataStream(); + void parseDataStream_data(); + +private: + QGeoSatelliteInfo createSatelliteInfo(QGeoSatelliteInfo::SatelliteSystem system, int id, + int snr); +}; + +void tst_QNmeaSatelliteInfoSource::backendProperty() +{ + QFETCH(int, simulationRate); + QFETCH(int, updateInterval); + QFETCH(QList, messages); + QFETCH(int, timeout); + QFETCH(int, desiredMessagesSent); + + QNmeaSatelliteInfoSource source(QNmeaSatelliteInfoSource::UpdateMode::SimulationMode); + auto feeder = new DataFeeder(&source); + source.setDevice(feeder); + + QSignalSpy messageSentSpy(feeder, &DataFeeder::messageSent); + QSignalSpy inViewSpy(&source, &QNmeaSatelliteInfoSource::satellitesInViewUpdated); + + source.setBackendProperty(QNmeaSatelliteInfoSource::SimulationUpdateInterval, simulationRate); + source.setUpdateInterval(updateInterval); + + source.startUpdates(); + feeder->setMessages(messages); + + QTRY_VERIFY_WITH_TIMEOUT(inViewSpy.size() == 1, timeout); + + QCOMPARE(source.backendProperty(QNmeaSatelliteInfoSource::SimulationUpdateInterval).toInt(), + simulationRate); + QCOMPARE(source.updateInterval(), updateInterval); + + QCOMPARE(messageSentSpy.size(), desiredMessagesSent); +} + +void tst_QNmeaSatelliteInfoSource::backendProperty_data() +{ + QTest::addColumn("simulationRate"); + QTest::addColumn("updateInterval"); + QTest::addColumn>("messages"); + QTest::addColumn("timeout"); + QTest::addColumn("desiredMessagesSent"); + + const auto simpleGpsGsvMessage = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GPGSV,1,1,4,05,,,25,07,,,,08,,,,13,,,36*") + .toLatin1(); + + const QList msgs(10, simpleGpsGsvMessage); + + // here updateInterval should not be a multiple of simulationRate because + // this will make the test flacky due to timer precision. + QTest::addRow("Simulation rate smaller than updateInterval") << 200 << 500 << msgs << 550 << 2; + + QTest::addRow("Simulation rate larger than updateInterval") << 200 << 100 << msgs << 300 << 1; + + // Here we do not really have problems with timer precision, because even if + // the updateInterval() timer expires earlier, we will not get any update + // until the real data comes. + QTest::addRow("Simulation rate equals updateInterval") << 200 << 200 << msgs << 300 << 1; +} + +void tst_QNmeaSatelliteInfoSource::parseDataStream() +{ + QFETCH(QNmeaSatelliteInfoSource::UpdateMode, mode); + QFETCH(QList, messages); + QFETCH(QList, desiredInView); + QFETCH(QList, desiredInUse); + + QNmeaSatelliteInfoSource source(mode); + auto feeder = new DataFeeder(&source); + source.setDevice(feeder); + + QSignalSpy messageSentSpy(feeder, &DataFeeder::messageSent); + QSignalSpy inViewSpy(&source, &QNmeaSatelliteInfoSource::satellitesInViewUpdated); + QSignalSpy inUseSpy(&source, &QNmeaSatelliteInfoSource::satellitesInUseUpdated); + + source.startUpdates(); + feeder->setMessages(messages); + + QTRY_VERIFY_WITH_TIMEOUT(messageSentSpy.size() == messages.size(), 2000); + QVERIFY(!inViewSpy.isEmpty()); + QVERIFY(!inUseSpy.isEmpty()); + + const auto inView = inViewSpy.back().at(0).value>(); + QCOMPARE(inView, desiredInView); + + const auto inUse = inUseSpy.back().at(0).value>(); + QCOMPARE(inUse, desiredInUse); +} + +void tst_QNmeaSatelliteInfoSource::parseDataStream_data() +{ + QTest::addColumn("mode"); + QTest::addColumn>("messages"); + QTest::addColumn>("desiredInView"); + QTest::addColumn>("desiredInUse"); + + // We will use only satId and SNR, to simplify objects for comparison + + // one line GPS + const auto simpleGpsGsvMessage = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GPGSV,1,1,4,05,,,25,07,,,,08,,,,13,,,36*") + .toLatin1(); + const auto simpleGpsGsaMessage = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GPGSA,A,3,05,13,,,,,,,,,,,50.95,50.94,1.00*") + .toLatin1(); + + const auto simpleGpsInView = + QList { createSatelliteInfo(QGeoSatelliteInfo::GPS, 5, 25), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 7, -1), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 8, -1), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 13, 36) }; + const auto simpleGpsInUse = + QList { createSatelliteInfo(QGeoSatelliteInfo::GPS, 5, 25), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 13, 36) }; + + QTest::newRow("realtime GPS") << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { simpleGpsGsvMessage, simpleGpsGsaMessage } + << simpleGpsInView << simpleGpsInUse; + + QTest::newRow("simulation GPS") + << QNmeaSatelliteInfoSource::UpdateMode::SimulationMode + << QList { simpleGpsGsvMessage, simpleGpsGsaMessage } << simpleGpsInView + << simpleGpsInUse; + + // multi line GPS + const auto complexGpsGsvMessage1 = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GPGSV,2,1,8,05,,,22,07,,,,08,,,,13,,,18*") + .toLatin1(); + const auto complexGpsGsvMessage2 = + QLocationTestUtils::addNmeaChecksumAndBreaks("$GPGSV,2,2,8,14,,,,15,,,18,18,,,,20,,,*") + .toLatin1(); + const auto complexGpsGsaMessage = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GPGSA,A,3,05,13,15,,,,,,,,,,50.95,50.94,1.00*") + .toLatin1(); + + const auto complexGpsInView = + QList { createSatelliteInfo(QGeoSatelliteInfo::GPS, 5, 22), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 7, -1), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 8, -1), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 13, 18), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 14, -1), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 15, 18), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 18, -1), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 20, -1) }; + const auto complexGpsInUse = + QList { createSatelliteInfo(QGeoSatelliteInfo::GPS, 5, 22), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 13, 18), + createSatelliteInfo(QGeoSatelliteInfo::GPS, 15, 18) }; + + QTest::newRow("realtime multi-line GPS") + << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { complexGpsGsvMessage1, complexGpsGsvMessage2, + complexGpsGsaMessage } + << complexGpsInView << complexGpsInUse; + + QTest::newRow("simulation multi-line GPS") + << QNmeaSatelliteInfoSource::UpdateMode::SimulationMode + << QList { complexGpsGsvMessage1, complexGpsGsvMessage2, + complexGpsGsaMessage } + << complexGpsInView << complexGpsInUse; + + // one line GPS & GLONASS + const auto simpleGlnsGsvMessage = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GLGSV,1,1,4,65,,,,66,,,,71,,,20,72,,,28*") + .toLatin1(); + const auto gnSimpleGlnsGsaMessage = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GNGSA,A,3,71,72,,,,,,,,,,,50.95,50.94,1.00*") + .toLatin1(); + const auto gnSimpleGpsGsaMessage = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GNGSA,A,3,05,13,,,,,,,,,,,50.95,50.94,1.00*") + .toLatin1(); + + const auto simpleGlnsInView = + QList { createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 65, -1), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 66, -1), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 71, 20), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 72, 28) }; + const auto simpleGlnsInUse = + QList { createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 71, 20), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 72, 28) }; + + const auto simpleGpsGlnsInView = simpleGpsInView + simpleGlnsInView; + const auto simpleGpsGlnsInUse = simpleGpsInUse + simpleGlnsInUse; + + QTest::newRow("realtime GPS & GLONASS") + << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { simpleGpsGsvMessage, simpleGlnsGsvMessage, gnSimpleGpsGsaMessage, + gnSimpleGlnsGsaMessage } + << simpleGpsGlnsInView << simpleGpsGlnsInUse; + + QTest::newRow("simulation GPS & GLONASS") + << QNmeaSatelliteInfoSource::UpdateMode::SimulationMode + << QList { simpleGpsGsvMessage, simpleGlnsGsvMessage, gnSimpleGpsGsaMessage, + gnSimpleGlnsGsaMessage } + << simpleGpsGlnsInView << simpleGpsGlnsInUse; + + // multi line GPS & GLONASS + const auto complexGlnsGsvMessage1 = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GLGSV,3,1,10,65,,,,66,,,,71,,,20,72,,,28*") + .toLatin1(); + const auto complexGlnsGsvMessage2 = + QLocationTestUtils::addNmeaChecksumAndBreaks("$GLGSV,3,2,10,73,,,,74,,,,75,,,33,81,,,*") + .toLatin1(); + const auto complexGlnsGsvMessage3 = + QLocationTestUtils::addNmeaChecksumAndBreaks("$GLGSV,3,3,10,82,,,,83,,,*").toLatin1(); + const auto gnComplexGlnsGsaMessage = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GNGSA,A,3,71,72,75,,,,,,,,,,50.95,50.94,1.00*") + .toLatin1(); + const auto gnComplexGpsGsaMessage = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GNGSA,A,3,05,13,15,,,,,,,,,,50.95,50.94,1.00*") + .toLatin1(); + + const auto complexGlnsInView = + QList { createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 65, -1), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 66, -1), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 71, 20), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 72, 28), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 73, -1), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 74, -1), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 75, 33), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 81, -1), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 82, -1), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 83, -1) }; + const auto complexGlnsInUse = + QList { createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 71, 20), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 72, 28), + createSatelliteInfo(QGeoSatelliteInfo::GLONASS, 75, 33) }; + + const auto complexGpsGlnsInView = complexGpsInView + complexGlnsInView; + const auto complexGpsGlnsInUse = complexGpsInUse + complexGlnsInUse; + + QTest::newRow("realtime multi-line GPS & GLONASS") + << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { complexGpsGsvMessage1, complexGpsGsvMessage2, + complexGlnsGsvMessage1, complexGlnsGsvMessage2, + complexGlnsGsvMessage3, gnComplexGpsGsaMessage, + gnComplexGlnsGsaMessage } + << complexGpsGlnsInView << complexGpsGlnsInUse; + + QTest::newRow("simulation multi-line GPS & GLONASS") + << QNmeaSatelliteInfoSource::UpdateMode::SimulationMode + << QList { complexGpsGsvMessage1, complexGpsGsvMessage2, + complexGlnsGsvMessage1, complexGlnsGsvMessage2, + complexGlnsGsvMessage3, gnComplexGpsGsaMessage, + gnComplexGlnsGsaMessage } + << complexGpsGlnsInView << complexGpsGlnsInUse; + + // multi-line GPS & GLONASS: GSA before GSV + QTest::newRow("realtime multi-line GPS & GLONASS reverse") + << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { gnComplexGlnsGsaMessage, gnComplexGpsGsaMessage, + complexGlnsGsvMessage1, complexGlnsGsvMessage2, + complexGlnsGsvMessage3, complexGpsGsvMessage1, + complexGpsGsvMessage2 } + << complexGpsGlnsInView << complexGpsGlnsInUse; + + QTest::newRow("simulation multi-line GPS & GLONASS reverse") + << QNmeaSatelliteInfoSource::UpdateMode::SimulationMode + << QList { gnComplexGlnsGsaMessage, gnComplexGpsGsaMessage, + complexGlnsGsvMessage1, complexGlnsGsvMessage2, + complexGlnsGsvMessage3, complexGpsGsvMessage1, + complexGpsGsvMessage2 } + << complexGpsGlnsInView << complexGpsGlnsInUse; + + // multi-line GSP & GLONASS: mixed order + QTest::newRow("realtime multi-line GPS & GLONASS mixed") + << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { gnComplexGlnsGsaMessage, complexGlnsGsvMessage1, + complexGlnsGsvMessage2, complexGlnsGsvMessage3, + complexGpsGsvMessage1, complexGpsGsvMessage2, + gnComplexGpsGsaMessage } + << complexGpsGlnsInView << complexGpsGlnsInUse; + + QTest::newRow("simulation multi-line GPS & GLONASS mixed") + << QNmeaSatelliteInfoSource::UpdateMode::SimulationMode + << QList { gnComplexGlnsGsaMessage, complexGlnsGsvMessage1, + complexGlnsGsvMessage2, complexGlnsGsvMessage3, + complexGpsGsvMessage1, complexGpsGsvMessage2, + gnComplexGpsGsaMessage } + << complexGpsGlnsInView << complexGpsGlnsInUse; + + // one line GPS & GLONASS: empty GNGSA for GPS + const auto gnEmptyGpsGsaMessage = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*") + .toLatin1(); + + QTest::newRow("realtime GSP & GLONASS: empty GSA for GPS") + << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { simpleGpsGsvMessage, simpleGlnsGsvMessage, + gnSimpleGlnsGsaMessage, gnEmptyGpsGsaMessage } + << simpleGpsGlnsInView << simpleGlnsInUse; + + QTest::newRow("simulation GSP & GLONASS: empty GSA for GPS") + << QNmeaSatelliteInfoSource::UpdateMode::SimulationMode + << QList { simpleGpsGsvMessage, simpleGlnsGsvMessage, + gnSimpleGlnsGsaMessage, gnEmptyGpsGsaMessage } + << simpleGpsGlnsInView << simpleGlnsInUse; + + // one line GPS & GLONASS: empty $GPGSV + const auto emptyGpsGsvMessage = + QLocationTestUtils::addNmeaChecksumAndBreaks("$GPGSV,1,1,0,,,,,,,,,,,,,,,,*") + .toLatin1(); + + QTest::newRow("realtime GPS & GLONASS: empty $GPGSV") + << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { emptyGpsGsvMessage, simpleGlnsGsvMessage, gnSimpleGlnsGsaMessage, + gnSimpleGpsGsaMessage } + << simpleGlnsInView << simpleGlnsInUse; + + QTest::newRow("simulation GPS & GLONASS: empty $GPGSV") + << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { emptyGpsGsvMessage, simpleGlnsGsvMessage, gnSimpleGlnsGsaMessage, + gnSimpleGpsGsaMessage } + << simpleGlnsInView << simpleGlnsInUse; + + // one line GPS & GLONASS: empty GNGSA in the middle + // In this test we send the following sequence: + // 1. $GPGSV - valid GPS in view + // 2. $GLGSV - valid GLONASS in view + // 3. $GNGSA - valid GPS in use + // 4. $GNGSA - valid GLONASS in use + // 5. $GPGSV - valid GPS in view + // 6. $GNGSA - empty GNGSA (meaning empty GPS) + // 7. $GPGSV - valid GPS in view: at this point GPS in use will be cleared + // As a result, we will see valid GPS & GLONASS in view, but only GLONASS + // in use. + + QTest::newRow("realtime GPS & GLONASS: empty $GNGSA in the middle") + << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { simpleGpsGsvMessage, simpleGlnsGsvMessage, + gnSimpleGpsGsaMessage, gnSimpleGlnsGsaMessage, + simpleGpsGsvMessage, gnEmptyGpsGsaMessage, + simpleGpsGsvMessage } + << simpleGpsGlnsInView << simpleGlnsInUse; + + QTest::newRow("simulation GPS & GLONASS: empty $GNGSA in the middle") + << QNmeaSatelliteInfoSource::UpdateMode::SimulationMode + << QList { simpleGpsGsvMessage, simpleGlnsGsvMessage, + gnSimpleGpsGsaMessage, gnSimpleGlnsGsaMessage, + simpleGpsGsvMessage, gnEmptyGpsGsaMessage, + simpleGpsGsvMessage } + << simpleGpsGlnsInView << simpleGlnsInUse; + + // BEIDOU signals for below test cases are just synthesized based on the + // NMEA protocol description. They were NEVER checked on real hardware, + // as we do not have one. + + // multi-line GPS, GLONASS & BEIDOU + const auto complexBduGsvMessage1 = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GBGSV,2,1,7,201,,,,202,,,,203,,,20,204,,,28*") + .toLatin1(); + const auto complexBduGsvMessage2 = + QLocationTestUtils::addNmeaChecksumAndBreaks("$GBGSV,2,2,7,205,,,,206,,,,207,,,33,,,,*") + .toLatin1(); + const auto gnComplexBduGsaMessage = QLocationTestUtils::addNmeaChecksumAndBreaks( + "$GNGSA,A,3,203,204,207,,,,,,,,,,50.95,50.94,1.00*") + .toLatin1(); + const auto complexBduInView = + QList { createSatelliteInfo(QGeoSatelliteInfo::BEIDOU, 201, -1), + createSatelliteInfo(QGeoSatelliteInfo::BEIDOU, 202, -1), + createSatelliteInfo(QGeoSatelliteInfo::BEIDOU, 203, 20), + createSatelliteInfo(QGeoSatelliteInfo::BEIDOU, 204, 28), + createSatelliteInfo(QGeoSatelliteInfo::BEIDOU, 205, -1), + createSatelliteInfo(QGeoSatelliteInfo::BEIDOU, 206, -1), + createSatelliteInfo(QGeoSatelliteInfo::BEIDOU, 207, 33) }; + const auto complexBduInUse = + QList { createSatelliteInfo(QGeoSatelliteInfo::BEIDOU, 203, 20), + createSatelliteInfo(QGeoSatelliteInfo::BEIDOU, 204, 28), + createSatelliteInfo(QGeoSatelliteInfo::BEIDOU, 207, 33) }; + + const auto complexGpsGlnsBduInView = complexGpsInView + complexGlnsInView + complexBduInView; + const auto complexGpsGlnsBduInUse = complexGpsInUse + complexGlnsInUse + complexBduInUse; + + QTest::newRow("realtime GPS, GLONASS & BEIDOU") + << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { complexGpsGsvMessage1, complexGpsGsvMessage2, + complexGlnsGsvMessage1, complexGlnsGsvMessage2, + complexGlnsGsvMessage3, complexBduGsvMessage1, + complexBduGsvMessage2, gnComplexGpsGsaMessage, + gnComplexGlnsGsaMessage, gnComplexBduGsaMessage } + << complexGpsGlnsBduInView << complexGpsGlnsBduInUse; + + QTest::newRow("simulation GPS, GLONASS & BEIDOU") + << QNmeaSatelliteInfoSource::UpdateMode::SimulationMode + << QList { complexGpsGsvMessage1, complexGpsGsvMessage2, + complexGlnsGsvMessage1, complexGlnsGsvMessage2, + complexGlnsGsvMessage3, complexBduGsvMessage1, + complexBduGsvMessage2, gnComplexGpsGsaMessage, + gnComplexGlnsGsaMessage, gnComplexBduGsaMessage } + << complexGpsGlnsBduInView << complexGpsGlnsBduInUse; + + // multi-line GPS, GLONASS & BEIDOU: GSA before GSV + QTest::newRow("realtime GPS, GLONASS & BEIDOU reverse") + << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { gnComplexGpsGsaMessage, gnComplexGlnsGsaMessage, + gnComplexBduGsaMessage, complexGpsGsvMessage1, + complexGpsGsvMessage2, complexGlnsGsvMessage1, + complexGlnsGsvMessage2, complexGlnsGsvMessage3, + complexBduGsvMessage1, complexBduGsvMessage2 } + << complexGpsGlnsBduInView << complexGpsGlnsBduInUse; + + QTest::newRow("simulation GPS, GLONASS & BEIDOU reverse") + << QNmeaSatelliteInfoSource::UpdateMode::SimulationMode + << QList { gnComplexGpsGsaMessage, gnComplexGlnsGsaMessage, + gnComplexBduGsaMessage, complexGpsGsvMessage1, + complexGpsGsvMessage2, complexGlnsGsvMessage1, + complexGlnsGsvMessage2, complexGlnsGsvMessage3, + complexBduGsvMessage1, complexBduGsvMessage2 } + << complexGpsGlnsBduInView << complexGpsGlnsBduInUse; + + // multi-line GPS, GLONASS & BEIDOU: mixed order + QTest::newRow("realtime GPS, GLONASS & BEIDOU mixed") + << QNmeaSatelliteInfoSource::UpdateMode::RealTimeMode + << QList { gnComplexGpsGsaMessage, complexGlnsGsvMessage1, + complexGlnsGsvMessage2, complexGlnsGsvMessage3, + complexBduGsvMessage1, complexBduGsvMessage2, + gnComplexGlnsGsaMessage, gnComplexBduGsaMessage, + complexGpsGsvMessage1, complexGpsGsvMessage2 } + << complexGpsGlnsBduInView << complexGpsGlnsBduInUse; + + QTest::newRow("simulation GPS, GLONASS & BEIDOU mixed") + << QNmeaSatelliteInfoSource::UpdateMode::SimulationMode + << QList { gnComplexGpsGsaMessage, complexGlnsGsvMessage1, + complexGlnsGsvMessage2, complexGlnsGsvMessage3, + complexBduGsvMessage1, complexBduGsvMessage2, + gnComplexGlnsGsaMessage, gnComplexBduGsaMessage, + complexGpsGsvMessage1, complexGpsGsvMessage2 } + << complexGpsGlnsBduInView << complexGpsGlnsBduInUse; +} + +QGeoSatelliteInfo +tst_QNmeaSatelliteInfoSource::createSatelliteInfo(QGeoSatelliteInfo::SatelliteSystem system, int id, + int snr) +{ + QGeoSatelliteInfo info; + info.setSatelliteSystem(system); + info.setSatelliteIdentifier(id); + info.setSignalStrength(snr); + info.setAttribute(QGeoSatelliteInfo::Azimuth, 0.0); + info.setAttribute(QGeoSatelliteInfo::Elevation, 0.0); + return info; +} + +#include "tst_nmeasatelliteinfosource.moc" + +QTEST_GUILESS_MAIN(tst_QNmeaSatelliteInfoSource) diff --git a/tests/auto/qquickgeocoordinateanimation/CMakeLists.txt b/tests/auto/qquickgeocoordinateanimation/CMakeLists.txt new file mode 100644 index 0000000..92fed8d --- /dev/null +++ b/tests/auto/qquickgeocoordinateanimation/CMakeLists.txt @@ -0,0 +1,12 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_test(tst_qquickgeocoordinateanimation + SOURCES + tst_qquickgeocoordinateanimation.cpp + LIBRARIES + Qt::Core + Qt::Positioning + Qt::PositioningQuickPrivate + Qt::TestPrivate +) diff --git a/tests/auto/qquickgeocoordinateanimation/tst_qquickgeocoordinateanimation.cpp b/tests/auto/qquickgeocoordinateanimation/tst_qquickgeocoordinateanimation.cpp new file mode 100644 index 0000000..8167a2a --- /dev/null +++ b/tests/auto/qquickgeocoordinateanimation/tst_qquickgeocoordinateanimation.cpp @@ -0,0 +1,28 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only +#include +#include +#include + +QT_USE_NAMESPACE + +class tst_QuickGeoCoordinateAnimation : public QObject +{ + Q_OBJECT + +private slots: + void bindings(); +}; + +void tst_QuickGeoCoordinateAnimation::bindings() +{ + QQuickGeoCoordinateAnimation animation; + QTestPrivate::testReadWritePropertyBasics( + animation, QQuickGeoCoordinateAnimation::East, QQuickGeoCoordinateAnimation::West, + "direction"); +} + +QTEST_APPLESS_MAIN(tst_QuickGeoCoordinateAnimation) + +#include "tst_qquickgeocoordinateanimation.moc" diff --git a/tests/auto/qwebmercator/CMakeLists.txt b/tests/auto/qwebmercator/CMakeLists.txt new file mode 100644 index 0000000..6eae3a1 --- /dev/null +++ b/tests/auto/qwebmercator/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +##################################################################### +## tst_qwebmercator Test: +##################################################################### + +qt_internal_add_test(tst_qwebmercator + SOURCES + tst_qwebmercator.cpp + LIBRARIES + Qt::Core + Qt::Positioning + Qt::PositioningPrivate +) diff --git a/tests/auto/qwebmercator/tst_qwebmercator.cpp b/tests/auto/qwebmercator/tst_qwebmercator.cpp new file mode 100644 index 0000000..526529f --- /dev/null +++ b/tests/auto/qwebmercator/tst_qwebmercator.cpp @@ -0,0 +1,43 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include + +QT_USE_NAMESPACE + +class tst_qwebmercator : public QObject +{ + Q_OBJECT + +private: + void transformForwardAndBackward(double lat, double lon) + { + QGeoCoordinate c(lat, lon); + QDoubleVector2D cmap = QWebMercator().coordToMercator(c); + QGeoCoordinate c1 = QWebMercator().mercatorToCoord(cmap); + QCOMPARE(c1.latitude(), c.latitude()); + QCOMPARE(c1.longitude(), c.longitude()); + } + +private slots: + void transformForwardAndBackward() + { + transformForwardAndBackward(0, 0); + // transformForwardAndBackward(42,180); //Will fail. + + for (double lon=-180; lon<181; lon += 22/3.) { + for (double lat=-90; lat<91; lat += 22/3.) + transformForwardAndBackward(lat, lon); + } + for (double eps = 1.0; eps > 1e-12; eps /= 10.0) { + transformForwardAndBackward(-90 + eps, 0.0); + transformForwardAndBackward(90 - eps, 0.0); + } + } +}; + +QTEST_GUILESS_MAIN(tst_qwebmercator) +#include "tst_qwebmercator.moc" diff --git a/tests/auto/satellitesourceplugin/CMakeLists.txt b/tests/auto/satellitesourceplugin/CMakeLists.txt new file mode 100644 index 0000000..f48c992 --- /dev/null +++ b/tests/auto/satellitesourceplugin/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_plugin(QGeoSatelliteInfoSourceTestPlugin + OUTPUT_NAME qtposition_satellitesourcetest + CLASS_NAME QGeoSatelliteInfoSourceTest + PLUGIN_TYPE position + DEFAULT_IF FALSE + SOURCES + plugin.cpp + LIBRARIES + Qt::Core + Qt::Positioning +) + diff --git a/tests/auto/satellitesourceplugin/plugin.cpp b/tests/auto/satellitesourceplugin/plugin.cpp new file mode 100644 index 0000000..3840afa --- /dev/null +++ b/tests/auto/satellitesourceplugin/plugin.cpp @@ -0,0 +1,235 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include +#include +#include + +QT_USE_NAMESPACE + +using namespace Qt::StringLiterals; + +class SatelliteSource : public QGeoSatelliteInfoSource +{ + Q_OBJECT + +public: + SatelliteSource(const QVariantMap ¶meters, QObject *parent=0); + ~SatelliteSource(); + + void startUpdates() override; + void stopUpdates() override; + void requestUpdate(int timeout = 5000) override; + + void setUpdateInterval(int msec) override; + int minimumUpdateInterval() const override; + Error error() const override; + + bool setBackendProperty(const QString &name, const QVariant &value) override; + QVariant backendProperty(const QString &name) const override; + +private slots: + void doTimeout(); + void updateSatelliteInfo(); + +private: + QTimer *timer; + QTimer *timeoutTimer; + QTimer *singleUpdateTimer; + Error lastError = QGeoSatelliteInfoSource::NoError; + QList satellitesInView; + QList satellitesInUse; + + qsizetype desiredInViewCount = 5; + qsizetype desiredInUseCount = 3; + bool useElevation = false; + bool useAzimuth = false; + QGeoSatelliteInfo::SatelliteSystem desiredSystem = QGeoSatelliteInfo::GPS; +}; + +SatelliteSource::SatelliteSource(const QVariantMap ¶meters, QObject *parent) + : QGeoSatelliteInfoSource(parent), + timer(new QTimer(this)), + timeoutTimer(new QTimer(this)), + singleUpdateTimer(new QTimer(this)) +{ + QVariant systemType = parameters.value("satellitesystem"_L1, QVariant()); + if (systemType.isValid()) + desiredSystem = systemType.value(); + + timer->setInterval(200); + connect(timer, &QTimer::timeout, this, &SatelliteSource::updateSatelliteInfo); + connect(singleUpdateTimer, &QTimer::timeout, this, &SatelliteSource::updateSatelliteInfo); + connect(timeoutTimer, &QTimer::timeout, this, &SatelliteSource::doTimeout); +} + +SatelliteSource::~SatelliteSource() +{ +} + +QGeoSatelliteInfoSource::Error SatelliteSource::error() const +{ + return lastError; +} + +bool SatelliteSource::setBackendProperty(const QString &name, const QVariant &value) +{ + if (name == "desiredInViewCount"_L1) + desiredInViewCount = value.value(); + else if (name == "desiredInUseCount"_L1) + desiredInUseCount = value.value(); + else if (name == "useElevation"_L1) + useElevation = value.toBool(); + else if (name == "useAzimuth"_L1) + useAzimuth = value.toBool(); + else + return false; + + return true; +} + +QVariant SatelliteSource::backendProperty(const QString &name) const +{ + if (name == "desiredInViewCount"_L1) + return desiredInViewCount; + else if (name == "desiredInUseCount"_L1) + return desiredInUseCount; + else if (name == "useElevation"_L1) + return useElevation; + else if (name == "useAzimuth"_L1) + return useAzimuth; + + return {}; +} + +void SatelliteSource::setUpdateInterval(int msec) +{ + const int minInterval = minimumUpdateInterval(); + if (msec == 0) { + timer->setInterval(minInterval); + } else if (msec < minInterval) { + msec = minInterval; + timer->setInterval(msec); + } else { + timer->setInterval(msec); + } + + QGeoSatelliteInfoSource::setUpdateInterval(msec); +} + +int SatelliteSource::minimumUpdateInterval() const +{ + return 200; +} + +void SatelliteSource::startUpdates() +{ + lastError = QGeoSatelliteInfoSource::NoError; + timer->start(); +} + +void SatelliteSource::stopUpdates() +{ + timer->stop(); +} + +void SatelliteSource::requestUpdate(int timeout) +{ + if (timeoutTimer->isActive()) + return; // already requested an update + + lastError = QGeoSatelliteInfoSource::NoError; + // Such logic for timeout handling is needed for tst_qgeosatelliteinfosource. + // It expects an immediate error in case of negative timeout. + if (timeout == 0) + timeout = 5000; + if (timeout < 0) + timeout = 0; + + timeoutTimer->setInterval(timeout); + timeoutTimer->start(); + + if (timer->isActive()) { + timer->stop(); + timer->start(); + } + singleUpdateTimer->start(minimumUpdateInterval()); +} + +void SatelliteSource::doTimeout() +{ + timeoutTimer->stop(); + singleUpdateTimer->stop(); + lastError = QGeoSatelliteInfoSource::UpdateTimeoutError; + emit errorOccurred(lastError); +} + +void SatelliteSource::updateSatelliteInfo() +{ + timeoutTimer->stop(); + singleUpdateTimer->stop(); + + if (desiredInUseCount > desiredInViewCount) + desiredInUseCount = desiredInViewCount; + + satellitesInView.clear(); + satellitesInUse.clear(); + for (qsizetype i = 0; i < desiredInViewCount; ++i) { + QGeoSatelliteInfo si; + si.setSatelliteSystem(desiredSystem); + si.setSatelliteIdentifier(i + 1); + si.setSignalStrength(5 * (i + 1)); + if (useElevation) + si.setAttribute(QGeoSatelliteInfo::Elevation, 3.0 * (i + 1)); + if (useAzimuth) + si.setAttribute(QGeoSatelliteInfo::Azimuth, 0.5 * (i + 1)); + + satellitesInView.push_back(si); + if (i < desiredInUseCount) + satellitesInUse.push_back(si); + } + emit satellitesInViewUpdated(satellitesInView); + emit satellitesInUseUpdated(satellitesInUse); +} + + +class QGeoPositionInfoSourceFactoryTest : public QObject, public QGeoPositionInfoSourceFactory +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.qt.position.sourcefactory/6.0" + FILE "plugin.json") + Q_INTERFACES(QGeoPositionInfoSourceFactory) + +public: + QGeoPositionInfoSource *positionInfoSource(QObject *parent, + const QVariantMap ¶meters) override; + QGeoSatelliteInfoSource *satelliteInfoSource(QObject *parent, + const QVariantMap ¶meters) override; + QGeoAreaMonitorSource *areaMonitor(QObject *parent, const QVariantMap ¶meters) override; +}; + +QGeoPositionInfoSource * +QGeoPositionInfoSourceFactoryTest::positionInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent); + Q_UNUSED(parameters); + return nullptr; +} + +QGeoSatelliteInfoSource * +QGeoPositionInfoSourceFactoryTest::satelliteInfoSource(QObject *parent, const QVariantMap ¶meters) +{ + return new SatelliteSource(parameters, parent); +} + +QGeoAreaMonitorSource * +QGeoPositionInfoSourceFactoryTest::areaMonitor(QObject *parent, const QVariantMap ¶meters) +{ + Q_UNUSED(parent); + Q_UNUSED(parameters); + return nullptr; +} + +#include "plugin.moc" diff --git a/tests/auto/satellitesourceplugin/plugin.json b/tests/auto/satellitesourceplugin/plugin.json new file mode 100644 index 0000000..ab0be1b --- /dev/null +++ b/tests/auto/satellitesourceplugin/plugin.json @@ -0,0 +1,9 @@ +{ + "Keys": ["satellitesource.test"], + "Provider": "satellitesource.test", + "Position": false, + "Satellite": true, + "Monitor": false, + "Priority": 2, + "Testable": true +} diff --git a/tests/auto/utils/qlocationtestutils.cpp b/tests/auto/utils/qlocationtestutils.cpp new file mode 100644 index 0000000..343cbc7 --- /dev/null +++ b/tests/auto/utils/qlocationtestutils.cpp @@ -0,0 +1,89 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include "qlocationtestutils_p.h" + +bool QLocationTestUtils::hasDefaultSource() +{ + return false; +} + +bool QLocationTestUtils::hasDefaultMonitor() +{ + return false; +} + +QString QLocationTestUtils::addNmeaChecksumAndBreaks(const QString &sentence) +{ + Q_ASSERT(sentence[0] == '$' && sentence[sentence.size()-1] == '*'); + + // XOR byte value of all characters between '$' and '*' + int result = 0; + for (int i=1; i(satId)); + return addNmeaChecksumAndBreaks(nmea); +} + +QString QLocationTestUtils::createGsvVariableSentence(quint8 satId) +{ + const QString nmea = QString("$GPGSV,1,1,1,%1,49,115,42,,,,,,,,,,,,*").arg(static_cast(satId)); + return addNmeaChecksumAndBreaks(nmea); +} diff --git a/tests/auto/utils/qlocationtestutils_p.h b/tests/auto/utils/qlocationtestutils_p.h new file mode 100644 index 0000000..a304eeb --- /dev/null +++ b/tests/auto/utils/qlocationtestutils_p.h @@ -0,0 +1,150 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef QLOCATIONTESTUTILS_P_H +#define QLOCATIONTESTUTILS_P_H + +#include +#include +#include + +namespace QLocationTestUtils +{ + bool hasDefaultSource(); + bool hasDefaultMonitor(); + + QString addNmeaChecksumAndBreaks(const QString &sentence); + + QString createRmcSentence(const QDateTime &dt); + QString createGgaSentence(const QTime &time); + QString createGgaSentence(int lat, int lng, const QTime &time); + QString createZdaSentence(const QDateTime &dt); + QString createGsaSentence(); + QString createGsvSentence(); + QString createGsaLongSentence(); + QString createGsvLongSentence(); + QString createGsaVariableSentence(quint8 satId); + QString createGsvVariableSentence(quint8 satId); + + //The purpose of compareEquality() is to test equality + //operators where it is expected that A == B. + template + bool compareEquality(const A &first, const B &second) { + if (first != second) { + qWarning() << "compareEquality() failed: first != second"; + return false; + } + + if (second != first) { + qWarning() << "compareEquality() failed: second != first"; + return false; + } + + if (!(first == second)) { + qWarning() << "compareEquality() failed: !(first == second)"; + return false; + } + + if (!(second == first)) { + qWarning() << "compareEquality() failed: !(second == first)"; + return false; + } + + return true; + } + + //The purpose of compareInequality() is to test equality + //operators where it is expected that A != B. + //Using !compareEquality(...) is not sufficient because + //only the first operator checked would end up being tested. + template + bool compareInequality(const A &first, const B &second) { + if (!(first != second)){ + qWarning() << "compareInequality() failed: !(first != second)"; + return false; + } + + if (!(second != first)) { + qWarning() << "compareInequality() failed: !(second != first)"; + return false; + } + + if (first == second) { + qWarning() << "compareInequality() failed: first == second)"; + return false; + } + + if (second == first) { + qWarning() << "compareInequality() failed: second == first"; + return false; + } + return true; + } + + // Tests conversions between sub and base classes + // TC (test case) must implement: + // SubClass initialSubObject(); + // bool checkType(const BaseClass &) + // void detach(BaseClass *) - calls a mutator method, but doesn't actually modify the + // property to something different. + // void setSubClassProperty(SubClass *) - sets a property in the subclass instance + template + void testConversion(TC *tc) { + SubClass sub = tc->initialSubObject(); + //check conversion from SubClass -> BaseClass + //using assignment operator + BaseClass base; + base = sub; + QVERIFY(QLocationTestUtils::compareEquality(base, sub)); + QVERIFY(tc->checkType(base)); + + //check comparing base classes + BaseClass base2; + base2 = sub; + QVERIFY(QLocationTestUtils::compareEquality(base, base2)); + + //check conversion from BaseClass -> SubClass + //using assignment operator + SubClass sub2; + sub2 = base; + QVERIFY(QLocationTestUtils::compareEquality(sub, sub2)); + QVERIFY(tc->checkType(sub2)); + + //check that equality still holds with detachment of underlying data pointer + tc->detach(&base); + sub2 = base; + QVERIFY(QLocationTestUtils::compareEquality(sub, sub2)); + QVERIFY(QLocationTestUtils::compareEquality(sub, base)); + QVERIFY(QLocationTestUtils::compareEquality(base, base2)); + + //check that comparing objects are not the same + //when an underlying subclass field has been modified + tc->setSubClassProperty(&sub2); + base2 = sub2; + QVERIFY(QLocationTestUtils::compareInequality(sub, sub2)); + QVERIFY(QLocationTestUtils::compareInequality(sub, base2)); + QVERIFY(QLocationTestUtils::compareInequality(base, base2)); + + //check conversion from SubClass -> BaseClass + //using copy constructor + BaseClass base3(sub); + QVERIFY(QLocationTestUtils::compareEquality(sub, base3)); + QVERIFY(QLocationTestUtils::compareEquality(base, base3)); + + //check conversion from BaseClass -> SubClass + //using copy constructor + SubClass sub3(base3); + QVERIFY(QLocationTestUtils::compareEquality(sub, sub3)); + + //check conversion to subclass using a default base class instance + BaseClass baseDefault; + SubClass subDefault; + SubClass sub4(baseDefault); + QVERIFY(QLocationTestUtils::compareEquality(sub4, subDefault)); + + SubClass sub5 = baseDefault; + QVERIFY(QLocationTestUtils::compareEquality(sub5, subDefault)); + } +}; + +#endif diff --git a/tests/auto/utils/qnmeaproxyfactory.cpp b/tests/auto/utils/qnmeaproxyfactory.cpp new file mode 100644 index 0000000..ab3f605 --- /dev/null +++ b/tests/auto/utils/qnmeaproxyfactory.cpp @@ -0,0 +1,105 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include "qnmeaproxyfactory.h" +#include "qlocationtestutils_p.h" +#include +#include + +#include +#include +#include + +QNmeaPositionInfoSourceProxy::QNmeaPositionInfoSourceProxy(QNmeaPositionInfoSource *source, + QIODevice *outDevice) + : m_source(source), m_outDevice(outDevice) +{ +} + +QNmeaPositionInfoSourceProxy::~QNmeaPositionInfoSourceProxy() +{ + m_outDevice->close(); + delete m_outDevice; +} + +QGeoPositionInfoSource *QNmeaPositionInfoSourceProxy::source() const +{ + return m_source; +} + +void QNmeaPositionInfoSourceProxy::feedUpdate(const QDateTime &dt) +{ + m_outDevice->write(QLocationTestUtils::createRmcSentence(dt).toLatin1()); +} + +void QNmeaPositionInfoSourceProxy::feedBytes(const QByteArray &bytes) +{ + m_outDevice->write(bytes); +} + +QNmeaProxyFactory::QNmeaProxyFactory() : m_server(new QTcpServer(this)) +{ + bool b = m_server->listen(QHostAddress::LocalHost); + Q_ASSERT(b); +} + +QNmeaPositionInfoSourceProxy * +QNmeaProxyFactory::createPositionInfoSourceProxy(QNmeaPositionInfoSource *source) +{ + QTcpSocket *client = new QTcpSocket; + QIODevice *device = createServerConnection(client); + source->setDevice(device); + Q_ASSERT(source->device() != 0); + QNmeaPositionInfoSourceProxy *proxy = new QNmeaPositionInfoSourceProxy(source, client); + proxy->setParent(source); + return proxy; +} + +QNmeaSatelliteInfoSourceProxy * +QNmeaProxyFactory::createSatelliteInfoSourceProxy(QNmeaSatelliteInfoSource *source) +{ + QTcpSocket *client = new QTcpSocket; + QIODevice *device = createServerConnection(client); + source->setDevice(device); + Q_ASSERT(source->device() != 0); + QNmeaSatelliteInfoSourceProxy *proxy = new QNmeaSatelliteInfoSourceProxy(source, client); + proxy->setParent(source); + return proxy; +} + +QIODevice *QNmeaProxyFactory::createServerConnection(QTcpSocket *client) +{ + client->connectToHost(m_server->serverAddress(), m_server->serverPort()); + qDebug() << "listening on" << m_server->serverAddress() << m_server->serverPort(); + bool b = m_server->waitForNewConnection(15000); + if (!b) + qWarning() << "Server didin't receive new connection"; + b = client->waitForConnected(); + if (!b) + qWarning() << "Client could not connect to server"; + + QIODevice *device = m_server->nextPendingConnection(); + return device; +} + +QNmeaSatelliteInfoSourceProxy::QNmeaSatelliteInfoSourceProxy(QNmeaSatelliteInfoSource *source, + QIODevice *outDevice) + : m_source(source), m_outDevice(outDevice) +{ +} + +QNmeaSatelliteInfoSourceProxy::~QNmeaSatelliteInfoSourceProxy() +{ + m_outDevice->close(); + delete m_outDevice; +} + +QGeoSatelliteInfoSource *QNmeaSatelliteInfoSourceProxy::source() const +{ + return m_source; +} + +void QNmeaSatelliteInfoSourceProxy::feedBytes(const QByteArray &bytes) +{ + m_outDevice->write(bytes); +} diff --git a/tests/auto/utils/qnmeaproxyfactory.h b/tests/auto/utils/qnmeaproxyfactory.h new file mode 100644 index 0000000..c22a466 --- /dev/null +++ b/tests/auto/utils/qnmeaproxyfactory.h @@ -0,0 +1,71 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#ifndef QNMEAPROXYFACTORY_H +#define QNMEAPROXYFACTORY_H + +#include + +QT_BEGIN_NAMESPACE +class QTcpServer; +class QTcpSocket; +class QIODevice; +class QNmeaPositionInfoSource; +class QNmeaSatelliteInfoSource; +class QGeoPositionInfoSource; +class QGeoSatelliteInfoSource; +QT_END_NAMESPACE + +class QNmeaPositionInfoSourceProxy : public QObject +{ + Q_OBJECT +public: + QNmeaPositionInfoSourceProxy(QNmeaPositionInfoSource *source, QIODevice *outDevice); + ~QNmeaPositionInfoSourceProxy(); + + QGeoPositionInfoSource *source() const; + + void feedUpdate(const QDateTime &dt); + + void feedBytes(const QByteArray &bytes); + + int updateIntervalErrorMargin() const { return 50; } + +private: + QNmeaPositionInfoSource *m_source; + QIODevice *m_outDevice; +}; + +class QNmeaSatelliteInfoSourceProxy : public QObject +{ + Q_OBJECT +public: + QNmeaSatelliteInfoSourceProxy(QNmeaSatelliteInfoSource *source, QIODevice *outDevice); + ~QNmeaSatelliteInfoSourceProxy(); + + QGeoSatelliteInfoSource *source() const; + + void feedBytes(const QByteArray &bytes); + +private: + QNmeaSatelliteInfoSource *m_source; + QIODevice *m_outDevice; +}; + +class QNmeaProxyFactory : public QObject +{ + Q_OBJECT +public: + QNmeaProxyFactory(); + + // proxy is created as child of source + QNmeaPositionInfoSourceProxy *createPositionInfoSourceProxy(QNmeaPositionInfoSource *source); + QNmeaSatelliteInfoSourceProxy *createSatelliteInfoSourceProxy(QNmeaSatelliteInfoSource *source); + +private: + QIODevice *createServerConnection(QTcpSocket *client); + + QTcpServer *m_server; +}; + +#endif diff --git a/tests/benchmarks/CMakeLists.txt b/tests/benchmarks/CMakeLists.txt new file mode 100644 index 0000000..5d562de --- /dev/null +++ b/tests/benchmarks/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# special case begin + +add_subdirectory(qgeoareamonitorinfo) +add_subdirectory(qgeopositioninfo) +add_subdirectory(qgeosatelliteinfo) + +# special case end diff --git a/tests/benchmarks/README b/tests/benchmarks/README new file mode 100644 index 0000000..8d017cd --- /dev/null +++ b/tests/benchmarks/README @@ -0,0 +1,81 @@ +The most reliable way of running benchmarks is to do it in an otherwise idle +system. On a busy system, the results will vary according to the other tasks +demanding attention in the system. + +We have managed to obtain quite reliable results by doing the following on +Linux (and you need root): + + - switching the scheduler to a Real-Time mode + - setting the processor affinity to one single processor + - disabling the other thread of the same core + +This should work rather well for CPU-intensive tasks. A task that is in Real- +Time mode will simply not be preempted by the OS. But if you make OS syscalls, +especially I/O ones, your task will be de-scheduled. Note that this includes +page faults, so if you can, make sure your benchmark's warmup code paths touch +most of the data. + +To do this you need a tool called schedtool (package schedtool), from +http://freequaos.host.sk/schedtool/ + +From this point on, we are using CPU0 for all tasks: + +If you have a Hyperthreaded multi-core processor (Core-i5 and Core-i7), you +have to disable the other thread of the same core as CPU0. To discover which +one it is: + +$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list + +This will print something like 0,4, meaning that CPUs 0 and 4 are sibling +threads on the same core. So we'll turn CPU 4 off: + +(as root) +# echo 0 > /sys/devices/system/cpu/cpu4/online + +To turn it back on, echo 1 into the same file. + +To run a task on CPU 0 exclusively, using FIFO RT priority 10, you run the +following: + +(as root) +# schedtool -F -p 10 -a 1 -e ./taskname + +For example: +# schedtool -F -p 10 -a 1 -e ./tst_bench_qstring -tickcounter + +Warning: if your task livelocks or takes far too long to complete, your system +may be unusable for a long time, especially if you don't have other cores to +run stuff on. To prevent that, run it before schedtool and time it. + +You can also limit the CPU time that the task is allowed to take. Run in the +same shell as you'll run schedtool: + +$ ulimit -s 300 +To limit to 300 seconds (5 minutes) + +If your task runs away, it will get a SIGXCPU after consuming 5 minutes of CPU +time (5 minutes running at 100%). + +If your app is multithreaded, you may want to give it more CPUs, like CPU0 and +CPU1 with -a 3 (it's a bitmask). + +For best results, you should disable ALL other cores and threads of the same +processor. The new Core-i7 have one processor with 4 cores, +each core can run 2 threads; the older Mac Pros have two processors with 4 +cores each. So on those Mac Pros, you'd disable cores 1, 2 and 3, while on the +Core-i7, you'll need to disable all other CPUs. + +However, disabling just the sibling thread seems to produce very reliable +results for me already, with variance often below 0.5% (even though there are +some measurable spikes). + +Other things to try: + +Running the benchmark with highest priority, i.e. "sudo nice -19" +usually produces stable results on some machines. If the benchmark also +involves displaying something on the screen (on X11), running it with +"-sync" is a must. Though, in that case the "real" cost is not correct, +but it is useful to discover regressions. + +Also; not many people know about ionice (1) + ionice - get/set program io scheduling class and priority diff --git a/tests/benchmarks/qgeoareamonitorinfo/CMakeLists.txt b/tests/benchmarks/qgeoareamonitorinfo/CMakeLists.txt new file mode 100644 index 0000000..0b5f726 --- /dev/null +++ b/tests/benchmarks/qgeoareamonitorinfo/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# special case begin + +qt_internal_add_benchmark(tst_bench_qgeoareamonitorinfo + SOURCES + tst_bench_qgeoareamonitorinfo.cpp + LIBRARIES + Qt::Core + Qt::Positioning + Qt::Test +) + +# special case end diff --git a/tests/benchmarks/qgeoareamonitorinfo/tst_bench_qgeoareamonitorinfo.cpp b/tests/benchmarks/qgeoareamonitorinfo/tst_bench_qgeoareamonitorinfo.cpp new file mode 100644 index 0000000..19b5fd8 --- /dev/null +++ b/tests/benchmarks/qgeoareamonitorinfo/tst_bench_qgeoareamonitorinfo.cpp @@ -0,0 +1,230 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include +#include + +static const QDateTime expirationTime = QDateTime::currentDateTimeUtc().addSecs(60); +static const QGeoCircle area = QGeoCircle(QGeoCoordinate(1.0, 1.0), 100); + +class tst_QGeoAreaMonitorInfoBenchmark : public QObject +{ + Q_OBJECT +private slots: + void construct(); + void constructCopy(); + void constructMove(); + + void assign(); + void assignMove(); + + void checkEquality(); + + void setName(); + void queryName(); + + void queryIdentifier(); + void isValid(); + + void setArea(); + void queryArea(); + + void setExpiration(); + void queryExpiration(); + + void setPersistent(); + void queryPersistent(); + + void setNotificationParameters(); + void queryNotificationParameters(); +}; + + + +void tst_QGeoAreaMonitorInfoBenchmark::construct() +{ + QBENCHMARK { + QGeoAreaMonitorInfo info("test"); + Q_UNUSED(info) + } +} + +static QGeoAreaMonitorInfo createAreaMonitorInfo() +{ + QGeoAreaMonitorInfo info("test"); + info.setExpiration(expirationTime); + info.setArea(area); + QVariantMap parameters; + parameters["key"] = "value"; + parameters["another_key"] = true; + info.setNotificationParameters(parameters); + return info; +} + +void tst_QGeoAreaMonitorInfoBenchmark::constructCopy() +{ + const auto info = createAreaMonitorInfo(); + QBENCHMARK { + QGeoAreaMonitorInfo newInfo(info); + Q_UNUSED(newInfo) + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::constructMove() +{ + QBENCHMARK { + // We need to create a new object at each iteration, so that we don't + // end up moving an already moved-from object. So the real value for + // move can be calculated using the results of construct() + // benchmark. + QGeoAreaMonitorInfo info("test"); + QGeoAreaMonitorInfo newInfo(std::move(info)); + Q_UNUSED(newInfo) + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::assign() +{ + const auto info = createAreaMonitorInfo(); + QGeoAreaMonitorInfo newInfo; + QBENCHMARK { + newInfo = info; + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::assignMove() +{ + QGeoAreaMonitorInfo newInfo; + QBENCHMARK { + // We need to create a new object at each iteration, so that we don't + // end up moving an already moved-from object. So the real value for + // move can be calculated using the results of construct() + // benchmark. + QGeoAreaMonitorInfo info("test"); + newInfo = std::move(info); + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::checkEquality() +{ + const auto info1 = createAreaMonitorInfo(); + const auto info2 = createAreaMonitorInfo(); + QBENCHMARK { + const bool equal = info1 == info2; + Q_UNUSED(equal) + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::setName() +{ + auto info = createAreaMonitorInfo(); + // Setting the name twice, as there is a check for same name. + // Ideally need to divide the result of the benchmark by 2. + QBENCHMARK { + info.setName("name1"); + info.setName("name2"); + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::queryName() +{ + const auto info = createAreaMonitorInfo(); + QBENCHMARK { + const auto val = info.name(); + Q_UNUSED(val) + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::queryIdentifier() +{ + const auto info = createAreaMonitorInfo(); + QBENCHMARK { + const auto val = info.identifier(); + Q_UNUSED(val) + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::isValid() +{ + const auto info = createAreaMonitorInfo(); + QBENCHMARK { + const auto val = info.isValid(); + Q_UNUSED(val) + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::setArea() +{ + auto info = createAreaMonitorInfo(); + QBENCHMARK { + info.setArea(area); + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::queryArea() +{ + const auto info = createAreaMonitorInfo(); + QBENCHMARK { + const auto val = info.area(); + Q_UNUSED(val) + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::setExpiration() +{ + auto info = createAreaMonitorInfo(); + QBENCHMARK { + info.setExpiration(expirationTime); + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::queryExpiration() +{ + const auto info = createAreaMonitorInfo(); + QBENCHMARK { + const auto val = info.expiration(); + Q_UNUSED(val) + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::setPersistent() +{ + auto info = createAreaMonitorInfo(); + QBENCHMARK { + info.setPersistent(true); + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::queryPersistent() +{ + const auto info = createAreaMonitorInfo(); + QBENCHMARK { + const auto val = info.isPersistent(); + Q_UNUSED(val) + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::setNotificationParameters() +{ + auto info = createAreaMonitorInfo(); + QVariantMap newParameters; + newParameters["key"] = "value1"; + newParameters["another_key"] = false; + QBENCHMARK { + info.setNotificationParameters(newParameters); + } +} + +void tst_QGeoAreaMonitorInfoBenchmark::queryNotificationParameters() +{ + const auto info = createAreaMonitorInfo(); + QBENCHMARK { + const auto val = info.notificationParameters(); + Q_UNUSED(val) + } +} + +QTEST_MAIN(tst_QGeoAreaMonitorInfoBenchmark) + +#include "tst_bench_qgeoareamonitorinfo.moc" diff --git a/tests/benchmarks/qgeopositioninfo/CMakeLists.txt b/tests/benchmarks/qgeopositioninfo/CMakeLists.txt new file mode 100644 index 0000000..42ad736 --- /dev/null +++ b/tests/benchmarks/qgeopositioninfo/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# special case begin + +qt_internal_add_benchmark(tst_bench_qgeopositioninfo + SOURCES + tst_bench_qgeopositioninfo.cpp + LIBRARIES + Qt::Core + Qt::Positioning + Qt::Test +) + +# special case end diff --git a/tests/benchmarks/qgeopositioninfo/tst_bench_qgeopositioninfo.cpp b/tests/benchmarks/qgeopositioninfo/tst_bench_qgeopositioninfo.cpp new file mode 100644 index 0000000..43542cf --- /dev/null +++ b/tests/benchmarks/qgeopositioninfo/tst_bench_qgeopositioninfo.cpp @@ -0,0 +1,228 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include + +static const QGeoCoordinate coordinate(1.0, 2.0); +static const QDateTime dateTime = QDateTime::currentDateTimeUtc(); + +class tst_QGeoPositionInfoBenchmark : public QObject +{ + Q_OBJECT +private slots: + void constructDefault(); + void constructWithParameters(); + void constructCopy(); + void constructMove(); + + void assign(); + void assignMove(); + + void checkEquality(); + + void isValid(); + + void setTimestamp(); + void queryTimestamp(); + + void setCoordinate(); + void queryCoordinate(); + + void setAttribute(); + void queryAttributeExisting(); + void queryAttributeNonExisting(); + void removeAttributeExisting(); + void removeAttributeNonExisting(); + void hasAttributeExisting(); + void hasAttributeNonExisting(); +}; + +void tst_QGeoPositionInfoBenchmark::constructDefault() +{ + QBENCHMARK { + QGeoPositionInfo info; + Q_UNUSED(info) + } +} + +void tst_QGeoPositionInfoBenchmark::constructWithParameters() +{ + QBENCHMARK { + QGeoPositionInfo info(coordinate, dateTime); + Q_UNUSED(info) + } +} + +void tst_QGeoPositionInfoBenchmark::constructCopy() +{ + const QGeoPositionInfo info(coordinate, dateTime); + QBENCHMARK { + QGeoPositionInfo newInfo(info); + Q_UNUSED(newInfo) + } +} + +void tst_QGeoPositionInfoBenchmark::constructMove() +{ + QBENCHMARK { + // We need to create a new object at each iteration, so that we don't + // end up moving an already moved-from object. So the real value for + // move can be calculated using the results of constructDefault() + // benchmark. + QGeoPositionInfo info; + QGeoPositionInfo newInfo(std::move(info)); + Q_UNUSED(newInfo) + } +} + +void tst_QGeoPositionInfoBenchmark::assign() +{ + const QGeoPositionInfo info(coordinate, dateTime); + QGeoPositionInfo newInfo; + QBENCHMARK { + newInfo = info; + } +} + +void tst_QGeoPositionInfoBenchmark::assignMove() +{ + QGeoPositionInfo newInfo; + QBENCHMARK { + // We need to create a new object at each iteration, so that we don't + // end up moving an already moved-from object. So the real value for + // move can be calculated using the results of constructDefault() + // benchmark. + QGeoPositionInfo info; + newInfo = std::move(info); + } +} + +void tst_QGeoPositionInfoBenchmark::checkEquality() +{ + // We will benchmark equal objects, because unequal objects will normally + // take less time to compare (as the comparison will fail at some stage). + const QGeoPositionInfo info1(coordinate, dateTime); + const QGeoPositionInfo info2(coordinate, dateTime); + QBENCHMARK { + const bool equal = info1 == info2; + Q_UNUSED(equal) + } +} + +void tst_QGeoPositionInfoBenchmark::isValid() +{ + const QGeoPositionInfo info(coordinate, dateTime); + QBENCHMARK { + const bool valid = info.isValid(); + Q_UNUSED(valid) + } +} + +void tst_QGeoPositionInfoBenchmark::setTimestamp() +{ + QGeoPositionInfo info; + QBENCHMARK { + info.setTimestamp(dateTime); + } +} + +void tst_QGeoPositionInfoBenchmark::queryTimestamp() +{ + const QGeoPositionInfo info(coordinate, dateTime); + QBENCHMARK { + const auto dt = info.timestamp(); + Q_UNUSED(dt) + } +} + +void tst_QGeoPositionInfoBenchmark::setCoordinate() +{ + QGeoPositionInfo info; + QBENCHMARK { + info.setCoordinate(coordinate); + } +} + +void tst_QGeoPositionInfoBenchmark::queryCoordinate() +{ + const QGeoPositionInfo info(coordinate, dateTime); + QBENCHMARK { + const auto coord = info.coordinate(); + Q_UNUSED(coord) + } +} + +void tst_QGeoPositionInfoBenchmark::setAttribute() +{ + QGeoPositionInfo info; + QBENCHMARK { + info.setAttribute(QGeoPositionInfo::Direction, 1.0); + } +} + +static QGeoPositionInfo generateInfoWithAttributes() +{ + QGeoPositionInfo info; + info.setAttribute(QGeoPositionInfo::Direction, 1.0); + info.setAttribute(QGeoPositionInfo::GroundSpeed, 2.0); + info.setAttribute(QGeoPositionInfo::VerticalSpeed, 3.0); + info.setAttribute(QGeoPositionInfo::MagneticVariation, 4.0); + return info; +} + +void tst_QGeoPositionInfoBenchmark::queryAttributeExisting() +{ + QGeoPositionInfo info = generateInfoWithAttributes(); + QBENCHMARK { + const auto value = info.attribute(QGeoPositionInfo::GroundSpeed); + Q_UNUSED(value) + } +} + +void tst_QGeoPositionInfoBenchmark::queryAttributeNonExisting() +{ + QGeoPositionInfo info = generateInfoWithAttributes(); + QBENCHMARK { + const auto value = info.attribute(QGeoPositionInfo::HorizontalAccuracy); + Q_UNUSED(value) + } +} + +void tst_QGeoPositionInfoBenchmark::removeAttributeExisting() +{ + QGeoPositionInfo info = generateInfoWithAttributes(); + QBENCHMARK { + info.removeAttribute(QGeoPositionInfo::GroundSpeed); + } +} + +void tst_QGeoPositionInfoBenchmark::removeAttributeNonExisting() +{ + QGeoPositionInfo info = generateInfoWithAttributes(); + QBENCHMARK { + info.removeAttribute(QGeoPositionInfo::HorizontalAccuracy); + } +} + +void tst_QGeoPositionInfoBenchmark::hasAttributeExisting() +{ + QGeoPositionInfo info = generateInfoWithAttributes(); + QBENCHMARK { + const auto value = info.hasAttribute(QGeoPositionInfo::GroundSpeed); + Q_UNUSED(value) + } +} + +void tst_QGeoPositionInfoBenchmark::hasAttributeNonExisting() +{ + QGeoPositionInfo info = generateInfoWithAttributes(); + QBENCHMARK { + const auto value = info.hasAttribute(QGeoPositionInfo::HorizontalAccuracy); + Q_UNUSED(value) + } +} + +QTEST_MAIN(tst_QGeoPositionInfoBenchmark) + +#include "tst_bench_qgeopositioninfo.moc" diff --git a/tests/benchmarks/qgeosatelliteinfo/CMakeLists.txt b/tests/benchmarks/qgeosatelliteinfo/CMakeLists.txt new file mode 100644 index 0000000..b8845e8 --- /dev/null +++ b/tests/benchmarks/qgeosatelliteinfo/CMakeLists.txt @@ -0,0 +1,15 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# special case begin + +qt_internal_add_benchmark(tst_bench_qgeosatelliteinfo + SOURCES + tst_bench_qgeosatelliteinfo.cpp + LIBRARIES + Qt::Core + Qt::Positioning + Qt::Test +) + +# special case end diff --git a/tests/benchmarks/qgeosatelliteinfo/tst_bench_qgeosatelliteinfo.cpp b/tests/benchmarks/qgeosatelliteinfo/tst_bench_qgeosatelliteinfo.cpp new file mode 100644 index 0000000..bf42c10 --- /dev/null +++ b/tests/benchmarks/qgeosatelliteinfo/tst_bench_qgeosatelliteinfo.cpp @@ -0,0 +1,223 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include +#include + +class tst_QGeoSatelliteInfoBenchmark : public QObject +{ + Q_OBJECT +private slots: + void constructDefault(); + void constructCopy(); + void constructMove(); + + void assign(); + void assignMove(); + + void checkEquality(); + + void setSatelliteSystem(); + void querySatelliteSystem(); + + void setSatelliteIdentifier(); + void querySatelliteIdentifier(); + + void setSignalStrength(); + void querySignalStrength(); + + void setAttribute(); + void queryAttributeExisting(); + void queryAttributeNonExisting(); + void removeAttributeExisting(); + void removeAttributeNonExisting(); + void hasAttributeExisting(); + void hasAttributeNonExisting(); +}; + +void tst_QGeoSatelliteInfoBenchmark::constructDefault() +{ + QBENCHMARK { + QGeoSatelliteInfo info; + Q_UNUSED(info) + } +} + +static QGeoSatelliteInfo createSatelliteInfo() +{ + QGeoSatelliteInfo info; + info.setSatelliteSystem(QGeoSatelliteInfo::GLONASS); + info.setSatelliteIdentifier(1); + info.setSignalStrength(-30); + info.setAttribute(QGeoSatelliteInfo::Elevation, 10.0); + return info; +} + +void tst_QGeoSatelliteInfoBenchmark::constructCopy() +{ + const auto info = createSatelliteInfo(); + QBENCHMARK { + QGeoSatelliteInfo newInfo(info); + Q_UNUSED(newInfo) + } +} + +void tst_QGeoSatelliteInfoBenchmark::constructMove() +{ + QBENCHMARK { + // We need to create a new object at each iteration, so that we don't + // end up moving an already moved-from object. So the real value for + // move can be calculated using the results of constructDefault() + // benchmark. + QGeoSatelliteInfo info; + QGeoSatelliteInfo newInfo(std::move(info)); + Q_UNUSED(newInfo) + } +} + +void tst_QGeoSatelliteInfoBenchmark::assign() +{ + const auto info = createSatelliteInfo(); + QGeoSatelliteInfo newInfo; + QBENCHMARK { + newInfo = info; + } +} + +void tst_QGeoSatelliteInfoBenchmark::assignMove() +{ + QGeoSatelliteInfo newInfo; + QBENCHMARK { + // We need to create a new object at each iteration, so that we don't + // end up moving an already moved-from object. So the real value for + // move can be calculated using the results of constructDefault() + // benchmark. + QGeoSatelliteInfo info; + newInfo = std::move(info); + } +} + +void tst_QGeoSatelliteInfoBenchmark::checkEquality() +{ + const auto info1 = createSatelliteInfo(); + const auto info2 = createSatelliteInfo(); + QBENCHMARK { + const bool equal = info1 == info2; + Q_UNUSED(equal) + } +} + +void tst_QGeoSatelliteInfoBenchmark::setSatelliteSystem() +{ + QGeoSatelliteInfo info; + QBENCHMARK { + info.setSatelliteSystem(QGeoSatelliteInfo::GPS); + } +} + +void tst_QGeoSatelliteInfoBenchmark::querySatelliteSystem() +{ + const auto info = createSatelliteInfo(); + QBENCHMARK { + const auto val = info.satelliteSystem(); + Q_UNUSED(val) + } +} + +void tst_QGeoSatelliteInfoBenchmark::setSatelliteIdentifier() +{ + QGeoSatelliteInfo info; + QBENCHMARK { + info.setSatelliteIdentifier(10); + } +} + +void tst_QGeoSatelliteInfoBenchmark::querySatelliteIdentifier() +{ + const auto info = createSatelliteInfo(); + QBENCHMARK { + const auto val = info.satelliteIdentifier(); + Q_UNUSED(val) + } +} + +void tst_QGeoSatelliteInfoBenchmark::setSignalStrength() +{ + QGeoSatelliteInfo info; + QBENCHMARK { + info.setSignalStrength(-50); + } +} + +void tst_QGeoSatelliteInfoBenchmark::querySignalStrength() +{ + const auto info = createSatelliteInfo(); + QBENCHMARK { + const auto val = info.signalStrength(); + Q_UNUSED(val) + } +} + +void tst_QGeoSatelliteInfoBenchmark::setAttribute() +{ + QGeoSatelliteInfo info; + QBENCHMARK { + info.setAttribute(QGeoSatelliteInfo::Elevation, 10.0); + } +} + +void tst_QGeoSatelliteInfoBenchmark::queryAttributeExisting() +{ + const auto info = createSatelliteInfo(); + QBENCHMARK { + const auto val = info.attribute(QGeoSatelliteInfo::Elevation); + Q_UNUSED(val) + } +} + +void tst_QGeoSatelliteInfoBenchmark::queryAttributeNonExisting() +{ + const auto info = createSatelliteInfo(); + QBENCHMARK { + const auto val = info.attribute(QGeoSatelliteInfo::Azimuth); + Q_UNUSED(val) + } +} + +void tst_QGeoSatelliteInfoBenchmark::removeAttributeExisting() +{ + auto info = createSatelliteInfo(); + QBENCHMARK { + info.removeAttribute(QGeoSatelliteInfo::Elevation); + } +} + +void tst_QGeoSatelliteInfoBenchmark::removeAttributeNonExisting() +{ + auto info = createSatelliteInfo(); + QBENCHMARK { + info.removeAttribute(QGeoSatelliteInfo::Azimuth); + } +} + +void tst_QGeoSatelliteInfoBenchmark::hasAttributeExisting() +{ + auto info = createSatelliteInfo(); + QBENCHMARK { + const auto val = info.hasAttribute(QGeoSatelliteInfo::Elevation); + Q_UNUSED(val) + } +} + +void tst_QGeoSatelliteInfoBenchmark::hasAttributeNonExisting() +{ + auto info = createSatelliteInfo(); + QBENCHMARK { + const auto val = info.hasAttribute(QGeoSatelliteInfo::Azimuth); + Q_UNUSED(val) + } +} + +QTEST_MAIN(tst_QGeoSatelliteInfoBenchmark) + +#include "tst_bench_qgeosatelliteinfo.moc" diff --git a/tests/global/global.cfg b/tests/global/global.cfg new file mode 100644 index 0000000..8cc6269 --- /dev/null +++ b/tests/global/global.cfg @@ -0,0 +1,5 @@ + + + + + -- 2.30.2