Memory: ExtractFromMemory returns a boost::optional<T>

This commit is contained in:
MerryMage 2016-01-26 00:01:37 +00:00
parent 5973712410
commit 3e75de6006
2 changed files with 11 additions and 11 deletions

View File

@ -195,13 +195,11 @@ static VAddr GetCurrentBase() {
static std::array<u16, NUM_CHANNELS> syncs;
static ChannelContext GetChannelContext(VAddr base, int channel_id) {
ChannelContext ctx;
if (!Memory::ExtractFromMemory(DspAddrToVAddr(base, DSPADDR1) + channel_id * sizeof(ChannelContext), ctx)) {
auto ret = Memory::ExtractFromMemory<ChannelContext>(DspAddrToVAddr(base, DSPADDR1) + channel_id * sizeof(ChannelContext));
if (!ret) {
LOG_CRITICAL(Service_DSP, "ExtractFromMemory for DSPADDR1 failed");
}
return ctx;
return *ret;
}
static void SetChannelContext(VAddr base, int channel_id, const ChannelContext& ctx) {
@ -224,12 +222,12 @@ static void ReadChannelContext(VAddr current_base, int channel_id) {
if (TestAndUnsetBit<2>(ctx.dirty)) {
// Update ADPCM coefficients
AdpcmCoefficients coeff;
if (!Memory::ExtractFromMemory(DspAddrToVAddr(current_base, DSPADDR3) + channel_id * sizeof(coeff), coeff)) {
auto coeff = Memory::ExtractFromMemory<AdpcmCoefficients>(DspAddrToVAddr(current_base, DSPADDR3) + channel_id * sizeof(AdpcmCoefficients));
if (!coeff) {
LOG_CRITICAL(Service_DSP, "ExtractFromMemory for DSPADDR3 failed");
return;
}
Audio::UpdateAdpcm(channel_id, coeff.coeff);
Audio::UpdateAdpcm(channel_id, coeff->coeff);
}
if (TestAndUnsetBit<17>(ctx.dirty)) {

View File

@ -4,6 +4,7 @@
#pragma once
#include <boost/optional.hpp>
#include <cstddef>
#include "common/common_types.h"
@ -134,16 +135,17 @@ u8* GetPointer(VAddr virtual_address);
* Extracts a POD type from memory. Returns false if address is invalid.
*/
template <typename T>
bool ExtractFromMemory(VAddr address, T& object) {
boost::optional<T> ExtractFromMemory(VAddr address) {
static_assert(std::is_standard_layout<T>::value, "Type must have standard layout");
const u8* memory = GetPointer(address);
if (!memory) {
return false;
return {};
}
T object;
std::memcpy(&object, memory, sizeof(T));
return true;
return boost::make_optional(object);
}
/**