Packages
evision
0.1.18
1.0.1-rc.0
1.0.0
1.0.0-rc.0
0.2.17
0.2.17-rc2
0.2.17-rc1
0.2.16
0.2.16-pre.2
0.2.16-pre
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.2-rc2
0.2.1
0.2.0
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
retired
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
0.1.26-rc3
0.1.26-rc2
0.1.26-rc1
0.1.26-rc0
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
OpenCV-Erlang/Elixir binding.
Current section
Files
Jump to
Current section
Files
py_src/erl_enum_expression_generator.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import ast
import sys
class ErlEnumExpressionGenerator(ast.NodeVisitor):
def __init__(self):
self.expression = ''
self.expression_erlang = ''
self.skip_this = False
def generic_visit(self, node):
if type(node) is ast.Expression:
self.visit(node.body)
elif type(node) is ast.Constant:
self.expression = f'{node.value}'
self.expression_erlang = f'{node.value}'
elif type(node) is ast.UnaryOp:
op = ErlEnumExpressionGenerator()
op.visit(node.op)
operand = ErlEnumExpressionGenerator()
operand.visit(node.operand)
self.expression = op.expression.format(operand.expression)
self.expression_erlang = op.expression_erlang.format(operand.expression_erlang)
elif type(node) is ast.USub:
self.expression = '-{}'
self.expression_erlang = '-{}'
elif type(node) is ast.BinOp:
op = ErlEnumExpressionGenerator()
op.visit(node.op)
lhs = ErlEnumExpressionGenerator()
lhs.visit(node.left)
rhs = ErlEnumExpressionGenerator()
rhs.visit(node.right)
self.expression = op.expression.format(lhs.expression, rhs.expression)
self.expression_erlang = op.expression_erlang.format(lhs.expression_erlang, rhs.expression_erlang)
elif type(node) is ast.LShift:
self.expression = 'bsl({}, {})'
self.expression_erlang = '({} bsl {})'
elif type(node) is ast.RShift:
self.expression = 'bsr({}, {})'
self.expression_erlang = '({} bsr {})'
elif type(node) is ast.Name:
if node.id[:3] == 'CV_':
if node.id == 'CV_8U':
self.expression = '0'
self.expression_erlang = '0'
elif node.id == 'CV_8S':
self.expression = '1'
self.expression_erlang = '1'
elif node.id == 'CV_16U':
self.expression = '2'
self.expression_erlang = '2'
elif node.id == 'CV_16S':
self.expression = '3'
self.expression_erlang = '3'
elif node.id == 'CV_32S':
self.expression = '4'
self.expression_erlang = '4'
elif node.id == 'CV_32F':
self.expression = '5'
self.expression_erlang = '5'
elif node.id == 'CV_64F':
self.expression = '6'
self.expression_erlang = '6'
elif node.id == 'CV_16F':
self.expression = '7'
self.expression_erlang = '7'
elif node.id == 'CV_MAT_CONT_FLAG':
self.skip_this = True
elif node.id == 'CV_SUBMAT_FLAG':
self.skip_this = True
else:
print(type(node), node.id, "not handled yet")
sys.exit(1)
else:
self.expression = f'cv_{node.id}()'
self.expression_erlang = f'cv_{node.id}()'
elif type(node) is ast.Mult:
self.expression = '({} * {})'
self.expression_erlang = '({} * {})'
elif type(node) is ast.Add:
self.expression = '({} + {})'
self.expression_erlang = '({} + {})'
elif type(node) is ast.Sub:
self.expression = '({} - {})'
self.expression_erlang = '({} - {})'
elif type(node) is ast.BitAnd:
self.expression = 'band({}, {})'
self.expression_erlang = '({} band {})'
elif type(node) is ast.Invert:
self.expression = 'bnot({})'
self.expression_erlang = 'bnot({})'
elif type(node) is ast.BitOr:
self.expression = 'bor({}, {})'
self.expression_erlang = '({} bor {})'
else:
if sys.version_info.minor < 8:
if type(node) is ast.Num:
self.expression = f'{node.n}'
self.expression_erlang = f'{node.n}'
else:
print(type(node), "not implemented yet")
sys.exit(1)
else:
print(type(node), "not implemented yet")
sys.exit(1)