@@ -55,10 +55,38 @@ namespace alp {
5555 return getInitialized ( static_cast < const typename alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend >::base_type & >( v ) );
5656 }
5757
58- template < typename T, typename Structure, typename View, typename ImfR, typename ImfC, enum Backend backend >
59- void setInitialized ( alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > & v, bool initialized ) noexcept {
58+ template <
59+ typename T, typename Structure, typename View,
60+ typename ImfR, typename ImfC, enum Backend backend
61+ >
62+ void setInitialized (
63+ alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > &v, bool initialized
64+ ) noexcept {
6065 setInitialized ( static_cast < typename alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend >::base_type &>( v ), initialized );
6166 }
67+
68+ template <
69+ typename T, typename Structure, typename View,
70+ typename ImfR, typename ImfC, enum Backend backend
71+ >
72+ typename alp::Vector<
73+ T, Structure, Density::Dense, View, ImfR, ImfC, backend
74+ >::iterator
75+ begin (
76+ alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > &v
77+ ) noexcept ;
78+
79+ template <
80+ typename T, typename Structure, typename View,
81+ typename ImfR, typename ImfC, enum Backend backend
82+ >
83+ typename alp::Vector<
84+ T, Structure, Density::Dense, View, ImfR, ImfC, backend
85+ >::iterator
86+ end (
87+ alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > &v
88+ ) noexcept ;
89+
6290 } // end namespace ``alp::internal''
6391
6492 /* *
@@ -95,22 +123,188 @@ namespace alp {
95123 * accessible via functions.
96124 *
97125 */
98- template < typename T, typename Structure, typename View, typename ImfR, typename ImfC, enum Backend backend >
126+ template <
127+ typename T, typename Structure, typename View,
128+ typename ImfR, typename ImfC, enum Backend backend
129+ >
99130 class Vector < T, Structure, Density::Dense, View, ImfR, ImfC, backend > { };
100131
101132 /*
102133 * ALP vector with a general structure
103134 */
104- template < typename T, typename View, typename ImfR, typename ImfC, enum Backend backend >
105- class Vector < T, structures::General, Density::Dense, View, ImfR, ImfC, backend > :
106- public Matrix< T, structures::General, Density::Dense, View, ImfR, ImfC, backend > {
135+ template <
136+ typename T, typename View,
137+ typename ImfR, typename ImfC, enum Backend backend
138+ >
139+ class Vector <
140+ T, structures::General, Density::Dense, View, ImfR, ImfC, backend
141+ > : public Matrix< T, structures::General, Density::Dense, View, ImfR, ImfC, backend > {
107142
108143 public:
109144
110- typedef Vector< T, structures::General, Density::Dense, View, ImfR, ImfC, backend > self_type;
111- typedef Matrix< T, structures::General, Density::Dense, View, ImfR, ImfC, backend > base_type;
145+ typedef Vector<
146+ T, structures::General, Density::Dense,
147+ View, ImfR, ImfC, backend
148+ > self_type;
149+
150+ typedef Matrix<
151+ T, structures::General, Density::Dense,
152+ View, ImfR, ImfC, backend
153+ > base_type;
112154
113155 private:
156+ class VectorIterator :
157+ public std::iterator< std::random_access_iterator_tag, T > {
158+
159+ friend class Vector <
160+ T, structures::General, Density::Dense,
161+ View, ImfR, ImfC, backend
162+ >;
163+
164+ private:
165+
166+ typedef typename self_type::storage_index_type index_type;
167+ typedef std::iterator<
168+ std::random_access_iterator_tag, T
169+ > std_base_class;
170+
171+ self_type *vec;
172+ index_type position;
173+
174+ VectorIterator ( self_type *vptr ) noexcept :
175+ vec ( vptr ), position( 0 )
176+ {}
177+
178+ VectorIterator ( self_type *vptr, index_type pos ) noexcept :
179+ vec ( vptr ), position( pos )
180+ {}
181+
182+ bool equal ( const VectorIterator &other ) const noexcept {
183+ return ( vec == other.vec ) && ( position == other.position );
184+ }
185+
186+ bool lessThen ( const VectorIterator &other ) const noexcept {
187+ return ( vec == other.vec ) && ( position < other.position );
188+ }
189+
190+ public:
191+ typedef typename std_base_class::pointer pointer;
192+ typedef typename std_base_class::reference reference;
193+ typedef typename std_base_class::difference_type difference_type;
194+
195+ /* * Default constructor. */
196+ VectorIterator () noexcept :
197+ vec ( nullptr ), position( 0 )
198+ {}
199+
200+ /* * Copy constructor. */
201+ VectorIterator ( const VectorIterator &other ) noexcept :
202+ vec ( other.vec ),
203+ position ( other.position )
204+ {}
205+
206+ /* * Move constructor. */
207+ VectorIterator ( VectorIterator &&other ) :
208+ vec ( nullptr ), position( 0 )
209+ {
210+ std::swap ( vec, other.vec );
211+ std::swap ( position, other.position );
212+ }
213+
214+ /* * Copy assignment. */
215+ VectorIterator& operator =( const VectorIterator &other ) noexcept {
216+ vec = other.vec ;
217+ position = other.position ;
218+ return *this ;
219+ }
220+
221+ /* * Move assignment. */
222+ VectorIterator& operator =( VectorIterator &&other ) {
223+ vec = nullptr ;
224+ position = 0 ;
225+ std::swap ( vec, other.vec );
226+ std::swap ( position, other.position );
227+ return *this ;
228+ }
229+
230+ reference operator *() const {
231+ return ( *vec )[ position ];
232+ }
233+
234+ VectorIterator& operator ++() {
235+ ++position;
236+ return *this ;
237+ }
238+
239+ VectorIterator& operator --() {
240+ --position;
241+ return *this ;
242+ }
243+
244+ VectorIterator operator ++( int ) {
245+ return VectorIterator ( vec, position++ );
246+ }
247+
248+ VectorIterator operator --( int ) {
249+ return VectorIterator ( vec, position-- );
250+ }
251+
252+ VectorIterator operator +( const difference_type &n ) const {
253+ return VectorIterator ( vec, ( position + n ) );
254+ }
255+
256+ VectorIterator& operator +=( const difference_type &n ) {
257+ position += n;
258+ return *this ;
259+ }
260+
261+ VectorIterator operator -( const difference_type &n ) const {
262+ return VectorIterator ( vec, ( position - n ) );
263+ }
264+
265+ VectorIterator& operator -=( const difference_type &n ) {
266+ position -= n;
267+ return *this ;
268+ }
269+
270+ reference operator []( const difference_type &n ) const {
271+ return ( *vec )[ position + n ];
272+ }
273+
274+ bool operator ==( const VectorIterator &other ) const {
275+ return equal ( other );
276+ }
277+
278+ bool operator !=( const VectorIterator &other ) const {
279+ return !equal ( other );
280+ }
281+
282+ bool operator <( const VectorIterator &other ) const {
283+ return lessThen ( other );
284+ }
285+
286+ bool operator >( const VectorIterator &other ) const {
287+ return !( lessThen ( other ) || equal ( other ) );
288+ }
289+
290+ bool operator <=( const VectorIterator &other ) const {
291+ return lessThen ( other ) || equal ( other );
292+ }
293+
294+ bool operator >=( const VectorIterator &other ) const {
295+ return !lessThen ( other );
296+ }
297+
298+ difference_type operator +( const VectorIterator &other ) const {
299+ assert ( other.vec == vec );
300+ return position + other.position ;
301+ }
302+
303+ difference_type operator -( const VectorIterator &other ) const {
304+ assert ( other.vec == vec );
305+ return position - other.position ;
306+ }
307+ };
114308
115309 /* ********************
116310 Storage info friends
@@ -123,8 +317,21 @@ namespace alp {
123317 return nrows ( static_cast < const base_type & >( *this ) );
124318 }
125319
320+ VectorIterator begin () noexcept {
321+ return VectorIterator ( this );
322+ }
323+
324+ VectorIterator end () noexcept {
325+ return VectorIterator ( this , _length () );
326+ }
327+
126328
127329 public:
330+
331+ typedef VectorIterator iterator;
332+
333+ friend iterator internal::begin<>( self_type &v ) noexcept ;
334+ friend iterator internal::end<>( self_type &v ) noexcept ;
128335
129336 /* * @see Vector::value_type. */
130337 using value_type = T;
@@ -307,6 +514,36 @@ namespace alp {
307514
308515 }; // class Vector with physical container
309516
517+ namespace internal {
518+
519+ template <
520+ typename T, typename Structure, typename View,
521+ typename ImfR, typename ImfC, enum Backend backend
522+ >
523+ typename alp::Vector<
524+ T, Structure, Density::Dense, View, ImfR, ImfC, backend
525+ >::iterator
526+ begin (
527+ alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > &v
528+ ) noexcept {
529+ return v.begin ();
530+ }
531+
532+ template <
533+ typename T, typename Structure, typename View,
534+ typename ImfR, typename ImfC, enum Backend backend
535+ >
536+ typename alp::Vector<
537+ T, Structure, Density::Dense, View, ImfR, ImfC, backend
538+ >::iterator
539+ end (
540+ alp::Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > &v
541+ ) noexcept {
542+ return v.end ();
543+ }
544+
545+ } // end namespace ``alp::internal''
546+
310547 /* * Identifies any backend's implementation of ALP vector as an ALP vector. */
311548 template < typename T, typename Structure, typename View, typename ImfR, typename ImfC, enum Backend backend >
312549 struct is_vector < Vector< T, Structure, Density::Dense, View, ImfR, ImfC, backend > > : std::true_type {};
0 commit comments