Files
UnrealEngine/Engine/Shaders/Private/BinarySearch.ush
2025-05-18 13:04:45 +08:00

65 lines
1.8 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Common.ush"
template<typename T>
struct TDefaultCompare
{
int Compare(T a, T b)
{
return int(a > b) - int(a < b);
}
};
// BufferCount must be a power of 2
template<typename TBuffer, typename T, typename TCompare>
T LowerBound(TBuffer SearchBuffer, uint BufferOffset, uint BufferCount, T Key)
{
TCompare Comp = (TCompare)0;
uint Index = BufferOffset;
uint Width = BufferCount >> 1;
while (Width > 0)
{
Index += Comp.Compare(Key, SearchBuffer[Index + Width]) < 0 ? 0 : Width;
Width = Width >> 1;
}
return Index;
}
// BufferCount must be a power of 2
template<typename TBuffer, typename T, typename TCompare>
bool BinarySearch(TBuffer SearchBuffer, uint BufferOffset, uint BufferCount, T Key, inout uint OutIndex)
{
if (BufferCount == 0)
{
return false;
}
OutIndex = LowerBound<TBuffer, T, TCompare>(SearchBuffer, BufferOffset, BufferCount, Key);
return SearchBuffer[OutIndex] == Key;
}
// BufferCount must be a power of 2
template<typename TBuffer, typename T, typename TCompare>
bool BinarySearch(TBuffer SearchBuffer, uint BufferOffset, uint BufferCount, T Key)
{
uint Index;
return BinarySearch<TBuffer, T, TCompare>(SearchBuffer, BufferOffset, BufferCount, Key, Index);
}
// BufferCount must be a power of 2
template<typename TBuffer, typename T>
bool BinarySearch(TBuffer SearchBuffer, uint BufferOffset, uint BufferCount, T Key, inout uint OutIndex)
{
return BinarySearch< TBuffer, T, TDefaultCompare<T> >(SearchBuffer, BufferOffset, BufferCount, Key, OutIndex);
}
// BufferCount must be a power of 2
template<typename TBuffer, typename T>
bool BinarySearch(TBuffer SearchBuffer, uint BufferOffset, uint BufferCount, T Key)
{
uint Index;
return BinarySearch<TBuffer, T>(SearchBuffer, BufferOffset, BufferCount, Key, Index);
}