119 std::size_t numChunks = m_chunks.size();
120 std::size_t low = 0, high = numChunks, guess;
121 bool attach_low =
false, attach_high =
false;
124 guess = (low + high - 1) / 2;
125 CiftiAssert(guess < m_chunks.size());
126 if (m_chunks[guess].start > index)
133 if (high > 0 && m_chunks[high - 1].start + (int64_t)(m_chunks[high - 1].elements.size()) > index)
135 CiftiAssertVectorIndex(m_chunks[high -1].elements, index - m_chunks[high - 1].start);
136 return m_chunks[high - 1].elements[index - m_chunks[high - 1].start];
138 if (high > 0 && m_chunks[high - 1].start + (int64_t)(m_chunks[high - 1].elements.size()) == index) attach_low =
true;
139 if (high < numChunks && m_chunks[high].start == index + 1) attach_high =
true;
142 std::vector<T>& lowvec = m_chunks[high - 1].elements;
143 std::size_t retIndex = lowvec.size();
144 lowvec.push_back(T());
147 std::vector<T>& highvec = m_chunks[high].elements;
148 lowvec.insert(lowvec.end(), highvec.begin(), highvec.end());
149 m_chunks.erase(m_chunks.begin() + high);
151 return lowvec[retIndex];
155 std::vector<T>& highvec = m_chunks[high].elements;
156 highvec.insert(highvec.begin(), T());
157 m_chunks[high].start = index;
160 m_chunks.insert(m_chunks.begin() + high, Chunk());
161 m_chunks[high].start = index;
162 m_chunks[high].elements.push_back(T());
163 return m_chunks[high].elements[0];
171 std::size_t numChunks = m_chunks.size();
172 std::size_t low = 0, high = numChunks, guess;
175 guess = (low + high - 1) / 2;
176 CiftiAssert(guess < m_chunks.size());
177 if (m_chunks[guess].start > index)
184 if (high > 0 && m_chunks[high - 1].start + (int64_t)(m_chunks[high - 1].elements.size()) > index)
186 std::size_t outIndex = index - m_chunks[high - 1].start;
187 CiftiAssert(outIndex < m_chunks[high - 1].elements.size());
188 return iterator(*
this, high - 1, outIndex);
196 std::size_t numChunks = m_chunks.size();
197 std::size_t low = 0, high = numChunks, guess;
200 guess = (low + high - 1) / 2;
201 CiftiAssert(guess < m_chunks.size());
202 if (m_chunks[guess].start > index)
209 if (high > 0 && m_chunks[high - 1].start + (int64_t)(m_chunks[high - 1].elements.size()) > index)
211 std::size_t outIndex = index - m_chunks[high - 1].start;
212 CiftiAssert(outIndex < m_chunks[high - 1].elements.size());