#!/usr/bin/python
BINARY_OPERATORS={
    '+':'cvAdd',
    '-':'cvSub', 
    '/':'cvDiv', 
    '*':'cvMul',
    '^':'cvXor',
    '&':'cvAnd',
    '|':'cvOr',
}
SCALAR_OPERATORS={
    '+':'cvAddS',
    '-':'cvSubS', 
    '&':'cvAndS',
    '|':'cvOrS',
    '^':'cvXorS',
}
SCALE_OPERATORS={
    '*':'val',
    '/':'1.0/val'
}
CMP_OPERATORS={
    '==':'CV_CMP_EQ',
    '!=':'CV_CMP_NE',
    '>=':'CV_CMP_GE',
    '>':'CV_CMP_GT',
    '<=':'CV_CMP_LE',
    '<':'CV_CMP_LT',
}
ARR={
    'CvMat':'cvCreateMat(self->rows, self->cols, self->type)',
    'IplImage':'cvCreateImage(cvGetSize(self), self->depth, self->nChannels)'
}
CMP_ARR={
    'CvMat':'cvCreateMat(self->rows, self->cols, CV_8U)',
    'IplImage':'cvCreateImage(cvGetSize(self), IPL_DEPTH_8U, 1)' 
}

def scalar_scale_operator(arr, op, arg):
    print '\t%s * operator %s (double val){' % (arr, op)
    print '\t\t%s * res = %s;' % (arr, ARR[arr] )
    print '\t\tcvScale(self, res, %s);' % arg
    print '\t\treturn res;'
    print '\t}'
    print '\t%s * operator %s (double val){' % (arr, op)
    print '\t\t%s * res = %s;' % (arr, ARR[arr] )
    print '\t\tcvScale(self, res, %s);' % arg
    print '\t\treturn res;'
    print '\t}'

print "/** This file was automatically generated using util/cvarr_operators.py script */"

for arr in ARR:
    print '%%extend %s {' % arr
    for op in BINARY_OPERATORS:
        print '\t%%newobject operator %s;' % (op)
        print '\t%s * operator %s (CvArr * src){' % ( arr, op )
        print '\t\t%s * res = %s;' % ( arr, ARR[arr] )
        print '\t\t%s(self, src, res);' % ( BINARY_OPERATORS[op] )
        print '\t\treturn res;'
        print '\t}'
        print '\t%s * operator %s= (CvArr * src){' % ( arr, op )
        print '\t\t%s(self, src, self);' % ( BINARY_OPERATORS[op] )
        print '\t\treturn self;'
        print '\t}'
    for op in SCALAR_OPERATORS:
        print '\t%%newobject operator %s;' % (op)
        print '\t%s * operator %s (CvScalar val){' % ( arr, op )
        print '\t\t%s * res = %s;' % ( arr, ARR[arr] )
        print '\t\t%s(self, val, res);' % ( SCALAR_OPERATORS[op] )
        print '\t\treturn res;'
        print '\t}'
        print '\t%s * operator %s= (CvScalar val){' % ( arr, op )
        print '\t\t%s(self, val, self);' % ( SCALAR_OPERATORS[op] )
        print '\t\treturn self;'
        print '\t}'
    for op in CMP_OPERATORS:
        print '\t%%newobject operator %s;' % (op)
        print '\t%s * operator %s (CvArr * src){' % ( arr, op )
        print '\t\t%s * res = %s;' % ( arr, CMP_ARR[arr] )
        print '\t\tcvCmp(self, src, res, %s);' % ( CMP_OPERATORS[op] )
        print '\t\treturn res;'
        print '\t}'
        print '\t%s * operator %s (double val){' % ( arr, op )
        print '\t\t%s * res = %s;' % ( arr, CMP_ARR[arr] )
        print '\t\tcvCmpS(self, val, res, %s);' % ( CMP_OPERATORS[op] )
        print '\t\treturn res;'
        print '\t}'

    for op in SCALE_OPERATORS:
        print '\t%%newobject operator %s;' % (op)
        print '\t%s * operator %s (double val){' % (arr, op)
        print '\t\t%s * res = %s;' % (arr, ARR[arr] )
        print '\t\tcvScale(self, res, %s);' % SCALE_OPERATORS[op]
        print '\t\treturn res;'
        print '\t}'
        print '\t%s * operator %s= (double val){' % (arr, op)
        print '\t\tcvScale(self, self, %s);' % SCALE_OPERATORS[op]
        print '\t\treturn self;'
        print '\t}'


    print '} /* extend %s */\n' % arr