Add architecture diagram

This commit is contained in:
Martchus 2018-01-12 15:28:37 +01:00
parent 38d843b399
commit 282a3a1fb6
3 changed files with 1084 additions and 0 deletions

View File

@ -232,6 +232,15 @@ An example for such custom (de)serialization can be found in the file
Checkout the test cases for further examples. Relevant files are in
the directories `lib/tests` and `generator/tests`.
## Architecture
The following diagram gives an overview about the architecture of the code generator and wrapper library
around RapidJSON:
![Architectue overview](/doc/arch.svg)
* blue: classes from LibTooling/Clang
* grey: conceivable extension or use
## Install instructions
### Dependencies

778
doc/arch.graphml Normal file
View File

@ -0,0 +1,778 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
<!--Created by yEd 3.17.2-->
<key attr.name="Beschreibung" attr.type="string" for="graph" id="d0"/>
<key for="port" id="d1" yfiles.type="portgraphics"/>
<key for="port" id="d2" yfiles.type="portgeometry"/>
<key for="port" id="d3" yfiles.type="portuserdata"/>
<key attr.name="url" attr.type="string" for="node" id="d4"/>
<key attr.name="description" attr.type="string" for="node" id="d5"/>
<key for="node" id="d6" yfiles.type="nodegraphics"/>
<key for="graphml" id="d7" yfiles.type="resources"/>
<key attr.name="url" attr.type="string" for="edge" id="d8"/>
<key attr.name="description" attr.type="string" for="edge" id="d9"/>
<key for="edge" id="d10" yfiles.type="edgegraphics"/>
<graph edgedefault="directed" id="G">
<data key="d0"/>
<node id="n0">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="200.0" width="587.0" x="288.0" y="394.33333333333326"/>
<y:Fill hasColor="false" transparent="false"/>
<y:BorderStyle color="#999999" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="14" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="23.0654296875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="54.17578125" x="4.0" y="4.0">Library<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="-0.5" nodeRatioX="-0.5" nodeRatioY="-0.5" offsetX="4.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n1">
<data key="d4"/>
<data key="d6">
<y:UMLNoteNode>
<y:Geometry height="153.0" width="151.25" x="708.5" y="417.83333333333326"/>
<y:Fill hasColor="false" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="20.341796875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="103.92578125" x="23.662109375" y="4.0">Helper functions<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="36.68359375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="82.158203125" x="34.5458984375" y="25.324869791666742">in namespace
JsonReflector<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="-0.33447797521786443" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
</y:UMLNoteNode>
</data>
</node>
<node id="n2">
<data key="d6">
<y:ShapeNode>
<y:Geometry height="517.0" width="778.0" x="288.0" y="-147.0"/>
<y:Fill hasColor="false" transparent="false"/>
<y:BorderStyle color="#999999" raised="false" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="14" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="23.0654296875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="112.8759765625" x="4.0" y="4.0">Code generator<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="-0.5" labelRatioY="-0.5" nodeRatioX="-0.5" nodeRatioY="-0.5" offsetX="4.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:Shape type="rectangle"/>
</y:ShapeNode>
</data>
</node>
<node id="n3">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="98.0" width="134.0" x="380.5" y="210.33333333333337"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="84.90087890625" x="24.549560546875" y="3.0">CodeFactory<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel>addDeclaration()
generate()</y:MethodLabel>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n4">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="110.0" width="134.0" x="650.0" y="79.0"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="102.9091796875" x="15.54541015625" y="28.341796875">CodeGenerator<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="abstract" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel>addDeclaration()
generate()</y:MethodLabel>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n5">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="61.0" width="251.0" x="533.0" y="266.0"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="214.5390625" x="18.23046875" y="3.0"> JsonSerializationCodeGenerator<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n6">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="61.0" width="134.0" x="789.5" y="266.0"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#808080" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#808080" verticalTextPosition="bottom" visible="true" width="126.1416015625" x="3.92919921875" y="3.0">FooCodeGenerator<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="85.708984375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="129.0859375" x="2.45703125" y="-12.3544921875">
....
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="65.0" y="28.5">
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n7">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="34.0" width="216.0" x="297.5" y="79.0"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#0000FF" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#0000FF" verticalTextPosition="bottom" visible="true" width="197.92724609375" x="9.036376953125" y="3.0">clang::tooling::ToolInvocation<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n8">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="61.0" width="134.0" x="331.0" y="-29.33333333333337"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="105.58154296875" x="14.209228515625" y="3.0">FrontendAction<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n9">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="34.0" width="189.0" x="303.5" y="-108.0"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#0000FF" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#0000FF" verticalTextPosition="bottom" visible="true" width="171.92724609375" x="8.536376953125" y="3.0">clang::ASTFrontendAction<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n10">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="61.0" width="134.0" x="591.5" y="-29.33333333333337"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="70.2314453125" x="31.88427734375" y="3.0">Consumer<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n11">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="34.0" width="189.0" x="564.0" y="-108.0"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#0000FF" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#0000FF" verticalTextPosition="bottom" visible="true" width="136.5771484375" x="26.21142578125" y="3.0">clang::ASTConsumer<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n12">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="61.0" width="134.0" x="863.5" y="-29.33333333333337"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="46.4404296875" x="43.77978515625" y="3.0">Visitor<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n13">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="34.0" width="251.0" x="805.0" y="-108.0"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#0000FF" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#0000FF" verticalTextPosition="bottom" visible="true" width="232.99169921875" x="9.004150390625" y="3.0">clang::RecursiveASTVisitor&lt;Visitor&gt;<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n14">
<data key="d6">
<y:GenericNode configuration="com.yworks.flowchart.document">
<y:Geometry height="44.0" width="80.0" x="300.5" y="136.33333333333337"/>
<y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="38.0" y="20.0">
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="20.341796875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="42.712890625" x="18.6435546875" y="4.0">main()<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
</y:GenericNode>
</data>
</node>
<node id="n15">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="118.0" width="143.0" x="418.25" y="400.0"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="128.31884765625" x="7.340576171875" y="28.341796875">JsonSerializable&lt;T&gt;<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="abstract" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel>toJson()
fromJson()</y:MethodLabel>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n16">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="34.0" width="97.0" x="365.0" y="618.6666666666665"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#808080" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#808080" verticalTextPosition="bottom" visible="true" width="66.81005859375" x="15.094970703125" y="3.0">FooStruct<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="85.708984375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="129.0859375" x="-16.04296875" y="-25.8544921875">
....
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="85.708984375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="286.814453125" x="-94.9072265625" y="-25.8544921875">
asedfasdfasdfasdfasdfasdfasd
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n17">
<data key="d4"/>
<data key="d6">
<y:UMLClassNode>
<y:Geometry height="34.0" width="97.0" x="515.0" y="618.6666666666665"/>
<y:Fill color="#FFFFFF" transparent="false"/>
<y:BorderStyle color="#808080" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="13" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.70361328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#808080" verticalTextPosition="bottom" visible="true" width="66.0673828125" x="15.46630859375" y="3.0">BarStruct<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="85.708984375" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="129.0859375" x="-16.04296875" y="-25.8544921875">
....
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="46.5" y="15.0">
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:UML clipContent="true" constraint="" omitDetails="false" stereotype="" use3DEffect="false">
<y:AttributeLabel/>
<y:MethodLabel/>
</y:UML>
</y:UMLClassNode>
</data>
</node>
<node id="n18">
<data key="d6">
<y:GenericNode configuration="com.yworks.flowchart.document">
<y:Geometry height="44.0" width="80.0" x="750.375" y="506.4999999999998"/>
<y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="38.0" y="20.0">
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="38.0" y="4.0">
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
</y:GenericNode>
</data>
</node>
<node id="n19">
<data key="d6">
<y:GenericNode configuration="com.yworks.flowchart.document">
<y:Geometry height="44.0" width="80.0" x="744.125" y="499.6666666666665"/>
<y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="38.0" y="20.0">
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="38.0" y="4.0">
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
</y:GenericNode>
</data>
</node>
<node id="n20">
<data key="d6">
<y:GenericNode configuration="com.yworks.flowchart.document">
<y:Geometry height="44.0" width="80.0" x="736.625" y="490.9166666666665"/>
<y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="38.0" y="20.0">
<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="20.341796875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="32.18359375" x="23.908203125" y="4.0">pull()<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="-0.5" nodeRatioX="0.0" nodeRatioY="-0.5" offsetX="0.0" offsetY="4.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
</y:GenericNode>
</data>
</node>
<node id="n21">
<data key="d6">
<y:GenericNode configuration="com.yworks.flowchart.cloud">
<y:Geometry height="61.0" width="106.0" x="943.75" y="463.83333333333326"/>
<y:Fill color="#E8EEF7" color2="#B7C9E3" transparent="false"/>
<y:BorderStyle color="#000000" type="line" width="1.0"/>
<y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="20.341796875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="64.404296875" x="20.7978515625" y="20.3291015625">RapidJSON<y:LabelModel>
<y:SmartNodeLabelModel distance="4.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/>
</y:ModelParameter>
</y:NodeLabel>
</y:GenericNode>
</data>
</node>
<edge id="e0" source="n5" target="n4">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="58.5" sy="-6.238636363636361" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="white_delta"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e1" source="n6" target="n4">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="40.01987223875494" ty="55.06064415862165">
<y:Point x="856.5" y="233.0"/>
<y:Point x="757.0198722387549" y="233.0"/>
</y:Path>
<y:LineStyle color="#999999" type="line" width="1.0"/>
<y:Arrows source="none" target="white_delta"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e2" source="n4" target="n3">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="66.9921875" ty="-30.5">
<y:Point x="534.5" y="134.0"/>
<y:Point x="534.5" y="228.83333333333337"/>
</y:Path>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="diamond" target="none"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e3" source="n7" target="n3">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="42.0" sy="16.995645491803277" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="diamond" target="none"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e4" source="n8" target="n9">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="white_delta"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e5" source="n7" target="n8">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="-7.5" sy="-16.986936475409838" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="none"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e6" source="n10" target="n11">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="white_delta"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e7" source="n12" target="n13">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="white_delta"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="20.341796875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="99.853515625" x="2.953125" y="-30.620361328124986">CRTP inheritance<y:LabelModel>
<y:SmartEdgeLabelModel autoRotationEnabled="false" defaultAngle="0.0" defaultDistance="10.0"/>
</y:LabelModel>
<y:ModelParameter>
<y:SmartEdgeLabelModelParameter angle="6.283185307179586" distance="2.953125" distanceToCenter="false" position="right" ratio="0.3662000636276845" segment="-1"/>
</y:ModelParameter>
<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e8" source="n10" target="n8">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="diamond" target="none"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e9" source="n12" target="n10">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="diamond" target="none"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e10" source="n12" target="n3">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
<y:Point x="930.5" y="353.5"/>
<y:Point x="447.5" y="353.5"/>
</y:Path>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="diamond"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e11" source="n3" target="n14">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="-67.03662109375" sy="0.0" tx="0.0" ty="0.0">
<y:Point x="340.5" y="259.33333333333337"/>
</y:Path>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="plain" target="none"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e12" source="n16" target="n15">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="16.56131583179507" sy="2.666666666666515" tx="-59.68868416820493" ty="59.02248397429355"/>
<y:LineStyle color="#808080" type="line" width="1.0"/>
<y:Arrows source="none" target="white_delta"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e13" source="n17" target="n15">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="-14.220753745508546" sy="-2.333333333333485" tx="59.529246254491454" ty="59.02114901283937"/>
<y:LineStyle color="#808080" type="line" width="1.0"/>
<y:Arrows source="none" target="white_delta"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="20.341796875" horizontalTextPosition="center" iconTextGap="4" modelName="free" modelPosition="anywhere" preferredPlacement="anywhere" ratio="0.5" textColor="#808080" verticalTextPosition="bottom" visible="true" width="99.853515625" x="-108.20599365234375" y="-76.33685302734375">CRTP inheritance<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e14" source="n15" target="n1">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="56.0" sy="31.833333333333258" tx="-75.591796875" ty="-3.5"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="20.341796875" horizontalTextPosition="center" iconTextGap="4" modelName="free" modelPosition="anywhere" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="29.681640625" x="53.37005615234375" y="-20.170908610026117">uses<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e15" source="n1" target="n0">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="none" target="none"/>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e16" source="n1" target="n5">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="-57.17500000000018" sy="-43.5" tx="-30.0" ty="6.25">
<y:Point x="628.5" y="450.83333333333326"/>
</y:Path>
<y:LineStyle color="#000000" type="line" width="1.0"/>
<y:Arrows source="convex" target="none"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="20.341796875" horizontalTextPosition="center" iconTextGap="4" modelName="free" modelPosition="anywhere" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="60.87109375" x="-78.9742431640625" y="-23.504241943359375">generates<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
<edge id="e17" source="n1" target="n21">
<data key="d8"/>
<data key="d10">
<y:PolyLineEdge>
<y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
<y:LineStyle color="#000000" type="dashed" width="1.0"/>
<y:Arrows source="none" target="plain"/>
<y:EdgeLabel alignment="center" configuration="AutoFlippingLabel" distance="2.0" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="20.341796875" horizontalTextPosition="center" iconTextGap="4" modelName="free" modelPosition="anywhere" preferredPlacement="anywhere" ratio="0.5" textColor="#000000" verticalTextPosition="bottom" visible="true" width="23.93359375" x="37.30072021484375" y="-20.504241943359375">use<y:PreferredPlacementDescriptor angle="0.0" angleOffsetOnRightSide="0" angleReference="absolute" angleRotationOnRightSide="co" distance="-1.0" frozen="true" placement="anywhere" side="anywhere" sideReference="relative_to_edge_flow"/>
</y:EdgeLabel>
<y:BendStyle smoothed="false"/>
</y:PolyLineEdge>
</data>
</edge>
</graph>
<data key="d7">
<y:Resources/>
</data>
</graphml>

297
doc/arch.svg Normal file
View File

@ -0,0 +1,297 @@
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="826" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="856" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12px" stroke-dashoffset="0" image-rendering="auto">
<!--Generated by ySVG 2.5-->
<defs id="genericDefs"/>
<g>
<defs id="defs1">
<linearGradient x1="300.5" gradientUnits="userSpaceOnUse" x2="380.5" y1="136.3333" y2="180.3333" id="linearGradient1" spreadMethod="reflect">
<stop stop-opacity="1" stop-color="rgb(232,238,247)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(183,201,227)" offset="100%"/>
</linearGradient>
<linearGradient x1="750.375" gradientUnits="userSpaceOnUse" x2="830.375" y1="506.5" y2="550.5" id="linearGradient2" spreadMethod="reflect">
<stop stop-opacity="1" stop-color="rgb(232,238,247)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(183,201,227)" offset="100%"/>
</linearGradient>
<linearGradient x1="744.125" gradientUnits="userSpaceOnUse" x2="824.125" y1="499.6667" y2="543.6667" id="linearGradient3" spreadMethod="reflect">
<stop stop-opacity="1" stop-color="rgb(232,238,247)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(183,201,227)" offset="100%"/>
</linearGradient>
<linearGradient x1="736.625" gradientUnits="userSpaceOnUse" x2="816.625" y1="490.9167" y2="534.9167" id="linearGradient4" spreadMethod="reflect">
<stop stop-opacity="1" stop-color="rgb(232,238,247)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(183,201,227)" offset="100%"/>
</linearGradient>
<linearGradient x1="943.75" gradientUnits="userSpaceOnUse" x2="1049.75" y1="463.8333" y2="524.8333" id="linearGradient5" spreadMethod="reflect">
<stop stop-opacity="1" stop-color="rgb(232,238,247)" offset="0%"/>
<stop stop-opacity="1" stop-color="rgb(183,201,227)" offset="100%"/>
</linearGradient>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
<path d="M0 0 L826 0 L826 856 L0 856 L0 0 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
<path d="M255 -162 L1081 -162 L1081 694 L255 694 L255 -162 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath3">
<path d="M380 210 L380 308 L514 308 L514 210 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath4">
<path d="M650 79 L650 189 L784 189 L784 79 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath5">
<path d="M533 266 L533 327 L784 327 L784 266 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath6">
<path d="M789 266 L789 327 L923 327 L923 266 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath7">
<path d="M297 79 L297 113 L513 113 L513 79 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath8">
<path d="M331 -29 L331 32 L465 32 L465 -29 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath9">
<path d="M303 -108 L303 -74 L492 -74 L492 -108 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath10">
<path d="M591 -29 L591 32 L725 32 L725 -29 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath11">
<path d="M564 -108 L564 -74 L753 -74 L753 -108 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath12">
<path d="M863 -29 L863 32 L997 32 L997 -29 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath13">
<path d="M805 -108 L805 -74 L1056 -74 L1056 -108 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath14">
<path d="M418 400 L418 518 L561 518 L561 400 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath15">
<path d="M365 618 L365 652 L462 652 L462 618 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath16">
<path d="M515 618 L515 652 L612 652 L612 618 Z"/>
</clipPath>
<clipPath clipPathUnits="userSpaceOnUse" id="clipPath17">
<path d="M-453.5387 -612.8334 L372.4613 -612.8334 L372.4613 243.1667 L-453.5387 243.1667 L-453.5387 -612.8334 Z"/>
</clipPath>
</defs>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(-255,162)" stroke="white">
<rect x="255" width="826" height="856" y="-162" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-255,162)" fill="rgb(153,153,153)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(153,153,153)" stroke-miterlimit="1.45">
<rect fill="none" x="288" width="587" height="200" y="394.3333" clip-path="url(#clipPath2)"/>
</g>
<g font-size="14px" stroke-linecap="butt" transform="matrix(1,0,0,1,-255,162)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" font-weight="bold" stroke-miterlimit="1.45">
<text x="294" xml:space="preserve" y="415.2972" clip-path="url(#clipPath2)" stroke="none">Library</text>
<path fill="none" d="M708.5 417.8333 L844.75 417.8333 L844.75 432.8333 L859.75 432.8333 L859.75 570.8333 L708.5 570.8333 Z" clip-path="url(#clipPath2)"/>
<path fill="none" d="M844.75 417.8333 L844.75 432.8333 L859.75 432.8333 Z" fill-rule="evenodd" clip-path="url(#clipPath2)"/>
<text x="734.1621" xml:space="preserve" font-size="12px" y="436.6595" clip-path="url(#clipPath2)" stroke="none">Helper functions</text>
<text x="745.0459" font-size="12px" y="457.9844" clip-path="url(#clipPath2)" stroke="none" font-weight="normal" xml:space="preserve">in namespace</text>
<text x="747.0088" font-size="12px" y="474.3262" clip-path="url(#clipPath2)" stroke="none" font-weight="normal" xml:space="preserve">JsonReflector</text>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-255,162)" fill="rgb(153,153,153)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(153,153,153)" stroke-miterlimit="1.45">
<rect fill="none" x="288" width="778" height="517" y="-147" clip-path="url(#clipPath2)"/>
</g>
<g font-size="14px" stroke-linecap="butt" transform="matrix(1,0,0,1,-255,162)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" font-weight="bold" stroke-miterlimit="1.45">
<text x="294" xml:space="preserve" y="-126.0361" clip-path="url(#clipPath2)" stroke="none">Code generator</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="380.5" width="134" height="98" y="210.3333" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<rect fill="none" x="380.5" width="134" height="98" y="210.3333" clip-path="url(#clipPath2)"/>
<text x="407.0496" font-size="13px" y="229.2283" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">CodeFactory</text>
<line stroke-linecap="square" clip-path="url(#clipPath3)" fill="none" x1="381" x2="513" y1="238" y2="238" stroke-miterlimit="10"/>
<line stroke-linecap="square" clip-path="url(#clipPath3)" fill="none" x1="381" x2="513" y1="248" y2="248" stroke-miterlimit="10"/>
<text x="385.5" xml:space="preserve" y="265.8631" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none">addDeclaration()</text>
<text x="385.5" xml:space="preserve" y="282.2049" clip-path="url(#clipPath3)" font-family="sans-serif" stroke="none">generate()</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="650" width="134" height="110" y="79" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<rect fill="none" x="650" width="134" height="110" y="79" clip-path="url(#clipPath2)"/>
<text x="680.291" xml:space="preserve" y="96.8262" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none">&lt;&lt;abstract&gt;&gt;</text>
<text x="667.5454" font-size="13px" y="123.2368" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">CodeGenerator</text>
<line stroke-linecap="square" clip-path="url(#clipPath4)" fill="none" x1="651" x2="783" y1="132" y2="132" stroke-miterlimit="10"/>
<line stroke-linecap="square" clip-path="url(#clipPath4)" fill="none" x1="651" x2="783" y1="142" y2="142" stroke-miterlimit="10"/>
<text x="655" xml:space="preserve" y="159.8716" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none">addDeclaration()</text>
<text x="655" xml:space="preserve" y="176.2134" clip-path="url(#clipPath4)" font-family="sans-serif" stroke="none">generate()</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="533" width="251" height="61" y="266" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<rect fill="none" x="533" width="251" height="61" y="266" clip-path="url(#clipPath2)"/>
<text x="553.2305" font-size="13px" y="284.895" clip-path="url(#clipPath5)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve"> JsonSerializationCodeGenerator</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="789.5" width="134" height="61" y="266" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-255,162)" fill="gray" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="gray" stroke-miterlimit="1.45">
<rect fill="none" x="789.5" width="134" height="61" y="266" clip-path="url(#clipPath2)"/>
<text x="795.4292" font-size="13px" y="284.895" clip-path="url(#clipPath6)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">FooCodeGenerator</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="297.5" width="216" height="34" y="79" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-255,162)" fill="blue" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="blue" stroke-miterlimit="1.45">
<rect fill="none" x="297.5" width="216" height="34" y="79" clip-path="url(#clipPath2)"/>
<text x="308.5364" font-size="13px" y="97.895" clip-path="url(#clipPath7)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">clang::tooling::ToolInvocation</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="331" width="134" height="61" y="-29.3333" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<rect fill="none" x="331" width="134" height="61" y="-29.3333" clip-path="url(#clipPath2)"/>
<text x="347.2092" font-size="13px" y="-10.4383" clip-path="url(#clipPath8)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">FrontendAction</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="303.5" width="189" height="34" y="-108" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-255,162)" fill="blue" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="blue" stroke-miterlimit="1.45">
<rect fill="none" x="303.5" width="189" height="34" y="-108" clip-path="url(#clipPath2)"/>
<text x="314.0364" font-size="13px" y="-89.105" clip-path="url(#clipPath9)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">clang::ASTFrontendAction</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="591.5" width="134" height="61" y="-29.3333" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<rect fill="none" x="591.5" width="134" height="61" y="-29.3333" clip-path="url(#clipPath2)"/>
<text x="625.3843" font-size="13px" y="-10.4383" clip-path="url(#clipPath10)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">Consumer</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="564" width="189" height="34" y="-108" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-255,162)" fill="blue" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="blue" stroke-miterlimit="1.45">
<rect fill="none" x="564" width="189" height="34" y="-108" clip-path="url(#clipPath2)"/>
<text x="592.2114" font-size="13px" y="-89.105" clip-path="url(#clipPath11)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">clang::ASTConsumer</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="863.5" width="134" height="61" y="-29.3333" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<rect fill="none" x="863.5" width="134" height="61" y="-29.3333" clip-path="url(#clipPath2)"/>
<text x="909.2798" font-size="13px" y="-10.4383" clip-path="url(#clipPath12)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">Visitor</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="805" width="251" height="34" y="-108" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-255,162)" fill="blue" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="blue" stroke-miterlimit="1.45">
<rect fill="none" x="805" width="251" height="34" y="-108" clip-path="url(#clipPath2)"/>
<text x="816.0042" font-size="13px" y="-89.105" clip-path="url(#clipPath13)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">clang::RecursiveASTVisitor&lt;Visitor&gt;</text>
</g>
<g fill="url(#linearGradient1)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="url(#linearGradient1)">
<path d="M300.5 136.3333 L380.5 136.3333 L380.5 174.8333 Q360.5 163.8333 340.5 174.8333 Q320.5 185.8333 300.5 174.8333 Z" stroke="none" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<path fill="none" d="M300.5 136.3333 L380.5 136.3333 L380.5 174.8333 Q360.5 163.8333 340.5 174.8333 Q320.5 185.8333 300.5 174.8333 Z" clip-path="url(#clipPath2)"/>
<text x="321.1436" y="155.1595" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">main()</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="418.25" width="143" height="118" y="400" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<rect fill="none" x="418.25" width="143" height="118" y="400" clip-path="url(#clipPath2)"/>
<text x="453.041" xml:space="preserve" y="417.8262" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none">&lt;&lt;abstract&gt;&gt;</text>
<text x="427.5906" font-size="13px" y="444.2368" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">JsonSerializable&lt;T&gt;</text>
<line stroke-linecap="square" clip-path="url(#clipPath14)" fill="none" x1="419" x2="560" y1="453" y2="453" stroke-miterlimit="10"/>
<line stroke-linecap="square" clip-path="url(#clipPath14)" fill="none" x1="419" x2="560" y1="463" y2="463" stroke-miterlimit="10"/>
<text x="423.25" xml:space="preserve" y="480.8716" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none">toJson()</text>
<text x="423.25" xml:space="preserve" y="497.2134" clip-path="url(#clipPath14)" font-family="sans-serif" stroke="none">fromJson()</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="365" width="97" height="34" y="618.6667" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-255,162)" fill="gray" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="gray" stroke-miterlimit="1.45">
<rect fill="none" x="365" width="97" height="34" y="618.6667" clip-path="url(#clipPath2)"/>
<text x="382.095" font-size="13px" y="637.5617" clip-path="url(#clipPath15)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">FooStruct</text>
</g>
<g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="white">
<rect x="515" width="97" height="34" y="618.6667" clip-path="url(#clipPath2)" stroke="none"/>
</g>
<g stroke-linecap="butt" transform="matrix(1,0,0,1,-255,162)" fill="gray" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="gray" stroke-miterlimit="1.45">
<rect fill="none" x="515" width="97" height="34" y="618.6667" clip-path="url(#clipPath2)"/>
<text x="532.4663" font-size="13px" y="637.5617" clip-path="url(#clipPath16)" font-family="sans-serif" stroke="none" font-weight="bold" xml:space="preserve">BarStruct</text>
</g>
<g fill="url(#linearGradient2)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="url(#linearGradient2)">
<path d="M750.375 506.5 L830.375 506.5 L830.375 545 Q810.375 534 790.375 545 Q770.375 556 750.375 545 Z" stroke="none" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<path fill="none" d="M750.375 506.5 L830.375 506.5 L830.375 545 Q810.375 534 790.375 545 Q770.375 556 750.375 545 Z" clip-path="url(#clipPath2)"/>
</g>
<g fill="url(#linearGradient3)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="url(#linearGradient3)">
<path d="M744.125 499.6667 L824.125 499.6667 L824.125 538.1667 Q804.125 527.1667 784.125 538.1667 Q764.125 549.1667 744.125 538.1667 Z" stroke="none" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<path fill="none" d="M744.125 499.6667 L824.125 499.6667 L824.125 538.1667 Q804.125 527.1667 784.125 538.1667 Q764.125 549.1667 744.125 538.1667 Z" clip-path="url(#clipPath2)"/>
</g>
<g fill="url(#linearGradient4)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="url(#linearGradient4)">
<path d="M736.625 490.9167 L816.625 490.9167 L816.625 529.4167 Q796.625 518.4167 776.625 529.4167 Q756.625 540.4167 736.625 529.4167 Z" stroke="none" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<path fill="none" d="M736.625 490.9167 L816.625 490.9167 L816.625 529.4167 Q796.625 518.4167 776.625 529.4167 Q756.625 540.4167 736.625 529.4167 Z" clip-path="url(#clipPath2)"/>
<text x="762.5332" xml:space="preserve" y="509.7428" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">pull()</text>
</g>
<g fill="url(#linearGradient5)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke="url(#linearGradient5)">
<path d="M957 496.1633 C943.75 479.0833 957 463.8333 978.73 474.8133 C978.73 463.8333 1014.77 463.8333 1014.77 474.8133 C1036.5 463.8333 1049.75 479.0833 1036.5 492.5033 C1049.75 509.5833 1036.5 524.8333 1020.07 513.8533 C1014.77 524.8333 978.73 524.8333 984.03 513.8533 C957 524.8333 943.75 509.5833 957 496.1633 Z" stroke="none" clip-path="url(#clipPath2)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<path fill="none" d="M957 496.1633 C943.75 479.0833 957 463.8333 978.73 474.8133 C978.73 463.8333 1014.77 463.8333 1014.77 474.8133 C1036.5 463.8333 1049.75 479.0833 1036.5 492.5033 C1049.75 509.5833 1036.5 524.8333 1020.07 513.8533 C1014.77 524.8333 978.73 524.8333 984.03 513.8533 C957 524.8333 943.75 509.5833 957 496.1633 Z" clip-path="url(#clipPath2)"/>
<text x="966.5479" xml:space="preserve" y="498.9886" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">RapidJSON</text>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<path fill="none" d="M643.0328 134 L534.5 134 L534.5 228.8333 L514.5312 228.8333" clip-path="url(#clipPath2)"/>
<path d="M650.0328 134 L643.0328 139 L636.0328 134 L643.0328 129 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M705.5387 450.8333 L628.5 450.8333 L628.5 327.0088" clip-path="url(#clipPath2)"/>
<path fill="none" d="M-11 -5 Q-4 -5 -1 0.25" clip-path="url(#clipPath17)" transform="matrix(1,0,0,1,708.5387,450.8333)"/>
<path fill="none" d="M-11 5 Q-4 5 -1 -0.25" clip-path="url(#clipPath17)" transform="matrix(1,0,0,1,708.5387,450.8333)"/>
</g>
<g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,-255,162)" stroke-linecap="butt">
<text x="631.5645" xml:space="preserve" y="442.1553" clip-path="url(#clipPath2)" stroke="none">generates</text>
<path fill="none" d="M717 266.0363 L717 204.0259" clip-path="url(#clipPath2)"/>
<path fill="white" d="M717 189.0259 L711 205.0259 L723 205.0259 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M717 189.0259 L711 205.0259 L723 205.0259 Z" clip-path="url(#clipPath2)"/>
<path fill="none" d="M856.5 266.0212 L856.5 233 L757.0199 233 L757.0199 204.0606" clip-path="url(#clipPath2)" stroke="rgb(153,153,153)"/>
<path fill="white" d="M757.0199 189.0606 L751.0199 205.0606 L763.0199 205.0606 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M757.0199 189.0606 L751.0199 205.0606 L763.0199 205.0606 Z" clip-path="url(#clipPath2)" stroke="rgb(153,153,153)"/>
<path fill="none" d="M447.5 120.0314 L447.5 210.3636" clip-path="url(#clipPath2)"/>
<path d="M447.5 113.0314 L452.5 120.0314 L447.5 127.0314 L442.5 120.0314 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M398 78.9751 L398 31.6745" clip-path="url(#clipPath2)"/>
<path fill="none" d="M398 -29.3005 L398 -58.9784" clip-path="url(#clipPath2)"/>
<path fill="white" d="M398 -73.9784 L392 -57.9784 L404 -57.9784 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M398 -73.9784 L392 -57.9784 L404 -57.9784 Z" clip-path="url(#clipPath2)"/>
<path fill="none" d="M584.4988 1.1667 L465.0349 1.1667" clip-path="url(#clipPath2)"/>
<path d="M591.4988 1.1667 L584.4988 6.1667 L577.4988 1.1667 L584.4988 -3.8333 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M658.5 -29.3005 L658.5 -58.9784" clip-path="url(#clipPath2)"/>
<path fill="white" d="M658.5 -73.9784 L652.5 -57.9784 L664.5 -57.9784 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M658.5 -73.9784 L652.5 -57.9784 L664.5 -57.9784 Z" clip-path="url(#clipPath2)"/>
<path fill="none" d="M856.5293 1.1667 L725.4999 1.1667" clip-path="url(#clipPath2)"/>
<path d="M863.5293 1.1667 L856.5293 6.1667 L849.5293 1.1667 L856.5293 -3.8333 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M930.5 31.6604 L930.5 353.5 L447.5 353.5 L447.5 315.3018" clip-path="url(#clipPath2)"/>
<path d="M447.5 308.3018 L452.5 315.3018 L447.5 322.3018 L442.5 315.3018 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M930.5 -29.3005 L930.5 -58.9784" clip-path="url(#clipPath2)"/>
<path fill="white" d="M930.5 -73.9784 L924.5 -57.9784 L936.5 -57.9784 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M930.5 -73.9784 L924.5 -57.9784 L936.5 -57.9784 Z" clip-path="url(#clipPath2)"/>
<text x="935.4531" xml:space="preserve" y="-45.0947" clip-path="url(#clipPath2)" stroke="none">CRTP inheritance</text>
<path fill="none" stroke-dasharray="6,2" d="M375.4634 259.3333 L340.5 259.3333 L340.5 174.8543" clip-path="url(#clipPath2)"/>
<path stroke-dasharray="6,2" d="M379.4634 259.3333 L367.4634 253.3333 L379.4634 259.3333 L367.4634 265.3333 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" stroke-miterlimit="10" d="M379.4634 259.3333 L367.4634 253.3333 L379.4634 259.3333 L367.4634 265.3333 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
<path fill="none" stroke-dasharray="6,2" d="M561.2891 490.8333 L703.4973 490.8333" clip-path="url(#clipPath2)"/>
<path stroke-dasharray="6,2" d="M707.4973 490.8333 L695.4973 484.8333 L707.4973 490.8333 L695.4973 496.8333 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" stroke-miterlimit="10" d="M707.4973 490.8333 L695.4973 484.8333 L707.4973 490.8333 L695.4973 496.8333 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
<text x="616.6592" xml:space="preserve" y="485.4886" clip-path="url(#clipPath2)" stroke="none">uses</text>
<path fill="none" d="M430.0613 618.683 L430.0613 533.0225" clip-path="url(#clipPath2)" stroke="gray"/>
<path fill="white" d="M430.0613 518.0225 L424.0613 534.0225 L436.0613 534.0225 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M430.0613 518.0225 L424.0613 534.0225 L436.0613 534.0225 Z" clip-path="url(#clipPath2)" stroke="gray"/>
<path fill="none" d="M549.2792 618.666 L549.2792 533.0212" clip-path="url(#clipPath2)" stroke="gray"/>
<path fill="white" d="M549.2792 518.0212 L543.2792 534.0212 L555.2792 534.0212 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" d="M549.2792 518.0212 L543.2792 534.0212 L555.2792 534.0212 Z" clip-path="url(#clipPath2)" stroke="gray"/>
<text fill="gray" x="443.0732" xml:space="preserve" y="557.1553" clip-path="url(#clipPath2)" stroke="none">CRTP inheritance</text>
<path fill="none" stroke-dasharray="6,2" d="M859.7325 494.3333 L950.705 494.3333" clip-path="url(#clipPath2)"/>
<path stroke-dasharray="6,2" d="M954.705 494.3333 L942.705 488.3333 L954.705 494.3333 L942.705 500.3333 Z" clip-path="url(#clipPath2)" stroke="none"/>
<path fill="none" stroke-miterlimit="10" d="M954.705 494.3333 L942.705 488.3333 L954.705 494.3333 L942.705 500.3333 Z" clip-path="url(#clipPath2)" stroke-linecap="square"/>
<text x="899.0332" xml:space="preserve" y="488.6553" clip-path="url(#clipPath2)" stroke="none">use</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 29 KiB