| 583 | } |
| 584 | |
| 585 | void Resize(size_t Characters, TChar Filler = 0, bool AutoShrink = false) { |
| 586 | if (Characters == Data.Length) { |
| 587 | if (AutoShrink) Shrink(); |
| 588 | return; |
| 589 | } |
| 590 | |
| 591 | if (!Characters) { |
| 592 | if (AutoShrink) { |
| 593 | Clear(); |
| 594 | } else { |
| 595 | Data.Buffer[0] = NullChar; |
| 596 | Data.Length = 0; |
| 597 | } |
| 598 | return; |
| 599 | } |
| 600 | |
| 601 | if (Characters > Data.Length) { |
| 602 | size_t RequiredSize = (Characters + 1) * sizeof(TChar); |
| 603 | if (RequiredSize <= Data.BufferSize) { |
| 604 | if (Filler == 0) |
| 605 | RtlZeroMemory(&Data.Buffer[Data.Length], (Characters - Data.Length) * sizeof(TChar)); |
| 606 | else { |
| 607 | for (size_t Index = Data.Length; Index < Characters; ++Index) |
| 608 | Data.Buffer[Index] = Filler; |
| 609 | } |
| 610 | Data.Buffer[Characters] = NullChar; |
| 611 | Data.Length = Characters; |
| 612 | return; |
| 613 | } |
| 614 | |
| 615 | STRING_INFO StringInfo = {}; |
| 616 | if (Alloc(&StringInfo, Characters)) { |
| 617 | Copy(StringInfo.Buffer, Data.Buffer, Data.Length); |
| 618 | if (Filler == 0) |
| 619 | RtlZeroMemory(&StringInfo.Buffer[Data.Length], (Characters - Data.Length) * sizeof(TChar)); |
| 620 | else { |
| 621 | for (size_t Index = Data.Length; Index < Characters; ++Index) |
| 622 | StringInfo.Buffer[Index] = Filler; |
| 623 | } |
| 624 | StringInfo.Buffer[Characters] = NullChar; |
| 625 | StringInfo.Length = Characters; |
| 626 | Free(&Data); |
| 627 | Data = StringInfo; |
| 628 | } |
| 629 | } else { |
| 630 | Data.Buffer[Characters] = NullChar; |
| 631 | Data.Length = Characters; |
| 632 | } |
| 633 | if (AutoShrink) Shrink(); |
| 634 | } |
| 635 | |
| 636 | void Reserve(size_t Characters) { |
| 637 | if (Characters == Data.Length) return; |
no test coverage detected