| 672 | } |
| 673 | |
| 674 | void Encoder::push(tags tag, size_t reserve) { |
| 675 | if (_usuallyFalse(_stackDepth == 0)) |
| 676 | reset(); // I'm being reused after finish(), so initialize |
| 677 | if (_usuallyFalse(_stackDepth >= _stack.size())) |
| 678 | _stack.resize(2*_stackDepth); |
| 679 | _items = &_stack[_stackDepth++]; |
| 680 | _items->reset(tag); |
| 681 | if (reserve > 0) { |
| 682 | if (_usuallyTrue(tag == kDictTag)) { |
| 683 | _items->reserve(2 * reserve); |
| 684 | _items->keys.reserve(reserve); |
| 685 | } else { |
| 686 | _items->reserve(reserve); |
| 687 | } |
| 688 | } |
| 689 | } |
| 690 | |
| 691 | void Encoder::pop() { |
| 692 | throwIf(_stackDepth <= 1, InternalError, "Encoder stack underflow!"); |