1 //===-- sanitizer_vector.h -------------------------------------*- C++ -*-===//
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
6 //===----------------------------------------------------------------------===//
8 // This file is shared between sanitizers run-time libraries.
10 //===----------------------------------------------------------------------===//
12 // Low-fat STL-like vector container.
14 #ifndef SANITIZER_VECTOR_H
15 #define SANITIZER_VECTOR_H
17 #include "sanitizer_common/sanitizer_allocator_internal.h"
18 #include "sanitizer_common/sanitizer_libc.h"
20 namespace __sanitizer
{
48 T
&operator[](uptr i
) {
49 DCHECK_LT(i
, end_
- begin_
);
53 const T
&operator[](uptr i
) const {
54 DCHECK_LT(i
, end_
- begin_
);
59 EnsureSize(Size() + 1);
61 internal_memset(p
, 0, sizeof(*p
));
65 T
*PushBack(const T
& v
) {
66 EnsureSize(Size() + 1);
68 internal_memcpy(p
, &v
, sizeof(*p
));
73 DCHECK_GT(end_
, begin_
);
77 void Resize(uptr size
) {
82 uptr old_size
= Size();
83 if (size
<= old_size
) {
88 if (old_size
< size
) {
89 for (uptr i
= old_size
; i
< size
; i
++)
90 internal_memset(&begin_
[i
], 0, sizeof(begin_
[i
]));
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
*)InternalAlloc(cap
* sizeof(T
));
114 internal_memcpy(p
, begin_
, cap0
* sizeof(T
));
115 InternalFree(begin_
);
118 end_
= begin_
+ size
;
119 last_
= begin_
+ cap
;
122 Vector(const Vector
&);
123 void operator=(const Vector
&);
125 } // namespace __sanitizer
127 #endif // #ifndef SANITIZER_VECTOR_H