5 //inline void *operator new(size_t s, void *p) { return p; }
15 template <class N, class E> class Graph : protected OldGraph<N,E>
25 bool isValid() { return e; }
28 class InEdgePoint : public EdgePoint {};
29 class OutEdgePoint : public EdgePoint {};
30 class BiEdgePoint : public EdgePoint {};
31 class SymEdgePoint : public EdgePoint {};
33 typedef int NodePoint;
39 class OutEdgeIterator;
41 class SymEdgeIterator;
42 class AllEdgeIterator;
44 class FirstAnythingTypeNode; //Required by the unified First() function.
46 friend class NodeIterator;
47 friend class EdgeIterator;
48 friend class InEdgeIterator;
49 friend class OutEdgeIterator;
50 friend class BiEdgeIterator;
51 friend class SymEdgeIterator;
52 friend class AllEdgeIterator;
56 Graph<N,E> *G; //operator*() miatt kell!!!
57 int n; //nem kellene, ha itt mutato lenne!!
61 NodeIterator(Graph<N,E> &Gr)//'const Graph<N,E> &G' would be wrong.
62 {G=&Gr;n=Gr.OldGraph<N,E>::FirstNode();}
63 NodeIterator(const NodeIterator &i) {G=i.G;n=i.n;}
65 NodeIterator &GoNext() { n=G->NextNode(n); return *this;}
66 NodeIterator Next() const { return NodeIterator(*this).GoNext();}
67 NodeIterator &operator++() { return GoNext();}
68 NodeIterator operator++(int)
69 {NodeIterator tmp(*this); GoNext(); return tmp;}
70 bool isValid() { return n!=INVALID; }
72 N &operator*() const { return G->Data(n); }
73 N *operator->() const { return &G->Data(n); }
75 bool operator==(const NodeIterator &i) const {return n==i.n;}
76 bool operator!=(const NodeIterator &i) const {return n!=i.n;}
78 int Index() const { return n; } //If the nodes are indexable
80 friend class EdgeIterator;
81 friend class InEdgeIterator;
82 friend class OutEdgeIterator;
83 friend class BiEdgeIterator;
84 friend class SymEdgeIterator;
85 friend class AllEdgeIterator;
86 friend class FirstAnythingTypeNode;
89 // static NodeIterator &GetInvalid(); ?
95 Graph<N,E> *G; //Itt baj van!!!!! operator*() miatt kell!
96 //Ez csak kicsit baj, de:
97 // Meg a From() es To() miatt!!!!!!!!!!
102 EdgeIterator() {;} //Kell inicializalni? (Nem)
103 EdgeIterator(const EdgeIterator &i) {G=i.G;e=i.e;}
105 // Lehet, hogy ez a ketto nem kell!!!
107 NodeIterator From() const {NodeIterator i;i.G=G;i.n=e->From();return i;}
108 NodeIterator To() const {NodeIterator i;i.G=G;i.n=e->To();return i;}
110 bool isValid() {return e;}
111 E &operator*() const { return G->Data(e); }
112 E *operator->() const { return &G->Data(e); }
114 //operator const OutEdgeIterator ();
115 //operator const InEdgeIterator ();
116 //operator const BiEdgeIterator ();
117 //operator const SymEdgeIterator(); //Ez kerdeses, mit csinal
119 bool operator==(const EdgeIterator &i) const {return e==i.e;}
120 bool operator!=(const EdgeIterator &i) const {return e!=i.e;}
122 int Index() const { return e.index.block*EDGE_BLOCK_SIZE+e.index.index; }
123 //If the edges are indexable
126 friend class InEdgeIterator;
127 friend class OutEdgeIterator;
128 friend class BiEdgeIterator;
129 friend class SymEdgeIterator;
130 friend class AllEdgeIterator;
133 class BiEdgeIterator : public EdgeIterator
136 BiEdgeIterator &GoNextIn() { e=e->NextIn(); return *this;}
137 BiEdgeIterator &GoNextOut() { e=e->NextOut(); return *this;}
138 BiEdgeIterator NextIn() const {return BiEdgeIterator(*this).GoNextIn();}
139 BiEdgeIterator NextOut() const {return BiEdgeIterator(*this).GoNextOut();}
141 operator InEdgeIterator ()
142 {InEdgeIterator i; i.G=G;i.e=e;return i;}
143 operator OutEdgeIterator ()
144 {OutEdgeIterator i; i.G=G;i.e=e;return i;}
145 //operator const SymEdgeIterator ()
150 class InEdgeIterator : public EdgeIterator
151 //Ne a BiEdgeIterator-bol szarmazzon?
155 InEdgeIterator(const Graph<N,E> &Gr,const NodeIterator &n)
156 { G=&Gr; e=Gr.OldGraph<N,E>::FirstIn(n.n);}
158 InEdgeIterator &GoNext() { e=e->NextIn(); return *this;}
159 InEdgeIterator Next() const {return InEdgeIterator(*this).GoNext();}
160 InEdgeIterator &operator++() { return GoNext();}
161 InEdgeIterator operator++(int)
162 {InEdgeIterator tmp(*this); GoNext(); return tmp;}
164 operator const OutEdgeIterator ()
165 {OutEdgeIterator i; i.G=G;i.e=e;return i;}
166 operator const BiEdgeIterator ()
167 {EdgeIterator i; i.G=G;i.e=e;return i;}
168 // operator const SymEdgeIterator ();
170 NodeIterator Anode() const {return To();}
171 NodeIterator Bnode() const {return From();}
176 class OutEdgeIterator : public EdgeIterator
180 OutEdgeIterator(Graph<N,E> &Gr,const NodeIterator &n)
181 { G=&Gr; e=Gr.OldGraph<N,E>::FirstOut(n.n);}
183 OutEdgeIterator &GoNext() { e=e->NextOut(); return *this;}
184 OutEdgeIterator Next() const {return OutEdgeIterator(*this).GoNext();}
185 OutEdgeIterator &operator++() { return GoNext();}
186 OutEdgeIterator operator++(int)
187 {OutEdgeIterator tmp(*this); GoNext(); return tmp;}
189 NodeIterator Anode() const {return From();}
190 NodeIterator Bnode() const {return To();}
192 operator const InEdgeIterator ()
193 {InEdgeIterator i; i.G=G;i.e=e;return i;}
194 operator const BiEdgeIterator ()
195 {BiEdgeIterator i; i.G=G;i.e=e;return i;}
196 //operator const SymEdgeIterator();
201 class SymEdgeIterator : public EdgeIterator
203 NodeIterator n; // Itt ketszer van a G
207 SymEdgeIterator(const Graph<N,E> &Gr,const NodeIterator &nn)
208 { G=&Gr; n=nn; e=Gr.FirstSym(nn.n); }
210 SymEdgeIterator &GoNext() { e=e->NextEdge(n.n); return *this;}
211 SymEdgeIterator Next() const {return SymEdgeIterator(*this).GoNext();}
212 SymEdgeIterator &operator++() { return GoNext();}
213 SymEdgeIterator operator++(int)
214 {SymEdgeIterator tmp(*this); GoNext(); return tmp;}
216 NodeIterator Anode() const {return n;}
217 NodeIterator Bnode() const {return n.n==From().n?To():From();}
219 operator const InEdgeIterator ()
220 {InEdgeIterator i; i.G=G;i.e=e;return i;}
221 operator const OutEdgeIterator ()
222 {OutEdgeIterator i; i.G=G;i.e=e;return i;}
223 operator const BiEdgeIterator ()
224 {BiEdgeIterator i; i.G=G;i.e=e;return i;}
229 class AllEdgeIterator : public EdgeIterator
231 NodeIterator n; // Itt ketszer van a G
235 AllEdgeIterator(Graph<N,E> &Gr) : n(Gr)
237 e=n.isValid()?Gr.OldGraph<N,E>::FirstOut(n.n):NULL;
240 AllEdgeIterator &GoNext()
243 if(!e && (++n).isValid()) e=G->OldGraph<N,E>::FirstOut(n.n);
246 AllEdgeIterator Next() const {return AllEdgeIterator(*this).GoNext();}
247 AllEdgeIterator &operator++() { return GoNext();}
248 AllEdgeIterator operator++(int)
249 {AllEdgeIterator tmp(*this); GoNext(); return tmp;}
252 NodeIterator Anode() const {return n;}
253 NodeIterator Bnode() const {return n.n==From().n?To():From();}
255 operator const InEdgeIterator ()
256 {InEdgeIterator i; i.G=G;i.e=e;return i;}
257 operator const OutEdgeIterator ()
258 {OutEdgeIterator i; i.G=G;i.e=e;return i;}
259 operator const BiEdgeIterator ()
260 {BiEdgeIterator i; i.G=G;i.e=e;return i;}
265 typedef NodeIterator DeletingNodeIterator;
266 typedef EdgeIterator DeletingEdgeIterator;
267 typedef BiEdgeIterator DeletingBiEdgeIterator;
268 typedef OutEdgeIterator DeletingOutEdgeIterator;
269 typedef InEdgeIterator DeletingInEdgeIterator;
270 typedef SymEdgeIterator DeletingSymEdgeIterator;
272 const NodeIterator FirstNode()
275 i.G=this;i.n=OldGraph<N,E>::FirstNode();
279 void GetFirst(NodePoint &p) { p=OldGraph<N,E>::FirstNode(); }
281 void GetFirst(InEdgePoint &p,const NodePoint &n)
282 { p=OldGraph<N,E>::FirstIn(n); }
283 void GetFirst(OutEdgePoint &p,const NodePoint &n)
284 { p=OldGraph<N,E>::FirstOut(n); }
285 void GetFirst(SymEdgePoint &p,const NodePoint &n)
286 { p=OldGraph<N,E>::FirstEdge(n); }
287 void GetFirst(EdgePoint &p) //Vegigmegy mindenen
288 { p.e=NodeNum()?OldGraph<N,E>::FirstOut(OldGraph<N,E>::FirstNode()):NULL;}
290 void GetFirst(NodeIterator &i) { i.G=this;i.n=OldGraph<N,E>::FirstNode();}
292 void GetFirst(InEdgeIterator &i,const NodeIterator &n)
293 { i.G=this;i.e=OldGraph<N,E>::FirstIn(n.n); }
294 void GetFirst(OutEdgeIterator &i,const NodeIterator &n)
295 { i.G=this;i.e=OldGraph<N,E>::FirstOut(n.n); }
296 void GetFirst(SymEdgeIterator &i,const NodeIterator &n)
297 { i.G=this;i.e=OldGraph<N,E>::FirstSym(n.n); }
298 void GetFirst(AllEdgeIterator &i) //Vegigmegy mindenen
302 i.e=OldGraph<N,E>::NodeNum()?OldGraph<N,E>::FirstOut(i.n.n):NULL;
308 const DeletingEdgeIterator FirstOut(const NodeIterator &n)
311 i.G=n.G;i.edge=n.G->OldGraph<N,E>::FirstOut(n.n);
314 const DeletingEdgeIterator FirstIn(const NodeIterator &n)
317 i.G=n.G;i.edge=n.G->OldGraph<N,E>::FirstIn(n.n);
320 const DeletingSymEdgeIterator FirstSym(const NodeIterator &n)
324 i.edge=n.G->OldGraph<N,E>::FirstEdge(n.n);
328 // class FirstAnythingType;
329 // friend class FirstAnythingType;
331 class FirstAnythingTypeNode
335 FirstAnythingTypeNode(NodeIterator i) : n(i) {}
337 operator const InEdgeIterator () const
338 {InEdgeIterator i; n.G->GetFirst(i,n);return i;}
339 operator const OutEdgeIterator () const
340 {OutEdgeIterator i; n.G->GetFirst(i,n);return i;}
341 operator const SymEdgeIterator () const
342 {SymEdgeIterator i; n.G->GetFirst(i,n);return i;}
344 operator const InEdgePoint () const
345 {InEdgePoint i; n.G->GetFirst(i,n);return i;}
346 operator const OutEdgePoint () const
347 {OutEdgePoint i; n.G->GetFirst(i,n);return i;}
348 operator const SymEdgePoint () const
349 {SymEdgePoint i; n.G->GetFirst(i,n);return i;}
352 class FirstAnythingType
356 FirstAnythingType(Graph<N,E> *gg) : G(gg) {}
358 operator const AllEdgeIterator () const
359 {AllEdgeIterator i; G->GetFirst(i);return i;}
360 operator const EdgePoint () const
361 {EdgePoint i; G->GetFirst(i);return i;}
362 operator const NodeIterator () const
363 {NodeIterator i; G->GetFirst(i);return i;}
364 operator const NodePoint () const
365 {NodePoint i; G->GetFirst(i);return i;}
368 // const NodeIterator First() {NodeIterator i;GetFirst(i); return i;}
369 FirstAnythingTypeNode First(NodeIterator &i)
370 {FirstAnythingTypeNode t(i); return t;}
371 const FirstAnythingType &First() {return _FST;}
373 // LastNode() vagy endnode() stb. Nem kell?
375 DeletingNodeIterator AddNode()
377 DeletingNodeIterator i;
378 i.G=this; i.n=OldGraph<N,E>::AddNode();
382 AddEdge(const NodeIterator from,const NodeIterator to)
384 DeletingEdgeIterator i;
385 i.G=this;i.e=OldGraph<N,E>::AddEdge(from.n,to.n);return i;
388 void Delete(DeletingNodeIterator n) {n.G->OldGraph<N,E>::Delete(n.n);}
389 void Delete(DeletingEdgeIterator e) {e.G->OldGraph<N,E>::Delete(e.e);}
391 int NodeNum() { OldGraph<N,E>::NodeNum(); }
392 void Clean() { OldGraph<N,E>::Clean(); }
394 Graph() : _FST(this) {}
397 template<class T> class NodeMap
403 typedef T value_type;
404 void Put(const NodeIterator i, const T &t) {map[i.Index()]=t;}
405 T Get(const NodeIterator i) const {return map[i.Index()];}
406 T operator[](NodeIterator i) {return map[i.Index()];}
408 void update() { map.resize(G->MaxNode());}
411 void SetG(Graph<N,E> &Gr) { G=&Gr; update();}
414 template<class T> class EdgeMap
420 typedef T value_type;
421 void Put(const NodeIterator i, const T &t) {map[i.Index()]=t;}
422 T &Get(const NodeIterator i) {return map[i.Index()];}
423 T &operator[](NodeIterator i) {return map[i.Index()];}
426 { map.resize(G->MaxEdge());}
429 void SetG(Graph<N,E> &Gr)
435 int MaxNode() { return OldGraph<N,E>::MaxNode();}
436 int MaxEdge() { return ::edge_block_num*EDGE_BLOCK_SIZE;}
440 /* Ez itt a fiam kommentje:
441 <v n nnnnnnnnnnnnnncncccccccccccccccccvvvvvv
442 vvnvnvnvnvnvvnnvnvnvnnvnbbbvfffffvvffffffffffffffffffffz
443 << < < < < < < .cx..x.c.cc.c