1b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner//===- llvm/ADT/SmallVector.cpp - 'Normally small' vectors ----------------===// 2b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner// 3b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner// The LLVM Compiler Infrastructure 4b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner// 5b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner// This file is distributed under the University of Illinois Open Source 6b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner// License. See LICENSE.TXT for details. 7b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner// 8b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner//===----------------------------------------------------------------------===// 9b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner// 10b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner// This file implements the SmallVector class. 11b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner// 12b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner//===----------------------------------------------------------------------===// 13b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner 14b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner#include "llvm/ADT/SmallVector.h" 15b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattnerusing namespace llvm; 16b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner 17b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner/// grow_pod - This is an implementation of the grow() method which only works 18b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner/// on POD-like datatypes and is out of line to reduce code duplication. 19bc363931085587bac42a40653962a3e5acd1ffceRichard Smithvoid SmallVectorBase::grow_pod(void *FirstEl, size_t MinSizeInBytes, 20bc363931085587bac42a40653962a3e5acd1ffceRichard Smith size_t TSize) { 21b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner size_t CurSizeBytes = size_in_bytes(); 222a9a2dba4c02e7eea3aeba2be5dc1fc377d5aa5cJohn McCall size_t NewCapacityInBytes = 2 * capacity_in_bytes() + TSize; // Always grow. 23b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner if (NewCapacityInBytes < MinSizeInBytes) 24b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner NewCapacityInBytes = MinSizeInBytes; 25d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9Benjamin Kramer 26d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9Benjamin Kramer void *NewElts; 27bc363931085587bac42a40653962a3e5acd1ffceRichard Smith if (BeginX == FirstEl) { 28d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9Benjamin Kramer NewElts = malloc(NewCapacityInBytes); 29d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9Benjamin Kramer 30d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9Benjamin Kramer // Copy the elements over. No need to run dtors on PODs. 31d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9Benjamin Kramer memcpy(NewElts, this->BeginX, CurSizeBytes); 32d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9Benjamin Kramer } else { 33d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9Benjamin Kramer // If this wasn't grown from the inline copy, grow the allocated space. 34d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9Benjamin Kramer NewElts = realloc(this->BeginX, NewCapacityInBytes); 35d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9Benjamin Kramer } 36d164d3d9e74aa099ce7ef86ac0724fe504f7c3f9Benjamin Kramer 37b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner this->EndX = (char*)NewElts+CurSizeBytes; 38b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner this->BeginX = NewElts; 39b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner this->CapacityX = (char*)this->BeginX + NewCapacityInBytes; 40b3649db1022ef464687df135934c6e743e5c5cb8Chris Lattner} 41