19 #ifndef SNARK_PERCEPTION_PIN_SCREEN_HEADER_GUARD_
20 #define SNARK_PERCEPTION_PIN_SCREEN_HEADER_GUARD_
32 template <
typename T >
43 typedef Eigen::Matrix< std::size_t, 1, 2 >
size_type;
49 pin_screen( std::size_t size1 , std::size_t size2 );
62 std::size_t
height( std::size_t i , std::size_t j )
const;
65 bool exists( std::size_t i , std::size_t j , std::size_t k )
const;
71 T*
find( std::size_t i , std::size_t j , std::size_t k );
77 const T*
find( std::size_t i , std::size_t j , std::size_t k )
const;
83 T&
operator()( std::size_t i , std::size_t j , std::size_t k );
86 const T&
operator()( std::size_t i , std::size_t j , std::size_t k )
const;
98 T&
touch( std::size_t i , std::size_t j , std::size_t k ) {
return m_grid( i, j )[k]; }
104 void erase( std::size_t i, std::size_t j, std::size_t k );
116 class const_iterator;
122 const_iterator
begin()
const;
128 const_iterator
end()
const;
132 class neighbourhood_iterator;
135 friend class iterator;
136 friend class const_iterator;
137 typedef ::Eigen::Matrix< column_type, ::Eigen::Dynamic, ::Eigen::Dynamic > GridType;
141 template <
typename T >
142 class pin_screen< T >::const_iterator
149 typedef typename pin_screen< T >::index_type
index_type;
152 typedef typename pin_screen< T >::size_type
size_type;
155 enum { Dimensions = 3 };
158 bool operator==(
const const_iterator& rhs )
const {
return m_grid == rhs.m_grid && m_column == rhs.m_column && m_it == rhs.m_it; }
159 bool operator!=(
const const_iterator& rhs )
const {
return !operator==( rhs ); }
160 bool operator<(
const const_iterator& rhs )
const
162 assert( m_grid == rhs.m_grid );
163 if (m_column[0] < rhs.m_column[0])
return true;
164 if (m_column[0] > rhs.m_column[0])
return false;
166 if (m_column[1] < rhs.m_column[1])
return true;
167 if (m_column[1] > rhs.m_column[1])
return false;
169 if (m_it->first < rhs.m_it->first)
return true;
170 if (m_it->first > rhs.m_it->first)
return false;
177 const T& operator*()
const {
return m_it->second; }
178 const T* operator->()
const {
return &m_it->second; }
180 const const_iterator& operator++()
182 if( m_it != ( *m_grid )( m_column[0], m_column[1] ).
end() ) { ++m_it; }
183 while( m_it == ( *m_grid )( m_column[0], m_column[1] ).
end() )
186 if( m_column[1] >= std::size_t( m_grid->cols() ) )
189 if( m_column[0] >= std::size_t( m_grid->rows() ) ) {
return *
this; }
192 m_it = ( *m_grid )( m_column[0], m_column[1] ).
begin();
197 const_iterator() : m_column( 0, 0 ) {}
202 const GridType* m_grid;
204 typename
pin_screen< T >::column_type::const_iterator m_it;
208 template < typename T >
222 enum { Dimensions = 3 };
225 bool operator==(
const iterator& rhs )
const {
return m_grid == rhs.m_grid && m_column == rhs.m_column && m_it == rhs.m_it; }
226 bool operator!=(
const iterator& rhs )
const {
return !operator==( rhs ); }
227 bool operator<(
const const_iterator& rhs )
const
229 assert( m_grid == rhs.m_grid );
230 if (m_column[0] < rhs.m_column[0])
return true;
231 if (m_column[0] > rhs.m_column[0])
return false;
233 if (m_column[1] < rhs.m_column[1])
return true;
234 if (m_column[1] > rhs.m_column[1])
return false;
236 if (m_it->first < rhs.m_it->first)
return true;
237 if (m_it->first > rhs.m_it->first)
return false;
244 T& operator*() {
return m_it->second; }
245 T* operator->() {
return &m_it->second; }
246 const T& operator*()
const {
return m_it->second; }
247 const T* operator->()
const {
return &m_it->second; }
249 const iterator& operator++()
251 if( m_it != ( *m_grid )( m_column[0], m_column[1] ).
end() ) { ++m_it; }
252 while( m_it == ( *m_grid )( m_column[0], m_column[1] ).
end() )
255 if( m_column[1] >= std::size_t( m_grid->cols() ) )
258 if( m_column[0] >= std::size_t( m_grid->rows() ) ) {
return *
this; }
261 m_it = ( *m_grid )( m_column[0], m_column[1] ).
begin();
266 operator const_iterator()
const
270 it.m_column = m_column;
275 iterator() : m_column( 0, 0 ) {}
281 typename pin_screen< T >::column_type::iterator m_it;
284 template <
typename T >
289 it.m_it = m_grid( 0, 0 ).begin();
290 if( m_grid( 0, 0 ).empty() ) { ++it; }
294 template <
typename T >
299 it.m_it = m_grid( 0, 0 ).begin();
300 if( m_grid( 0, 0 ).empty() ) { ++it; }
304 template <
typename T >
309 it.m_column =
size_type( m_grid.rows(), m_grid.cols() );
310 it.m_it = m_grid( m_grid.rows() - 1, m_grid.cols() - 1 ).
end();
314 template <
typename T >
319 it.m_column =
size_type( m_grid.rows(), m_grid.cols() );
320 it.m_it = m_grid( m_grid.rows() - 1, m_grid.cols() - 1 ).
end();
325 template <
typename T >
358 template <
typename T >
361 m_grid = center.m_grid;
363 m_begin[0] = m_center[0] - ( m_center[0] > 0 ? 1 : 0 );
364 m_begin[1] = m_center[1] - ( m_center[1] > 0 ? 1 : 0 );
365 m_begin[2] = m_center[2] - ( m_center[2] > 0 ? 1 : 0 );
366 m_end[0] = m_center[0] + 1 + ( m_center[0] < std::size_t( m_grid->rows() ) - 1 ? 1 : 0 );
367 m_end[1] = m_center[1] + 1 + ( m_center[1] < std::size_t( m_grid->cols() ) - 1 ? 1 : 0 );
368 m_end[2] = m_center[2] + 1 + 1;
371 template <
typename T >
374 if( m_it != ( *m_grid )( m_column[0], m_column[1] ).
end() && m_it->first < m_end[2] ) { ++m_it; }
375 while( m_it == ( *m_grid )( m_column[0], m_column[1] ).
end() || m_it->first >= m_end[2] || this->operator()() == m_center )
378 if( m_column[1] >= m_end[1] )
381 if( m_column[0] >= m_end[0] )
383 m_it = ( *( m_grid ) )( m_end[0] - 1, m_end[1] - 1 ).
end();
386 m_column[1] = m_begin[1];
388 m_it = m_begin[2] == 0
389 ? ( *m_grid )( m_column[0], m_column[1] ).
begin()
390 : ( *m_grid )( m_column[0], m_column[1] ).upper_bound( m_begin[2] - 1 );
395 template <
typename T >
400 for( it.m_column[0] = it.m_begin[0]; it.m_column[0] < it.m_end[0]; ++it.m_column[0] )
402 for( it.m_column[1] = it.m_begin[1]; it.m_column[1] < it.m_end[1]; ++it.m_column[1] )
404 if( it.m_begin[2] == 0 )
406 it.m_it = ( *( it.m_grid ) )( it.m_column[0], it.m_column[1] ).
begin();
410 it.m_it = ( *( it.m_grid ) )( it.m_column[0], it.m_column[1] ).upper_bound( it.m_begin[2] - 1 );
412 for( ; it.m_it != ( *( it.m_grid ) )( it.m_column[0], it.m_column[1] ).
end() && it.m_it->first < it.m_end[2]; ++it.m_it )
414 if( it() != it.m_center ) {
return it; }
418 it.m_it = ( *( it.m_grid ) )( it.m_end[0] - 1, it.m_end[1] - 1 ).
end();
422 template <
typename T >
427 it.m_column[0] = it.m_end[0];
428 it.m_column[1] = it.m_end[1];
429 it.m_it = ( *( it.m_grid ) )( it.m_end[0] - 1, it.m_end[1] - 1 ).
end();
433 template <
typename T >
435 : m_grid( size1, size2 )
439 template <
typename T >
441 : m_grid( size[0], size[1] )
445 template <
typename T >
448 return m_grid( i, j ).empty() ? 0 : m_grid( i, j ).rbegin()->first;
451 template <
typename T >
454 return m_grid( i, j ).find( k ) != m_grid( i, j ).end();
457 template <
typename T >
460 typename column_type::iterator it( m_grid( i, j ).find( k ) );
461 return it == m_grid( i, j ).end() ? NULL : &it->second;
464 template <
typename T >
467 typename column_type::const_iterator it( m_grid( i, j ).find( k ) );
468 return it == m_grid( i, j ).end() ? NULL : &it->second;
471 template <
typename T >
474 return touch( i, j, k );
477 template <
typename T >
480 return *find( i, j, k );
483 template<
typename T >
486 m_grid( i, j ).erase( k );
489 template<
typename T >
492 for( std::size_t i = 0; i < m_grid.rows(); ++i )
494 for( std::size_t j = 0; j < m_grid.cols(); ++j )
496 m_grid( i, j ).clear();
503 #endif // #ifndef SNARK_PERCEPTION_PIN_SCREEN_HEADER_GUARD_