319 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			319 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /** | ||
|  |  * -*- c++ -*- | ||
|  |  * | ||
|  |  * \file begin.hpp | ||
|  |  * | ||
|  |  * \brief The \c begin operation. | ||
|  |  * | ||
|  |  * Copyright (c) 2009, Marco Guazzone | ||
|  |  * | ||
|  |  * Distributed under the Boost Software License, Version 1.0. (See | ||
|  |  * accompanying file LICENSE_1_0.txt or copy at | ||
|  |  * http://www.boost.org/LICENSE_1_0.txt) | ||
|  |  * | ||
|  |  * \author Marco Guazzone, marco.guazzone@gmail.com | ||
|  |  */ | ||
|  | 
 | ||
|  | #ifndef BOOST_NUMERIC_UBLAS_OPERATION_BEGIN_HPP | ||
|  | #define BOOST_NUMERIC_UBLAS_OPERATION_BEGIN_HPP | ||
|  | 
 | ||
|  | 
 | ||
|  | #include <boost/numeric/ublas/expression_types.hpp> | ||
|  | #include <boost/numeric/ublas/fwd.hpp> | ||
|  | #include <boost/numeric/ublas/traits/const_iterator_type.hpp> | ||
|  | #include <boost/numeric/ublas/traits/iterator_type.hpp> | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace boost { namespace numeric { namespace ublas { | ||
|  | 
 | ||
|  |     namespace detail { | ||
|  | 
 | ||
|  |         /** | ||
|  |          * \brief Auxiliary class for implementing the \c begin operation. | ||
|  |          * \tparam CategoryT The expression category type (e.g., vector_tag). | ||
|  |          * \tparam TagT The dimension type tag (e.g., tag::major). | ||
|  |          * \tparam OrientationT The orientation category type (e.g., row_major_tag). | ||
|  |          */ | ||
|  |         template <typename CategoryT, typename TagT=void, typename OrientationT=void> | ||
|  |         struct begin_impl; | ||
|  | 
 | ||
|  | 
 | ||
|  |         /// \brief Specialization of \c begin_impl for iterating vector expressions. | ||
|  |         template <> | ||
|  |         struct begin_impl<vector_tag,void,void> | ||
|  |         { | ||
|  |             /** | ||
|  |              * \brief Return an iterator to the first element of the given vector | ||
|  |              *  expression. | ||
|  |              * \tparam ExprT A model of VectorExpression type. | ||
|  |              * \param e A vector expression. | ||
|  |              * \return An iterator over the given vector expression. | ||
|  |              */ | ||
|  |             template <typename ExprT> | ||
|  |             static typename ExprT::iterator apply(ExprT& e) | ||
|  |             { | ||
|  |                 return e.begin(); | ||
|  |             } | ||
|  | 
 | ||
|  | 
 | ||
|  |             /** | ||
|  |              * \brief Return a const iterator to the first element of the given vector | ||
|  |              *  expression. | ||
|  |              * \tparam ExprT A model of VectorExpression type. | ||
|  |              * \param e A vector expression. | ||
|  |              * \return A const iterator to the first element of the given vector | ||
|  |              *  expression. | ||
|  |              */ | ||
|  |             template <typename ExprT> | ||
|  |             static typename ExprT::const_iterator apply(ExprT const& e) | ||
|  |             { | ||
|  |                 return e.begin(); | ||
|  |             } | ||
|  |         }; | ||
|  | 
 | ||
|  | 
 | ||
|  |         /// \brief Specialization of \c begin_impl for iterating matrix expressions with | ||
|  |         ///  a row-major orientation over the major dimension. | ||
|  |         template <> | ||
|  |         struct begin_impl<matrix_tag,tag::major,row_major_tag> | ||
|  |         { | ||
|  |             /** | ||
|  |              * \brief Return an iterator to the first element of the given row-major | ||
|  |              *  matrix expression over the major dimension. | ||
|  |              * \tparam ExprT A model of MatrixExpression type. | ||
|  |              * \param e A matrix expression. | ||
|  |              * \return An iterator over the major dimension of the given matrix | ||
|  |              *  expression. | ||
|  |              */ | ||
|  |             template <typename ExprT> | ||
|  |             static typename ExprT::iterator1 apply(ExprT& e) | ||
|  |             { | ||
|  |                 return e.begin1(); | ||
|  |             } | ||
|  | 
 | ||
|  | 
 | ||
|  |             /** | ||
|  |              * \brief Return a const iterator to the first element of the given | ||
|  |              *  row-major matrix expression over the major dimension. | ||
|  |              * \tparam ExprT A model of MatrixExpression type. | ||
|  |              * \param e A matrix expression. | ||
|  |              * \return A const iterator over the major dimension of the given matrix | ||
|  |              *  expression. | ||
|  |              */ | ||
|  |             template <typename ExprT> | ||
|  |             static typename ExprT::const_iterator1 apply(ExprT const& e) | ||
|  |             { | ||
|  |                 return e.begin1(); | ||
|  |             } | ||
|  |         }; | ||
|  | 
 | ||
|  | 
 | ||
|  |         /// \brief Specialization of \c begin_impl for iterating matrix expressions with | ||
|  |         ///  a column-major orientation over the major dimension. | ||
|  |         template <> | ||
|  |         struct begin_impl<matrix_tag,tag::major,column_major_tag> | ||
|  |         { | ||
|  |             /** | ||
|  |              * \brief Return an iterator to the first element of the given column-major | ||
|  |              *  matrix expression over the major dimension. | ||
|  |              * \tparam ExprT A model of MatrixExpression type. | ||
|  |              * \param e A matrix expression. | ||
|  |              * \return An iterator over the major dimension of the given matrix | ||
|  |              *  expression. | ||
|  |              */ | ||
|  |             template <typename ExprT> | ||
|  |             static typename ExprT::iterator2 apply(ExprT& e) | ||
|  |             { | ||
|  |                 return e.begin2(); | ||
|  |             } | ||
|  | 
 | ||
|  | 
 | ||
|  |             /** | ||
|  |              * \brief Return a const iterator to the first element of the given | ||
|  |              *  column-major matrix expression over the major dimension. | ||
|  |              * \tparam ExprT A model of MatrixExpression type. | ||
|  |              * \param e A matrix expression. | ||
|  |              * \return A const iterator over the major dimension of the given matrix | ||
|  |              *  expression. | ||
|  |              */ | ||
|  |             template <typename ExprT> | ||
|  |             static typename ExprT::const_iterator2 apply(ExprT const& e) | ||
|  |             { | ||
|  |                 return e.begin2(); | ||
|  |             } | ||
|  |         }; | ||
|  | 
 | ||
|  | 
 | ||
|  |         /// \brief Specialization of \c begin_impl for iterating matrix expressions with | ||
|  |         ///  a row-major orientation over the minor dimension. | ||
|  |         template <> | ||
|  |         struct begin_impl<matrix_tag,tag::minor,row_major_tag> | ||
|  |         { | ||
|  |             /** | ||
|  |              * \brief Return an iterator to the first element of the given row-major | ||
|  |              *  matrix expression over the minor dimension. | ||
|  |              * \tparam ExprT A model of MatrixExpression type. | ||
|  |              * \param e A matrix expression. | ||
|  |              * \return An iterator over the minor dimension of the given matrix | ||
|  |              *  expression. | ||
|  |              */ | ||
|  |             template <typename ExprT> | ||
|  |             static typename ExprT::iterator2 apply(ExprT& e) | ||
|  |             { | ||
|  |                 return e.begin2(); | ||
|  |             } | ||
|  | 
 | ||
|  | 
 | ||
|  |             /** | ||
|  |              * \brief Return a const iterator to the first element of the given | ||
|  |              *  row-major matrix expression over the minor dimension. | ||
|  |              * \tparam ExprT A model of MatrixExpression type. | ||
|  |              * \param e A matrix expression. | ||
|  |              * \return A const iterator over the minor dimension of the given matrix | ||
|  |              *  expression. | ||
|  |              */ | ||
|  |             template <typename ExprT> | ||
|  |             static typename ExprT::const_iterator2 apply(ExprT const& e) | ||
|  |             { | ||
|  |                 return e.begin2(); | ||
|  |             } | ||
|  |         }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |         /// \brief Specialization of \c begin_impl for iterating matrix expressions with | ||
|  |         ///  a column-major orientation over the minor dimension. | ||
|  |         template <> | ||
|  |         struct begin_impl<matrix_tag,tag::minor,column_major_tag> | ||
|  |         { | ||
|  |             /** | ||
|  |              * \brief Return an iterator to the first element of the given column-major | ||
|  |              *  matrix expression over the minor dimension. | ||
|  |              * \tparam ExprT A model of MatrixExpression type. | ||
|  |              * \param e A matrix expression. | ||
|  |              * \return An iterator over the minor dimension of the given matrix | ||
|  |              *  expression. | ||
|  |              */ | ||
|  |             template <typename ExprT> | ||
|  |             static typename ExprT::iterator1 apply(ExprT& e) | ||
|  |             { | ||
|  |                 return e.begin1(); | ||
|  |             } | ||
|  | 
 | ||
|  | 
 | ||
|  |             /** | ||
|  |              * \brief Return a const iterator to the first element of the given | ||
|  |              *  column-major matrix expression over the minor dimension. | ||
|  |              * \tparam ExprT A model of MatrixExpression type. | ||
|  |              * \param e A matrix expression. | ||
|  |              * \return A const iterator over the minor dimension of the given matrix | ||
|  |              *  expression. | ||
|  |              */ | ||
|  |             template <typename ExprT> | ||
|  |             static typename ExprT::const_iterator1 apply(ExprT const& e) | ||
|  |             { | ||
|  |                 return e.begin1(); | ||
|  |             } | ||
|  |         }; | ||
|  | 
 | ||
|  |     } // Namespace detail | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * \brief An iterator to the first element of the given vector expression. | ||
|  |      * \tparam ExprT A model of VectorExpression type. | ||
|  |      * \param e A vector expression. | ||
|  |      * \return An iterator to the first element of the given vector expression. | ||
|  |      */ | ||
|  |     template <typename ExprT> | ||
|  |     BOOST_UBLAS_INLINE | ||
|  |     typename ExprT::iterator begin(vector_expression<ExprT>& e) | ||
|  |     { | ||
|  |         return detail::begin_impl<typename ExprT::type_category>::apply(e()); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * \brief A const iterator to the first element of the given vector expression. | ||
|  |      * \tparam ExprT A model of VectorExpression type. | ||
|  |      * \param e A vector expression. | ||
|  |      * \return A const iterator to the first element of the given vector expression. | ||
|  |      */ | ||
|  |     template <typename ExprT> | ||
|  |     BOOST_UBLAS_INLINE | ||
|  |     typename ExprT::const_iterator begin(vector_expression<ExprT> const& e) | ||
|  |     { | ||
|  |         return detail::begin_impl<typename ExprT::type_category>::apply(e()); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * \brief An iterator to the first element of the given matrix expression | ||
|  |      *  according to its orientation. | ||
|  |      * \tparam DimTagT A dimension tag type (e.g., tag::major). | ||
|  |      * \tparam ExprT A model of MatrixExpression type. | ||
|  |      * \param e A matrix expression. | ||
|  |      * \return An iterator to the first element of the given matrix expression | ||
|  |      *  according to its orientation. | ||
|  |      */ | ||
|  |     template <typename TagT, typename ExprT> | ||
|  |     BOOST_UBLAS_INLINE | ||
|  |     typename iterator_type<ExprT,TagT>::type begin(matrix_expression<ExprT>& e) | ||
|  |     { | ||
|  |         return detail::begin_impl<typename ExprT::type_category, TagT, typename ExprT::orientation_category>::apply(e()); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * \brief A const iterator to the first element of the given matrix expression | ||
|  |      *  according to its orientation. | ||
|  |      * \tparam TagT A dimension tag type (e.g., tag::major). | ||
|  |      * \tparam ExprT A model of MatrixExpression type. | ||
|  |      * \param e A matrix expression. | ||
|  |      * \return A const iterator to the first element of the given matrix expression | ||
|  |      *  according to its orientation. | ||
|  |      */ | ||
|  |     template <typename TagT, typename ExprT> | ||
|  |     BOOST_UBLAS_INLINE | ||
|  |     typename const_iterator_type<ExprT,TagT>::type begin(matrix_expression<ExprT> const& e) | ||
|  |     { | ||
|  |         return detail::begin_impl<typename ExprT::type_category, TagT, typename ExprT::orientation_category>::apply(e()); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * \brief An iterator to the first element over the dual dimension of the given | ||
|  |      *  iterator. | ||
|  |      * \tparam IteratorT A model of Iterator type. | ||
|  |      * \param it An iterator. | ||
|  |      * \return An iterator to the first element over the dual dimension of the given | ||
|  |      *  iterator. | ||
|  |      */ | ||
|  |     template <typename IteratorT> | ||
|  |     BOOST_UBLAS_INLINE | ||
|  |     typename IteratorT::dual_iterator_type begin(IteratorT& it) | ||
|  |     { | ||
|  |         return it.begin(); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * \brief A const iterator to the first element over the dual dimension of the | ||
|  |      *  given iterator. | ||
|  |      * \tparam IteratorT A model of Iterator type. | ||
|  |      * \param it An iterator. | ||
|  |      * \return A const iterator to the first element over the dual dimension of the | ||
|  |      *  given iterator. | ||
|  |      */ | ||
|  |     template <typename IteratorT> | ||
|  |     BOOST_UBLAS_INLINE | ||
|  |     typename IteratorT::dual_iterator_type begin(IteratorT const& it) | ||
|  |     { | ||
|  |         return it.begin(); | ||
|  |     } | ||
|  | 
 | ||
|  | }}} // Namespace boost::numeric::ublas | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif // BOOST_NUMERIC_UBLAS_OPERATION_BEGIN_HPP |