2002-03-11 Duncan Mak <duncan@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml / XmlNodeListChildren.cs
1 //
2 // System.Xml.XmlNodeList
3 //
4 // Author:
5 //   Kral Ferch <kral_ferch@hotmail.com>
6 //
7 // (C) 2002 Kral Ferch
8 //
9
10 using System;
11 using System.Collections;
12
13 namespace System.Xml
14 {
15         public class XmlNodeListChildren : XmlNodeList
16         {
17                 #region Enumerator
18                 ///////////////////////////////////////////////////////////////////////
19                 //
20                 //      Enumerator
21                 //
22                 ///////////////////////////////////////////////////////////////////////
23                 private class Enumerator : IEnumerator
24                 {
25                         XmlLinkedNode currentChild;
26                         XmlLinkedNode lastChild;
27
28                         internal Enumerator (XmlLinkedNode lastChild)
29                         {
30                                 currentChild = null;
31                                 this.lastChild = lastChild;
32                         }
33
34                         public virtual object Current {
35                                 get {
36                                         return currentChild;
37                                 }
38                         }
39
40                         public virtual bool MoveNext()
41                         {
42                                 bool passedEndOfCollection = Object.ReferenceEquals(currentChild, lastChild);
43
44                                 if (currentChild == null) {
45                                         currentChild = lastChild;
46                                 }
47
48                                 currentChild = currentChild.NextLinkedSibling;
49
50                                 return passedEndOfCollection;
51                         }
52
53                         public virtual void Reset()
54                         {
55                                 currentChild = null;
56                         }
57                 }
58
59                 #endregion
60
61                 #region Fields
62                 ///////////////////////////////////////////////////////////////////////
63                 //
64                 //      Fields
65                 //
66                 ///////////////////////////////////////////////////////////////////////
67
68                 XmlLinkedNode lastChild;
69
70                 #endregion
71
72                 #region Constructors
73                 ///////////////////////////////////////////////////////////////////////
74                 //
75                 //      Constructors
76                 //
77                 ///////////////////////////////////////////////////////////////////////
78
79                 public XmlNodeListChildren(XmlLinkedNode lastChild)
80                 {
81                         this.lastChild = lastChild;
82                 }
83
84                 #endregion
85
86                 #region Properties
87                 ///////////////////////////////////////////////////////////////////////
88                 //
89                 //      Properties
90                 //
91                 ///////////////////////////////////////////////////////////////////////
92
93                 public override int Count {
94                         get {
95                                 int count = 0;
96
97                                 if (lastChild != null) {
98                                         XmlLinkedNode currentChild = lastChild.NextLinkedSibling;
99                                         
100                                         count = 1;
101                                         while (!Object.ReferenceEquals(currentChild, lastChild)) {
102                                                 currentChild = currentChild.NextLinkedSibling;
103                                                 count++;
104                                         }
105                                 }
106
107                                 return count;
108                         }
109                 }
110
111                 #endregion
112
113                 #region Methods
114                 ///////////////////////////////////////////////////////////////////////
115                 //
116                 //      Methods
117                 //
118                 ///////////////////////////////////////////////////////////////////////
119
120                 public override IEnumerator GetEnumerator ()
121                 {
122                         return new Enumerator(lastChild);
123                 }
124
125                 public override XmlNode Item (int index)
126                 {
127                         XmlNode requestedNode = null;
128
129                         // Instead of checking for && index < Count which has to walk
130                         // the whole list to get a count, we'll just keep a count since
131                         // we have to walk the list anyways to get to index.
132                         if ((index >= 0) && (lastChild != null)) {
133                                 XmlLinkedNode currentChild = lastChild.NextLinkedSibling;
134                                 int count = 0;
135
136                                 while ((count < index) && !Object.ReferenceEquals(currentChild, lastChild)) 
137                                 {
138                                         currentChild = currentChild.NextLinkedSibling;
139                                         count++;
140                                 }
141
142                                 if (count == index) {
143                                         requestedNode = currentChild;
144                                 }
145                         }
146
147                         return requestedNode;
148                 }
149
150                 #endregion
151         }
152
153         
154 }