/** | |
* -*- 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 |