source: vendor/nemo/current/NEMOGCM/EXTERNAL/XIOS/extern/boost/include/boost/numeric/ublas/operation/begin.hpp @ 44

Last change on this file since 44 was 44, checked in by cholod, 12 years ago

Load NEMO_TMP into vendor/nemo/current.

File size: 11.1 KB
Line 
1/**
2 * -*- c++ -*-
3 *
4 * \file begin.hpp
5 *
6 * \brief The \c begin operation.
7 *
8 * Copyright (c) 2009, Marco Guazzone
9 *
10 * Distributed under the Boost Software License, Version 1.0. (See
11 * accompanying file LICENSE_1_0.txt or copy at
12 * http://www.boost.org/LICENSE_1_0.txt)
13 *
14 * \author Marco Guazzone, marco.guazzone@gmail.com
15 */
16
17#ifndef BOOST_NUMERIC_UBLAS_OPERATION_BEGIN_HPP
18#define BOOST_NUMERIC_UBLAS_OPERATION_BEGIN_HPP
19
20
21#include <boost/numeric/ublas/expression_types.hpp>
22#include <boost/numeric/ublas/fwd.hpp>
23#include <boost/numeric/ublas/traits/const_iterator_type.hpp>
24#include <boost/numeric/ublas/traits/iterator_type.hpp>
25
26
27namespace boost { namespace numeric { namespace ublas {
28
29    namespace detail {
30
31        /**
32         * \brief Auxiliary class for implementing the \c begin operation.
33         * \tparam CategoryT The expression category type (e.g., vector_tag).
34         * \tparam TagT The dimension type tag (e.g., tag::major).
35         * \tparam OrientationT The orientation category type (e.g., row_major_tag).
36         */
37        template <typename CategoryT, typename TagT=void, typename OrientationT=void>
38        struct begin_impl;
39
40
41        /// \brief Specialization of \c begin_impl for iterating vector expressions.
42        template <>
43        struct begin_impl<vector_tag,void,void>
44        {
45            /**
46             * \brief Return an iterator to the first element of the given vector
47             *  expression.
48             * \tparam ExprT A model of VectorExpression type.
49             * \param e A vector expression.
50             * \return An iterator over the given vector expression.
51             */
52            template <typename ExprT>
53            static typename ExprT::iterator apply(ExprT& e)
54            {
55                return e.begin();
56            }
57
58
59            /**
60             * \brief Return a const iterator to the first element of the given vector
61             *  expression.
62             * \tparam ExprT A model of VectorExpression type.
63             * \param e A vector expression.
64             * \return A const iterator to the first element of the given vector
65             *  expression.
66             */
67            template <typename ExprT>
68            static typename ExprT::const_iterator apply(ExprT const& e)
69            {
70                return e.begin();
71            }
72        };
73
74
75        /// \brief Specialization of \c begin_impl for iterating matrix expressions with
76        ///  a row-major orientation over the major dimension.
77        template <>
78        struct begin_impl<matrix_tag,tag::major,row_major_tag>
79        {
80            /**
81             * \brief Return an iterator to the first element of the given row-major
82             *  matrix expression over the major dimension.
83             * \tparam ExprT A model of MatrixExpression type.
84             * \param e A matrix expression.
85             * \return An iterator over the major dimension of the given matrix
86             *  expression.
87             */
88            template <typename ExprT>
89            static typename ExprT::iterator1 apply(ExprT& e)
90            {
91                return e.begin1();
92            }
93
94
95            /**
96             * \brief Return a const iterator to the first element of the given
97             *  row-major matrix expression over the major dimension.
98             * \tparam ExprT A model of MatrixExpression type.
99             * \param e A matrix expression.
100             * \return A const iterator over the major dimension of the given matrix
101             *  expression.
102             */
103            template <typename ExprT>
104            static typename ExprT::const_iterator1 apply(ExprT const& e)
105            {
106                return e.begin1();
107            }
108        };
109
110
111        /// \brief Specialization of \c begin_impl for iterating matrix expressions with
112        ///  a column-major orientation over the major dimension.
113        template <>
114        struct begin_impl<matrix_tag,tag::major,column_major_tag>
115        {
116            /**
117             * \brief Return an iterator to the first element of the given column-major
118             *  matrix expression over the major dimension.
119             * \tparam ExprT A model of MatrixExpression type.
120             * \param e A matrix expression.
121             * \return An iterator over the major dimension of the given matrix
122             *  expression.
123             */
124            template <typename ExprT>
125            static typename ExprT::iterator2 apply(ExprT& e)
126            {
127                return e.begin2();
128            }
129
130
131            /**
132             * \brief Return a const iterator to the first element of the given
133             *  column-major matrix expression over the major dimension.
134             * \tparam ExprT A model of MatrixExpression type.
135             * \param e A matrix expression.
136             * \return A const iterator over the major dimension of the given matrix
137             *  expression.
138             */
139            template <typename ExprT>
140            static typename ExprT::const_iterator2 apply(ExprT const& e)
141            {
142                return e.begin2();
143            }
144        };
145
146
147        /// \brief Specialization of \c begin_impl for iterating matrix expressions with
148        ///  a row-major orientation over the minor dimension.
149        template <>
150        struct begin_impl<matrix_tag,tag::minor,row_major_tag>
151        {
152            /**
153             * \brief Return an iterator to the first element of the given row-major
154             *  matrix expression over the minor dimension.
155             * \tparam ExprT A model of MatrixExpression type.
156             * \param e A matrix expression.
157             * \return An iterator over the minor dimension of the given matrix
158             *  expression.
159             */
160            template <typename ExprT>
161            static typename ExprT::iterator2 apply(ExprT& e)
162            {
163                return e.begin2();
164            }
165
166
167            /**
168             * \brief Return a const iterator to the first element of the given
169             *  row-major matrix expression over the minor dimension.
170             * \tparam ExprT A model of MatrixExpression type.
171             * \param e A matrix expression.
172             * \return A const iterator over the minor dimension of the given matrix
173             *  expression.
174             */
175            template <typename ExprT>
176            static typename ExprT::const_iterator2 apply(ExprT const& e)
177            {
178                return e.begin2();
179            }
180        };
181
182
183
184        /// \brief Specialization of \c begin_impl for iterating matrix expressions with
185        ///  a column-major orientation over the minor dimension.
186        template <>
187        struct begin_impl<matrix_tag,tag::minor,column_major_tag>
188        {
189            /**
190             * \brief Return an iterator to the first element of the given column-major
191             *  matrix expression over the minor dimension.
192             * \tparam ExprT A model of MatrixExpression type.
193             * \param e A matrix expression.
194             * \return An iterator over the minor dimension of the given matrix
195             *  expression.
196             */
197            template <typename ExprT>
198            static typename ExprT::iterator1 apply(ExprT& e)
199            {
200                return e.begin1();
201            }
202
203
204            /**
205             * \brief Return a const iterator to the first element of the given
206             *  column-major matrix expression over the minor dimension.
207             * \tparam ExprT A model of MatrixExpression type.
208             * \param e A matrix expression.
209             * \return A const iterator over the minor dimension of the given matrix
210             *  expression.
211             */
212            template <typename ExprT>
213            static typename ExprT::const_iterator1 apply(ExprT const& e)
214            {
215                return e.begin1();
216            }
217        };
218
219    } // Namespace detail
220
221
222    /**
223     * \brief An iterator to the first element of the given vector expression.
224     * \tparam ExprT A model of VectorExpression type.
225     * \param e A vector expression.
226     * \return An iterator to the first element of the given vector expression.
227     */
228    template <typename ExprT>
229    BOOST_UBLAS_INLINE
230    typename ExprT::iterator begin(vector_expression<ExprT>& e)
231    {
232        return detail::begin_impl<typename ExprT::type_category>::apply(e());
233    }
234
235
236    /**
237     * \brief A const iterator to the first element of the given vector expression.
238     * \tparam ExprT A model of VectorExpression type.
239     * \param e A vector expression.
240     * \return A const iterator to the first element of the given vector expression.
241     */
242    template <typename ExprT>
243    BOOST_UBLAS_INLINE
244    typename ExprT::const_iterator begin(vector_expression<ExprT> const& e)
245    {
246        return detail::begin_impl<typename ExprT::type_category>::apply(e());
247    }
248
249
250    /**
251     * \brief An iterator to the first element of the given matrix expression
252     *  according to its orientation.
253     * \tparam DimTagT A dimension tag type (e.g., tag::major).
254     * \tparam ExprT A model of MatrixExpression type.
255     * \param e A matrix expression.
256     * \return An iterator to the first element of the given matrix expression
257     *  according to its orientation.
258     */
259    template <typename TagT, typename ExprT>
260    BOOST_UBLAS_INLINE
261    typename iterator_type<ExprT,TagT>::type begin(matrix_expression<ExprT>& e)
262    {
263        return detail::begin_impl<typename ExprT::type_category, TagT, typename ExprT::orientation_category>::apply(e());
264    }
265
266
267    /**
268     * \brief A const iterator to the first element of the given matrix expression
269     *  according to its orientation.
270     * \tparam TagT A dimension tag type (e.g., tag::major).
271     * \tparam ExprT A model of MatrixExpression type.
272     * \param e A matrix expression.
273     * \return A const iterator to the first element of the given matrix expression
274     *  according to its orientation.
275     */
276    template <typename TagT, typename ExprT>
277    BOOST_UBLAS_INLINE
278    typename const_iterator_type<ExprT,TagT>::type begin(matrix_expression<ExprT> const& e)
279    {
280        return detail::begin_impl<typename ExprT::type_category, TagT, typename ExprT::orientation_category>::apply(e());
281    }
282
283
284    /**
285     * \brief An iterator to the first element over the dual dimension of the given
286     *  iterator.
287     * \tparam IteratorT A model of Iterator type.
288     * \param it An iterator.
289     * \return An iterator to the first element over the dual dimension of the given
290     *  iterator.
291     */
292    template <typename IteratorT>
293    BOOST_UBLAS_INLINE
294    typename IteratorT::dual_iterator_type begin(IteratorT& it)
295    {
296        return it.begin();
297    }
298
299
300    /**
301     * \brief A const iterator to the first element over the dual dimension of the
302     *  given iterator.
303     * \tparam IteratorT A model of Iterator type.
304     * \param it An iterator.
305     * \return A const iterator to the first element over the dual dimension of the
306     *  given iterator.
307     */
308    template <typename IteratorT>
309    BOOST_UBLAS_INLINE
310    typename IteratorT::dual_iterator_type begin(IteratorT const& it)
311    {
312        return it.begin();
313    }
314
315}}} // Namespace boost::numeric::ublas
316
317
318#endif // BOOST_NUMERIC_UBLAS_OPERATION_BEGIN_HPP
Note: See TracBrowser for help on using the repository browser.