39 #ifndef ECUDA_MODEL_DEVICE_CONTIGUOUS_SEQUENCE_HPP
40 #define ECUDA_MODEL_DEVICE_CONTIGUOUS_SEQUENCE_HPP
42 #include "../global.hpp"
43 #include "../memory.hpp"
44 #include "../iterator.hpp"
60 template<typename T,class P=typename ecuda::add_pointer<T>::type>
61 class device_contiguous_sequence :
public device_sequence<T,P>
64 typedef device_sequence<T,P> base_type;
67 typedef typename base_type::value_type value_type;
68 typedef typename base_type::pointer pointer;
69 typedef typename base_type::reference reference;
70 typedef typename base_type::const_reference const_reference;
71 typedef typename base_type::size_type size_type;
72 typedef typename base_type::difference_type difference_type;
74 typedef device_contiguous_iterator<value_type> iterator;
75 typedef device_contiguous_iterator<const value_type> const_iterator;
76 typedef reverse_device_iterator<iterator> reverse_iterator;
77 typedef reverse_device_iterator<const_iterator> const_reverse_iterator;
80 __HOST__ __DEVICE__ device_contiguous_sequence( pointer ptr = pointer(), size_type length = 0 ) : base_type(ptr,length) {}
81 __HOST__ __DEVICE__ device_contiguous_sequence(
const device_contiguous_sequence& src ) : base_type(src) {}
82 template<
typename U,
class Po
interType2>
__HOST__ __DEVICE__ device_contiguous_sequence(
const device_contiguous_sequence<U,PointerType2>& src ) : base_type(src) {}
83 __HOST__ device_contiguous_sequence& operator=(
const device_contiguous_sequence& src )
85 base_type::operator=(src);
88 #ifdef ECUDA_CPP11_AVAILABLE
89 __HOST__ device_contiguous_sequence( device_contiguous_sequence&& src ) : base_type(src) {}
90 __HOST__ device_contiguous_sequence& operator=( device_contiguous_sequence&& src )
92 base_type::operator=(src);
97 __HOST__ __DEVICE__ inline iterator begin() {
return iterator( unmanaged_cast(base_type::get_pointer()) ); }
98 __HOST__ __DEVICE__ inline iterator end() {
return iterator( unmanaged_cast(base_type::get_pointer()) + base_type::size() ); }
99 __HOST__ __DEVICE__ inline const_iterator begin()
const {
return const_iterator( unmanaged_cast(base_type::get_pointer()) ); }
100 __HOST__ __DEVICE__ inline const_iterator end()
const {
return const_iterator( unmanaged_cast(base_type::get_pointer()) + base_type::size() ); }
101 #ifdef ECUDA_CPP11_AVAILABLE
102 __HOST__ __DEVICE__ inline const_iterator cbegin()
const {
return const_iterator( unmanaged_cast(base_type::get_pointer()) ); }
103 __HOST__ __DEVICE__ inline const_iterator cend()
const {
return const_iterator( unmanaged_cast(base_type::get_pointer()) + base_type::size() ); }
106 __HOST__ __DEVICE__ inline reverse_iterator rbegin() {
return reverse_iterator(end()); }
107 __HOST__ __DEVICE__ inline reverse_iterator rend() {
return reverse_iterator(begin()); }
108 __HOST__ __DEVICE__ inline const_reverse_iterator rbegin()
const {
return const_reverse_iterator(end()); }
109 __HOST__ __DEVICE__ inline const_reverse_iterator rend()
const {
return const_reverse_iterator(begin()); }
110 #ifdef ECUDA_CPP11_AVAILABLE
111 __HOST__ __DEVICE__ inline const_reverse_iterator crbegin()
const {
return const_reverse_iterator(end()); }
112 __HOST__ __DEVICE__ inline const_reverse_iterator crend()
const {
return const_reverse_iterator(begin()); }