// Patched by Edge Impulse to include reference and hardware-accelerated kernels
#include "../../../../classifier/ei_classifier_config.h"
#if EI_CLASSIFIER_TFLITE_ENABLE_ARC == 1
/* Copyright 2020 The TensorFlow Authors. All Rights Reserved.

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 TENSORFLOW_LITE_MICRO_KERNELS_ARC_MLI_SLICERS_H_
#define TENSORFLOW_LITE_MICRO_KERNELS_ARC_MLI_SLICERS_H_

#include "mli_api.h"  // NOLINT
namespace tflite {
namespace ops {
namespace micro {

class TensorSlicer {
 public:
  TensorSlicer(const mli_tensor* full_tensor, int slice_dim, int slice_size,
               int padding_pre = 0, int padding_post = 0, int overlap = 0,
               bool interleave_mode = false);
  ~TensorSlicer() = default;

  void Next();
  bool Done();
  int GetPaddingPre();
  int GetPaddingPost();

  mli_tensor* Sub();

  // Default constructor is deleted
  TensorSlicer() = delete;

 private:
  const mli_tensor* full_tensor_;
  mli_tensor sub_tensor_;
  mli_sub_tensor_cfg sub_cfg_;
  bool done_;
  int sliceDim_;
  int pad_pre_, pad_post_, overlap_;
  int actual_padding_pre, actual_padding_post;

  void ComputeSubTensor();
};

}  // namespace micro
}  // namespace ops
}  // namespace tflite
#endif  // TENSORFLOW_LITE_MICRO_KERNELS_ARC_MLI_SLICERS_H_

#endif // EI_CLASSIFIER_TFLITE_ENABLE_ARC == 1
