I have an SDL_Wrapper which is working perfectly (it is not broken)! Please suggest how I could improve performance, and how I could make my unique_ptr(s) dispose automatically.
So far, I call my class like this:
CWindow window = std::make_unique<CWindowWrap>("title", 0, 0, 140, 100, 0)
Is it the best way to do it? Will my unique_ptr dispose automatically?
Here's the SDL_Wrapper class:
#include "LogManager.h"
#include <memory>
#include <SDL.h>
//SDL_Renderer wrapper
////SDL_Window wrapper !
class CWindowWrap
{
public:
CWindowWrap(const char* title, int xpos, int ypos, int width, int height, int flags)
: ptr_window(SDL_CreateWindow(title, xpos, ypos, width, height, flags))
{
LOG("SDL_Window Wrapper", "Constructed Window !");
}
virtual ~CWindowWrap()
{
if (ptr_window != nullptr){
SDL_DestroyWindow(ptr_window);
LOG("SDL_Window Wrapper", "Destroyed Window !");
}
else
LOG("SDL_Window Wrapper", "Window doesn't need to be destroyed !");
}
//disable copy constructor
CWindowWrap(CWindowWrap const&) = delete;
CWindowWrap& operator=(CWindowWrap const&) = delete;
//allow move
CWindowWrap(CWindowWrap&& move)
: ptr_window(nullptr)
{
using std::swap;
swap(ptr_window, move.ptr_window);
}
CWindowWrap& operator=(CWindowWrap&& move){
using std::swap;
swap(ptr_window, move.ptr_window);
}
operator SDL_Window*() { return ptr_window; } // implicite conversion between CWindowWrap ---> SDL_Window*;
private:
SDL_Window* ptr_window = nullptr;
};
typedef std::unique_ptr<CWindowWrap> CWindow;
class CRendererWrap
{
public:
CRendererWrap(CWindowWrap window, int x, int y)
: ptr_renderer(SDL_CreateRenderer(window, x, y))
{}
~CRendererWrap()
{
if (ptr_renderer != nullptr){
SDL_DestroyRenderer(ptr_renderer);
}
}
//disable copy constructor
CRendererWrap(CRendererWrap const&) = delete;
CRendererWrap& operator=(CRendererWrap const&) = delete;
//allow move
CRendererWrap(CRendererWrap&& move)
: ptr_renderer(nullptr)
{
using std::swap;
swap(ptr_renderer, move.ptr_renderer);
}
CRendererWrap& operator=(CRendererWrap&& move){
using std::swap;
swap(ptr_renderer, move.ptr_renderer);
}
operator SDL_Renderer*() { return ptr_renderer; } // implicite conversion between CRendererWrap ---> SDL_Renderer*;
private:
SDL_Renderer* ptr_renderer = nullptr;
};
typedef std::unique_ptr<CRendererWrap> CRenderer;
struct Window_param
{
const char* title;
const int width;
const int height;
const int xPos;
const int yPos;
const int flags;
};