/** * -*- c++ -*- * * \file size.hpp * * \brief The \c size operation. * * 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 #include #include #include #include #include namespace boost { namespace numeric { namespace ublas { namespace detail { /** * \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 struct size_by_dim_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 BOOST_UBLAS_INLINE static typename vector_traits::size_type apply(vector_expression 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 BOOST_UBLAS_INLINE static typename matrix_traits::size_type apply(matrix_expression 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 BOOST_UBLAS_INLINE static typename matrix_traits::size_type apply(matrix_expression const& me) { return me().size2(); } }; /** * \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 struct size_by_tag_impl; /// \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 { /** * \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 BOOST_UBLAS_INLINE static typename matrix_traits::size_type apply(matrix_expression 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 { /** * \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 BOOST_UBLAS_INLINE static typename matrix_traits::size_type apply(matrix_expression 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 { /** * \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 BOOST_UBLAS_INLINE static typename matrix_traits::size_type apply(matrix_expression 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 { /** * \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 BOOST_UBLAS_INLINE static typename matrix_traits::size_type apply(matrix_expression 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 { /** * \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 BOOST_UBLAS_INLINE static typename matrix_traits::size_type apply(matrix_expression 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 { /** * \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 BOOST_UBLAS_INLINE static typename matrix_traits::size_type apply(matrix_expression const& me) { return me().size1(); } }; } // Namespace detail template typename vector_traits::size_type size(vector_expression const& ve); template typename vector_traits::size_type size(vector_expression const& ve); template typename matrix_traits::size_type size(matrix_expression const& me); template typename matrix_traits::size_type size(matrix_expression const& me); /** * \brief Return the number of columns. * \tparam VectorExprT A type which models the matrix expression concept. * \param m A matrix expression. * \return The number of columns. */ template BOOST_UBLAS_INLINE typename vector_traits::size_type size(vector_expression const& ve) { return ve().size(); } /** * \brief Return the size of the given dimension for the given expression. * \tparam Dim The dimension number (starting from 1). * \tparam VectorExprT An expression type. * \param e An expression. * \return The number of columns. * \return The size associated to the dimension \a Dim. */ template BOOST_UBLAS_INLINE typename vector_traits::size_type size(vector_expression const& ve) { return detail::size_by_dim_impl::template apply(ve); } /** * \brief Return the size of the given dimension for the given expression. * \tparam Dim The dimension number (starting from 1). * \tparam MatrixExprT An expression type. * \param e An expression. * \return The number of columns. * \return The size associated to the dimension \a Dim. */ template BOOST_UBLAS_INLINE typename matrix_traits::size_type size(matrix_expression const& me) { return detail::size_by_dim_impl::template apply(me); } /** * \brief Return the size of the given dimension tag for the given expression. * \tparam TagT The dimension tag type (e.g., tag::major). * \tparam MatrixExprT An expression type. * \param e An expression. * \return The size associated to the dimension tag \a TagT. */ template BOOST_UBLAS_INLINE typename matrix_traits::size_type size(matrix_expression const& me) { return detail::size_by_tag_impl::template apply(me); } }}} // Namespace boost::numeric::ublas #endif // BOOST_NUMERIC_UBLAS_OPERATION_SIZE_HPP