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
|
#include "html.h"
#include "string_id.h"
#include <assert.h>
#ifndef LITEHTML_NO_THREADS
#include <mutex>
static std::mutex mutex;
#define lock_guard std::lock_guard<std::mutex> lock(mutex)
#else
#define lock_guard
#endif
namespace litehtml
{
static std::map<string, string_id> map;
static std::vector<string> array;
static int init()
{
string_vector names;
split_string(initial_string_ids, names, ",");
for (auto& name : names)
{
trim(name);
assert(name[0] == '_' && name.back() == '_');
name = name.substr(1, name.size() - 2); // _border_color_ -> border_color
std::replace(name.begin(), name.end(), '_', '-'); // border_color -> border-color
_id(name); // this will create association _border_color_ <-> "border-color"
}
return 0;
}
static int dummy = init();
const string_id empty_id = _id("");
const string_id star_id = _id("*");
string_id _id(const string& str)
{
lock_guard;
auto it = map.find(str);
if (it != map.end()) return it->second;
// else: str not found, add it to the array and the map
array.push_back(str);
return map[str] = (string_id)(array.size() - 1);
}
const string& _s(string_id id)
{
lock_guard;
return array[id];
}
} // namespace litehtml
|