diff --git a/SDL2pp/Point.cc b/SDL2pp/Point.cc index 5cdfd8a..d3c9cd1 100644 --- a/SDL2pp/Point.cc +++ b/SDL2pp/Point.cc @@ -21,56 +21,29 @@ #include -#include - #include namespace SDL2pp { -Point::Point() { +Point::Point() : valid_(false) { } Point::~Point() { } -Point::Point(int x, int y) : point_(new SDL_Point) { - point_->x = x; - point_->y = y; +Point::Point(int x, int y) : valid_(true) { + point_.x = x; + point_.y = y; } Point Point::Null() { return Point(); } -Point::Point(const Point& other) { - if (!other.point_) { - point_.reset(nullptr); - } else if (point_ != other.point_) { - point_.reset(new SDL_Point); - point_->x = other.point_->x; - point_->y = other.point_->y; - } -} - -Point::Point(Point&&) noexcept = default; - -Point& Point::operator=(const Point& other) { - if (!other.point_) { - point_.reset(nullptr); - } else if (point_ != other.point_) { - point_.reset(new SDL_Point); - point_->x = other.point_->x; - point_->y = other.point_->y; - } - return *this; -} - -Point& Point::operator=(Point&&) noexcept = default; - bool Point::operator==(const Point& other) const { - if (!point_ || !other.point_) - return point_ == other.point_; // true only if both null - return point_->x == other.point_->x && point_->y == other.point_->y; + if (!valid_ || !other.valid_) + return valid_ == other.valid_; // true only if both null + return point_.x == other.point_.x && point_.y == other.point_.y; } bool Point::operator!=(const Point& other) const { @@ -78,35 +51,35 @@ bool Point::operator!=(const Point& other) const { } SDL_Point* Point::Get() { - return point_.get(); + return &point_; } const SDL_Point* Point::Get() const { - return point_.get(); + return &point_; } bool Point::IsNull() const { - return point_ == nullptr; + return !valid_; } int Point::GetX() const { assert(!IsNull()); - return point_->x; + return point_.x; } void Point::SetX(int x) { assert(!IsNull()); - point_->x = x; + point_.x = x; } int Point::GetY() const { assert(!IsNull()); - return point_->y; + return point_.y; } void Point::SetY(int y) { assert(!IsNull()); - point_->y = y; + point_.y = y; } } diff --git a/SDL2pp/Point.hh b/SDL2pp/Point.hh index 68d67e5..31d34e9 100644 --- a/SDL2pp/Point.hh +++ b/SDL2pp/Point.hh @@ -22,25 +22,14 @@ #ifndef SDL2PP_POINT_HH #define SDL2PP_POINT_HH -#include - -#include - -// SDL 2.0.0 doesn't have a name for SDL_Point structure (only -// typedef), so we can't use forward declaration yet. This was -// fixed in later versions starting with 2.0.1 - -#if SDL_MAJOR_VERSION == 2 && SDL_MINOR_VERSION == 0 && SDL_PATCHLEVEL == 0 -# include -#else -struct SDL_Point; -#endif +#include namespace SDL2pp { class Point { private: - std::unique_ptr point_; + SDL_Point point_; + bool valid_; private: Point(); @@ -51,10 +40,10 @@ public: static Point Null(); - Point(const Point& other); - Point(Point&&) noexcept; - Point& operator=(const Point& other); - Point& operator=(Point&&) noexcept; + Point(const Point& other) noexcept = default; + Point(Point&&) noexcept = default; + Point& operator=(const Point& other) noexcept = default; + Point& operator=(Point&&) noexcept = default; bool operator==(const Point& other) const; bool operator!=(const Point& other) const; diff --git a/SDL2pp/Rect.cc b/SDL2pp/Rect.cc index c14fc26..b04a7d1 100644 --- a/SDL2pp/Rect.cc +++ b/SDL2pp/Rect.cc @@ -21,63 +21,32 @@ #include -#include - #include namespace SDL2pp { -Rect::Rect() { +Rect::Rect() : valid_(false) { } Rect::~Rect() { } -Rect::Rect(int x, int y, int w, int h) : rect_(new SDL_Rect) { - rect_->x = x; - rect_->y = y; - rect_->w = w; - rect_->h = h; +Rect::Rect(int x, int y, int w, int h) : valid_(true) { + rect_.x = x; + rect_.y = y; + rect_.w = w; + rect_.h = h; } Rect Rect::Null() { return Rect(); } -Rect::Rect(const Rect& other) { - if (!other.rect_) { - rect_.reset(nullptr); - } else if (rect_ != other.rect_) { - rect_.reset(new SDL_Rect); - rect_->x = other.rect_->x; - rect_->y = other.rect_->y; - rect_->w = other.rect_->w; - rect_->h = other.rect_->h; - } -} - -Rect::Rect(Rect&&) noexcept = default; - -Rect& Rect::operator=(const Rect& other) { - if (!other.rect_) { - rect_.reset(nullptr); - } else if (rect_ != other.rect_) { - rect_.reset(new SDL_Rect); - rect_->x = other.rect_->x; - rect_->y = other.rect_->y; - rect_->w = other.rect_->w; - rect_->h = other.rect_->h; - } - return *this; -} - -Rect& Rect::operator=(Rect&&) noexcept = default; - bool Rect::operator==(const Rect& other) const { - if (!rect_ || !other.rect_) - return rect_ == other.rect_; // true only if both null - return rect_->x == other.rect_->x && rect_->y == other.rect_->y && - rect_->w == other.rect_->w && rect_->h == other.rect_->h; + if (!valid_ || !other.valid_) + return valid_ == other.valid_; // true only if both null + return rect_.x == other.rect_.x && rect_.y == other.rect_.y && + rect_.w == other.rect_.w && rect_.h == other.rect_.h; } bool Rect::operator!=(const Rect& other) const { @@ -85,11 +54,11 @@ bool Rect::operator!=(const Rect& other) const { } SDL_Rect* Rect::Get() { - return rect_.get(); + return &rect_; } const SDL_Rect* Rect::Get() const { - return rect_.get(); + return &rect_; } Rect Rect::FromCenter(int cx, int cy, int w, int h) { @@ -97,67 +66,67 @@ Rect Rect::FromCenter(int cx, int cy, int w, int h) { } bool Rect::IsNull() const { - return rect_ == nullptr; + return !valid_; } int Rect::GetX() const { assert(!IsNull()); - return rect_->x; + return rect_.x; } void Rect::SetX(int x) { assert(!IsNull()); - rect_->x = x; + rect_.x = x; } int Rect::GetY() const { assert(!IsNull()); - return rect_->y; + return rect_.y; } void Rect::SetY(int y) { assert(!IsNull()); - rect_->y = y; + rect_.y = y; } int Rect::GetW() const { assert(!IsNull()); - return rect_->w; + return rect_.w; } void Rect::SetW(int w) { assert(!IsNull()); - rect_->w = w; + rect_.w = w; } int Rect::GetH() const { assert(!IsNull()); - return rect_->h; + return rect_.h; } void Rect::SetH(int h) { assert(!IsNull()); - rect_->h = h; + rect_.h = h; } int Rect::GetX2() const { assert(!IsNull()); - return rect_->x + rect_->w - 1; + return rect_.x + rect_.w - 1; } void Rect::SetX2(int x2) { assert(!IsNull()); - rect_->w = x2 - rect_->x + 1; + rect_.w = x2 - rect_.x + 1; } int Rect::GetY2() const { assert(!IsNull()); - return rect_->y + rect_->h - 1; + return rect_.y + rect_.h - 1; } void Rect::SetY2(int y2) { assert(!IsNull()); - rect_->h = y2 - rect_->y + 1; + rect_.h = y2 - rect_.y + 1; } } diff --git a/SDL2pp/Rect.hh b/SDL2pp/Rect.hh index 7c9f32f..5ada31b 100644 --- a/SDL2pp/Rect.hh +++ b/SDL2pp/Rect.hh @@ -22,7 +22,7 @@ #ifndef SDL2PP_RECT_HH #define SDL2PP_RECT_HH -#include +#include struct SDL_Rect; @@ -30,7 +30,8 @@ namespace SDL2pp { class Rect { private: - std::unique_ptr rect_; + SDL_Rect rect_; + bool valid_; private: Rect(); @@ -43,10 +44,10 @@ public: static Rect FromCenter(int cx, int cy, int w, int h); - Rect(const Rect& other); - Rect(Rect&&) noexcept; - Rect& operator=(const Rect& other); - Rect& operator=(Rect&&) noexcept; + Rect(const Rect& other) noexcept = default; + Rect(Rect&&) noexcept = default; + Rect& operator=(const Rect& other) noexcept = default; + Rect& operator=(Rect&&) noexcept = default; bool operator==(const Rect& other) const; bool operator!=(const Rect& other) const;