00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef _GRAPH_H
00030 #define _GRAPH_H
00031
00032 #include <set>
00033 #include <vector>
00034 #include <map>
00035 #include <iostream>
00036 #include "typedefs.h"
00037 #include "exceptions.h"
00038 #include "nodeiter.h"
00039 #include "edgeiter.h"
00040
00041 namespace libgexf {
00042
00043 class NodeIter;
00044 class EdgeIter;
00045
00049 class Graph {
00050 public:
00051 Graph();
00052
00056 Graph(const Graph& orig);
00057
00058 virtual ~Graph();
00059
00065 void addNode(const libgexf::t_id id);
00066
00076 void addEdge(const libgexf::t_id id, const libgexf::t_id source_id, const libgexf::t_id target_id, const float weight=1.0, const libgexf::t_edge_type type=EDGE_UNDEF);
00077
00083 void removeNode(const libgexf::t_id id);
00084
00091 void removeEdge(const libgexf::t_id source_id, const libgexf::t_id target_id);
00092
00093
00100 bool containsNode(const libgexf::t_id id) const;
00101
00109 bool containsEdge(const libgexf::t_id source_id, const libgexf::t_id target_id) const;
00110
00118 t_id getEdge(const libgexf::t_id source_id, const libgexf::t_id target_id) const;
00119
00120
00126 libgexf::NodeIter* getNodes() const;
00127
00133 libgexf::EdgeIter* getEdges() const;
00134
00141 std::vector<libgexf::t_id> getNeighbors(const libgexf::t_id node_id) const;
00142
00143
00149 unsigned int getNodeCount() const;
00150
00156 unsigned int getEdgeCount() const;
00157
00164 unsigned int getDegree(const libgexf::t_id node_id) const;
00165
00166
00172 void clearEdges(const libgexf::t_id node_id);
00173
00177 void clear();
00178
00182 void clearEdges();
00183
00184
00189 void readLock() throw(libgexf::ReadLockException);
00190
00194 void readUnlock();
00195
00200 void writeLock() throw(libgexf::WriteLockException);
00201
00205 void writeUnlock();
00206
00210 bool isReadLock();
00211
00215 bool isWriteLock();
00216
00220 bool isUnlock();
00221 protected:
00222 std::set<t_id> _nodes;
00223 std::map<t_id,std::map<t_id,t_id> > _edges;
00224 std::map<t_id,std::set<t_id> > _reverse_edges;
00225 std::set<t_id> _bloom_edges;
00226 std::map<t_id,std::map<t_edge_property,t_edge_value> > _edges_properties;
00227 unsigned short int _rlock_count;
00234 char _lock_flag;
00235
00236 friend std::ostream& operator<<(std::ostream& os, const Graph& o);
00237 friend class NodeIter;
00238 friend class EdgeIter;
00239 private:
00240
00241 };
00242
00243 }
00244
00245 #endif
00246