/*
 * Copyright (c) 2022 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.
 */
#ifndef BASE_PROCESSING_HPP
#define BASE_PROCESSING_HPP

#include "Model.hpp"

namespace arm {
namespace app {

    /**
     * @brief   Base class exposing pre-processing API.
     *          Use cases should provide their own PreProcessing class that inherits from this one.
     *          All steps required to take raw input data and populate tensors ready for inference
     *          should be handled.
     */
    class BasePreProcess {

    public:
        virtual ~BasePreProcess() = default;

        /**
         * @brief       Should perform pre-processing of 'raw' input data and load it into
         *              TFLite Micro input tensors ready for inference
         * @param[in]   input      Pointer to the data that pre-processing will work on.
         * @param[in]   inputSize  Size of the input data.
         * @return      true if successful, false otherwise.
         **/
        virtual bool DoPreProcess(const void* input, size_t inputSize) = 0;

    protected:
        Model* m_model = nullptr;
    };

    /**
     * @brief   Base class exposing post-processing API.
     *          Use cases should provide their own PostProcessing class that inherits from this one.
     *          All steps required to take inference output and populate results vectors should be handled.
     */
    class BasePostProcess {

    public:
        virtual ~BasePostProcess() = default;

        /**
         * @brief       Should perform post-processing of the result of inference then populate
         *              populate result data for any later use.
         * @return      true if successful, false otherwise.
         **/
        virtual bool DoPostProcess() = 0;

    protected:
        Model* m_model = nullptr;
    };

} /* namespace app */
} /* namespace arm */

#endif /* BASE_PROCESSING_HPP */