Chris@16: // Chris@16: // Copyright (c) 2000-2002 Chris@16: // Joerg Walter, Mathias Koch Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // The authors gratefully acknowledge the support of Chris@16: // GeNeSys mbH & Co. KG in producing this work. Chris@16: // Chris@16: Chris@16: #ifndef _BOOST_UBLAS_CONCEPTS_ Chris@16: #define _BOOST_UBLAS_CONCEPTS_ Chris@16: Chris@16: #include Chris@16: Chris@16: // Concept checks based on ideas of Jeremy Siek Chris@16: Chris@16: namespace boost { namespace numeric { namespace ublas { Chris@16: Chris@16: Chris@16: template Chris@16: struct Indexed1DIteratorConcept { Chris@16: typedef I iterator_type; Chris@16: Chris@16: void constraints () { Chris@16: iterator_type it = iterator_type (); Chris@16: // Index Chris@16: it.index (); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct IndexedBidirectional1DIteratorConcept { Chris@16: typedef I iterator_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< BidirectionalIteratorConcept >(); Chris@16: function_requires< Indexed1DIteratorConcept >(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Mutable_IndexedBidirectional1DIteratorConcept { Chris@16: typedef I iterator_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< Mutable_BidirectionalIteratorConcept >(); Chris@16: function_requires< Indexed1DIteratorConcept >(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct IndexedRandomAccess1DIteratorConcept { Chris@16: typedef I iterator_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< RandomAccessIteratorConcept >(); Chris@16: function_requires< Indexed1DIteratorConcept >(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Mutable_IndexedRandomAccess1DIteratorConcept { Chris@16: typedef I iterator_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< Mutable_RandomAccessIteratorConcept >(); Chris@16: function_requires< Indexed1DIteratorConcept >(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Indexed2DIteratorConcept { Chris@16: typedef I iterator_type; Chris@16: typedef typename I::dual_iterator_type dual_iterator_type; Chris@16: typedef typename I::dual_reverse_iterator_type dual_reverse_iterator_type; Chris@16: Chris@16: void constraints () { Chris@16: iterator_type it = iterator_type (); Chris@16: // Indices Chris@16: it.index1 (); Chris@16: it.index2 (); Chris@16: // Iterator begin/end Chris@16: dual_iterator_type it_begin (it.begin ()); Chris@16: dual_iterator_type it_end (it.end ()); Chris@16: // Reverse iterator begin/end Chris@16: dual_reverse_iterator_type it_rbegin (it.rbegin ()); Chris@16: dual_reverse_iterator_type it_rend (it.rend ()); Chris@16: ignore_unused_variable_warning (it_begin); Chris@16: ignore_unused_variable_warning (it_end); Chris@16: ignore_unused_variable_warning (it_rbegin); Chris@16: ignore_unused_variable_warning (it_rend); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct IndexedBidirectional2DIteratorConcept { Chris@16: typedef I1 subiterator1_type; Chris@16: typedef I2 subiterator2_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< BidirectionalIteratorConcept >(); Chris@16: function_requires< BidirectionalIteratorConcept >(); Chris@16: function_requires< Indexed2DIteratorConcept >(); Chris@16: function_requires< Indexed2DIteratorConcept >(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Mutable_IndexedBidirectional2DIteratorConcept { Chris@16: typedef I1 subiterator1_type; Chris@16: typedef I2 subiterator2_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< Mutable_BidirectionalIteratorConcept >(); Chris@16: function_requires< Mutable_BidirectionalIteratorConcept >(); Chris@16: function_requires< Indexed2DIteratorConcept >(); Chris@16: function_requires< Indexed2DIteratorConcept >(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct IndexedRandomAccess2DIteratorConcept { Chris@16: typedef I1 subiterator1_type; Chris@16: typedef I2 subiterator2_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< RandomAccessIteratorConcept >(); Chris@16: function_requires< RandomAccessIteratorConcept >(); Chris@16: function_requires< Indexed2DIteratorConcept >(); Chris@16: function_requires< Indexed2DIteratorConcept >(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Mutable_IndexedRandomAccess2DIteratorConcept { Chris@16: typedef I1 subiterator1_type; Chris@16: typedef I2 subiterator2_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< Mutable_RandomAccessIteratorConcept >(); Chris@16: function_requires< Mutable_RandomAccessIteratorConcept >(); Chris@16: function_requires< Indexed2DIteratorConcept >(); Chris@16: function_requires< Indexed2DIteratorConcept >(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct StorageArrayConcept { Chris@16: typedef C container_type; Chris@16: typedef typename C::size_type size_type; Chris@16: typedef typename C::value_type value_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< RandomAccessContainerConcept >(); Chris@16: size_type n (0); Chris@16: // Sizing constructor Chris@16: container_type c = container_type (n); Chris@16: // Initialised sizing constructor Chris@16: container_type (n, value_type (5)); Chris@16: ignore_unused_variable_warning (c); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Mutable_StorageArrayConcept { Chris@16: typedef C container_type; Chris@16: typedef typename C::size_type size_type; Chris@16: typedef typename C::value_type value_type; Chris@16: typedef typename C::iterator iterator_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< Mutable_RandomAccessContainerConcept > (); Chris@16: size_type n (0); Chris@16: // Sizing constructor Chris@16: container_type c = container_type (n); Chris@16: // Initialised sizing constructor Chris@16: c = container_type (n, value_type (3)); Chris@16: // Resize Chris@16: c.resize (n, value_type (5)); Chris@16: // Resize - none preserving Chris@16: c.resize (n); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct StorageSparseConcept { Chris@16: typedef C container_type; Chris@16: typedef typename C::size_type size_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< ReversibleContainerConcept > (); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Mutable_StorageSparseConcept { Chris@16: typedef C container_type; Chris@16: typedef typename C::size_type size_type; Chris@16: typedef typename C::value_type value_type; Chris@16: typedef typename C::iterator iterator_type; Chris@16: Chris@16: void constraints () { Chris@16: // NOTE - Not Mutable_ReversibleContainerConcept Chris@16: function_requires< ReversibleContainerConcept >(); Chris@16: container_type c = container_type (); Chris@16: value_type t = value_type (); Chris@16: iterator_type it = iterator_type (), it1 = iterator_type (), it2 = iterator_type (); Chris@16: // Insert Chris@16: c.insert (it, t); Chris@16: // Erase Chris@16: c.erase (it); Chris@16: // Range erase Chris@16: c.erase (it1, it2); Chris@16: // Clear Chris@16: c.clear (); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct IndexSetConcept { Chris@16: typedef G generator_type; Chris@16: typedef typename G::size_type size_type; Chris@16: typedef typename G::value_type value_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< AssignableConcept >(); Chris@16: function_requires< ReversibleContainerConcept >(); Chris@16: generator_type g = generator_type (); Chris@16: size_type n (0); Chris@16: value_type t; Chris@16: // Element access Chris@16: t = g (n); Chris@16: ignore_unused_variable_warning (t); Chris@16: } Chris@16: }; Chris@16: Chris@16: /** \brief Scalar expression concept. Chris@16: * Chris@16: * requirements Chris@16: * \li \c SE::value_type is the type of the scalar expression Chris@16: * \li \c SE must be convertable to \c SE::value_type Chris@16: * \li the constant \c SE::complexity must exist Chris@16: * Chris@16: * \param SE the type of the scalar expression Chris@16: */ Chris@16: template Chris@16: struct ScalarExpressionConcept { Chris@16: typedef SE scalar_expression_type; Chris@16: typedef typename SE::value_type value_type; Chris@16: Chris@16: static const unsigned complexity = SE::complexity; Chris@16: Chris@16: void constraints () { Chris@16: scalar_expression_type *sp; Chris@16: scalar_expression_type s = *sp; Chris@16: value_type t; Chris@16: // Conversion Chris@16: t = s; Chris@16: ignore_unused_variable_warning (t); Chris@16: } Chris@16: }; Chris@16: Chris@16: /** \brief Vector expression concept. Chris@16: * Chris@16: * requirements Chris@16: * \li \c VE::value_type is the type of the elements Chris@16: * \li \c VE::const_reference The return type when accessing an element of a constant vector Chris@16: * expression. Must be convertable to a \c value_type. Chris@16: * \li \c VE::size_type is the (unsigned) type of the indices Chris@16: * \li \c VE::difference_type is the (signed) type of distances between indices Chris@16: * \li \c VE::category Chris@16: * Chris@16: * \li the constant \c SE::complexity must exist Chris@16: * Chris@16: * \param SE the type of the scalar expression Chris@16: */ Chris@16: template Chris@16: struct VectorExpressionConcept { Chris@16: typedef VE vector_expression_type; Chris@16: typedef typename VE::type_category type_category; Chris@16: typedef typename VE::size_type size_type; Chris@16: typedef typename VE::difference_type difference_type; Chris@16: typedef typename VE::value_type value_type; Chris@16: typedef typename VE::const_reference const_reference; Chris@16: typedef typename VE::const_iterator const_iterator_type; Chris@16: typedef typename VE::const_reverse_iterator const_reverse_iterator_type; Chris@16: Chris@16: void constraints () { Chris@16: vector_expression_type *vp; Chris@16: const vector_expression_type *cvp; Chris@16: vector_expression_type v = *vp; Chris@16: const vector_expression_type cv = *cvp; Chris@16: size_type n (0), i (0); Chris@16: value_type t; Chris@16: // Find (internal?) Chris@16: const_iterator_type cit (v.find (i)); Chris@16: // Beginning of range Chris@16: const_iterator_type cit_begin (v.begin ()); Chris@16: // End of range Chris@16: const_iterator_type cit_end (v.end ()); Chris@16: // Size Chris@16: n = v.size (); Chris@16: // Beginning of reverse range Chris@16: const_reverse_iterator_type crit_begin (cv.rbegin ()); Chris@16: // End of reverse range Chris@16: const_reverse_iterator_type crit_end (cv.rend ()); Chris@16: // Element access Chris@16: t = v (i); Chris@16: ignore_unused_variable_warning (n); Chris@16: ignore_unused_variable_warning (cit); Chris@16: ignore_unused_variable_warning (cit_begin); Chris@16: ignore_unused_variable_warning (cit_end); Chris@16: ignore_unused_variable_warning (crit_begin); Chris@16: ignore_unused_variable_warning (crit_end); Chris@16: ignore_unused_variable_warning (t); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Mutable_VectorExpressionConcept { Chris@16: typedef VE vector_expression_type; Chris@16: typedef typename VE::size_type size_type; Chris@16: typedef typename VE::value_type value_type; Chris@16: typedef typename VE::iterator iterator_type; Chris@16: typedef typename VE::reverse_iterator reverse_iterator_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< AssignableConcept >(); Chris@16: function_requires< VectorExpressionConcept >(); Chris@16: vector_expression_type *vp; Chris@16: vector_expression_type v = *vp, v1 = *vp, v2 = *vp; Chris@16: size_type i (0); Chris@16: value_type t = value_type (); Chris@16: // Find (internal?) Chris@16: iterator_type it (v.find (i)); Chris@16: // Beginning of range Chris@16: iterator_type it_begin (v.begin ()); Chris@16: // End of range Chris@16: iterator_type it_end (v.end ()); Chris@16: // Swap Chris@16: v1.swap (v2); Chris@16: // Beginning of reverse range Chris@16: reverse_iterator_type rit_begin (v.rbegin ()); Chris@16: // End of reverse range Chris@16: reverse_iterator_type rit_end (v.rend ()); Chris@16: // Assignments Chris@16: v2 = v1; Chris@16: v2.assign (v1); Chris@16: v2 += v1; Chris@16: v2.plus_assign (v1); Chris@16: v2 -= v1; Chris@16: v2.minus_assign (v1); Chris@16: v *= t; Chris@16: ignore_unused_variable_warning (it); Chris@16: ignore_unused_variable_warning (it_begin); Chris@16: ignore_unused_variable_warning (it_end); Chris@16: ignore_unused_variable_warning (rit_begin); Chris@16: ignore_unused_variable_warning (rit_end); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct MatrixExpressionConcept { Chris@16: typedef ME matrix_expression_type; Chris@16: typedef typename ME::type_category type_category; Chris@16: typedef typename ME::size_type size_type; Chris@16: typedef typename ME::value_type value_type; Chris@16: typedef typename ME::const_iterator1 const_subiterator1_type; Chris@16: typedef typename ME::const_iterator2 const_subiterator2_type; Chris@16: typedef typename ME::const_reverse_iterator1 const_reverse_subiterator1_type; Chris@16: typedef typename ME::const_reverse_iterator2 const_reverse_subiterator2_type; Chris@16: Chris@16: void constraints () { Chris@16: matrix_expression_type *mp; Chris@16: const matrix_expression_type *cmp; Chris@16: matrix_expression_type m = *mp; Chris@16: const matrix_expression_type cm = *cmp; Chris@16: size_type n (0), i (0), j (0); Chris@16: value_type t; Chris@16: // Find (internal?) Chris@16: const_subiterator1_type cit1 (m.find1 (0, i, j)); Chris@16: const_subiterator2_type cit2 (m.find2 (0, i, j)); Chris@16: // Beginning of range Chris@16: const_subiterator1_type cit1_begin (m.begin1 ()); Chris@16: const_subiterator2_type cit2_begin (m.begin2 ()); Chris@16: // End of range Chris@16: const_subiterator1_type cit1_end (m.end1 ()); Chris@16: const_subiterator2_type cit2_end (m.end2 ()); Chris@16: // Size Chris@16: n = m.size1 (); Chris@16: n = m.size2 (); Chris@16: // Beginning of reverse range Chris@16: const_reverse_subiterator1_type crit1_begin (cm.rbegin1 ()); Chris@16: const_reverse_subiterator2_type crit2_begin (cm.rbegin2 ()); Chris@16: // End of reverse range Chris@16: const_reverse_subiterator1_type crit1_end (cm.rend1 ()); Chris@16: const_reverse_subiterator2_type crit2_end (cm.rend2 ()); Chris@16: // Element access Chris@16: t = m (i, j); Chris@16: ignore_unused_variable_warning (n); Chris@16: ignore_unused_variable_warning (cit1); Chris@16: ignore_unused_variable_warning (cit2); Chris@16: ignore_unused_variable_warning (cit1_begin); Chris@16: ignore_unused_variable_warning (cit2_begin); Chris@16: ignore_unused_variable_warning (cit1_end); Chris@16: ignore_unused_variable_warning (cit2_end); Chris@16: ignore_unused_variable_warning (crit1_begin); Chris@16: ignore_unused_variable_warning (crit2_begin); Chris@16: ignore_unused_variable_warning (crit1_end); Chris@16: ignore_unused_variable_warning (crit2_end); Chris@16: ignore_unused_variable_warning (t); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Mutable_MatrixExpressionConcept { Chris@16: typedef ME matrix_expression_type; Chris@16: typedef typename ME::size_type size_type; Chris@16: typedef typename ME::value_type value_type; Chris@16: typedef typename ME::iterator1 subiterator1_type; Chris@16: typedef typename ME::iterator2 subiterator2_type; Chris@16: typedef typename ME::reverse_iterator1 reverse_subiterator1_type; Chris@16: typedef typename ME::reverse_iterator2 reverse_subiterator2_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< AssignableConcept >(); Chris@16: function_requires< MatrixExpressionConcept >(); Chris@16: matrix_expression_type *mp; Chris@16: matrix_expression_type m = *mp, m1 = *mp, m2 = *mp; Chris@16: size_type i (0), j (0); Chris@16: value_type t = value_type (); Chris@16: // Find (internal?) Chris@16: subiterator1_type it1 (m.find1 (0, i, j)); Chris@16: subiterator2_type it2 (m.find2 (0, i, j)); Chris@16: // Beginning of range Chris@16: subiterator1_type it1_begin (m.begin1 ()); Chris@16: subiterator2_type it2_begin (m.begin2 ()); Chris@16: // End of range Chris@16: subiterator1_type it1_end (m.end1 ()); Chris@16: subiterator2_type it2_end (m.end2 ()); Chris@16: // Swap Chris@16: m1.swap (m2); Chris@16: // Beginning of reverse range Chris@16: reverse_subiterator1_type rit1_begin (m.rbegin1 ()); Chris@16: reverse_subiterator2_type rit2_begin (m.rbegin2 ()); Chris@16: // End of reverse range Chris@16: reverse_subiterator1_type rit1_end (m.rend1 ()); Chris@16: reverse_subiterator2_type rit2_end (m.rend2 ()); Chris@16: // Assignments Chris@16: m2 = m1; Chris@16: m2.assign (m1); Chris@16: m2 += m1; Chris@16: m2.plus_assign (m1); Chris@16: m2 -= m1; Chris@16: m2.minus_assign (m1); Chris@16: m *= t; Chris@16: ignore_unused_variable_warning (it1); Chris@16: ignore_unused_variable_warning (it2); Chris@16: ignore_unused_variable_warning (it1_begin); Chris@16: ignore_unused_variable_warning (it2_begin); Chris@16: ignore_unused_variable_warning (it1_end); Chris@16: ignore_unused_variable_warning (it2_end); Chris@16: ignore_unused_variable_warning (rit1_begin); Chris@16: ignore_unused_variable_warning (rit2_begin); Chris@16: ignore_unused_variable_warning (rit1_end); Chris@16: ignore_unused_variable_warning (rit2_end); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct VectorConcept { Chris@16: typedef V vector_type; Chris@16: typedef typename V::size_type size_type; Chris@16: typedef typename V::value_type value_type; Chris@16: typedef const value_type *const_pointer; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< VectorExpressionConcept >(); Chris@16: size_type n (0); Chris@16: size_type i (0); Chris@16: // Sizing constructor Chris@16: vector_type v (n); Chris@16: // Element support Chris@16: const_pointer p = v.find_element (i); Chris@16: Chris@16: ignore_unused_variable_warning (p); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Mutable_VectorConcept { Chris@16: typedef V vector_type; Chris@16: typedef typename V::size_type size_type; Chris@16: typedef typename V::value_type value_type; Chris@16: typedef value_type *pointer; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< VectorConcept >(); Chris@16: function_requires< DefaultConstructible >(); Chris@16: function_requires< Mutable_VectorExpressionConcept >(); Chris@16: size_type n (0); Chris@16: value_type t = value_type (); Chris@16: size_type i (0); Chris@16: vector_type v; Chris@16: // Element support Chris@16: pointer p = v.find_element (i); Chris@16: // Element assignment Chris@16: value_type r = v.insert_element (i, t); Chris@16: v.insert_element (i, t) = r; Chris@16: // Zeroing Chris@16: v.clear (); Chris@16: // Resize Chris@16: v.resize (n); Chris@16: Chris@16: ignore_unused_variable_warning (p); Chris@16: ignore_unused_variable_warning (r); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct SparseVectorConcept { Chris@16: typedef V vector_type; Chris@16: typedef typename V::size_type size_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< VectorConcept >(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Mutable_SparseVectorConcept { Chris@16: typedef V vector_type; Chris@16: typedef typename V::size_type size_type; Chris@16: typedef typename V::value_type value_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< SparseVectorConcept >(); Chris@16: function_requires< Mutable_VectorConcept >(); Chris@16: size_type i (0); Chris@16: vector_type v; Chris@16: // Element erasure Chris@16: v.erase_element (i); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct MatrixConcept { Chris@16: typedef M matrix_type; Chris@16: typedef typename M::size_type size_type; Chris@16: typedef typename M::value_type value_type; Chris@16: typedef const value_type *const_pointer; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< MatrixExpressionConcept >(); Chris@16: size_type n (0); Chris@16: size_type i (0), j (0); Chris@16: // Sizing constructor Chris@16: matrix_type m (n, n); Chris@16: // Element support Chris@16: #ifndef SKIP_BAD Chris@16: const_pointer p = m.find_element (i, j); Chris@16: #else Chris@16: const_pointer p; Chris@16: ignore_unused_variable_warning (i); Chris@16: ignore_unused_variable_warning (j); Chris@16: #endif Chris@16: ignore_unused_variable_warning (p); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Mutable_MatrixConcept { Chris@16: typedef M matrix_type; Chris@16: typedef typename M::size_type size_type; Chris@16: typedef typename M::value_type value_type; Chris@16: typedef value_type *pointer; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< MatrixConcept >(); Chris@16: function_requires< DefaultConstructible >(); Chris@16: function_requires< Mutable_MatrixExpressionConcept >(); Chris@16: size_type n (0); Chris@16: value_type t = value_type (); Chris@16: size_type i (0), j (0); Chris@16: matrix_type m; Chris@16: // Element support Chris@16: #ifndef SKIP_BAD Chris@16: pointer p = m.find_element (i, j); Chris@16: ignore_unused_variable_warning (i); Chris@16: ignore_unused_variable_warning (j); Chris@16: #else Chris@16: pointer p; Chris@16: #endif Chris@16: // Element assigment Chris@16: value_type r = m.insert_element (i, j, t); Chris@16: m.insert_element (i, j, t) = r; Chris@16: // Zeroing Chris@16: m.clear (); Chris@16: // Resize Chris@16: m.resize (n, n); Chris@16: m.resize (n, n, false); Chris@16: Chris@16: ignore_unused_variable_warning (p); Chris@16: ignore_unused_variable_warning (r); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct SparseMatrixConcept { Chris@16: typedef M matrix_type; Chris@16: typedef typename M::size_type size_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< MatrixConcept >(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Mutable_SparseMatrixConcept { Chris@16: typedef M matrix_type; Chris@16: typedef typename M::size_type size_type; Chris@16: typedef typename M::value_type value_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< SparseMatrixConcept >(); Chris@16: function_requires< Mutable_MatrixConcept >(); Chris@16: size_type i (0), j (0); Chris@16: matrix_type m; Chris@16: // Elemnent erasure Chris@16: m.erase_element (i, j); Chris@16: } Chris@16: }; Chris@16: Chris@16: /** introduce anonymous namespace to make following functions Chris@16: * local to the current compilation unit. Chris@16: */ Chris@16: namespace { Chris@16: Chris@101: // Replaced the ZeroElement and OneElement functions with the templated versions Chris@101: // because the former where giving warnings with clang Chris@16: template Chris@16: T Chris@101: ZeroElement (T) { Chris@101: return T(0.0); Chris@16: } Chris@101: Chris@101: template Chris@101: vector Chris@101: ZeroElement (vector) { Chris@101: return zero_vector (); Chris@16: } Chris@101: Chris@101: template Chris@101: matrix Chris@101: ZeroElement (matrix) { Chris@101: return zero_matrix (); Chris@16: } Chris@16: Chris@16: template Chris@16: T Chris@101: OneElement (T) { Chris@101: return T(0.0); Chris@16: } Chris@101: Chris@101: template Chris@101: vector Chris@101: OneElement (vector) { Chris@101: return zero_vector (); Chris@16: } Chris@101: Chris@101: template Chris@101: matrix Chris@101: OneElement (matrix) { Chris@101: return identity_matrix (); Chris@16: } Chris@101: Chris@101: // template<> Chris@101: // float Chris@101: // ZeroElement (float) { Chris@101: // return 0.f; Chris@101: // } Chris@101: // template<> Chris@101: // double Chris@101: // ZeroElement (double) { Chris@101: // return 0.; Chris@101: // } Chris@101: // template<> Chris@101: // vector Chris@101: // ZeroElement (vector) { Chris@101: // return zero_vector (); Chris@101: // } Chris@101: // template<> Chris@101: // vector Chris@101: // ZeroElement (vector) { Chris@101: // return zero_vector (); Chris@101: // } Chris@101: // template<> Chris@101: // matrix Chris@101: // ZeroElement (matrix) { Chris@101: // return zero_matrix (); Chris@101: // } Chris@101: // template<> Chris@101: // matrix Chris@101: // ZeroElement (matrix) { Chris@101: // return zero_matrix (); Chris@101: // } Chris@101: // template<> Chris@101: // std::complex Chris@101: // ZeroElement (std::complex) { Chris@101: // return std::complex (0.f); Chris@101: // } Chris@101: // template<> Chris@101: // std::complex Chris@101: // ZeroElement (std::complex) { Chris@101: // return std::complex (0.); Chris@101: // } Chris@101: // template<> Chris@101: // vector > Chris@101: // ZeroElement (vector >) { Chris@101: // return zero_vector > (); Chris@101: // } Chris@101: // template<> Chris@101: // vector > Chris@101: // ZeroElement (vector >) { Chris@101: // return zero_vector > (); Chris@101: // } Chris@101: // template<> Chris@101: // matrix > Chris@101: // ZeroElement (matrix >) { Chris@101: // return zero_matrix > (); Chris@101: // } Chris@101: // template<> Chris@101: // matrix > Chris@101: // ZeroElement (matrix >) { Chris@101: // return zero_matrix > (); Chris@101: // } Chris@101: Chris@101: // template Chris@101: // T Chris@101: // OneElement (T); Chris@101: // template<> Chris@101: // float Chris@101: // OneElement (float) { Chris@101: // return 1.f; Chris@101: // } Chris@101: // template<> Chris@101: // double Chris@101: // OneElement (double) { Chris@101: // return 1.; Chris@101: // } Chris@101: // template<> Chris@101: // matrix Chris@101: // OneElement (matrix) { Chris@101: // return identity_matrix (); Chris@101: // } Chris@101: // template<> Chris@101: // matrix Chris@101: // OneElement (matrix) { Chris@101: // return identity_matrix (); Chris@101: // } Chris@101: // template<> Chris@101: // std::complex Chris@101: // OneElement (std::complex) { Chris@101: // return std::complex (1.f); Chris@101: // } Chris@101: // template<> Chris@101: // std::complex Chris@101: // OneElement (std::complex) { Chris@101: // return std::complex (1.); Chris@101: // } Chris@101: // template<> Chris@101: // matrix > Chris@101: // OneElement (matrix >) { Chris@101: // return identity_matrix > (); Chris@101: // } Chris@101: // template<> Chris@101: // matrix > Chris@101: // OneElement (matrix >) { Chris@101: // return identity_matrix > (); Chris@101: // } Chris@16: Chris@16: template Chris@16: bool Chris@16: operator == (const vector_expression &e1, const vector_expression &e2) { Chris@16: typedef typename promote_traits::promote_type value_type; Chris@16: typedef typename type_traits::real_type real_type; Chris@16: return norm_inf (e1 - e2) == real_type/*zero*/(); Chris@16: } Chris@16: template Chris@16: bool Chris@16: operator == (const matrix_expression &e1, const matrix_expression &e2) { Chris@16: typedef typename promote_traits::promote_type value_type; Chris@16: typedef typename type_traits::real_type real_type; Chris@16: return norm_inf (e1 - e2) == real_type/*zero*/(); Chris@16: } Chris@16: Chris@16: template Chris@16: struct AdditiveAbelianGroupConcept { Chris@16: typedef T value_type; Chris@16: Chris@16: void constraints () { Chris@16: bool r; Chris@16: value_type a = value_type (), b = value_type (), c = value_type (); Chris@16: r = (a + b) + c == a + (b + c); Chris@16: r = ZeroElement (value_type ()) + a == a; Chris@16: r = a + ZeroElement (value_type ()) == a; Chris@16: r = a + (- a) == ZeroElement (value_type ()); Chris@16: r = (- a) + a == ZeroElement (value_type ()); Chris@16: r = a + b == b + a; Chris@16: ignore_unused_variable_warning (r); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct MultiplicativeAbelianGroupConcept { Chris@16: typedef T value_type; Chris@16: Chris@16: void constraints () { Chris@16: bool r; Chris@16: value_type a = value_type (), b = value_type (), c = value_type (); Chris@16: r = (a * b) * c == a * (b * c); Chris@16: r = OneElement (value_type ()) * a == a; Chris@16: r = a * OneElement (value_type ()) == a; Chris@16: r = a * (OneElement (value_type ()) / a) == a; Chris@16: r = (OneElement (value_type ()) / a) * a == a; Chris@16: r = a * b == b * a; Chris@16: ignore_unused_variable_warning (r); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct RingWithIdentityConcept { Chris@16: typedef T value_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< AdditiveAbelianGroupConcept >(); Chris@16: bool r; Chris@16: value_type a = value_type (), b = value_type (), c = value_type (); Chris@16: r = (a * b) * c == a * (b * c); Chris@16: r = (a + b) * c == a * c + b * c; Chris@16: r = OneElement (value_type ()) * a == a; Chris@16: r = a * OneElement (value_type ()) == a; Chris@16: ignore_unused_variable_warning (r); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct Prod_RingWithIdentityConcept { Chris@16: typedef T value_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< AdditiveAbelianGroupConcept >(); Chris@16: bool r; Chris@16: value_type a = value_type (), b = value_type (), c = value_type (); Chris@16: r = prod (T (prod (a, b)), c) == prod (a, T (prod (b, c))); Chris@16: r = prod (a + b, c) == prod (a, c) + prod (b, c); Chris@16: r = prod (OneElement (value_type ()), a) == a; Chris@16: r = prod (a, OneElement (value_type ())) == a; Chris@16: ignore_unused_variable_warning (r); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct CommutativeRingWithIdentityConcept { Chris@16: typedef T value_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< RingWithIdentityConcept >(); Chris@16: bool r; Chris@16: value_type a = value_type (), b = value_type (); Chris@16: r = a * b == b * a; Chris@16: ignore_unused_variable_warning (r); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct FieldConcept { Chris@16: typedef T value_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< CommutativeRingWithIdentityConcept >(); Chris@16: bool r; Chris@16: value_type a = value_type (); Chris@16: r = a == ZeroElement (value_type ()) || a * (OneElement (value_type ()) / a) == a; Chris@16: r = a == ZeroElement (value_type ()) || (OneElement (value_type ()) / a) * a == a; Chris@16: ignore_unused_variable_warning (r); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct VectorSpaceConcept { Chris@16: typedef T value_type; Chris@16: typedef V vector_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< FieldConcept >(); Chris@16: function_requires< AdditiveAbelianGroupConcept >(); Chris@16: bool r; Chris@16: value_type alpha = value_type (), beta = value_type (); Chris@16: vector_type a = vector_type (), b = vector_type (); Chris@16: r = alpha * (a + b) == alpha * a + alpha * b; Chris@16: r = (alpha + beta) * a == alpha * a + beta * a; Chris@16: r = (alpha * beta) * a == alpha * (beta * a); Chris@16: r = OneElement (value_type ()) * a == a; Chris@16: ignore_unused_variable_warning (r); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct LinearOperatorConcept { Chris@16: typedef T value_type; Chris@16: typedef V vector_type; Chris@16: typedef M matrix_type; Chris@16: Chris@16: void constraints () { Chris@16: function_requires< VectorSpaceConcept >(); Chris@16: bool r; Chris@16: value_type alpha = value_type (), beta = value_type (); Chris@16: vector_type a = vector_type (), b = vector_type (); Chris@16: matrix_type A = matrix_type (); Chris@16: r = prod (A, alpha * a + beta * b) == alpha * prod (A, a) + beta * prod (A, b); Chris@16: ignore_unused_variable_warning (r); Chris@16: } Chris@16: }; Chris@16: Chris@101: inline void concept_checks () { Chris@16: Chris@16: // Allow tests to be group to keep down compiler storage requirement Chris@16: #ifdef INTERAL Chris@16: #define INTERNAL_STORAGE Chris@16: #define INTERNAL_VECTOR Chris@16: #define INTERNAL_MATRIX Chris@16: #define INTERNAL_SPECIAL Chris@16: #define INTERNAL_SPARSE Chris@16: #define INTERNAL_EXPRESSION Chris@16: #endif Chris@16: Chris@16: // TODO enable this for development Chris@16: // #define VIEW_CONCEPTS Chris@16: Chris@16: // Element value type for tests Chris@16: typedef float T; Chris@16: Chris@16: // Storage Array Chris@16: #if defined (INTERNAL_STORAGE) || defined (INTERNAL_STORAGE_DENSE) Chris@16: { Chris@16: typedef std::vector container_model; Chris@16: function_requires< Mutable_StorageArrayConcept >(); Chris@16: function_requires< RandomAccessIteratorConcept >(); Chris@16: function_requires< Mutable_RandomAccessIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef bounded_array container_model; Chris@16: function_requires< Mutable_StorageArrayConcept >(); Chris@16: function_requires< RandomAccessIteratorConcept >(); Chris@16: function_requires< Mutable_RandomAccessIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef unbounded_array container_model; Chris@16: function_requires< Mutable_StorageArrayConcept >(); Chris@16: function_requires< RandomAccessIteratorConcept >(); Chris@16: function_requires< Mutable_RandomAccessIteratorConcept >(); Chris@16: } Chris@16: Chris@16: /* FIXME array_adaptors are in progress Chris@16: { Chris@16: typedef array_adaptor container_model; Chris@16: function_requires< Mutable_StorageArrayConcept >(); Chris@16: function_requires< RandomAccessIteratorConcept >(); Chris@16: function_requires< Mutable_RandomAccessIteratorConcept >(); Chris@16: } Chris@16: */ Chris@16: Chris@16: { Chris@16: typedef range container_model; Chris@16: function_requires< IndexSetConcept >(); Chris@16: function_requires< RandomAccessIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef slice container_model; Chris@16: function_requires< IndexSetConcept >(); Chris@16: function_requires< RandomAccessIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef indirect_array<> container_model; Chris@16: function_requires< IndexSetConcept >(); Chris@16: function_requires< RandomAccessIteratorConcept >(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: // Storage Sparse Chris@16: #if defined (INTERNAL_STORAGE) || defined (INTERNAL_STORAGE_SPARSE) Chris@16: { Chris@16: typedef map_array container_model; Chris@16: function_requires< Mutable_StorageSparseConcept >(); Chris@16: function_requires< RandomAccessIteratorConcept >(); Chris@16: function_requires< RandomAccessIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef std::map container_model; Chris@16: function_requires< Mutable_StorageSparseConcept >(); Chris@16: function_requires< BidirectionalIteratorConcept >(); Chris@16: function_requires< BidirectionalIteratorConcept >(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: #ifdef VIEW_CONCEPTS Chris@16: // read only vectors Chris@16: { Chris@16: typedef vector_view container_model; Chris@16: function_requires< RandomAccessContainerConcept >(); Chris@16: function_requires< VectorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: // Vector Chris@16: #if defined (INTERNAL_VECTOR) || defined (INTERNAL_VECTOR_DENSE) Chris@16: { Chris@16: typedef vector container_model; Chris@16: function_requires< RandomAccessContainerConcept >(); Chris@16: function_requires< Mutable_VectorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef zero_vector container_model; Chris@16: function_requires< VectorConcept >(); Chris@16: function_requires< IndexedBidirectional1DIteratorConcept >(); Chris@16: function_requires< IndexedBidirectional1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef unit_vector container_model; Chris@16: function_requires< VectorConcept >(); Chris@16: function_requires< IndexedBidirectional1DIteratorConcept >(); Chris@16: function_requires< IndexedBidirectional1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef scalar_vector container_model; Chris@16: function_requires< VectorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef c_vector container_model; Chris@16: function_requires< Mutable_VectorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: // Vector Proxies Chris@16: #if defined (INTERNAL_VECTOR) || defined (INTERNAL_VECTOR_PROXY) Chris@16: { Chris@16: typedef vector_range > container_model; Chris@16: function_requires< Mutable_VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef vector_slice > container_model; Chris@16: function_requires< Mutable_VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef vector_indirect > container_model; Chris@16: function_requires< Mutable_VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: // Sparse Vector Chris@16: #if defined (INTERNAL_SPARSE) || defined (INTERNAL_VECTOR_SPARSE) Chris@16: { Chris@16: typedef mapped_vector container_model; Chris@16: function_requires< Mutable_SparseVectorConcept >(); Chris@16: function_requires< IndexedBidirectional1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional1DIteratorConcept >(); Chris@16: function_requires< IndexedBidirectional1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef compressed_vector container_model; Chris@16: function_requires< Mutable_SparseVectorConcept >(); Chris@16: function_requires< IndexedBidirectional1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional1DIteratorConcept >(); Chris@16: function_requires< IndexedBidirectional1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef coordinate_vector container_model; Chris@16: function_requires< Mutable_SparseVectorConcept >(); Chris@16: function_requires< IndexedBidirectional1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional1DIteratorConcept >(); Chris@16: function_requires< IndexedBidirectional1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional1DIteratorConcept >(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: // Matrix Chris@16: #if defined (INTERNAL_MATRIX) || defined (INTERNAL_MATRIX_DENSE) Chris@16: { Chris@16: typedef matrix container_model; Chris@16: function_requires< Mutable_MatrixConcept > >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef vector_of_vector container_model; Chris@16: function_requires< Mutable_MatrixConcept > >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef zero_matrix container_model; Chris@16: function_requires< Mutable_MatrixConcept > >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef identity_matrix container_model; Chris@16: function_requires< Mutable_MatrixConcept > >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef scalar_matrix container_model; Chris@16: function_requires< Mutable_MatrixConcept > >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef c_matrix container_model; Chris@16: function_requires< Mutable_MatrixConcept > >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: // Matrix Proxies Chris@16: #if defined (INTERNAL_MATRIX) || defined (INTERNAL_MATRIX_PROXY) Chris@16: { Chris@16: typedef matrix_row > container_model; Chris@16: function_requires< Mutable_VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_column > container_model; Chris@16: function_requires< Mutable_VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_vector_range > container_model; Chris@16: function_requires< Mutable_VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_vector_slice > container_model; Chris@16: function_requires< Mutable_VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_vector_indirect > container_model; Chris@16: function_requires< Mutable_VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_range > container_model; Chris@16: function_requires< Mutable_MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_slice > container_model; Chris@16: function_requires< Mutable_MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_indirect > container_model; Chris@16: function_requires< Mutable_MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: // Banded Matrix Chris@16: #if defined (INTERNAL_SPECIAL) || defined (INTERNAL_BANDED) Chris@16: { Chris@16: typedef banded_matrix container_model; Chris@16: function_requires< Mutable_MatrixConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef banded_adaptor > container_model; Chris@16: function_requires< Mutable_MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: // Triangular Matrix Chris@16: #if defined (INTERNAL_SPECIAL) || defined (INTERNAL_TRIANGULAR) Chris@16: { Chris@16: typedef triangular_matrix container_model; Chris@16: function_requires< Mutable_MatrixConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef triangular_adaptor > container_model; Chris@16: function_requires< Mutable_MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: // Symmetric Matrix Chris@16: #if defined (INTERNA_SPECIAL) || defined (INTERNAL_SYMMETRIC) Chris@16: { Chris@16: typedef symmetric_matrix container_model; Chris@16: function_requires< Mutable_MatrixConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef banded_adaptor > container_model; Chris@16: #ifndef SKIP_BAD Chris@16: // const_iterator (iterator) constructor is bad Chris@16: function_requires< Mutable_MatrixExpressionConcept >(); Chris@16: #endif Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: // Hermitian Matrix Chris@16: #if defined (INTERNAL_SPECIAL) || defined (INTERNAL_HERMITIAN) Chris@16: { Chris@16: typedef hermitian_matrix container_model; Chris@16: function_requires< Mutable_MatrixConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef hermitian_adaptor > container_model; Chris@16: #ifndef SKIP_BAD Chris@16: // const_iterator (iterator) constructor is bad Chris@16: function_requires< Mutable_MatrixExpressionConcept >(); Chris@16: #endif Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: // Sparse Matrix Chris@16: #if defined (INTERNAL_SPARSE) || defined (INTERNAL_MATRIX_SPARSE) Chris@16: { Chris@16: typedef mapped_matrix container_model; Chris@16: function_requires< Mutable_SparseMatrixConcept >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional2DIteratorConcept >(); Chris@16: } Chris@16: { Chris@16: typedef mapped_vector_of_mapped_vector container_model; Chris@16: function_requires< Mutable_SparseMatrixConcept >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional2DIteratorConcept >(); Chris@16: } Chris@16: { Chris@16: typedef compressed_matrix container_model; Chris@16: function_requires< Mutable_SparseMatrixConcept >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional2DIteratorConcept >(); Chris@16: } Chris@16: { Chris@16: typedef coordinate_matrix container_model; Chris@16: function_requires< Mutable_SparseMatrixConcept >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional2DIteratorConcept >(); Chris@16: } Chris@16: { Chris@16: typedef generalized_vector_of_vector > > container_model; Chris@16: function_requires< Mutable_SparseMatrixConcept >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< IndexedBidirectional2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedBidirectional2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: // Scalar Expressions Chris@16: #if defined (INTERNAL_EXPRESSION) || defined (INTERNAL_VECTOR_EXPRESSION) Chris@16: function_requires< ScalarExpressionConcept > >(); Chris@16: function_requires< ScalarExpressionConcept > >(); Chris@16: Chris@16: // Vector Expressions Chris@16: { Chris@16: typedef vector_reference > expression_model; Chris@16: function_requires< VectorExpressionConcept >(); Chris@16: function_requires< Mutable_VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef vector_unary, scalar_identity > expression_model; Chris@16: function_requires< VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef vector_binary, vector, scalar_plus > expression_model; Chris@16: function_requires< VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef vector_binary_scalar1, scalar_multiplies > expression_model; Chris@16: function_requires< VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef vector_binary_scalar2, scalar_value, scalar_multiplies > expression_model; Chris@16: function_requires< VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef vector_binary_scalar1, vector, scalar_multiplies > expression_model; Chris@16: function_requires< VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef vector_binary_scalar2, scalar_value, scalar_multiplies > expression_model; Chris@16: function_requires< VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: function_requires< ScalarExpressionConcept, vector_sum > > > >(); Chris@16: function_requires< ScalarExpressionConcept, vector_norm_1 > > > >(); Chris@16: function_requires< ScalarExpressionConcept, vector_norm_2 > > > >(); Chris@16: function_requires< ScalarExpressionConcept, vector_norm_inf > > > >(); Chris@16: Chris@16: function_requires< ScalarExpressionConcept, vector, vector_inner_prod, vector, T> > > >(); Chris@16: #endif Chris@16: Chris@16: // Matrix Expressions Chris@16: #if defined (INTERNAL_EXPRESSION) || defined (INTERNAL_MATRIX_EXPRESSION) Chris@16: { Chris@16: typedef matrix_reference > expression_model; Chris@16: function_requires< MatrixExpressionConcept >(); Chris@16: function_requires< Mutable_MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef vector_matrix_binary, vector, scalar_multiplies > expression_model; Chris@16: function_requires< MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_unary1, scalar_identity > expression_model; Chris@16: function_requires< MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_unary2, scalar_identity > expression_model; Chris@16: function_requires< MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_binary, matrix, scalar_plus > expression_model; Chris@16: function_requires< MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_binary_scalar1, scalar_multiplies > expression_model; Chris@16: function_requires< MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_binary_scalar2, T, scalar_multiplies > expression_model; Chris@16: function_requires< MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_binary_scalar1, matrix, scalar_multiplies > expression_model; Chris@16: function_requires< MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_binary_scalar2, scalar_value, scalar_multiplies > expression_model; Chris@16: function_requires< MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_vector_binary1, vector, matrix_vector_prod1, vector, T> > expression_model; Chris@16: function_requires< VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_vector_binary2, matrix, matrix_vector_prod2, vector, T > > expression_model; Chris@16: function_requires< VectorExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess1DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: { Chris@16: typedef matrix_matrix_binary, matrix, matrix_matrix_prod, matrix, T > > expression_model; Chris@16: function_requires< MatrixExpressionConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: function_requires< IndexedRandomAccess2DIteratorConcept >(); Chris@16: } Chris@16: Chris@16: function_requires< ScalarExpressionConcept, matrix_norm_1 > > > >(); Chris@16: function_requires< ScalarExpressionConcept, matrix_norm_frobenius > > > >(); Chris@16: function_requires< ScalarExpressionConcept, matrix_norm_inf > > > >(); Chris@16: #endif Chris@16: Chris@16: #ifdef EXTERNAL Chris@101: function_requires< AdditiveAbelianGroupConcept >(); Chris@101: function_requires< CommutativeRingWithIdentityConcept >(); Chris@101: function_requires< FieldConcept >(); Chris@101: function_requires< VectorSpaceConcept > >(); Chris@101: function_requires< Prod_RingWithIdentityConcept > >(); Chris@101: function_requires< VectorSpaceConcept > >(); Chris@101: function_requires< LinearOperatorConcept, matrix > >(); Chris@16: Chris@101: function_requires< AdditiveAbelianGroupConcept > >(); Chris@101: function_requires< CommutativeRingWithIdentityConcept > >(); Chris@101: function_requires< FieldConcept > >(); Chris@101: function_requires< VectorSpaceConcept, vector > > >(); Chris@101: function_requires< Prod_RingWithIdentityConcept > > >(); Chris@101: function_requires< VectorSpaceConcept, matrix > > >(); Chris@101: function_requires< LinearOperatorConcept, vector >, matrix > > >(); Chris@16: #endif Chris@16: } Chris@16: Chris@16: } // end of anonymous namespace Chris@16: Chris@16: }}} Chris@16: Chris@16: #endif