MCPcopy Create free account
hub / github.com/catboost/catboost / InsertManyImpl

Method InsertManyImpl

library/cpp/yt/compact_containers/compact_vector-inl.h:863–902  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

861template <class T, size_t N>
862template <class UninitializedF, class InitializedF>
863auto 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
904template <class T, size_t N>
905void TCompactVector<T, N>::Destroy(T* first, T* last)

Callers

nothing calls this directly

Calls 7

sizeMethod · 0.95
endMethod · 0.95
distanceFunction · 0.85
memmoveFunction · 0.85
beginFunction · 0.50
endFunction · 0.50
capacityFunction · 0.50

Tested by

no test coverage detected