/* * Copyright (c) 2022, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include #include namespace Web::DOM { struct ImplTraits : public Traits { static unsigned hash(QualifiedName::Impl* impl) { return pair_int_hash(impl->local_name.hash(), pair_int_hash(impl->prefix.hash(), impl->namespace_.hash())); } static bool equals(QualifiedName::Impl* a, QualifiedName::Impl* b) { return a->local_name == b->local_name && a->prefix == b->prefix && a->namespace_ == b->namespace_; } }; static HashTable impls; static NonnullRefPtr ensure_impl(FlyString const& local_name, FlyString const& prefix, FlyString const& namespace_) { auto hash = pair_int_hash(local_name.hash(), pair_int_hash(prefix.hash(), namespace_.hash())); auto it = impls.find(hash, [&](QualifiedName::Impl* entry) { return entry->local_name == local_name && entry->prefix == prefix && entry->namespace_ == namespace_; }); if (it != impls.end()) return *(*it); return adopt_ref(*new QualifiedName::Impl(local_name, prefix, namespace_)); } QualifiedName::QualifiedName(FlyString const& local_name, FlyString const& prefix, FlyString const& namespace_) : m_impl(ensure_impl(local_name, prefix, namespace_)) { } QualifiedName::Impl::Impl(FlyString const& a_local_name, FlyString const& a_prefix, FlyString const& a_namespace) : local_name(a_local_name) , prefix(a_prefix) , namespace_(a_namespace) { impls.set(this); make_internal_string(); } QualifiedName::Impl::~Impl() { impls.remove(this); } // https://dom.spec.whatwg.org/#concept-attribute-qualified-name // https://dom.spec.whatwg.org/#concept-element-qualified-name void QualifiedName::Impl::make_internal_string() { // This is possible to do according to the spec: "User agents could have this as an internal slot as an optimization." if (prefix.is_null()) { as_string = local_name; return; } as_string = String::formatted("{}:{}", prefix, local_name); } }