1215976Sjmallett//===- llvm/ADT/SmallVector.cpp - 'Normally small' vectors ----------------===//
2232812Sjmallett//
3215976Sjmallett//                     The LLVM Compiler Infrastructure
4215976Sjmallett//
5215976Sjmallett// This file is distributed under the University of Illinois Open Source
6215976Sjmallett// License. See LICENSE.TXT for details.
7215976Sjmallett//
8215976Sjmallett//===----------------------------------------------------------------------===//
9215976Sjmallett//
10215976Sjmallett// This file implements the SmallVector class.
11215976Sjmallett//
12215976Sjmallett//===----------------------------------------------------------------------===//
13215976Sjmallett
14215976Sjmallett#include "llvm/ADT/SmallVector.h"
15215976Sjmallettusing namespace llvm;
16215976Sjmallett
17215976Sjmallett/// grow_pod - This is an implementation of the grow() method which only works
18232812Sjmallett/// on POD-like datatypes and is out of line to reduce code duplication.
19215976Sjmallettvoid SmallVectorBase::grow_pod(void *FirstEl, size_t MinSizeInBytes,
20215976Sjmallett                               size_t TSize) {
21215976Sjmallett  size_t CurSizeBytes = size_in_bytes();
22215976Sjmallett  size_t NewCapacityInBytes = 2 * capacity_in_bytes() + TSize; // Always grow.
23215976Sjmallett  if (NewCapacityInBytes < MinSizeInBytes)
24215976Sjmallett    NewCapacityInBytes = MinSizeInBytes;
25215976Sjmallett
26215976Sjmallett  void *NewElts;
27215976Sjmallett  if (BeginX == FirstEl) {
28215976Sjmallett    NewElts = malloc(NewCapacityInBytes);
29232812Sjmallett
30215976Sjmallett    // Copy the elements over.  No need to run dtors on PODs.
31215976Sjmallett    memcpy(NewElts, this->BeginX, CurSizeBytes);
32215976Sjmallett  } else {
33215976Sjmallett    // If this wasn't grown from the inline copy, grow the allocated space.
34215976Sjmallett    NewElts = realloc(this->BeginX, NewCapacityInBytes);
35215976Sjmallett  }
36215976Sjmallett
37215976Sjmallett  this->EndX = (char*)NewElts+CurSizeBytes;
38215976Sjmallett  this->BeginX = NewElts;
39215976Sjmallett  this->CapacityX = (char*)this->BeginX + NewCapacityInBytes;
40215976Sjmallett}
41215976Sjmallett