#pragma once /** * @brief std::unique_ptr specializations for SDL types. */ #include #include #include 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; #if SDL_VERSION_ATLEAST(2, 0, 0) struct SDLCursorDeleter { void operator()(SDL_Cursor *cursor) const { SDL_FreeCursor(cursor); } }; using SDLCursorUniquePtr = std::unique_ptr; #endif /** * @brief Deletes the object using `SDL_free`. */ template struct SDLFreeDeleter { static_assert(!std::is_same::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 using SDLUniquePtr = std::unique_ptr>; } // namespace devilution