mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Use unique_ptr to manage drivers.
parent
c3457cd4c0
commit
d95422561b
|
@ -139,20 +139,18 @@ bool DriverFactoryBase::SelectDriverImpl(const std::string &name, Driver::Type t
|
|||
FioFOpenFile(HWACCELERATION_TEST_FILE, "w", BASE_DIR);
|
||||
}
|
||||
|
||||
Driver *oldd = *GetActiveDriver(type);
|
||||
Driver *newd = d->CreateInstance();
|
||||
*GetActiveDriver(type) = newd;
|
||||
/* Keep old driver in case we need to switch back, or may still need to process an OS callback. */
|
||||
auto oldd = std::move(GetActiveDriver(type));
|
||||
GetActiveDriver(type) = d->CreateInstance();
|
||||
|
||||
auto err = newd->Start({});
|
||||
auto err = GetActiveDriver(type)->Start({});
|
||||
if (!err) {
|
||||
Debug(driver, 1, "Successfully probed {} driver '{}'", GetDriverTypeName(type), d->name);
|
||||
delete oldd;
|
||||
return true;
|
||||
}
|
||||
|
||||
*GetActiveDriver(type) = oldd;
|
||||
GetActiveDriver(type) = std::move(oldd);
|
||||
Debug(driver, 1, "Probing {} driver '{}' failed with error: {}", GetDriverTypeName(type), d->name, *err);
|
||||
delete newd;
|
||||
|
||||
if (type == Driver::DT_VIDEO && _video_hw_accel && d->UsesHardwareAcceleration()) {
|
||||
_video_hw_accel = false;
|
||||
|
@ -185,17 +183,14 @@ bool DriverFactoryBase::SelectDriverImpl(const std::string &name, Driver::Type t
|
|||
if (!StrEqualsIgnoreCase(dname, d->name)) continue;
|
||||
|
||||
/* Found our driver, let's try it */
|
||||
Driver *newd = d->CreateInstance();
|
||||
|
||||
auto newd = d->CreateInstance();
|
||||
auto err = newd->Start(parms);
|
||||
if (err) {
|
||||
delete newd;
|
||||
UserError("Unable to load driver '{}'. The error was: {}", d->name, *err);
|
||||
}
|
||||
|
||||
Debug(driver, 1, "Successfully loaded {} driver '{}'", GetDriverTypeName(type), d->name);
|
||||
delete *GetActiveDriver(type);
|
||||
*GetActiveDriver(type) = newd;
|
||||
GetActiveDriver(type) = std::move(newd);
|
||||
return true;
|
||||
}
|
||||
UserError("No such {} driver: {}\n", GetDriverTypeName(type), dname);
|
||||
|
|
10
src/driver.h
10
src/driver.h
|
@ -81,10 +81,10 @@ private:
|
|||
* @param type The type to get the driver for.
|
||||
* @return The active driver.
|
||||
*/
|
||||
static Driver **GetActiveDriver(Driver::Type type)
|
||||
static std::unique_ptr<Driver> &GetActiveDriver(Driver::Type type)
|
||||
{
|
||||
static Driver *s_driver[3] = { nullptr, nullptr, nullptr };
|
||||
return &s_driver[type];
|
||||
static std::array<std::unique_ptr<Driver>, Driver::DT_END> s_driver{};
|
||||
return s_driver[type];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -123,7 +123,7 @@ public:
|
|||
static void ShutdownDrivers()
|
||||
{
|
||||
for (Driver::Type dt = Driver::DT_BEGIN; dt < Driver::DT_END; dt++) {
|
||||
Driver *driver = *GetActiveDriver(dt);
|
||||
auto &driver = GetActiveDriver(dt);
|
||||
if (driver != nullptr) driver->Stop();
|
||||
}
|
||||
}
|
||||
|
@ -144,7 +144,7 @@ public:
|
|||
* Create an instance of this driver-class.
|
||||
* @return The instance.
|
||||
*/
|
||||
virtual Driver *CreateInstance() const = 0;
|
||||
virtual std::unique_ptr<Driver> CreateInstance() const = 0;
|
||||
};
|
||||
|
||||
#endif /* DRIVER_H */
|
||||
|
|
|
@ -41,7 +41,7 @@ public:
|
|||
static const int PRIORITY = 2;
|
||||
#endif
|
||||
FMusicDriver_Allegro() : DriverFactoryBase(Driver::DT_MUSIC, PRIORITY, "allegro", "Allegro MIDI Driver") {}
|
||||
Driver *CreateInstance() const override { return new MusicDriver_Allegro(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_Allegro>(); }
|
||||
};
|
||||
|
||||
#endif /* MUSIC_ALLEGRO_H */
|
||||
|
|
|
@ -41,7 +41,7 @@ private:
|
|||
class FMusicDriver_BeMidi : public DriverFactoryBase {
|
||||
public:
|
||||
FMusicDriver_BeMidi() : DriverFactoryBase(Driver::DT_MUSIC, 10, "bemidi", "BeOS MIDI Driver") {}
|
||||
Driver *CreateInstance() const override { return new MusicDriver_BeMidi(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_BeMidi>(); }
|
||||
};
|
||||
|
||||
#endif /* MUSIC_BEMIDI_H */
|
||||
|
|
|
@ -31,7 +31,7 @@ public:
|
|||
class FMusicDriver_Cocoa : public DriverFactoryBase {
|
||||
public:
|
||||
FMusicDriver_Cocoa() : DriverFactoryBase(Driver::DT_MUSIC, 10, "cocoa", "Cocoa MIDI Driver") {}
|
||||
Driver *CreateInstance() const override { return new MusicDriver_Cocoa(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_Cocoa>(); }
|
||||
};
|
||||
|
||||
#endif /* MUSIC_MACOSX_COCOA_H */
|
||||
|
|
|
@ -35,7 +35,7 @@ public:
|
|||
class FMusicDriver_DMusic : public DriverFactoryBase {
|
||||
public:
|
||||
FMusicDriver_DMusic() : DriverFactoryBase(Driver::DT_MUSIC, 10, "dmusic", "DirectMusic MIDI Driver") {}
|
||||
Driver *CreateInstance() const override { return new MusicDriver_DMusic(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_DMusic>(); }
|
||||
};
|
||||
|
||||
#endif /* MUSIC_DMUSIC_H */
|
||||
|
|
|
@ -39,7 +39,7 @@ public:
|
|||
class FMusicDriver_ExtMidi : public DriverFactoryBase {
|
||||
public:
|
||||
FMusicDriver_ExtMidi() : DriverFactoryBase(Driver::DT_MUSIC, 3, "extmidi", "External MIDI Driver") {}
|
||||
Driver *CreateInstance() const override { return new MusicDriver_ExtMidi(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_ExtMidi>(); }
|
||||
};
|
||||
|
||||
#endif /* MUSIC_EXTERNAL_H */
|
||||
|
|
|
@ -33,7 +33,7 @@ public:
|
|||
class FMusicDriver_FluidSynth : public DriverFactoryBase {
|
||||
public:
|
||||
FMusicDriver_FluidSynth() : DriverFactoryBase(Driver::DT_MUSIC, 5, "fluidsynth", "FluidSynth MIDI Driver") {}
|
||||
Driver *CreateInstance() const override { return new MusicDriver_FluidSynth(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_FluidSynth>(); }
|
||||
};
|
||||
|
||||
#endif /* MUSIC_FLUIDSYNTH_H */
|
||||
|
|
|
@ -45,7 +45,7 @@ public:
|
|||
*/
|
||||
static MusicDriver *GetInstance()
|
||||
{
|
||||
return static_cast<MusicDriver*>(*DriverFactoryBase::GetActiveDriver(Driver::DT_MUSIC));
|
||||
return static_cast<MusicDriver *>(DriverFactoryBase::GetActiveDriver(Driver::DT_MUSIC).get());
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ public:
|
|||
class FMusicDriver_Null : public DriverFactoryBase {
|
||||
public:
|
||||
FMusicDriver_Null() : DriverFactoryBase(Driver::DT_MUSIC, 1, "null", "Null Music Driver") {}
|
||||
Driver *CreateInstance() const override { return new MusicDriver_Null(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_Null>(); }
|
||||
};
|
||||
|
||||
#endif /* MUSIC_NULL_H */
|
||||
|
|
|
@ -33,7 +33,7 @@ public:
|
|||
class FMusicDriver_Win32 : public DriverFactoryBase {
|
||||
public:
|
||||
FMusicDriver_Win32() : DriverFactoryBase(Driver::DT_MUSIC, 5, "win32", "Win32 Music Driver") {}
|
||||
Driver *CreateInstance() const override { return new MusicDriver_Win32(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<MusicDriver_Win32>(); }
|
||||
};
|
||||
|
||||
#endif /* MUSIC_WIN32_H */
|
||||
|
|
|
@ -27,7 +27,7 @@ public:
|
|||
class FSoundDriver_Allegro : public DriverFactoryBase {
|
||||
public:
|
||||
FSoundDriver_Allegro() : DriverFactoryBase(Driver::DT_SOUND, 4, "allegro", "Allegro Sound Driver (param hz,samples)") {}
|
||||
Driver *CreateInstance() const override { return new SoundDriver_Allegro(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_Allegro>(); }
|
||||
};
|
||||
|
||||
#endif /* SOUND_ALLEGRO_H */
|
||||
|
|
|
@ -23,7 +23,7 @@ public:
|
|||
class FSoundDriver_Cocoa : public DriverFactoryBase {
|
||||
public:
|
||||
FSoundDriver_Cocoa() : DriverFactoryBase(Driver::DT_SOUND, 10, "cocoa", "Cocoa Sound Driver (param hz)") {}
|
||||
Driver *CreateInstance() const override { return new SoundDriver_Cocoa(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_Cocoa>(); }
|
||||
};
|
||||
|
||||
#endif /* SOUND_COCOA_H */
|
||||
|
|
|
@ -26,7 +26,7 @@ public:
|
|||
class FSoundDriver_Null : public DriverFactoryBase {
|
||||
public:
|
||||
FSoundDriver_Null() : DriverFactoryBase(Driver::DT_SOUND, 1, "null", "Null Sound Driver") {}
|
||||
Driver *CreateInstance() const override { return new SoundDriver_Null(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_Null>(); }
|
||||
};
|
||||
|
||||
#endif /* SOUND_NULL_H */
|
||||
|
|
|
@ -25,7 +25,7 @@ public:
|
|||
class FSoundDriver_SDL : public DriverFactoryBase {
|
||||
public:
|
||||
FSoundDriver_SDL() : DriverFactoryBase(Driver::DT_SOUND, 5, "sdl", "SDL Sound Driver (param hz,samples)") {}
|
||||
Driver *CreateInstance() const override { return new SoundDriver_SDL(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_SDL>(); }
|
||||
};
|
||||
|
||||
#endif /* SOUND_SDL_H */
|
||||
|
|
|
@ -34,7 +34,7 @@ public:
|
|||
*/
|
||||
static SoundDriver *GetInstance()
|
||||
{
|
||||
return static_cast<SoundDriver*>(*DriverFactoryBase::GetActiveDriver(Driver::DT_SOUND));
|
||||
return static_cast<SoundDriver *>(DriverFactoryBase::GetActiveDriver(Driver::DT_SOUND).get());
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ public:
|
|||
class FSoundDriver_Win32 : public DriverFactoryBase {
|
||||
public:
|
||||
FSoundDriver_Win32() : DriverFactoryBase(Driver::DT_SOUND, 9, "win32", "Win32 WaveOut Sound Driver (param hz,samples)") {}
|
||||
Driver *CreateInstance() const override { return new SoundDriver_Win32(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_Win32>(); }
|
||||
};
|
||||
|
||||
#endif /* SOUND_WIN32_H */
|
||||
|
|
|
@ -25,7 +25,7 @@ public:
|
|||
class FSoundDriver_XAudio2 : public DriverFactoryBase {
|
||||
public:
|
||||
FSoundDriver_XAudio2() : DriverFactoryBase(Driver::DT_SOUND, 10, "xaudio2", "XAudio2 Sound Driver (param hz,samples)") {}
|
||||
Driver *CreateInstance() const override { return new SoundDriver_XAudio2(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<SoundDriver_XAudio2>(); }
|
||||
};
|
||||
|
||||
#endif /* SOUND_XAUDIO2_H */
|
||||
|
|
|
@ -46,7 +46,7 @@ protected:
|
|||
class FVideoDriver_Allegro : public DriverFactoryBase {
|
||||
public:
|
||||
FVideoDriver_Allegro() : DriverFactoryBase(Driver::DT_VIDEO, 4, "allegro", "Allegro Video Driver") {}
|
||||
Driver *CreateInstance() const override { return new VideoDriver_Allegro(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Allegro>(); }
|
||||
};
|
||||
|
||||
#endif /* VIDEO_ALLEGRO_H */
|
||||
|
|
|
@ -58,7 +58,7 @@ protected:
|
|||
class FVideoDriver_CocoaOpenGL : public DriverFactoryBase {
|
||||
public:
|
||||
FVideoDriver_CocoaOpenGL() : DriverFactoryBase(Driver::DT_VIDEO, 9, "cocoa-opengl", "Cocoa OpenGL Video Driver") {}
|
||||
Driver *CreateInstance() const override { return new VideoDriver_CocoaOpenGL(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_CocoaOpenGL>(); }
|
||||
|
||||
protected:
|
||||
bool UsesHardwareAcceleration() const override { return true; }
|
||||
|
|
|
@ -129,7 +129,7 @@ protected:
|
|||
class FVideoDriver_CocoaQuartz : public DriverFactoryBase {
|
||||
public:
|
||||
FVideoDriver_CocoaQuartz() : DriverFactoryBase(Driver::DT_VIDEO, 8, "cocoa", "Cocoa Video Driver") {}
|
||||
Driver *CreateInstance() const override { return new VideoDriver_CocoaQuartz(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_CocoaQuartz>(); }
|
||||
};
|
||||
|
||||
#endif /* VIDEO_COCOA_H */
|
||||
|
|
|
@ -41,7 +41,7 @@ public:
|
|||
static const int PRIORITY = 0;
|
||||
#endif
|
||||
FVideoDriver_Dedicated() : DriverFactoryBase(Driver::DT_VIDEO, PRIORITY, "dedicated", "Dedicated Video Driver") {}
|
||||
Driver *CreateInstance() const override { return new VideoDriver_Dedicated(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Dedicated>(); }
|
||||
};
|
||||
|
||||
#endif /* VIDEO_DEDICATED_H */
|
||||
|
|
|
@ -37,7 +37,7 @@ public:
|
|||
class FVideoDriver_Null : public DriverFactoryBase {
|
||||
public:
|
||||
FVideoDriver_Null() : DriverFactoryBase(Driver::DT_VIDEO, 0, "null", "Null Video Driver") {}
|
||||
Driver *CreateInstance() const override { return new VideoDriver_Null(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Null>(); }
|
||||
};
|
||||
|
||||
#endif /* VIDEO_NULL_H */
|
||||
|
|
|
@ -33,7 +33,7 @@ private:
|
|||
class FVideoDriver_SDL_Default : public DriverFactoryBase {
|
||||
public:
|
||||
FVideoDriver_SDL_Default() : DriverFactoryBase(Driver::DT_VIDEO, 5, "sdl", "SDL Video Driver") {}
|
||||
Driver *CreateInstance() const override { return new VideoDriver_SDL_Default(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_SDL_Default>(); }
|
||||
};
|
||||
|
||||
#endif /* VIDEO_SDL2_DEFAULT_H */
|
||||
|
|
|
@ -52,7 +52,7 @@ private:
|
|||
class FVideoDriver_SDL_OpenGL : public DriverFactoryBase {
|
||||
public:
|
||||
FVideoDriver_SDL_OpenGL() : DriverFactoryBase(Driver::DT_VIDEO, 8, "sdl-opengl", "SDL OpenGL Video Driver") {}
|
||||
/* virtual */ Driver *CreateInstance() const override { return new VideoDriver_SDL_OpenGL(); }
|
||||
/* virtual */ std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_SDL_OpenGL>(); }
|
||||
|
||||
protected:
|
||||
bool UsesHardwareAcceleration() const override { return true; }
|
||||
|
|
|
@ -200,7 +200,7 @@ public:
|
|||
*/
|
||||
static VideoDriver *GetInstance()
|
||||
{
|
||||
return static_cast<VideoDriver*>(*DriverFactoryBase::GetActiveDriver(Driver::DT_VIDEO));
|
||||
return static_cast<VideoDriver *>(DriverFactoryBase::GetActiveDriver(Driver::DT_VIDEO).get());
|
||||
}
|
||||
|
||||
static std::string GetCaption();
|
||||
|
|
|
@ -110,7 +110,7 @@ public:
|
|||
class FVideoDriver_Win32GDI : public DriverFactoryBase {
|
||||
public:
|
||||
FVideoDriver_Win32GDI() : DriverFactoryBase(Driver::DT_VIDEO, 9, "win32", "Win32 GDI Video Driver") {}
|
||||
Driver *CreateInstance() const override { return new VideoDriver_Win32GDI(); }
|
||||
std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Win32GDI>(); }
|
||||
};
|
||||
|
||||
#ifdef WITH_OPENGL
|
||||
|
@ -168,7 +168,7 @@ protected:
|
|||
class FVideoDriver_Win32OpenGL : public DriverFactoryBase {
|
||||
public:
|
||||
FVideoDriver_Win32OpenGL() : DriverFactoryBase(Driver::DT_VIDEO, 10, "win32-opengl", "Win32 OpenGL Video Driver") {}
|
||||
/* virtual */ Driver *CreateInstance() const override { return new VideoDriver_Win32OpenGL(); }
|
||||
/* virtual */ std::unique_ptr<Driver> CreateInstance() const override { return std::make_unique<VideoDriver_Win32OpenGL>(); }
|
||||
|
||||
protected:
|
||||
bool UsesHardwareAcceleration() const override { return true; }
|
||||
|
|
Loading…
Reference in New Issue