cgma
|
#include <CubitLoops.hpp>
Classes | |
struct | CoEdge |
Static Public Member Functions | |
static bool | make_loops (std::vector< CoEdge > &coedges, std::vector< std::vector< CoEdge * > > &loops) |
Static Private Member Functions | |
static bool | recursive_make_loop (V *start_vertex, CoEdge *coedge, std::set< CoEdge * > &used_coedges, std::multimap< V *, CoEdge * > &start_coedge_map, std::vector< CoEdge * > &loop) |
Definition at line 10 of file CubitLoops.hpp.
bool CubitLoops< C, V >::make_loops | ( | std::vector< CoEdge > & | coedges, |
std::vector< std::vector< CoEdge * > > & | loops | ||
) | [inline, static] |
Definition at line 102 of file CubitLoops.hpp.
{ std::multimap<V*, CoEdge*> start_coedge_map; for (size_t i=0; i<coedges.size(); i++) { if (coedges[i].sense == CUBIT_FORWARD) start_coedge_map.insert(std::make_pair(coedges[i].start, &coedges[i])); else start_coedge_map.insert(std::make_pair(coedges[i].end, &coedges[i])); } std::set<CoEdge*> used_coedges; for (size_t i=0; i<coedges.size(); i++) { if (used_coedges.find(&coedges[i]) != used_coedges.end()) continue; V* start_vertex; if (coedges[i].sense == CUBIT_FORWARD) start_vertex = coedges[i].start; else start_vertex = coedges[i].end; typename std::multimap<V*, CoEdge*>::iterator iter; typename std::multimap<V*, CoEdge*>::iterator last; iter = start_coedge_map.lower_bound(start_vertex); last = start_coedge_map.upper_bound(start_vertex); std::vector<CoEdge*> loop; for (/*preinitialized*/; iter != last; iter++) { std::vector<CoEdge*> sub_loop; recursive_make_loop(start_vertex, iter->second, used_coedges, start_coedge_map, loop); } if (loop.empty()) return false; loops.push_back(std::vector<CoEdge*>(loop.begin(), loop.end()) ); } if (coedges.size() != used_coedges.size()) return false; return true; }
bool CubitLoops< C, V >::recursive_make_loop | ( | V * | start_vertex, |
CoEdge * | coedge, | ||
std::set< CoEdge * > & | used_coedges, | ||
std::multimap< V *, CoEdge * > & | start_coedge_map, | ||
std::vector< CoEdge * > & | loop | ||
) | [inline, static, private] |
Definition at line 33 of file CubitLoops.hpp.
{ V* curr_vertex; if (coedge->sense == CUBIT_FORWARD) curr_vertex = coedge->end; else curr_vertex = coedge->start; loop.push_back(coedge); used_coedges.insert(coedge); while (curr_vertex != start_vertex) { typename std::multimap<V*, CoEdge*>::iterator iter; typename std::multimap<V*, CoEdge*>::iterator last; iter = start_coedge_map.lower_bound(curr_vertex); last = start_coedge_map.upper_bound(curr_vertex); std::vector<CoEdge*> possible_coedges; for (/*preinitialized*/; iter != last; iter++) { if (used_coedges.find(iter->second) == used_coedges.end()) possible_coedges.push_back(iter->second); } if (possible_coedges.size() == 0) return false; else if (possible_coedges.size() == 1) { coedge = possible_coedges[0]; loop.push_back(coedge); used_coedges.insert(coedge); if (coedge->sense == CUBIT_FORWARD) curr_vertex = coedge->end; else curr_vertex = coedge->start; } else { for (size_t i=0; i<possible_coedges.size(); i++) { std::vector<CoEdge*> sub_loop; if (recursive_make_loop(curr_vertex, possible_coedges[i], used_coedges, start_coedge_map, sub_loop) ) { loop.insert(loop.end(), sub_loop.begin(), sub_loop.end()); } else { for (size_t j=0; j<sub_loop.size(); j++) used_coedges.erase(sub_loop[j]); coedge = possible_coedges[i]; } } loop.push_back(coedge); used_coedges.insert(coedge); if (coedge->sense == CUBIT_FORWARD) curr_vertex = coedge->end; else curr_vertex = coedge->start; } } return true; }