xref: /aosp_15_r20/external/angle/src/compiler/translator/Name.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2020 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker #ifndef COMPILER_TRANSLATOR_NAME_H_
8*8975f5c5SAndroid Build Coastguard Worker #define COMPILER_TRANSLATOR_NAME_H_
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/ImmutableString.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/InfoSink.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/IntermNode.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/Symbol.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "compiler/translator/Types.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker namespace sh
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker constexpr char kAngleInternalPrefix[] = "ANGLE";
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker // Represents the name of a symbol.
22*8975f5c5SAndroid Build Coastguard Worker class Name
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker   public:
25*8975f5c5SAndroid Build Coastguard Worker     constexpr Name(const Name &) = default;
26*8975f5c5SAndroid Build Coastguard Worker 
Name()27*8975f5c5SAndroid Build Coastguard Worker     constexpr Name() : Name(kEmptyImmutableString, SymbolType::Empty) {}
28*8975f5c5SAndroid Build Coastguard Worker 
Name(ImmutableString rawName,SymbolType symbolType)29*8975f5c5SAndroid Build Coastguard Worker     constexpr Name(ImmutableString rawName, SymbolType symbolType)
30*8975f5c5SAndroid Build Coastguard Worker         : mRawName(rawName), mSymbolType(symbolType)
31*8975f5c5SAndroid Build Coastguard Worker     {
32*8975f5c5SAndroid Build Coastguard Worker         ASSERT(rawName.empty() == (symbolType == SymbolType::Empty));
33*8975f5c5SAndroid Build Coastguard Worker     }
34*8975f5c5SAndroid Build Coastguard Worker 
35*8975f5c5SAndroid Build Coastguard Worker     explicit constexpr Name(const char *rawName, SymbolType symbolType = SymbolType::AngleInternal)
Name(ImmutableString (rawName),symbolType)36*8975f5c5SAndroid Build Coastguard Worker         : Name(ImmutableString(rawName), symbolType)
37*8975f5c5SAndroid Build Coastguard Worker     {}
38*8975f5c5SAndroid Build Coastguard Worker 
Name(const std::string & rawName,SymbolType symbolType)39*8975f5c5SAndroid Build Coastguard Worker     Name(const std::string &rawName, SymbolType symbolType)
40*8975f5c5SAndroid Build Coastguard Worker         : Name(ImmutableString(rawName), symbolType)
41*8975f5c5SAndroid Build Coastguard Worker     {}
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker     explicit Name(const TField &field);
44*8975f5c5SAndroid Build Coastguard Worker     explicit Name(const TSymbol &symbol);
45*8975f5c5SAndroid Build Coastguard Worker 
46*8975f5c5SAndroid Build Coastguard Worker     Name &operator=(const Name &) = default;
47*8975f5c5SAndroid Build Coastguard Worker     bool operator==(const Name &other) const;
48*8975f5c5SAndroid Build Coastguard Worker     bool operator!=(const Name &other) const;
49*8975f5c5SAndroid Build Coastguard Worker     bool operator<(const Name &other) const;
50*8975f5c5SAndroid Build Coastguard Worker 
rawName()51*8975f5c5SAndroid Build Coastguard Worker     constexpr const ImmutableString &rawName() const { return mRawName; }
symbolType()52*8975f5c5SAndroid Build Coastguard Worker     constexpr SymbolType symbolType() const { return mSymbolType; }
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker     bool empty() const;
55*8975f5c5SAndroid Build Coastguard Worker     bool beginsWith(const Name &prefix) const;
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker     void emit(TInfoSinkBase &out) const;
58*8975f5c5SAndroid Build Coastguard Worker 
59*8975f5c5SAndroid Build Coastguard Worker   private:
60*8975f5c5SAndroid Build Coastguard Worker     ImmutableString mRawName;
61*8975f5c5SAndroid Build Coastguard Worker     SymbolType mSymbolType;
62*8975f5c5SAndroid Build Coastguard Worker     template <typename T>
63*8975f5c5SAndroid Build Coastguard Worker     void emitImpl(T &out) const;
64*8975f5c5SAndroid Build Coastguard Worker     friend std::ostream &operator<<(std::ostream &os, const sh::Name &name);
65*8975f5c5SAndroid Build Coastguard Worker };
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker constexpr Name kBaseInstanceName = Name("baseInstance");
68*8975f5c5SAndroid Build Coastguard Worker 
69*8975f5c5SAndroid Build Coastguard Worker [[nodiscard]] bool ExpressionContainsName(const Name &name, TIntermTyped &node);
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker }  // namespace sh
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker #endif  // COMPILER_TRANSLATOR_MSL_NAME_H_
74