Skip to content

Commit 8bc2516

Browse files
committed
Add support for LinkedList containers defined directly in geometries.
1 parent 24be7a3 commit 8bc2516

File tree

2 files changed

+133
-20
lines changed

2 files changed

+133
-20
lines changed

Visual_Studio_2017/GraphicalDebugging/ExpressionLoader_UserDefined.cs

Lines changed: 102 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ partial class ExpressionLoader
2222
// TODO: The code is similar to std::vector loader, unify if possible
2323
class UserArray : ContiguousContainer
2424
{
25-
public UserArray(string id, string strPointer, string strSize)
25+
public UserArray(string id,
26+
ClassScopeExpression exprPointer,
27+
ClassScopeExpression exprSize)
2628
{
2729
this.id = id;
28-
this.exprPointer = new ClassScopeExpression(strPointer);
29-
this.exprSize = new ClassScopeExpression(strSize);
30+
this.exprPointer = exprPointer;
31+
this.exprSize = exprSize;
3032
}
3133

3234
public override void Initialize(Debugger debugger, string name)
@@ -62,16 +64,16 @@ public override int LoadSize(Debugger debugger, string name)
6264
class UserLinkedList : ContainerLoader
6365
{
6466
public UserLinkedList(string id,
65-
string strHeadPointer,
66-
string strNextPointer,
67-
string strValue,
68-
string strSize)
67+
ClassScopeExpression exprHeadPointer,
68+
ClassScopeExpression exprNextPointer,
69+
ClassScopeExpression exprValue,
70+
ClassScopeExpression exprSize)
6971
{
7072
this.id = id;
71-
this.exprHeadPointer = new ClassScopeExpression(strHeadPointer);
72-
this.exprNextPointer = new ClassScopeExpression(strNextPointer);
73-
this.exprValue = new ClassScopeExpression(strValue);
74-
this.exprSize = new ClassScopeExpression(strSize);
73+
this.exprHeadPointer = exprHeadPointer;
74+
this.exprNextPointer = exprNextPointer;
75+
this.exprValue = exprValue;
76+
this.exprSize = exprSize;
7577
}
7678

7779
public override void Initialize(Debugger debugger, string name)
@@ -443,6 +445,62 @@ public UserContainerLoaders<ElementLoader> GetLoaders<ElementLoader>(Loaders loa
443445
ClassScopeExpression exprSize;
444446
}
445447

448+
class UserLinkedListEntry : IUserContainerEntry
449+
{
450+
public UserLinkedListEntry(string strHeadPointer,
451+
string strNextPointer,
452+
string strValue,
453+
string strSize)
454+
{
455+
this.exprHeadPointer = new ClassScopeExpression(strHeadPointer);
456+
this.exprNextPointer = new ClassScopeExpression(strNextPointer);
457+
this.exprValue = new ClassScopeExpression(strValue);
458+
this.exprSize = new ClassScopeExpression(strSize);
459+
}
460+
461+
public void Initialize(Debugger debugger, string name)
462+
{
463+
}
464+
465+
public UserContainerLoaders<ElementLoader> GetLoaders<ElementLoader>(Loaders loaders,
466+
IKindConstraint elementKindConstraint,
467+
Debugger debugger, string name)
468+
where ElementLoader : Loader
469+
{
470+
string type = ExpressionParser.GetValueType(debugger, name);
471+
if (type == null)
472+
return null;
473+
474+
// NOTE: This could be done in Initialize(),however in all other places
475+
// container is created an initialized during Loading.
476+
// So do this in this case as well.
477+
string id = Util.BaseType(type);
478+
UserLinkedList containerLoader = new UserLinkedList(id, exprHeadPointer, exprNextPointer, exprValue, exprSize);
479+
containerLoader.Initialize(debugger, name);
480+
481+
string elementType = containerLoader.ElementType(type);
482+
string elementName = containerLoader.ElementName(name, elementType);
483+
ElementLoader elementLoader = loaders.FindByType(elementKindConstraint,
484+
elementName,
485+
elementType) as ElementLoader;
486+
if (elementLoader == null)
487+
return null;
488+
489+
UserContainerLoaders<ElementLoader> result = new UserContainerLoaders<ElementLoader>();
490+
result.ContainerLoader = containerLoader;
491+
result.ElementLoader = elementLoader;
492+
result.ContainerName = name;
493+
result.ContainerType = type;
494+
result.ElementType = elementType;
495+
return result;
496+
}
497+
498+
ClassScopeExpression exprHeadPointer;
499+
ClassScopeExpression exprNextPointer;
500+
ClassScopeExpression exprValue;
501+
ClassScopeExpression exprSize;
502+
}
503+
446504
class UserRange<ResultType> : PointRange<ResultType>
447505
where ResultType : class
448506
, ExpressionDrawer.IDrawable
@@ -868,7 +926,9 @@ private static bool ReloadUserTypes(Loaders loaders,
868926
var elSize = Util.GetXmlElementByTagName(elArray, "Size");
869927
if (elPointer != null && elSize != null)
870928
{
871-
loaders.Add(new UserArray(id, elPointer.InnerText, elSize.InnerText));
929+
loaders.Add(new UserArray(id,
930+
new ClassScopeExpression(elPointer.InnerText),
931+
new ClassScopeExpression(elSize.InnerText)));
872932
}
873933
}
874934
else if (elLinkedList != null)
@@ -881,10 +941,10 @@ private static bool ReloadUserTypes(Loaders loaders,
881941
&& elValue != null && elSize != null)
882942
{
883943
loaders.Add(new UserLinkedList(id,
884-
elHeadPointer.InnerText,
885-
elNextPointer.InnerText,
886-
elValue.InnerText,
887-
elSize.InnerText));
944+
new ClassScopeExpression(elHeadPointer.InnerText),
945+
new ClassScopeExpression(elNextPointer.InnerText),
946+
new ClassScopeExpression(elValue.InnerText),
947+
new ClassScopeExpression(elSize.InnerText)));
888948
}
889949
}
890950
}
@@ -972,10 +1032,14 @@ static IUserContainerEntry GetContainerEntry(System.Xml.XmlElement elDrawable,
9721032
var elElements = Util.GetXmlElementByTagName(elDrawable, elementsKind);
9731033
if (elElements != null)
9741034
{
975-
var elContName = Util.GetXmlElementByTagNames(elElements, "Container", "Name");
976-
if (elContName != null)
1035+
var elContainer = Util.GetXmlElementByTagName(elElements, "Container");
1036+
if (elContainer != null)
9771037
{
978-
return new UserContainerEntry(elContName.InnerText);
1038+
var elName = Util.GetXmlElementByTagName(elContainer, "Name");
1039+
if (elName != null)
1040+
{
1041+
return new UserContainerEntry(elName.InnerText);
1042+
}
9791043
}
9801044
else
9811045
{
@@ -989,6 +1053,25 @@ static IUserContainerEntry GetContainerEntry(System.Xml.XmlElement elDrawable,
9891053
return new UserArrayEntry(elPointer.InnerText, elSize.InnerText);
9901054
}
9911055
}
1056+
else
1057+
{
1058+
var elLinkedList = Util.GetXmlElementByTagName(elElements, "LinkedList");
1059+
if (elLinkedList != null)
1060+
{
1061+
var elHeadPointer = Util.GetXmlElementByTagName(elLinkedList, "HeadPointer");
1062+
var elNextPointer = Util.GetXmlElementByTagName(elLinkedList, "NextPointer");
1063+
var elValue = Util.GetXmlElementByTagName(elLinkedList, "Value");
1064+
var elSize = Util.GetXmlElementByTagName(elLinkedList, "Size");
1065+
if (elHeadPointer != null && elNextPointer != null
1066+
&& elValue != null && elSize != null)
1067+
{
1068+
return new UserLinkedListEntry(elHeadPointer.InnerText,
1069+
elNextPointer.InnerText,
1070+
elValue.InnerText,
1071+
elSize.InnerText);
1072+
}
1073+
}
1074+
}
9921075
}
9931076
}
9941077
return null;

examples/cpp.xml

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,36 @@
8686
</Points>
8787
</Linestring>
8888

89+
<!--
90+
template <typename Point>
91+
struct MyLinestring4 : std::vector<Point>
92+
{ };
93+
-->
94+
<Linestring Id="MyLinestring4">
95+
<Points>
96+
<Array>
97+
<Pointer>_Mypair._Myval2._Myfirst</Pointer>
98+
<Size>_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Size>
99+
</Array>
100+
</Points>
101+
</Linestring>
102+
103+
<!--
104+
template <typename Point>
105+
struct MyLinestring5 : std::list<Point>
106+
{ };
107+
-->
108+
<Linestring Id="MyLinestring5">
109+
<Points>
110+
<LinkedList>
111+
<Size>_Mypair._Myval2._Mysize</Size>
112+
<HeadPointer>_Mypair._Myval2._Myhead-&gt;_Next</HeadPointer>
113+
<NextPointer>_Next</NextPointer>
114+
<Value>_Myval</Value>
115+
</LinkedList>
116+
</Points>
117+
</Linestring>
118+
89119
<!--
90120
struct MyRing : std::vector<MyPoint>
91121
{ };
@@ -188,7 +218,7 @@
188218
</Container>
189219
</Geometries>
190220
</MultiGeometry>
191-
221+
192222
<!--
193223
template <typename T>
194224
struct MyVector : std::vector<T>

0 commit comments

Comments
 (0)