Nix 2.26.3
Nix, the purely functional package manager; unstable internal interfaces
 
Loading...
Searching...
No Matches
chunked-vector.hh
Go to the documentation of this file.
1#pragma once
3
4#include <cstdint>
5#include <cstdlib>
6#include <vector>
7#include <limits>
8
9#include "error.hh"
10
11namespace nix {
12
22template<typename T, size_t ChunkSize>
23class ChunkedVector {
24private:
25 uint32_t size_ = 0;
26 std::vector<std::vector<T>> chunks;
27
31 [[gnu::noinline]]
32 auto & addChunk()
33 {
34 if (size_ >= std::numeric_limits<uint32_t>::max() - ChunkSize)
35 unreachable();
36 chunks.emplace_back();
37 chunks.back().reserve(ChunkSize);
38 return chunks.back();
39 }
40
41public:
42 ChunkedVector(uint32_t reserve)
43 {
44 chunks.reserve(reserve);
45 addChunk();
46 }
47
48 uint32_t size() const { return size_; }
49
50 std::pair<T &, uint32_t> add(T value)
51 {
52 const auto idx = size_++;
53 auto & chunk = [&] () -> auto & {
54 if (auto & back = chunks.back(); back.size() < ChunkSize)
55 return back;
56 return addChunk();
57 }();
58 auto & result = chunk.emplace_back(std::move(value));
59 return {result, idx};
60 }
61
62 const T & operator[](uint32_t idx) const
63 {
64 return chunks[idx / ChunkSize][idx % ChunkSize];
65 }
66
67 template<typename Fn>
68 void forEach(Fn fn) const
69 {
70 for (const auto & c : chunks)
71 for (const auto & e : c)
72 fn(e);
73 }
74};
75}
This file defines two main structs/classes used in nix error handling.
const T & value
Definition lexer.l:492