{% from 'macros.tmpl' import license, print_if %}
{{license()}}

#ifndef ComputedStyleBase_h
#define ComputedStyleBase_h

#include "core/style/ComputedStyleConstants.h"
#include "core/CoreExport.h"
{% for path in include_paths %}
#include "{{path}}"
{% endfor %}

{# Each field template has macros that we can call to generate specific
   aspects of the field (e.g. getters, setters).
#}
{% import 'fields/keyword.tmpl' as keyword %}
{% import 'fields/primitive.tmpl' as primitive %}
{% import 'fields/monotonic_flag.tmpl' as monotonic_flag %}
{% import 'fields/storage_only.tmpl' as storage_only %}
{% import 'fields/external.tmpl' as external %}
{% from 'fields/field.tmpl' import encode %}
{% set field_templates = {
     'keyword': keyword,
     'primitive': primitive,
     'monotonic_flag': monotonic_flag,
     'storage_only': storage_only, 
     'external': external
   } %}

namespace blink {

// The generated portion of ComputedStyle. For more info, see the header comment
// in ComputedStyle.h.
class CORE_EXPORT ComputedStyleBase {
 public:
  inline bool independentInheritedEqual(const ComputedStyleBase& o) const {
    return (
    {% for field in fields if field.is_inherited and field.is_independent %}
        {{field.name}} == o.{{field.name}}{{print_if(not loop.last, ' &&')}}
    {% endfor %}
    );
  }

  inline bool nonIndependentInheritedEqual(const ComputedStyleBase& o) const {
    return (
    {% for field in fields if field.is_inherited and not field.is_independent %}
        {{field.name}} == o.{{field.name}}{{print_if(not loop.last, ' &&')}}
    {% endfor %}
    );
  }

  inline bool inheritedEqual(const ComputedStyleBase& o) const {
    return independentInheritedEqual(o) && nonIndependentInheritedEqual(o);
  }

  inline bool nonInheritedEqual(const ComputedStyleBase& o) const {
    return (
    {% for field in fields if field.is_property and not field.is_inherited %}
        {{field.name}} == o.{{field.name}}{{print_if(not loop.last, ' &&')}}
    {% endfor %}
    );
  }

  enum IsAtShadowBoundary {
    AtShadowBoundary,
    NotAtShadowBoundary,
  };
  void inheritFrom(const ComputedStyleBase& inheritParent,
                   IsAtShadowBoundary isAtShadowBoundary = NotAtShadowBoundary);

  void copyNonInheritedFromCached(const ComputedStyleBase& other);

  // Copies the values of any independent inherited properties from the parent
  // style that are marked as inherited by this style.
  void propagateIndependentInheritedProperties(
      const ComputedStyleBase& parentStyle);

  // Fields.
  // TODO(sashab): Remove initialFoo() static methods and update callers to
  // use resetFoo(), which can be more efficient.

  {% for field in fields %}
  // {{field.property_name}}
  {{field_templates[field.field_template].decl_methods(field)|indent(2)}}

  {% endfor %}
 protected:
  // Constructor and destructor are protected so that only the parent class ComputedStyle
  // can instantiate this class.
  ALWAYS_INLINE ComputedStyleBase() :
  {% for field in fields %}
      {{field.name}}({{encode(field, field.default_value)}}){{print_if(not loop.last, ',')}}
  {% endfor %}
  {}

  ~ComputedStyleBase() = default;

  // Storage.
  {% for field in fields %}
  {% if field.is_bit_field %}
  unsigned {{field.name}} : {{field.size}}; // {{field.type_name}}
  {% else %}
  {{field.type_name}} {{field.name}};
  {% endif %}
  {% endfor %}
};

} // namespace blink

#endif // ComputedStyleBase_h
