inline void map_turns(Map& map, TurnPoints const& turn_points) { typedef typename boost::range_value<TurnPoints>::type turn_point_type; typedef typename turn_point_type::container_type container_type; int index = 0; for (typename boost::range_iterator<TurnPoints const>::type it = boost::begin(turn_points); it != boost::end(turn_points); ++it, ++index) { if (! skip(*it)) { int op_index = 0; for (typename boost::range_iterator<container_type const>::type op_it = boost::begin(it->operations); op_it != boost::end(it->operations); ++op_it, ++op_index) { ring_identifier ring_id ( op_it->seg_id.source_index, op_it->seg_id.multi_index, op_it->seg_id.ring_index ); map[ring_id]++; } } } }
inline void get_ring_turn_info(TurnInfoMap& turn_info_map, TurnPoints const& turn_points) { typedef typename boost::range_value<TurnPoints>::type turn_point_type; typedef typename turn_point_type::container_type container_type; for (typename boost::range_iterator<TurnPoints const>::type it = boost::begin(turn_points); it != boost::end(turn_points); ++it) { typename boost::range_value<TurnPoints>::type const& turn_info = *it; bool both_uu = turn_info.both(operation_union); bool skip = (turn_info.discarded || both_uu) && ! turn_info.any_blocked() && ! turn_info.both(operation_intersection) ; for (typename boost::range_iterator<container_type const>::type op_it = boost::begin(turn_info.operations); op_it != boost::end(turn_info.operations); ++op_it) { ring_identifier ring_id ( op_it->seg_id.source_index, op_it->seg_id.multi_index, op_it->seg_id.ring_index ); if (! skip) { turn_info_map[ring_id].has_normal_turn = true; } else if (both_uu) { turn_info_map[ring_id].has_uu_turn = true; } } } }
inline void create_map(TurnPoints const& turn_points, MappedVector& mapped_vector) { typedef typename boost::range_value<TurnPoints>::type turn_point_type; typedef typename turn_point_type::container_type container_type; int index = 0; for (typename boost::range_iterator<TurnPoints const>::type it = boost::begin(turn_points); it != boost::end(turn_points); ++it, ++index) { // Add operations on this ring, but skip discarded ones if (! it->discarded) { int op_index = 0; for (typename boost::range_iterator<container_type const>::type op_it = boost::begin(it->operations); op_it != boost::end(it->operations); ++op_it, ++op_index) { // We should NOT skip blocked operations here // because they can be relevant for "the other side" // NOT if (op_it->operation != operation_blocked) ring_identifier ring_id ( op_it->seg_id.source_index, op_it->seg_id.multi_index, op_it->seg_id.ring_index ); mapped_vector[ring_id].push_back ( IndexedType(index, op_index, *op_it) ); } } } }