5 #ifndef RE2_SPARSE_ARRAY_H_
6 #define RE2_SPARSE_ARRAY_H_
93 #define __has_feature(x) 0
98 #if __has_feature(memory_sanitizer)
99 #include <sanitizer/msan_interface.h>
109 template<
typename Value>
155 void resize(
int new_max_size);
160 if (
dense_.data() != NULL)
178 static bool less(
const IndexValue&
a,
const IndexValue&
b);
213 assert(
false &&
"illegal index");
219 if (!allow_existing) {
251 #if __has_feature(memory_sanitizer)
253 #elif defined(RE2_ON_VALGRIND)
265 template<
typename Value>
268 template<
typename Value>
271 sparse_(src.max_size()),
272 dense_(src.max_size()) {
273 std::copy_n(src.sparse_.data(), src.max_size(), sparse_.data());
274 std::copy_n(src.dense_.data(), src.max_size(), dense_.data());
277 template<
typename Value>
278 SparseArray<Value>::SparseArray(SparseArray&& src)
280 sparse_(
std::
move(src.sparse_)),
281 dense_(
std::
move(src.dense_)) {
285 template<
typename Value>
286 SparseArray<Value>& SparseArray<Value>::operator=(
const SparseArray& src) {
288 PODArray<int>
a(src.max_size());
289 PODArray<IndexValue>
b(src.max_size());
294 std::copy_n(src.sparse_.data(), src.max_size(), sparse_.data());
295 std::copy_n(src.dense_.data(), src.max_size(), dense_.data());
299 template<
typename Value>
300 SparseArray<Value>& SparseArray<Value>::operator=(SparseArray&& src) {
309 template<
typename Value>
310 class SparseArray<
Value>::IndexValue {
324 template<
typename Value>
326 DebugCheckInvariants();
327 if (new_max_size > max_size()) {
328 const int old_max_size = max_size();
334 std::copy_n(sparse_.data(), old_max_size,
a.data());
335 std::copy_n(dense_.data(), old_max_size,
b.data());
340 MaybeInitializeMemory(old_max_size, new_max_size);
342 if (
size_ > new_max_size)
343 size_ = new_max_size;
344 DebugCheckInvariants();
348 template<
typename Value>
349 bool SparseArray<Value>::has_index(
int i)
const {
351 assert(
i < max_size());
360 template<
typename Value>
361 void SparseArray<Value>::create_index(
int i) {
362 assert(!has_index(
i));
363 assert(
size_ < max_size());
369 template<
typename Value> SparseArray<Value>::SparseArray(
int max_size) :
370 sparse_(max_size), dense_(max_size) {
386 const IndexValue&
b) {
387 return a.index_ <
b.index_;
392 #endif // RE2_SPARSE_ARRAY_H_