/*
 * Copyright (c) 2017-2018 ARM Limited.
 *
 * SPDX-License-Identifier: MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
#ifndef __ARM_COMPUTE_CLDEPTHCONCATENATE_H__
#define __ARM_COMPUTE_CLDEPTHCONCATENATE_H__

#include "arm_compute/core/CL/OpenCL.h"
#include "arm_compute/core/Types.h"
#include "arm_compute/core/Window.h"
#include "arm_compute/runtime/IFunction.h"

#include "arm_compute/core/CL/kernels/CLDepthConcatenateLayerKernel.h"
#include "arm_compute/core/CL/kernels/CLFillBorderKernel.h"

#include <memory>
#include <vector>

namespace arm_compute
{
class ICLTensor;

/** Basic function to execute concatenate tensors along z axis. This function calls the following kernels:
 *
 * -# @ref CLFillBorderKernel (executed if input's lowest two dimensions are smaller than respective output's dimensions)
 * -# @ref CLDepthConcatenateLayerKernel
 *
 */
class CLDepthConcatenateLayer : public IFunction
{
public:
    /** Default constructor */
    CLDepthConcatenateLayer();
    /** Initialise the kernel's inputs vector and output.
     *
     * @param[in,out] inputs_vector The vectors containing all the tensors to concatenate. Data types supported: QASYMM8/F16/F32.
     *                              Input dimensions might differ for each input for the first three dimensions (width, height, depth)
     *                              and must match for the rest.
     *                              Note that the difference between the minimum and maximum width and height among the input tensors
     *                              must be divisible by 2 otherwise it is not clear how padding should be added on the inputs' width and
     *                              height when they are less than the maximum input sizes.
     * @param[out]    output        Output tensor. Data types supported: Same as @p input.
     *                              Output tensor dimensions match the inputs' ones from the fourth dimension and above,
     *                              while width and height are the maximum width and height of the input tensors.
     *                              Finally, depth is the sum of the input depths.
     */
    void configure(const std::vector<ICLTensor *> &inputs_vector, ICLTensor *output);
    /** Static function to check if given info will lead to a valid configuration of @ref CLDepthConcatenateLayer
     *
     * @param[in] inputs_vector The vectors containing all the tensors to concatenate. Data types supported: QASYMM8/F16/F32.
     *                          Input dimensions might differ for each input for the first three dimensions (width, height, depth)
     *                          and must match for the rest.
     *                          Note that the difference between the minimum and maximum width and height among the input tensors
     *                          must be divisible by 2 otherwise it is not clear how padding should be added on the inputs' width and
     *                          height when they are less than the maximum input sizes.
     * @param[in] output        Output tensor. Data types supported: Same as @p input.
     *                          Output tensor dimensions match the inputs' ones from the fourth dimension and above,
     *                          while width and height are the maximum width and height of the input tensors.
     *                          Finally, depth is the sum of the input depths.
     *
     * @return a status
     */
    static Status validate(const std::vector<ITensorInfo *> &inputs_vector, const ITensorInfo *output);

    // Inherited methods overridden:
    void run() override;

private:
    std::vector<ICLTensor *>                         _inputs_vector;
    std::unique_ptr<CLDepthConcatenateLayerKernel[]> _concat_kernels_vector;
    std::unique_ptr<CLFillBorderKernel[]>            _border_handlers_vector;
    unsigned int                                     _num_inputs;
};
}
#endif /* __ARM_COMPUTE_CLDEPTHCONCATENATE_H__ */
