{% from 'macros.tmpl' import license %}
{% from 'fields/field.tmpl' import getter_expression, setter_expression, fieldwise_copy %}
{{license()}}

#include "core/ComputedStyleBase.h"
#include "platform/wtf/SizeAssertions.h"

namespace blink {

struct SameSizeAsComputedStyleBase {
  {% if computed_style.subgroups is defined %}
  void* dataRefs[{{computed_style.subgroups|length}}];
  {% endif %}
  {% for field in computed_style.fields|rejectattr("is_bit_field") %}
  {{field.type_name}} {{field.name}}};
  {% endfor %}
  unsigned m_bit_fields[{{computed_style.num_32_bit_words_for_bit_fields}}];
};

// If this fails, the packing algorithm in make_computed_style_base.py has
// failed to produce the optimal packed size. To fix, update the algorithm to
// ensure that the buckets are placed so that each takes up at most 1 word.
ASSERT_SIZE(ComputedStyleBase, SameSizeAsComputedStyleBase);

void ComputedStyleBase::InheritFrom(const ComputedStyleBase& other,
                                    IsAtShadowBoundary isAtShadowBoundary) {
  {{fieldwise_copy(computed_style, computed_style.all_fields
      |selectattr("is_inherited")
      |list
    )|indent(2)}}
}

void ComputedStyleBase::CopyNonInheritedFromCached(
    const ComputedStyleBase& other) {
  {{fieldwise_copy(computed_style, computed_style.all_fields
      |rejectattr("is_nonproperty")
      |rejectattr("is_inherited")
      |list
    )|indent(2)}}
}

void ComputedStyleBase::PropagateIndependentInheritedProperties(
    const ComputedStyleBase& parentStyle) {
  {% for field in computed_style.all_fields if field.is_property and field.is_independent %}
  if ({{field.is_inherited_method_name}}())
    {{setter_expression(field)}} = parentStyle.{{getter_expression(field)}};
  {% endfor %}
}

} // namespace blink
