mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-24 00:47:57 -05:00
... you are too slow and QJson API is so ugly. Now using this wonderful json lib: https://github.com/nlohmann/json Results in release mode (QJson tests are not shown but QJson was even slower than string concat). PASS : TestQgsJsonUtils::testExportAttributesJson(Use json) RESULT : TestQgsJsonUtils::testExportAttributesJson():"Use json": 0.0022 msecs per iteration (total: 75, iterations: 32768) PASS : TestQgsJsonUtils::testExportAttributesJson(Use old string concat) RESULT : TestQgsJsonUtils::testExportAttributesJson():"Use old string concat": 0.0032 msecs per iteration (total: 54, iterations: 16384) PASS : TestQgsJsonUtils::testExportFeatureJson(Use json) RESULT : TestQgsJsonUtils::testExportFeatureJson():"Use json": 0.011 msecs per iteration (total: 96, iterations: 8192) PASS : TestQgsJsonUtils::testExportFeatureJson(Use old string concat) RESULT : TestQgsJsonUtils::testExportFeatureJson():"Use old string concat": 0.015 msecs per iteration (total: 64, iterations: 4096) PASS : TestQgsJsonUtils::testExportGeomToJson(Use json) RESULT : TestQgsJsonUtils::testExportGeomToJson():"Use json": 0.76 msecs per iteration (total: 98, iterations: 128) PASS : TestQgsJsonUtils::testExportGeomToJson(Use old string concat) RESULT : TestQgsJsonUtils::testExportGeomToJson():"Use old string concat": 0.85 msecs per iteration (total: 55, iterations: 64) PASS : TestQgsJsonUtils::cleanupTestCase()
50 lines
1.3 KiB
C++
50 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <iterator> // random_access_iterator_tag
|
|
|
|
#include <nlohmann/detail/meta/void_t.hpp>
|
|
#include <nlohmann/detail/meta/cpp_future.hpp>
|
|
|
|
namespace nlohmann
|
|
{
|
|
namespace detail
|
|
{
|
|
template <typename It, typename = void>
|
|
struct iterator_types {};
|
|
|
|
template <typename It>
|
|
struct iterator_types<
|
|
It,
|
|
void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
|
|
typename It::reference, typename It::iterator_category>> {
|
|
using difference_type = typename It::difference_type;
|
|
using value_type = typename It::value_type;
|
|
using pointer = typename It::pointer;
|
|
using reference = typename It::reference;
|
|
using iterator_category = typename It::iterator_category;
|
|
};
|
|
|
|
// This is required as some compilers implement std::iterator_traits in a way that
|
|
// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341.
|
|
template <typename T, typename = void>
|
|
struct iterator_traits
|
|
{
|
|
};
|
|
|
|
template <typename T>
|
|
struct iterator_traits<T, enable_if_t<!std::is_pointer<T>::value>>
|
|
: iterator_types<T>
|
|
{
|
|
};
|
|
|
|
template <typename T>
|
|
struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>> {
|
|
using iterator_category = std::random_access_iterator_tag;
|
|
using value_type = T;
|
|
using difference_type = ptrdiff_t;
|
|
using pointer = T*;
|
|
using reference = T&;
|
|
};
|
|
} // namespace detail
|
|
} // namespace nlohmann
|