namespace InferenceEngine::gapi::kernels::neon

namespace neon {

// typedefs

typedef std::integral_constant<int, 3> C3;
typedef std::integral_constant<int, 4> C4;
typedef MapperUnit<float, int> MapperUnit32F;
typedef MapperUnit<Q0_16, short> MapperUnit8U;

// global functions

template <int chanNum>
CV_ALWAYS_INLINE void channels2planes_store(
    std::array<std::array<uint8_t \*, 4>, chanNum>& dst,
    const uchar \* src,
    const int width,
    const int line
    );

CV_ALWAYS_INLINE void vertical_anyLPI(
    const uchar \* src0,
    const uchar \* src1,
    uchar \* tmp,
    const int inLength,
    const short beta
    );

template <int chanNum>
CV_ALWAYS_INLINE void horizontal_anyLPI(
    std::array<std::array<uint8_t \*, 4>, chanNum>& dst,
    const uchar \* src,
    const short mapsx[],
    const short alpha[],
    const int width,
    const int line
    );

CV_ALWAYS_INLINE void vertical_4LPI(
    const uint8_t \* src0[],
    const uint8_t \* src1[],
    uchar tmp[],
    const short beta[],
    const int length
    );

template <int chanNum>
CV_ALWAYS_INLINE void horizontal_4LPI(
    std::array<std::array<uint8_t \*, 4>, chanNum>& dst,
    const uchar \* tmp,
    const short mapsx[],
    const uchar _mask_horizontal[],
    const short clone[],
    const int length
    );

template <int chanNum>
CV_ALWAYS_INLINE bool calcRowLinear_8UC_Impl(
    neon_tag,
    std::array<std::array<uint8_t \*, 4>, chanNum>& dst,
    const uint8_t \* src0[],
    const uint8_t \* src1[],
    const short alpha[],
    const short clone[],
    const short mapsx[],
    const short beta[],
    uint8_t tmp[],
    const Size& inSz,
    const Size& outSz,
    const int lpi
    );

CV_ALWAYS_INLINE void horizontal_4LPI(
    uint8_t \* dst[],
    const uchar \* tmp,
    const short mapsx[],
    const short clone[],
    const int length
    );

CV_ALWAYS_INLINE void horizontal_anyLPI(
    uint8_t \* dst,
    const uchar \* src,
    const short mapsx[],
    const short alpha[],
    const int length
    );

void calcRowArea_8U(
    uchar dst[],
    const uchar \* src[],
    const Size& inSz,
    const Size& outSz,
    Q0_16 yalpha,
    const MapperUnit8U& ymap,
    int xmaxdf,
    const short xindex[],
    const Q0_16 xalpha[],
    Q8_8 vbuf[]
    );

void calcRowArea_32F(
    float dst[],
    const float \* src[],
    const Size& inSz,
    const Size& outSz,
    float yalpha,
    const MapperUnit32F& ymap,
    int xmaxdf,
    const int xindex[],
    const float xalpha[],
    float vbuf[]
    );

} // namespace neon