Add optimized median25 and kill old macros (#3346)

This commit is contained in:
Flössie
2016-06-21 20:50:42 +02:00
parent 45a572e65b
commit d82956bbe5
4 changed files with 723 additions and 485 deletions

View File

@@ -36,227 +36,630 @@ inline T median(std::array<T, N> array)
: ((*middle + *std::max_element(array.begin(), middle)) / static_cast<T>(2));
}
template<typename T>
inline T median(std::array<T, 3> array)
{
return std::max(std::min(array[0], array[1]), std::min(array[2], std::max(array[0], array[1])));
}
template<>
inline vfloat median(std::array<vfloat, 3> array)
{
return vmaxf(vminf(array[0], array[1]), vminf(array[2], vmaxf(array[0], array[1])));
}
template<typename T>
inline T median(std::array<T, 5> array)
{
T tmp = std::min(array[0], array[1]);
array[1] = std::max(array[0], array[1]);
array[0] = tmp;
tmp = std::min(array[3], array[4]);
array[4] = std::max(array[3], array[4]);
array[3] = std::max(array[0], tmp);
array[1] = std::min(array[1], array[4]);
tmp = std::min(array[1], array[2]);
array[2] = std::max(array[1], array[2]);
array[1] = tmp;
tmp = std::min(array[2], array[3]);
return std::max(array[1], tmp);
}
template<>
inline vfloat median(std::array<vfloat, 5> array)
{
vfloat tmp = vminf(array[0], array[1]);
array[1] = vmaxf(array[0], array[1]);
array[0] = tmp;
tmp = vminf(array[3], array[4]);
array[4] = vmaxf(array[3], array[4]);
array[3] = vmaxf(array[0], tmp);
array[1] = vminf(array[1], array[4]);
tmp = vminf(array[1], array[2]);
array[2] = vmaxf(array[1], array[2]);
array[1] = tmp;
tmp = vminf(array[2], array[3]);
return vmaxf(array[1], tmp);
}
template<typename T>
inline T median(std::array<T, 7> array)
{
T tmp = std::min(array[0], array[5]);
array[5] = std::max(array[0], array[5]);
array[0] = tmp;
tmp = std::min(array[0], array[3]);
array[3] = std::max(array[0], array[3]);
array[0] = tmp;
tmp = std::min(array[1], array[6]);
array[6] = std::max(array[1], array[6]);
array[1] = tmp;
tmp = std::min(array[2], array[4]);
array[4] = std::max(array[2], array[4]);
array[2] = tmp;
array[1] = std::max(array[0], array[1]);
tmp = std::min(array[3], array[5]);
array[5] = std::max(array[3], array[5]);
array[3] = tmp;
tmp = std::min(array[2], array[6]);
array[6] = std::max(array[2], array[6]);
array[3] = std::max(tmp, array[3]);
array[3] = std::min(array[3], array[6]);
tmp = std::min(array[4], array[5]);
array[4] = std::max(array[1], tmp);
tmp = std::min(array[1], tmp);
array[3] = std::max(tmp, array[3]);
return std::min(array[3], array[4]);
}
template<>
inline vfloat median(std::array<vfloat, 7> array)
{
vfloat tmp = vminf(array[0], array[5]);
array[5] = vmaxf(array[0], array[5]);
array[0] = tmp;
tmp = vminf(array[0], array[3]);
array[3] = vmaxf(array[0], array[3]);
array[0] = tmp;
tmp = vminf(array[1], array[6]);
array[6] = vmaxf(array[1], array[6]);
array[1] = tmp;
tmp = vminf(array[2], array[4]);
array[4] = vmaxf(array[2], array[4]);
array[2] = tmp;
array[1] = vmaxf(array[0], array[1]);
tmp = vminf(array[3], array[5]);
array[5] = vmaxf(array[3], array[5]);
array[3] = tmp;
tmp = vminf(array[2], array[6]);
array[6] = vmaxf(array[2], array[6]);
array[3] = vmaxf(tmp, array[3]);
array[3] = vminf(array[3], array[6]);
tmp = vminf(array[4], array[5]);
array[4] = vmaxf(array[1], tmp);
tmp = vminf(array[1], tmp);
array[3] = vmaxf(tmp, array[3]);
return vminf(array[3], array[4]);
}
template<typename T>
inline T median(std::array<T, 9> array)
{
T tmp = std::min(array[1], array[2]);
array[2] = std::max(array[1], array[2]);
array[1] = tmp;
tmp = std::min(array[4], array[5]);
array[5] = std::max(array[4], array[5]);
array[4] = tmp;
tmp = std::min(array[7], array[8]);
array[8] = std::max(array[7], array[8]);
array[7] = tmp;
tmp = std::min(array[0], array[1]);
array[1] = std::max(array[0], array[1]);
array[0] = tmp;
tmp = std::min(array[3], array[4]);
array[4] = std::max(array[3], array[4]);
array[3] = tmp;
tmp = std::min(array[6], array[7]);
array[7] = std::max(array[6], array[7]);
array[6] = tmp;
tmp = std::min(array[1], array[2]);
array[2] = std::max(array[1], array[2]);
array[1] = tmp;
tmp = std::min(array[4], array[5]);
array[5] = std::max(array[4], array[5]);
array[4] = tmp;
tmp = std::min(array[7], array[8]);
array[8] = std::max(array[7], array[8]);
array[3] = std::max(array[0], array[3]);
array[5] = std::min(array[5], array[8]);
array[7] = std::max(array[4], tmp);
tmp = std::min(array[4], tmp);
array[6] = std::max(array[3], array[6]);
array[4] = std::max(array[1], tmp);
array[2] = std::min(array[2], array[5]);
array[4] = std::min(array[4], array[7]);
tmp = std::min(array[4], array[2]);
array[2] = std::max(array[4], array[2]);
array[4] = std::max(array[6], tmp);
return std::min(array[4], array[2]);
}
template<>
inline vfloat median(std::array<vfloat, 9> array)
{
vfloat tmp = vminf(array[1], array[2]);
array[2] = vmaxf(array[1], array[2]);
array[1] = tmp;
tmp = vminf(array[4], array[5]);
array[5] = vmaxf(array[4], array[5]);
array[4] = tmp;
tmp = vminf(array[7], array[8]);
array[8] = vmaxf(array[7], array[8]);
array[7] = tmp;
tmp = vminf(array[0], array[1]);
array[1] = vmaxf(array[0], array[1]);
array[0] = tmp;
tmp = vminf(array[3], array[4]);
array[4] = vmaxf(array[3], array[4]);
array[3] = tmp;
tmp = vminf(array[6], array[7]);
array[7] = vmaxf(array[6], array[7]);
array[6] = tmp;
tmp = vminf(array[1], array[2]);
array[2] = vmaxf(array[1], array[2]);
array[1] = tmp;
tmp = vminf(array[4], array[5]);
array[5] = vmaxf(array[4], array[5]);
array[4] = tmp;
tmp = vminf(array[7], array[8]);
array[8] = vmaxf(array[7], array[8]);
array[3] = vmaxf(array[0], array[3]);
array[5] = vminf(array[5], array[8]);
array[7] = vmaxf(array[4], tmp);
tmp = vminf(array[4], tmp);
array[6] = vmaxf(array[3], array[6]);
array[4] = vmaxf(array[1], tmp);
array[2] = vminf(array[2], array[5]);
array[4] = vminf(array[4], array[7]);
tmp = vminf(array[4], array[2]);
array[2] = vmaxf(array[4], array[2]);
array[4] = vmaxf(array[6], tmp);
return vminf(array[4], array[2]);
}
template<typename T>
inline T median(std::array<T, 25> array)
{
T tmp = std::min(array[0], array[1]);
array[1] = std::max(array[0], array[1]);
array[0] = tmp;
tmp = std::min(array[3], array[4]);
array[4] = std::max(array[3], array[4]);
array[3] = tmp;
tmp = std::min(array[2], array[4]);
array[4] = std::max(array[2], array[4]);
array[2] = std::min(tmp, array[3]);
array[3] = std::max(tmp, array[3]);
tmp = std::min(array[6], array[7]);
array[7] = std::max(array[6], array[7]);
array[6] = tmp;
tmp = std::min(array[5], array[7]);
array[7] = std::max(array[5], array[7]);
array[5] = std::min(tmp, array[6]);
array[6] = std::max(tmp, array[6]);
tmp = std::min(array[9], array[10]);
array[10] = std::max(array[9], array[10]);
array[9] = tmp;
tmp = std::min(array[8], array[10]);
array[10] = std::max(array[8], array[10]);
array[8] = std::min(tmp, array[9]);
array[9] = std::max(tmp, array[9]);
tmp = std::min(array[12], array[13]);
array[13] = std::max(array[12], array[13]);
array[12] = tmp;
tmp = std::min(array[11], array[13]);
array[13] = std::max(array[11], array[13]);
array[11] = std::min(tmp, array[12]);
array[12] = std::max(tmp, array[12]);
tmp = std::min(array[15], array[16]);
array[16] = std::max(array[15], array[16]);
array[15] = tmp;
tmp = std::min(array[14], array[16]);
array[16] = std::max(array[14], array[16]);
array[14] = std::min(tmp, array[15]);
array[15] = std::max(tmp, array[15]);
tmp = std::min(array[18], array[19]);
array[19] = std::max(array[18], array[19]);
array[18] = tmp;
tmp = std::min(array[17], array[19]);
array[19] = std::max(array[17], array[19]);
array[17] = std::min(tmp, array[18]);
array[18] = std::max(tmp, array[18]);
tmp = std::min(array[21], array[22]);
array[22] = std::max(array[21], array[22]);
array[21] = tmp;
tmp = std::min(array[20], array[22]);
array[22] = std::max(array[20], array[22]);
array[20] = std::min(tmp, array[21]);
array[21] = std::max(tmp, array[21]);
tmp = std::min(array[23], array[24]);
array[24] = std::max(array[23], array[24]);
array[23] = tmp;
tmp = std::min(array[2], array[5]);
array[5] = std::max(array[2], array[5]);
array[2] = tmp;
tmp = std::min(array[3], array[6]);
array[6] = std::max(array[3], array[6]);
array[3] = tmp;
tmp = std::min(array[0], array[6]);
array[6] = std::max(array[0], array[6]);
array[0] = std::min(tmp, array[3]);
array[3] = std::max(tmp, array[3]);
tmp = std::min(array[4], array[7]);
array[7] = std::max(array[4], array[7]);
array[4] = tmp;
tmp = std::min(array[1], array[7]);
array[7] = std::max(array[1], array[7]);
array[1] = std::min(tmp, array[4]);
array[4] = std::max(tmp, array[4]);
tmp = std::min(array[11], array[14]);
array[14] = std::max(array[11], array[14]);
array[11] = tmp;
tmp = std::min(array[8], array[14]);
array[14] = std::max(array[8], array[14]);
array[8] = std::min(tmp, array[11]);
array[11] = std::max(tmp, array[11]);
tmp = std::min(array[12], array[15]);
array[15] = std::max(array[12], array[15]);
array[12] = tmp;
tmp = std::min(array[9], array[15]);
array[15] = std::max(array[9], array[15]);
array[9] = std::min(tmp, array[12]);
array[12] = std::max(tmp, array[12]);
tmp = std::min(array[13], array[16]);
array[16] = std::max(array[13], array[16]);
array[13] = tmp;
tmp = std::min(array[10], array[16]);
array[16] = std::max(array[10], array[16]);
array[10] = std::min(tmp, array[13]);
array[13] = std::max(tmp, array[13]);
tmp = std::min(array[20], array[23]);
array[23] = std::max(array[20], array[23]);
array[20] = tmp;
tmp = std::min(array[17], array[23]);
array[23] = std::max(array[17], array[23]);
array[17] = std::min(tmp, array[20]);
array[20] = std::max(tmp, array[20]);
tmp = std::min(array[21], array[24]);
array[24] = std::max(array[21], array[24]);
array[21] = tmp;
tmp = std::min(array[18], array[24]);
array[24] = std::max(array[18], array[24]);
array[18] = std::min(tmp, array[21]);
array[21] = std::max(tmp, array[21]);
tmp = std::min(array[19], array[22]);
array[22] = std::max(array[19], array[22]);
array[19] = tmp;
array[17] = std::max(array[8], array[17]);
tmp = std::min(array[9], array[18]);
array[18] = std::max(array[9], array[18]);
array[9] = tmp;
tmp = std::min(array[0], array[18]);
array[18] = std::max(array[0], array[18]);
array[9] = std::max(tmp, array[9]);
tmp = std::min(array[10], array[19]);
array[19] = std::max(array[10], array[19]);
array[10] = tmp;
tmp = std::min(array[1], array[19]);
array[19] = std::max(array[1], array[19]);
array[1] = std::min(tmp, array[10]);
array[10] = std::max(tmp, array[10]);
tmp = std::min(array[11], array[20]);
array[20] = std::max(array[11], array[20]);
array[11] = tmp;
tmp = std::min(array[2], array[20]);
array[20] = std::max(array[2], array[20]);
array[11] = std::max(tmp, array[11]);
tmp = std::min(array[12], array[21]);
array[21] = std::max(array[12], array[21]);
array[12] = tmp;
tmp = std::min(array[3], array[21]);
array[21] = std::max(array[3], array[21]);
array[3] = std::min(tmp, array[12]);
array[12] = std::max(tmp, array[12]);
tmp = std::min(array[13], array[22]);
array[22] = std::max(array[13], array[22]);
array[4] = std::min(array[4], array[22]);
array[13] = std::max(array[4], tmp);
tmp = std::min(array[4], tmp);
array[4] = tmp;
tmp = std::min(array[14], array[23]);
array[23] = std::max(array[14], array[23]);
array[14] = tmp;
tmp = std::min(array[5], array[23]);
array[23] = std::max(array[5], array[23]);
array[5] = std::min(tmp, array[14]);
array[14] = std::max(tmp, array[14]);
tmp = std::min(array[15], array[24]);
array[24] = std::max(array[15], array[24]);
array[15] = tmp;
array[6] = std::min(array[6], array[24]);
tmp = std::min(array[6], array[15]);
array[15] = std::max(array[6], array[15]);
array[6] = tmp;
tmp = std::min(array[7], array[16]);
array[7] = std::min(tmp, array[19]);
tmp = std::min(array[13], array[21]);
array[15] = std::min(array[15], array[23]);
tmp = std::min(array[7], tmp);
array[7] = std::min(tmp, array[15]);
array[9] = std::max(array[1], array[9]);
array[11] = std::max(array[3], array[11]);
array[17] = std::max(array[5], array[17]);
array[17] = std::max(array[11], array[17]);
array[17] = std::max(array[9], array[17]);
tmp = std::min(array[4], array[10]);
array[10] = std::max(array[4], array[10]);
array[4] = tmp;
tmp = std::min(array[6], array[12]);
array[12] = std::max(array[6], array[12]);
array[6] = tmp;
tmp = std::min(array[7], array[14]);
array[14] = std::max(array[7], array[14]);
array[7] = tmp;
tmp = std::min(array[4], array[6]);
array[6] = std::max(array[4], array[6]);
array[7] = std::max(tmp, array[7]);
tmp = std::min(array[12], array[14]);
array[14] = std::max(array[12], array[14]);
array[12] = tmp;
array[10] = std::min(array[10], array[14]);
tmp = std::min(array[6], array[7]);
array[7] = std::max(array[6], array[7]);
array[6] = tmp;
tmp = std::min(array[10], array[12]);
array[12] = std::max(array[10], array[12]);
array[10] = std::max(array[6], tmp);
tmp = std::min(array[6], tmp);
array[17] = std::max(tmp, array[17]);
tmp = std::min(array[12], array[17]);
array[17] = std::max(array[12], array[17]);
array[12] = tmp;
array[7] = std::min(array[7], array[17]);
tmp = std::min(array[7], array[10]);
array[10] = std::max(array[7], array[10]);
array[7] = tmp;
tmp = std::min(array[12], array[18]);
array[18] = std::max(array[12], array[18]);
array[12] = std::max(array[7], tmp);
array[10] = std::min(array[10], array[18]);
tmp = std::min(array[12], array[20]);
array[20] = std::max(array[12], array[20]);
array[12] = tmp;
tmp = std::min(array[10], array[20]);
return std::max(tmp, array[12]);
}
template<>
inline vfloat median(std::array<vfloat, 25> array)
{
vfloat tmp = vminf(array[0], array[1]);
array[1] = vmaxf(array[0], array[1]);
array[0] = tmp;
tmp = vminf(array[3], array[4]);
array[4] = vmaxf(array[3], array[4]);
array[3] = tmp;
tmp = vminf(array[2], array[4]);
array[4] = vmaxf(array[2], array[4]);
array[2] = vminf(tmp, array[3]);
array[3] = vmaxf(tmp, array[3]);
tmp = vminf(array[6], array[7]);
array[7] = vmaxf(array[6], array[7]);
array[6] = tmp;
tmp = vminf(array[5], array[7]);
array[7] = vmaxf(array[5], array[7]);
array[5] = vminf(tmp, array[6]);
array[6] = vmaxf(tmp, array[6]);
tmp = vminf(array[9], array[10]);
array[10] = vmaxf(array[9], array[10]);
array[9] = tmp;
tmp = vminf(array[8], array[10]);
array[10] = vmaxf(array[8], array[10]);
array[8] = vminf(tmp, array[9]);
array[9] = vmaxf(tmp, array[9]);
tmp = vminf(array[12], array[13]);
array[13] = vmaxf(array[12], array[13]);
array[12] = tmp;
tmp = vminf(array[11], array[13]);
array[13] = vmaxf(array[11], array[13]);
array[11] = vminf(tmp, array[12]);
array[12] = vmaxf(tmp, array[12]);
tmp = vminf(array[15], array[16]);
array[16] = vmaxf(array[15], array[16]);
array[15] = tmp;
tmp = vminf(array[14], array[16]);
array[16] = vmaxf(array[14], array[16]);
array[14] = vminf(tmp, array[15]);
array[15] = vmaxf(tmp, array[15]);
tmp = vminf(array[18], array[19]);
array[19] = vmaxf(array[18], array[19]);
array[18] = tmp;
tmp = vminf(array[17], array[19]);
array[19] = vmaxf(array[17], array[19]);
array[17] = vminf(tmp, array[18]);
array[18] = vmaxf(tmp, array[18]);
tmp = vminf(array[21], array[22]);
array[22] = vmaxf(array[21], array[22]);
array[21] = tmp;
tmp = vminf(array[20], array[22]);
array[22] = vmaxf(array[20], array[22]);
array[20] = vminf(tmp, array[21]);
array[21] = vmaxf(tmp, array[21]);
tmp = vminf(array[23], array[24]);
array[24] = vmaxf(array[23], array[24]);
array[23] = tmp;
tmp = vminf(array[2], array[5]);
array[5] = vmaxf(array[2], array[5]);
array[2] = tmp;
tmp = vminf(array[3], array[6]);
array[6] = vmaxf(array[3], array[6]);
array[3] = tmp;
tmp = vminf(array[0], array[6]);
array[6] = vmaxf(array[0], array[6]);
array[0] = vminf(tmp, array[3]);
array[3] = vmaxf(tmp, array[3]);
tmp = vminf(array[4], array[7]);
array[7] = vmaxf(array[4], array[7]);
array[4] = tmp;
tmp = vminf(array[1], array[7]);
array[7] = vmaxf(array[1], array[7]);
array[1] = vminf(tmp, array[4]);
array[4] = vmaxf(tmp, array[4]);
tmp = vminf(array[11], array[14]);
array[14] = vmaxf(array[11], array[14]);
array[11] = tmp;
tmp = vminf(array[8], array[14]);
array[14] = vmaxf(array[8], array[14]);
array[8] = vminf(tmp, array[11]);
array[11] = vmaxf(tmp, array[11]);
tmp = vminf(array[12], array[15]);
array[15] = vmaxf(array[12], array[15]);
array[12] = tmp;
tmp = vminf(array[9], array[15]);
array[15] = vmaxf(array[9], array[15]);
array[9] = vminf(tmp, array[12]);
array[12] = vmaxf(tmp, array[12]);
tmp = vminf(array[13], array[16]);
array[16] = vmaxf(array[13], array[16]);
array[13] = tmp;
tmp = vminf(array[10], array[16]);
array[16] = vmaxf(array[10], array[16]);
array[10] = vminf(tmp, array[13]);
array[13] = vmaxf(tmp, array[13]);
tmp = vminf(array[20], array[23]);
array[23] = vmaxf(array[20], array[23]);
array[20] = tmp;
tmp = vminf(array[17], array[23]);
array[23] = vmaxf(array[17], array[23]);
array[17] = vminf(tmp, array[20]);
array[20] = vmaxf(tmp, array[20]);
tmp = vminf(array[21], array[24]);
array[24] = vmaxf(array[21], array[24]);
array[21] = tmp;
tmp = vminf(array[18], array[24]);
array[24] = vmaxf(array[18], array[24]);
array[18] = vminf(tmp, array[21]);
array[21] = vmaxf(tmp, array[21]);
tmp = vminf(array[19], array[22]);
array[22] = vmaxf(array[19], array[22]);
array[19] = tmp;
array[17] = vmaxf(array[8], array[17]);
tmp = vminf(array[9], array[18]);
array[18] = vmaxf(array[9], array[18]);
array[9] = tmp;
tmp = vminf(array[0], array[18]);
array[18] = vmaxf(array[0], array[18]);
array[9] = vmaxf(tmp, array[9]);
tmp = vminf(array[10], array[19]);
array[19] = vmaxf(array[10], array[19]);
array[10] = tmp;
tmp = vminf(array[1], array[19]);
array[19] = vmaxf(array[1], array[19]);
array[1] = vminf(tmp, array[10]);
array[10] = vmaxf(tmp, array[10]);
tmp = vminf(array[11], array[20]);
array[20] = vmaxf(array[11], array[20]);
array[11] = tmp;
tmp = vminf(array[2], array[20]);
array[20] = vmaxf(array[2], array[20]);
array[11] = vmaxf(tmp, array[11]);
tmp = vminf(array[12], array[21]);
array[21] = vmaxf(array[12], array[21]);
array[12] = tmp;
tmp = vminf(array[3], array[21]);
array[21] = vmaxf(array[3], array[21]);
array[3] = vminf(tmp, array[12]);
array[12] = vmaxf(tmp, array[12]);
tmp = vminf(array[13], array[22]);
array[22] = vmaxf(array[13], array[22]);
array[4] = vminf(array[4], array[22]);
array[13] = vmaxf(array[4], tmp);
tmp = vminf(array[4], tmp);
array[4] = tmp;
tmp = vminf(array[14], array[23]);
array[23] = vmaxf(array[14], array[23]);
array[14] = tmp;
tmp = vminf(array[5], array[23]);
array[23] = vmaxf(array[5], array[23]);
array[5] = vminf(tmp, array[14]);
array[14] = vmaxf(tmp, array[14]);
tmp = vminf(array[15], array[24]);
array[24] = vmaxf(array[15], array[24]);
array[15] = tmp;
array[6] = vminf(array[6], array[24]);
tmp = vminf(array[6], array[15]);
array[15] = vmaxf(array[6], array[15]);
array[6] = tmp;
tmp = vminf(array[7], array[16]);
array[7] = vminf(tmp, array[19]);
tmp = vminf(array[13], array[21]);
array[15] = vminf(array[15], array[23]);
tmp = vminf(array[7], tmp);
array[7] = vminf(tmp, array[15]);
array[9] = vmaxf(array[1], array[9]);
array[11] = vmaxf(array[3], array[11]);
array[17] = vmaxf(array[5], array[17]);
array[17] = vmaxf(array[11], array[17]);
array[17] = vmaxf(array[9], array[17]);
tmp = vminf(array[4], array[10]);
array[10] = vmaxf(array[4], array[10]);
array[4] = tmp;
tmp = vminf(array[6], array[12]);
array[12] = vmaxf(array[6], array[12]);
array[6] = tmp;
tmp = vminf(array[7], array[14]);
array[14] = vmaxf(array[7], array[14]);
array[7] = tmp;
tmp = vminf(array[4], array[6]);
array[6] = vmaxf(array[4], array[6]);
array[7] = vmaxf(tmp, array[7]);
tmp = vminf(array[12], array[14]);
array[14] = vmaxf(array[12], array[14]);
array[12] = tmp;
array[10] = vminf(array[10], array[14]);
tmp = vminf(array[6], array[7]);
array[7] = vmaxf(array[6], array[7]);
array[6] = tmp;
tmp = vminf(array[10], array[12]);
array[12] = vmaxf(array[10], array[12]);
array[10] = vmaxf(array[6], tmp);
tmp = vminf(array[6], tmp);
array[17] = vmaxf(tmp, array[17]);
tmp = vminf(array[12], array[17]);
array[17] = vmaxf(array[12], array[17]);
array[12] = tmp;
array[7] = vminf(array[7], array[17]);
tmp = vminf(array[7], array[10]);
array[10] = vmaxf(array[7], array[10]);
array[7] = tmp;
tmp = vminf(array[12], array[18]);
array[18] = vmaxf(array[12], array[18]);
array[12] = vmaxf(array[7], tmp);
array[10] = vminf(array[10], array[18]);
tmp = vminf(array[12], array[20]);
array[20] = vmaxf(array[12], array[20]);
array[12] = tmp;
tmp = vminf(array[10], array[20]);
return vmaxf(tmp, array[12]);
}
template<typename T, typename... ARGS>
inline T median(T arg, ARGS... args)
{
return median(std::array<T, sizeof...(args) + 1>{std::move(arg), std::move(args)...});
}
template<typename T>
inline T median(T a, T b, T c)
{
return std::max(std::min(a, b), std::min(c, std::max(a, b)));
}
template<>
inline vfloat median(vfloat a, vfloat b, vfloat c)
{
return vmaxf(vminf(a, b), vminf(c, vmaxf(a, b)));
}
// See http://stackoverflow.com/questions/480960/code-to-calculate-median-of-five-in-c-sharp
template<typename T>
inline T median(T a, T b, T c, T d, T e)
{
if (b < a) {
std::swap(a, b);
}
if (d < c) {
std::swap(c, d);
}
if (c < a) {
std::swap(b, d);
c = a;
}
a = e;
if (b < a) {
std::swap(a, b);
}
if (a < c) {
std::swap(b, d);
a = c;
}
return std::min(a, d);
}
template<>
inline vfloat median(vfloat a, vfloat b, vfloat c, vfloat d, vfloat e)
{
const vfloat f = vmaxf(vminf(a, b), vminf(c, d));
const vfloat g = vminf(vmaxf(a, b), vmaxf(c, d));
return median(e, f, g);
}
// See http://www.cs.hut.fi/~cessu/selection/V_7_4
// Hand unrolled algorithm by Flössie ;)
template<typename T>
inline T median(T a, T b, T c, T d, T e, T f, T g)
{
if (b < a) {
std::swap(a, b);
}
if (d < c) {
std::swap(b, c);
std::swap(b, d);
} else {
std::swap(b, c);
}
if (b < a) {
std::swap(a, b);
} else {
std::swap(c, d);
}
if (e < d) {
std::swap(c, d);
std::swap(c, e);
if (c < b) {
std::swap(b, c);
if (g < f) {
std::swap(d, g);
std::swap(e, g);
std::swap(f, g);
} else {
std::swap(d, f);
std::swap(e, f);
}
if (g < c) {
std::swap(a, d);
if (d < b) {
std::swap(a, b);
} else {
std::swap(a, d);
b = d;
}
if (g < f) {
return std::max(a, g);
}
return std::max(b, f);
}
if (f < d) {
std::swap(d, f);
}
if (d < c) {
return std::min(c, f);
}
return std::min(d, e);
}
if (d < c) {
std::swap(c, e);
if (f < b) {
if (g < b) {
return b;
}
return std::min(d, g);
}
if (g < f) {
std::swap(e, g);
std::swap(f, g);
} else {
std::swap(e, f);
}
if (e < d) {
return std::min(d, g);
}
return std::min(e, f);
}
if (g < f) {
std::swap(f, g);
}
std::swap(e, f);
if (e < c) {
if (g < b) {
return b;
}
return std::min(c, g);
}
if (d < e) {
return std::min(d, f);
}
return std::min(e, f);
}
if (d < b) {
std::swap(b, d);
} else {
std::swap(c, e);
}
if (e < d) {
std::swap(d, e);
if (f < b) {
if (g < b) {
return b;
}
return std::min(d, g);
}
if (g < f) {
std::swap(e, g);
std::swap(f, g);
} else {
std::swap(e, f);
}
if (e < d) {
return std::min(d, g);
}
return std::min(e, f);
}
if (g < f) {
std::swap(c, g);
std::swap(f, g);
} else {
std::swap(c, f);
}
if (c < d) {
if (g < b) {
return b;
}
return std::min(d, g);
}
if (e < c) {
return std::min(e, f);
}
return std::min(c, f);
}
// middle 4 of 6 elements,
#define MIDDLE4OF6(s0,s1,s2,s3,s4,s5,d0,d1,d2,d3,d4,d5,temp) \
{\