Determine which freelist should process the memory block with given bytes.
89 {
90 auto _index = [&](size_t bytes, size_t align_shift) -> size_t
91 {
92 return ((bytes + (1 << align_shift) - 1) >> align_shift) - 1;
93 };
94
95 static constexpr int group_array[4] = { 16, 56, 56, 56 };
96
97 if (size <= 128)
98 {
99 return _index(size, 3);
100 }
101 else if (size <= 1024)
102 {
103 return _index(size - 128, 4) +
104 group_array[0];
105 }
106 else if (size <= static_cast<size_t>(8 * 1024))
107 {
108 return _index(size - 1024, 7) +
109 group_array[1] +
110 group_array[0];
111 }
112 else if (size <= static_cast<size_t>(64 * 1024))
113 {
114 return _index(size - static_cast<size_t>(8 * 1024), 10) +
115 group_array[2] +
116 group_array[1] +
117 group_array[0];
118 }
119 else if (size <= static_cast<size_t>(256 * 1024))
120 {
121 return _index(size - static_cast<size_t>(64 * 1024), 13) +
122 group_array[3] +
123 group_array[2] +
124 group_array[1] +
125 group_array[0];
126 }
127 else
128 {
129 assert(false);
130 return -1;
131 }
132 }