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