From: Ian Jackson Date: Sat, 29 Dec 2007 13:01:41 +0000 (+0000) Subject: before delete edgelistgraph X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=moebius2.git;a=commitdiff_plain;h=74679957b60a386f26369087f22649857a964a3e before delete edgelistgraph --- diff --git a/bgl.cpp b/bgl.cpp index 4ed2537..cdfd858 100644 --- a/bgl.cpp +++ b/bgl.cpp @@ -19,6 +19,19 @@ extern "C" { #define VMASK (YMASK|XMASK) #define ESHIFT (YBITS|XBITS) +/* When we enumerate the edges we mainly just increment f. + * To avoid nonexistent edges + * we start with e=0 | y=1 | x=0 + * and explicitly skip e=1 | y=0 | ... + * We go only up to e=2 | YMAX | XMAX + * ie we stop just before e=3 | y=0 | x=0 + * so that we get each edge once rather than twice. + */ + +#define F_ALL_MIN (1 << YSHIFT) +#define F_ALL_MAX (3 << ESHIFT) +#define F_ALL_SKIP_AT (1 << ESHIFT) +#define F_ALL_SKIP_SET (1 << YSHIFT) namespace boost { // We make Layout a model of various BGL Graph concepts. @@ -33,21 +46,19 @@ namespace boost { struct OutEdgeIncrable { int f; - OutEdgeIncrable operator++(OutEdgeIncrable i) { - f += 1< { @@ -66,27 +77,36 @@ namespace boost { forward_iterator_tag> out_edge_iterator; typedef int degree_size_type; - inline int source(int f, const Layout& g) { return f&VMASK; } - inline int target(int f, const Layout& g) { return EDGE_END2(f&VMASK, f>>ESHIFT); } + inline int source(int f, const Layout&) { return f&VMASK; } + inline int target(int f, const Layout&) { return EDGE_END2(f&VMASK, f>>ESHIFT); } inline std::pair - out_edges(int v, const Layout& g) { + out_edges(int v, const Layout&) { return std::make_pair(out_edge_iterator(OutEdgeIncrable(v, VE_MIN(v))), out_edge_iterator(OutEdgeIncrable(v, VE_MAX(v)))); } - out_degree(int v, const Layout& g) { return VE_MAX(v) - VE_MIN(v); } + out_degree(int v, const Layout&) { return VE_MAX(v) - VE_MIN(v); } // Concept VertexListGraph: typedef counting_iterator vertex_iterator; typedef unsigned vertices_size_type; inline std::pair - vertices(const Layout& g) { + vertices(const Layout&) { return std::make_pair(vertex_iterator(0), vertex_iterator(N)); } - inline unsigned num_vertices(const Layout& g) { return N; } + inline unsigned num_vertices(const Layout&) { return N; } // Concept EdgeListGraph: - typedef counting_iterator edge_iterator; - inline std::pair + typedef counting_iterator edge_iterator; + typedef unsigned edges_size_type; + inline std::pair + edges(const Layout&) { + return std::make_pair(edge_iterator(AnyEdgeIncrable()), + edge_iterator(AnyEdgeIncrable(F_ALL_MAX))); + } + unsigned num_edges(const Layout&) { + return F_ALL_MAX - F_ALL_MIN - ((F_SKIP_SET|F_SKIP_AT) - F_SKIP_AT); + } }