| /** |
| * \file size.hpp |
| * |
| * \brief The family of \c size operations. |
| * |
| * Copyright (c) 2009-2010, 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_SIZE_HPP |
| #define BOOST_NUMERIC_UBLAS_OPERATION_SIZE_HPP |
| |
| |
| #include <boost/mpl/has_xxx.hpp> |
| #include <boost/mpl/if.hpp> |
| #include <boost/numeric/ublas/detail/config.hpp> |
| #include <boost/numeric/ublas/expression_types.hpp> |
| #include <boost/numeric/ublas/fwd.hpp> |
| #include <boost/numeric/ublas/tags.hpp> |
| #include <boost/numeric/ublas/traits.hpp> |
| #include <boost/utility/enable_if.hpp> |
| #include <cstddef> |
| |
| |
| namespace boost { namespace numeric { namespace ublas { |
| |
| namespace detail { namespace /*<unnamed>*/ { |
| |
| /// Define a \c has_size_type trait class. |
| BOOST_MPL_HAS_XXX_TRAIT_DEF(size_type) |
| |
| |
| /** |
| * \brief Wrapper type-traits used in \c boost::lazy_enabled_if for getting the |
| * size type (see below). |
| * \tparam VectorT A vector type. |
| */ |
| template <typename VectorT> |
| struct vector_size_type |
| { |
| /// The size type. |
| typedef typename vector_traits<VectorT>::size_type type; |
| }; |
| |
| /** |
| * \brief Wrapper type-traits used in \c boost::lazy_enabled_if for getting the |
| * size type (see below). |
| * \tparam MatrixT A matrix type. |
| */ |
| template <typename MatrixT> |
| struct matrix_size_type |
| { |
| /// The size type. |
| typedef typename matrix_traits<MatrixT>::size_type type; |
| }; |
| |
| |
| /** |
| * \brief Auxiliary class for computing the size of the given dimension for |
| * a container of the given category. |
| * \tparam Dim The dimension number (starting from 1). |
| * \tparam CategoryT The category type (e.g., vector_tag). |
| */ |
| template <std::size_t Dim, typename CategoryT> |
| struct size_by_dim_impl; |
| |
| |
| /** |
| * \brief Auxiliary class for computing the size of the given dimension for |
| * a container of the given category and with the given orientation. |
| * \tparam Dim The dimension number (starting from 1). |
| * \tparam CategoryT The category type (e.g., vector_tag). |
| * \tparam OrientationT The orientation category type (e.g., row_major_tag). |
| */ |
| template <typename TagT, typename CategoryT, typename OrientationT> |
| struct size_by_tag_impl; |
| |
| |
| /** |
| * \brief Specialization of \c size_by_dim_impl for computing the size of a |
| * vector. |
| */ |
| template <> |
| struct size_by_dim_impl<1, vector_tag> |
| { |
| /** |
| * \brief Compute the size of the given vector. |
| * \tparam ExprT A vector expression type. |
| * \pre ExprT must be a model of VectorExpression. |
| */ |
| template <typename ExprT> |
| BOOST_UBLAS_INLINE |
| static typename vector_traits<ExprT>::size_type apply(vector_expression<ExprT> const& ve) |
| { |
| return ve().size(); |
| } |
| }; |
| |
| |
| /** |
| * \brief Specialization of \c size_by_dim_impl for computing the number of |
| * rows of a matrix |
| */ |
| template <> |
| struct size_by_dim_impl<1, matrix_tag> |
| { |
| /** |
| * \brief Compute the number of rows of the given matrix. |
| * \tparam ExprT A matrix expression type. |
| * \pre ExprT must be a model of MatrixExpression. |
| */ |
| template <typename ExprT> |
| BOOST_UBLAS_INLINE |
| static typename matrix_traits<ExprT>::size_type apply(matrix_expression<ExprT> const& me) |
| { |
| return me().size1(); |
| } |
| }; |
| |
| |
| /** |
| * \brief Specialization of \c size_by_dim_impl for computing the number of |
| * columns of a matrix |
| */ |
| template <> |
| struct size_by_dim_impl<2, matrix_tag> |
| { |
| /** |
| * \brief Compute the number of columns of the given matrix. |
| * \tparam ExprT A matrix expression type. |
| * \pre ExprT must be a model of MatrixExpression. |
| */ |
| template <typename ExprT> |
| BOOST_UBLAS_INLINE |
| static typename matrix_traits<ExprT>::size_type apply(matrix_expression<ExprT> const& me) |
| { |
| return me().size2(); |
| } |
| }; |
| |
| |
| /** |
| * \brief Specialization of \c size_by_tag_impl for computing the size of the |
| * major dimension of a row-major oriented matrix. |
| */ |
| template <> |
| struct size_by_tag_impl<tag::major, matrix_tag, row_major_tag> |
| { |
| /** |
| * \brief Compute the number of rows of the given matrix. |
| * \tparam ExprT A matrix expression type. |
| * \pre ExprT must be a model of MatrixExpression. |
| */ |
| template <typename ExprT> |
| BOOST_UBLAS_INLINE |
| static typename matrix_traits<ExprT>::size_type apply(matrix_expression<ExprT> const& me) |
| { |
| return me().size1(); |
| } |
| }; |
| |
| |
| /** |
| * \brief Specialization of \c size_by_tag_impl for computing the size of the |
| * minor dimension of a row-major oriented matrix. |
| */ |
| template <> |
| struct size_by_tag_impl<tag::minor, matrix_tag, row_major_tag> |
| { |
| /** |
| * \brief Compute the number of columns of the given matrix. |
| * \tparam ExprT A matrix expression type. |
| * \pre ExprT must be a model of MatrixExpression. |
| */ |
| template <typename ExprT> |
| BOOST_UBLAS_INLINE |
| static typename matrix_traits<ExprT>::size_type apply(matrix_expression<ExprT> const& me) |
| { |
| return me().size2(); |
| } |
| }; |
| |
| |
| /** |
| * \brief Specialization of \c size_by_tag_impl for computing the size of the |
| * leading dimension of a row-major oriented matrix. |
| */ |
| template <> |
| struct size_by_tag_impl<tag::leading, matrix_tag, row_major_tag> |
| { |
| /** |
| * \brief Compute the number of columns of the given matrix. |
| * \tparam ExprT A matrix expression type. |
| * \pre ExprT must be a model of MatrixExpression. |
| */ |
| template <typename ExprT> |
| BOOST_UBLAS_INLINE |
| static typename matrix_traits<ExprT>::size_type apply(matrix_expression<ExprT> const& me) |
| { |
| return me().size2(); |
| } |
| }; |
| |
| |
| /// \brief Specialization of \c size_by_tag_impl for computing the size of the |
| /// major dimension of a column-major oriented matrix. |
| template <> |
| struct size_by_tag_impl<tag::major, matrix_tag, column_major_tag> |
| { |
| /** |
| * \brief Compute the number of columns of the given matrix. |
| * \tparam ExprT A matrix expression type. |
| * \pre ExprT must be a model of MatrixExpression. |
| */ |
| template <typename ExprT> |
| BOOST_UBLAS_INLINE |
| static typename matrix_traits<ExprT>::size_type apply(matrix_expression<ExprT> const& me) |
| { |
| return me().size2(); |
| } |
| }; |
| |
| |
| /// \brief Specialization of \c size_by_tag_impl for computing the size of the |
| /// minor dimension of a column-major oriented matrix. |
| template <> |
| struct size_by_tag_impl<tag::minor, matrix_tag, column_major_tag> |
| { |
| /** |
| * \brief Compute the number of rows of the given matrix. |
| * \tparam ExprT A matrix expression type. |
| * \pre ExprT must be a model of MatrixExpression. |
| */ |
| template <typename ExprT> |
| BOOST_UBLAS_INLINE |
| static typename matrix_traits<ExprT>::size_type apply(matrix_expression<ExprT> const& me) |
| { |
| return me().size1(); |
| } |
| }; |
| |
| |
| /// \brief Specialization of \c size_by_tag_impl for computing the size of the |
| /// leading dimension of a column-major oriented matrix. |
| template <> |
| struct size_by_tag_impl<tag::leading, matrix_tag, column_major_tag> |
| { |
| /** |
| * \brief Compute the number of rows of the given matrix. |
| * \tparam ExprT A matrix expression type. |
| * \pre ExprT must be a model of MatrixExpression. |
| */ |
| template <typename ExprT> |
| BOOST_UBLAS_INLINE |
| static typename matrix_traits<ExprT>::size_type apply(matrix_expression<ExprT> const& me) |
| { |
| return me().size1(); |
| } |
| }; |
| |
| |
| /// \brief Specialization of \c size_by_tag_impl for computing the size of the |
| /// given dimension of a unknown oriented expression. |
| template <typename TagT, typename CategoryT> |
| struct size_by_tag_impl<TagT, CategoryT, unknown_orientation_tag>: size_by_tag_impl<TagT, CategoryT, row_major_tag> |
| { |
| // Empty |
| }; |
| |
| }} // Namespace detail::<unnamed> |
| |
| |
| /** |
| * \brief Return the number of columns. |
| * \tparam VectorExprT A type which models the vector expression concept. |
| * \param ve A vector expression. |
| * \return The length of the input vector expression. |
| */ |
| template <typename VectorExprT> |
| BOOST_UBLAS_INLINE |
| typename ::boost::lazy_enable_if_c< |
| detail::has_size_type<VectorExprT>::value, |
| detail::vector_size_type<VectorExprT> |
| >::type size(vector_expression<VectorExprT> const& ve) |
| { |
| return ve().size(); |
| } |
| |
| |
| /** |
| * \brief Return the size of the given dimension for the given vector |
| * expression. |
| * \tparam Dim The dimension number (starting from 1). |
| * \tparam VectorExprT A vector expression type. |
| * \param ve A vector expression. |
| * \return The length of the input vector expression. |
| */ |
| template <std::size_t Dim, typename VectorExprT> |
| BOOST_UBLAS_INLINE |
| typename vector_traits<VectorExprT>::size_type size(vector_expression<VectorExprT> const& ve) |
| { |
| return detail::size_by_dim_impl<Dim, vector_tag>::template apply(ve); |
| } |
| |
| |
| /** |
| * \brief Return the size of the given dimension for the given matrix |
| * expression. |
| * \tparam Dim The dimension number (starting from 1). |
| * \tparam MatrixExprT A matrix expression type. |
| * \param e A matrix expression. |
| * \return The size of the input matrix expression associated to the dimension |
| * \a Dim. |
| */ |
| template <std::size_t Dim, typename MatrixExprT> |
| BOOST_UBLAS_INLINE |
| typename matrix_traits<MatrixExprT>::size_type size(matrix_expression<MatrixExprT> const& me) |
| { |
| return detail::size_by_dim_impl<Dim, matrix_tag>::template apply(me); |
| } |
| |
| |
| /** |
| * \brief Return the size of the given dimension tag for the given matrix |
| * expression. |
| * \tparam TagT The dimension tag type (e.g., tag::major). |
| * \tparam MatrixExprT A matrix expression type. |
| * \param e A matrix expression. |
| * \return The size of the input matrix expression associated to the dimension |
| * tag \a TagT. |
| */ |
| template <typename TagT, typename MatrixExprT> |
| BOOST_UBLAS_INLINE |
| typename ::boost::lazy_enable_if_c< |
| detail::has_size_type<MatrixExprT>::value, |
| detail::matrix_size_type<MatrixExprT> |
| >::type size(matrix_expression<MatrixExprT> const& me) |
| { |
| return detail::size_by_tag_impl<TagT, matrix_tag, typename matrix_traits<MatrixExprT>::orientation_category>::template apply(me); |
| } |
| |
| }}} // Namespace boost::numeric::ublas |
| |
| |
| #endif // BOOST_NUMERIC_UBLAS_OPERATION_SIZE_HPP |