1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
#include "StdAfx.h"
#include <algorithm>
#include <cctype>
#include "mmgr.h"
#include "CategoryHandler.h"
#include "LogOutput.h"
#include "creg/STL_Map.h"
#include "Util.h"
CR_BIND(CCategoryHandler, );
CR_REG_METADATA(CCategoryHandler, (
CR_MEMBER(categories),
CR_MEMBER(firstUnused),
CR_RESERVED(8)
));
CCategoryHandler* CCategoryHandler::instance;
void CCategoryHandler::RemoveInstance()
{
delete instance;
instance = NULL;
}
CCategoryHandler::CCategoryHandler() : firstUnused(0)
{
}
CCategoryHandler::~CCategoryHandler()
{
}
unsigned int CCategoryHandler::GetCategory(std::string name)
{
unsigned int cat = 0;
StringToLowerInPlace(name);
// remove leading spaces
while (!name.empty() && (*name.begin() == ' ')) {
name.erase(name.begin());
}
if (name.empty()) {
// the empty category
cat = 0;
} else if (categories.find(name) == categories.end()) {
// this category is yet unknown
if (firstUnused >= CCategoryHandler::GetMaxCategories()) {
// skip this category
logOutput.Print("WARNING: too many unit categories (%i), skipping %s", firstUnused, name.c_str());
cat = 0;
} else {
// create the category (bit field value)
cat = (1 << firstUnused);
// logOutput.Print("New cat %s #%i", name.c_str(), firstUnused);
}
// if (cat == 0), this will prevent further warnings for this category
categories[name] = cat;
firstUnused++;
} else {
// this category is already known
cat = categories[name];
}
return cat;
}
unsigned int CCategoryHandler::GetCategories(std::string names)
{
unsigned int ret = 0;
StringToLowerInPlace(names);
while (!names.empty()) {
std::string name = names;
if (names.find_first_of(' ') != std::string::npos) {
name.erase(name.find_first_of(' '), 5000);
}
if (names.find_first_of(' ') == std::string::npos) {
names.clear();
} else {
names.erase(0, names.find_first_of(' ') + 1);
}
ret |= GetCategory(name);
}
return ret;
}
std::vector<std::string> CCategoryHandler::GetCategoryNames(unsigned int bits) const
{
std::vector<std::string> names;
unsigned int bit;
for (bit = 1; bit != 0; bit = (bit << 1)) {
if ((bit & bits) != 0) {
std::map<std::string,unsigned int>::const_iterator it;
for (it = categories.begin(); it != categories.end(); ++it) {
if (it->second == bit) {
names.push_back(it->first);
}
}
}
}
return names;
}
|