diff --git a/Source/Core/Common/Src/CommonFuncs.h b/Source/Core/Common/Src/CommonFuncs.h index 73320a3ac2..90ed639deb 100644 --- a/Source/Core/Common/Src/CommonFuncs.h +++ b/Source/Core/Common/Src/CommonFuncs.h @@ -12,6 +12,18 @@ #define SLEEP(x) usleep(x*1000) #endif +#include + +// TODO: make into function when type_traits and constexpr are available +template +struct ArraySizeImpl {}; + +template +struct ArraySizeImpl { static const std::size_t size = N; }; + +// Will fail to compile on a non-array: +#define ArraySize(x) ArraySizeImpl::size + template struct CompileTimeAssert; template<> struct CompileTimeAssert {}; @@ -52,7 +64,7 @@ _mm_shuffle_epi8(__m128i a, __m128i mask) #else #define Crash() {asm ("int $3");} #endif - #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) + // GCC 4.8 defines all the rotate functions now // Small issue with GCC's lrotl/lrotr intrinsics is they are still 32bit while we require 64bit #ifndef _rotl diff --git a/Source/Core/Core/Src/HW/EXI_DeviceGecko.cpp b/Source/Core/Core/Src/HW/EXI_DeviceGecko.cpp index 2f2d380366..792b045fd4 100644 --- a/Source/Core/Core/Src/HW/EXI_DeviceGecko.cpp +++ b/Source/Core/Core/Src/HW/EXI_DeviceGecko.cpp @@ -116,7 +116,7 @@ void GeckoSockServer::ClientThread() char data[128]; std::size_t got = 0; - if (client.Receive(&data[0], ARRAYSIZE(data), got) == sf::Socket::Disconnected) + if (client.Receive(&data[0], ArraySize(data), got) == sf::Socket::Disconnected) client_running = false; if (got != 0) diff --git a/Source/Core/Core/Src/Movie.cpp b/Source/Core/Core/Src/Movie.cpp index ddd971c9c1..3bd01896a8 100644 --- a/Source/Core/Core/Src/Movie.cpp +++ b/Source/Core/Core/Src/Movie.cpp @@ -696,7 +696,7 @@ void ReadHeader() bongos = tmpHeader.bongos; bSyncGPU = tmpHeader.bSyncGPU; bNetPlay = tmpHeader.bNetPlay; - memcpy(revision, tmpHeader.revision, ARRAYSIZE(revision)); + memcpy(revision, tmpHeader.revision, ArraySize(revision)); } else { @@ -1110,7 +1110,7 @@ void SaveRecording(const char *filename) header.bProgressive = bProgressive; header.bDSPHLE = bDSPHLE; header.bFastDiscSpeed = bFastDiscSpeed; - strncpy((char *)header.videoBackend, videoBackend.c_str(),ARRAYSIZE(header.videoBackend)); + strncpy((char *)header.videoBackend, videoBackend.c_str(),ArraySize(header.videoBackend)); header.CPUCore = iCPUCore; header.bEFBAccessEnable = g_ActiveConfig.bEFBAccessEnable; header.bEFBCopyEnable = g_ActiveConfig.bEFBCopyEnable; @@ -1123,11 +1123,11 @@ void SaveRecording(const char *filename) header.bClearSave = g_bClearSave; header.bSyncGPU = bSyncGPU; header.bNetPlay = bNetPlay; - strncpy((char *)header.discChange, g_discChange.c_str(),ARRAYSIZE(header.discChange)); - strncpy((char *)header.author, author.c_str(),ARRAYSIZE(header.author)); + strncpy((char *)header.discChange, g_discChange.c_str(),ArraySize(header.discChange)); + strncpy((char *)header.author, author.c_str(),ArraySize(header.author)); memcpy(header.md5,MD5,16); header.bongos = bongos; - memcpy(header.revision, revision, ARRAYSIZE(header.revision)); + memcpy(header.revision, revision, ArraySize(header.revision)); // TODO header.uniqueID = 0; diff --git a/Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.cpp b/Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.cpp index 3ba5e098ef..1bcd314291 100644 --- a/Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.cpp +++ b/Source/Plugins/Plugin_VideoDX11/Src/PerfQuery.cpp @@ -9,7 +9,7 @@ PerfQuery::PerfQuery() : m_query_read_pos() , m_query_count() { - for (int i = 0; i != ARRAYSIZE(m_query_buffer); ++i) + for (int i = 0; i != ArraySize(m_query_buffer); ++i) { D3D11_QUERY_DESC qdesc = CD3D11_QUERY_DESC(D3D11_QUERY_OCCLUSION, 0); D3D::device->CreateQuery(&qdesc, &m_query_buffer[i].query); @@ -19,7 +19,7 @@ PerfQuery::PerfQuery() PerfQuery::~PerfQuery() { - for (int i = 0; i != ARRAYSIZE(m_query_buffer); ++i) + for (int i = 0; i != ArraySize(m_query_buffer); ++i) { // TODO: EndQuery? m_query_buffer[i].query->Release(); @@ -32,10 +32,10 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) return; // Is this sane? - if (m_query_count > ARRAYSIZE(m_query_buffer) / 2) + if (m_query_count > ArraySize(m_query_buffer) / 2) WeakFlush(); - if (ARRAYSIZE(m_query_buffer) == m_query_count) + if (ArraySize(m_query_buffer) == m_query_count) { // TODO FlushOne(); @@ -45,7 +45,7 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) // start query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { - auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ARRAYSIZE(m_query_buffer)]; + auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ArraySize(m_query_buffer)]; D3D::context->Begin(entry.query); entry.query_type = type; @@ -62,7 +62,7 @@ void PerfQuery::DisableQuery(PerfQueryGroup type) // stop query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { - auto& entry = m_query_buffer[(m_query_read_pos + m_query_count + ARRAYSIZE(m_query_buffer)-1) % ARRAYSIZE(m_query_buffer)]; + auto& entry = m_query_buffer[(m_query_read_pos + m_query_count + ArraySize(m_query_buffer)-1) % ArraySize(m_query_buffer)]; D3D::context->End(entry.query); } } @@ -70,7 +70,7 @@ void PerfQuery::DisableQuery(PerfQueryGroup type) void PerfQuery::ResetQuery() { m_query_count = 0; - std::fill_n(m_results, ARRAYSIZE(m_results), 0); + std::fill_n(m_results, ArraySize(m_results), 0); } u32 PerfQuery::GetQueryResult(PerfQueryType type) @@ -118,7 +118,7 @@ void PerfQuery::FlushOne() // NOTE: Reported pixel metrics should be referenced to native resolution m_results[entry.query_type] += (u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight(); - m_query_read_pos = (m_query_read_pos + 1) % ARRAYSIZE(m_query_buffer); + m_query_read_pos = (m_query_read_pos + 1) % ArraySize(m_query_buffer); --m_query_count; } @@ -149,7 +149,7 @@ void PerfQuery::WeakFlush() // NOTE: Reported pixel metrics should be referenced to native resolution m_results[entry.query_type] += (u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight(); - m_query_read_pos = (m_query_read_pos + 1) % ARRAYSIZE(m_query_buffer); + m_query_read_pos = (m_query_read_pos + 1) % ArraySize(m_query_buffer); --m_query_count; } else diff --git a/Source/Plugins/Plugin_VideoDX9/Src/PerfQuery.cpp b/Source/Plugins/Plugin_VideoDX9/Src/PerfQuery.cpp index fafd06e901..3e6f058fdd 100644 --- a/Source/Plugins/Plugin_VideoDX9/Src/PerfQuery.cpp +++ b/Source/Plugins/Plugin_VideoDX9/Src/PerfQuery.cpp @@ -19,7 +19,7 @@ PerfQuery::~PerfQuery() void PerfQuery::CreateDeviceObjects() { - for (int i = 0; i != ARRAYSIZE(m_query_buffer); ++i) + for (int i = 0; i != ArraySize(m_query_buffer); ++i) { D3D::dev->CreateQuery(D3DQUERYTYPE_OCCLUSION, &m_query_buffer[i].query); } @@ -27,7 +27,7 @@ void PerfQuery::CreateDeviceObjects() } void PerfQuery::DestroyDeviceObjects() { - for (int i = 0; i != ARRAYSIZE(m_query_buffer); ++i) + for (int i = 0; i != ArraySize(m_query_buffer); ++i) { m_query_buffer[i].query->Release(); } @@ -38,10 +38,10 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) if (!ShouldEmulate()) return; // Is this sane? - if (m_query_count > ARRAYSIZE(m_query_buffer) / 2) + if (m_query_count > ArraySize(m_query_buffer) / 2) WeakFlush(); - if (ARRAYSIZE(m_query_buffer) == m_query_count) + if (ArraySize(m_query_buffer) == m_query_count) { // TODO FlushOne(); @@ -51,7 +51,7 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) // start query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { - auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ARRAYSIZE(m_query_buffer)]; + auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ArraySize(m_query_buffer)]; entry.query->Issue(D3DISSUE_BEGIN); entry.query_type = type; ++m_query_count; @@ -65,7 +65,7 @@ void PerfQuery::DisableQuery(PerfQueryGroup type) // stop query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { - auto& entry = m_query_buffer[(m_query_read_pos + m_query_count + ARRAYSIZE(m_query_buffer)-1) % ARRAYSIZE(m_query_buffer)]; + auto& entry = m_query_buffer[(m_query_read_pos + m_query_count + ArraySize(m_query_buffer)-1) % ArraySize(m_query_buffer)]; entry.query->Issue(D3DISSUE_END); } } @@ -73,7 +73,7 @@ void PerfQuery::DisableQuery(PerfQueryGroup type) void PerfQuery::ResetQuery() { m_query_count = 0; - std::fill_n(m_results, ARRAYSIZE(m_results), 0); + std::fill_n(m_results, ArraySize(m_results), 0); } u32 PerfQuery::GetQueryResult(PerfQueryType type) @@ -119,7 +119,7 @@ void PerfQuery::FlushOne() // NOTE: Reported pixel metrics should be referenced to native resolution m_results[entry.query_type] += (u32)((u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight()); - m_query_read_pos = (m_query_read_pos + 1) % ARRAYSIZE(m_query_buffer); + m_query_read_pos = (m_query_read_pos + 1) % ArraySize(m_query_buffer); --m_query_count; } @@ -148,7 +148,7 @@ void PerfQuery::WeakFlush() // NOTE: Reported pixel metrics should be referenced to native resolution m_results[entry.query_type] += (u32)((u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight()); - m_query_read_pos = (m_query_read_pos + 1) % ARRAYSIZE(m_query_buffer); + m_query_read_pos = (m_query_read_pos + 1) % ArraySize(m_query_buffer); --m_query_count; } else diff --git a/Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.cpp b/Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.cpp index a1582c0c62..f981a105e0 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/PerfQuery.cpp @@ -9,7 +9,7 @@ PerfQuery::PerfQuery() : m_query_read_pos() , m_query_count() { - for (u32 i = 0; i != ARRAYSIZE(m_query_buffer); ++i) + for (u32 i = 0; i != ArraySize(m_query_buffer); ++i) glGenQueries(1, &m_query_buffer[i].query_id); ResetQuery(); @@ -17,7 +17,7 @@ PerfQuery::PerfQuery() PerfQuery::~PerfQuery() { - for (u32 i = 0; i != ARRAYSIZE(m_query_buffer); ++i) + for (u32 i = 0; i != ArraySize(m_query_buffer); ++i) glDeleteQueries(1, &m_query_buffer[i].query_id); } @@ -27,10 +27,10 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) return; // Is this sane? - if (m_query_count > ARRAYSIZE(m_query_buffer) / 2) + if (m_query_count > ArraySize(m_query_buffer) / 2) WeakFlush(); - if (ARRAYSIZE(m_query_buffer) == m_query_count) + if (ArraySize(m_query_buffer) == m_query_count) { FlushOne(); //ERROR_LOG(VIDEO, "Flushed query buffer early!"); @@ -39,7 +39,7 @@ void PerfQuery::EnableQuery(PerfQueryGroup type) // start query if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP) { - auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ARRAYSIZE(m_query_buffer)]; + auto& entry = m_query_buffer[(m_query_read_pos + m_query_count) % ArraySize(m_query_buffer)]; glBeginQuery(GL_SAMPLES_PASSED, entry.query_id); entry.query_type = type; @@ -81,7 +81,7 @@ void PerfQuery::FlushOne() // NOTE: Reported pixel metrics should be referenced to native resolution m_results[entry.query_type] += (u64)result * EFB_WIDTH / g_renderer->GetTargetWidth() * EFB_HEIGHT / g_renderer->GetTargetHeight(); - m_query_read_pos = (m_query_read_pos + 1) % ARRAYSIZE(m_query_buffer); + m_query_read_pos = (m_query_read_pos + 1) % ArraySize(m_query_buffer); --m_query_count; } @@ -121,7 +121,7 @@ void PerfQuery::WeakFlush() void PerfQuery::ResetQuery() { m_query_count = 0; - std::fill_n(m_results, ARRAYSIZE(m_results), 0); + std::fill_n(m_results, ArraySize(m_results), 0); } u32 PerfQuery::GetQueryResult(PerfQueryType type) diff --git a/Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.cpp b/Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.cpp index 8f986cd6c7..8e4722bde9 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/SamplerCache.cpp @@ -89,7 +89,7 @@ void SamplerCache::SetParameters(GLuint sampler_id, const Params& params) auto& tm0 = params.tm0; auto& tm1 = params.tm1; - glSamplerParameteri(sampler_id, GL_TEXTURE_MIN_FILTER, min_filters[tm0.min_filter % ARRAYSIZE(min_filters)]); + glSamplerParameteri(sampler_id, GL_TEXTURE_MIN_FILTER, min_filters[tm0.min_filter % ArraySize(min_filters)]); glSamplerParameteri(sampler_id, GL_TEXTURE_MAG_FILTER, tm0.mag_filter ? GL_LINEAR : GL_NEAREST); glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_S, wrap_settings[tm0.wrap_s]);