swift
metadatautils.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "misc/metadatautils.h"
5 
6 #include <QMetaObject>
7 #include <QMetaType>
8 #include <QObject>
9 #include <QTextStream>
10 
11 namespace swift::misc
12 {
13  void displayAllUserMetatypesTypes(QTextStream &out) { out << getAllUserMetatypesTypes(); }
14 
15  QString getAllUserMetatypesTypes(const QString &separator)
16  {
17  int fails = 0;
18  QString meta;
19  for (int mt = QMetaType::User; mt < QMetaType::User + 1000; mt++)
20  {
21  if (!QMetaType::isRegistered(mt))
22  {
23  fails++;
24  // normally a consecutive order of metatypes, we allow a space before we break
25  if (fails > 3) { break; }
26  continue;
27  }
28  QMetaType metaType(mt);
29  meta = meta.append("type: ")
30  .append(QString::number(mt))
31  .append(" name: ")
32  .append(QMetaType::typeName(mt))
33  .append(" | ")
34  .append(QString::number(QMetaType::sizeOf(mt)))
35  .append(" / ")
36  .append(QString::number(swift::misc::heapSizeOf(metaType)))
37  .append(separator);
38  }
39  return meta;
40  }
41 
42  QString className(const QObject *object)
43  {
44  if (!object) { return "nullptr"; }
45  return object->metaObject()->className();
46  }
47 
48  QString classNameShort(const QObject *object)
49  {
50  if (!object) { return "nullptr"; }
51  const QString fn = object->metaObject()->className();
52  if (fn.contains("::"))
53  {
54  const int index = fn.lastIndexOf("::");
55  if (fn.length() > index + 3) { return fn.mid(index + 2); }
56  }
57  return fn;
58  }
59 
60 #ifdef Q_CC_MSVC
61 # include <crtdbg.h>
62 
63  size_t heapSizeOf(const QMetaType &metaType)
64  {
65  metaType.destroy(
66  metaType.create()); // ignore one-off allocations of a class being instantiated for the first time
67  _CrtMemState oldState, newState, diff;
68  oldState.lTotalCount = newState.lTotalCount = diff.lTotalCount = 0; // avoid compiler warning
69  diff.lSizes[_NORMAL_BLOCK] = 0;
70  _CrtMemCheckpoint(&oldState);
71  void *p = metaType.create();
72  _CrtMemCheckpoint(&newState);
73  metaType.destroy(p);
74  _CrtMemDifference(&diff, &oldState, &newState);
75  return diff.lSizes[_NORMAL_BLOCK];
76  }
77 
78  size_t heapSizeOf(const QMetaObject &metaObject)
79  {
80  delete metaObject.newInstance(); // ignore one-off allocations of a class being instantiated for the first time
81  _CrtMemState oldState, newState, diff;
82  oldState.lTotalCount = newState.lTotalCount = diff.lTotalCount = 0; // avoid compiler warning
83  diff.lSizes[_NORMAL_BLOCK] = 0;
84  _CrtMemCheckpoint(&oldState);
85  QObject *obj = metaObject.newInstance();
86  _CrtMemCheckpoint(&newState);
87  delete obj;
88  _CrtMemDifference(&diff, &oldState, &newState);
89  return diff.lSizes[_NORMAL_BLOCK];
90  }
91 
92 #else
93 
94  size_t heapSizeOf(const QMetaType &)
95  {
96  // qDebug() << "heapSizeOf not supported by your compiler toolchain";
97  return 0;
98  }
99 
100  size_t heapSizeOf(const QMetaObject &)
101  {
102  // qDebug() << "heapSizeOf not supported by your compiler toolchain";
103  return 0;
104  }
105 
106 #endif
107 
108 } // namespace swift::misc
Free functions in swift::misc.
QString getAllUserMetatypesTypes(const QString &separator)
Get all user metatypes.
size_t heapSizeOf(const QMetaType &)
Q_CC_MSVC.
QString className(const QObject *object)
Class name as from QMetaObject::className with namespace.
void displayAllUserMetatypesTypes(QTextStream &out)
Display all user metatypes.
QString classNameShort(const QObject *object)
Class name as from QMetaObject::className without namespace.