| 861 | template <class T, size_t N> |
| 862 | template <class UninitializedF, class InitializedF> |
| 863 | auto TCompactVector<T, N>::InsertManyImpl(const_iterator pos, size_t insertCount, UninitializedF&& uninitializedFunc, InitializedF&& initializedFunc) -> iterator |
| 864 | { |
| 865 | YT_ASSERT(pos >= begin()); |
| 866 | YT_ASSERT(pos <= end()); |
| 867 | |
| 868 | auto* mutablePos = const_cast<iterator>(pos); |
| 869 | if (insertCount == 0) { |
| 870 | return mutablePos; |
| 871 | } |
| 872 | |
| 873 | auto size = this->size(); |
| 874 | auto newSize = size + insertCount; |
| 875 | if (Y_UNLIKELY(newSize > capacity())) { |
| 876 | auto index = std::distance(begin(), mutablePos); |
| 877 | EnsureOnHeapCapacity(newSize, /*incremental*/ true); |
| 878 | mutablePos = begin() + index; |
| 879 | } |
| 880 | |
| 881 | auto* end = this->end(); |
| 882 | auto moveCount = std::distance(mutablePos, end); |
| 883 | if constexpr(std::is_trivially_copyable_v<T>) { |
| 884 | ::memmove(mutablePos + insertCount, mutablePos, moveCount * sizeof(T)); |
| 885 | initializedFunc(mutablePos, mutablePos + insertCount); |
| 886 | } else { |
| 887 | if (static_cast<ptrdiff_t>(insertCount) >= moveCount) { |
| 888 | UninitializedMove(mutablePos, end, mutablePos + insertCount); |
| 889 | initializedFunc(mutablePos, end); |
| 890 | uninitializedFunc(end, end + insertCount - moveCount); |
| 891 | } else { |
| 892 | auto overlapCount = moveCount - insertCount; |
| 893 | UninitializedMove(mutablePos + overlapCount, end, mutablePos + overlapCount + insertCount); |
| 894 | MoveBackward(mutablePos, mutablePos + overlapCount, mutablePos + insertCount); |
| 895 | initializedFunc(mutablePos, mutablePos + insertCount); |
| 896 | } |
| 897 | } |
| 898 | |
| 899 | SetSize(newSize); |
| 900 | |
| 901 | return mutablePos; |
| 902 | } |
| 903 | |
| 904 | template <class T, size_t N> |
| 905 | void TCompactVector<T, N>::Destroy(T* first, T* last) |