A `std::string` (or possibly `std::string_view`) value.
| 456 | |
| 457 | |
| 458 | class StdString: |
| 459 | """ |
| 460 | A `std::string` (or possibly `std::string_view`) value. |
| 461 | """ |
| 462 | |
| 463 | def __init__(self, val): |
| 464 | self.val = val |
| 465 | try: |
| 466 | # libstdc++ internals |
| 467 | self._data = val['_M_dataplus']['_M_p'] |
| 468 | self._size = val['_M_string_length'] |
| 469 | except gdb.error: |
| 470 | # fallback for other C++ standard libraries |
| 471 | self._data = gdb.parse_and_eval(f"{for_evaluation(val)}.c_str()") |
| 472 | self._size = gdb.parse_and_eval(f"{for_evaluation(val)}.size()") |
| 473 | |
| 474 | def __bool__(self): |
| 475 | return self._size != 0 |
| 476 | |
| 477 | @property |
| 478 | def data(self): |
| 479 | return self._data |
| 480 | |
| 481 | @property |
| 482 | def size(self): |
| 483 | return self._size |
| 484 | |
| 485 | def bytes_literal(self): |
| 486 | return self._data.lazy_string(length=self._size).value() |
| 487 | |
| 488 | def string_literal(self): |
| 489 | # XXX use lazy_string() as well? |
| 490 | return string_literal(self._data) |
| 491 | |
| 492 | def string(self): |
| 493 | return self._data.string() |
| 494 | |
| 495 | def __format__(self, fmt): |
| 496 | return str(self.bytes_literal()) |
| 497 | |
| 498 | |
| 499 | class StdVector(Sequence): |
no outgoing calls
no test coverage detected