//===- llvm/ADT/PagedVector.h - 'Lazily allocated' vectors --*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines the PagedVector class. // //===----------------------------------------------------------------------===// #ifndef LLVM_ADT_PAGEDVECTOR_H #define LLVM_ADT_PAGEDVECTOR_H #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/iterator_range.h" #include "llvm/Support/Allocator.h" #include <cassert> #include <vector> namespace llvm { /// A vector that allocates memory in pages. /// /// Order is kept, but memory is allocated only when one element of the page is /// accessed. This introduces a level of indirection, but it is useful when you /// have a sparsely initialised vector where the full size is allocated upfront. /// /// As a side effect the elements are initialised later than in a normal vector. /// On the first access to one of the elements of a given page, all the elements /// of the page are initialised. This also means that the elements of the page /// are initialised beyond the size of the vector. /// /// Similarly on destruction the elements are destroyed only when the page is /// not needed anymore, delaying invoking the destructor of the elements. /// /// Notice that this has iterators only on materialized elements. This /// is deliberately done under the assumption you would dereference the elements /// while iterating, therefore materialising them and losing the gains in terms /// of memory usage this container provides. If you have such a use case, you /// probably want to use a normal std::vector or a llvm::SmallVector. template <typename T, size_t PageSize = 1024 / sizeof(T)> class PagedVector { … }; } // namespace llvm #endif // LLVM_ADT_PAGEDVECTOR_H