namespace ov::op::v8

namespace v8 {

// classes

class AdaptiveAvgPool;
class AdaptiveMaxPool;
class DeformableConvolution;
class DetectionOutput;
class Gather;
class GatherND;
class I420toBGR;
class I420toRGB;
class If;
class MatrixNms;
class MaxPool;
class MulticlassNms;
class NV12toBGR;
class NV12toRGB;
class PriorBox;
class RandomUniform;
class Slice;
class Softmax;

// global functions

template <class TShape>
std::vector<TShape> shape_infer(
    const AdaptiveAvgPool \* op,
    const std::vector<TShape>& input_shapes,
    const std::map<size_t, HostTensorPtr>& constant_data = {}
    );

template <class TShape>
void shape_infer(
    const AdaptiveAvgPool \* op,
    const std::vector<TShape>& input_shapes,
    std::vector<TShape>& output_shapes,
    const std::map<size_t, HostTensorPtr>& constant_data = {}
    );

template <class TShape>
std::vector<TShape> shape_infer(
    const AdaptiveMaxPool \* op,
    const std::vector<TShape>& input_shapes,
    const std::map<size_t, HostTensorPtr>& constant_data = {}
    );

template <class TShape>
void shape_infer(
    const AdaptiveMaxPool \* op,
    const std::vector<TShape>& input_shapes,
    std::vector<TShape>& output_shapes,
    const std::map<size_t, HostTensorPtr>& constant_data = {}
    );

template <class TShape>
std::vector<TShape> shape_infer(
    const DeformableConvolution \* op,
    const std::vector<TShape>& input_shapes,
    CoordinateDiff& pads_begin,
    CoordinateDiff& pads_end,
    const std::map<size_t, HostTensorPtr>& constant_data = {}
    );

template <class T>
void shape_infer(
    const DetectionOutput \* op,
    const std::vector<T>& input_shapes,
    std::vector<T>& output_shapes
    );

template <class TShape>
void shape_infer(
    const GatherND \* op,
    const std::vector<TShape>& input_shapes,
    std::vector<TShape>& output_shapes
    );

template <class TShape, class TContainer>
std::vector<TShape> shape_infer(
    const MaxPool \* op,
    const std::vector<TShape>& input_shapes,
    TContainer& pads_begin,
    TContainer& pads_end,
    const std::map<size_t, HostTensorPtr>& constant_data = {}
    );

template <class T>
void shape_infer(
    const Slice \* op,
    const std::vector<T>& input_shapes,
    std::vector<T>& output_shapes,
    const std::map<size_t, std::shared_ptr<ngraph::runtime::HostTensor>>& constant_data = {}
    );

} // namespace v8