31 #if defined(IndexedListWithBlocks_RECURSES)
32 #error Recursive header files inclusion detected in IndexedListWithBlocks.h
33 #else // defined(IndexedListWithBlocks_RECURSES)
35 #define IndexedListWithBlocks_RECURSES
37 #if !defined IndexedListWithBlocks_h
39 #define IndexedListWithBlocks_h
45 #include "DGtal/base/Common.h"
93 template <
typename TValue,
unsigned int N,
unsigned int M>
141 { data.nextBlock = 0; }
148 ASSERT( idx <= size );
150 std::copy_backward( values + idx, values + size, values + size + 1 );
153 else if ( size == (N+1) )
155 ASSERT( idx <= size );
161 next->
values[ 0 ] = values[ N - 1 ];
162 next->
values[ 1 ] = data.lastValue;
163 std::copy_backward( values + idx, values + N - 1, values + N );
169 next->
values[ 1 ] = data.lastValue;
173 next->
values[ 0 ] = data.lastValue;
176 data.nextBlock = next;
182 Value v1 = values[ N - 1 ];
183 std::copy_backward( values + idx, values + N - 1, values + N );
184 data.nextBlock->insert( 0, size - N, v1 );
188 data.nextBlock->insert( idx - N, size - N, v );
200 ASSERT( idx < size );
201 if ( size <= ( N + 1 ) )
204 std::copy( values + idx + 1, values + size, values + idx );
207 else if ( size == N + 2 )
211 std::copy( values + idx + 1, values + N, values + idx );
212 values[ N - 1 ] = data.nextBlock->values[ 0 ];
213 Value tmp = data.nextBlock->values[ 1 ];
214 delete data.nextBlock;
215 data.lastValue = tmp;
219 Value tmp = data.nextBlock->values[ 1 ];
220 delete data.nextBlock;
221 data.lastValue = tmp;
225 Value tmp = data.nextBlock->values[ 0 ];
226 delete data.nextBlock;
227 data.lastValue = tmp;
234 std::copy( values + idx + 1, values + N, values + idx );
235 values[ N - 1 ] = data.nextBlock->values[ 0 ];
236 data.nextBlock = data.nextBlock->erase( 0, size - N );
239 data.nextBlock = data.nextBlock->erase( idx - N, size - N );
255 void insert(
unsigned int idx,
unsigned int size,
const Value & v )
257 ASSERT( idx <= size );
271 if ( size < ( M - 1) )
273 std::copy_backward( values + idx, values + size,
279 Value v1 = values[ M - 1 ];
280 std::copy_backward( values + idx, values + M - 1, values + M );
312 std::copy( values + idx + 1, values + M, values + idx );
647 void insert(
unsigned int idx,
const Value & value );
656 void erase(
unsigned int idx );
723 template <
typename TValue,
unsigned int N,
unsigned int M>
733 #include "DGtal/base/IndexedListWithBlocks.ih"
738 #endif // !defined IndexedListWithBlocks_h
740 #undef IndexedListWithBlocks_RECURSES
741 #endif // else defined(IndexedListWithBlocks_RECURSES)