marci@44: ETIK-OL-NOLIB-NEGRES full feature graph minimum concept. marci@44: marci@44: Regota filozunk rajta hogy hogy is kene kinezni a fent emlitett concept-nek, marci@44: most 1 egesz konkret javaslatot irnek. A fo cel, hogy lenyegeben marci@44: minden operaciot a graf vegezzen, es az iteratorok csak vmi leiro szerepet marci@44: toltsenek be. Azt is megfigyeltuk, hogy a fo technikai nehezseg, hogy a c++ marci@44: nem tud a visszateresi ertek alapjan megkulonboztetni fuggvenyeket. Ennek marci@44: megfeleloen 2 javaslatot irok most. Az egyikben a fv altal kiszamolt erteket marci@44: az egyik operandusban kapjuk vissza, a masikban egy tag-template specializacip marci@44: eredmenyekent balra adja vissza a cuccot. Nehol referencia van irva ahol nem marci@44: kell, ezen ne tessek fonnakadni. marci@44: marci@44: class Graph; marci@44: marci@44: class NodeIt; marci@44: trivialis node iterator, csak cimezni lehet vele, pl property vectort marci@44: class EachNodeIt; marci@44: node iterator a graf pontjainak bejarasara, NodeIt-e konvertalhato marci@44: marci@44: class EdgeIt; marci@44: trivialis edge iterator, csak cimezni lehet vele, pl property vectort marci@44: class EachEdgeIt; marci@44: edge iterator a graf osszes elenek bejarasara marci@44: class OutEdgeIt; marci@44: edge iterator 1 pont ki eleinek bejarasara, EdgeIt-e konvertalhato marci@44: class InEdgeIt; marci@44: edge iterator 1 pont be eleinek bejarasara, EdgeIt-e konvertalhato marci@44: class SymEdgeIt; marci@44: edge iterator 1 pont be es ki eleinek bejarasara, EdgeIt-e konvertalhato marci@44: marci@44: Az iteratorok ures konstruktorai invalid iteratort konstrualnak. marci@44: marci@44: template class NodeMap; marci@44: template class EdgeMap; marci@44: marci@44: Graph(); marci@44: default constructor marci@44: marci@44: A kovetkezo cuccokbol kell valasztani: marci@44: marci@44: NodeIt tail(const EdgeIt) const; marci@44: NodeIt head(const EdgeIt) const; marci@44: marci@44: NodeIt aNode(const OutEdgeIt) const; marci@44: NodeIt aNode(const InEdgeIt) const; marci@44: NodeIt aNode(const SymEdgeIt) const; marci@44: az out, in or sym edge iterator rogzitett pontjara ad 1 NodeIt-t marci@44: marci@44: NodeIt bNode(const OutEdgeIt) const; marci@44: NodeIt bNode(const InEdgeIt) const; marci@44: NodeIt bNode(const SymEdgeIt) const; marci@44: az out, in or sym edge iterator nem rogzitett pontjara ad 1 NodeIt-t marci@44: marci@44: EachNodeIt first() const; marci@44: EachEdgeIt first() const; marci@44: OutEdgeIt first(const NodeIt) const; marci@44: InEdgeIt first(const NodeIt) const; marci@44: SymEdgeIt first(const NodeIt) const; marci@44: EachNodeIt get(const NodeIt) const; ??? konverzio miatt marci@44: EachEdgeIt get(const EdgeIt) const; ??? konverzio miatt marci@44: OutEdgeIt get(const NodeIt, const EdgeIt) const; ??? konverzio miatt marci@44: InEdgeIt get(const NodeIt, const EdgeIt) const; ??? konverzio miatt marci@44: SymEdgeIt get(const NodeIt, const EdgeIt) const; ??? konverzio miatt marci@44: marci@44: A masik lehetoseg pedig: marci@44: marci@44: void getTail(NodeIt&, const EdgeIt) const; marci@44: void getHead(NodeIt&, const EdgeIt) const; marci@44: marci@44: void getANode(NodeIt&, const OutEdgeIt) const; marci@44: void getANode(NodeIt&, const InEdgeIt) const; marci@44: void getANode(NodeIt&, const SymEdgeIt) const; marci@44: marci@44: void getBNode(NodeIt&, const OutEdgeIt) const; marci@44: void getBNode(NodeIt&, const InEdgeIt) const; marci@44: void getBNode(NodeIt&, const SymEdgeIt) const; marci@44: marci@44: void getFirst(EachNodeIt&) const; marci@44: void getFirst(EachEdgeIt&) const; marci@44: void getFirst(OutEdgeIt&, const NodeIt) const; marci@44: void getFirst(InEdgeIt&, const NodeIt) const; marci@44: void getFirst(SymEdgeIt&, const NodeIt) const; marci@44: void get(EachNodeIt&, const NodeIt) const; ??? konverzio miatt marci@44: void get(EachEdgeIt&, const EdgeIt) const; ??? konverzio miatt marci@44: void get(OutEdgeIt&, const NodeIt, const EdgeIt) const; ??? konverzio miatt marci@44: void get(InEdgeIt&, const NodeIt, const EdgeIt) const; ??? konverzio miatt marci@44: void get(SymEdgeIt&, const NodeIt, const EdgeIt) const; ??? konverzio miatt marci@44: marci@44: Itt er veget az alternativ ize. marci@44: marci@44: Pontok azonositasara de meginkabb property vectorokhoz: marci@44: marci@44: int id(const NodeIt&) const; marci@44: int id(const EdgeIt&) const; marci@44: marci@44: int nodeNum() const; marci@44: int edgeNum() const; marci@44: marci@44: Pontok es elek hozzaadasanak metodusai: marci@44: marci@44: NodeIt addNode(); marci@44: EdgeIt addEdge(const NodeIt, const NodeIt); marci@44: marci@44: void deleteNode(const NodeIt); marci@44: void deleteEdge(const EdgeIt); marci@44: marci@44: void setTail(const NodeIt); vagy void setTail(NodeIt); nem tom marci@44: void setHead(const NodeIt); vagy void setHead(NodeIt); nem tom marci@44: marci@44: Hogy konnyebb legyen a progikat tesztelni, nehany stream utasitas: marci@44: ezek nem a ListGraph metodusai marci@44: marci@44: friend std::ostream& operator<<(std::ostream&, const NodeIt&); marci@44: friend std::ostream& operator<<(std::ostream&, const EdgeIt&); marci@44: marci@44: AZ iteratorok leptetesere ket lehetoseg van, az iterator ++ operatora, a marci@44: masik pedig marci@44: It G.next(It) const; marci@44: const G.next(const It) const; marci@44: It& G.setNext(It&) const; G.goNext(It&) const; G.moveNext(It&) const; mi a jobb szo? marci@44: marci@44: Kerdes: A bool valid()-nak ki kell-e jelenteni magarol, hogy const?? marci@44: NodeIt metodusai: marci@44: NodeIt(); marci@44: bool valid() const; marci@44: ezek nem tagfuggvenyek: marci@44: friend bool operator==(const NodeIt&, const NodeIt&); marci@44: friend bool operator!=(const NodeIt&, const NodeIt&); marci@44: marci@44: EachNodeIt metodusai: marci@44: ez publikusan szarmazik a NodeIt-bol, tehat a fentiek is. marci@44: EachNodeIt(); marci@44: EachNodeIt& operator++(); marci@44: marci@44: EdgeIt metodusai: marci@44: EdgeIt(); marci@44: bool valid() const; marci@44: ezek nem tagfvek: marci@44: friend bool operator==(const EdgeIt&, const EdgeIt&); marci@44: friend bool operator!=(const EdgeIt&, const EdgeIt&); marci@44: ujra tagfv-ek. marci@44: marci@44: EachEdgeIt metodusai: marci@44: EdgeIt-bol szarmazik marci@44: EachEdgeIt(); marci@44: EachEdgeIt& operator++(); marci@44: marci@44: OutEdgeIt metodusai: marci@44: EdgeIt-bol szarmazik marci@44: OutEdgeIt(); marci@44: OutEdgeIt& operator++(); marci@44: marci@44: InEdgeIt metodusai: marci@44: EdgeIt-bol szarmazik marci@44: InEdgeIt(); marci@44: InEdgeIt& operator++(); marci@44: marci@44: SymEdgeIt metodusai: marci@44: EdgeIt-bol szarmazik marci@44: SymEdgeIt(); marci@44: SymEdgeIt& operator++(); marci@44: marci@44: Ami itt kovetkezik az mar nem lenyeg, sot valtozni fog. marci@44: marci@44: Node propery array-okrol: marci@44: marci@44: template marci@44: class NodeMap; marci@44: marci@44: metodusok: marci@44: marci@44: NodeMap(const Graph&); marci@44: NodeMap(const Graph&, const ValueType); marci@44: void set(Graph::NodeIt, const ValueType); marci@44: //void put(Graph::NodeIt, const ValueType); marci@44: ValueType get(Graph::NodeIt) const; marci@44: marci@44: Ugyanez edge_property_array-okkal marci@44: marci@44: template marci@44: class EdgeMap; marci@44: marci@44: EdgeMap(const Graph&); marci@44: EdgeMap(const Graph&, const ValueType); marci@44: void set(Graph::EdgeIt, const ValueType); marci@44: //void put(Graph::EdgeIt, const ValueType); marci@44: ValueType get(Graph::EdgeIt) const; marci@44: marci@44: marci@cs.elte.hu