44 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
49 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
52 : myIdx( 0 ), myDatas( 0 )
55 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
58 : myIdx( other.myIdx ), myNbDatas( other.myNbDatas ),
59 myDatas( other.myDatas ), myNext( other.myNext )
62 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
66 ASSERT( idx <= size );
73 myDatas = block.
datas;
92 myDatas = block.
datas;
100 myNext = ( myNext != 0 ) ? myNext->next : 0;
112 myDatas = myNext->datas;
118 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
124 if (
this != &other )
134 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
140 ASSERT( myDatas != 0 );
141 return myDatas[ myIdx ];
144 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
150 ASSERT( myDatas != 0 );
151 return myDatas + myIdx;
154 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
160 return this->operator+=( 1 );
163 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
174 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
180 return ( myDatas == other.
myDatas ) && ( myIdx == other.
myIdx );
183 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
189 return ( myDatas != other.
myDatas ) || ( myIdx != other.
myIdx );
192 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
199 while ( myIdx >= myNbDatas )
208 myDatas = myNext->datas;
210 myNext = myNext->next;
215 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
229 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
234 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
237 : myIdx( 0 ), myDatas( 0 )
240 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
243 : myIdx( other.myIdx ), myNbDatas( other.myNbDatas ),
244 myDatas( other.myDatas ), myNext( other.myNext )
247 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
251 ASSERT( idx <= size );
258 myDatas = block.
datas;
277 myDatas = block.
datas;
285 myNext = ( myNext != 0 ) ? myNext->next : 0;
297 myDatas = myNext->datas;
303 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
309 if (
this != &other )
319 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
325 ASSERT( myDatas != 0 );
326 return myDatas[ myIdx ];
329 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
335 ASSERT( myDatas != 0 );
336 return myDatas + myIdx;
339 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
345 return this->operator+=( 1 );
348 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
359 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
365 return ( myDatas == other.
myDatas ) && ( myIdx == other.
myIdx );
368 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
374 return ( myDatas != other.
myDatas ) || ( myIdx != other.
myIdx );
377 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
384 while ( myIdx >= myNbDatas )
393 myDatas = myNext->datas;
395 myNext = myNext->next;
400 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
414 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
418 : myLabelsIt( lIt ), myBlockIt( bIt )
421 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
427 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
433 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
437 : myLabelsIt( other.myLabelsIt ), myBlockIt( other.myBlockIt )
440 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
446 if (
this != &other )
454 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
460 return std::make_pair( *myLabelsIt, *myBlockIt );
463 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
470 static Value __static_tmp;
472 return &__static_tmp;
475 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
486 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
497 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
506 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
515 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
521 return const_cast<Data&
>( *myBlockIt );
524 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
536 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
543 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
551 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
557 unsigned int s = N + 1;
563 *currentPointer =
new __AnyBlock( *nextBlock );
565 currentPointer = & ( currentPointer->data.nextBlock );
569 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
570 template <
typename InputIterator>
575 BOOST_CONCEPT_ASSERT(( boost::InputIterator< InputIterator > ));
576 for ( ; first != last; ++first )
578 this->operator[]( first->first ) = first->second;
582 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
588 if (
this != &other )
590 blockClear( size() );
592 unsigned int theSize = other.
size();
595 unsigned int s = N + 1;
597 __AnyBlock** currentPointer = & myFirstBlock.data.nextBlock;
598 while ( s < theSize )
600 *currentPointer =
new __AnyBlock( *nextBlock );
602 currentPointer = & ( (*currentPointer)->next );
608 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
614 blockClear( size() );
618 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
624 if ( theSize != N+1 )
626 __AnyBlock* nextBlock = myFirstBlock.data.nextBlock;
627 while ( nextBlock != 0 )
630 nextBlock = nextBlock->
next;
634 myFirstBlock.data.nextBlock = 0;
637 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
646 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
652 return myLabels.
count();
655 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
664 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
673 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
679 return ( size() <= (N+1) )
681 : ( 1 + ( size() - 1 - N ) / M ) * M + N;
684 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
693 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
702 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
708 std::swap( myLabels, other.
myLabels );
712 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
718 return myLabels.test( key ) ? 1 : 0;
721 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
727 ASSERT( idx < size() );
729 return myFirstBlock.datas[ idx ];
730 else if ( ( idx == N ) && ( size() == N+1 ) )
731 return myFirstBlock.data.lastData;
732 const __AnyBlock* ptr = myFirstBlock.data.nextBlock;
740 return ptr->
datas[ idx ];
743 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
749 ASSERT( idx < size() );
751 return myFirstBlock.datas[ idx ];
752 else if ( ( idx == N ) && ( size() == N+1 ) )
753 return myFirstBlock.data.lastData;
754 __AnyBlock* ptr = myFirstBlock.data.nextBlock;
762 return ptr->
datas[ idx ];
765 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
772 bool exists = myLabels.test( key );
775 unsigned int block_size = size();
777 return blockInsert( myLabels.index( key ), block_size,
Data() );
781 return blockAt( myLabels.index( key ) );
785 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
792 bool exists = myLabels.test( key );
795 unsigned int block_size = size();
797 return blockInsert( myLabels.index( key ), block_size,
Data() );
801 return blockAt( myLabels.index( key ) );
805 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
812 ASSERT( myLabels.test( key ) );
813 return blockAt( myLabels.index( key ) );
816 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
823 ASSERT( myLabels.test( key ) );
824 return blockAt( myLabels.index( key ) );
827 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
833 Key key = (*position).first;
834 ASSERT( myLabels.test( key ) );
835 blockErase( myLabels.index( key ) );
836 myLabels.reset( key );
839 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
845 if ( myLabels.test( key ) )
847 blockErase( myLabels.index( key ) );
848 myLabels.reset( key );
854 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
860 for ( ; first != last; ++first )
865 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
867 std::pair<typename DGtal::LabelledMap<TData, L, TWord, N, M>::Iterator,
bool>
871 ASSERT( val.first < L );
872 bool exists = myLabels.test( val.first );
875 unsigned int block_size = size();
876 myLabels.set( val.first );
877 blockInsert( myLabels.index( val.first ), block_size, val.second );
880 while ( (*position).first != val.first )
885 return std::make_pair( position, exists );
888 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
894 ASSERT( val.first < L );
895 if ( ! myLabels.test( val.first ) )
897 unsigned int block_size = size();
898 myLabels.set( val.first );
899 blockInsert( myLabels.index( val.first ), block_size, val.second );
902 while ( (*position).first != val.first )
910 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
911 template <
typename InputIterator>
915 insert( InputIterator first, InputIterator last )
917 BOOST_CONCEPT_ASSERT(( boost::InputIterator< InputIterator > ));
918 for ( ; first != last; ++first )
920 Key k = first->first;
921 if ( ! myLabels.test( k ) )
923 unsigned int block_size = size();
925 blockInsert( myLabels.index( k ), block_size, first->second );
930 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
932 std::pair< typename DGtal::LabelledMap<TData, L, TWord, N, M>::Iterator,
937 Iterator it = begin(), it_end = end();
938 for ( ; it != it_end; ++it )
940 if ( (*it).first == x )
944 it_end = it; ++it_end;
945 return std::make_pair( it, it_end );
947 else if ( (*it).first > x )
return std::make_pair( it, it );
949 return std::make_pair( it_end, it_end );
952 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
954 std::pair< typename DGtal::LabelledMap<TData, L, TWord, N, M>::ConstIterator,
960 for ( ; it != it_end; ++it )
962 if ( (*it).first == x )
return std::make_pair( it, ++it );
963 else if ( (*it).first > x )
return std::make_pair( it, it );
965 return std::make_pair( it_end, it_end );
968 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
974 Iterator it = begin(), it_end = end();
975 for ( ; it != it_end; ++it )
977 if ( (*it).first == x )
return it;
978 else if ( (*it).first > x )
return it_end;
983 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
990 for ( ; it != it_end; ++it )
992 if ( (*it).first == x )
return it;
993 else if ( (*it).first > x )
return it_end;
998 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1004 Iterator it = begin(), it_end = end();
1005 for ( ; it != it_end; ++it )
1007 if ( (*it).first >= x )
return it;
1012 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1019 for ( ; it != it_end; ++it )
1021 if ( (*it).first >= x )
return it;
1026 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1032 Iterator it = begin(), it_end = end();
1033 for ( ; it != it_end; ++it )
1035 if ( (*it).first > x )
return it;
1040 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1047 for ( ; it != it_end; ++it )
1049 if ( (*it).first > x )
return it;
1055 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1061 ASSERT( idx <= block_size );
1062 return myFirstBlock.insert( idx, block_size, data );
1065 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1071 ASSERT( idx < size() );
1072 myFirstBlock.erase( idx, size() );
1075 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1081 const Self* ptr = (
const Self *)
this;
1085 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1091 const Self* ptr = (
const Self *)
this;
1095 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1104 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1113 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1122 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1132 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1141 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1158 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1164 if ( size() == 0 ) out <<
"()";
1170 out <<
"(" << (*it).first <<
"," << (*it).second <<
")";
1172 for ( ; it != it_end; ++it )
1174 out <<
",(" << (*it).first <<
"," << (*it).second <<
")";
1199 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1212 template <
typename TData,
unsigned int L,
typename TWord,
unsigned int N,
unsigned int M>
1218 object.selfDisplay( out );
1222 template <
typename TData>
1223 std::pair< unsigned int, unsigned int >
1225 (
unsigned int L,
double prob_no_data,
double prob_one_data )
1227 unsigned int sL = 2 * ( ( ( L - 1 ) / 16 ) + 1 );
1230 sizeof( TData* ), 2 );
1232 unsigned int Nopt = 0;
1233 unsigned int Mopt = 0;
1234 for (
unsigned int N = 1; N < L; ++N )
1235 for (
unsigned int M = 2; M < (L-N); ++M )
1239 if ( ( m < 0.0 ) || ( F.
fctNM( N, M ) < m ) )
1242 m = F.
fctNM( Nopt, Mopt );
1245 return std::make_pair( Nopt, Mopt );