// CFTTBMMMatrixCache - [2020-04-13 11:57:46]
#ifndef _CFTTBMMMATRIXCACHE_H_
#define _CFTTBMMMATRIXCACHE_H_

#include "CFTTMatrix32.h"
#include "FTTHashTable.h"
#include "FTTPair.h"
#include "TUV.h"
#include "CFTTModel.h"
#include "FTTVector.h"

/*
0020F31C CFTTBMMMatrixCache::CFTTBMMMatrixCache(bool,uint,uint)
0020F400 CFTTBMMMatrixCache::~CFTTBMMMatrixCache()
0020F83C CFTTBMMMatrixCache::Add(CFTTBMMMatrixCache::Key const&)
0020FFAA CFTTBMMMatrixCache::Reset(bool)
002106A8 CFTTBMMMatrixCache::Prepare(CFTTBMMMatrixCache::Key const&)
0021083C CFTTBMMMatrixCache::Key::operator==(CFTTBMMMatrixCache::Key const&)

*/

enum EFTTEqual {
  EFTTEqual_0
};

class CFTTBMMMatrixCache {
public:
  CFTTBMMMatrixCache(bool, uint, uint);  // 0020F31C
  ~CFTTBMMMatrixCache();                 // 0020F400

  //0xC
  class Key {
  public:
    bool operator==(Key const&) const;  // 0021083C
    CFTTModel* p_cfttmodel_0;
    CFTTMatrix32* p_cfttmatrix32_4;
    // ushort field_8;
    char field_8;  // 0020F8A2 030   LDRB R0, [R4,#8]
    char field_9;
  };

  class StartCount {
  public:
    // inline StartCount& operator=(StartCount const& other);//可能存在的函数被内联了
    StartCount() {
      field_0 = 0;
      field_4 = 0;
    }
    int field_0;
    int field_4;
  };

  //static uint KeyHash(CFTTBMMMatrixCache::Key k);

  //此函数被00210640内联的
  class KeyHash {
  public:
    static uint TableHash(Key const& k) {
      uint r0 = 0xEA856B22 * k.field_9;
      uint r2 = 0xA83B8312 * ((uint)k.p_cfttmatrix32_4);
      uint r7 = 0xF109E78A * k.field_8;
      uint r6 = 0xA83B8312 * ((uint)k.p_cfttmodel_0);
      return r2 ^ r6 ^ r7 ^ r0;
    };
  };

  CFTTBMMMatrixCache::StartCount Add(Key const&);  // 0020F83C
  void Reset(bool);                                // 0020FFAA
  void Prepare(Key const&);                        // 002106A8

  FTTHashTable<CFTTBMMMatrixCache::Key,
               CFTTBMMMatrixCache::StartCount,
               CFTTBMMMatrixCache::KeyHash,
               FTTEqual,
               FTTVector<FTTPair<CFTTBMMMatrixCache::Key, CFTTBMMMatrixCache::StartCount>>>
      ftthashtable_0;
  FTTVector<CFTTMatrix32> fttvector_c;
  bool field_20;
};

// inline CFTTBMMMatrixCache::StartCount& CFTTBMMMatrixCache::StartCount::operator=(CFTTBMMMatrixCache::StartCount const &other) { //可能存在的函数被内联了
//  this->field_0 = other.field_0;
//  this->field_4 = other.field_4;
//  return *this;
// }
//(CFTTBMMMatrixCache::Key,CFTTBMMMatrixCache::StartCount)

#endif  //_CFTTBMMMATRIXCACHE_H_