mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Add more checks to IntervalMapOverlaps::advance() to ensure that advanceTo sees
monotonic keys. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122093 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -2040,6 +2040,21 @@ class IntervalMapOverlaps { | |||||||
|   void advance() { |   void advance() { | ||||||
|     if (!valid()) |     if (!valid()) | ||||||
|       return; |       return; | ||||||
|  |  | ||||||
|  |     if (Traits::stopLess(posA.stop(), posB.start())) { | ||||||
|  |       // A ends before B begins. Catch up. | ||||||
|  |       posA.advanceTo(posB.start()); | ||||||
|  |       if (!posA.valid() || !Traits::stopLess(posB.stop(), posA.start())) | ||||||
|  |         return; | ||||||
|  |     } else if (Traits::stopLess(posB.stop(), posA.start())) { | ||||||
|  |       // B ends before A begins. Catch up. | ||||||
|  |       posB.advanceTo(posA.start()); | ||||||
|  |       if (!posB.valid() || !Traits::stopLess(posA.stop(), posB.start())) | ||||||
|  |         return; | ||||||
|  |     } else | ||||||
|  |       // Already overlapping. | ||||||
|  |       return; | ||||||
|  |  | ||||||
|     for (;;) { |     for (;;) { | ||||||
|       // Make a.end > b.start. |       // Make a.end > b.start. | ||||||
|       posA.advanceTo(posB.start()); |       posA.advanceTo(posB.start()); | ||||||
| @@ -2076,7 +2091,7 @@ public: | |||||||
|     return Traits::startLess(ak, bk) ? bk : ak; |     return Traits::startLess(ak, bk) ? bk : ak; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /// stop - End of the overlaping interval. |   /// stop - End of the overlapping interval. | ||||||
|   KeyType stop() const { |   KeyType stop() const { | ||||||
|     KeyType ak = a().stop(); |     KeyType ak = a().stop(); | ||||||
|     KeyType bk = b().stop(); |     KeyType bk = b().stop(); | ||||||
| @@ -2086,20 +2101,12 @@ public: | |||||||
|   /// skipA - Move to the next overlap that doesn't involve a(). |   /// skipA - Move to the next overlap that doesn't involve a(). | ||||||
|   void skipA() { |   void skipA() { | ||||||
|     ++posA; |     ++posA; | ||||||
|     if (!posA.valid() || !Traits::stopLess(posB.stop(), posA.start())) |  | ||||||
|       return; |  | ||||||
|     // Second half-loop of advance(). |  | ||||||
|     posB.advanceTo(posA.start()); |  | ||||||
|     if (!posB.valid() || !Traits::stopLess(posA.stop(), posB.start())) |  | ||||||
|       return; |  | ||||||
|     advance(); |     advance(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /// skipB - Move to the next overlap that doesn't involve b(). |   /// skipB - Move to the next overlap that doesn't involve b(). | ||||||
|   void skipB() { |   void skipB() { | ||||||
|     ++posB; |     ++posB; | ||||||
|     if (!posB.valid() || !Traits::stopLess(posA.stop(), posB.start())) |  | ||||||
|       return; |  | ||||||
|     advance(); |     advance(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -2116,8 +2123,13 @@ public: | |||||||
|   /// advanceTo - Move to the first overlapping interval with |   /// advanceTo - Move to the first overlapping interval with | ||||||
|   /// stopLess(x, stop()). |   /// stopLess(x, stop()). | ||||||
|   void advanceTo(KeyType x) { |   void advanceTo(KeyType x) { | ||||||
|     posA.advanceTo(x); |     if (!valid()) | ||||||
|     posB.advanceTo(x); |       return; | ||||||
|  |     // Make sure advanceTo sees monotonic keys. | ||||||
|  |     if (Traits::stopLess(posA.stop(), x)) | ||||||
|  |       posA.advanceTo(x); | ||||||
|  |     if (Traits::stopLess(posB.stop(), x)) | ||||||
|  |       posB.advanceTo(x); | ||||||
|     advance(); |     advance(); | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -659,6 +659,19 @@ TEST(IntervalMapOverlapsTest, BigMaps) { | |||||||
|   ++AB; |   ++AB; | ||||||
|   EXPECT_FALSE(AB.valid()); |   EXPECT_FALSE(AB.valid()); | ||||||
|  |  | ||||||
|  |   // Test advanceTo. | ||||||
|  |   UUOverlaps AB2(mapA, mapB); | ||||||
|  |   AB2.advanceTo(410); | ||||||
|  |   ASSERT_TRUE(AB2.valid()); | ||||||
|  |   EXPECT_EQ(410u, AB2.a().start()); | ||||||
|  |   EXPECT_EQ(402u, AB2.b().start()); | ||||||
|  |  | ||||||
|  |   // It is valid to advanceTo with any monotonic sequence. | ||||||
|  |   AB2.advanceTo(411); | ||||||
|  |   ASSERT_TRUE(AB2.valid()); | ||||||
|  |   EXPECT_EQ(410u, AB2.a().start()); | ||||||
|  |   EXPECT_EQ(402u, AB2.b().start()); | ||||||
|  |  | ||||||
|   // Check reversed maps. |   // Check reversed maps. | ||||||
|   UUOverlaps BA(mapB, mapA); |   UUOverlaps BA(mapB, mapA); | ||||||
|   ASSERT_TRUE(BA.valid()); |   ASSERT_TRUE(BA.valid()); | ||||||
| @@ -686,6 +699,18 @@ TEST(IntervalMapOverlapsTest, BigMaps) { | |||||||
|   EXPECT_EQ(600u, BA.a().start()); |   EXPECT_EQ(600u, BA.a().start()); | ||||||
|   ++BA; |   ++BA; | ||||||
|   EXPECT_FALSE(BA.valid()); |   EXPECT_FALSE(BA.valid()); | ||||||
|  |  | ||||||
|  |   // Test advanceTo. | ||||||
|  |   UUOverlaps BA2(mapB, mapA); | ||||||
|  |   BA2.advanceTo(410); | ||||||
|  |   ASSERT_TRUE(BA2.valid()); | ||||||
|  |   EXPECT_EQ(410u, BA2.b().start()); | ||||||
|  |   EXPECT_EQ(402u, BA2.a().start()); | ||||||
|  |  | ||||||
|  |   BA2.advanceTo(411); | ||||||
|  |   ASSERT_TRUE(BA2.valid()); | ||||||
|  |   EXPECT_EQ(410u, BA2.b().start()); | ||||||
|  |   EXPECT_EQ(402u, BA2.a().start()); | ||||||
| } | } | ||||||
|  |  | ||||||
| } // namespace | } // namespace | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user