Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qtyperevision.h
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// Copyright (C) 2022 Intel Corporation.
3// Copyright (C) 2015 Keith Gardner <kreios4004@gmail.com>
4// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
5
6#ifndef QTYPEREVISION_H
7#define QTYPEREVISION_H
8
9#include <QtCore/qassert.h>
10#include <QtCore/qcompare.h>
11#include <QtCore/qcontainertools_impl.h>
12#include <QtCore/qmetatype.h>
13#include <QtCore/qtypeinfo.h>
14
15#include <limits>
16
18
19class QDataStream;
20class QDebug;
21
22class QTypeRevision;
23Q_CORE_EXPORT size_t qHash(const QTypeRevision &key, size_t seed = 0);
24
25#ifndef QT_NO_DATASTREAM
26Q_CORE_EXPORT QDataStream& operator<<(QDataStream &out, const QTypeRevision &revision);
27Q_CORE_EXPORT QDataStream& operator>>(QDataStream &in, QTypeRevision &revision);
28#endif
29
31{
32public:
33 template<typename Integer>
34 using if_valid_segment_type = typename std::enable_if<
35 std::is_integral<Integer>::value, bool>::type;
36
37 template<typename Integer>
40 && (sizeof(Integer) > sizeof(quint16)
41 || (sizeof(Integer) == sizeof(quint16)
42 && !std::is_signed<Integer>::value)), bool>::type;
43
44 template<typename Integer, if_valid_segment_type<Integer> = true>
45 static constexpr bool isValidSegment(Integer segment)
46 {
47 // using extra parentheses around max to avoid expanding it if it is a macro
48 // and adding zero to cause it to be promoted
49 constexpr auto Max = (std::numeric_limits<Integer>::max)() + 0;
50 constexpr bool HasSufficientRange = Max >= SegmentUnknown;
51 return segment >= Integer(0)
52 && (!HasSufficientRange || segment < Integer(SegmentUnknown));
53 }
54
55 template<typename Major, typename Minor,
56 if_valid_segment_type<Major> = true,
57 if_valid_segment_type<Minor> = true>
58 static constexpr QTypeRevision fromVersion(Major majorVersion, Minor minorVersion)
59 {
60 return Q_ASSERT(isValidSegment(majorVersion)),
61 Q_ASSERT(isValidSegment(minorVersion)),
62 QTypeRevision(quint8(majorVersion), quint8(minorVersion));
63 }
64
65 template<typename Major, if_valid_segment_type<Major> = true>
66 static constexpr QTypeRevision fromMajorVersion(Major majorVersion)
67 {
68 return Q_ASSERT(isValidSegment(majorVersion)),
69 QTypeRevision(quint8(majorVersion), SegmentUnknown);
70 }
71
72 template<typename Minor, if_valid_segment_type<Minor> = true>
73 static constexpr QTypeRevision fromMinorVersion(Minor minorVersion)
74 {
75 return Q_ASSERT(isValidSegment(minorVersion)),
76 QTypeRevision(SegmentUnknown, quint8(minorVersion));
77 }
78
79 template<typename Integer, if_valid_value_type<Integer> = true>
80 static constexpr QTypeRevision fromEncodedVersion(Integer value)
81 {
82 return Q_ASSERT((value & ~Integer(0xffff)) == Integer(0)),
83 QTypeRevision((value & Integer(0xff00)) >> 8, value & Integer(0xff));
84 }
85
86 static constexpr QTypeRevision zero() { return QTypeRevision(0, 0); }
87
88 constexpr QTypeRevision() = default;
89
90 constexpr bool hasMajorVersion() const { return m_majorVersion != SegmentUnknown; }
91 constexpr quint8 majorVersion() const { return m_majorVersion; }
92
93 constexpr bool hasMinorVersion() const { return m_minorVersion != SegmentUnknown; }
94 constexpr quint8 minorVersion() const { return m_minorVersion; }
95
96 constexpr bool isValid() const { return hasMajorVersion() || hasMinorVersion(); }
97
98 template<typename Integer, if_valid_value_type<Integer> = true>
99 constexpr Integer toEncodedVersion() const
100 {
101 return Integer(m_majorVersion << 8) | Integer(m_minorVersion);
102 }
103
104private:
105 friend constexpr bool
106 comparesEqual(const QTypeRevision &lhs, const QTypeRevision &rhs) noexcept
107 { return lhs.toEncodedVersion<quint16>() == rhs.toEncodedVersion<quint16>(); }
108 friend constexpr Qt::strong_ordering
109 compareThreeWay(const QTypeRevision &lhs, const QTypeRevision &rhs) noexcept
110 {
111 // For both major and minor the following rule applies:
112 // non-0 ver > unspecified ver > 0 ver
113 auto cmpUnspecified = [](quint8 leftVer, quint8 rightVer) {
114 Q_ASSERT(leftVer != rightVer
115 && (leftVer == QTypeRevision::SegmentUnknown
116 || rightVer == QTypeRevision::SegmentUnknown));
117 if (leftVer != QTypeRevision::SegmentUnknown)
118 return leftVer > 0 ? Qt::strong_ordering::greater : Qt::strong_ordering::less;
119 return rightVer > 0 ? Qt::strong_ordering::less : Qt::strong_ordering::greater;
120 };
121
122 if (lhs.hasMajorVersion() != rhs.hasMajorVersion()) {
123 return cmpUnspecified(lhs.majorVersion(), rhs.majorVersion());
124 } else {
125 const auto majorRes = Qt::compareThreeWay(lhs.majorVersion(), rhs.majorVersion());
126 if (is_eq(majorRes)) {
127 if (lhs.hasMinorVersion() != rhs.hasMinorVersion())
128 return cmpUnspecified(lhs.minorVersion(), rhs.minorVersion());
129 return Qt::compareThreeWay(lhs.minorVersion(), rhs.minorVersion());
130 }
131 return majorRes;
132 }
133 }
135
136 enum { SegmentUnknown = 0xff };
137
138#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
139 constexpr QTypeRevision(quint8 major, quint8 minor)
140 : m_minorVersion(minor), m_majorVersion(major) {}
141
142 quint8 m_minorVersion = SegmentUnknown;
143 quint8 m_majorVersion = SegmentUnknown;
144#else
147
150#endif
151};
152
153static_assert(sizeof(QTypeRevision) == 2);
155
156#ifndef QT_NO_DEBUG_STREAM
157Q_CORE_EXPORT QDebug operator<<(QDebug, const QTypeRevision &revision);
158#endif
159
160QT_END_NAMESPACE
161
162QT_DECL_METATYPE_EXTERN(QTypeRevision, Q_CORE_EXPORT)
163
164#endif // QTYPEREVISION_H
165
166#if !defined(QT_LEAN_HEADERS) || QT_LEAN_HEADERS < 2
167// make QVersionNumber available from <QTypeRevision>
168#include <QtCore/qversionnumber.h>
169#endif
int main(int argc, char *argv[])
[2]
Definition buffer.cpp:77
Definition moc.h:220
bool testFunctionAttribute(Token tok, FunctionDef *def)
Definition moc.cpp:351
void parseEnumOrFlag(BaseDef *def, QtMocConstants::EnumFlags flags)
Definition moc.cpp:1639
void checkSuperClasses(ClassDef *def)
Definition moc.cpp:1907
Moc()
Definition moc.h:224
void parse()
Definition moc.cpp:669
bool parseEnum(EnumDef *def)
Definition moc.cpp:246
void parseProperty(ClassDef *def, PropertyMode mode)
Definition moc.cpp:1534
QByteArray lexemUntil(Token)
Definition moc.cpp:1807
EncounteredQmlMacro parseClassInfo(BaseDef *def)
Definition moc.cpp:1678
bool until(Token)
Definition moc.cpp:1827
QList< QByteArray > includeFiles
Definition moc.h:234
bool requireCompleteTypes
Definition moc.h:232
QHash< QByteArray, QByteArray > knownQObjectClasses
Definition moc.h:239
void createPropertyDef(PropertyDef &def, int propertyIndex, PropertyMode mode)
Definition moc.cpp:1359
void parseClassInfo(ClassDef *def)
Definition moc.cpp:1705
QByteArrayView strippedFileName() const
Definition moc.cpp:1102
bool parseClassHead(ClassDef *def)
Definition moc.cpp:39
void parsePrivateProperty(ClassDef *def, PropertyMode mode)
Definition moc.cpp:1626
QByteArray includePath
Definition moc.h:233
QByteArray filename
Definition moc.h:228
void parseFlag(BaseDef *def)
Definition moc.cpp:1654
void parseSignals(ClassDef *def)
Definition moc.cpp:1315
void parseDeclareMetatype()
Definition moc.cpp:1767
void parsePropertyAttributes(PropertyDef &propDef)
Definition moc.cpp:1397
void parseInterfaces(ClassDef *def)
Definition moc.cpp:1711
bool testFunctionRevision(FunctionDef *def)
Definition moc.cpp:414
bool testFunctionAttribute(FunctionDef *def)
Definition moc.cpp:342
void prependNamespaces(BaseDef &def, const QList< NamespaceDef > &namespaceList) const
Definition moc.cpp:623
QHash< QByteArray, QByteArray > knownGadgets
Definition moc.h:240
QList< QByteArray > metaTypes
Definition moc.h:237
bool parseFunction(FunctionDef *def, bool inMacro=false)
Definition moc.cpp:426
QByteArray parsePropertyAccessor()
Definition moc.cpp:1608
QMap< QString, QJsonArray > metaArgs
Definition moc.h:241
bool testForFunctionModifiers(FunctionDef *def)
Definition moc.cpp:528
const QByteArray & toFullyQualified(const QByteArray &name) const noexcept
Definition moc.cpp:30
void parseSlots(ClassDef *def, FunctionDef::Access access)
Definition moc.cpp:1273
void parseDeclareInterface()
Definition moc.cpp:1744
void checkListSizes(const ClassDef &def)
Definition moc.cpp:633
QTypeRevision parseRevision()
Definition moc.cpp:383
void parseMocInclude()
Definition moc.cpp:1776
QList< QString > parsedPluginMetadataFiles
Definition moc.h:242
bool skipCxxAttributes()
Definition moc.cpp:374
PropertyMode
Definition moc.h:222
@ Anonymous
Definition moc.h:222
@ Named
Definition moc.h:222
bool mustIncludeQPluginH
Definition moc.h:231
bool parseMaybeFunction(const ClassDef *cdef, FunctionDef *def)
Definition moc.cpp:536
void checkProperties(ClassDef *cdef)
Definition moc.cpp:1965
Type parseType()
Definition moc.cpp:126
void parseFunctionArguments(FunctionDef *def)
Definition moc.cpp:301
void parseSlotInPrivate(ClassDef *def, FunctionDef::Access access)
Definition moc.cpp:1786
bool inClass(const ClassDef *def) const
Definition moc.h:249
void parsePluginData(ClassDef *def)
Definition moc.cpp:1544
void generate(FILE *out, FILE *jsonOutput)
Definition moc.cpp:1179
QMap< QByteArray, QByteArray > interface2IdMap
Definition moc.h:236
bool noInclude
Definition moc.h:230
EncounteredQmlMacro
Definition moc.h:278
bool inNamespace(const NamespaceDef *def) const
Definition moc.h:253
QList< ClassDef > classList
Definition moc.h:235
int evaluateCondition()
void setDebugIncludes(bool value)
void parseDefineArguments(Macro *m)
void skipUntilEndif()
QHash< QByteArray, QByteArray > nonlocalIncludePathResolutionCache
Symbols preprocessed(const QByteArray &filename, QFile *device)
void substituteUntilNewline(Symbols &substituted)
QList< QByteArray > frameworks
static bool preprocessOnly
static Symbols macroExpandIdentifier(Preprocessor *that, SymbolStack &symbols, int lineNum, QByteArray *macroName)
QByteArray resolveInclude(const QByteArray &filename, const QByteArray &relativeTo)
static Symbols tokenize(const QByteArray &input, int lineNum=1, TokenizeMode mode=TokenizeCpp)
static void macroExpand(Symbols *into, Preprocessor *that, const Symbols &toExpand, qsizetype &index, int lineNum, bool one, const QSet< QByteArray > &excludeSymbols=QSet< QByteArray >())
@ PreparePreprocessorStatement
@ TokenizePreprocessorStatement
The QCommandLineOption class defines a possible command-line option. \inmodule QtCore.
The QCommandLineParser class provides a means for handling the command line options.
\inmodule QtCore\reentrant
Definition qdatastream.h:49
Definition qlist.h:80
Definition qmap.h:189
\inmodule QtCore
constexpr Integer toEncodedVersion() const
Transforms the revision into an integer value, encoding the minor version into the least significant ...
constexpr QTypeRevision()=default
Produces an invalid revision.
constexpr quint8 majorVersion() const
Returns the major version encoded in the revision.
static constexpr QTypeRevision fromMajorVersion(Major majorVersion)
Produces a QTypeRevision from the given majorVersion with an invalid minor version.
static constexpr bool isValidSegment(Integer segment)
Returns true if the given number can be used as either major or minor version in a QTypeRevision.
static constexpr QTypeRevision zero()
Produces a QTypeRevision with major and minor version {0}.
static constexpr QTypeRevision fromEncodedVersion(Integer value)
Produces a QTypeRevision from the given value.
constexpr bool hasMajorVersion() const
Returns true if the major version is known, otherwise false.
static constexpr QTypeRevision fromMinorVersion(Minor minorVersion)
Produces a QTypeRevision from the given minorVersion with an invalid major version.
constexpr bool isValid() const
Returns true if the major version or the minor version is known, otherwise false.
friend constexpr Qt::strong_ordering compareThreeWay(const QTypeRevision &lhs, const QTypeRevision &rhs) noexcept
constexpr quint8 minorVersion() const
Returns the minor version encoded in the revision.
static constexpr QTypeRevision fromVersion(Major majorVersion, Minor minorVersion)
Produces a QTypeRevision from the given majorVersion and minorVersion, both of which need to be a val...
friend constexpr bool comparesEqual(const QTypeRevision &lhs, const QTypeRevision &rhs) noexcept
constexpr bool hasMinorVersion() const
Returns true if the minor version is known, otherwise false.
QByteArray unquotedLexem()
Definition symbols.h:101
const Symbol & symbol() const
Definition symbols.h:98
Token token()
Definition symbols.h:99
bool dontReplaceSymbol(const QByteArray &name) const
Definition symbols.h:121
bool hasNext()
Definition symbols.h:85
QByteArray lexem() const
Definition symbols.h:100
Token next()
Definition symbols.h:90
bool test(Token)
Definition symbols.h:107
Q_DECLARE_TYPEINFO(EnumDef, Q_RELOCATABLE_TYPE)
QByteArray noRef(const QByteArray &type)
Definition moc.h:310
Q_DECLARE_TYPEINFO(PropertyDef, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(NamespaceDef, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(ClassDef, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(ClassInfoDef, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(ClassDef::Interface, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(SuperClass, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(ArgumentDef, Q_RELOCATABLE_TYPE)
TypeTag
Definition moc.h:23
@ HasEnum
Definition moc.h:27
@ HasClass
Definition moc.h:26
@ None
Definition moc.h:24
@ HasStruct
Definition moc.h:25
Q_DECLARE_TYPEINFO(PrivateQPropertyDef, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(FunctionDef, Q_RELOCATABLE_TYPE)
Combined button and popup list for selecting options.
constexpr PropertyFlags DefaultPropertyFlags
QHash< MacroName, Macro > Macros
SubArray MacroName
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
Definition qdir.cpp:2462
Q_DECLARE_TYPEINFO(QObjectPrivate::ConnectionList, Q_RELOCATABLE_TYPE)
#define qPrintable(string)
Definition qstring.h:1666
static QByteArray combinePath(const QString &infile, const QString &outfile)
Definition main.cpp:40
static bool hasNext(const Symbols &symbols, int i)
Definition main.cpp:78
static const Symbol & next(const Symbols &symbols, int &i)
Definition main.cpp:81
int runMoc(int argc, char **argv)
Definition main.cpp:170
static auto openFileForWriting(const QString &name)
Definition main.cpp:62
void error(const char *msg="Invalid argument")
Definition main.cpp:56
static QStringList argumentsFromCommandLineAndFile(const QStringList &arguments, bool &hasOptionFiles)
Definition main.cpp:138
QByteArray composePreprocessorOutput(const Symbols &symbols)
Definition main.cpp:85
Q_DECLARE_TYPEINFO(QTypeRevision, Q_RELOCATABLE_TYPE)
QByteArray rightType
Definition moc.h:68
QByteArray normalizedType
Definition moc.h:68
QJsonObject toJson() const
Definition moc.cpp:2169
QByteArray name
Definition moc.h:68
QByteArray typeNameForCast
Definition moc.h:69
ArgumentDef()
Definition moc.h:66
bool isDefault
Definition moc.h:70
Type type
Definition moc.h:67
Definition moc.h:158
qsizetype end
Definition moc.h:166
qsizetype begin
Definition moc.h:165
QMap< QByteArray, QByteArray > flagAliases
Definition moc.h:164
QByteArray qualified
Definition moc.h:160
qsizetype lineNumber
Definition moc.h:167
QByteArray classname
Definition moc.h:159
QList< ClassInfoDef > classInfoList
Definition moc.h:161
QList< EnumDef > enumList
Definition moc.h:163
Interface(const QByteArray &_className)
Definition moc.h:183
QByteArray className
Definition moc.h:185
QByteArray interfaceId
Definition moc.h:186
QMap< QString, QJsonArray > metaArgs
Definition moc.h:193
QJsonDocument metaData
Definition moc.h:194
QByteArray uri
Definition moc.h:192
QByteArray iid
Definition moc.h:191
bool hasQObject
Definition moc.h:203
QList< QList< Interface > > interfaceList
Definition moc.h:188
QList< FunctionDef > publicList
Definition moc.h:198
QList< FunctionDef > methodList
Definition moc.h:198
QList< PropertyDef > propertyList
Definition moc.h:200
QList< FunctionDef > constructorList
Definition moc.h:197
bool hasQGadget
Definition moc.h:204
QList< SuperClass > superclassList
Definition moc.h:178
bool requireCompleteMethodTypes
Definition moc.h:206
bool hasQNamespace
Definition moc.h:205
QList< FunctionDef > slotList
Definition moc.h:198
QList< FunctionDef > signalList
Definition moc.h:198
int revisionedMethods
Definition moc.h:201
QJsonObject toJson() const
Definition moc.cpp:2040
QList< QByteArray > nonClassSignalList
Definition moc.h:199
QByteArray name
Definition moc.h:153
QByteArray value
Definition moc.h:154
Definition moc.h:53
QByteArray enumName
Definition moc.h:55
QFlags< QtMocConstants::EnumFlags > flags
Definition moc.h:58
QByteArray qualifiedType(const ClassDef *cdef) const
Definition moc.cpp:2244
QJsonObject toJson(const ClassDef &cdef) const
Definition moc.cpp:2223
QList< QByteArray > values
Definition moc.h:57
QByteArray name
Definition moc.h:54
QByteArray type
Definition moc.h:56
bool isVirtual
Definition moc.h:90
bool isScriptable
Definition moc.h:99
bool wasCloned
Definition moc.h:93
QByteArray normalizedType
Definition moc.h:80
QJsonObject toJson(int index) const
Definition moc.cpp:2131
bool isCompat
Definition moc.h:97
bool inlineCode
Definition moc.h:92
Type type
Definition moc.h:78
bool isRawSlot
Definition moc.h:106
static void accessToJson(QJsonObject *obj, Access acs)
Definition moc.cpp:2160
Access access
Definition moc.h:86
bool isSignal
Definition moc.h:101
bool isSlot
Definition moc.h:100
bool isInvokable
Definition moc.h:98
QByteArray name
Definition moc.h:82
QByteArray inPrivateClass
Definition moc.h:83
bool isConst
Definition moc.h:89
QList< ArgumentDef > arguments
Definition moc.h:79
int revision
Definition moc.h:87
bool returnTypeIsVolatile
Definition moc.h:95
bool isAbstract
Definition moc.h:105
bool isPrivateSignal
Definition moc.h:102
bool isDestructor
Definition moc.h:104
@ Public
Definition moc.h:85
@ Protected
Definition moc.h:85
@ Private
Definition moc.h:85
bool isConstructor
Definition moc.h:103
bool isStatic
Definition moc.h:91
QByteArray tag
Definition moc.h:81
Simple structure used by the Doc and DocParser classes.
Symbols symbols
bool isVariadic
bool isFunction
Symbols arguments
bool doGenerate
Definition moc.h:215
bool hasQNamespace
Definition moc.h:214
QByteArray name
Definition moc.h:144
QByteArray storage
Definition moc.h:147
QByteArray accessor
Definition moc.h:146
QByteArray setter
Definition moc.h:145
QByteArray scriptable
Definition moc.h:124
QByteArray member
Definition moc.h:124
QByteArray notify
Definition moc.h:124
QByteArray write
Definition moc.h:124
QByteArray inPrivateClass
Definition moc.h:124
int notifyId
Definition moc.h:125
bool final
Definition moc.h:131
QJsonObject toJson() const
Definition moc.cpp:2178
bool constant
Definition moc.h:130
Specification gspec
Definition moc.h:127
Specification
Definition moc.h:126
@ ReferenceSpec
Definition moc.h:126
@ ValueSpec
Definition moc.h:126
@ PointerSpec
Definition moc.h:126
bool stdCppSet() const
Definition moc.h:115
QByteArray user
Definition moc.h:124
TypeTags typeTag
Definition moc.h:129
QByteArray read
Definition moc.h:124
qsizetype location
Definition moc.h:135
int revision
Definition moc.h:128
QByteArray bind
Definition moc.h:124
int relativeIndex
Definition moc.h:133
QByteArray designable
Definition moc.h:124
bool required
Definition moc.h:132
QByteArray stored
Definition moc.h:124
QByteArray name
Definition moc.h:124
QByteArray reset
Definition moc.h:124
QByteArray type
Definition moc.h:124
qsizetype index
Definition symbols.h:78
Symbols symbols
Definition symbols.h:75
QByteArray expandedMacro
Definition symbols.h:76
QByteArray array
Definition symbols.h:26
SubArray(const char *s)
Definition symbols.h:21
qsizetype len
Definition symbols.h:28
bool operator==(const SubArray &other) const
Definition symbols.h:29
qsizetype from
Definition symbols.h:27
SubArray()=default
SubArray(const QByteArray &a)
Definition symbols.h:20
SubArray(const QByteArray &a, qsizetype from, qsizetype len)
Definition symbols.h:22
QByteArray qualified
Definition moc.h:172
FunctionDef::Access access
Definition moc.h:173
QByteArray classname
Definition moc.h:171
qsizetype from
Definition symbols.h:67
Symbol(int lineNum, Token token)
Definition symbols.h:48
operator SubArray() const
Definition symbols.h:61
Token token
Definition symbols.h:58
bool operator==(const Symbol &o) const
Definition symbols.h:62
int lineNum
Definition symbols.h:57
Symbol()=default
Symbol(int lineNum, Token token, const QByteArray &lexem, qsizetype from, qsizetype len)
Definition symbols.h:53
QByteArray lexem() const
Definition symbols.h:59
QByteArray lex
Definition symbols.h:66
QByteArray unquotedLexem() const
Definition symbols.h:60
qsizetype len
Definition symbols.h:68
Symbol(int lineNum, Token token, const QByteArray &lexem)
Definition symbols.h:49
size_t qHash(const SubArray &key, size_t seed=0)
Definition symbols.h:39
Q_DECLARE_TYPEINFO(Symbol, Q_RELOCATABLE_TYPE)
Q_DECLARE_TYPEINFO(SafeSymbols, Q_RELOCATABLE_TYPE)
QList< Symbol > Symbols
Definition symbols.h:72
#define FOR_ALL_TOKENS(F)
Definition token.h:11
Token PP_Token
Definition token.h:251