diff --git a/Source/Core/Core/HW/EXI_Channel.cpp b/Source/Core/Core/HW/EXI_Channel.cpp index 1af7476566..627eaacc1c 100644 --- a/Source/Core/Core/HW/EXI_Channel.cpp +++ b/Source/Core/Core/HW/EXI_Channel.cpp @@ -2,6 +2,8 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. +#include + #include "Common/ChunkFile.h" #include "Core/ConfigManager.h" #include "Core/CoreTiming.h" @@ -35,7 +37,7 @@ CEXIChannel::CEXIChannel(u32 ChannelId) : m_Status.CHIP_SELECT = 1; for (auto& device : m_pDevices) - device.reset(EXIDevice_Create(EXIDEVICE_NONE, m_ChannelId)); + device = EXIDevice_Create(EXIDEVICE_NONE, m_ChannelId); } CEXIChannel::~CEXIChannel() @@ -166,18 +168,17 @@ void CEXIChannel::RemoveDevices() void CEXIChannel::AddDevice(const TEXIDevices device_type, const int device_num) { - IEXIDevice* pNewDevice = EXIDevice_Create(device_type, m_ChannelId); - AddDevice(pNewDevice, device_num); + AddDevice(EXIDevice_Create(device_type, m_ChannelId), device_num); } -void CEXIChannel::AddDevice(IEXIDevice* pDevice, const int device_num, bool notifyPresenceChanged) +void CEXIChannel::AddDevice(std::unique_ptr device, const int device_num, bool notify_presence_changed) { _dbg_assert_(EXPANSIONINTERFACE, device_num < NUM_DEVICES); - // replace it with the new one - m_pDevices[device_num].reset(pDevice); + // Replace it with the new one + m_pDevices[device_num] = std::move(device); - if (notifyPresenceChanged) + if (notify_presence_changed) { // This means "device presence changed", software has to check // m_Status.EXT to see if it is now present or not @@ -228,27 +229,21 @@ void CEXIChannel::DoState(PointerWrap &p) p.Do(m_Control); p.Do(m_ImmData); - for (int d = 0; d < NUM_DEVICES; ++d) + for (int device_index = 0; device_index < NUM_DEVICES; ++device_index) { - IEXIDevice* pDevice = m_pDevices[d].get(); - TEXIDevices type = pDevice->m_deviceType; + std::unique_ptr& device = m_pDevices[device_index]; + TEXIDevices type = device->m_deviceType; p.Do(type); - IEXIDevice* pSaveDevice = (type == pDevice->m_deviceType) ? pDevice : EXIDevice_Create(type, m_ChannelId); - pSaveDevice->DoState(p); - if (pSaveDevice != pDevice) + + if (type == device->m_deviceType) { - // if we had to create a temporary device, discard it if we're not loading. - // also, if no movie is active, we'll assume the user wants to keep their current devices - // instead of the ones they had when the savestate was created, - // unless the device is NONE (since ChangeDevice sets that temporarily). - if (p.GetMode() != PointerWrap::MODE_READ) - { - delete pSaveDevice; - } - else - { - AddDevice(pSaveDevice, d, false); - } + device->DoState(p); + } + else + { + std::unique_ptr save_device = EXIDevice_Create(type, m_ChannelId); + save_device->DoState(p); + AddDevice(std::move(save_device), device_index, false); } } } diff --git a/Source/Core/Core/HW/EXI_Channel.h b/Source/Core/Core/HW/EXI_Channel.h index 0a41053eaf..4a512852fe 100644 --- a/Source/Core/Core/HW/EXI_Channel.h +++ b/Source/Core/Core/HW/EXI_Channel.h @@ -97,7 +97,7 @@ public: void SendTransferComplete(); void AddDevice(const TEXIDevices device_type, const int device_num); - void AddDevice(IEXIDevice* pDevice, const int device_num, bool notifyPresenceChanged = true); + void AddDevice(std::unique_ptr device, const int device_num, bool notify_presence_changed = true); // Remove all devices void RemoveDevices(); diff --git a/Source/Core/Core/HW/EXI_Device.cpp b/Source/Core/Core/HW/EXI_Device.cpp index 80fd585f36..4a660579e7 100644 --- a/Source/Core/Core/HW/EXI_Device.cpp +++ b/Source/Core/Core/HW/EXI_Device.cpp @@ -2,6 +2,8 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. +#include + #include "Common/ChunkFile.h" #include "Core/ConfigManager.h" #include "Core/Core.h" @@ -89,54 +91,54 @@ public: // F A C T O R Y -IEXIDevice* EXIDevice_Create(TEXIDevices device_type, const int channel_num) +std::unique_ptr EXIDevice_Create(TEXIDevices device_type, const int channel_num) { - IEXIDevice* result = nullptr; + std::unique_ptr result; switch (device_type) { case EXIDEVICE_DUMMY: - result = new CEXIDummy("Dummy"); + result = std::make_unique("Dummy"); break; case EXIDEVICE_MEMORYCARD: case EXIDEVICE_MEMORYCARDFOLDER: { bool gci_folder = (device_type == EXIDEVICE_MEMORYCARDFOLDER); - result = new CEXIMemoryCard(channel_num, gci_folder); + result = std::make_unique(channel_num, gci_folder); break; } case EXIDEVICE_MASKROM: - result = new CEXIIPL(); + result = std::make_unique(); break; case EXIDEVICE_AD16: - result = new CEXIAD16(); + result = std::make_unique(); break; case EXIDEVICE_MIC: - result = new CEXIMic(channel_num); + result = std::make_unique(channel_num); break; case EXIDEVICE_ETH: - result = new CEXIETHERNET(); + result = std::make_unique(); break; case EXIDEVICE_AM_BASEBOARD: - result = new CEXIAMBaseboard(); + result = std::make_unique(); break; case EXIDEVICE_GECKO: - result = new CEXIGecko(); + result = std::make_unique(); break; case EXIDEVICE_AGP: - result = new CEXIAgp(channel_num); + result = std::make_unique(channel_num); break; case EXIDEVICE_NONE: default: - result = new IEXIDevice(); + result = std::make_unique(); break; } diff --git a/Source/Core/Core/HW/EXI_Device.h b/Source/Core/Core/HW/EXI_Device.h index 4cc547f27f..156f49edac 100644 --- a/Source/Core/Core/HW/EXI_Device.h +++ b/Source/Core/Core/HW/EXI_Device.h @@ -4,6 +4,7 @@ #pragma once +#include #include "Common/CommonTypes.h" class PointerWrap; @@ -57,4 +58,4 @@ public: TEXIDevices m_deviceType; }; -IEXIDevice* EXIDevice_Create(const TEXIDevices device_type, const int channel_num); +std::unique_ptr EXIDevice_Create(const TEXIDevices device_type, const int channel_num);