@@ -119,62 +119,41 @@ std::vector<AnglePos> FindTemplateAngleBrackets(const std::string &typeName)
119
119
}
120
120
121
121
// TClassEdit::CleanType and the name demangling insert blanks between closing angle brackets,
122
- // as they were required before C++11. We want to remove them for RNTuple.
123
- void RemoveSpaceBeforeClosingAngleBracket (std::string &typeName)
122
+ // as they were required before C++11. Name demangling introduces a blank before array dimensions,
123
+ // which should also be removed.
124
+ void RemoveSpaceBefore (std::string &typeName, char beforeChar)
124
125
{
125
- auto angle = typeName.find (' <' );
126
- if (angle != std::string::npos) {
127
- auto dst = typeName.begin () + angle;
128
- auto end = typeName.end ();
129
- for (auto src = dst; src != end; ++src) {
130
- if (*src == ' ' ) {
131
- auto next = src + 1 ;
132
- if (next != end && *next == ' >' ) {
133
- // Skip this space before a closing angle bracket.
134
- continue ;
135
- }
126
+ auto dst = typeName.begin ();
127
+ auto end = typeName.end ();
128
+ for (auto src = dst; src != end; ++src) {
129
+ if (*src == ' ' ) {
130
+ auto next = src + 1 ;
131
+ if (next != end && *next == beforeChar) {
132
+ // Skip this space before a closing angle bracket.
133
+ continue ;
136
134
}
137
- *(dst++) = *src;
138
135
}
139
- typeName. erase (dst, end) ;
136
+ * (dst++) = *src ;
140
137
}
138
+ typeName.erase (dst, end);
141
139
}
142
140
143
141
// The demangled name adds spaces after commas
144
- void RemoveSpaceAfterComma (std::string &typeName)
142
+ void RemoveSpaceAfter (std::string &typeName, char afterChar )
145
143
{
146
- auto itr = typeName.begin ();
147
- while (itr != typeName.end ()) {
148
- auto c = *itr;
149
- itr++;
150
-
151
- if (c != ' ,' )
152
- continue ;
153
-
154
- R__ASSERT (itr != typeName.end ());
155
- if (*itr == ' ' ) {
156
- itr = typeName.erase (itr);
157
- }
158
- }
159
- }
160
-
161
- // The demangled name adds a space before array dimensions
162
- void RemoveSpaceBeforeBracket (std::string &typeName)
163
- {
164
- auto itr = typeName.begin ();
165
- while (itr != typeName.end ()) {
166
- auto last = itr;
167
- itr++;
168
-
169
- if (*last != ' ' )
170
- continue ;
171
-
172
- R__ASSERT (itr != typeName.end ());
173
- if (*itr == ' [' ) {
174
- itr = typeName.erase (last);
175
- itr++;
144
+ auto dst = typeName.begin ();
145
+ auto end = typeName.end ();
146
+ for (auto src = dst; src != end; ++src) {
147
+ *(dst++) = *src;
148
+ if (*src == afterChar) {
149
+ auto next = src + 1 ;
150
+ if (next != end && *next == ' ' ) {
151
+ // Skip this space before a closing angle bracket.
152
+ ++src;
153
+ }
176
154
}
177
155
}
156
+ typeName.erase (dst, end);
178
157
}
179
158
180
159
// Map fundamental integer types to stdint integer types (e.g. int --> std::int32_t)
@@ -214,8 +193,8 @@ std::string GetDemangledTrimmedType(const std::type_info &ti)
214
193
std::string result{str};
215
194
free (str);
216
195
217
- RemoveSpaceBeforeClosingAngleBracket (result);
218
- RemoveSpaceAfterComma (result);
196
+ RemoveSpaceBefore (result, ' > ' );
197
+ RemoveSpaceAfter (result, ' , ' );
219
198
220
199
return result;
221
200
}
@@ -331,16 +310,16 @@ std::string GetRenormalizedDemangledTypeName(const std::string &demangledName)
331
310
using ROOT::Internal::ParseArrayType;
332
311
333
312
std::string tn{demangledName};
334
- RemoveSpaceBeforeBracket (tn);
313
+ RemoveSpaceBefore (tn, ' [ ' );
335
314
auto [canonicalTypePrefix, dimensions] = ParseArrayType (tn);
336
315
MapIntegerType (canonicalTypePrefix);
337
316
338
317
if (canonicalTypePrefix.find (' <' ) == std::string::npos) {
339
318
// If there are no templates, the function is done.
340
319
return GetStandardArrayType (canonicalTypePrefix, dimensions);
341
320
}
342
- RemoveSpaceBeforeClosingAngleBracket (canonicalTypePrefix);
343
- RemoveSpaceAfterComma (canonicalTypePrefix);
321
+ RemoveSpaceBefore (canonicalTypePrefix, ' > ' );
322
+ RemoveSpaceAfter (canonicalTypePrefix, ' , ' );
344
323
345
324
// Remove optional stdlib template arguments
346
325
int maxTemplateArgs = 0 ;
@@ -381,7 +360,7 @@ std::tuple<std::string, std::vector<std::size_t>> ROOT::Internal::GetCanonicalTy
381
360
canonicalType.erase (0 , 2 );
382
361
}
383
362
384
- RemoveSpaceBeforeClosingAngleBracket (canonicalType);
363
+ RemoveSpaceBefore (canonicalType, ' > ' );
385
364
386
365
if (canonicalType.substr (0 , 6 ) == " array<" ) {
387
366
canonicalType = " std::" + canonicalType;
0 commit comments