+// -------------------------------------------------------------------------
+template< class _TImage, class _TLabels, class _TScalar >
+template< class _TTriplets >
+void fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >::
+_Boundary( _TTriplets& B, std::map< TLabel, unsigned long >& labels )
+{
+ B.clear( );
+
+ // Set up the multithreaded processing
+ _TBoundaryThreadStruct thrStr;
+ thrStr.Filter = this;
+ thrStr.Triplets = reinterpret_cast< void* >( &B );
+ thrStr.Labels = &labels;
+
+ // Configure threader
+ const TLabels* in_labels = this->GetInputLabels( );
+ const itk::ImageRegionSplitterBase* split = this->GetImageRegionSplitter( );
+ const unsigned int nThreads =
+ split->GetNumberOfSplits(
+ in_labels->GetRequestedRegion( ), this->GetNumberOfThreads( )
+ );
+
+ itk::MultiThreader::Pointer threads = itk::MultiThreader::New( );
+ threads->SetNumberOfThreads( nThreads );
+ threads->SetSingleMethod( this->_BoundaryCbk< _TTriplets >, &thrStr );
+
+ // Execute threader
+ threads->SingleMethodExecute( );
+}
+
+// -------------------------------------------------------------------------
+template< class _TImage, class _TLabels, class _TScalar >
+template< class _TTriplets >
+ITK_THREAD_RETURN_TYPE
+fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >::
+_BoundaryCbk( void* arg )
+{
+ _TBoundaryThreadStruct* thrStr;
+ itk::ThreadIdType total, thrId, thrCount;
+ itk::MultiThreader::ThreadInfoStruct* thrInfo =
+ reinterpret_cast< itk::MultiThreader::ThreadInfoStruct* >( arg );
+ thrId = thrInfo->ThreadID;
+ thrCount = thrInfo->NumberOfThreads;
+ thrStr = reinterpret_cast< _TBoundaryThreadStruct* >( thrInfo->UserData );
+
+ TRegion region;
+ total = thrStr->Filter->SplitRequestedRegion( thrId, thrCount, region );
+ if( thrId < total )
+ thrStr->Filter->_ThreadedBoundary(
+ region, thrId,
+ reinterpret_cast< _TTriplets* >( thrStr->Triplets ),
+ thrStr->Labels
+ );
+ return( ITK_THREAD_RETURN_VALUE );
+}
+
+// -------------------------------------------------------------------------
+template< class _TImage, class _TLabels, class _TScalar >
+template< class _TTriplets >
+void fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >::
+_ThreadedBoundary(
+ const TRegion& region, const itk::ThreadIdType& id,
+ _TTriplets* B,
+ std::map< TLabel, unsigned long >* labels
+ )
+{
+ typedef itk::ImageRegionConstIteratorWithIndex< TLabels > _TIt;
+ typedef typename std::map< TLabel, unsigned long >::value_type _TMapValue;
+ typedef typename std::map< unsigned long, TLabel >::value_type _TInvValue;
+ typedef typename _TTriplets::value_type _TTriplet;
+
+ const TLabels* in_labels = this->GetInputLabels( );
+ TRegion reqRegion = in_labels->GetRequestedRegion( );
+ _TIt it( in_labels, region );
+ for( it.GoToBegin( ); !it.IsAtEnd( ); ++it )