Add mutating Union method

This commit is contained in:
Dmitry Marakasov 2015-01-19 19:51:43 +03:00
parent 2e3f6bbeb2
commit 0de09713c9
3 changed files with 27 additions and 0 deletions

View File

@ -159,6 +159,18 @@ Rect Rect::GetUnion(const Rect& rect) const {
);
}
Rect& Rect::Union(const Rect& rect) {
int nx = std::min(x, rect.x);
int ny = std::min(y, rect.y);
int nx2 = std::max(GetX2(), rect.GetX2());
int ny2 = std::max(GetY2(), rect.GetY2());
x = nx;
y = ny;
SetX2(nx2);
SetY2(ny2);
return *this;
}
Optional<Rect> Rect::GetIntersection(const Rect& rect) const {
if (!Intersects(rect))
return NullOpt;

View File

@ -336,6 +336,16 @@ public:
////////////////////////////////////////////////////////////
Rect GetUnion(const Rect& rect) const;
////////////////////////////////////////////////////////////
/// \brief Union rect with another rect
///
/// \param[in] rect Rect to union with
///
/// \returns Reference to self
///
////////////////////////////////////////////////////////////
Rect& Union(const Rect& rect);
////////////////////////////////////////////////////////////
/// \brief Calculate intersection with another rect
///

View File

@ -233,6 +233,11 @@ BEGIN_TEST()
EXPECT_TRUE(Rect(30, 20, 1, 1).GetUnion(Rect(10, 40, 1, 1)) == Rect::FromCorners(10, 20, 30, 40));
EXPECT_TRUE(Rect(10, 40, 1, 1).GetUnion(Rect(30, 20, 1, 1)) == Rect::FromCorners(10, 20, 30, 40));
EXPECT_TRUE(Rect(30, 40, 1, 1).GetUnion(Rect(10, 20, 1, 1)) == Rect::FromCorners(10, 20, 30, 40));
EXPECT_TRUE(Rect(10, 20, 1, 1).Union(Rect(30, 40, 1, 1)) == Rect::FromCorners(10, 20, 30, 40));
EXPECT_TRUE(Rect(30, 20, 1, 1).Union(Rect(10, 40, 1, 1)) == Rect::FromCorners(10, 20, 30, 40));
EXPECT_TRUE(Rect(10, 40, 1, 1).Union(Rect(30, 20, 1, 1)) == Rect::FromCorners(10, 20, 30, 40));
EXPECT_TRUE(Rect(30, 40, 1, 1).Union(Rect(10, 20, 1, 1)) == Rect::FromCorners(10, 20, 30, 40));
}
{