10 #ifndef EIGEN_AMBIVECTOR_H
11 #define EIGEN_AMBIVECTOR_H
22 template<
typename _Scalar,
typename _StorageIndex>
36 void init(
double estimatedDensity);
66 return internal::convert_index<StorageIndex>(idx);
95 allocSize = (allocSize +
sizeof(
Scalar) - 1)/
sizeof(
Scalar);
128 template<
typename _Scalar,
typename _StorageIndex>
134 return m_end - m_start;
137 template<
typename _Scalar,
typename _StorageIndex>
140 if (estimatedDensity>0.1)
146 template<
typename _Scalar,
typename _StorageIndex>
163 template<
typename _Scalar,
typename _StorageIndex>
166 m_llCurrent = m_llStart;
170 template<
typename _Scalar,
typename _StorageIndex>
186 template<
typename _Scalar,
typename _StorageIndex>
202 llElements[0].value =
Scalar(0);
204 llElements[0].next = -1;
205 return llElements[0].value;
207 else if (
i<llElements[m_llStart].index)
210 ListEl& el = llElements[m_llSize];
214 m_llStart = m_llSize;
216 m_llCurrent = m_llStart;
222 eigen_assert(
i>=llElements[m_llCurrent].index &&
"you must call restart() before inserting an element with lower or equal index");
223 while (nextel >= 0 && llElements[nextel].index<=
i)
225 m_llCurrent = nextel;
226 nextel = llElements[nextel].next;
229 if (llElements[m_llCurrent].index==
i)
232 return llElements[m_llCurrent].value;
236 if (m_llSize>=m_allocatedElements)
239 llElements =
reinterpret_cast<ListEl*
>(m_buffer);
243 ListEl& el = llElements[m_llSize];
246 el.
next = llElements[m_llCurrent].next;
247 llElements[m_llCurrent].next = m_llSize;
255 template<
typename _Scalar,
typename _StorageIndex>
264 if ((m_llSize==0) || (
i<llElements[m_llStart].index))
270 Index elid = m_llStart;
271 while (elid >= 0 && llElements[elid].index<
i)
272 elid = llElements[elid].next;
274 if (llElements[elid].index==
i)
275 return llElements[m_llCurrent].value;
283 template<
typename _Scalar,
typename _StorageIndex>
301 m_isDense = m_vector.m_mode==
IsDense;
306 m_cachedIndex = m_vector.m_start-1;
312 m_currentEl = m_vector.m_llStart;
313 while (m_currentEl>=0 &&
abs(llElements[m_currentEl].
value)<=m_epsilon)
314 m_currentEl = llElements[m_currentEl].next;
322 m_cachedIndex = llElements[m_currentEl].
index;
323 m_cachedValue = llElements[m_currentEl].value;
331 operator bool()
const {
return m_cachedIndex>=0; }
340 }
while (m_cachedIndex<m_vector.m_end &&
abs(m_vector.m_buffer[m_cachedIndex])<=m_epsilon);
341 if (m_cachedIndex<m_vector.m_end)
342 m_cachedValue = m_vector.m_buffer[m_cachedIndex];
350 m_currentEl = llElements[m_currentEl].
next;
351 }
while (m_currentEl>=0 &&
abs(llElements[m_currentEl].
value)<=m_epsilon);
358 m_cachedIndex = llElements[m_currentEl].index;
359 m_cachedValue = llElements[m_currentEl].value;
378 #endif // EIGEN_AMBIVECTOR_H