36 #ifndef VIGRA_BLOCKIFY_HXX 
   37 #define VIGRA_BLOCKIFY_HXX 
   39 #include "multi_array.hxx" 
   44 namespace blockify_detail
 
   47 template <
unsigned int CurrentDimensions>
 
   51     template <
unsigned int N, 
class T, 
class S, 
class Shape>
 
   52     static void make(MultiArrayView<N, T, S>& 
source, 
 
   53                      MultiArrayView<N, MultiArrayView<N, T, S> >& blocks,
 
   54                      Shape current_block_begin,
 
   55                      Shape current_block_end,
 
   56                      Shape current_block_pos,
 
   59         typedef typename Shape::value_type size_type;
 
   60         enum{ n = CurrentDimensions - 1};
 
   62         size_type blocks_extend = blocks.shape(n);
 
   64         vigra_assert(blocks_extend != 0, 
"");
 
   65         for(current_block_pos[n] = 0, current_block_begin[n] = 0, current_block_end[n] = block_shape[n];
 
   66             current_block_pos[n] != blocks_extend - 1;
 
   67             ++current_block_pos[n],
 
   68                 current_block_begin[n] += block_shape[n], 
 
   69                 current_block_end[n] += block_shape[n])
 
   71             blockify_impl<n>::make(source, blocks, current_block_begin, current_block_end, current_block_pos, block_shape);
 
   73         current_block_end[n] = source.shape(n);
 
   74         blockify_impl<n>::make(source, blocks, current_block_begin, current_block_end, current_block_pos, block_shape);
 
   79 struct blockify_impl<0>
 
   81     template <
unsigned int N, 
class T, 
class S, 
class Shape>
 
   82     static void make(MultiArrayView<N, T, S>& source, 
 
   83                      MultiArrayView<N, MultiArrayView<N, T, S> >& blocks,
 
   84                      Shape current_block_begin,
 
   85                      Shape current_block_end,
 
   86                      Shape current_block_pos,
 
   89         blocks[current_block_pos] = source.subarray(current_block_begin, current_block_end);
 
   95 template <
unsigned int N, 
class T, 
class S>
 
   96 MultiArray<N, MultiArrayView<N, T, S> >
 
   99     using namespace blockify_detail;
 
  103     for(
unsigned int n = 0; n != N; ++n)
 
  105         blocks_shape[n] = source.shape(n) / block_shape[n];
 
  106         if(blocks_shape[n] * block_shape[n] != source.shape(n))
 
  109     MultiArray<N, MultiArrayView<N, T, S> > blocks(blocks_shape);
 
  110     if(source.size() == 0)
 
  115     blockify_impl<N>::make(source, blocks, a, b, c, block_shape);
 
  121 #endif // VIGRA_BLOCKIFY_HXX 
MultiArrayShape< actual_dimension >::type difference_type
Definition: multi_array.hxx:739
vigra::GridGraph< N, DirectedTag >::vertex_descriptor source(typename vigra::GridGraph< N, DirectedTag >::edge_descriptor const &e, vigra::GridGraph< N, DirectedTag > const &g)
Get a vertex descriptor for the start vertex of edge e in graph g (API: boost). 
Definition: multi_gridgraph.hxx:2943