BRegion: add move construction and assignment support
GCC 2 support is also provided with `MoveFrom` method. Change-Id: Ibd062f501fdeb5538ade6c84dcafb61cff70cc32 Reviewed-on: https://review.haiku-os.org/c/haiku/+/8529 Tested-by: Commit checker robot <[email protected]> Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
@@ -29,13 +29,20 @@ public:
|
||||
BRegion();
|
||||
BRegion(const BRegion& other);
|
||||
BRegion(const BRect rect);
|
||||
#if defined(__cplusplus) && __cplusplus >= 201103L
|
||||
BRegion(BRegion&& other);
|
||||
#endif
|
||||
virtual ~BRegion();
|
||||
|
||||
BRegion& operator=(const BRegion& other);
|
||||
#if defined(__cplusplus) && __cplusplus >= 201103L
|
||||
BRegion& operator=(BRegion&& other);
|
||||
#endif
|
||||
bool operator==(const BRegion& other) const;
|
||||
|
||||
void Set(BRect rect);
|
||||
void Set(clipping_rect clipping);
|
||||
void MoveFrom(BRegion& other);
|
||||
|
||||
BRect Frame() const;
|
||||
clipping_rect FrameInt() const;
|
||||
|
||||
@@ -59,6 +59,19 @@ BRegion::BRegion(const BRect rect)
|
||||
}
|
||||
|
||||
|
||||
#if defined(__cplusplus) && __cplusplus >= 201103L
|
||||
BRegion::BRegion(BRegion&& other)
|
||||
:
|
||||
fCount(0),
|
||||
fDataSize(0),
|
||||
fBounds((clipping_rect){ 0, 0, 0, 0 }),
|
||||
fData(NULL)
|
||||
{
|
||||
MoveFrom(other);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// NOTE: private constructor
|
||||
BRegion::BRegion(const clipping_rect& clipping)
|
||||
:
|
||||
@@ -95,6 +108,17 @@ BRegion::operator=(const BRegion& other)
|
||||
}
|
||||
|
||||
|
||||
#if defined(__cplusplus) && __cplusplus >= 201103L
|
||||
BRegion&
|
||||
BRegion::operator=(BRegion&& other)
|
||||
{
|
||||
MoveFrom(other);
|
||||
|
||||
return *this;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
bool
|
||||
BRegion::operator==(const BRegion& other) const
|
||||
{
|
||||
@@ -128,6 +152,30 @@ BRegion::Set(clipping_rect clipping)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
BRegion::MoveFrom(BRegion& other)
|
||||
{
|
||||
if (other.CountRects() <= 0) {
|
||||
MakeEmpty();
|
||||
return;
|
||||
}
|
||||
if (other.CountRects() == 1) {
|
||||
Set(other.FrameInt());
|
||||
other.MakeEmpty();
|
||||
return;
|
||||
}
|
||||
fCount = other.fCount;
|
||||
fDataSize = other.fDataSize;
|
||||
fBounds = other.fBounds;
|
||||
fData = other.fData;
|
||||
|
||||
other.fCount = 0;
|
||||
other.fDataSize = 0;
|
||||
other.fBounds = (clipping_rect){ 0, 0, 0, 0 };
|
||||
other.fData = NULL;
|
||||
}
|
||||
|
||||
|
||||
BRect
|
||||
BRegion::Frame() const
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user