# HG changeset patch # User alpar # Date 1161082950 0 # Node ID 133028e83940c8dce4fb98e4cf9ea42eb12569e4 # Parent 37fa5f83251e6581e5414d1914d048cdde5ec167 A trial to make the last test platform independent. diff -r 37fa5f83251e -r 133028e83940 benchmark/edge_lookup.cc --- a/benchmark/edge_lookup.cc Tue Oct 17 11:02:05 2006 +0000 +++ b/benchmark/edge_lookup.cc Tue Oct 17 11:02:30 2006 +0000 @@ -75,22 +75,22 @@ }; -// class EL4 -// { -// public: -// Graph &_g; -// EdgeLookUp4 _el; -// EL4(Graph &g) :_g(g), _el(g) {} -// void operator()() -// { -// Edge e; +class EL4 +{ +public: + Graph &_g; + EdgeLookUp4 _el; + EL4(Graph &g) :_g(g), _el(g) {} + void operator()() + { + Edge e; -// for(NodeIt v(_g);v!=INVALID;++v) -// for(NodeIt u(_g);u!=INVALID;++u) -// e=_el(u,v); -// } + for(NodeIt v(_g);v!=INVALID;++v) + for(NodeIt u(_g);u!=INVALID;++u) + e=_el(u,v); + } -// }; +}; int main(int, char**argv) { diff -r 37fa5f83251e -r 133028e83940 benchmark/edge_lookup_test.h --- a/benchmark/edge_lookup_test.h Tue Oct 17 11:02:05 2006 +0000 +++ b/benchmark/edge_lookup_test.h Tue Oct 17 11:02:30 2006 +0000 @@ -189,92 +189,98 @@ }; -// template -// class EdgeLookUp4 -// { -// public: -// GRAPH_TYPEDEFS(typename G) -// typedef G Graph; + template + class EdgeLookUp4 + { + public: + GRAPH_TYPEDEFS(typename G) + typedef G Graph; + + private: + const Graph &_g; + typename Graph::template NodeMap _start; + typename Graph::template NodeMap _end; + std::vector _edges; + + class EdgeLess { + const Graph &g; + public: + EdgeLess(const Graph &_g) : g(_g) {} + bool operator()(Edge a,Edge b) const + { + return g.target(a)::iterator ei=_edges.end(); + _end[n]=_edges.size(); + std::sort(_edges.begin()+bi,ei,EdgeLess(_g)); + } + ///Refresh the full data structure. + void refresh() + { + _edges.resize(countEdges(_g)); + int l=0; + for(NodeIt n(_g);n!=INVALID;++n) + { + int ls = l; + _start[n]=&(_edges[l]); + for(OutEdgeIt e(_g,n);e!=INVALID;++e) _edges[l++]=e; + _end[n]=&(_edges[l]); + std::sort(_edges.begin()+ls,_edges.begin()+l,EdgeLess(_g)); + } + + } + + ///Find an edge between two nodes. + + ///Find an edge between two nodes. + ///\param s The source node + ///\param t The target node + ///\return An edge from \c s to \c t if there exists, + ///\ref INVALID otherwise. -// private: -// const Graph &_g; -// typename Graph::template NodeMap _start; -// typename Graph::template NodeMap _end; -// std::vector _edges; - -// class EdgeLess { -// const Graph &g; -// public: -// EdgeLess(const Graph &_g) : g(_g) {} -// bool operator()(Edge a,Edge b) const -// { -// return g.target(a)::iterator ei=_edges.end(); -// _end[n]=_edges.size(); -// std::sort(_edges.begin()+bi,ei,EdgeLess(_g)); -// } -// ///Refresh the full data structure. -// void refresh() -// { -// _edges.resize(countEdges(_g)); -// int l=0; -// for(NodeIt n(_g);n!=INVALID;++n) -// { -// int ls = l; -// _start[n]=&(_edges[l]); -// for(OutEdgeIt e(_g,n);e!=INVALID;++e) _edges[l++]=e; -// _end[n]=&(_edges[l]); -// std::sort(_edges.begin()+ls,_edges.begin()+l,EdgeLess(_g)); -// } + Edge operator()(Node s, Node t) + { + Edge *a=_start[s]; + Edge *b=_end[s]; + while(a!=b) + { +#ifdef X86 + Edge *m=(Edge*)(((unsigned int)a+(unsigned int)b)/2 & 0xfffffffc); +#elif X86_64 + Edge *m=(Edge*)(((unsigned long)a+(undigned long)b)/2 & 0xfffffffc); +#else + Edge *m=a+((b-a)/2); +#endif + Node tt = _g.target(*m); + if(tt==t) return *m; + else if(tt