@@ -44,20 +44,87 @@ enum class idt : unsigned
44
44
#include " irep_ids.def" // NOLINT(build/include)
45
45
};
46
46
47
+ class irep_idt final : public dstringt
48
+ {
49
+ public:
50
+ // this is safe for static objects
51
+ #ifdef __GNUC__
52
+ constexpr
53
+ #endif
54
+ irep_idt ()
55
+ : dstringt()
56
+ {
57
+ }
58
+
59
+ // this is safe for static objects
60
+ #ifdef __GNUC__
61
+ constexpr
62
+ #endif
63
+ static irep_idt
64
+ make_from_table_index (unsigned no)
65
+ {
66
+ return irep_idt (no);
67
+ }
68
+
69
+ #ifdef __GNUC__
70
+ // This conversion allows the use of irep_idts
71
+ // in switch ... case statements.
72
+ constexpr operator idt () const
73
+ {
74
+ return static_cast <idt>(no);
75
+ }
76
+ #endif
77
+
78
+ // this one is not safe for static objects
79
+ // NOLINTNEXTLINE(runtime/explicit)
80
+ irep_idt (const char *s) : dstringt(s)
81
+ {
82
+ }
83
+
84
+ // this one is not safe for static objects
85
+ // NOLINTNEXTLINE(runtime/explicit)
86
+ irep_idt (const std::string &s) : dstringt(s)
87
+ {
88
+ }
89
+
90
+ protected:
91
+ #ifdef __GNUC__
92
+ constexpr
93
+ #endif
94
+ explicit irep_idt (unsigned _no)
95
+ : dstringt(_no)
96
+ {
97
+ }
98
+ };
99
+
100
+ // NOLINTNEXTLINE [allow specialisation within 'std']
101
+ namespace std
102
+ {
103
+ // / Default hash function of `dstringt` for use with STL containers.
104
+ template <>
105
+ struct hash <irep_idt> // NOLINT(readability/identifiers)
106
+ {
107
+ size_t operator ()(const irep_idt &irep_id) const
108
+ {
109
+ return irep_id.hash ();
110
+ }
111
+ };
112
+ } // namespace std
113
+
47
114
#ifdef __GNUC__
48
- #define IREP_ID_ONE (the_id ) \
49
- constexpr dstringt ID_##the_id=dstringt::make_from_table_index( \
50
- static_cast <unsigned >(idt::id_##the_id));
51
- #define IREP_ID_TWO (the_id, str ) \
52
- constexpr dstringt ID_##the_id=dstringt::make_from_table_index( \
53
- static_cast <unsigned >(idt::id_##the_id));
115
+ #define IREP_ID_ONE (the_id ) \
116
+ constexpr irep_idt ID_##the_id = \
117
+ irep_idt::make_from_table_index ( static_cast <unsigned >(idt::id_##the_id));
118
+ #define IREP_ID_TWO (the_id, str ) \
119
+ constexpr irep_idt ID_##the_id = \
120
+ irep_idt::make_from_table_index ( static_cast <unsigned >(idt::id_##the_id));
54
121
#else
55
- #define IREP_ID_ONE (the_id ) \
56
- const dstringt ID_##the_id=dstringt::make_from_table_index( \
57
- static_cast <unsigned >(idt::id_##the_id));
58
- #define IREP_ID_TWO (the_id, str ) \
59
- const const dstringt ID_##the_id=dstringt::make_from_table_index( \
60
- static_cast <unsigned >(idt::id_##the_id));
122
+ #define IREP_ID_ONE (the_id ) \
123
+ const irep_idt ID_##the_id = \
124
+ irep_idt::make_from_table_index ( static_cast <unsigned >(idt::id_##the_id));
125
+ #define IREP_ID_TWO (the_id, str ) \
126
+ const const irep_idt ID_##the_id = \
127
+ irep_idt::make_from_table_index ( static_cast <unsigned >(idt::id_##the_id));
61
128
#endif
62
129
63
130
template <>
0 commit comments