#ifndef __ComboValueTranslator_h__
#define __ComboValueTranslator_h__
#pragma once
class IComboValueTranslator
{
public:
virtual int GetDefaultComboIndex() = 0;
virtual int ComboIndexFromValue(int nValue) = 0;
virtual int ValueFromComboIndex(int nIndex) = 0;
};
template <class T>
class IComboValueTranslatorImpl : public IComboValueTranslator
{
public:
virtual int GetDefaultComboIndex()
{
T* pThis = static_cast<T*>(this);
int cElements;
int iDefault;
pThis->ProvideArray(&cElements, &iDefault);
return iDefault;
}
virtual int ComboIndexFromValue(int nValue)
{
T* pThis = static_cast<T*>(this);
int cElements;
int iDefault;
const static int* pArray = pThis->ProvideArray(&cElements, &iDefault);
for (int i = 0; i < cElements; ++i)
if (pArray[i] == nValue)
return i;
return iDefault;
}
virtual int ValueFromComboIndex(int nIndex)
{
T* pThis = static_cast<T*>(this);
int cElements;
int iDefault;
const static int* pArray = pThis->ProvideArray(&cElements, &iDefault);
return pArray[nIndex];
}
public:
const static int* ProvideArray(int* pcElements, int* piDefault);
};
#define BEGIN_ComboTranslator(NAME, DEFAULT) \
class NAME : public IComboValueTranslatorImpl<CTeamCountTranslator> \
{ \
public: \
const static int* ProvideArray(int* pcElements, int* piDefault) \
{ \
const static int s_iDefault = DEFAULT; \
const static int s_array[] = \
{
#define END_ComboTranslator(NAME) \
}; \
const static int s_cElements = sizeof(s_array) / sizeof(s_array[0]); \
\
*pcElements = s_cElements; \
*piDefault = s_iDefault; \
} \
} s_##NAME##ComboTranslator;
#endif