| 737 | } |
| 738 | |
| 739 | String String::substr(size_t position, size_t n) const { |
| 740 | auto len = size(); |
| 741 | if (position > len) |
| 742 | throw OutOfRangeException(strf("out of range in String::substr({}, {})", position, n)); |
| 743 | |
| 744 | if (position == 0 && n >= len) |
| 745 | return *this; |
| 746 | |
| 747 | String ret; |
| 748 | ret.reserve(std::min(n, len - position)); |
| 749 | |
| 750 | auto it = begin(); |
| 751 | std::advance(it, position); |
| 752 | |
| 753 | for (size_t i = 0; i < n; ++i) { |
| 754 | if (it == end()) |
| 755 | break; |
| 756 | ret.append(*it); |
| 757 | ++it; |
| 758 | } |
| 759 | |
| 760 | return ret; |
| 761 | } |
| 762 | |
| 763 | void String::erase(size_t pos, size_t n) { |
| 764 | String ns; |