Skip to content

Commit 02f70d0

Browse files
committed
Cached found type maps for faster look-ups.
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent 3b51325 commit 02f70d0

File tree

1 file changed

+35
-20
lines changed

1 file changed

+35
-20
lines changed

src/Generator/Types/TypeMapDatabase.cs

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,53 +50,64 @@ private void SetupTypeMaps(IEnumerable<System.Type> types,
5050

5151
public bool FindTypeMap(Declaration decl, Type type, out TypeMap typeMap)
5252
{
53+
if (type != null && typeMaps.ContainsKey(type))
54+
{
55+
typeMap = typeMaps[type];
56+
return typeMap.IsEnabled;
57+
}
58+
5359
// We try to find type maps from the most qualified to less qualified
5460
// types. Example: '::std::vector', 'std::vector' and 'vector'
5561

5662
var typePrinter = new CppTypePrinter { PrintLogicalNames = true };
5763

58-
if (FindTypeMap(decl.Visit(typePrinter), out typeMap))
59-
{
60-
typeMap.Type = type;
64+
if (FindTypeMap(decl, type, out typeMap, typePrinter))
6165
return true;
62-
}
6366

6467
typePrinter.PrintScopeKind = TypePrintScopeKind.Qualified;
65-
if (FindTypeMap(decl.Visit(typePrinter), out typeMap))
66-
{
67-
typeMap.Type = type;
68+
if (FindTypeMap(decl, type, out typeMap, typePrinter))
6869
return true;
69-
}
7070

7171
typePrinter.ResolveTypedefs = true;
72-
if (FindTypeMap(decl.Visit(typePrinter), out typeMap))
73-
{
74-
typeMap.Type = type;
72+
if (FindTypeMap(decl, type, out typeMap, typePrinter))
7573
return true;
76-
}
7774
typePrinter.ResolveTypedefs = false;
7875

7976
typePrinter.PrintScopeKind = TypePrintScopeKind.Local;
80-
if (FindTypeMap(decl.Visit(typePrinter), out typeMap))
81-
{
82-
typeMap.Type = type;
77+
if (FindTypeMap(decl, type, out typeMap, typePrinter))
8378
return true;
84-
}
8579

8680
var specialization = decl as ClassTemplateSpecialization;
8781
if (specialization != null &&
88-
FindTypeMap(specialization.TemplatedDecl.Visit(typePrinter), out typeMap))
89-
{
90-
typeMap.Type = type;
82+
FindTypeMap(specialization.TemplatedDecl, type, out typeMap, typePrinter))
9183
return true;
92-
}
9384

9485
var typedef = decl as TypedefDecl;
9586
return typedef != null && FindTypeMap(typedef.Type, out typeMap);
9687
}
9788

89+
private bool FindTypeMap(Declaration decl, Type type, out TypeMap typeMap, CppTypePrinter typePrinter)
90+
{
91+
if (FindTypeMap(decl.Visit(typePrinter), out typeMap))
92+
{
93+
if (type != null && typeMap.Type == null)
94+
{
95+
typeMap.Type = type;
96+
typeMaps[type] = typeMap;
97+
}
98+
return true;
99+
}
100+
return false;
101+
}
102+
98103
public bool FindTypeMap(Type type, out TypeMap typeMap)
99104
{
105+
if (typeMaps.ContainsKey(type))
106+
{
107+
typeMap = typeMaps[type];
108+
return typeMap.IsEnabled;
109+
}
110+
100111
var typePrinter = new CppTypePrinter
101112
{
102113
PrintTypeQualifiers = false,
@@ -119,13 +130,15 @@ public bool FindTypeMap(Type type, out TypeMap typeMap)
119130
if (FindTypeMap(type.Visit(typePrinter), out typeMap))
120131
{
121132
typeMap.Type = type;
133+
typeMaps[type] = typeMap;
122134
return true;
123135
}
124136

125137
typePrinter.PrintScopeKind = TypePrintScopeKind.Qualified;
126138
if (FindTypeMap(type.Visit(typePrinter), out typeMap))
127139
{
128140
typeMap.Type = type;
141+
typeMaps[type] = typeMap;
129142
return true;
130143
}
131144

@@ -157,5 +170,7 @@ private bool FindTypeMap(string name, out TypeMap typeMap)
157170
{
158171
return TypeMaps.TryGetValue(name, out typeMap) && typeMap.IsEnabled;
159172
}
173+
174+
private Dictionary<Type, TypeMap> typeMaps = new Dictionary<Type, TypeMap>();
160175
}
161176
}

0 commit comments

Comments
 (0)