39 #ifndef ECUDA_MODEL_DEVICE_FIXED_SEQUENCE_HPP
40 #define ECUDA_MODEL_DEVICE_FIXED_SEQUENCE_HPP
42 #include "../global.hpp"
43 #include "../memory.hpp"
44 #include "../iterator.hpp"
58 template<typename T,std::size_t N,class P=typename ecuda::add_pointer<T>::type>
59 class device_fixed_sequence
65 typedef typename ecuda::add_lvalue_reference<T>::type reference;
66 typedef typename ecuda::add_lvalue_reference<const T>::type const_reference;
67 typedef std::size_t size_type;
68 typedef std::ptrdiff_t difference_type;
70 typedef device_contiguous_iterator<value_type > iterator;
71 typedef device_contiguous_iterator<const value_type> const_iterator;
73 typedef reverse_device_iterator<iterator > reverse_iterator;
74 typedef reverse_device_iterator<const_iterator> const_reverse_iterator;
85 __HOST__ __DEVICE__ device_fixed_sequence(
const device_fixed_sequence& src ) : ptr(src.ptr) {}
86 __HOST__ device_fixed_sequence& operator=(
const device_fixed_sequence& src )
91 #ifdef ECUDA_CPP11_AVAILABLE
92 __HOST__ device_fixed_sequence( device_fixed_sequence&& src ) {
ecuda::swap( ptr, src.ptr ); }
93 __HOST__ device_fixed_sequence& operator=( device_fixed_sequence&& src )
102 __DEVICE__ inline reference operator[](
const size_type x ) {
return *(unmanaged_cast( ptr ) + x); }
103 __DEVICE__ inline const_reference operator[](
const size_type x )
const {
return *(unmanaged_cast( ptr ) + x); }
105 __HOST__ __DEVICE__ inline iterator begin() {
return iterator( unmanaged_cast(ptr) ); }
106 __HOST__ __DEVICE__ inline iterator end() {
return iterator( unmanaged_cast(ptr) + N ); }
107 __HOST__ __DEVICE__ inline const_iterator begin()
const {
return const_iterator( unmanaged_cast(ptr) ); }
108 __HOST__ __DEVICE__ inline const_iterator end()
const {
return const_iterator( unmanaged_cast(ptr) + N ); }
109 #ifdef ECUDA_CPP11_AVAILABLE
110 __HOST__ __DEVICE__ inline const_iterator cbegin()
const {
return const_iterator( unmanaged_cast(ptr) ); }
111 __HOST__ __DEVICE__ inline const_iterator cend()
const {
return const_iterator( unmanaged_cast(ptr) + N ); }
114 __HOST__ __DEVICE__ inline reverse_iterator rbegin() {
return reverse_iterator(end()); }
115 __HOST__ __DEVICE__ inline reverse_iterator rend() {
return reverse_iterator(begin()); }
116 __HOST__ __DEVICE__ inline const_reverse_iterator rbegin()
const {
return const_reverse_iterator(end()); }
117 __HOST__ __DEVICE__ inline const_reverse_iterator rend()
const {
return const_reverse_iterator(begin()); }
118 #ifdef ECUDA_CPP11_AVAILABLE
119 __HOST__ __DEVICE__ inline const_reverse_iterator crbegin()
const {
return const_reverse_iterator(end()); }
120 __HOST__ __DEVICE__ inline const_reverse_iterator crend()
const {
return const_reverse_iterator(begin()); }
__HOST__ __DEVICE__ void swap(T &a, T &b) __NOEXCEPT__