| 412 | |
| 413 | |
| 414 | class Function: |
| 415 | def __init__(self, |
| 416 | name: str, |
| 417 | params: Optional[List[Parameter]] = None, |
| 418 | shared_size: bool = False, |
| 419 | returns: Optional[str] = None, |
| 420 | invoke: Optional[str] = None, |
| 421 | fname: Optional[str] = None, |
| 422 | return_name: Optional[str] = None, |
| 423 | virtual: bool = False, |
| 424 | **kwargs) -> None: |
| 425 | self.name = name |
| 426 | self.params = params or [] |
| 427 | self.shared_size = False |
| 428 | self.cfunction: Optional[CFunction] = None |
| 429 | self.fname = fname |
| 430 | self.invoke = invoke or '${__fname__}($@)' |
| 431 | self.return_name = return_name or 'out' |
| 432 | self.returns = Parameter(self.return_name, returns, |
| 433 | returns=True) if returns else None |
| 434 | for p in self.params: |
| 435 | p.virtual = virtual |
| 436 | if self.returns: |
| 437 | self.returns.virtual = virtual |
| 438 | |
| 439 | def share_params(self) -> None: |
| 440 | if self.shared_size == True: |
| 441 | size_param_name = 'size' |
| 442 | size_type = Type('size_t') |
| 443 | for param in self.params: |
| 444 | p = param.remove_size_param(size_param_name) |
| 445 | if p: |
| 446 | size_type = Type(p[0]) |
| 447 | self.params.append(Parameter(size_param_name, size_type.str())) |
| 448 | |
| 449 | def update(self) -> None: |
| 450 | self.share_params() |
| 451 | for param in self.params: |
| 452 | param.update() |
| 453 | if self.returns: |
| 454 | self.returns.update() |
| 455 | self.create_cfunction() |
| 456 | |
| 457 | def inputs(self) -> str: |
| 458 | return ', '.join([p.input() for p in self.params]) |
| 459 | |
| 460 | # TODO: Shoule we remove Optional? |
| 461 | def input_map(self) -> Dict[str, Optional[str]]: |
| 462 | m: Dict[str, Optional[str]] = {} |
| 463 | for p in self.params: |
| 464 | m[p.name] = p.input() |
| 465 | m['return'] = self.return_name |
| 466 | m['@'] = self.inputs() |
| 467 | m['__fname__'] = self.fname |
| 468 | return m |
| 469 | |
| 470 | def get_invoke(self) -> str: |
| 471 | return Template(self.invoke).safe_substitute(self.input_map()) |
no outgoing calls
no test coverage detected