/// ****************************************************************************
/// @file   
/// @author Dr.Neeton
/// @date   200X/X/X - 2014/01/14
/// 
/// @brief  ON/OFFのみのテーブル管理。
/// 
/// ****************************************************************************

#pragma once

#include "../../Base/CPL_Core_Basic.h"
#include "../../Pointer/CPL_Core_Pointer.h"


namespace CPL {
namespace Core {


// _____________________________________________________________________________
/// @brief スイッチテーブル管理クラス
///
// *****************************************************************************
class SwitchTable
  : public Core::BaseObject
{
protected:
  U32* m_table;
  SDEF m_num;
  SDEF m_false_idx; // OFFの最小インデックス
  SDEF m_true_idx;  // ONの最小インデックス
  SDEF m_count;     // ONカウント数

public:
  void Clear( bool flag );
  SDEF GetNum(){ return m_count; }
  bool GetCheck( SDEF idx )
  {
    SDEF index = idx >> 5;
    CPL_BREAK(index > ((m_num+31)>>5));
    CPL_BREAK(index<0);
    return ((m_table[ idx >> 5 ] & ((U32)1 << (idx&0x1f))) != 0);
  }
  void SetCheck( SDEF in_idx, bool in_sw );
  SDEF GetMinFalseIdx() const { return m_false_idx; }
  SDEF GetMinTrueIdx()  const { return m_true_idx; }
  SDEF GetFalseNum()    const { return m_num - m_count; }
  SDEF GetTrueNum()     const { return m_count; }

  SwitchTable( SDEF num )
    : m_table( CPL_NEW(U32)[ (num+31)>>5 ] )
    , m_num(num)
  {
    Clear( false );
  }
  ~SwitchTable()
  {
    DEL_ARR(m_table,(U32*)nullptr);
  }
};


} // namespace Core
} // namespace CPL
