1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2023 Google LLC 2*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. 3*c8dee2aaSAndroid Build Coastguard Worker 4*c8dee2aaSAndroid Build Coastguard Worker #ifndef EventQueue_DEFINED 5*c8dee2aaSAndroid Build Coastguard Worker #define EventQueue_DEFINED 6*c8dee2aaSAndroid Build Coastguard Worker 7*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h" 8*c8dee2aaSAndroid Build Coastguard Worker #include "modules/bentleyottmann/include/EventQueueInterface.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "modules/bentleyottmann/include/Point.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "modules/bentleyottmann/include/Segment.h" 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker #include <optional> 13*c8dee2aaSAndroid Build Coastguard Worker #include <set> 14*c8dee2aaSAndroid Build Coastguard Worker #include <tuple> 15*c8dee2aaSAndroid Build Coastguard Worker #include <variant> 16*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker namespace bentleyottmann { 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker struct Lower { 21*c8dee2aaSAndroid Build Coastguard Worker // All Lowers are equal. 22*c8dee2aaSAndroid Build Coastguard Worker friend bool operator< (const Lower&, const Lower&) { 23*c8dee2aaSAndroid Build Coastguard Worker return false; 24*c8dee2aaSAndroid Build Coastguard Worker } 25*c8dee2aaSAndroid Build Coastguard Worker }; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker struct Upper { 28*c8dee2aaSAndroid Build Coastguard Worker Segment s; 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker // Arbitrary comparison for queue uniqueness. 31*c8dee2aaSAndroid Build Coastguard Worker friend bool operator< (const Upper& u0, const Upper& u1) { 32*c8dee2aaSAndroid Build Coastguard Worker return std::tie(u0.s.p0, u0.s.p1) < std::tie(u1.s.p0, u1.s.p1); 33*c8dee2aaSAndroid Build Coastguard Worker } 34*c8dee2aaSAndroid Build Coastguard Worker }; 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker struct Cross { 37*c8dee2aaSAndroid Build Coastguard Worker Segment s0; 38*c8dee2aaSAndroid Build Coastguard Worker Segment s1; 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker // Arbitrary comparison for queue uniqueness. 41*c8dee2aaSAndroid Build Coastguard Worker friend bool operator< (const Cross& c0, const Cross& c1) { 42*c8dee2aaSAndroid Build Coastguard Worker return std::tie(c0.s0.p0, c0.s0.p1, c0.s1.p0, c0.s1.p1) < 43*c8dee2aaSAndroid Build Coastguard Worker std::tie(c1.s0.p0, c1.s0.p1, c1.s1.p0, c1.s1.p1); 44*c8dee2aaSAndroid Build Coastguard Worker } 45*c8dee2aaSAndroid Build Coastguard Worker }; 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard Worker using EventType = std::variant<Lower, Cross, Upper>; 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker struct Event { 50*c8dee2aaSAndroid Build Coastguard Worker Point where; 51*c8dee2aaSAndroid Build Coastguard Worker EventType type; 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker friend bool operator< (const Event& e0, const Event& e1) { 54*c8dee2aaSAndroid Build Coastguard Worker return std::tie(e0.where, e0.type) < std::tie(e1.where, e1.type); 55*c8dee2aaSAndroid Build Coastguard Worker } 56*c8dee2aaSAndroid Build Coastguard Worker }; 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker class EventQueue : public EventQueueInterface { 59*c8dee2aaSAndroid Build Coastguard Worker public: 60*c8dee2aaSAndroid Build Coastguard Worker // Queue ordered by Event where the point is the most important followed by type and then 61*c8dee2aaSAndroid Build Coastguard Worker // contents of the event. The ordering of the contents of the event is arbitrary but need to 62*c8dee2aaSAndroid Build Coastguard Worker // enforce uniqueness of the events in the queue. 63*c8dee2aaSAndroid Build Coastguard Worker using Queue = std::set<Event>; 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker static std::optional<EventQueue> Make(SkSpan<const Segment> segments); 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker EventQueue(Queue&& queue); 68*c8dee2aaSAndroid Build Coastguard Worker EventQueue() = default; 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker void addCrossing(Point crossingPoint, const Segment& s0, const Segment& s1) override; 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker bool hasMoreEvents() const; 73*c8dee2aaSAndroid Build Coastguard Worker void handleNextEventPoint(SweepLineInterface* handler); 74*c8dee2aaSAndroid Build Coastguard Worker std::vector<Crossing> crossings(); 75*c8dee2aaSAndroid Build Coastguard Worker 76*c8dee2aaSAndroid Build Coastguard Worker private: 77*c8dee2aaSAndroid Build Coastguard Worker friend class EventQueueTestingPeer; 78*c8dee2aaSAndroid Build Coastguard Worker Point fLastEventPoint = Point::Smallest(); 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker void add(const Event& e); 81*c8dee2aaSAndroid Build Coastguard Worker 82*c8dee2aaSAndroid Build Coastguard Worker DeletionSegmentSet fDeletionSet; 83*c8dee2aaSAndroid Build Coastguard Worker InsertionSegmentSet fInsertionSet; 84*c8dee2aaSAndroid Build Coastguard Worker Queue fQueue; 85*c8dee2aaSAndroid Build Coastguard Worker std::vector<Crossing> fCrossings; 86*c8dee2aaSAndroid Build Coastguard Worker }; 87*c8dee2aaSAndroid Build Coastguard Worker } // namespace bentleyottmann 88*c8dee2aaSAndroid Build Coastguard Worker #endif // EventQueue_DEFINED 89