You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.6 KiB
81 lines
1.6 KiB
#pragma once |
|
/** |
|
* @brief std::unique_ptr specializations for SDL types. |
|
*/ |
|
|
|
#include <memory> |
|
#include <type_traits> |
|
|
|
#include <SDL.h> |
|
#ifdef USE_SDL1 |
|
#include "utils/sdl2_to_1_2_backports.h" |
|
#else |
|
#include "utils/sdl2_backports.h" |
|
#endif |
|
|
|
namespace devilution { |
|
|
|
/** |
|
* @brief Deletes the SDL surface using `SDL_FreeSurface`. |
|
*/ |
|
struct SDLSurfaceDeleter { |
|
void operator()(SDL_Surface *surface) const |
|
{ |
|
SDL_FreeSurface(surface); |
|
} |
|
}; |
|
|
|
using SDLSurfaceUniquePtr = std::unique_ptr<SDL_Surface, SDLSurfaceDeleter>; |
|
|
|
#if SDL_VERSION_ATLEAST(2, 0, 0) |
|
struct SDLCursorDeleter { |
|
void operator()(SDL_Cursor *cursor) const |
|
{ |
|
SDL_FreeCursor(cursor); |
|
} |
|
}; |
|
|
|
using SDLCursorUniquePtr = std::unique_ptr<SDL_Cursor, SDLCursorDeleter>; |
|
#endif |
|
|
|
#ifndef USE_SDL1 |
|
struct SDLTextureDeleter { |
|
void operator()(SDL_Texture *texture) const |
|
{ |
|
SDL_DestroyTexture(texture); |
|
} |
|
}; |
|
|
|
using SDLTextureUniquePtr = std::unique_ptr<SDL_Texture, SDLTextureDeleter>; |
|
#endif |
|
|
|
struct SDLPaletteDeleter { |
|
void operator()(SDL_Palette *palette) const |
|
{ |
|
SDL_FreePalette(palette); |
|
} |
|
}; |
|
|
|
using SDLPaletteUniquePtr = std::unique_ptr<SDL_Palette, SDLPaletteDeleter>; |
|
|
|
/** |
|
* @brief Deletes the object using `SDL_free`. |
|
*/ |
|
template <typename T> |
|
struct SDLFreeDeleter { |
|
static_assert(!std::is_same<T, SDL_Surface>::value, |
|
"SDL_Surface should use SDLSurfaceUniquePtr instead."); |
|
|
|
void operator()(T *obj) const |
|
{ |
|
SDL_free(obj); |
|
} |
|
}; |
|
|
|
/** |
|
* @brief A unique pointer to T that is deleted with SDL_free. |
|
*/ |
|
template <typename T> |
|
using SDLUniquePtr = std::unique_ptr<T, SDLFreeDeleter<T>>; |
|
|
|
} // namespace devilution
|
|
|