1 ETIK-OL-NOLIB-NEGRES full feature graph minimum concept. |
|
2 |
|
3 Regota filozunk rajta hogy hogy is kene kinezni a fent emlitett concept-nek, |
|
4 most 1 egesz konkret javaslatot irnek. A fo cel, hogy lenyegeben |
|
5 minden operaciot a graf vegezzen, es az iteratorok csak vmi leiro szerepet |
|
6 toltsenek be. Azt is megfigyeltuk, hogy a fo technikai nehezseg, hogy a c++ |
|
7 nem tud a visszateresi ertek alapjan megkulonboztetni fuggvenyeket. Ennek |
|
8 megfeleloen 2 javaslatot irok most. Az egyikben a fv altal kiszamolt erteket |
|
9 az egyik operandusban kapjuk vissza, a masikban egy tag-template specializacip |
|
10 eredmenyekent balra adja vissza a cuccot. Nehol referencia van irva ahol nem |
|
11 kell, ezen ne tessek fonnakadni. |
|
12 |
|
13 class Graph; |
|
14 |
|
15 class NodeIt; |
|
16 trivialis node iterator, csak cimezni lehet vele, pl property vectort |
|
17 class EachNodeIt; |
|
18 node iterator a graf pontjainak bejarasara, NodeIt-e konvertalhato |
|
19 |
|
20 class EdgeIt; |
|
21 trivialis edge iterator, csak cimezni lehet vele, pl property vectort |
|
22 class EachEdgeIt; |
|
23 edge iterator a graf osszes elenek bejarasara |
|
24 class OutEdgeIt; |
|
25 edge iterator 1 pont ki eleinek bejarasara, EdgeIt-e konvertalhato |
|
26 class InEdgeIt; |
|
27 edge iterator 1 pont be eleinek bejarasara, EdgeIt-e konvertalhato |
|
28 class SymEdgeIt; |
|
29 edge iterator 1 pont be es ki eleinek bejarasara, EdgeIt-e konvertalhato |
|
30 |
|
31 Az iteratorok ures konstruktorai invalid iteratort konstrualnak. |
|
32 |
|
33 template<typename ValueType> class NodeMap; |
|
34 template<typename ValueType> class EdgeMap; |
|
35 |
|
36 Graph(); |
|
37 default constructor |
|
38 |
|
39 A kovetkezo cuccokbol kell valasztani: |
|
40 |
|
41 NodeIt tail(const EdgeIt) const; |
|
42 NodeIt head(const EdgeIt) const; |
|
43 |
|
44 NodeIt aNode(const OutEdgeIt) const; |
|
45 NodeIt aNode(const InEdgeIt) const; |
|
46 NodeIt aNode(const SymEdgeIt) const; |
|
47 az out, in or sym edge iterator rogzitett pontjara ad 1 NodeIt-t |
|
48 |
|
49 NodeIt bNode(const OutEdgeIt) const; |
|
50 NodeIt bNode(const InEdgeIt) const; |
|
51 NodeIt bNode(const SymEdgeIt) const; |
|
52 az out, in or sym edge iterator nem rogzitett pontjara ad 1 NodeIt-t |
|
53 |
|
54 EachNodeIt first<EachNodeIt>() const; |
|
55 EachEdgeIt first<EachEdgeIt>() const; |
|
56 OutEdgeIt first<OutEdgeIt>(const NodeIt) const; |
|
57 InEdgeIt first<InEdgeIt>(const NodeIt) const; |
|
58 SymEdgeIt first<SymEdgeIt>(const NodeIt) const; |
|
59 EachNodeIt get<EachNodeIt>(const NodeIt) const; ??? konverzio miatt |
|
60 EachEdgeIt get<EachEdgeIt>(const EdgeIt) const; ??? konverzio miatt |
|
61 OutEdgeIt get<OutEdgeIt>(const NodeIt, const EdgeIt) const; ??? konverzio miatt |
|
62 InEdgeIt get<InEdgeIt>(const NodeIt, const EdgeIt) const; ??? konverzio miatt |
|
63 SymEdgeIt get<SymEdgeIt>(const NodeIt, const EdgeIt) const; ??? konverzio miatt |
|
64 |
|
65 A masik lehetoseg pedig: |
|
66 |
|
67 void getTail(NodeIt&, const EdgeIt) const; |
|
68 void getHead(NodeIt&, const EdgeIt) const; |
|
69 |
|
70 void getANode(NodeIt&, const OutEdgeIt) const; |
|
71 void getANode(NodeIt&, const InEdgeIt) const; |
|
72 void getANode(NodeIt&, const SymEdgeIt) const; |
|
73 |
|
74 void getBNode(NodeIt&, const OutEdgeIt) const; |
|
75 void getBNode(NodeIt&, const InEdgeIt) const; |
|
76 void getBNode(NodeIt&, const SymEdgeIt) const; |
|
77 |
|
78 void getFirst(EachNodeIt&) const; |
|
79 void getFirst(EachEdgeIt&) const; |
|
80 void getFirst(OutEdgeIt&, const NodeIt) const; |
|
81 void getFirst(InEdgeIt&, const NodeIt) const; |
|
82 void getFirst(SymEdgeIt&, const NodeIt) const; |
|
83 void get(EachNodeIt&, const NodeIt) const; ??? konverzio miatt |
|
84 void get(EachEdgeIt&, const EdgeIt) const; ??? konverzio miatt |
|
85 void get(OutEdgeIt&, const NodeIt, const EdgeIt) const; ??? konverzio miatt |
|
86 void get(InEdgeIt&, const NodeIt, const EdgeIt) const; ??? konverzio miatt |
|
87 void get(SymEdgeIt&, const NodeIt, const EdgeIt) const; ??? konverzio miatt |
|
88 |
|
89 Itt er veget az alternativ ize. |
|
90 |
|
91 Pontok azonositasara de meginkabb property vectorokhoz: |
|
92 |
|
93 int id(const NodeIt&) const; |
|
94 int id(const EdgeIt&) const; |
|
95 |
|
96 int nodeNum() const; |
|
97 int edgeNum() const; |
|
98 |
|
99 Pontok es elek hozzaadasanak metodusai: |
|
100 |
|
101 NodeIt addNode(); |
|
102 EdgeIt addEdge(const NodeIt, const NodeIt); |
|
103 |
|
104 void deleteNode(const NodeIt); |
|
105 void deleteEdge(const EdgeIt); |
|
106 |
|
107 void setTail(const NodeIt); vagy void setTail(NodeIt); nem tom |
|
108 void setHead(const NodeIt); vagy void setHead(NodeIt); nem tom |
|
109 |
|
110 Hogy konnyebb legyen a progikat tesztelni, nehany stream utasitas: |
|
111 ezek nem a ListGraph metodusai |
|
112 |
|
113 friend std::ostream& operator<<(std::ostream&, const NodeIt&); |
|
114 friend std::ostream& operator<<(std::ostream&, const EdgeIt&); |
|
115 |
|
116 AZ iteratorok leptetesere ket lehetoseg van, az iterator ++ operatora, a |
|
117 masik pedig |
|
118 It G.next(It) const; |
|
119 const G.next(const It) const; |
|
120 It& G.setNext(It&) const; G.goNext(It&) const; G.moveNext(It&) const; mi a jobb szo? |
|
121 |
|
122 Kerdes: A bool valid()-nak ki kell-e jelenteni magarol, hogy const?? |
|
123 NodeIt metodusai: |
|
124 NodeIt(); |
|
125 bool valid() const; |
|
126 ezek nem tagfuggvenyek: |
|
127 friend bool operator==(const NodeIt&, const NodeIt&); |
|
128 friend bool operator!=(const NodeIt&, const NodeIt&); |
|
129 |
|
130 EachNodeIt metodusai: |
|
131 ez publikusan szarmazik a NodeIt-bol, tehat a fentiek is. |
|
132 EachNodeIt(); |
|
133 EachNodeIt& operator++(); |
|
134 |
|
135 EdgeIt metodusai: |
|
136 EdgeIt(); |
|
137 bool valid() const; |
|
138 ezek nem tagfvek: |
|
139 friend bool operator==(const EdgeIt&, const EdgeIt&); |
|
140 friend bool operator!=(const EdgeIt&, const EdgeIt&); |
|
141 ujra tagfv-ek. |
|
142 |
|
143 EachEdgeIt metodusai: |
|
144 EdgeIt-bol szarmazik |
|
145 EachEdgeIt(); |
|
146 EachEdgeIt& operator++(); |
|
147 |
|
148 OutEdgeIt metodusai: |
|
149 EdgeIt-bol szarmazik |
|
150 OutEdgeIt(); |
|
151 OutEdgeIt& operator++(); |
|
152 |
|
153 InEdgeIt metodusai: |
|
154 EdgeIt-bol szarmazik |
|
155 InEdgeIt(); |
|
156 InEdgeIt& operator++(); |
|
157 |
|
158 SymEdgeIt metodusai: |
|
159 EdgeIt-bol szarmazik |
|
160 SymEdgeIt(); |
|
161 SymEdgeIt& operator++(); |
|
162 |
|
163 Ami itt kovetkezik az mar nem lenyeg, sot valtozni fog. |
|
164 |
|
165 Node propery array-okrol: |
|
166 |
|
167 template <typename ValueType> |
|
168 class NodeMap; |
|
169 |
|
170 metodusok: |
|
171 |
|
172 NodeMap(const Graph&); |
|
173 NodeMap(const Graph&, const ValueType); |
|
174 void set(Graph::NodeIt, const ValueType); |
|
175 //void put(Graph::NodeIt, const ValueType); |
|
176 ValueType get(Graph::NodeIt) const; |
|
177 |
|
178 Ugyanez edge_property_array-okkal |
|
179 |
|
180 template <typename ValueType> |
|
181 class EdgeMap; |
|
182 |
|
183 EdgeMap(const Graph&); |
|
184 EdgeMap(const Graph&, const ValueType); |
|
185 void set(Graph::EdgeIt, const ValueType); |
|
186 //void put(Graph::EdgeIt, const ValueType); |
|
187 ValueType get(Graph::EdgeIt) const; |
|
188 |
|
189 marci@cs.elte.hu |
|