//===-- A data structure which stores data in blocks -----------*- 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 // //===----------------------------------------------------------------------===// #ifndef LLVM_LIBC_SRC___SUPPORT_BLOCKSTORE_H #define LLVM_LIBC_SRC___SUPPORT_BLOCKSTORE_H #include "src/__support/CPP/array.h" #include "src/__support/CPP/new.h" #include "src/__support/CPP/type_traits.h" #include "src/__support/libc_assert.h" #include "src/__support/macros/config.h" #include <stddef.h> #include <stdint.h> namespace LIBC_NAMESPACE_DECL { // The difference between BlockStore a traditional vector types is that, // when more capacity is desired, a new block is added instead of allocating // a larger sized array and copying over existing items to the new allocation. // Also, the initial block does not need heap allocation. Hence, a BlockStore is // suitable for global objects as it does not require explicit construction. // Also, the destructor of this class does nothing, which eliminates the need // for an atexit global object destruction. But, it also means that the global // object should be explicitly cleaned up at the appropriate time. // // If REVERSE_ORDER is true, the iteration of elements will in the reverse // order. Also, since REVERSE_ORDER is a constexpr, conditionals branching // on its value will be optimized out in the code below. template <typename T, size_t BLOCK_SIZE, bool REVERSE_ORDER = false> class BlockStore { … }; template <typename T, size_t BLOCK_SIZE, bool REVERSE_ORDER> LIBC_INLINE void BlockStore<T, BLOCK_SIZE, REVERSE_ORDER>::destroy( BlockStore<T, BLOCK_SIZE, REVERSE_ORDER> *block_store) { … } // A convenience type for reverse order block stores. ReverseOrderBlockStore; } // namespace LIBC_NAMESPACE_DECL #endif // LLVM_LIBC_SRC___SUPPORT_BLOCKSTORE_H