24 #ifndef __IDXMLDOMGraph__ 25 #define __IDXMLDOMGraph__ 27 #include "boost/graph/graph_traits.hpp" 28 #include "boost/iterator/iterator_facade.hpp" 29 #include "boost/iterator_adaptors.hpp" 30 #include "DepthFirstTreeIterator.h" 32 #include "IIDXMLDOMNode.h" 37 struct IDXMLDOMIteratorPolicies :
public boost::default_iterator_policies
39 IDXMLDOMIteratorPolicies() {}
41 template <
class IteratorAdaptor>
42 typename IteratorAdaptor::reference dereference(
const IteratorAdaptor& x)
const 45 template <
class IteratorAdaptor>
46 void increment(IteratorAdaptor& x) { advance(x, 1); }
51 template <
class IteratorAdaptor,
class DifferenceType>
52 void advance(IteratorAdaptor& x, DifferenceType n);
56 template <
class IteratorAdaptor,
class DifferenceType>
57 void IDXMLDOMIteratorPolicies::advance(IteratorAdaptor& x, DifferenceType n)
59 ASSERT_MSG(n == 1,
"IDXMLDOMIteratorPolicies::advance: only single step forward iterator for now");
60 ASSERT_MSG(x.base(),
"IDXMLDOMIteratorPolicies::advance: cannot advance end iterator");
63 x.base() = x.base()->GetNextSibling();
72 boost::forward_traversal_tag,
87 friend class boost::iterator_core_access;
94 bool equal(
IDXMLDOMIterator const& other)
const {
return fData == other.fData; }
100 ASSERT_MSG(n > 0,
"IDXMLDOMIterator::advance: only positive increments are supported right now");
101 ASSERT_MSG(fData,
"IDXMLDOMIterator::advance: cannot advance end iterator");
102 while (--n >= 0 && fData) {
104 ASSERT_MSG(n == 0 || fData,
"IDXMLDOMIterator::advance: attempt advance past end iterator");
114 struct IDXMLDOMInEdgeIteratorPolicies :
public boost::default_iterator_policies
116 IDXMLDOMInEdgeIteratorPolicies() {}
118 template <
class IteratorAdaptor>
119 typename IteratorAdaptor::reference dereference(
const IteratorAdaptor& x)
const 122 template <
class IteratorAdaptor>
123 void increment(IteratorAdaptor& x) { advance(x, 1); }
128 template <
class IteratorAdaptor,
class DifferenceType>
129 void advance(IteratorAdaptor& x, DifferenceType n);
133 template <
class IteratorAdaptor,
class DifferenceType>
134 void IDXMLDOMInEdgeIteratorPolicies::advance(IteratorAdaptor& x, DifferenceType n)
142 IDXMLDOMInEdgeIterator,
144 boost::forward_traversal_tag,
159 friend class boost::iterator_core_access;
170 void advance(int32 n)
172 ASSERT_MSG(n == 1,
"IDXMLDOMInEdgeIterator::advance: can only do 1 advance");
173 ASSERT_MSG(fData,
"IDXMLDOMInEdgeIterator::advance: cannot advance end iterator");
184 fRootVertex(rootVertex)
187 IIDXMLDOMNode *RootVertex(
void)
const {
return fRootVertex; }
200 typedef void adjacency_iterator;
203 typedef void edge_iterator;
204 typedef void vertex_iterator;
205 typedef int32 degree_size_type;
206 typedef int32 vertices_size_type;
207 typedef int32 edges_size_type;
208 typedef boost::directed_tag directed_category;
209 typedef boost::disallow_parallel_edge_tag edge_parallel_category;
210 typedef boost::bidirectional_graph_tag traversal_category;
215 typedef boost::graph_traits<IDXMLDOMGraph>::out_edge_iterator IDXMLDOMOutEdgeIterator;
218 std::pair<IDXMLDOMOutEdgeIterator, IDXMLDOMOutEdgeIterator>
219 out_edges(boost::graph_traits<IDXMLDOMGraph>::vertex_descriptor v,
const IDXMLDOMGraph& g);
221 boost::graph_traits<IDXMLDOMGraph>::degree_size_type
224 boost::graph_traits<IDXMLDOMGraph>::vertex_descriptor
225 source(
const boost::graph_traits<IDXMLDOMGraph>::edge_descriptor& e,
const IDXMLDOMGraph& g);
227 boost::graph_traits<IDXMLDOMGraph>::vertex_descriptor
228 target(
const boost::graph_traits<IDXMLDOMGraph>::edge_descriptor& e,
const IDXMLDOMGraph& g);
230 std::pair<boost::graph_traits<IDXMLDOMGraph>::in_edge_iterator, boost::graph_traits<IDXMLDOMGraph>::in_edge_iterator>
231 in_edges(boost::graph_traits<IDXMLDOMGraph>::vertex_descriptor v,
const IDXMLDOMGraph& g);
242 IDXMLDOMOutEdgeIterator
243 incoming_edge(boost::graph_traits<IDXMLDOMGraph>::vertex_descriptor v,
const IDXMLDOMGraph& g);
247 struct IDXMLDOMStructureOnlyIteratorPolicies :
public boost::default_iterator_policies
249 IDXMLDOMStructureOnlyIteratorPolicies() {}
251 template <
class IteratorAdaptor>
252 typename IteratorAdaptor::reference dereference(
const IteratorAdaptor& x)
const 255 template <
class IteratorAdaptor>
256 void increment(IteratorAdaptor& x) { advance(x, 1); }
261 template <
class IteratorAdaptor,
class DifferenceType>
262 void advance(IteratorAdaptor& x, DifferenceType n);
266 template <
class IteratorAdaptor,
class DifferenceType>
267 void IDXMLDOMStructureOnlyIteratorPolicies::advance(IteratorAdaptor& x, DifferenceType n)
269 ASSERT_MSG(n == 1,
"IDXMLDOMStructureOnlyIteratorPolicies::advance: only single step forward iterator for now");
270 ASSERT_MSG(x.base(),
"IDXMLDOMStructureOnlyIteratorPolicies::advance: cannot advance end iterator");
273 x.base() = x.base()->GetNextSibling();
277 x.base() = x.base()->GetNextSibling();
284 IDXMLDOMStructureOnlyIterator,
285 boost::graph_traits<IDXMLDOMGraph>::edge_descriptor,
286 boost::forward_traversal_tag,
287 boost::graph_traits<IDXMLDOMGraph>::edge_descriptor,
301 friend class boost::iterator_core_access;
310 boost::graph_traits<IDXMLDOMGraph>::edge_descriptor& dereference()
const {
return const_cast<boost::graph_traits<IDXMLDOMGraph>::edge_descriptor&
>(fData); }
312 void advance(int32 n)
314 ASSERT_MSG(n > 0,
"IDXMLDOMStructureOnlyIterator::advance: only positive increments are supported right now");
315 ASSERT_MSG(fData,
"IDXMLDOMStructureOnlyIterator::advance: cannot advance end iterator");
316 while (--n >= 0 && fData) {
317 fData = fData->GetNextSibling();
321 fData = fData->GetNextSibling();
324 ASSERT_MSG(n == 0 || fData,
"IDXMLDOMStructureOnlyIterator::advance: attempt to advance end iterator");
329 boost::graph_traits<IDXMLDOMGraph>::edge_descriptor fData;
334 bool operator()(boost::graph_traits<IDXMLDOMGraph>::vertex_descriptor v,
const IDXMLDOMGraph&)
const 342 IDXMLDOMDepthFirstTreeIterator,
343 boost::graph_traits<IDXMLDOMGraph>::edge_descriptor,
344 boost::forward_traversal_tag,
345 boost::graph_traits<IDXMLDOMGraph>::edge_descriptor,
359 friend class boost::iterator_core_access;
368 boost::graph_traits<IDXMLDOMGraph>::edge_descriptor& dereference()
const {
return const_cast<boost::graph_traits<IDXMLDOMGraph>::edge_descriptor&
>(fData); }
370 void advance(int32 n)
372 ASSERT_FAIL(
"IDXMLDOMDepthFirstTreeIterator::advance: not yet implemented");
376 boost::graph_traits<IDXMLDOMGraph>::edge_descriptor fData;
382 virtual_out_edges(boost::graph_traits<IDXMLDOMGraph>::vertex_descriptor v,
const IDXMLDOMGraph& g);
386 std::pair<IDXMLDOMOutEdgeIterator, IDXMLDOMOutEdgeIterator>
387 virtual_out_edges<IDXMLDOMOutEdgeIterator>(boost::graph_traits<IDXMLDOMGraph>::vertex_descriptor v,
const IDXMLDOMGraph& g);
391 std::pair<IDXMLDOMStructureOnlyIterator, IDXMLDOMStructureOnlyIterator>
392 virtual_out_edges<IDXMLDOMStructureOnlyIterator>(boost::graph_traits<IDXMLDOMGraph>::vertex_descriptor v,
const IDXMLDOMGraph& g);
397 virtual_make_iterator(boost::graph_traits<IDXMLDOMGraph>::vertex_descriptor v,
const IDXMLDOMGraph& g);
401 IDXMLDOMOutEdgeIterator
402 virtual_make_iterator<IDXMLDOMOutEdgeIterator>(boost::graph_traits<IDXMLDOMGraph>::vertex_descriptor v,
const IDXMLDOMGraph& g);
406 inline boost::graph_traits<IDXMLDOMGraph>::vertex_descriptor
409 return g.RootVertex();;
413 #endif //__IDXMLDOMGraph__