1 //===-- tsan_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 a part of ThreadSanitizer (TSan), a race detector.
12 //===----------------------------------------------------------------------===//
14 // Low-fat STL-like vector container.
19 #include "tsan_defs.h"
20 #include "tsan_mman.h"
27 explicit Vector(MBlockType typ)
36 internal_free(begin_);
41 internal_free(begin_);
51 T &operator[](uptr i) {
52 DCHECK_LT(i, end_ - begin_);
56 const T &operator[](uptr i) const {
57 DCHECK_LT(i, end_ - begin_);
62 EnsureSize(Size() + 1);
64 internal_memset(p, 0, sizeof(*p));
68 T *PushBack(const T& v) {
69 EnsureSize(Size() + 1);
71 internal_memcpy(p, &v, sizeof(*p));
76 DCHECK_GT(end_, begin_);
80 void Resize(uptr size) {
85 uptr old_size = Size();
87 if (old_size < size) {
88 for (uptr i = old_size; i < size; i++)
89 internal_memset(&begin_[i], 0, sizeof(begin_[i]));
94 const MBlockType typ_;
99 void EnsureSize(uptr size) {
102 if (size <= (uptr)(last_ - begin_)) {
103 end_ = begin_ + size;
106 uptr cap0 = last_ - begin_;
107 uptr cap = cap0 * 5 / 4; // 25% growth
112 T *p = (T*)internal_alloc(typ_, cap * sizeof(T));
114 internal_memcpy(p, begin_, cap0 * sizeof(T));
115 internal_free(begin_);
118 end_ = begin_ + size;
119 last_ = begin_ + cap;
122 Vector(const Vector&);
123 void operator=(const Vector&);
125 } // namespace __tsan
127 #endif // #ifndef TSAN_VECTOR_H