{#
 Copyright (c) 2021 Arm Limited. All rights reserved.
 SPDX-License-Identifier: Apache-2.0

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
#}
{{common_template_header}}

#ifndef GENERATED_TEST_DATA_H
#define GENERATED_TEST_DATA_H

#include <cstdint>

{% for namespace in namespaces %}
namespace {{namespace}} {
{% endfor %}

#define NUMBER_OF_IFM_FILES  ({{ifm_count}}U)
#define NUMBER_OF_OFM_FILES  ({{ofm_count}}U)
{% for ifm_size in ifm_var_sizes %}
#define IFM_{{loop.index0}}_DATA_SIZE  ({{ifm_size}}U)
{% endfor %}
{% for ofm_size in ofm_var_sizes %}
#define OFM_{{loop.index0}}_DATA_SIZE  ({{ofm_size}}U)
{% endfor %}

{% for ifm_var_name in ifm_var_names %}
extern const {{data_type}} {{ifm_var_name}}[IFM_{{loop.index0}}_DATA_SIZE];
{% endfor %}

{% for ofm_var_name in ofm_var_names %}
extern const {{data_type}} {{ofm_var_name}}[OFM_{{loop.index0}}_DATA_SIZE];
{% endfor %}

const {{data_type}}* get_ifm_data_array(const uint32_t idx);
const {{data_type}}* get_ofm_data_array(const uint32_t idx);

{% for namespace in namespaces %}
} /* namespace {{namespace}} */
{% endfor %}

#endif /* GENERATED_TEST_DATA_H */
