// FTTALG - [2020-04-13 11:57:47]
#ifndef _FTTALG_H_
#define _FTTALG_H_

#include "common.h"
#include "FTTPair.h"
#include "FTTVector.h"

/*
00199724 FTTALG::Quicksort<HeightSort,FTTVector<TEdgeGroup>::Iterator>(FTTVector<TEdgeGroup>::Iterator,FTTVector<TEdgeGroup>::Iterator)
001997F8 FTTALG::Quicksort<EdgeSort,FTTVector<FTTPair<uint,uint>>::Iterator>(FTTVector<FTTPair<uint,uint>>::Iterator,FTTVector<FTTPair<uint,uint>>::Iterator)
00199BE4 FTTALG::Quicksort<FTTLess,FTTVector<float>::Iterator>(FTTVector<float>::Iterator,FTTVector<float>::Iterator)
0019BC74 FTTALG::Quicksort<CrowdSortF,FTTVector<TGfxCrowdSeat *>::Iterator>(FTTVector<TGfxCrowdSeat *>::Iterator,FTTVector<TGfxCrowdSeat *>::Iterator)
0019BD64 FTTALG::Quicksort<CrowdSortD,FTTVector<TGfxCrowdSeat *>::Iterator>(FTTVector<TGfxCrowdSeat *>::Iterator,FTTVector<TGfxCrowdSeat *>::Iterator)
0019C028 FTTALG::Quicksort<FlagSort,FTTVector<CFTTVector32>::Iterator>(FTTVector<CFTTVector32>::Iterator,FTTVector<CFTTVector32>::Iterator)
0019C4F0 FTTALG::Quicksort<CrowdSortB,FTTVector<TGfxCrowdQuad>::Iterator>(FTTVector<TGfxCrowdQuad>::Iterator,FTTVector<TGfxCrowdQuad>::Iterator)
0019F56C FTTALG::Quicksort<SortShots,FTTVector<TShot>::Iterator>(FTTVector<TShot>::Iterator,FTTVector<TShot>::Iterator)
001C62DC FTTALG::Quicksort<SortShadowsSize,FTTArray<TShadowAABB *,256u>::Iterator>(FTTArray<TShadowAABB *,256u>::Iterator,FTTArray<TShadowAABB *,256u>::Iterator)
001C6354 FTTALG::Quicksort<SortShadowsAtlas,FTTArray<TShadowAABB *,256u>::Iterator>(FTTArray<TShadowAABB *,256u>::Iterator,FTTArray<TShadowAABB *,256u>::Iterator)

001A5CC8 FTTALG::Partition<HeightSort,FTTVector<TEdgeGroup>::Iterator>(FTTVector<TEdgeGroup>::Iterator,FTTVector<TEdgeGroup>::Iterator,FTTVector<TEdgeGroup>::Iterator)
001A5FE4 FTTALG::Partition<EdgeSort,FTTVector<FTTPair<uint,uint>>::Iterator>(FTTVector<FTTPair<uint,uint>>::Iterator,FTTVector<FTTPair<uint,uint>>::Iterator,FTTVector<FTTPair<uint,uint>>::Iterator)
001A6564 FTTALG::Partition<FTTLess,FTTVector<float>::Iterator>(FTTVector<float>::Iterator,FTTVector<float>::Iterator,FTTVector<float>::Iterator)
001A6B08 FTTALG::Partition<CrowdSortF,FTTVector<TGfxCrowdSeat *>::Iterator>(FTTVector<TGfxCrowdSeat *>::Iterator,FTTVector<TGfxCrowdSeat *>::Iterator,FTTVector<TGfxCrowdSeat *>::Iterator)
001A6BA4 FTTALG::Partition<CrowdSortD,FTTVector<TGfxCrowdSeat *>::Iterator>(FTTVector<TGfxCrowdSeat *>::Iterator,FTTVector<TGfxCrowdSeat *>::Iterator,FTTVector<TGfxCrowdSeat *>::Iterator)
001A6EF0 FTTALG::Partition<FlagSort,FTTVector<CFTTVector32>::Iterator>(FTTVector<CFTTVector32>::Iterator,FTTVector<CFTTVector32>::Iterator,FTTVector<CFTTVector32>::Iterator)
001A7448 FTTALG::Partition<CrowdSortB,FTTVector<TGfxCrowdQuad>::Iterator>(FTTVector<TGfxCrowdQuad>::Iterator,FTTVector<TGfxCrowdQuad>::Iterator,FTTVector<TGfxCrowdQuad>::Iterator)
001A7DF8 FTTALG::Partition<FTTLess,FTTITR::FTTArrayIterator<float>>(FTTITR::FTTArrayIterator<float>,FTTITR::FTTArrayIterator<float>,FTTITR::FTTArrayIterator<float>)
001A80DC FTTALG::Partition<SortShots,FTTVector<TShot>::Iterator>(FTTVector<TShot>::Iterator,FTTVector<TShot>::Iterator,FTTVector<TShot>::Iterator)
001C6A30 FTTALG::Partition<SortShadowsSize,FTTArray<TShadowAABB *,256u>::Iterator>(FTTArray<TShadowAABB *,256u>::Iterator,FTTArray<TShadowAABB *,256u>::Iterator,FTTArray<TShadowAABB *,256u>::Iterator)
001C6B6C FTTALG::Partition<SortShadowsAtlas,FTTArray<TShadowAABB *,256u>::Iterator>(FTTArray<TShadowAABB *,256u>::Iterator,FTTArray<TShadowAABB *,256u>::Iterator,FTTArray<TShadowAABB *,256u>::Iterator)

0019ED6C FTTALG::Shuffle<TCrowdMember>(TCrowdMember *,TCrowdMember *)
001A7ED6 FTTALG::Shuffle<FTTITR::FTTArrayIterator<TCrowdMember>>(FTTITR::FTTArrayIterator<TCrowdMember>,FTTITR::FTTArrayIterator<TCrowdMember>)
001ACB30 FTTALG::Shuffle<int>(int *,int *)
001ACB50 FTTALG::Shuffle<FTTITR::FTTArrayIterator<int>>(FTTITR::FTTArrayIterator<int>,FTTITR::FTTArrayIterator<int>)
0019ED6C FTTALG::Shuffle<TCrowdMember>(TCrowdMember *,TCrowdMember *)
001A7ED6 FTTALG::Shuffle<FTTITR::FTTArrayIterator<TCrowdMember>>(FTTITR::FTTArrayIterator<TCrowdMember>,FTTITR::FTTArrayIterator<TCrowdMember>)
001ACB30 FTTALG::Shuffle<int>(int *,int *)
001ACB50 FTTALG::Shuffle<FTTITR::FTTArrayIterator<int>>(FTTITR::FTTArrayIterator<int>,FTTITR::FTTArrayIterator<int>)

001C688E FTTALG::InsertionSort<SortAtlasSize,FTTITR::FTTArrayIterator<FTTPair<uchar,uint>>>(FTTITR::FTTArrayIterator<FTTPair<uchar,uint>>,FTTITR::FTTArrayIterator<FTTPair<uchar,uint>>)
001C62AC FTTALG::InsertionSort<SortAtlasSize,FTTPair<uchar,uint>>(FTTPair<uchar,uint> *,FTTPair<uchar,uint> *)

001A7CEC FTTALG::Quickselect<FTTLess,float>(float *,float *,uint)
001A7D14 FTTALG::Quickselect<FTTLess,FTTITR::FTTArrayIterator<float>>(FTTITR::FTTArrayIterator<float>,FTTITR::FTTArrayIterator<float>,uint)

00189DDC FTTALG::Reverse<FTTArray<FTTPair<float,float>,16u>::Iterator>(FTTArray<FTTPair<float,float>,16u>::Iterator,FTTArray<FTTPair<float,float>,16u>::Iterator)
001996BE FTTALG::Move<FTTVector<TEdgeGroup>::Iterator,FTTList<TEdgeGroup>::Iterator>(FTTVector<TEdgeGroup>::Iterator,FTTVector<TEdgeGroup>::Iterator,FTTList<TEdgeGroup>::Iterator,FTTList<TEdgeGroup>::Iterator)
0019BEA4 FTTALG::BinaryFind<CrowdSortG,FTTVector<TGfxCrowdSeat *>::Iterator>(FTTVector<TGfxCrowdSeat *>::Iterator,FTTVector<TGfxCrowdSeat *>::Iterator,FTTVector<TGfxCrowdSeat *>::Iterator::ValueType const&)

`vtable for'FTTITR::FTTArrayIterator<int>
_ZTVN6FTTITR16FTTArrayIteratorIiEE:
  .long 0
  .long 0
off_323788:
  FTTITR::FTTArrayIterator<int>::operator++(void)
  FTTITR::FTTArrayIterator<int>::operator!=(FTTITR::FTTArrayIterator<int> const&)
  FTTITR::FTTArrayIterator<int>::operator*(void)
  FTTITR::FTTArrayIterator<int>::operator->(void)
  FTTITR::FTTArrayIterator<int>::operator+=(long const&)
  FTTITR::FTTArrayIterator<int>::operator-=(long const&)
  FTTITR::FTTArrayIterator<int>::operator[](long const&)
  FTTITR::FTTArrayIterator<int>::operator+(long const&)
  FTTITR::FTTArrayIterator<int>::operator-(long const&)
  FTTITR::FTTArrayIterator<int>::operator-(FTTITR::FTTArrayIterator<int> const&)

002107F4
FTTVector<FTTPair<CFTTBMMMatrixCache::Key,CFTTBMMMatrixCache::StartCount> >::Iterator
          FTTALG::Find< FTTHashTable<CFTTBMMMatrixCache::Key,
                                    CFTTBMMMatrixCache::StartCount,
                                    CFTTBMMMatrixCache::KeyHash,
                                    FTTEqual,
                                    FTTVector<FTTPair<CFTTBMMMatrixCache::Key,
                                                      CFTTBMMMatrixCache::StartCount> > >::Compare,
                        CFTTBMMMatrixCache::Key,
                        FTTVector<FTTPair<CFTTBMMMatrixCache::Key, CFTTBMMMatrixCache::StartCount> >::Iterator>
          (FTTVector<FTTPair<CFTTBMMMatrixCache::Key,
                            CFTTBMMMatrixCache::StartCount> >::Iterator,
          FTTVector<FTTPair<CFTTBMMMatrixCache::Key,
                            CFTTBMMMatrixCache::StartCount> >::Iterator,
          CFTTBMMMatrixCache::Key const&)

          at1.FTTVector::Iterator.list_4
*/

namespace FTTALG {
template <typename TCompare,
          typename TKey,
          typename TVecIterator>
__attribute__((noinline)) static TVecIterator Find(TVecIterator at1,
                                                   TVecIterator at2,
                                                   TKey at3) {
  TVecIterator tret;
  TVecIterator r7_it = at1;

  while (1) {  // loc_210816
    tret = r7_it;
    if (tret != at2) {
      // loc_21080A
      if (TCompare::HashCompare(r7_it, at3)) {
        break;
      }

      r7_it += 1;
    } else {
      break;
    }
  }

  // locret_21081E
  return tret;
};
};  // namespace FTTALG

#endif  //_FTTALG_H_