/* Scilab2C FOSSEE IIT BOMBAY */

#ifndef __INT_CAT_H
#define __INT_CAT_H

/* Column Cat */

/* Same input elements */

#define s0s0cats2(in1,in2,out)					scolumncats(in1,in2,out)
		
#define d0d0catd2(in1,in2,out)					dcolumncats(in1,in2,out)

#define c0c0catc2(in1,in2,out)					ccolumncats(in1,in2,out)

#define z0z0catz2(in1,in2,out)					zcolumncats(in1,in2,out)

#define u80u80catu82(in1,in2,out)                              u8columncats(in1,in2,out)

#define u160u160catu162(in1,in2,out)                           u16columncats(in1,in2,out)

#define i80i80cati82(in1,in2,out)                              i8columnscats(in1,in2,out)

#define i160i160cati162(in1,in2,out)                           i16columnscats(in1,in2,out)

#define s2s2cats2(in1,size1,in2,size2,out)			scolumncata(in1, size1[0], size1[1], in2, size2[0], size2[1], out)

#define d2d2catd2(in1,size1,in2,size2,out)			dcolumncata(in1, size1[0], size1[1], in2, size2[0], size2[1], out)

/* ROW COLUMN SUPPORT for cat, If First argument in cat command is 1 then it will concatenate the element ROW WISE else COLUMN WISE */

#define d0d2d2catd2(in1,in2,size2,in3,size3,out)                (in1 == 1) ? drowcata(in2, size2[0], size2[1], in3, size3[0], size3[1], out) : dcolumncata(in2, size2[0],size2[1],in3,size3[0],size3[1],out)

#define d0u82u82catu82(in1,in2,size2,in3,size3,out)                (in1 == 1) ? u8rowcata(in2, size2[0], size2[1], in3, size3[0], size3[1], out) : u8columncata(in2, size2[0],size2[1],in3,size3[0],size3[1],out)

#define d0u162u162catu162(in1,in2,size2,in3,size3,out)                (in1 == 1) ? u16rowcata(in2, size2[0], size2[1], in3, size3[0], size3[1], out) : u16columncata(in2, size2[0],size2[1],in3,size3[0],size3[1],out)


#define d0i82i82cati82(in1,in2,size2,in3,size3,out)                (in1 == 1) ? i8rowcata(in2, size2[0], size2[1], in3, size3[0], size3[1], out) : i8columncata(in2, size2[0],size2[1],in3,size3[0],size3[1],out)

#define d0i162i162cati162(in1,in2,size2,in3,size3,out)                (in1 == 1) ? i16rowcata(in2, size2[0], size2[1], in3, size3[0], size3[1], out) : i16columncata(in2, size2[0],size2[1],in3,size3[0],size3[1],out)


#define c2c2catc2(in1,size1,in2,size2,out)			ccolumncata(in1, size1[0], size1[1], in2, size2[0], size2[1], out)

#define z2z2catz2(in1,size1,in2,size2,out)			zcolumncata(in1, size1[0], size1[1], in2, size2[0], size2[1], out)

#define u82u82catu82(in1,size1,in2,size2,out)                  u8columncata(in1,size1[0], size1[1], in2, size2[0], size2[1], out)

#define u162u162catu162(in1,size1,in2,size2,out)               u16columncata(in1,size1[0], size1[1], in2, size2[0], size2[1], out)

#define i82i82cati82(in1,size1,in2,size2,out)                  i8columncata(in1,size1[0], size1[1], in2, size2[0], size2[1], out)

#define i162i162cati162(in1,size1,in2,size2,out)               i16columncata(in1,size1[0], size1[1], in2, size2[0], size2[1], out)



/* Differents input elements */
#define s0c0catc2(in1,in2,out)					c0c0OpRcc2(FloatComplex(in1,0),in2,out)
		
#define d0z0catz2(in1,in2,out)					z0z0OpRcz2(DoubleComplex(in1,0),in2,out)

#define c0s0catc2(in1,in2,out)					c0c0OpRcc2(in1,FloatComplex(in2,0),out)

#define z0d0catz2(in1,in2,out)					z0z0OpRcz2(in1,DoubleComplex(in2,0),out)

#define s2c2catc2(in1,size1,in2,size2,out)			sfilla((float*)out,size1[0],size1[1],0); \
										c2c2OpRcc2(FloatComplexMatrix(in1,(float*)out,size1[0]*size1[1]), size1, in2, size2, out)

#define d2z2catz2(in1,size1,in2,size2,out)			dfilla((double*)out,size1[0],size1[1],0);  \
										z2z2OpRcz2(DoubleComplexMatrix(in1,(double*)out,size1[0]*size1[1]), size1, in2, size2, out)

#define c2s2catc2(in1,size1,in2,size2,out)			sfilla((float*)out,size2[0],size2[1],0);  \
										c2c2OpRcc2(in1, size1, FloatComplexMatrix(in2,(float*)out,size2[0]*size2[1]), size2, out)

#define z2d2catz2(in1,size1,in2,size2,out)			dfilla((double*)out,size2[0],size2[1],0);  \
										z2z2OpRcz2(in1, size1, DoubleComplexMatrix(in2,(double*)out,size2[0]*size2[1]), size2, out)

/* Matrix-Scalar */

/* Same type */

#define s2s0cats2(in1,size,in2,out)				{ float temp=in2; \
										  scolumncata(in1, size[0], size[1],&temp, 1, 1, out); \
										}

#define d2d0catd2(in1,size,in2,out)				{ double temp=in2; \
										  dcolumncata(in1, size[0], size[1],&temp, 1, 1, out); \
										}
										
#define c2c0catc2(in1,size,in2,out)				{ floatComplex temp=in2; \
										 ccolumncata(in1, size[0], size[1], &temp, 1, 1, out); \
										}

#define z2z0catz2(in1,size,in2,out)				{ doubleComplex temp=in2; \
										 zcolumncata(in1, size[0], size[1], &temp, 1, 1, out); \
										}

#define u82u80catu82(in1,size,in2,out)                         { uint8 temp=in2; \
                                                                                 u8columncata(in1,size[0],size[1],&temp,1,1,out); \
                                                                                }
#define u162u160catu162(in1,size,in2,out)                      { uint16 temp=in2; \
                                                                                  u16columncata(in1,size[0],size[1],&temp,1,1,out); \
                                                                                }
#define i82i80cati82(in1,size,in2,out)                         { int8 temp=in2; \
                                                                                 i8columncata(in1,size[0],size[1],&temp,1,1,out); \
                                                                                }
#define i162i160cati162(in1,size,in2,out)                      { int16 temp=in2; \
                                                                                  i16columncata(in1,size[0],size[1],&temp,1,1,out); \
                                                                                }


/* Different type */
#define s2c0catc2(in1,size,in2,out)				{ floatComplex temp=in2; \
										sfilla((float *)out,size[0],size[1],0);  \
										scolumncata(FloatComplexMatrix(in1,(float*)out,size[0]*size[1]), size[0], size[1], &temp , 1, 1, out); \
										}

#define d2z0catz2(in1,size,in2,out)				{ doubleComplex temp=in2; \
										dfilla((double *)out,size[0],size[1],0);  \
										zcolumncata(DoubleComplexMatrix(in1,(double *)out,size[0]*size[1]), size[0], size[1], &temp , 1, 1, out); \
										}

#define c2s0catc2(in1,size,in2,out)				{ floatComplex temp = FloatComplex(in2,0);   \
										  ccolumncata(in1, size[0], size[1], &temp, 1, 1, out); \
										}

#define z2d0catz2(in1,size,in2,out)				{ doubleComplex temp = DoubleComplex(in2,0);   \
										   zcolumncata(in1, size[0], size[1], &temp, 1, 1, out); \
										}

/* Scalar-Matrix */

/* Same type */
#define s0s2cats2(in1,in2,size,out)				{ \
 float __tmp1 = in1 ;\
 scolumncata(&__tmp1 , 1, 1, in2, size[0], size[1], out);\
}
#define d0d2catd2(in1,in2,size,out)				{\
 double __tmp1 = in1 ;\
 dcolumncata(&__tmp1 , 1, 1, in2, size[0], size[1], out); \
}

#define c0c2catc2(in1,in2,size,out)				{ \
 floatComplex __tmp1 = in1 ;\
 ccolumncata(&__tmp1, 1, 1, in2, size[0], size[1], out);\
}

#define z0z2catz2(in1,in2,size,out)				{ \
 doubleComplex  __tmp1 = in1 ;\
 zcolumncata(&__tmp1, 1, 1, in2, size[0], size[1], out);\
}

#define u80u82catu82(in1,in2,size,out)                         {\
 uint8 __tmp1 = in1 ;\
 u8columncata(&__tmp1,1,1,in2,size[0],size[1],out);\
}

#define u160u162catu162(in1,in2,size,out)                         {\
 uint16 __tmp1 = in1 ;\
 u16columncata(&__tmp1,1,1,in2,size[0],size[1],out);\
}

#define i80i82cati82(in1,in2,size,out)                         {\
 int8 __tmp1 = in1 ;\
 i8columncata(&__tmp1,1,1,in2,size[0],size[1],out);\
}

#define i160i162cati162(in1,in2,size,out)                         {\
 int16 __tmp1 = in1 ;\
 i16columncata(&__tmp1,1,1,in2,size[0],size[1],out);\
}


/* Different type */
#define s0c2catc2(in1,in2,size,out)				c0c2OpRcc2(FloatComplex(in1,0),in2,size,out)

#define d0z2catz2(in1,in2,size,out)				z0z2OpRcz2(DoubleComplex(in1,0),in2,size,out)

#define c0s2catc2(in1,in2,size,out)				sfilla((float*)out,size[0],size[1],0); \
										c0c2OpRcc2(in1,FloatComplexMatrix(in2,(float*)out,size[0]*size[1]),size,out)

#define z0d2catz2(in1,in2,size,out)				dfilla((double*)out,size[0],size[1],0);  \
										z0z2OpRcz2(in1,DoubleComplexMatrix(in2,(double*)out,size[0]*size[1]),size,out)


/* Column Cat */

/* Same input elements */

#define s0s0cats2(in1,in2,out)					srowcats(in1,in2,out)
		
#define d0d0catd2(in1,in2,out)					drowcats(in1,in2,out)

#define c0c0catc2(in1,in2,out)					crowcats(in1,in2,out)

#define z0z0catz2(in1,in2,out)					zrowcats(in1,in2,out)

#define u80u80catu82(in1,in2,out)                              u8rowcats(in1,in2,out)

#define u160u160catu162(in1,in2,out)                           u16rowcats(in1,in2,out)

#define i80i80cati82(in1,in2,out)                              i8rowcats(in1,in2,out)

#define i160i160cati162(in1,in2,out)                           i16rowcats(in1,in2,out)

#define s2s2cats2(in1,size1,in2,size2,out)			srowcata(in1, size1[0], size1[1], in2, size2[0], size2[1], out)

#define d2d2catd2(in1,size1,in2,size2,out)			drowcata(in1, size1[0], size1[1], in2, size2[0], size2[1], out)

#define c2c2catc2(in1,size1,in2,size2,out)			crowcata(in1, size1[0], size1[1], in2, size2[0], size2[1], out)

#define z2z2catz2(in1,size1,in2,size2,out)			zrowcata(in1, size1[0], size1[1], in2, size2[0], size2[1], out)

#define u82u82catu82(in1,size1,in2,size2,out)                  u8rowcata(in1, size1[0], size1[1], in2, size2[0], size2[1], out)

#define u162u162catu162(in1,size1,in2,size2,out)               u16rowcata(in1, size1[0], size1[1], in2, size2[0], size2[1], out)

#define i82i82cati82(in1,size1,in2,size2,out)                  i8rowcata(in1, size1[0], size1[1], in2, size2[0], size2[1], out)

#define i162i162cati162(in1,size1,in2,size2,out)               i16rowcata(in1, size1[0], size1[1], in2, size2[0], size2[1], out)

/* Differents input elements */
#define s0c0catc2(in1,in2,out)					c0c0OpCcc2(FloatComplex(in1,0),in2,out)
		
#define d0z0catz2(in1,in2,out)					z0z0OpCcz2(DoubleComplex(in1,0),in2,out)

#define c0s0catc2(in1,in2,out)					c0c0OpCcc2(in1,FloatComplex(in2,0),out)

#define z0d0catz2(in1,in2,out)					z0z0OpCcz2(in1,DoubleComplex(in2,0),out)

#define s2c2catc2(in1,size1,in2,size2,out)			sfilla((float*)out,size1[0],size1[1],0); \
										c2c2OpCcc2(FloatComplexMatrix(in1,(float*)out,size1[0]*size1[1]), size1, in2, size2, out)

#define d2z2catz2(in1,size1,in2,size2,out)			dfilla((double*)out,size1[0],size1[1],0);  \
										z2z2OpCcz2(DoubleComplexMatrix(in1,(double*)out,size1[0]*size1[1]), size1, in2, size2, out)

#define c2s2catc2(in1,size1,in2,size2,out)			sfilla((float*)out,size2[0],size2[1],0);  \
										c2c2OpCcc2(in1, size1, FloatComplexMatrix(in2,(float*)out,size2[0]*size2[1]), size2, out)

#define z2d2catz2(in1,size1,in2,size2,out)			dfilla((double*)out,size2[0],size2[1],0); \
										z2z2OpCcz2(in1, size1, DoubleComplexMatrix(in2,(double*)out,size2[0]*size2[1]), size2, out)

/* Matrix-Scalar */

/* Same type */

#define s2s0cats2(in1,size,in2,out)				{ float temp=in2; \
										  srowcata(in1, size[0], size[1],&temp, 1, 1, out); \
										}

#define d2d0catd2(in1,size,in2,out)				{ double temp=in2; \
										  drowcata(in1, size[0], size[1],&temp, 1, 1, out); \
										}

#define c2c0catc2(in1,size,in2,out)				{ floatComplex temp = in2;   \
										  crowcata(in1, size[0], size[1],&temp, 1, 1, out);\
										}

#define z2z0catz2(in1,size,in2,out)				{ doubleComplex temp =in2;   \
										  zrowcata(in1, size[0], size[1],&temp, 1, 1, out);\
								}

#define u82u80catu82(in1,size,in2,out)                         { uint8 temp=in2; \
                                                                                 u8rowcata(in1, size[0], size[1],&temp, 1,1,out);\
                                                                }
#define u162u160catu162(in1,size,in2,out)                      { uint16 temp=in2; \
                                                                                 u16rowcata(in1, size[0], size[1],&temp, 1,1,out);\
                                                                }

#define i82i80cati82(in1,size,in2,out)                         { int8 temp=in2; \
                                                                                 i8rowcata(in1, size[0], size[1],&temp, 1,1,out);\
                                                                }
#define i162i160cati162(in1,size,in2,out)                      { int16 temp=in2; \
                                                                                 i16rowcata(in1, size[0], size[1],&temp, 1,1,out);\
                                                                }



/* Different type */
#define s2c0catc2(in1,size,in2,out)				sfilla((float *)out,size[0],size[1],0); \
										c2c0OpCcc2(FloatComplexMatrix(in1,(float*)out,size[0]*size[1]),size,in2,out)

#define d2z0catz2(in1,size,in2,out)				dfilla((double *)out,size[0],size[1],0); \
										z2z0OpCcz2(DoubleComplexMatrix(in1,(double *)out,size[0]*size[1]),size,in2,out)

#define c2s0catc2(in1,size,in2,out)				{ floatComplex temp = FloatComplex(in2, 0); 	c2c0OpCcc2(in1, size, temp, out)}

#define z2d0catz2(in1,size,in2,out)				{ doubleComplex temp = DoubleComplex(in2, 0); 	z2z0OpCcz2(in1, size, temp, out)}
					

/* Scalar-Matrix */

/* Same type */
#define s0s2cats2(in1,in2,size,out)				{ \
 float __tmp1 = in1 ;\
 srowcata(&__tmp1, 1, 1, in2, size[0], size[1], out);\
}

#define d0d2catd2(in1,in2,size,out)				{ \
 double __tmp1 = in1 ;\
 drowcata(&__tmp1, 1, 1, in2, size[0], size[1], out);\
}

#define c0c2catc2(in1,in2,size,out)				{ \
 floatComplex __tmp1 = in1 ;\
 crowcata(&__tmp1, 1, 1, in2, size[0], size[1], out);\
}

#define z0z2catz2(in1,in2,size,out)				{ \
 doubleComplex __tmp1 = in1 ;\
 zrowcata(&__tmp1, 1, 1, in2, size[0], size[1], out);\
}

#define u80u82catu82(in1,in2,size,out)                         { \
  uint8 __tmp1 = in1;\
  u8rowcata(&__tmp1, 1,1, in2, size[0], size[1], out);\
}

#define u160u162catu162(in1,in2,size,out)                         { \
  uint16 __tmp1 = in1;\
  u16rowcata(&__tmp1, 1,1, in2, size[0], size[1], out);\
}

#define i80i82cati82(in1,in2,size,out)                         { \
  int8 __tmp1 = in1;\
  i8rowcata(&__tmp1, 1,1, in2, size[0], size[1], out);\
}

#define i160i162cati162(in1,in2,size,out)                         { \
  int16 __tmp1 = in1;\
  i16rowcata(&__tmp1, 1,1, in2, size[0], size[1], out);\
}


/* Different type */
#define s0c2catc2(in1,in2,size,out)				c0c2OpCcc2(FloatComplex(in1,0),in2,size,out)

#define d0z2catz2(in1,in2,size,out)				z0z2OpCcz2(DoubleComplex(in1,0),in2,size,out)

#define c0s2catc2(in1,in2,size,out)				sfilla((float*)out,size[0],size[1],0); \
										c0c2OpCcc2(in1,FloatComplexMatrix(in2,(float*)out,size[0]*size[1]),size,out)

#define z0d2catz2(in1,in2,size,out)				dfilla((double*)out,size[0],size[1],0);  \
										z0z2OpCcz2(in1,DoubleComplexMatrix(in2,(double*)out,size[0]*size[1]),size,out)


#endif /* !__INT_CAT__H */