{% from 'dictionary_impl_common.cc.tmpl' import dictionary_setter_impl with context %}
{% filter format_blink_cpp_source_code %}

{% include 'copyright_block.txt' %}
#ifndef {{header_guard}}
#define {{header_guard}}

{% for filename in header_includes %}
#include "{{filename}}"
{% endfor %}

namespace blink {

{% for decl in header_forward_decls %}
class {{decl}};
{% endfor %}

{# FIXME: Add "final" if this class doesn\'t have subclasses #}
class {{exported}}{{cpp_class}} : public {{parent_cpp_class}} {
 public:
  static {{cpp_class}}* Create() { return MakeGarbageCollected<{{cpp_class}}>(); }
  static {{cpp_class}}* Create(v8::Isolate* isolate) {
    return MakeGarbageCollected<{{cpp_class}}>();
  }

  {{cpp_class}}();
  virtual ~{{cpp_class}}();

  {% for member in members %}
  bool {{member.has_method_name}}() const { return {{member.has_method_expression}}; }
  {{member.rvalue_cpp_type}} {{member.getter_name}}() const {
    {% if member.nullable_indicator_name and not member.has_explicit_presence %}
    DCHECK({{member.nullable_indicator_name}});
    {% endif %}
    return {{member.getter_expression}};
  }
  {{member.setter_inline}}void {{member.setter_name}}({{member.rvalue_cpp_type}});
  {% if member.null_setter_name %}
  {{member.setter_inline}}void {{member.null_setter_name}}();
  {% endif %}
  {% if member.is_nullable %}
  // Migration adapters
  // Returns true iff this member has a non-null value.  Returns false if the
  // value is missing or a null value.
  bool {{member.non_null_has_method_name}}() const { return {{member.has_method_expression}}; }
  // Returns the value if this member has a non-null value.  Call
  // |{{member.non_null_has_method_name}}| in advance to check the condition.
  {{member.rvalue_cpp_type}} {{member.non_null_getter_name}}() const {
    DCHECK({{member.non_null_has_method_name}}());
    return {{member.getter_expression}};
  }
  {% endif %}

  {% endfor %}
  v8::Local<v8::Value> ToV8Impl(v8::Local<v8::Object>, v8::Isolate*) const override;
  void Trace(Visitor*) const override;

 private:
  {% for member in members if member.nullable_indicator_name %}
  bool {{member.nullable_indicator_name}} = false;
  {% endfor %}

  {% for member in members %}
  {{member.member_cpp_type}} {{member.cpp_name}}_;
  {% endfor %}

  friend class V8{{cpp_class}};
};

{% for member in members if member.setter_inline %}
{{dictionary_setter_impl(member)}}
{% endfor %}

}  // namespace blink

#endif  // {{header_guard}}

{% endfilter %}{# format_blink_cpp_source_code #}
