aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIvan Komissarov <abbapoh@gmail.com>2019-12-23 22:54:11 +0300
committerIvan Komissarov <ABBAPOH@gmail.com>2020-01-10 13:05:54 +0000
commite1287e747174b9b2dc7824ad7fddfb8996a18820 (patch)
tree867fc01f3bbf6bbcddbaaa9a7ce85c0be9a07204 /src
parent11de0961743ac2a1b50949614765506f79c40bc2 (diff)
Speedup HostOsInfo::canonicalOSIdentifiers
This piece of code (recursively) allocated so often that it was visible in the profiler Reduce time spent in this function from 45ms to 8ms when running 'qbs resolve qtcreator.qbs' Change-Id: Ifd7586886499d2e26b7bc67324c1791c54cb251d Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/lib/corelib/tools/hostosinfo.h15
-rw-r--r--src/lib/corelib/tools/stlutils.h15
2 files changed, 18 insertions, 12 deletions
diff --git a/src/lib/corelib/tools/hostosinfo.h b/src/lib/corelib/tools/hostosinfo.h
index d7f718c19..42ce3f8cf 100644
--- a/src/lib/corelib/tools/hostosinfo.h
+++ b/src/lib/corelib/tools/hostosinfo.h
@@ -194,22 +194,21 @@ std::vector<std::string> HostOsInfo::hostOSIdentifiers()
std::vector<std::string> HostOsInfo::canonicalOSIdentifiers(const std::string &name)
{
std::vector<std::string> list { name };
- if (contains(std::vector<std::string> {"ios-simulator"}, name))
+ if (contains({"ios-simulator"}, name))
list << canonicalOSIdentifiers("ios");
- if (contains(std::vector<std::string> {"tvos-simulator"}, name))
+ if (contains({"tvos-simulator"}, name))
list << canonicalOSIdentifiers("tvos");
- if (contains(std::vector<std::string> {"watchos-simulator"}, name))
+ if (contains({"watchos-simulator"}, name))
list << canonicalOSIdentifiers("watchos");
- if (contains(std::vector<std::string> {"macos", "ios", "tvos", "watchos"}, name))
+ if (contains({"macos", "ios", "tvos", "watchos"}, name))
list << canonicalOSIdentifiers("darwin");
- if (contains(std::vector<std::string> {"darwin", "freebsd", "netbsd", "openbsd"}, name))
+ if (contains({"darwin", "freebsd", "netbsd", "openbsd"}, name))
list << canonicalOSIdentifiers("bsd");
- if (contains(std::vector<std::string> {"android"}, name))
+ if (contains({"android"}, name))
list << canonicalOSIdentifiers("linux");
// Note: recognized non-Unix platforms include: windows, haiku, vxworks
- if (contains(std::vector<std::string> {
- "bsd", "aix", "hpux", "solaris", "linux", "hurd", "qnx", "integrity"}, name))
+ if (contains({"bsd", "aix", "hpux", "solaris", "linux", "hurd", "qnx", "integrity"}, name))
list << canonicalOSIdentifiers("unix");
return list;
diff --git a/src/lib/corelib/tools/stlutils.h b/src/lib/corelib/tools/stlutils.h
index ad00070cf..5c21c0672 100644
--- a/src/lib/corelib/tools/stlutils.h
+++ b/src/lib/corelib/tools/stlutils.h
@@ -54,11 +54,18 @@ C sorted(const C &container)
return result;
}
-template <class C>
-bool contains(const C &container, const typename C::value_type &v)
+template <class C, class T>
+bool contains(const C &container, const T &v)
{
- const auto &end = container.cend();
- return std::find(container.cbegin(), end, v) != end;
+ const auto &end = std::cend(container);
+ return std::find(std::cbegin(container), end, v) != end;
+}
+
+template <class T, size_t N, class U>
+bool contains(const T (&container)[N], const U &v)
+{
+ const auto &end = std::cend(container);
+ return std::find(std::cbegin(container), end, v) != end;
}
template <class C>