mbunit2 2.4.2.355.20100801

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. data/docs/ASL - Apache Software Foundation License.txt +57 -0
  2. data/docs/MbUnit License.txt +14 -0
  3. data/docs/MbUnit.chm +0 -0
  4. data/docs/Release Notes.txt +7 -0
  5. data/docs/extras/CCNet/How to use MbUnit v2 with CruiseControl.Net.txt +88 -0
  6. data/docs/extras/CCNet/images/Category.png +0 -0
  7. data/docs/extras/CCNet/images/Fixture.png +0 -0
  8. data/docs/extras/CCNet/images/Populator.png +0 -0
  9. data/docs/extras/CCNet/images/Test.png +0 -0
  10. data/docs/extras/CCNet/xsl/MBUnitDetails.xsl +592 -0
  11. data/docs/extras/CCNet/xsl/MBUnitSummary.xsl +266 -0
  12. data/docs/extras/Snippets/AdjacencyGraph.cst +1703 -0
  13. data/docs/extras/Snippets/AssertWrapper.cst +181 -0
  14. data/docs/extras/Snippets/CrudPopulator.cst +377 -0
  15. data/docs/extras/Snippets/DatabasePopulator.cst +386 -0
  16. data/docs/extras/Snippets/DatabasePopulatorCrudTest.cst +177 -0
  17. data/docs/extras/Snippets/Exception.cst +94 -0
  18. data/docs/extras/Snippets/GrammarPopulator.cst +258 -0
  19. data/docs/extras/Snippets/MockObject.cst +296 -0
  20. data/docs/extras/Snippets/RapTierCrudPopulator.cst +444 -0
  21. data/docs/extras/Snippets/SimpleFixture.cst +91 -0
  22. data/docs/extras/Snippets/SqlppCrudPopulator.cst +443 -0
  23. data/docs/extras/Snippets/TestFixture.cst +469 -0
  24. data/docs/extras/Snippets/autorunner.snippet +45 -0
  25. data/docs/extras/Snippets/combinatorialtest.snippet +54 -0
  26. data/docs/extras/Snippets/datafixture.snippet +61 -0
  27. data/docs/extras/Snippets/model.snippet +95 -0
  28. data/docs/extras/Snippets/msbuild.snippet +40 -0
  29. data/docs/extras/Snippets/nant.snippet +34 -0
  30. data/docs/extras/Snippets/perfcounterassert.cst +173 -0
  31. data/docs/extras/Snippets/processtestfixture.snippet +75 -0
  32. data/docs/extras/Snippets/rowtest.snippet +113 -0
  33. data/docs/extras/Snippets/state.snippet +27 -0
  34. data/docs/extras/Snippets/submodel.snippet +32 -0
  35. data/docs/extras/Snippets/test.snippet +28 -0
  36. data/docs/extras/Snippets/testexpectedexception.snippet +32 -0
  37. data/docs/extras/Snippets/testfixture.snippet +68 -0
  38. data/docs/extras/Snippets/testsuitefixture.snippet +48 -0
  39. data/docs/extras/Snippets/typefixture.snippet +74 -0
  40. data/docs/extras/Snippets/typefixturewithproviderfactory.snippet +77 -0
  41. data/docs/extras/Snippets/usingmbunit.snippet +19 -0
  42. data/docs/extras/Templates/VS2005/ItemTemplates/CSharp/Test/MbUnit2.TestFixtureTemplate.CSharp.zip +0 -0
  43. data/docs/extras/Templates/VS2005/ItemTemplates/VisualBasic/Test/MbUnit2.TestFixtureTemplate.VisualBasic.zip +0 -0
  44. data/docs/extras/Templates/VS2005/ProjectTemplates/CSharp/Test/MbUnit2.TestProjectTemplate.CSharp.zip +0 -0
  45. data/docs/extras/Templates/VS2005/ProjectTemplates/VisualBasic/Test/MbUnit2.TestProjectTemplate.VisualBasic.zip +0 -0
  46. data/docs/extras/Templates/VS2008/ItemTemplates/CSharp/Test/MbUnit2.TestFixtureTemplate.CSharp.zip +0 -0
  47. data/docs/extras/Templates/VS2008/ItemTemplates/VisualBasic/Test/MbUnit2.TestFixtureTemplate.VisualBasic.zip +0 -0
  48. data/docs/extras/Templates/VS2008/ProjectTemplates/CSharp/Test/MbUnit2.MvcWebApplicationTestProjectTemplate.CSharp.zip +0 -0
  49. data/docs/extras/Templates/VS2008/ProjectTemplates/CSharp/Test/MbUnit2.TestProjectTemplate.CSharp.zip +0 -0
  50. data/docs/extras/Templates/VS2008/ProjectTemplates/VisualBasic/Test/MbUnit2.MvcWebApplicationTestProjectTemplate.VisualBasic.zip +0 -0
  51. data/docs/extras/Templates/VS2008/ProjectTemplates/VisualBasic/Test/MbUnit2.TestProjectTemplate.VisualBasic.zip +0 -0
  52. data/lib/MbUnit License.txt +14 -0
  53. data/lib/MbUnit.AddIn.dll +0 -0
  54. data/lib/MbUnit.Cons.exe +0 -0
  55. data/lib/MbUnit.Cons.exe.config +12 -0
  56. data/lib/MbUnit.Framework.2.0.dll +0 -0
  57. data/lib/MbUnit.Framework.2.0.pdb +0 -0
  58. data/lib/MbUnit.Framework.2.0.xml +278 -0
  59. data/lib/MbUnit.Framework.dll +0 -0
  60. data/lib/MbUnit.Framework.pdb +0 -0
  61. data/lib/MbUnit.Framework.xml +6929 -0
  62. data/lib/MbUnit.GUI.exe +0 -0
  63. data/lib/MbUnit.GUI.exe.config +14 -0
  64. data/lib/MbUnit.MSBuild.Tasks.dll +0 -0
  65. data/lib/MbUnit.Tasks.dll +0 -0
  66. data/lib/NGraphviz.Helpers.dll +0 -0
  67. data/lib/NGraphviz.Layout.dll +0 -0
  68. data/lib/NGraphviz.dll +0 -0
  69. data/lib/QuickGraph.Algorithms.Graphviz.dll +0 -0
  70. data/lib/QuickGraph.Algorithms.dll +0 -0
  71. data/lib/QuickGraph.Algorithms.pdb +0 -0
  72. data/lib/QuickGraph.Algorithms.xml +2818 -0
  73. data/lib/QuickGraph.dll +0 -0
  74. data/lib/QuickGraph.pdb +0 -0
  75. data/lib/QuickGraph.xml +3126 -0
  76. data/lib/Refly.dll +0 -0
  77. data/lib/Refly.pdb +0 -0
  78. data/lib/Refly.xml +1327 -0
  79. data/lib/TestFu.dll +0 -0
  80. data/lib/TestFu.pdb +0 -0
  81. data/lib/TestFu.xml +1932 -0
  82. data/lib/XsdTidy.exe +0 -0
  83. metadata +163 -0
@@ -0,0 +1,266 @@
1
+ <?xml version="1.0"?>
2
+ <xsl:stylesheet
3
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
4
+
5
+ <xsl:output method="html"/>
6
+
7
+ <xsl:variable name="nunit2.result.list" select="//report-result/counter"/>
8
+ <xsl:variable name="nunit2.testcount" select="sum($nunit2.result.list/@run-count)"/>
9
+ <xsl:variable name="nunit2.failures" select="sum($nunit2.result.list/@failure-count)"/>
10
+ <xsl:variable name="nunit2.notrun" select="sum($nunit2.result.list/@skip-count)"/>
11
+ <xsl:variable name="nunit2.time" select="sum($nunit2.result.list/@duration)"/>
12
+ <xsl:variable name="nunit2.case.list" select="//report-result/assemblies/assembly/namespaces/namespace/fixtures/fixture"/>
13
+ <xsl:variable name="nunit2.suite.list" select="//report-result/assemblies/assembly/namespaces/namespace/fixtures/fixture/runs/run"/>
14
+ <xsl:variable name="nunit2.failure.list" select="//report-result/assemblies/assembly/namespaces/namespace/fixtures/fixture/runs/run/exception"/>
15
+ <xsl:variable name="nunit2.notrun.list" select="$nunit2.case.list//reason"/>
16
+
17
+ <xsl:variable name="testsuite.list" select="/cruisecontrol/build/buildresults//testsuite"/>
18
+ <xsl:variable name="testcase.list" select="$testsuite.list/testcase"/>
19
+ <xsl:variable name="testcase.error.list" select="$testcase.list/error"/>
20
+ <xsl:variable name="testsuite.error.count" select="count($testcase.error.list)"/>
21
+ <xsl:variable name="testcase.failure.list" select="$testcase.list/failure"/>
22
+ <!--<xsl:variable name="totalErrorsAndFailures" select="count($testcase.error.list) + count($testcase.failure.list) + count($nunit2.failure.list)"/>-->
23
+ <xsl:variable name="totalErrorsAndFailures" select="sum($nunit2.result.list/@failure-count)"/>
24
+
25
+ <xsl:template match="/">
26
+ <xsl:if test="//report-result">
27
+ <xsl:apply-templates select="/" mode="emit" />
28
+ </xsl:if>
29
+ </xsl:template>
30
+
31
+ <xsl:template match="/" mode="emit">
32
+ <table class="section-table" cellpadding="2" cellspacing="0" border="0" width="98%">
33
+
34
+ <!-- Unit Tests -->
35
+ <tr>
36
+ <td class="unittests-sectionheader" colspan="2">
37
+ Tests run: <xsl:value-of select="$nunit2.testcount"/>, Failures: <xsl:value-of select="$nunit2.failures"/>, Not run: <xsl:value-of select="$nunit2.notrun"/>, Time: <xsl:value-of select="$nunit2.time"/> seconds
38
+ </td>
39
+ </tr>
40
+
41
+ <xsl:choose>
42
+ <xsl:when test="$nunit2.testcount = 0">
43
+ <tr><td colspan="2" class="unittests-data">No Tests Run</td></tr>
44
+ <tr><td colspan="2" class="unittests-error">This project doesn't have any tests</td></tr>
45
+ </xsl:when>
46
+
47
+ <xsl:when test="$totalErrorsAndFailures = 0">
48
+ <tr><td colspan="2" class="unittests-data">All Tests Passed</td></tr>
49
+ </xsl:when>
50
+ </xsl:choose>
51
+
52
+ <!--<xsl:apply-templates select="$testcase.error.list"/>
53
+ <xsl:apply-templates select="$testcase.failure.list | $nunit2.failure.list"/>
54
+ <xsl:apply-templates select="$nunit2.notrun.list"/>-->
55
+
56
+ <tr><td colspan="2"> </td></tr>
57
+
58
+ <xsl:if test="$totalErrorsAndFailures > 0">
59
+ <tr>
60
+ <td class="unittests-sectionheader" colspan="2">
61
+ Unit Test Failure and Error Details (<xsl:value-of select="$totalErrorsAndFailures"/>)
62
+ </td>
63
+ </tr>
64
+
65
+ <!--<xsl:call-template name="nunit2testdetail">
66
+ <xsl:with-param name="detailnodes" select="$nunit2.suite.list"/>
67
+ </xsl:call-template>-->
68
+
69
+ <xsl:call-template name="nunit2testdetail">
70
+ <xsl:with-param name="detailnodes" select="//report-result/assemblies/assembly//namespaces//namespace/fixtures/fixture/runs/run"/>
71
+ </xsl:call-template>
72
+
73
+
74
+ <tr><td colspan="2"> </td></tr>
75
+ </xsl:if>
76
+
77
+ <xsl:if test="$nunit2.notrun > 0">
78
+ <tr>
79
+ <td class="unittests-sectionheader" colspan="2">
80
+ Warning Details (<xsl:value-of select="$nunit2.notrun"/>)
81
+ </td>
82
+ </tr>
83
+ <!-- (PENDING) Why doesn't this work if set up as variables up top? -->
84
+ <xsl:call-template name="nunit2testdetail">
85
+ <xsl:with-param name="detailnodes" select="//test-suite/results/test-case[.//reason]"/>
86
+ </xsl:call-template>
87
+ <tr><td colspan="2"> </td></tr>
88
+ </xsl:if>
89
+ </table>
90
+ </xsl:template>
91
+
92
+ <!-- UnitTest Errors -->
93
+ <xsl:template match="error">
94
+ <tr>
95
+ <xsl:if test="position() mod 2 = 0">
96
+ <xsl:attribute name="class">unittests-oddrow</xsl:attribute>
97
+ </xsl:if>
98
+ <td class="unittests-data">Error</td>
99
+ <td class="unittests-data"><xsl:value-of select="../@name"/></td>
100
+ </tr>
101
+ </xsl:template>
102
+
103
+ <!-- UnitTest Failures -->
104
+ <xsl:template match="failure">
105
+ <tr>
106
+ <xsl:if test="($testsuite.error.count + position()) mod 2 = 0">
107
+ <xsl:attribute name="class">unittests-oddrow</xsl:attribute>
108
+ </xsl:if>
109
+ <td class="unittests-data">Failure</td>
110
+ <td class="unittests-data"><xsl:value-of select="/source"/></td>
111
+ </tr>
112
+ </xsl:template>
113
+
114
+ <!-- UnitTest Warnings -->
115
+ <xsl:template match="reason">
116
+ <tr>
117
+ <xsl:if test="($totalErrorsAndFailures + position()) mod 2 = 0">
118
+ <xsl:attribute name="class">unittests-oddrow</xsl:attribute>
119
+ </xsl:if>
120
+ <td class="unittests-data">Warning</td>
121
+ <td class="unittests-data"><xsl:value-of select="../@name"/></td>
122
+ </tr>
123
+ </xsl:template>
124
+
125
+ <!-- UnitTest Errors And Failures Detail Template -->
126
+ <xsl:template name="testdetail">
127
+ <xsl:param name="detailnodes"/>
128
+
129
+ <xsl:for-each select="$detailnodes">
130
+
131
+ <xsl:if test="position() > 1">
132
+ <tr><td colspan="2"><hr size="1" width="100%" color="#888888"/></td></tr>
133
+ </xsl:if>
134
+
135
+ <tr><td class="unittests-data">Test:</td><td class="unittests-data"><xsl:value-of select="@name"/></td></tr>
136
+
137
+ <xsl:if test="error">
138
+ <tr><td class="unittests-data">Type:</td><td class="unittests-data"><xsl:value-of select="error/@type"/></td></tr>
139
+ <tr><td class="unittests-data">Message:</td><td class="unittests-data"><xsl:value-of select="error/@message"/></td></tr>
140
+ <tr>
141
+ <td></td>
142
+ <td class="unittests-error">
143
+ <pre><xsl:call-template name="br-replace">
144
+ <xsl:with-param name="word" select="error"/>
145
+ </xsl:call-template></pre>
146
+ </td>
147
+ </tr>
148
+ </xsl:if>
149
+
150
+ <xsl:if test="failure">
151
+ <tr><td class="unittests-data">Type:</td><td class="unittests-data"><xsl:value-of select="failure/@type"/></td></tr>
152
+ <tr><td class="unittests-data">Message:</td><td class="unittests-data"><xsl:value-of select="failure/@message"/></td></tr>
153
+ <tr>
154
+ <td></td>
155
+ <td class="unittests-error">
156
+ <pre><xsl:call-template name="br-replace">
157
+ <xsl:with-param name="word" select="failure"/>
158
+ </xsl:call-template></pre>
159
+ </td>
160
+ </tr>
161
+ </xsl:if>
162
+
163
+ </xsl:for-each>
164
+ </xsl:template>
165
+
166
+ <!-- UnitTest Errors And Failures Detail Template -->
167
+ <xsl:template name="nunit2testdetail">
168
+ <xsl:param name="detailnodes"/>
169
+
170
+ <xsl:for-each select="$detailnodes">
171
+
172
+ <!--<xsl:if test="position() > 1">-->
173
+
174
+ <!--</xsl:if>-->
175
+
176
+ <xsl:if test="exception">
177
+ <tr><td colspan="2"><hr size="1" width="100%" color="#888888"/></td></tr>
178
+ <tr><td class="unittests-data">Test:</td><td class="unittests-data"><xsl:value-of select="@name"/></td></tr>
179
+ <tr><td class="unittests-data">Type:</td><td class="unittests-data">Failure</td></tr>
180
+ <tr><td class="unittests-data">Message:</td><td class="unittests-data"><xsl:value-of select="exception/message"/></td></tr>
181
+ <tr>
182
+ <td></td>
183
+ <td class="unittests-error">
184
+ <pre><xsl:value-of select="exception/stack-trace"/></pre>
185
+ </td>
186
+ </tr>
187
+ </xsl:if>
188
+
189
+ <xsl:if test="reason">
190
+ <tr><td class="unittests-data">Test:</td><td class="unittests-data"><xsl:value-of select="@name"/></td></tr>
191
+ <tr><td class="unittests-data">Type:</td><td class="unittests-data">Warning</td></tr>
192
+ <tr><td class="unittests-data">Message:</td><td class="unittests-data"><xsl:value-of select="reason//message"/></td></tr>
193
+ <tr>
194
+ <td></td>
195
+ <td class="unittests-error">
196
+ <pre><xsl:call-template name="br-replace">
197
+ <xsl:with-param name="word" select="/stack-trace"/>
198
+ </xsl:call-template></pre>
199
+ </td>
200
+ </tr>
201
+ </xsl:if>
202
+
203
+ </xsl:for-each>
204
+ </xsl:template>
205
+
206
+ <!-- UnitTest Errors And Failures Detail Template -->
207
+ <xsl:template name="nunit2testdetail2">
208
+ <xsl:param name="detailnodes"/>
209
+
210
+ <xsl:for-each select="$detailnodes">
211
+
212
+ <!--<xsl:if test="position() > 1">-->
213
+
214
+ <!--</xsl:if>-->
215
+
216
+ <xsl:if test="exception">
217
+ <tr><td colspan="2"><hr size="1" width="100%" color="#888888"/></td></tr>
218
+ <tr><td class="unittests-data">Test:</td><td class="unittests-data"><xsl:value-of select="@name"/></td></tr>
219
+ <tr><td class="unittests-data">Type:</td><td class="unittests-data">Failure</td></tr>
220
+ <tr><td class="unittests-data">Message:</td><td class="unittests-data"><xsl:value-of select="exception/message"/></td></tr>
221
+ <tr>
222
+ <td></td>
223
+ <td class="unittests-error">
224
+ <pre><xsl:value-of select="exception/stack-trace"/></pre>
225
+ </td>
226
+ </tr>
227
+ </xsl:if>
228
+
229
+ <xsl:if test="reason">
230
+ <tr><td class="unittests-data">Test:</td><td class="unittests-data"><xsl:value-of select="@name"/></td></tr>
231
+ <tr><td class="unittests-data">Type:</td><td class="unittests-data">Warning</td></tr>
232
+ <tr><td class="unittests-data">Message:</td><td class="unittests-data"><xsl:value-of select="reason//message"/></td></tr>
233
+ <tr>
234
+ <td></td>
235
+ <td class="unittests-error">
236
+ <pre><xsl:call-template name="br-replace">
237
+ <xsl:with-param name="word" select="/stack-trace"/>
238
+ </xsl:call-template></pre>
239
+ </td>
240
+ </tr>
241
+ </xsl:if>
242
+
243
+ </xsl:for-each>
244
+ </xsl:template>
245
+
246
+ <xsl:template name="br-replace">
247
+ <xsl:param name="word"/>
248
+ <xsl:variable name="cr"><xsl:text>
249
+ <!-- </xsl:text> on next line on purpose to get newline -->
250
+ </xsl:text></xsl:variable>
251
+ <xsl:choose>
252
+ <xsl:when test="contains($word,$cr)">
253
+ <xsl:value-of select="substring-before($word,$cr)"/>
254
+ <br/>
255
+ <xsl:call-template name="br-replace">
256
+ <xsl:with-param name="word" select="substring-after($word,$cr)"/>
257
+ </xsl:call-template>
258
+ </xsl:when>
259
+ <xsl:otherwise>
260
+ <xsl:value-of select="$word"/>
261
+ </xsl:otherwise>
262
+ </xsl:choose>
263
+ </xsl:template>
264
+
265
+ </xsl:stylesheet>
266
+
@@ -0,0 +1,1703 @@
1
+ <%@ CodeTemplate Language="C#" TargetLanguage="Text" Description="Template description here." %>
2
+ <%@ Property Name="VertexType" Type="System.String" Category="Graph" Description="Vertex Type." Optional="False" %>
3
+ <%@ Property Name="EdgeType" Type="System.String" Category="Graph" Description="Edge Type." Optional="False" %>
4
+ <%@ Property Name="ClassName" Type="System.String" Category="Options" Description="Class Name." Optional="False" %>
5
+ <%@ Property Name="TargetNamespace" Type="System.String" Category="Namespaces" Description="Class namespace" %>
6
+ <%@ Property Name="DefaultConstructor" Type="System.Boolean" Category="Options" Description="Generates default constructor" Optional="True" Default="True" %>
7
+ <%@ Property Name="EdgeCollectionBaseType" Type="System.String" Category="Graph" Description="Base type of collection used to store edges" Optional="False" Default="CollectionBase" %>
8
+ <%@ Property Name="VertexEdgesDictionaryBaseType" Type="System.String" Category="Graph" Description="Base type of vertex-edge collection dictionary" Optional="False" Default="DictionaryBase" %>
9
+ <%@ Property Name="Bidirectional" Type="System.Boolean" Category="Graph" Description="Adjacency graph or bi-directional graph" Optional="False" Default="False" %>
10
+ <%@ Property Name="IndexedEdges" Type="System.Boolean" Category="Graph" Description="Edges accessible by index" Optional="False" Default="True" %>
11
+
12
+ // Automatically generated code, dot edit!
13
+
14
+ namespace <%= TargetNamespace %>
15
+ {
16
+ using System;
17
+ using System.Collections;
18
+ using System.Diagnostics;
19
+
20
+ using QuickGraph.Concepts;
21
+ using QuickGraph.Concepts.Traversals;
22
+ using QuickGraph.Concepts.Modifications;
23
+ using QuickGraph.Concepts.MutableTraversals;
24
+ using QuickGraph.Concepts.Predicates;
25
+ using QuickGraph.Concepts.Providers;
26
+ using QuickGraph.Concepts.Collections;
27
+ using QuickGraph.Concepts.Serialization;
28
+ using QuickGraph.Collections;
29
+ using QuickGraph.Exceptions;
30
+ using QuickGraph.Predicates;
31
+
32
+ /// <summary>
33
+ /// A mutable <% if (Bidirectional){%> bidirectional <%}%>
34
+ /// incidence graph implemetation of <%= VertexTypeSee %> and
35
+ /// <%= EdgeTypeSee %>.
36
+ /// </summary>
37
+ public class <%= ClassName %> :
38
+ IMutableGraph
39
+ ,IFilteredVertexAndEdgeListGraph
40
+ ,IFilteredIncidenceGraph
41
+ ,IMutableEdgeListGraph
42
+ ,IEdgeMutableGraph
43
+ ,IMutableIncidenceGraph
44
+ ,IEdgeListAndIncidenceGraph
45
+ ,ISerializableVertexAndEdgeListGraph
46
+ ,IMutableVertexAndEdgeListGraph
47
+ ,IAdjacencyGraph
48
+ ,IImplicitGraph
49
+ <% if (IndexedEdges) {%>
50
+ ,IIndexedVertexListGraph
51
+ <%}%>
52
+ <% if (Bidirectional){%>
53
+ ,IFilteredBidirectionalGraph
54
+ ,IMutableBidirectionalGraph
55
+ ,IBidirectionalVertexAndEdgeListGraph
56
+ ,IMutableBidirectionalVertexAndEdgeListGraph
57
+ <%}%>
58
+ {
59
+ private int version=0;
60
+ private bool allowParallelEdges;
61
+ private <%= VertexProviderType %> vertexProvider;
62
+ private <%= EdgeProviderType %> edgeProvider;
63
+ private <%= VertexEdgesDictionaryType %> vertexOutEdges = new <%= VertexEdgesDictionaryType %>();
64
+ <%if (Bidirectional) {%>
65
+ private <%= VertexEdgesDictionaryType %> vertexInEdges = new <%= VertexEdgesDictionaryType %>();
66
+ <%}%>
67
+
68
+ #region Constructors
69
+ <% if (DefaultConstructor){%>
70
+ /// <summary>
71
+ /// Builds a new empty directed graph with default vertex and edge
72
+ /// provider.
73
+ /// </summary>
74
+ /// <remarks>
75
+ /// </remarks>
76
+ public <%= ClassName %>()
77
+ :this(
78
+ new <%= VertexProviderType %>(),
79
+ new <%= EdgeProviderType %>(),
80
+ true
81
+ )
82
+ {}
83
+
84
+ /// <summary>
85
+ /// Builds a new empty directed graph with default vertex and edge
86
+ /// provider.
87
+ /// </summary>
88
+ /// <param name="allowParallelEdges">true if parallel edges are allowed</param>
89
+ public <%= ClassName %>(bool allowParallelEdges)
90
+ :this(
91
+ new <%= VertexProviderType %>(),
92
+ new <%= EdgeProviderType %>(),
93
+ allowParallelEdges
94
+ )
95
+ {}
96
+ <%}%>
97
+
98
+ /// <summary>
99
+ /// Builds a new empty directed graph with custom providers
100
+ /// </summary>
101
+ /// <param name="allowParallelEdges">true if the graph allows
102
+ /// multiple edges</param>
103
+ /// <param name="edgeProvider">custom edge provider</param>
104
+ /// <param name="vertexProvider">custom vertex provider</param>
105
+ /// <exception cref="ArgumentNullException">
106
+ /// vertexProvider or edgeProvider is a null reference (Nothing in Visual Basic)
107
+ /// </exception>
108
+ public <%= ClassName %>(
109
+ <%= VertexProviderType %> vertexProvider,
110
+ <%= EdgeProviderType %> edgeProvider,
111
+ bool allowParallelEdges
112
+ )
113
+ {
114
+ if (vertexProvider == null)
115
+ throw new ArgumentNullException("vertexProvider");
116
+ if (edgeProvider == null)
117
+ throw new ArgumentNullException("edgeProvider");
118
+
119
+ this.vertexProvider = vertexProvider;
120
+ this.edgeProvider = edgeProvider;
121
+ this.allowParallelEdges = allowParallelEdges;
122
+ }
123
+ #endregion
124
+
125
+ #region IMutableGraph
126
+ /// <summary>
127
+ /// Remove all of the edges and vertices from the graph.
128
+ /// </summary>
129
+ public virtual void Clear()
130
+ {
131
+ this.version++;
132
+ this.vertexOutEdges.Clear();
133
+ <% if (Bidirectional){%>
134
+ this.vertexInEdges.Clear();
135
+ <%}%>
136
+ }
137
+ #endregion
138
+
139
+ #region IGraph
140
+ /// <summary>
141
+ /// Gets a value indicating if the <%= ClassNameSee %>
142
+ /// is directed.
143
+ /// </summary>
144
+ /// <value>
145
+ /// true if the graph is directed, false if undirected.
146
+ /// </value>
147
+ public bool IsDirected
148
+ {
149
+ get
150
+ {
151
+ return true;
152
+ }
153
+ }
154
+
155
+ /// <summary>
156
+ /// Gets a value indicating if the <%= ClassNameSee %> allows parallel edges.
157
+ /// </summary>
158
+ /// <value>
159
+ /// true if the <%= ClassNameSee %> is a multi-graph, false otherwise
160
+ /// </value>
161
+ public bool AllowParallelEdges
162
+ {
163
+ get
164
+ {
165
+ return this.IsDirected && this.allowParallelEdges;
166
+ }
167
+ }
168
+ #endregion
169
+
170
+ #region IVertexMutableGraph
171
+ /// <summary>
172
+ /// Gets the <%= VertexTypeSee %> provider
173
+ /// </summary>
174
+ /// <value>
175
+ /// <%= VertexTypeSee %> provider
176
+ /// </value>
177
+ public <%= VertexProviderType %> VertexProvider
178
+ {
179
+ get
180
+ {
181
+ return this.vertexProvider;
182
+ }
183
+ }
184
+
185
+ IVertexProvider IVertexMutableGraph.VertexProvider
186
+ {
187
+ get
188
+ {
189
+ return this.VertexProvider;
190
+ }
191
+ }
192
+
193
+ /// <summary>
194
+ /// Add a new <%= VertexType %> to the graph and returns it.
195
+ /// </summary>
196
+ /// <returns>
197
+ /// Created vertex
198
+ /// </returns>
199
+ public virtual <%= VertexType %> AddVertex()
200
+ {
201
+ this.version++;
202
+ <%= VertexType %> v = (<%= VertexType %>)this.VertexProvider.ProvideVertex();
203
+ this.vertexOutEdges.Add(v);
204
+ <% if (Bidirectional) {%>
205
+ this.vertexInEdges.Add(v);
206
+ <%}%>
207
+
208
+ return v;
209
+ }
210
+
211
+ IVertex IVertexMutableGraph.AddVertex()
212
+ {
213
+ return this.AddVertex();
214
+ }
215
+
216
+ /// <summary>
217
+ /// Removes the vertex from the graph.
218
+ /// </summary>
219
+ /// <param name="v">vertex to remove</param>
220
+ /// <exception cref="ArgumentNullException">v is null</exception>
221
+ public virtual void RemoveVertex(<%= VertexType %> v)
222
+ {
223
+ if (v == null)
224
+ throw new ArgumentNullException("v");
225
+ if (!ContainsVertex(v))
226
+ throw new VertexNotFoundException("v");
227
+
228
+ this.version++;
229
+ this.ClearVertex(v);
230
+
231
+ // removing vertex
232
+ this.vertexOutEdges.Remove(v);
233
+ <% if (Bidirectional) {%>
234
+ this.vertexInEdges.Remove(v);
235
+ <%}%>
236
+ }
237
+
238
+ void IVertexMutableGraph.RemoveVertex(IVertex v)
239
+ {
240
+ this.RemoveVertex((<%= VertexType %>)v);
241
+ }
242
+ #endregion
243
+
244
+ #region IEdgeMutableGraph
245
+ /// <summary>
246
+ /// Gets the <%= EdgeTypeSee %> provider
247
+ /// </summary>
248
+ /// <value>
249
+ /// <%= EdgeTypeSee %> provider
250
+ /// </value>
251
+ public <%= EdgeProviderType %> EdgeProvider
252
+ {
253
+ get
254
+ {
255
+ return this.edgeProvider;
256
+ }
257
+ }
258
+
259
+ IEdgeProvider IEdgeMutableGraph.EdgeProvider
260
+ {
261
+ get
262
+ {
263
+ return this.EdgeProvider;
264
+ }
265
+ }
266
+
267
+ /// <summary>
268
+ /// Add a new vertex from source to target
269
+ ///
270
+ /// Complexity: 2 search + 1 insertion
271
+ /// </summary>
272
+ /// <param name="source">Source vertex</param>
273
+ /// <param name="target">Target vertex</param>
274
+ /// <returns>Created Edge</returns>
275
+ /// <exception cref="ArgumentNullException">
276
+ /// source or target is a null reference
277
+ /// </exception>
278
+ /// <exception cref="Exception">source or target are not part of the graph</exception>
279
+ public virtual <%= EdgeType %> AddEdge(
280
+ <%= VertexType %> source,
281
+ <%= VertexType %> target
282
+ )
283
+ {
284
+ // look for the vertex in the list
285
+ if (!this.vertexOutEdges.Contains(source))
286
+ throw new VertexNotFoundException("Could not find source vertex");
287
+ if (!this.vertexOutEdges.Contains(target))
288
+ throw new VertexNotFoundException("Could not find target vertex");
289
+
290
+ // if parralel edges are not allowed check if already in the graph
291
+ if (!this.AllowParallelEdges)
292
+ {
293
+ if (ContainsEdge(source,target))
294
+ throw new Exception("Parallel edge not allowed");
295
+ }
296
+
297
+ this.version++;
298
+ // create edge
299
+ <%= EdgeType %> e = (<%= EdgeType %>)this.EdgeProvider.ProvideEdge(source,target);
300
+ this.vertexOutEdges[source].Add(e);
301
+ <% if (Bidirectional) {%>
302
+ this.vertexInEdges[target].Add(e);
303
+ <%}%>
304
+
305
+ return e;
306
+ }
307
+
308
+ IEdge IEdgeMutableGraph.AddEdge(
309
+ IVertex source,
310
+ IVertex target
311
+ )
312
+ {
313
+ return this.AddEdge((<%= VertexType %>)source,(<%= VertexType %>)target);
314
+ }
315
+
316
+
317
+ /// <summary>
318
+ /// Remove all edges to and from vertex u from the graph.
319
+ /// </summary>
320
+ /// <param name="v"></param>
321
+ public virtual void ClearVertex(<%= VertexType %> v)
322
+ {
323
+ if (v == null)
324
+ throw new ArgumentNullException("vertex");
325
+
326
+ this.version++;
327
+ // removing edges touching v
328
+ this.RemoveEdgeIf(new IsAdjacentEdgePredicate(v));
329
+
330
+ // removing edges
331
+ this.vertexOutEdges[v].Clear();
332
+ <% if (Bidirectional) {%>
333
+ this.vertexInEdges[v].Clear();
334
+ <%}%>
335
+ }
336
+
337
+ void IEdgeMutableGraph.ClearVertex(IVertex v)
338
+ {
339
+ this.ClearVertex((<%= VertexType %>)v);
340
+ }
341
+
342
+
343
+ /// <summary>
344
+ /// Removes an edge from the graph.
345
+ ///
346
+ /// Complexity: 2 edges removed from the vertex edge list + 1 edge
347
+ /// removed from the edge list.
348
+ /// </summary>
349
+ /// <param name="e">edge to remove</param>
350
+ /// <exception cref="ArgumentNullException">
351
+ /// e is a null reference (Nothing in Visual Basic)
352
+ /// </exception>
353
+ /// <exception cref="EdgeNotFoundException">
354
+ /// <paramref name="e"/> is not part of the graph
355
+ /// </exception>
356
+ public virtual void RemoveEdge(<%= EdgeType %> e)
357
+ {
358
+ if (e == null)
359
+ throw new ArgumentNullException("e");
360
+ if (!this.ContainsEdge(e))
361
+ throw new EdgeNotFoundException("e");
362
+
363
+ this.version++;
364
+ // removing edge from vertices
365
+ <%= VertexType %> source= (<%= VertexType %>)e.Source;
366
+ <%= EdgeCollectionType %> outEdges = this.vertexOutEdges[source];
367
+ if (outEdges==null)
368
+ throw new VertexNotFoundException(source.ToString());
369
+ outEdges.Remove(e);
370
+ <% if (Bidirectional) {%>
371
+ <%= VertexType %> target= (<%= VertexType %>)e.Target;
372
+ <%= EdgeCollectionType %> inEdges = this.vertexInEdges[target];
373
+ if (inEdges==null)
374
+ throw new VertexNotFoundException(target.ToString());
375
+ inEdges.Remove(e);
376
+ <%}%>
377
+ }
378
+
379
+ void IEdgeMutableGraph.RemoveEdge(IEdge e)
380
+ {
381
+ this.RemoveEdge((<%= EdgeType %>)e);
382
+ }
383
+
384
+ /// <summary>
385
+ /// Remove the edge (u,v) from the graph.
386
+ /// If the graph allows parallel edges this remove all occurrences of
387
+ /// (u,v).
388
+ /// </summary>
389
+ /// <param name="u">source vertex</param>
390
+ /// <param name="v">target vertex</param>
391
+ public virtual void RemoveEdge(<%= VertexType %> u, <%= VertexType %> v)
392
+ {
393
+ if (u == null)
394
+ throw new ArgumentNullException("u");
395
+ if (v == null)
396
+ throw new ArgumentNullException("v");
397
+
398
+ this.version++;
399
+ // getting out-edges
400
+ <%= EdgeCollectionType %> outEdges = this.vertexOutEdges[u];
401
+
402
+ // marking edges to remove
403
+ <%= EdgeCollectionType %> removedEdges = new <%= EdgeCollectionType %>();
404
+ foreach(<%= EdgeType %> e in outEdges)
405
+ {
406
+ if (e.Target == v)
407
+ removedEdges.Add(e);
408
+ }
409
+ //removing out-edges
410
+ foreach(<%= EdgeType %> e in removedEdges)
411
+ outEdges.Remove(e);
412
+
413
+ <% if (Bidirectional) {%>
414
+ removedEdges.Clear();
415
+ <%= EdgeCollectionType %> inEdges = this.vertexInEdges[v];
416
+ foreach(<%= EdgeType %> e in inEdges)
417
+ {
418
+ if (e.Source == u)
419
+ removedEdges.Add(e);
420
+ }
421
+ //removing in-edges
422
+ foreach(<%= EdgeType %> e in removedEdges)
423
+ inEdges.Remove(e);
424
+ <%}%>
425
+ }
426
+
427
+ void IEdgeMutableGraph.RemoveEdge(IVertex u, IVertex v)
428
+ {
429
+ this.RemoveEdge((<%= VertexType %>) u, (<%= VertexType %>) v);
430
+ }
431
+
432
+ #endregion
433
+
434
+ #region ISerializableVertexListGraph
435
+ /// <summary>
436
+ /// Add a new vertex to the graph and returns it.
437
+ /// </summary>
438
+ /// <returns>Create vertex</returns>
439
+ internal virtual void AddVertex(<%= VertexType %> v)
440
+ {
441
+ if (v==null)
442
+ throw new ArgumentNullException("vertex");
443
+ if (this.vertexOutEdges.Contains(v))
444
+ throw new ArgumentException("vertex already in graph");
445
+
446
+ this.version++;
447
+ this.VertexProvider.UpdateVertex(v);
448
+ this.vertexOutEdges.Add(v);
449
+ <% if (Bidirectional) {%>
450
+ this.vertexInEdges.Add(v);
451
+ <%}%>
452
+ }
453
+
454
+ void ISerializableVertexListGraph.AddVertex(IVertex v)
455
+ {
456
+ this.AddVertex((<%= VertexType %>) v);
457
+ }
458
+ #endregion
459
+
460
+ #region ISerializableEdgeListGraph
461
+ /// <summary>
462
+ /// Used for serialization. Not for private use.
463
+ /// </summary>
464
+ /// <param name="e">edge to add.</param>
465
+ internal virtual void AddEdge(<%= EdgeType %> e)
466
+ {
467
+ if (e==null)
468
+ throw new ArgumentNullException("vertex");
469
+ if (e.GetType().IsAssignableFrom(EdgeProvider.EdgeType))
470
+ throw new ArgumentNullException("vertex type not valid");
471
+
472
+ <%= VertexType %> source= (<%= VertexType %>)e.Source;
473
+ if (!this.vertexOutEdges.Contains(source))
474
+ throw new VertexNotFoundException(source.ToString());
475
+ <%= VertexType %> target= (<%= VertexType %>)e.Target;
476
+ if (!this.vertexOutEdges.Contains(target))
477
+ throw new VertexNotFoundException(target.ToString());
478
+
479
+ // if parralel edges are not allowed check if already in the graph
480
+ if (!this.AllowParallelEdges)
481
+ {
482
+ if (ContainsEdge(source,target))
483
+ throw new ArgumentException("graph does not allow duplicate edges");
484
+ }
485
+ // create edge
486
+ this.EdgeProvider.UpdateEdge(e);
487
+ this.vertexOutEdges[source].Add(e);
488
+ <% if (Bidirectional) {%>
489
+ this.vertexInEdges[target].Add(e);
490
+ <%}%>
491
+ }
492
+
493
+ void ISerializableEdgeListGraph.AddEdge(IEdge e)
494
+ {
495
+ this.AddEdge((<%= EdgeType %>)e);
496
+ }
497
+ #endregion
498
+
499
+ #region IIncidenceGraph
500
+ /// <summary>
501
+ /// Gets a value indicating if the set of out-edges is empty
502
+ /// </summary>
503
+ /// <remarks>
504
+ /// <para>
505
+ /// Usually faster that calling <see cref="OutDegree"/>.
506
+ /// </para>
507
+ /// </remarks>
508
+ /// <value>
509
+ /// true if the out-edge set is empty, false otherwise.
510
+ /// </value>
511
+ /// <exception cref="ArgumentNullException">
512
+ /// v is a null reference (Nothing in Visual Basic)
513
+ /// </exception>
514
+ /// <exception cref="VertexNotFoundException">
515
+ /// v is not part of the graph.
516
+ /// </exception>
517
+ public bool OutEdgesEmpty(<%= VertexType %> v)
518
+ {
519
+ if (v == null)
520
+ throw new ArgumentNullException("v");
521
+ <%= EdgeCollectionType %> edges = this.vertexOutEdges[v];
522
+ if (edges==null)
523
+ throw new VertexNotFoundException(v.ToString());
524
+ return edges.Count==0;
525
+ }
526
+
527
+ bool IImplicitGraph.OutEdgesEmpty(IVertex v)
528
+ {
529
+ return this.OutEdgesEmpty((<%= VertexType %>)v);
530
+ }
531
+
532
+ /// <summary>
533
+ /// Returns the number of out-degree edges of v
534
+ /// </summary>
535
+ /// <param name="v">vertex</param>
536
+ /// <returns>number of out-edges of the <%= VertexTypeSee %> v</returns>
537
+ /// <exception cref="ArgumentNullException">
538
+ /// v is a null reference (Nothing in Visual Basic)
539
+ /// </exception>
540
+ /// <exception cref="VertexNotFoundException">
541
+ /// v is not part of the graph.
542
+ /// </exception>
543
+ public int OutDegree(<%= VertexType %> v)
544
+ {
545
+ if (v == null)
546
+ throw new ArgumentNullException("v");
547
+ <%= EdgeCollectionType %> edges = this.vertexOutEdges[v];
548
+ if (edges==null)
549
+ throw new VertexNotFoundException(v.ToString());
550
+ return edges.Count;
551
+ }
552
+
553
+ int IImplicitGraph.OutDegree(IVertex v)
554
+ {
555
+ return this.OutDegree((<%= VertexType %>)v);
556
+ }
557
+
558
+ /// <summary>
559
+ /// Returns an iterable collection over the edge connected to v
560
+ /// </summary>
561
+ /// <param name="v"></param>
562
+ /// <returns>out-edges of v</returns>
563
+ /// <exception cref="ArgumentNullException">
564
+ /// v is a null reference.
565
+ /// </exception>
566
+ /// <exception cref="VertexNotFoundException">
567
+ /// v is not part of the graph.
568
+ /// </exception>
569
+ <% if(IndexedEdges){%>
570
+ public IEdgeCollection OutEdges(<%= VertexType %> v)
571
+ <% }else{%>
572
+ public IEdgeEnumerable OutEdges(<%= VertexType %> v)
573
+ <%}%>
574
+ {
575
+ if (v == null)
576
+ throw new ArgumentNullException("v");
577
+
578
+ <%= EdgeCollectionType %> edges = this.vertexOutEdges[v];
579
+ if (edges==null)
580
+ throw new VertexNotFoundException(v.ToString());
581
+ return edges;
582
+ }
583
+
584
+ IEdgeEnumerable IImplicitGraph.OutEdges(IVertex v)
585
+ {
586
+ return this.OutEdges((<%= VertexType %>)v);
587
+ }
588
+
589
+ /// <summary>
590
+ /// Test is an edge (u,v) is part of the graph
591
+ /// </summary>
592
+ /// <param name="u">source vertex</param>
593
+ /// <param name="v">target vertex</param>
594
+ /// <returns>true if part of the graph</returns>
595
+ public bool ContainsEdge(<%= VertexType %> u,<%= VertexType %> v)
596
+ {
597
+ // try to find the edge
598
+ foreach(<%= EdgeType %> e in this.OutEdges(u))
599
+ {
600
+ if (e.Target == v)
601
+ return true;
602
+ }
603
+ return false;
604
+ }
605
+
606
+ bool IIncidenceGraph.ContainsEdge(IVertex u, IVertex v)
607
+ {
608
+ return this.ContainsEdge((<%= VertexType %>)u,(<%= VertexType %>)v);
609
+ }
610
+ #endregion
611
+
612
+ #region IFilteredIncidenceGraph
613
+ /// <summary>
614
+ /// Returns the first out-edge that matches the predicate
615
+ /// </summary>
616
+ /// <param name="v"></param>
617
+ /// <param name="ep">Edge predicate</param>
618
+ /// <returns>null if not found, otherwize the first Edge that
619
+ /// matches the predicate.</returns>
620
+ /// <exception cref="ArgumentNullException">v or ep is null</exception>
621
+ public <%= EdgeType %> SelectSingleOutEdge(<%= VertexType %> v, IEdgePredicate ep)
622
+ {
623
+ if (ep==null)
624
+ throw new ArgumentNullException("ep");
625
+
626
+ foreach(<%= EdgeType %> e in this.SelectOutEdges(v,ep))
627
+ return e;
628
+
629
+ return null;
630
+ }
631
+
632
+ IEdge IFilteredIncidenceGraph.SelectSingleOutEdge(IVertex v, IEdgePredicate ep)
633
+ {
634
+ return this.SelectSingleOutEdge((<%= VertexType %>)v,ep);
635
+ }
636
+
637
+ /// <summary>
638
+ /// Returns the collection of out-edges that matches the predicate
639
+ /// </summary>
640
+ /// <param name="v"></param>
641
+ /// <param name="ep">Edge predicate</param>
642
+ /// <returns>enumerable colleciton of vertices that matches the
643
+ /// criteron</returns>
644
+ /// <exception cref="ArgumentNullException">v or ep is null</exception>
645
+ public IEdgeEnumerable SelectOutEdges(<%= VertexType %> v, IEdgePredicate ep)
646
+ {
647
+ if (v==null)
648
+ throw new ArgumentNullException("v");
649
+ if (ep==null)
650
+ throw new ArgumentNullException("ep");
651
+
652
+ return new FilteredEdgeEnumerable(this.OutEdges(v),ep);
653
+ }
654
+
655
+ IEdgeEnumerable IFilteredIncidenceGraph.SelectOutEdges(IVertex v, IEdgePredicate ep)
656
+ {
657
+ return this.SelectOutEdges((<%= VertexType %>)v,ep);
658
+ }
659
+
660
+
661
+ /// <summary>
662
+ /// Remove all the edges from graph g for which the predicate pred
663
+ /// returns true.
664
+ /// </summary>
665
+ /// <param name="pred">edge predicate</param>
666
+ public virtual void RemoveEdgeIf(IEdgePredicate pred)
667
+ {
668
+ if (pred == null)
669
+ throw new ArgumentNullException("predicate");
670
+
671
+ // marking edge for removal
672
+ <%= EdgeCollectionType %> removedEdges = new <%= EdgeCollectionType %>();
673
+ foreach(<%= EdgeType %> e in Edges)
674
+ {
675
+ if (pred.Test(e))
676
+ removedEdges.Add(e);
677
+ }
678
+
679
+ // removing edges
680
+ foreach(<%= EdgeType %> e in removedEdges)
681
+ this.RemoveEdge(e);
682
+ }
683
+ #endregion
684
+
685
+ #region IMutableIncidenceGraph
686
+ /// <summary>
687
+ /// Remove all the out-edges of vertex u for which the predicate pred
688
+ /// returns true.
689
+ /// </summary>
690
+ /// <param name="u">vertex</param>
691
+ /// <param name="pred">edge predicate</param>
692
+ public virtual void RemoveOutEdgeIf(<%= VertexType %> u, IEdgePredicate pred)
693
+ {
694
+ if (u==null)
695
+ throw new ArgumentNullException("u");
696
+ if (pred == null)
697
+ throw new ArgumentNullException("pred");
698
+
699
+ <%= EdgeCollectionType %> edges = this.vertexOutEdges[u];
700
+ <%= EdgeCollectionType %> removedEdges = new <%= EdgeCollectionType %>();
701
+ foreach(<%= EdgeType %> e in edges)
702
+ {
703
+ if (pred.Test(e))
704
+ removedEdges.Add(e);
705
+ }
706
+
707
+ foreach(<%= EdgeType %> e in removedEdges)
708
+ this.RemoveEdge(e);
709
+ }
710
+
711
+ void IMutableIncidenceGraph.RemoveOutEdgeIf(IVertex u, IEdgePredicate pred)
712
+ {
713
+ this.RemoveOutEdgeIf((<%= VertexType %>)u,pred);
714
+ }
715
+ #endregion
716
+
717
+ <% if (IndexedEdges){%>
718
+ #region IIndexedIncidenceGraph
719
+ IEdgeCollection IIndexedIncidenceGraph.OutEdges(IVertex v)
720
+ {
721
+ return this.OutEdges((<%= VertexType %>)v);
722
+ }
723
+ #endregion
724
+ <%}%>
725
+
726
+ #region IVertexListGraph
727
+ /// <summary>
728
+ /// Gets a value indicating if the vertex set is empty
729
+ /// </summary>
730
+ /// <para>
731
+ /// Usually faster (O(1)) that calling <c>VertexCount</c>.
732
+ /// </para>
733
+ /// <value>
734
+ /// true if the vertex set is empty, false otherwise.
735
+ /// </value>
736
+ public bool VerticesEmpty
737
+ {
738
+ get
739
+ {
740
+ return this.vertexOutEdges.Count==0;
741
+ }
742
+ }
743
+
744
+ /// <summary>
745
+ /// Gets the number of vertices
746
+ /// </summary>
747
+ /// <value>
748
+ /// Number of vertices in the graph
749
+ /// </value>
750
+ public int VerticesCount
751
+ {
752
+ get
753
+ {
754
+ return this.vertexOutEdges.Count;
755
+ }
756
+ }
757
+
758
+ /// <summary>
759
+ /// Enumerable collection of vertices.
760
+ /// </summary>
761
+ public IVertexEnumerable Vertices
762
+ {
763
+ get
764
+ {
765
+ return this.vertexOutEdges.Vertices;
766
+ }
767
+ }
768
+
769
+ /// <summary>
770
+ /// Tests if a <%= VertexTypeSee %> is part of the graph
771
+ /// </summary>
772
+ /// <param name="v">Vertex to test</param>
773
+ /// <returns>true if is part of the graph, false otherwize</returns>
774
+ public bool ContainsVertex(<%= VertexType %> v)
775
+ {
776
+ return this.vertexOutEdges.Contains(v);
777
+ }
778
+
779
+ bool IVertexListGraph.ContainsVertex(IVertex v)
780
+ {
781
+ return this.ContainsVertex((<%= VertexType %>)v);
782
+ }
783
+ #endregion
784
+
785
+ #region IFilteredVertexListGraph
786
+ /// <summary>
787
+ /// Returns the first <%= VertexTypeSee %> that matches the predicate
788
+ /// </summary>
789
+ /// <param name="vp">vertex predicate</param>
790
+ /// <returns>null if not found, otherwize the first vertex that
791
+ /// matches the predicate.</returns>
792
+ /// <exception cref="ArgumentNullException">vp is null</exception>
793
+ public <%= VertexType %> SelectSingleVertex(IVertexPredicate vp)
794
+ {
795
+ if (vp == null)
796
+ throw new ArgumentNullException("vertex predicate");
797
+
798
+ foreach(<%= VertexType %> v in this.SelectVertices(vp))
799
+ return v;
800
+ return null;
801
+ }
802
+
803
+ IVertex IFilteredVertexListGraph.SelectSingleVertex(IVertexPredicate vp)
804
+ {
805
+ return this.SelectSingleVertex(vp);
806
+ }
807
+
808
+ /// <summary>
809
+ /// Returns the collection of vertices that matches the predicate
810
+ /// </summary>
811
+ /// <param name="vp">vertex predicate</param>
812
+ /// <returns>enumerable colleciton of vertices that matches the
813
+ /// criteron</returns>
814
+ /// <exception cref="ArgumentNullException">vp is null</exception>
815
+ public IVertexEnumerable SelectVertices(IVertexPredicate vp)
816
+ {
817
+ if (vp == null)
818
+ throw new ArgumentNullException("vertex predicate");
819
+
820
+ return new FilteredVertexEnumerable(Vertices,vp);
821
+ }
822
+ #endregion
823
+
824
+ #region EdgeListGraph
825
+ /// <summary>
826
+ /// Gets a value indicating if the vertex set is empty
827
+ /// </summary>
828
+ /// <remarks>
829
+ /// <para>
830
+ /// Usually faster that calling <see cref="EdgesCount"/>.
831
+ /// </para>
832
+ /// </remarks>
833
+ /// <value>
834
+ /// true if the vertex set is empty, false otherwise.
835
+ /// </value>
836
+ public bool EdgesEmpty
837
+ {
838
+ get
839
+ {
840
+ return this.EdgesCount==0;
841
+ }
842
+ }
843
+
844
+ /// <summary>
845
+ /// Gets the edge count
846
+ /// </summary>
847
+ /// <remarks>
848
+ /// Edges count
849
+ /// </remarks>
850
+ public int EdgesCount
851
+ {
852
+ get
853
+ {
854
+ int n = 0;
855
+ foreach(DictionaryEntry d in vertexOutEdges)
856
+ {
857
+ n+=((<%= EdgeCollectionType %>)d.Value).Count;
858
+ }
859
+ return n;
860
+ }
861
+ }
862
+
863
+ /// <summary>
864
+ /// Enumerable collection of edges.
865
+ /// </summary>
866
+ public IEdgeEnumerable Edges
867
+ {
868
+ get
869
+ {
870
+ return this.vertexOutEdges.Edges;
871
+ }
872
+ }
873
+
874
+ /// <summary>
875
+ /// Tests if a (<%= EdgeTypeSee %>) is part of the graph
876
+ /// </summary>
877
+ /// <param name="e">Edge to test</param>
878
+ /// <returns>true if is part of the graph, false otherwize</returns>
879
+ public bool ContainsEdge(<%= EdgeType %> e)
880
+ {
881
+ foreach(DictionaryEntry di in this.vertexOutEdges)
882
+ {
883
+ <%= EdgeCollectionType %> es = (<%= EdgeCollectionType %>)di.Value;
884
+ if (es.Contains(e))
885
+ return true;
886
+ }
887
+ return false;
888
+ }
889
+
890
+ bool IEdgeListGraph.ContainsEdge(IEdge e)
891
+ {
892
+ return this.ContainsEdge((<%= EdgeType %>)e);
893
+ }
894
+ #endregion
895
+
896
+ #region IFileteredEdgeListGraph
897
+ /// <summary>
898
+ /// Returns the first Edge that matches the predicate
899
+ /// </summary>
900
+ /// <param name="ep">Edge predicate</param>
901
+ /// <returns>null if not found, otherwize the first Edge that
902
+ /// matches the predicate.</returns>
903
+ /// <exception cref="ArgumentNullException">ep is null</exception>
904
+ public <%= EdgeType %> SelectSingleEdge(IEdgePredicate ep)
905
+ {
906
+ if (ep == null)
907
+ throw new ArgumentNullException("edge predicate");
908
+ foreach(<%= EdgeType %> e in this.SelectEdges(ep))
909
+ return e;
910
+ return null;
911
+ }
912
+
913
+ IEdge IFilteredEdgeListGraph.SelectSingleEdge(IEdgePredicate ep)
914
+ {
915
+ return this.SelectSingleEdge(ep);
916
+ }
917
+
918
+ /// <summary>
919
+ /// Returns the collection of edges that matches the predicate
920
+ /// </summary>
921
+ /// <param name="ep">Edge predicate</param>
922
+ /// <returns>enumerable colleciton of vertices that matches the
923
+ /// criteron</returns>
924
+ /// <exception cref="ArgumentNullException">ep is null</exception>
925
+ public IEdgeEnumerable SelectEdges(IEdgePredicate ep)
926
+ {
927
+ if (ep == null)
928
+ throw new ArgumentNullException("edge predicate");
929
+
930
+ return new FilteredEdgeEnumerable(Edges,ep);
931
+ }
932
+ #endregion
933
+
934
+ #region IAdjacencyGraph
935
+ /// <summary>
936
+ /// Gets an enumerable collection of adjacent vertices
937
+ /// </summary>
938
+ /// <param name="v"></param>
939
+ /// <returns>Enumerable collection of adjacent vertices</returns>
940
+ public IVertexEnumerable AdjacentVertices(<%= VertexType %> v)
941
+ {
942
+ return new TargetVertexEnumerable(this.OutEdges(v));
943
+ }
944
+
945
+ IVertexEnumerable IAdjacencyGraph.AdjacentVertices(IVertex v)
946
+ {
947
+ return AdjacentVertices((<%= VertexType %>)v);
948
+ }
949
+ #endregion
950
+
951
+ <%if (Bidirectional){%>
952
+ #region IBidirectionalGraph
953
+ /// <summary>
954
+ /// Gets a value indicating if the set of in-edges is empty
955
+ /// </summary>
956
+ /// <remarks>
957
+ /// <para>
958
+ /// Usually faster that calling <see cref="InDegree"/>.
959
+ /// </para>
960
+ /// </remarks>
961
+ /// <value>
962
+ /// true if the in-edge set is empty, false otherwise.
963
+ /// </value>
964
+ /// <exception cref="ArgumentNullException">
965
+ /// v is a null reference (Nothing in Visual Basic)
966
+ /// </exception>
967
+ /// <exception cref="VertexNotFoundException">
968
+ /// <paramref name="v"/> is not part of the graph.
969
+ /// </exception>
970
+ public bool InEdgesEmpty(<%= VertexType%> v)
971
+ {
972
+ if (v==null)
973
+ throw new ArgumentNullException("v");
974
+ <%= EdgeCollectionType %> edges = this.vertexInEdges[v];
975
+ if (edges==null)
976
+ throw new VertexNotFoundException("v");
977
+ return edges.Count==0;
978
+ }
979
+
980
+ bool IBidirectionalGraph.InEdgesEmpty(IVertex v)
981
+ {
982
+ return this.InEdgesEmpty((<%= VertexType %>)v);
983
+ }
984
+
985
+ /// <summary>
986
+ /// Returns the number of in-degree edges of v
987
+ /// </summary>
988
+ /// <param name="v"></param>
989
+ /// <returns>number of in-edges of the vertex v</returns>
990
+ /// <exception cref="ArgumentNullException">
991
+ /// v is a null reference (Nothing in Visual Basic)
992
+ /// </exception>
993
+ /// <exception cref="VertexNotFoundException">
994
+ /// <paramref name="v"/> is not part of the graph.
995
+ /// </exception>
996
+ public int InDegree(<%= VertexType %> v)
997
+ {
998
+ if (v == null)
999
+ throw new ArgumentNullException("v");
1000
+ <%= EdgeCollectionType %> edges = this.vertexInEdges[v];
1001
+ if (edges==null)
1002
+ throw new VertexNotFoundException("v");
1003
+ return edges.Count;
1004
+ }
1005
+ int IBidirectionalGraph.InDegree(IVertex v)
1006
+ {
1007
+ return this.InDegree((<%= VertexType %>)v);
1008
+ }
1009
+
1010
+ /// <summary>
1011
+ /// Returns an iterable collection over the in-edge connected to v
1012
+ /// </summary>
1013
+ /// <param name="v"></param>
1014
+ /// <returns>in-edges of v</returns>
1015
+ /// <exception cref="ArgumentNullException">
1016
+ /// v is a null reference (Nothing in Visual Basic)
1017
+ /// </exception>
1018
+ /// <exception cref="VertexNotFoundException">
1019
+ /// <paramref name="v"/> is not part of the graph.
1020
+ /// </exception>
1021
+ <%if (IndexedEdges){%>
1022
+ public IEdgeCollection InEdges(<%= VertexType %> v)
1023
+ <%}else{%>
1024
+ public IEdgeEnumerable InEdges((<%= VertexType %>) v)
1025
+ <%}%>
1026
+ {
1027
+ if (v == null)
1028
+ throw new ArgumentNullException("v");
1029
+ <%= EdgeCollectionType %> edges = this.vertexInEdges[v];
1030
+ if (edges==null)
1031
+ throw new VertexNotFoundException(v.ToString());
1032
+ return edges;
1033
+ }
1034
+
1035
+ /// <summary>
1036
+ /// Incidence graph implementation
1037
+ /// </summary>
1038
+ IEdgeEnumerable IBidirectionalGraph.InEdges(IVertex v)
1039
+ {
1040
+ return this.InEdges((<%= VertexType %>)v);
1041
+ }
1042
+
1043
+ /// <summary>
1044
+ /// Gets a value indicating if the set of edges connected to v is empty
1045
+ /// </summary>
1046
+ /// <remarks>
1047
+ /// <para>
1048
+ /// Usually faster that calling <see cref="Degree"/>.
1049
+ /// </para>
1050
+ /// </remarks>
1051
+ /// <value>
1052
+ /// true if the adjacent edge set is empty, false otherwise.
1053
+ /// </value>
1054
+ /// <exception cref="ArgumentNullException">v is a null reference</exception>
1055
+ public bool AdjacentEdgesEmpty(<%= VertexType %> v)
1056
+ {
1057
+ if (v==null)
1058
+ throw new ArgumentNullException("v");
1059
+ return this.OutEdgesEmpty(v) && this.InEdgesEmpty(v);
1060
+ }
1061
+
1062
+ bool IBidirectionalGraph.AdjacentEdgesEmpty(IVertex v)
1063
+ {
1064
+ return this.AdjacentEdgesEmpty((<%= VertexType %>)v);
1065
+ }
1066
+
1067
+ /// <summary>
1068
+ /// Returns the number of in-edges plus out-edges.
1069
+ /// </summary>
1070
+ /// <param name="v"></param>
1071
+ /// <returns></returns>
1072
+ public int Degree(<%= VertexType %> v)
1073
+ {
1074
+ if (v == null)
1075
+ throw new ArgumentNullException("v");
1076
+ <%= EdgeCollectionType %> outEdges = this.vertexOutEdges[v];
1077
+ if (outEdges==null)
1078
+ throw new VertexNotFoundException("v");
1079
+ <%= EdgeCollectionType %> inEdges = this.vertexInEdges[v];
1080
+ Debug.Assert(inEdges!=null);
1081
+ return outEdges.Count + inEdges.Count;
1082
+ }
1083
+
1084
+ int IBidirectionalGraph.Degree(IVertex v)
1085
+ {
1086
+ return this.Degree((<%= VertexType %>)v);
1087
+ }
1088
+ #endregion
1089
+
1090
+ #region IFilteredBidirectionalGraph
1091
+ /// <summary>
1092
+ /// Returns the first in-edge that matches the predicate
1093
+ /// </summary>
1094
+ /// <param name="v"></param>
1095
+ /// <param name="ep">Edge predicate</param>
1096
+ /// <returns>null if not found, otherwize the first Edge that
1097
+ /// matches the predicate.</returns>
1098
+ /// <exception cref="ArgumentNullException">v or ep is null</exception>
1099
+ public <%= EdgeType %> SelectSingleInEdge(<%= VertexType %> v, IEdgePredicate ep)
1100
+ {
1101
+ if (ep==null)
1102
+ throw new ArgumentNullException("edge predicate");
1103
+
1104
+ foreach(<%= EdgeType %> e in this.SelectInEdges(v,ep))
1105
+ return e;
1106
+
1107
+ return null;
1108
+ }
1109
+ IEdge IFilteredBidirectionalGraph.SelectSingleInEdge(IVertex v, IEdgePredicate ep)
1110
+ {
1111
+ return this.SelectSingleInEdge((<%= VertexType %>)v, ep);
1112
+ }
1113
+
1114
+ /// <summary>
1115
+ /// Returns the collection of in-edges that matches the predicate
1116
+ /// </summary>
1117
+ /// <param name="v"></param>
1118
+ /// <param name="ep">Edge predicate</param>
1119
+ /// <returns>enumerable colleciton of vertices that matches the
1120
+ /// criteron</returns>
1121
+ /// <exception cref="ArgumentNullException">v or ep is null</exception>
1122
+ public IEdgeEnumerable SelectInEdges(<%= VertexType %> v, IEdgePredicate ep)
1123
+ {
1124
+ if (v==null)
1125
+ throw new ArgumentNullException("vertex");
1126
+ if (ep==null)
1127
+ throw new ArgumentNullException("edge predicate");
1128
+
1129
+ return new FilteredEdgeEnumerable(this.InEdges(v),ep);
1130
+ }
1131
+
1132
+ /// <summary>
1133
+ ///
1134
+ /// </summary>
1135
+ /// <param name="v"></param>
1136
+ /// <param name="ep"></param>
1137
+ /// <returns></returns>
1138
+ IEdgeEnumerable IFilteredBidirectionalGraph.SelectInEdges(IVertex v, IEdgePredicate ep)
1139
+ {
1140
+ return this.SelectInEdges((<%= VertexType %>)v,ep);
1141
+ }
1142
+ #endregion
1143
+
1144
+ #region IMutableBidirectionalGraph
1145
+
1146
+ /// <summary>
1147
+ /// Remove all the out-edges of vertex u for which the predicate pred
1148
+ /// returns true.
1149
+ /// </summary>
1150
+ /// <param name="u">vertex</param>
1151
+ /// <param name="pred">edge predicate</param>
1152
+ public void RemoveInEdgeIf(<%= VertexType %> u, IEdgePredicate pred)
1153
+ {
1154
+ if (u==null)
1155
+ throw new ArgumentNullException("vertex u");
1156
+ if (pred == null)
1157
+ throw new ArgumentNullException("predicate");
1158
+
1159
+ <%= EdgeCollectionType %> edges = this.vertexInEdges[u];
1160
+ <%= EdgeCollectionType %> removedEdges = new <%= EdgeCollectionType %>();
1161
+ foreach(<%= EdgeType %> e in edges)
1162
+ {
1163
+ if (pred.Test(e))
1164
+ removedEdges.Add(e);
1165
+ }
1166
+
1167
+ foreach(<%= EdgeType %> e in removedEdges)
1168
+ this.RemoveEdge(e);
1169
+ }
1170
+
1171
+ void IMutableBidirectionalGraph.RemoveInEdgeIf(IVertex u, IEdgePredicate pred)
1172
+ {
1173
+ this.RemoveInEdgeIf((<%= VertexType %>)u,pred);
1174
+ }
1175
+
1176
+ #endregion
1177
+ <%}%>
1178
+
1179
+ #region <%= EdgeCollectionType %>
1180
+ private class <%= EdgeCollectionType %> :
1181
+ <%= EdgeCollectionBaseType %>
1182
+ <% if (IndexedEdges){%>
1183
+ ,IEdgeCollection
1184
+ <%}else{%>
1185
+ ,IEdgeEnumerable
1186
+ <%}%>
1187
+ {
1188
+ /// <summary>
1189
+ /// Initializes a new empty instance of the
1190
+ /// <see cref="<%= EdgeCollectionType %>"/> class.
1191
+ /// </summary>
1192
+ public <%= EdgeCollectionType %>()
1193
+ {}
1194
+
1195
+ /// <summary>
1196
+ /// Adds an instance of type <%= EdgeTypeSee %> to the end of this
1197
+ /// <see cref="<%= EdgeCollectionType %>"/>.
1198
+ /// </summary>
1199
+ /// <param name="value">
1200
+ /// The Edge to be added to the end of this EdgeCollection.
1201
+ /// </param>
1202
+ internal void Add(<%= EdgeType %> value)
1203
+ {
1204
+ this.List.Add(value);
1205
+ }
1206
+
1207
+ /// <summary>
1208
+ /// Removes the first occurrence of a specific Edge from this EdgeCollection.
1209
+ /// </summary>
1210
+ /// <param name="value">
1211
+ /// The Edge value to remove from this EdgeCollection.
1212
+ /// </param>
1213
+ internal void Remove(IEdge value)
1214
+ {
1215
+ this.List.Remove(value);
1216
+ }
1217
+
1218
+ <% if (IndexedEdges){%>
1219
+ #region IEdgeCollection
1220
+ /// <summary>
1221
+ /// Determines whether a specfic <%= EdgeTypeSee %> value is in this EdgeCollection.
1222
+ /// </summary>
1223
+ /// <param name="value">
1224
+ /// edge value to locate in this <see cref="<%= EdgeCollectionType %>"/>.
1225
+ /// </param>
1226
+ /// <returns>
1227
+ /// true if value is found in this collection;
1228
+ /// false otherwise.
1229
+ /// </returns>
1230
+ public bool Contains(<%= EdgeType %> value)
1231
+ {
1232
+ return this.List.Contains(value);
1233
+ }
1234
+
1235
+ bool IEdgeCollection.Contains(IEdge value)
1236
+ {
1237
+ return this.Contains((<%= EdgeType %>)value);
1238
+ }
1239
+
1240
+ /// <summary>
1241
+ /// Gets or sets the Edge at the given index in this EdgeCollection.
1242
+ /// </summary>
1243
+ public <%= EdgeType %> this[int index]
1244
+ {
1245
+ get
1246
+ {
1247
+ return (<%= EdgeType %>)this.List[index];
1248
+ }
1249
+ set
1250
+ {
1251
+ this.List[index] = value;
1252
+ }
1253
+ }
1254
+
1255
+ IEdge IEdgeCollection.this[int index]
1256
+ {
1257
+ get
1258
+ {
1259
+ return this[index];
1260
+ }
1261
+ set
1262
+ {
1263
+ this[index] = (<%= EdgeType %>)value;
1264
+ }
1265
+ }
1266
+ #endregion
1267
+ <%}%>
1268
+
1269
+ #region IEdgeEnumerable
1270
+ /// <summary>
1271
+ /// Returns an enumerator that can iterate through the elements of this EdgeCollection.
1272
+ /// </summary>
1273
+ /// <returns>
1274
+ /// An object that implements System.Collections.IEnumerator.
1275
+ /// </returns>
1276
+ public new IEdgeEnumerator GetEnumerator()
1277
+ {
1278
+ return new <%= EdgeEnumeratorType %>(this);
1279
+ }
1280
+
1281
+ private class <%= EdgeEnumeratorType %> : IEdgeEnumerator
1282
+ {
1283
+ private IEnumerator wrapped;
1284
+
1285
+ /// <summary>
1286
+ /// Create a new enumerator on the collection
1287
+ /// </summary>
1288
+ /// <param name="collection">collection to enumerate</param>
1289
+ public <%= EdgeEnumeratorType %>(<%= EdgeCollectionType %> collection)
1290
+ {
1291
+ this.wrapped = ((System.Collections.CollectionBase)collection).GetEnumerator();
1292
+ }
1293
+
1294
+ /// <summary>
1295
+ /// The current element.
1296
+ /// </summary>
1297
+ public <%= EdgeType %> Current
1298
+ {
1299
+ get
1300
+ {
1301
+ return (<%= EdgeType %>)this.wrapped.Current;
1302
+ }
1303
+ }
1304
+ #region IEdgeEnumerator
1305
+ IEdge IEdgeEnumerator.Current
1306
+ {
1307
+ get
1308
+ {
1309
+ return this.Current;
1310
+ }
1311
+ }
1312
+ #endregion
1313
+ #region IEnumerator
1314
+ object IEnumerator.Current
1315
+ {
1316
+ get
1317
+ {
1318
+ return this.Current;
1319
+ }
1320
+ }
1321
+
1322
+ /// <summary>
1323
+ /// Moves cursor to next element.
1324
+ /// </summary>
1325
+ /// <returns>true if current is valid, false otherwize</returns>
1326
+ public bool MoveNext()
1327
+ {
1328
+ return this.wrapped.MoveNext();
1329
+ }
1330
+
1331
+ /// <summary>
1332
+ /// Resets the cursor to the position before the first element.
1333
+ /// </summary>
1334
+ public void Reset()
1335
+ {
1336
+ this.wrapped.Reset();
1337
+ }
1338
+ #endregion
1339
+ }
1340
+ #endregion
1341
+ }
1342
+ #endregion
1343
+
1344
+ #region <%= VertexEdgesDictionaryType %>
1345
+ private class <%= VertexEdgesDictionaryType %> :
1346
+ <%= VertexEdgesDictionaryBaseType %>
1347
+ {
1348
+ public <%= VertexEdgesDictionaryType %>()
1349
+ {}
1350
+
1351
+ public void Add(<%= VertexType %> u)
1352
+ {
1353
+ Debug.Assert(u!=null);
1354
+ this.Dictionary.Add(u, new <%= EdgeCollectionType %>() );
1355
+ }
1356
+
1357
+ public bool Contains(<%= VertexType %> key)
1358
+ {
1359
+ return this.Dictionary.Contains(key);
1360
+ }
1361
+
1362
+ public void Remove(<%= VertexType %> key)
1363
+ {
1364
+ this.Dictionary.Remove(key);
1365
+ }
1366
+
1367
+ public IVertexEnumerable Vertices
1368
+ {
1369
+ get
1370
+ {
1371
+ return new <%= VertexEdgesVertexEnumerableType %>(this.Dictionary.Keys);
1372
+ }
1373
+ }
1374
+
1375
+ public IEdgeEnumerable Edges
1376
+ {
1377
+ get
1378
+ {
1379
+ return new <%= VertexEdgesEdgeEnumerableType %>(this.Dictionary.Values);
1380
+ }
1381
+ }
1382
+
1383
+ public <%= EdgeCollectionType %> this[<%= VertexType %> v]
1384
+ {
1385
+ get
1386
+ {
1387
+ return (<%= EdgeCollectionType %>)this.Dictionary[v];
1388
+ }
1389
+ }
1390
+
1391
+ #region Vertex Enumerable/Enumerator
1392
+ private class <%= VertexEdgesVertexEnumerableType %> :
1393
+ IVertexEnumerable
1394
+ {
1395
+ private IEnumerable en;
1396
+ public <%= VertexEdgesVertexEnumerableType %>(IEnumerable en)
1397
+ {
1398
+ Debug.Assert(en!=null);
1399
+ this.en = en;
1400
+ }
1401
+ public IVertexEnumerator GetEnumerator()
1402
+ {
1403
+ return new <%= VertexEdgesVertexEnumeratorType %>(en);
1404
+ }
1405
+ IEnumerator IEnumerable.GetEnumerator()
1406
+ {
1407
+ return this.GetEnumerator();
1408
+ }
1409
+
1410
+ #region Enumerator
1411
+ private class <%= VertexEdgesVertexEnumeratorType %> :
1412
+ IVertexEnumerator
1413
+ {
1414
+ private IEnumerator en;
1415
+ public <%= VertexEdgesVertexEnumeratorType %>(IEnumerable col)
1416
+ {
1417
+ Debug.Assert(col!=null);
1418
+ this.en = col.GetEnumerator();
1419
+ }
1420
+
1421
+ public <%= VertexType %> Current
1422
+ {
1423
+ get
1424
+ {
1425
+ return (<%= VertexType %>)this.en.Current;
1426
+ }
1427
+ }
1428
+ IVertex IVertexEnumerator.Current
1429
+ {
1430
+ get
1431
+ {
1432
+ return this.Current;
1433
+ }
1434
+ }
1435
+ Object IEnumerator.Current
1436
+ {
1437
+ get
1438
+ {
1439
+ return this.Current;
1440
+ }
1441
+ }
1442
+ public void Reset()
1443
+ {
1444
+ this.en.Reset();
1445
+ }
1446
+ public bool MoveNext()
1447
+ {
1448
+ return this.en.MoveNext();
1449
+ }
1450
+ }
1451
+ #endregion
1452
+ }
1453
+ #endregion
1454
+
1455
+ #region Edge Enumerable/Enumerator
1456
+ private class <%= VertexEdgesEdgeEnumerableType %> :
1457
+ IEdgeEnumerable
1458
+ {
1459
+ private IEnumerable en;
1460
+ public <%= VertexEdgesEdgeEnumerableType %>(IEnumerable en)
1461
+ {
1462
+ Debug.Assert(en!=null);
1463
+ this.en = en;
1464
+ }
1465
+ public IEdgeEnumerator GetEnumerator()
1466
+ {
1467
+ return new <%= VertexEdgesEdgeEnumeratorType %>(en);
1468
+ }
1469
+ IEnumerator IEnumerable.GetEnumerator()
1470
+ {
1471
+ return this.GetEnumerator();
1472
+ }
1473
+
1474
+ #region Edge Enumerator
1475
+ private class <%= VertexEdgesEdgeEnumeratorType %> :
1476
+ IEdgeEnumerator
1477
+ {
1478
+ private IEnumerator edges;
1479
+ private IEdgeEnumerator edge;
1480
+
1481
+ public <%= VertexEdgesEdgeEnumeratorType %>(IEnumerable en)
1482
+ {
1483
+ Debug.Assert(en!=null);
1484
+ this.edges = en.GetEnumerator();
1485
+ this.edge = null;
1486
+ }
1487
+
1488
+ public void Reset()
1489
+ {
1490
+ this.edges.Reset();
1491
+ this.edge=null;
1492
+ }
1493
+
1494
+ public bool MoveNext()
1495
+ {
1496
+ // check if first time.
1497
+ if (this.edge == null)
1498
+ {
1499
+ if (!moveNextVertex())
1500
+ return false;
1501
+ }
1502
+
1503
+ // getting next valid entry
1504
+ do
1505
+ {
1506
+ // try getting edge in the current out edge list
1507
+ if (edge.MoveNext())
1508
+ return true;
1509
+
1510
+ // move to the next outedge list
1511
+ if (!moveNextVertex())
1512
+ return false;
1513
+ }
1514
+ while(true);
1515
+ }
1516
+
1517
+ public <%= EdgeType %> Current
1518
+ {
1519
+ get
1520
+ {
1521
+ if (this.edge == null)
1522
+ throw new InvalidOperationException();
1523
+ return (<%= EdgeType %>)this.edge.Current;
1524
+ }
1525
+ }
1526
+
1527
+ IEdge IEdgeEnumerator.Current
1528
+ {
1529
+ get
1530
+ {
1531
+ return this.Current;
1532
+ }
1533
+ }
1534
+
1535
+ Object IEnumerator.Current
1536
+ {
1537
+ get
1538
+ {
1539
+ return this.Current;
1540
+ }
1541
+ }
1542
+
1543
+ private bool moveNextVertex()
1544
+ {
1545
+ // check if empty vertex set
1546
+ if (!this.edges.MoveNext())
1547
+ {
1548
+ this.edges=null;
1549
+ return false;
1550
+ }
1551
+
1552
+ // getting enumerator
1553
+ this.edge = ((<%= EdgeCollectionType %>)this.edges.Current).GetEnumerator();
1554
+ return true;
1555
+ }
1556
+ }
1557
+ #endregion
1558
+ }
1559
+ #endregion
1560
+ }
1561
+ #endregion
1562
+
1563
+ #region <%= VertexEnumeratorType %>
1564
+ private class <%= VertexEnumeratorType %> : IVertexEnumerator
1565
+ {
1566
+ private IEnumerator en;
1567
+ public <%= VertexEnumeratorType %>(IEnumerable enumerable)
1568
+ {
1569
+ Debug.Assert(en!=null);
1570
+ this.en = enumerable.GetEnumerator();
1571
+ }
1572
+
1573
+ public void Reset()
1574
+ {
1575
+ this.en.Reset();
1576
+ }
1577
+ public bool MoveNext()
1578
+ {
1579
+ return this.en.MoveNext();
1580
+ }
1581
+ public <%= VertexType %> Current
1582
+ {
1583
+ get
1584
+ {
1585
+ return (<%= VertexType %>)this.en.Current;
1586
+ }
1587
+ }
1588
+ IVertex IVertexEnumerator.Current
1589
+ {
1590
+ get
1591
+ {
1592
+ return this.Current;
1593
+ }
1594
+ }
1595
+ Object IEnumerator.Current
1596
+ {
1597
+ get
1598
+ {
1599
+ return this.en.Current;
1600
+ }
1601
+ }
1602
+ }
1603
+ #endregion
1604
+ }
1605
+ }
1606
+
1607
+ <script runat="template">
1608
+ private String seeTag(string type)
1609
+ {
1610
+ return String.Format("<see cref=\"{0}\"/>",type);
1611
+ }
1612
+ public String ClassNameSee
1613
+ {
1614
+ get
1615
+ {
1616
+ return seeTag(this.ClassName);
1617
+ }
1618
+ }
1619
+ public String VertexTypeSee
1620
+ {
1621
+ get
1622
+ {
1623
+ return seeTag(this.VertexType);
1624
+ }
1625
+ }
1626
+ public String EdgeTypeSee
1627
+ {
1628
+ get
1629
+ {
1630
+ return seeTag(this.EdgeType);
1631
+ }
1632
+ }
1633
+ public string VertexProviderType
1634
+ {
1635
+ get
1636
+ {
1637
+ return this.VertexType + "Provider";
1638
+ }
1639
+ }
1640
+ public string EdgeProviderType
1641
+ {
1642
+ get
1643
+ {
1644
+ return this.EdgeType + "Provider";
1645
+ }
1646
+ }
1647
+ public string VertexEnumeratorType
1648
+ {
1649
+ get
1650
+ {
1651
+ return this.VertexType + "Enumerator";
1652
+ }
1653
+ }
1654
+ public string EdgeEnumeratorType
1655
+ {
1656
+ get
1657
+ {
1658
+ return this.EdgeType + "Enumerator";
1659
+ }
1660
+ }
1661
+ public string EdgeCollectionType
1662
+ {
1663
+ get
1664
+ {
1665
+ return this.EdgeType + "Collection";
1666
+ }
1667
+ }
1668
+ public string VertexEdgesDictionaryType
1669
+ {
1670
+ get
1671
+ {
1672
+ return this.VertexType + this.EdgeCollectionType + "Dictionary";
1673
+ }
1674
+ }
1675
+ public string VertexEdgesVertexEnumerableType
1676
+ {
1677
+ get
1678
+ {
1679
+ return this.VertexType + this.EdgeCollectionType + "VertexEnumerable";
1680
+ }
1681
+ }
1682
+ public string VertexEdgesVertexEnumeratorType
1683
+ {
1684
+ get
1685
+ {
1686
+ return this.VertexType + this.EdgeCollectionType + "VertexEnumerator";
1687
+ }
1688
+ }
1689
+ public string VertexEdgesEdgeEnumerableType
1690
+ {
1691
+ get
1692
+ {
1693
+ return this.VertexType + this.EdgeCollectionType + "EdgeEnumerable";
1694
+ }
1695
+ }
1696
+ public string VertexEdgesEdgeEnumeratorType
1697
+ {
1698
+ get
1699
+ {
1700
+ return this.VertexType + this.EdgeCollectionType + "EdgeEnumerator";
1701
+ }
1702
+ }
1703
+ </script>