
// Copyright (c) 2020-2023, ARM Limited.
//
//    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.

#ifndef OPS_IMAGE_H
#define OPS_IMAGE_H

#include "graph_node.h"

using namespace tosa;

namespace TosaReference
{

template <TOSA_REF_TYPE InDtype, TOSA_REF_TYPE OutDtype, typename resize_t>
class OpResize : public GraphNode
{
public:
    OpResize(SubgraphTraverser* sgt_, TosaAttributeBase* attribute_, uint64_t id_);
    virtual ~OpResize();
    virtual int checkTensorAttributes() final;
    virtual int eval();

    using InEigenType      = typename GetEigenType<InDtype>::type;
    using InEigenShapeType = typename GetEigenType<TOSA_REF_TYPE_SHAPE>::type;
    using OutEigenType     = typename GetEigenType<OutDtype>::type;
    using TIn              = Eigen::Tensor<InEigenType, 4>;
    using TInShape         = Eigen::Tensor<InEigenShapeType, 1>;
    using TOut             = Eigen::Tensor<OutEigenType, 4>;

protected:
    TosaResizeAttribute* attribute;
    ResizeMode mode;
    TosaReference::TensorTemplate<TIn>* in;
    TosaReference::TensorTemplate<TInShape>* scale;
    TosaReference::TensorTemplate<TInShape>* offset;
    TosaReference::TensorTemplate<TInShape>* border;
    TosaReference::TensorTemplate<TOut>* out;
};

};    // namespace TosaReference

#endif
