319 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			319 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/**
 | 
						|
 * -*- c++ -*-
 | 
						|
 *
 | 
						|
 * \file end.hpp
 | 
						|
 *
 | 
						|
 * \brief The \c end 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_END_HPP
 | 
						|
#define BOOST_NUMERIC_UBLAS_OPERATION_END_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 end 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 end_impl;
 | 
						|
 | 
						|
 | 
						|
        /// \brief Specialization of \c end_impl for iterating vector expressions.
 | 
						|
        template <>
 | 
						|
        struct end_impl<vector_tag,void,void>
 | 
						|
        {
 | 
						|
            /**
 | 
						|
             * \brief Return an iterator to the last 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.end();
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            /**
 | 
						|
             * \brief Return a const iterator to the last 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.end();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
 | 
						|
        /// \brief Specialization of \c end_impl for iterating matrix expressions with a
 | 
						|
        ///  row-major orientation over the major dimension.
 | 
						|
        template <>
 | 
						|
        struct end_impl<matrix_tag,tag::major,row_major_tag>
 | 
						|
        {
 | 
						|
            /**
 | 
						|
             * \brief Return an iterator to the last 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.end1();
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            /**
 | 
						|
             * \brief Return a const iterator to the last 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.end1();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
 | 
						|
        /// \brief Specialization of \c end_impl for iterating matrix expressions with a
 | 
						|
        ///  column-major orientation over the major dimension.
 | 
						|
        template <>
 | 
						|
        struct end_impl<matrix_tag,tag::major,column_major_tag>
 | 
						|
        {
 | 
						|
            /**
 | 
						|
             * \brief Return an iterator to the last 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.end2();
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            /**
 | 
						|
             * \brief Return a const iterator to the last 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.end2();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
 | 
						|
        /// \brief Specialization of \c end_impl for iterating matrix expressions with a
 | 
						|
        ///  row-major orientation over the minor dimension.
 | 
						|
        template <>
 | 
						|
        struct end_impl<matrix_tag,tag::minor,row_major_tag>
 | 
						|
        {
 | 
						|
            /**
 | 
						|
             * \brief Return an iterator to the last 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.end2();
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            /**
 | 
						|
             * \brief Return a const iterator to the last element of the given
 | 
						|
             *  row-minor matrix expression over the major 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.end2();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
 | 
						|
        /// \brief Specialization of \c end_impl for iterating matrix expressions with a
 | 
						|
        ///  column-major orientation over the minor dimension.
 | 
						|
        template <>
 | 
						|
        struct end_impl<matrix_tag,tag::minor,column_major_tag>
 | 
						|
        {
 | 
						|
            /**
 | 
						|
             * \brief Return an iterator to the last 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.end1();
 | 
						|
            }
 | 
						|
 | 
						|
 | 
						|
            /**
 | 
						|
             * \brief Return a const iterator to the last element of the given
 | 
						|
             *  column-minor matrix expression over the major 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.end1();
 | 
						|
            }
 | 
						|
        };
 | 
						|
 | 
						|
    } // Namespace detail
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * \brief An iterator to the last element of the given vector expression.
 | 
						|
     * \tparam ExprT A model of VectorExpression type.
 | 
						|
     * \param e A vector expression.
 | 
						|
     * \return An iterator to the last element of the given vector expression.
 | 
						|
     */
 | 
						|
    template <typename ExprT>
 | 
						|
    BOOST_UBLAS_INLINE
 | 
						|
    typename ExprT::iterator end(vector_expression<ExprT>& e)
 | 
						|
    {
 | 
						|
        return detail::end_impl<typename ExprT::type_category>::apply(e());
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * \brief A const iterator to the last element of the given vector expression.
 | 
						|
     * \tparam ExprT A model of VectorExpression type.
 | 
						|
     * \param e A vector expression.
 | 
						|
     * \return A const iterator to the last element of the given vector expression.
 | 
						|
     */
 | 
						|
    template <typename ExprT>
 | 
						|
    BOOST_UBLAS_INLINE
 | 
						|
    typename ExprT::const_iterator end(vector_expression<ExprT> const& e)
 | 
						|
    {
 | 
						|
        return detail::end_impl<typename ExprT::type_category>::apply(e());
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * \brief An iterator to the last 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 last element of the given matrix expression
 | 
						|
     *  according to its orientation.
 | 
						|
     */
 | 
						|
    template <typename TagT, typename ExprT>
 | 
						|
    BOOST_UBLAS_INLINE
 | 
						|
    typename iterator_type<ExprT,TagT>::type end(matrix_expression<ExprT>& e)
 | 
						|
    {
 | 
						|
        return detail::end_impl<typename ExprT::type_category, TagT, typename ExprT::orientation_category>::apply(e());
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * \brief A const iterator to the last 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 last 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 end(matrix_expression<ExprT> const& e)
 | 
						|
    {
 | 
						|
        return detail::end_impl<typename ExprT::type_category, TagT, typename ExprT::orientation_category>::apply(e());
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * \brief An iterator to the last 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 last element over the dual dimension of the given
 | 
						|
     *  iterator.
 | 
						|
     */
 | 
						|
    template <typename IteratorT>
 | 
						|
    BOOST_UBLAS_INLINE
 | 
						|
    typename IteratorT::dual_iterator_type end(IteratorT& it)
 | 
						|
    {
 | 
						|
        return it.end();
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * \brief A const iterator to the last 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 last element over the dual dimension of the
 | 
						|
     *  given iterator.
 | 
						|
     */
 | 
						|
    template <typename IteratorT>
 | 
						|
    BOOST_UBLAS_INLINE
 | 
						|
    typename IteratorT::dual_iterator_type end(IteratorT const& it)
 | 
						|
    {
 | 
						|
        return it.end();
 | 
						|
    }
 | 
						|
 | 
						|
}}} // Namespace boost::numeric::ublas
 | 
						|
 | 
						|
 | 
						|
#endif // BOOST_NUMERIC_UBLAS_OPERATION_END_HPP
 |