Begun making template for dictionary

This commit is contained in:
Fantasmos 2017-10-27 22:31:54 +11:00
parent af7fefee1e
commit 823d3112ad
3 changed files with 188 additions and 5 deletions

View File

@ -321,7 +321,146 @@ core::stringc ListUserConfigParam<T, U>::toString() const
return "";
} // toString
// ============================================================================
template<typename T, typename U>
MapUserConfigParam<T, U>::MapUserConfigParam(const char* param_name,
const char* comment)
{
m_param_name = param_name;
all_params.push_back(this);
if (comment != NULL) m_comment = comment;
} // MapUserConfigParam
// ============================================================================
template<typename T, typename U>
MapUserConfigParam<T, U>::MapUserConfigParam(const char* param_name,
const char* comment,
int nb_elements,
...)
{
m_param_name = param_name;
all_params.push_back(this);
if (comment != NULL) m_comment = comment;
// add the default list
va_list arguments;
va_start(arguments, nb_elements);
for (int i = 0; i < nb_elements; i++)
m_elements.push_back(T(va_arg(arguments, U)));
va_end(arguments); // Cleans up the list
} // MapUserConfigParam
// ============================================================================
template<typename T, typename U>
MapUserConfigParam<T, U>::MapUserConfigParam(const char* param_name,
GroupUserConfigParam* group,
const char* comment)
{
m_param_name = param_name;
group->addChild(this);
if (comment != NULL) m_comment = comment;
} // MapUserConfigParam
// ============================================================================
template<typename T, typename U>
MapUserConfigParam<T, U>::MapUserConfigParam(const char* param_name,
GroupUserConfigParam* group,
const char* comment,
int nb_elements,
...)
{
m_param_name = param_name;
group->addChild(this);
if (comment != NULL) m_comment = comment;
// add the default list
va_list arguments;
va_start(arguments, nb_elements);
for (int i = 0; i < nb_elements; i++)
m_elements.push_back(va_arg(arguments, T));
va_end(arguments); // Cleans up the list
} // MapUserConfigParam
// ----------------------------------------------------------------------------
template<typename T, typename U>
void MapUserConfigParam<T, U>::write(std::ofstream& stream) const
{
const int elts_amount = m_elements.size();
// comment
if (m_comment.size() > 0) stream << " <!-- " << m_comment.c_str();
stream << " -->\n <" << m_param_name.c_str() << "\n";
stream << " Size=\"" << elts_amount << "\"\n";
// actual elements
//for (int n = 0; n<elts_amount; n++)
for (std::map<T, U>::iterator it = m_elements.begin(); it != m_elements.end(); ++it)
{
stream << " " << it->first << "=\"" << it->second << "\"\n";
}
stream << " >\n";
stream << " </" << m_param_name.c_str() << ">\n\n";
} // write
// ----------------------------------------------------------------------------
template<typename T, typename U>
void MapUserConfigParam<T, U>::findYourDataInAChildOf(const XMLNode* node)
{
const XMLNode* child = node->getNode(m_param_name);
if (child == NULL)
{
//Log::error("User Config", "Couldn't find parameter group %s", m_param_name.c_str());
return;
}
int attr_count = 0;
child->get("Size", &attr_count);
for (int n = 0; n<attr_count; n++)
{
T elt;
std::string str;
child->get(StringUtils::toString(n), &str);
StringUtils::fromString<T>(str, elt);
// check if the element is already there :
bool there = false;
for (unsigned int i = 0; i < m_elements.size(); i++)
{
if (elt == m_elements[i])
{
there = true;
break;
}
}
if (!there)
{
m_elements.push_back(elt);
}
}
} // findYourDataInAChildOf
// ----------------------------------------------------------------------------
template<typename T, typename U>
void MapUserConfigParam<T, U>::findYourDataInAnAttributeOf(const XMLNode* node)
{
} // findYourDataInAnAttributeOf
// ----------------------------------------------------------------------------
template<typename T, typename U>
void MapUserConfigParam<T, U>::addElement(T element, U value)
{
m_elements[element] = value;
} // findYourDataInAnAttributeOf
// ----------------------------------------------------------------------------
template<typename T, typename U>
core::stringc MapUserConfigParam<T, U>::toString() const
{
return "";
} // toString
// ============================================================================
IntUserConfigParam::IntUserConfigParam(int default_value,

View File

@ -136,6 +136,50 @@ public:
}; // ListUserConfigParam
typedef ListUserConfigParam<std::string, const char*> StringListUserConfigParam;
template<typename T, typename U>
class MapUserConfigParam : public UserConfigParam
{
std::map<T, U> m_elements;
public:
MapUserConfigParam(const char* param_name,
const char* comment = NULL);
MapUserConfigParam(const char* param_name,
const char* comment,
int nb_elts,
...);
MapUserConfigParam(const char* param_name,
GroupUserConfigParam* group,
const char* comment = NULL);
MapUserConfigParam(const char* param_name,
GroupUserConfigParam* group,
const char* comment,
int nb_elts,
...);
void write(std::ofstream& stream) const;
void findYourDataInAChildOf(const XMLNode* node);
void findYourDataInAnAttributeOf(const XMLNode* node);
void addElement(T element, U value);
irr::core::stringc toString() const;
operator std::map<T,U>() const
{
return m_elements;
}
float& operator=(const std::map<T,U>& v)
{
m_elements = std::map<T, U>(v); return m_elements;
}
float& operator=(const MapUserConfigParam& v)
{
m_elements = std::map<T,U>(v); return m_elements;
}
}; // ListUserConfigParam
typedef MapUserConfigParam<std::string, const char*> StringToStringUserConfigParam;
// ============================================================================
class IntUserConfigParam : public UserConfigParam
{
@ -372,12 +416,12 @@ namespace UserConfigParams
// ---- Gamemode setup
PARAM_PREFIX StringListUserConfigParam m_karts_per_gamemode
PARAM_DEFAULT(StringListUserConfigParam("karts_per_gamemode", "The karts per gamemode"
PARAM_PREFIX StringToStringUserConfigParam m_karts_per_gamemode
PARAM_DEFAULT(StringToStringUserConfigParam("karts_per_gamemode", "The karts per gamemode"
"Number of karts per gamemode. Order corresponds to Enum value",
10,
"3",
"3",
"3",
"3",
"3",
"3",
"3",

View File

@ -164,7 +164,7 @@ void TrackInfoScreen::init()
m_ai_kart_spinner->setVisible(has_AI);
getWidget<LabelWidget>("ai-text")->setVisible(has_AI);
std::vector<std::string> karts_per_gamemode = UserConfigParams::m_karts_per_gamemode;
std::vector<std::string> karts_per_gamemode;//UserConfigParams::m_karts_per_gamemode;
if (has_AI)
{