diff --git a/headers/os/interface/Shape.h b/headers/os/interface/Shape.h index c675ae8213..faa58f12d9 100644 --- a/headers/os/interface/Shape.h +++ b/headers/os/interface/Shape.h @@ -50,6 +50,9 @@ class BShape : public BArchivable { public: BShape(); BShape(const BShape& other); +#if defined(__cplusplus) && __cplusplus >= 201103L + BShape(BShape&& other); +#endif BShape(BMessage* archive); virtual ~BShape(); @@ -58,11 +61,15 @@ public: bool deep = true) const; BShape& operator=(const BShape& other); +#if defined(__cplusplus) && __cplusplus >= 201103L + BShape& operator=(BShape&& other); +#endif bool operator==(const BShape& other) const; bool operator!=(const BShape& other) const; void Clear(); + void MoveFrom(BShape& other); BRect Bounds() const; BPoint CurrentPosition() const; diff --git a/src/kits/interface/Shape.cpp b/src/kits/interface/Shape.cpp index 903715db7b..60b6406623 100644 --- a/src/kits/interface/Shape.cpp +++ b/src/kits/interface/Shape.cpp @@ -143,6 +143,15 @@ BShape::BShape(const BShape& other) } +#if defined(__cplusplus) && __cplusplus >= 201103L +BShape::BShape(BShape&& other) +{ + InitData(); + MoveFrom(other); +} +#endif + + BShape::BShape(BMessage* archive) : BArchivable(archive) @@ -250,6 +259,17 @@ BShape::operator=(const BShape& other) } +#if defined(__cplusplus) && __cplusplus >= 201103L +BShape& +BShape::operator=(BShape&& other) +{ + MoveFrom(other); + + return *this; +} +#endif + + bool BShape::operator==(const BShape& other) const { @@ -303,6 +323,20 @@ BShape::Clear() } +void +BShape::MoveFrom(BShape& other) +{ + fState = other.fState; + fBuildingOp = other.fBuildingOp; + + shape_data* data = (shape_data*)fPrivateData; + fPrivateData = other.fPrivateData; + other.fPrivateData = data; + + other.Clear(); +} + + BRect BShape::Bounds() const {