• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- tsan_vector.h -------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file is a part of ThreadSanitizer (TSan), a race detector.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 // Low-fat STL-like vector container.
15 
16 #ifndef TSAN_VECTOR_H
17 #define TSAN_VECTOR_H
18 
19 #include "tsan_defs.h"
20 #include "tsan_mman.h"
21 
22 namespace __tsan {
23 
24 template<typename T>
25 class Vector {
26  public:
Vector(MBlockType typ)27   explicit Vector(MBlockType typ)
28       : typ_(typ)
29       , begin_()
30       , end_()
31       , last_() {
32   }
33 
~Vector()34   ~Vector() {
35     if (begin_)
36       internal_free(begin_);
37   }
38 
Reset()39   void Reset() {
40     if (begin_)
41       internal_free(begin_);
42     begin_ = 0;
43     end_ = 0;
44     last_ = 0;
45   }
46 
Size()47   uptr Size() const {
48     return end_ - begin_;
49   }
50 
51   T &operator[](uptr i) {
52     DCHECK_LT(i, end_ - begin_);
53     return begin_[i];
54   }
55 
56   const T &operator[](uptr i) const {
57     DCHECK_LT(i, end_ - begin_);
58     return begin_[i];
59   }
60 
61   T *PushBack(T v = T()) {
62     EnsureSize(Size() + 1);
63     end_[-1] = v;
64     return &end_[-1];
65   }
66 
Resize(uptr size)67   void Resize(uptr size) {
68     uptr old_size = Size();
69     EnsureSize(size);
70     if (old_size < size) {
71       for (uptr i = old_size; i < size; i++)
72         begin_[i] = T();
73     }
74   }
75 
76  private:
77   const MBlockType typ_;
78   T *begin_;
79   T *end_;
80   T *last_;
81 
EnsureSize(uptr size)82   void EnsureSize(uptr size) {
83     if (size <= Size())
84       return;
85     if (size <= (uptr)(last_ - begin_)) {
86       end_ = begin_ + size;
87       return;
88     }
89     uptr cap0 = last_ - begin_;
90     uptr cap = 2 * cap0;
91     if (cap == 0)
92       cap = 16;
93     if (cap < size)
94       cap = size;
95     T *p = (T*)internal_alloc(typ_, cap * sizeof(T));
96     if (cap0) {
97       internal_memcpy(p, begin_, cap0 * sizeof(T));
98       internal_free(begin_);
99     }
100     begin_ = p;
101     end_ = begin_ + size;
102     last_ = begin_ + cap;
103   }
104 
105   Vector(const Vector&);
106   void operator=(const Vector&);
107 };
108 }
109 
110 #endif  // #ifndef TSAN_VECTOR_H
111