// RadixConverter.h: interface for the CRadixConverter class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_RADIXCONVERTER_H__E2901CAA_F542_457C_99A4_88D4581CBA69__INCLUDED_)
#define AFX_RADIXCONVERTER_H__E2901CAA_F542_457C_99A4_88D4581CBA69__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "HugeCalc.h"

class CHugeInt;
class CHugeIntX;

#define RC_API HUGECALC_API

class RC_API CRadixConverter
{
public:
    explicit CRadixConverter( CONST UINT32 u32Radix, CONST SIGN enumSign = SIGN_POS, CONST LPCVECTOR_UINT32 pVector = NULL );
    explicit CRadixConverter( CONST UINT32 u32Radix, CONST CHugeInt& right );
    explicit CRadixConverter( CONST UINT32 u32Radix, CONST CHugeIntX& right );
    // For bases up to 36, case is ignored; upper-case and lower-case letters have the same value.
    // For bases 37 to 62, upper-case letter represent the usual 10..35 while lower-case letter
    //     represent 36..61.
    explicit CRadixConverter( CONST UINT32 u32Radix, CONST LPCTSTR lpszNum );
    explicit CRadixConverter( CONST CRadixConverter& right );
    /*virtual */~CRadixConverter();

    static CONST UINT32 GetCount( VOID );

    // reload operator ->
    CRadixConverter * CONST operator ->( VOID );

    CRadixConverter& Convert2Radix( CONST UINT32 u32NewRadix );

    CRadixConverter& operator =( CONST CRadixConverter& right );
    CRadixConverter& operator =( CONST CHugeInt& right );
    CRadixConverter& operator =( CONST CHugeIntX& right );

    CRadixConverter& operator =( CONST SINT32& s32Num );
    CRadixConverter& operator =( CONST SINT64& s64Num );
    CRadixConverter& operator =( CONST UINT32& u32Num );
    CRadixConverter& operator =( CONST UINT64& u64Num );

    // Return non-zero if the value of (*this) fits in SINT32, UINT32, SINT64 or UINT64, respectively. Otherwise, return zero.
    operator CONST SINT32( VOID ) CONST;
    operator CONST SINT64( VOID ) CONST;
    operator CONST UINT32( VOID ) CONST;
    operator CONST UINT64( VOID ) CONST;

    VOID ResetRadix( CONST UINT32 u32Radix );
    VOID ResetSign( CONST SIGN enumSign );
    VOID ResetVector( CONST CVECTOR_UINT32& vU32Num );
    VOID ClearVector( VOID );

    CONST UINT32 GetRadix( VOID ) CONST;
    CONST SIGN GetSign( VOID ) CONST;
    CONST CVECTOR_UINT32& GetVector( CVECTOR_UINT32& vU32Num ) CONST;
    CONST UINT64 SumOfDigits( VOID ) CONST;

private:
    UINT32 m_u32Radix;
    SIGN m_enumSign;
    CVECTOR_UINT32 * CONST m_pVector;
};

#endif // !defined(AFX_RADIXCONVERTER_H__E2901CAA_F542_457C_99A4_88D4581CBA69__INCLUDED_)