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<typename ValueType> class NodeMap;
marci@44: template<typename ValueType> 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<EachNodeIt>() const;
marci@44: EachEdgeIt first<EachEdgeIt>() const;
marci@44: OutEdgeIt first<OutEdgeIt>(const NodeIt) const; 
marci@44: InEdgeIt first<InEdgeIt>(const NodeIt) const; 
marci@44: SymEdgeIt first<SymEdgeIt>(const NodeIt) const; 
marci@44: EachNodeIt get<EachNodeIt>(const NodeIt) const; ??? konverzio miatt
marci@44: EachEdgeIt get<EachEdgeIt>(const EdgeIt) const; ??? konverzio miatt
marci@44: OutEdgeIt get<OutEdgeIt>(const NodeIt, const EdgeIt) const; ??? konverzio miatt
marci@44: InEdgeIt get<InEdgeIt>(const NodeIt, const EdgeIt) const; ??? konverzio miatt
marci@44: SymEdgeIt get<SymEdgeIt>(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 <typename ValueType>
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 <typename ValueType>
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