namespace InferenceEngine::gapi::kernels::avx

namespace avx {

// typedefs

typedef std::integral_constant<int, 3> C3;
typedef std::integral_constant<int, 4> C4;

// global functions

CV_ALWAYS_INLINE void main_computation_horizontalPass_lpi4(
    const v_uint8& val_0,
    const v_uint8& val_1,
    const v_uint8& val_2,
    const v_uint8& val_3,
    const v_int16& a10,
    const v_int16& a32,
    const v_int16& a54,
    const v_int16& a76,
    v_uint8& shuf_mask1,
    v_uint8& shuf_mask2,
    v_uint8& res1,
    v_uint8& res2
    );

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

CV_ALWAYS_INLINE v_uint8 setHorizontalShufMask1();
CV_ALWAYS_INLINE v_uint8 setHorizontalShufMask2();

CV_ALWAYS_INLINE void verticalPass_anylpi_8U(
    const uint8_t \* src0[],
    const uint8_t \* src1[],
    uint8_t tmp[],
    const int& beta0,
    const int l,
    const int length1,
    const int length2
    );

template <int chanNum>
CV_ALWAYS_INLINE bool calcRowLinear_8UC_Impl(
    avx2_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 horizontalPass_lpi4_8UC1(
    const short clone[],
    const short mapsx[],
    uint8_t tmp[],
    uint8_t \* dst[],
    const int& length
    );

CV_ALWAYS_INLINE void horizontalPass_anylpi_8U(
    const short alpha[],
    const short mapsx[],
    uint8_t \* dst[],
    const uchar tmp[],
    const int l,
    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 avx