39 #ifndef ECUDA_MODEL_DEVICE_CONTIGUOUS_ROW_MATRIX_HPP
40 #define ECUDA_MODEL_DEVICE_CONTIGUOUS_ROW_MATRIX_HPP
42 #include "../global.hpp"
43 #include "../memory.hpp"
44 #include "../iterator.hpp"
62 template<
typename T,
class P>
63 class device_contiguous_row_matrix :
public device_matrix< T, padded_ptr<T,P> >
66 typedef device_matrix< T, padded_ptr<T,P> > base_type;
69 typedef typename base_type::value_type value_type;
70 typedef typename base_type::pointer pointer;
71 typedef typename base_type::reference reference;
72 typedef typename base_type::const_reference const_reference;
73 typedef typename base_type::size_type size_type;
74 typedef typename base_type::difference_type difference_type;
76 typedef device_contiguous_block_iterator<value_type, typename make_unmanaged<P>::type > iterator;
77 typedef device_contiguous_block_iterator<const value_type,typename make_unmanaged_const<P>::type> const_iterator;
79 typedef reverse_device_iterator<iterator > reverse_iterator;
80 typedef reverse_device_iterator<const_iterator> const_reverse_iterator;
82 typedef device_contiguous_sequence<value_type > row_type;
83 typedef device_contiguous_sequence<const value_type> const_row_type;
84 typedef device_sequence< value_type, striding_padded_ptr< value_type, typename ecuda::add_pointer<value_type>::type > > column_type;
85 typedef device_sequence< const value_type, striding_padded_ptr< const value_type, typename ecuda::add_pointer<const value_type>::type > > const_column_type;
88 __HOST__ __DEVICE__ device_contiguous_row_matrix( pointer ptr = pointer(), size_type rows = 0, size_type columns = 0 ) : base_type(ptr,rows,columns) {}
90 __HOST__ __DEVICE__ device_contiguous_row_matrix(
const device_contiguous_row_matrix& src ) : base_type(src) {}
92 template<
typename U,
class Po
interType2>
__HOST__ __DEVICE__ device_contiguous_row_matrix(
const device_contiguous_row_matrix<U,PointerType2>& src ) : base_type(src) {}
94 __HOST__ device_contiguous_row_matrix& operator=(
const device_contiguous_row_matrix& src )
96 base_type::operator=(src);
100 #ifdef ECUDA_CPP11_AVAILABLE
101 __HOST__ device_contiguous_row_matrix( device_contiguous_row_matrix&& src ) : base_type(src) {}
102 __HOST__ device_contiguous_row_matrix& operator=( device_contiguous_row_matrix&& src )
104 base_type::operator=(src);
109 __HOST__ __DEVICE__ inline iterator begin()
__NOEXCEPT__ {
return iterator( unmanaged_cast(base_type::get_pointer()), base_type::number_columns() ); }
112 typedef typename ecuda::make_unmanaged<pointer>::type unmanaged_pointer_type;
113 unmanaged_pointer_type p = unmanaged_cast(base_type::get_pointer());
114 p.skip_bytes( p.get_pitch()*base_type::number_rows() );
115 return iterator( p, base_type::number_columns() );
117 __HOST__ __DEVICE__ inline const_iterator begin()
const __NOEXCEPT__ {
return const_iterator( unmanaged_cast(base_type::get_pointer()), base_type::number_columns() ); }
120 typedef typename ecuda::make_unmanaged_const<pointer>::type unmanaged_pointer_type;
121 unmanaged_pointer_type p = unmanaged_cast(base_type::get_pointer());
122 p.skip_bytes( p.get_pitch()*base_type::number_rows() );
123 return const_iterator( p, base_type::number_columns() );
125 #ifdef ECUDA_CPP11_AVAILABLE
129 typedef typename ecuda::make_unmanaged_const<pointer>::type unmanaged_pointer_type;
130 unmanaged_pointer_type p = unmanaged_cast(base_type::get_pointer());
131 p.skip_bytes( p.get_pitch()*base_type::number_rows() );
132 return const_iterator( p, base_type::number_columns() );
141 #ifdef ECUDA_CPP11_AVAILABLE
148 typedef typename make_unmanaged<pointer>::type unmanaged_pointer;
149 unmanaged_pointer up = unmanaged_cast( base_type::get_pointer() );
150 up.skip_bytes( row*up.get_pitch() );
151 return row_type( naked_cast<
typename ecuda::add_pointer<value_type>::type>( up ), base_type::number_columns() );
156 typedef typename make_unmanaged_const<pointer>::type unmanaged_pointer;
157 unmanaged_pointer up = unmanaged_cast( base_type::get_pointer() );
158 up.skip_bytes( row*up.get_pitch() );
159 return const_row_type( naked_cast<
typename ecuda::add_pointer<const value_type>::type>( up ), base_type::number_columns() );
164 typedef typename ecuda::add_pointer<value_type>::type naked_pointer_type;
165 naked_pointer_type np = naked_cast<naked_pointer_type>( unmanaged_cast(base_type::get_pointer()) + column );
166 return column_type( striding_padded_ptr<value_type,naked_pointer_type>( np, base_type::get_pointer().get_pitch() ), base_type::number_rows() );
169 __HOST__ __DEVICE__ inline const_column_type get_column(
const size_type column )
const
171 typedef typename ecuda::add_pointer<const value_type>::type naked_pointer_type;
172 naked_pointer_type np = naked_cast<naked_pointer_type>( unmanaged_cast(base_type::get_pointer()) + column );
173 return const_column_type( striding_padded_ptr<const value_type,naked_pointer_type>( np, base_type::get_pointer().get_pitch() ), base_type::number_rows() );
176 __HOST__ __DEVICE__ inline row_type operator[](
const size_type row ) {
return get_row(row); }
177 __HOST__ __DEVICE__ inline const_row_type operator[](
const size_type row )
const {
return get_row(row); }
179 __DEVICE__ inline reference at(
const size_type row,
const size_type column )
181 typename make_unmanaged<pointer>::type up = unmanaged_cast(base_type::get_pointer());
182 up.skip_bytes( up.get_pitch()*row );
183 up.operator+=( column );
184 return *naked_cast<
typename ecuda::add_pointer<value_type>::type>(up);
187 __DEVICE__ inline const_reference at(
const size_type row,
const size_type column )
const
189 typename make_unmanaged_const<pointer>::type up = unmanaged_cast(base_type::get_pointer());
190 up.skip_bytes( up.get_pitch()*row );
191 up.operator+=( column );