1//===--- TypeTraits.cpp - Type Traits Support -----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the type traits support functions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "clang/Basic/TypeTraits.h"
14#include "llvm/Support/ErrorHandling.h"
15#include <cassert>
16using namespace clang;
17
18static constexpr const char *TypeTraitNames[] = {
19#define TYPE_TRAIT_1(Spelling, Name, Key) #Name,
20#include "clang/Basic/TokenKinds.def"
21#define TYPE_TRAIT_2(Spelling, Name, Key) #Name,
22#include "clang/Basic/TokenKinds.def"
23#define TYPE_TRAIT_N(Spelling, Name, Key) #Name,
24#include "clang/Basic/TokenKinds.def"
25};
26
27static constexpr const char *TypeTraitSpellings[] = {
28#define TYPE_TRAIT_1(Spelling, Name, Key) #Spelling,
29#include "clang/Basic/TokenKinds.def"
30#define TYPE_TRAIT_2(Spelling, Name, Key) #Spelling,
31#include "clang/Basic/TokenKinds.def"
32#define TYPE_TRAIT_N(Spelling, Name, Key) #Spelling,
33#include "clang/Basic/TokenKinds.def"
34};
35
36static constexpr const char *ArrayTypeTraitNames[] = {
37#define ARRAY_TYPE_TRAIT(Spelling, Name, Key) #Name,
38#include "clang/Basic/TokenKinds.def"
39};
40
41static constexpr const char *ArrayTypeTraitSpellings[] = {
42#define ARRAY_TYPE_TRAIT(Spelling, Name, Key) #Spelling,
43#include "clang/Basic/TokenKinds.def"
44};
45
46static constexpr const char *UnaryExprOrTypeTraitNames[] = {
47#define UNARY_EXPR_OR_TYPE_TRAIT(Spelling, Name, Key) #Name,
48#define CXX11_UNARY_EXPR_OR_TYPE_TRAIT(Spelling, Name, Key) #Name,
49#include "clang/Basic/TokenKinds.def"
50};
51
52static constexpr const char *UnaryExprOrTypeTraitSpellings[] = {
53#define UNARY_EXPR_OR_TYPE_TRAIT(Spelling, Name, Key) #Spelling,
54#define CXX11_UNARY_EXPR_OR_TYPE_TRAIT(Spelling, Name, Key) #Spelling,
55#include "clang/Basic/TokenKinds.def"
56};
57
58static constexpr const unsigned TypeTraitArities[] = {
59#define TYPE_TRAIT_1(Spelling, Name, Key) 1,
60#include "clang/Basic/TokenKinds.def"
61#define TYPE_TRAIT_2(Spelling, Name, Key) 2,
62#include "clang/Basic/TokenKinds.def"
63#define TYPE_TRAIT_N(Spelling, Name, Key) 0,
64#include "clang/Basic/TokenKinds.def"
65};
66
67const char *clang::getTraitName(TypeTrait T) {
68 assert(T <= TT_Last && "invalid enum value!");
69 return TypeTraitNames[T];
70}
71
72const char *clang::getTraitName(ArrayTypeTrait T) {
73 assert(T <= ATT_Last && "invalid enum value!");
74 return ArrayTypeTraitNames[T];
75}
76
77const char *clang::getTraitName(UnaryExprOrTypeTrait T) {
78 assert(T <= UETT_Last && "invalid enum value!");
79 return UnaryExprOrTypeTraitNames[T];
80}
81
82const char *clang::getTraitSpelling(TypeTrait T) {
83 assert(T <= TT_Last && "invalid enum value!");
84 return TypeTraitSpellings[T];
85}
86
87const char *clang::getTraitSpelling(ArrayTypeTrait T) {
88 assert(T <= ATT_Last && "invalid enum value!");
89 return ArrayTypeTraitSpellings[T];
90}
91
92const char *clang::getTraitSpelling(UnaryExprOrTypeTrait T) {
93 assert(T <= UETT_Last && "invalid enum value!");
94 return UnaryExprOrTypeTraitSpellings[T];
95}
96
97unsigned clang::getTypeTraitArity(TypeTrait T) {
98 assert(T <= TT_Last && "invalid enum value!");
99 return TypeTraitArities[T];
100}
101

source code of clang/lib/Basic/TypeTraits.cpp