blob: 6fbf1ae5d5a933884f4413c788d5901770534743 [file] [log] [blame]
{% from "templates/macros.tmpl" import license, source_files_for_generated_file %}
{{ license() }}
{{source_files_for_generated_file(template_file, input_files)}}
#include "{{this_include_path}}"
#include <memory>
#include "base/stl_util.h" // for base::size()
#include "third_party/blink/renderer/platform/wtf/static_constructors.h"
#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
namespace blink {
namespace {{cpp_namespace}} {
DEFINE_GLOBAL(AtomicString, {{namespace_prefix}}NamespaceURI);
{% if tags %}
// Tags
void* tag_storage[kTagsCount * ((sizeof({{namespace}}QualifiedName) + sizeof(void *) - 1) / sizeof(void *))];
{% for tag in tags|sort(attribute='name', case_sensitive=True) %}
const {{namespace}}QualifiedName& {{tag|symbol}}Tag = reinterpret_cast<{{namespace}}QualifiedName*>(&tag_storage)[{{loop.index0}}];
{% endfor %}
std::unique_ptr<const {{namespace}}QualifiedName*[]> GetTags() {
auto tags = std::make_unique<const {{namespace}}QualifiedName*[]>(kTagsCount);
for (size_t i = 0; i < kTagsCount; ++i)
tags[i] = reinterpret_cast<{{namespace}}QualifiedName*>(&tag_storage) + i;
return tags;
}
{% endif %}
// Attributes
void* attr_storage[kAttrsCount * ((sizeof(QualifiedName) + sizeof(void *) - 1) / sizeof(void *))];
{% for attr in attrs|sort(attribute='name', case_sensitive=True) %}
const QualifiedName& {{attr|symbol}}Attr = reinterpret_cast<QualifiedName*>(&attr_storage)[{{loop.index0}}];
{% endfor %}
{% if namespace != 'HTML' %}
std::unique_ptr<const QualifiedName*[]> GetAttrs() {
auto attrs = std::make_unique<const QualifiedName*[]>(kAttrsCount);
for (size_t i = 0; i < kAttrsCount; ++i)
attrs[i] = reinterpret_cast<QualifiedName*>(&attr_storage) + i;
return attrs;
}
{% endif %}
void Init() {
struct NameEntry {
const char* name;
unsigned hash;
unsigned char length;
unsigned char is_tag;
unsigned char is_attr;
};
// Namespace
// Use placement new to initialize the globals.
AtomicString ns_uri("{{namespace_uri}}");
new ((void*)&{{namespace_prefix}}NamespaceURI) AtomicString(ns_uri);
{% set tagnames = tags|map(attribute='name')|list() %}
{% set attrnames = attrs|map(attribute='name')|list() %}
static const NameEntry kNames[] = {
{% for name, tag_list in (tags + attrs)|groupby('name')|sort(attribute=0, case_sensitive=True) %}
{ "{{name}}", {{name.original|hash}}, {{name.original|length}}, {{ (name in tagnames)|int }}, {{ (name in attrnames)|int }} },
{% endfor %}
};
{% if tags %}
size_t tag_i = 0;
{% endif %}
size_t attr_i = 0;
for (size_t i = 0; i < base::size(kNames); ++i) {
StringImpl* impl = StringImpl::CreateStatic(kNames[i].name, kNames[i].length, kNames[i].hash);
{% if tags %}
if (kNames[i].is_tag) {
void* address = reinterpret_cast<{{namespace}}QualifiedName*>(&tag_storage) + tag_i;
QualifiedName::CreateStatic(address, impl, ns_uri);
++tag_i;
}
if (!kNames[i].is_attr)
continue;
{% endif %}
void* address = reinterpret_cast<QualifiedName*>(&attr_storage) + attr_i;
{% if use_namespace_for_attrs %}
QualifiedName::CreateStatic(address, impl, ns_uri);
{% else %}
QualifiedName::CreateStatic(address, impl);
{% endif %}
++attr_i;
}
{% if tags %}
DCHECK_EQ(tag_i, kTagsCount);
{% endif %}
DCHECK_EQ(attr_i, kAttrsCount);
}
} // namespace {{cpp_namespace}}
} // namespace blink