// SPDX-FileCopyrightText: Contributors to the Power Grid Model project <powergridmodel@lfenergy.org>
//
// SPDX-License-Identifier: MPL-2.0

// This header file is automatically generated. DO NOT modify it manually!

// clang-format off
#pragma once

#include "meta_data.hpp"

#include "../common/common.hpp"
#include "../common/enum.hpp"
#include "../common/three_phase_tensor.hpp"
{% autoescape false %}
namespace power_grid_model {

{% for attribute_class in classes -%}

{%- if attribute_class.is_template -%}
template <symmetry_tag sym_type>
struct {{ attribute_class.name }} {
    using sym = sym_type;
{% else -%}
struct {{ attribute_class.name }} {
{%- endif -%}

{%- for attribute in attribute_class.full_attributes %}
    {{ attribute.data_type }} {{ attribute.names }}{ {{- attribute.nan_value -}} };
    {%- if attribute.description %}  // {{ attribute.description }}{%- endif %}
{%- endfor %}
{% for base_class in attribute_class.base_attributes %}
    // implicit conversions to {{ base_class }}
    operator {{ base_class }}&() { return reinterpret_cast<{{ base_class }}&>(*this); }
    operator {{ base_class }} const&() const { return reinterpret_cast<{{ base_class }} const&>(*this); }
{% endfor -%}
};
{% if attribute_class.is_template %}
using Sym{{ attribute_class.name }} = {{ attribute_class.name }}<symmetric_t>;
using Asym{{ attribute_class.name }} = {{ attribute_class.name }}<asymmetric_t>;
{% endif %}
{% endfor %}

} // namespace power_grid_model

// clang-format on
{% endautoescape %}
