/
usr
/
include
/
boost
/
geometry
/
algorithms
/
detail
/
overlay
/
/usr/include/boost/geometry/algorithms/detail/overlay
mkdir
upload
Name
Size
Mode
Actions
add_rings.hpp
5964
0644
edit
dl
rm
append_no_duplicates.hpp
2101
0644
edit
dl
rm
append_no_dups_or_spikes.hpp
7434
0644
edit
dl
rm
assign_parents.hpp
14577
0644
edit
dl
rm
backtrack_check_si.hpp
6371
0644
edit
dl
rm
check_enrich.hpp
5361
0644
edit
dl
rm
clip_linestring.hpp
8718
0644
edit
dl
rm
cluster_exits.hpp
7817
0644
edit
dl
rm
cluster_info.hpp
1010
0644
edit
dl
rm
convert_ring.hpp
3113
0644
edit
dl
rm
copy_segments.hpp
11481
0644
edit
dl
rm
copy_segment_point.hpp
11107
0644
edit
dl
rm
debug_turn_info.hpp
1947
0644
edit
dl
rm
do_reverse.hpp
1246
0644
edit
dl
rm
enrichment_info.hpp
2343
0644
edit
dl
rm
enrich_intersection_points.hpp
19008
0644
edit
dl
rm
follow.hpp
16907
0644
edit
dl
rm
follow_linear_linear.hpp
15711
0644
edit
dl
rm
get_distance_measure.hpp
5092
0644
edit
dl
rm
get_intersection_points.hpp
4265
0644
edit
dl
rm
get_relative_order.hpp
3260
0644
edit
dl
rm
get_ring.hpp
3700
0644
edit
dl
rm
get_turns.hpp
42078
0644
edit
dl
rm
get_turn_info.hpp
45746
0644
edit
dl
rm
get_turn_info_for_endpoint.hpp
25337
0644
edit
dl
rm
get_turn_info_helpers.hpp
19708
0644
edit
dl
rm
get_turn_info_la.hpp
34941
0644
edit
dl
rm
get_turn_info_ll.hpp
28380
0644
edit
dl
rm
handle_colocations.hpp
28604
0644
edit
dl
rm
handle_self_turns.hpp
9962
0644
edit
dl
rm
inconsistent_turns_exception.hpp
1043
0644
edit
dl
rm
intersection_box_box.hpp
2623
0644
edit
dl
rm
intersection_insert.hpp
47296
0644
edit
dl
rm
is_self_turn.hpp
1611
0644
edit
dl
rm
less_by_segment_ratio.hpp
6161
0644
edit
dl
rm
linear_linear.hpp
9562
0644
edit
dl
rm
needs_self_turns.hpp
1911
0644
edit
dl
rm
overlay.hpp
15706
0644
edit
dl
rm
overlay_type.hpp
1746
0644
edit
dl
rm
pointlike_areal.hpp
9593
0644
edit
dl
rm
pointlike_linear.hpp
11547
0644
edit
dl
rm
pointlike_pointlike.hpp
11878
0644
edit
dl
rm
range_in_geometry.hpp
5066
0644
edit
dl
rm
ring_properties.hpp
2135
0644
edit
dl
rm
segment_as_subrange.hpp
1488
0644
edit
dl
rm
segment_identifier.hpp
3555
0644
edit
dl
rm
select_rings.hpp
12362
0644
edit
dl
rm
self_turn_points.hpp
10814
0644
edit
dl
rm
sort_by_side.hpp
22216
0644
edit
dl
rm
stream_info.hpp
2383
0644
edit
dl
rm
traversal.hpp
34432
0644
edit
dl
rm
traversal_info.hpp
1469
0644
edit
dl
rm
traversal_ring_creator.hpp
15319
0644
edit
dl
rm
traversal_switch_detector.hpp
22642
0644
edit
dl
rm
traverse.hpp
3256
0644
edit
dl
rm
turn_info.hpp
4468
0644
edit
dl
rm
visit_info.hpp
2350
0644
edit
dl
rm
Edit:
/usr/include/boost/geometry/algorithms/detail/overlay/cluster_exits.hpp
(7817B)
// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2020 Barend Gehrels, Amsterdam, the Netherlands. // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_CLUSTER_EXITS_HPP #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_CLUSTER_EXITS_HPP #include <boost/geometry/core/access.hpp> #include <boost/geometry/core/assert.hpp> #include <boost/geometry/util/condition.hpp> #include <boost/geometry/algorithms/detail/overlay/overlay_type.hpp> #include <boost/geometry/algorithms/detail/signed_size_type.hpp> #include <cstddef> #include <set> #include <vector> #include <boost/range.hpp> #if defined(BOOST_GEOMETRY_DEBUG_INTERSECTION) \ || defined(BOOST_GEOMETRY_OVERLAY_REPORT_WKT) \ || defined(BOOST_GEOMETRY_DEBUG_TRAVERSE) # include <string> # include <boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp> # include <boost/geometry/io/wkt/wkt.hpp> #endif namespace boost { namespace geometry { #ifndef DOXYGEN_NO_DETAIL namespace detail { namespace overlay { // Structure to check relatively simple cluster cases template <overlay_type OverlayType, typename Turns, typename Sbs> struct cluster_exits { private : static const operation_type target_operation = operation_from_overlay<OverlayType>::value; typedef typename boost::range_value<Turns>::type turn_type; typedef typename turn_type::turn_operation_type turn_operation_type; struct linked_turn_op_info { explicit linked_turn_op_info(signed_size_type ti = -1, int oi = -1, signed_size_type nti = -1) : turn_index(ti) , op_index(oi) , next_turn_index(nti) , rank_index(-1) {} signed_size_type turn_index; int op_index; signed_size_type next_turn_index; signed_size_type rank_index; }; typedef typename std::vector<linked_turn_op_info>::const_iterator const_it_type; typedef typename std::vector<linked_turn_op_info>::iterator it_type; typedef typename std::set<signed_size_type>::const_iterator sit_type; inline signed_size_type get_rank(Sbs const& sbs, linked_turn_op_info const& info) const { for (std::size_t i = 0; i < sbs.m_ranked_points.size(); i++) { typename Sbs::rp const& rp = sbs.m_ranked_points[i]; if (rp.turn_index == info.turn_index && rp.operation_index == info.op_index && rp.direction == sort_by_side::dir_to) { return rp.rank; } } return -1; } std::set<signed_size_type> const& m_ids; std::vector<linked_turn_op_info> possibilities; std::vector<linked_turn_op_info> blocked; bool m_valid; bool collect(Turns const& turns) { for (sit_type it = m_ids.begin(); it != m_ids.end(); ++it) { signed_size_type cluster_turn_index = *it; turn_type const& cluster_turn = turns[cluster_turn_index]; if (cluster_turn.discarded) { continue; } if (cluster_turn.both(target_operation)) { // Not (yet) supported, can be cluster of u/u turns return false; } for (int i = 0; i < 2; i++) { turn_operation_type const& op = cluster_turn.operations[i]; turn_operation_type const& other_op = cluster_turn.operations[1 - i]; signed_size_type const ni = op.enriched.get_next_turn_index(); if (op.operation == target_operation || op.operation == operation_continue) { if (ni == cluster_turn_index) { // Not (yet) supported, traveling to itself, can be // hole return false; } possibilities.push_back( linked_turn_op_info(cluster_turn_index, i, ni)); } else if (op.operation == operation_blocked && ! (ni == other_op.enriched.get_next_turn_index()) && m_ids.count(ni) == 0) { // Points to turn, not part of this cluster, // and that way is blocked. But if the other operation // points at the same turn, it is still fine. blocked.push_back( linked_turn_op_info(cluster_turn_index, i, ni)); } } } return true; } bool check_blocked(Sbs const& sbs) { if (blocked.empty()) { return true; } for (it_type it = possibilities.begin(); it != possibilities.end(); ++it) { linked_turn_op_info& info = *it; info.rank_index = get_rank(sbs, info); } for (it_type it = blocked.begin(); it != blocked.end(); ++it) { linked_turn_op_info& info = *it; info.rank_index = get_rank(sbs, info); } for (const_it_type it = possibilities.begin(); it != possibilities.end(); ++it) { linked_turn_op_info const& lti = *it; for (const_it_type bit = blocked.begin(); bit != blocked.end(); ++bit) { linked_turn_op_info const& blti = *bit; if (blti.next_turn_index == lti.next_turn_index && blti.rank_index == lti.rank_index) { return false; } } } return true; } public : cluster_exits(Turns const& turns, std::set<signed_size_type> const& ids, Sbs const& sbs) : m_ids(ids) , m_valid(collect(turns) && check_blocked(sbs)) { } inline bool apply(signed_size_type& turn_index, int& op_index, bool first_run = true) const { if (! m_valid) { return false; } // Traversal can either enter the cluster in the first turn, // or it can start halfway. // If there is one (and only one) possibility pointing outside // the cluster, take that one. linked_turn_op_info target; for (const_it_type it = possibilities.begin(); it != possibilities.end(); ++it) { linked_turn_op_info const& lti = *it; if (m_ids.count(lti.next_turn_index) == 0) { if (target.turn_index >= 0 && target.next_turn_index != lti.next_turn_index) { // Points to different target return false; } if (first_run && BOOST_GEOMETRY_CONDITION(OverlayType == overlay_buffer) && target.turn_index >= 0) { // Target already assigned, so there are more targets // or more ways to the same target return false; } target = lti; } } if (target.turn_index < 0) { return false; } turn_index = target.turn_index; op_index = target.op_index; return true; } }; }} // namespace detail::overlay #endif // DOXYGEN_NO_DETAIL }} // namespace boost::geometry #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_OVERLAY_CLUSTER_EXITS_HPP
Save
cmd:
run