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
							 |