1 //===-- sanitizer_vector.h -------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file is shared between sanitizers run-time libraries.
12 //===----------------------------------------------------------------------===//
14 // Low-fat STL-like vector container.
16 #ifndef SANITIZER_VECTOR_H
17 #define SANITIZER_VECTOR_H
19 #include "sanitizer_common/sanitizer_allocator_internal.h"
20 #include "sanitizer_common/sanitizer_libc.h"
22 namespace __sanitizer {
50 T &operator[](uptr i) {
51 DCHECK_LT(i, end_ - begin_);
55 const T &operator[](uptr i) const {
56 DCHECK_LT(i, end_ - begin_);
61 EnsureSize(Size() + 1);
63 internal_memset(p, 0, sizeof(*p));
67 T *PushBack(const T& v) {
68 EnsureSize(Size() + 1);
70 internal_memcpy(p, &v, sizeof(*p));
75 DCHECK_GT(end_, begin_);
79 void Resize(uptr size) {
84 uptr old_size = Size();
85 if (size <= old_size) {
90 if (old_size < size) {
91 for (uptr i = old_size; i < size; i++)
92 internal_memset(&begin_[i], 0, sizeof(begin_[i]));
101 void EnsureSize(uptr size) {
104 if (size <= (uptr)(last_ - begin_)) {
105 end_ = begin_ + size;
108 uptr cap0 = last_ - begin_;
109 uptr cap = cap0 * 5 / 4; // 25% growth
114 T *p = (T*)InternalAlloc(cap * sizeof(T));
116 internal_memcpy(p, begin_, cap0 * sizeof(T));
117 InternalFree(begin_);
120 end_ = begin_ + size;
121 last_ = begin_ + cap;
124 Vector(const Vector&);
125 void operator=(const Vector&);
127 } // namespace __sanitizer
129 #endif // #ifndef SANITIZER_VECTOR_H