GeckoCode: Provide operator== and operator!= overloads

Same thing but allows both GeckoCode and Code to be utilized directly
without predicates for equality/inequality in stardard algorithms

The size check for std::vectors is unnecessary, as this is built into std::vector's operator==
This commit is contained in:
Lioncash 2016-10-03 01:52:33 -04:00
parent fba6801851
commit e8cd5a3979
3 changed files with 30 additions and 14 deletions

View File

@ -5,6 +5,7 @@
#include <algorithm>
#include <iterator>
#include <mutex>
#include <tuple>
#include <vector>
#include "Common/ChunkFile.h"
@ -20,6 +21,26 @@ namespace Gecko
{
static constexpr u32 CODE_SIZE = 8;
bool operator==(const GeckoCode& lhs, const GeckoCode& rhs)
{
return lhs.codes == rhs.codes;
}
bool operator!=(const GeckoCode& lhs, const GeckoCode& rhs)
{
return !operator==(lhs, rhs);
}
bool operator==(const GeckoCode::Code& lhs, const GeckoCode::Code& rhs)
{
return std::tie(lhs.address, lhs.data) == std::tie(rhs.address, rhs.data);
}
bool operator!=(const GeckoCode::Code& lhs, const GeckoCode::Code& rhs)
{
return !operator==(lhs, rhs);
}
// return true if a code exists
bool GeckoCode::Exist(u32 address, u32 data) const
{
@ -28,16 +49,6 @@ bool GeckoCode::Exist(u32 address, u32 data) const
}) != codes.end();
}
// return true if the code is identical
bool GeckoCode::Compare(const GeckoCode& compare) const
{
return codes.size() == compare.codes.size() &&
std::equal(codes.begin(), codes.end(), compare.codes.begin(),
[](const Code& a, const Code& b) {
return a.address == b.address && a.data == b.data;
});
}
enum class Installation
{
Uninstalled,

View File

@ -31,10 +31,15 @@ public:
bool enabled;
bool user_defined;
bool Compare(const GeckoCode& compare) const;
bool Exist(u32 address, u32 data) const;
};
bool operator==(const GeckoCode& lhs, const GeckoCode& rhs);
bool operator!=(const GeckoCode& lhs, const GeckoCode& rhs);
bool operator==(const GeckoCode::Code& lhs, const GeckoCode::Code& rhs);
bool operator!=(const GeckoCode::Code& lhs, const GeckoCode::Code& rhs);
// Installation address for codehandler.bin in the Game's RAM
constexpr u32 INSTALLER_BASE_ADDRESS = 0x80001800;
constexpr u32 INSTALLER_END_ADDRESS = 0x80003000;

View File

@ -275,8 +275,8 @@ void CodeConfigPanel::DownloadCodes(wxCommandEvent&)
for (const GeckoCode& code : gcodes)
{
// only add codes which do not already exist
std::vector<GeckoCode>::const_iterator existing_gcodes_iter = m_gcodes.begin(),
existing_gcodes_end = m_gcodes.end();
auto existing_gcodes_iter = m_gcodes.begin();
auto existing_gcodes_end = m_gcodes.end();
for (;; ++existing_gcodes_iter)
{
if (existing_gcodes_end == existing_gcodes_iter)
@ -287,7 +287,7 @@ void CodeConfigPanel::DownloadCodes(wxCommandEvent&)
}
// code exists
if (existing_gcodes_iter->Compare(code))
if (*existing_gcodes_iter == code)
break;
}
}