| 385 | to_rust = to_c = to_swig = to_python = lambda self: '' |
| 386 | |
| 387 | class Program(object): |
| 388 | def __init__(self, module, crate, docs=''): |
| 389 | self.module = module |
| 390 | self.crate = crate |
| 391 | self.docs = docs |
| 392 | self.elements = [] |
| 393 | |
| 394 | # maintaining the "thing.type" idiom |
| 395 | self.string = namedtuple('String', ['type'])(StringType(self.module)) |
| 396 | self.strref = namedtuple('StrRef', ['type'])(StrRefType(self.module)) |
| 397 | |
| 398 | def vec(self, type): |
| 399 | vec = self.struct(f"vec::Vec::<{type.orig_rust()}>", module="std", docs=f"An immutable list of {type.orig_rust()} objects") |
| 400 | vec.debug() |
| 401 | vec.clone() |
| 402 | vec.method(usize.type, "len", [], pyname="__len__", docs="The length of the vector.") |
| 403 | # TODO impl option and use .get() instead |
| 404 | vec.method(type.ref(), "index", [Var(usize.type, "index")], pyname="__getitem__", docs="Copy an element out of the vector.") |
| 405 | vec.pyextra(s('''\ |
| 406 | def __iter__(self): |
| 407 | l = len(self) |
| 408 | for i in range(l): |
| 409 | yield self[i] |
| 410 | ''')) |
| 411 | return vec |
| 412 | |
| 413 | def add(self, elem): |
| 414 | return self |
| 415 | |
| 416 | def format(self, header): |
| 417 | return header.format(crate=self.crate, module=self.module, docs=self.docs) |
| 418 | |
| 419 | def to_rust(self): |
| 420 | return self.format(RUST_HEADER)\ |
| 421 | + ''.join(elem.to_rust() for elem in self.elements)\ |
| 422 | + self.format(RUST_FOOTER) |
| 423 | |
| 424 | def to_c(self): |
| 425 | return self.format(C_HEADER)\ |
| 426 | + ''.join(elem.to_c() for elem in self.elements)\ |
| 427 | + self.format(C_FOOTER) |
| 428 | |
| 429 | def to_swig(self): |
| 430 | return self.format(SWIG_HEADER)\ |
| 431 | + ''.join(elem.to_swig() for elem in self.elements)\ |
| 432 | + self.format(SWIG_FOOTER) |
| 433 | |
| 434 | def to_python(self): |
| 435 | return self.format(PYTHON_HEADER)\ |
| 436 | + '\n'.join(elem.to_python() for elem in self.elements)\ |
| 437 | + self.format(PYTHON_FOOTER) |
| 438 | |
| 439 | def struct(self, *args, **kwargs): |
| 440 | result = StructWrapper(self, *args, **kwargs) |
| 441 | self.elements.append(result) |
| 442 | return result |
| 443 | |
| 444 | def function(self, *args, **kwargs): |