// // Copyright (c) 2000-2002 // Joerg Walter, Mathias Koch // // Permission to use, copy, modify, distribute and sell this software // and its documentation for any purpose is hereby granted without fee, // provided that the above copyright notice appear in all copies and // that both that copyright notice and this permission notice appear // in supporting documentation. The authors make no representations // about the suitability of this software for any purpose. // It is provided "as is" without express or implied warranty. // // The authors gratefully acknowledge the support of // GeNeSys mbH & Co. KG in producing this work. // #ifndef _BOOST_UBLAS_CONCEPTS_ #define _BOOST_UBLAS_CONCEPTS_ #include // Concept checks based on ideas of Jeremy Siek namespace boost { namespace numeric { namespace ublas { template struct AssignableConcept { typedef T value_type; static void constraints (value_type t) { // Copy Constructor value_type c1 (t); value_type c2 = t; // Assignment value_type a = t; std::swap (c1, c2); ignore_unused_variable_warning (a); } }; template struct EqualityComparableConcept { typedef T value_type; static void constraints (const value_type t) { bool b; // Equality b = t == t; // Inequality b = t != t; ignore_unused_variable_warning (b); } }; template struct LessThanComparableConcept { typedef T value_type; static void constraints (const value_type t) { bool b; b = t < t; b = t <= t; b = t >= t; b = t > t; ignore_unused_variable_warning (b); } }; template struct DefaultConstructibleConcept { typedef T value_type; static void constraints () { // Default Constructor static value_type c1 = value_type (); static value_type c2; ignore_unused_variable_warning (c1); ignore_unused_variable_warning (c2); } }; template::value_type> struct BidirectionalIteratorConcept { typedef I iterator_type; typedef typename std::iterator_traits::iterator_category iterator_category; typedef typename std::iterator_traits::difference_type difference_type; typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::reference reference; typedef typename std::iterator_traits::pointer pointer; static void constraints () { AssignableConcept::constraints (iterator_type ()); EqualityComparableConcept::constraints (iterator_type ()); DefaultConstructibleConcept::constraints (); iterator_type it = iterator_type (); // Associated types - assume constructable iterator_category c; difference_type d (0); pointer p (0); // Dereference reference r (*it); value_type t (r); // Member access // FIXME it->m; // Preincrement ++ it; // Postincrement it ++; // Predecrement -- it; // Postdecrement it --; ignore_unused_variable_warning (t); ignore_unused_variable_warning (c); ignore_unused_variable_warning (d); ignore_unused_variable_warning (p); ignore_unused_variable_warning (r); } }; template::value_type> struct MutableBidirectionalIteratorConcept { typedef I iterator_type; typedef T value_type; static void constraints () { BidirectionalIteratorConcept::constraints (); iterator_type it = iterator_type (); value_type t = value_type (); // Dereference assignment *it = t; ignore_unused_variable_warning (t); } }; template::difference_type, class T = typename std::iterator_traits::value_type> struct RandomAccessIteratorConcept { typedef I iterator_type; typedef D difference_type; typedef T value_type; static void constraints () { LessThanComparableConcept::constraints (iterator_type ()); BidirectionalIteratorConcept::constraints (); iterator_type it = iterator_type (), it1 = iterator_type (), it2 = iterator_type (); difference_type n (0); value_type t; // Forward motion it += n; // Iterator addition it = it + n; iterator_type itp (it + n); // Backward motion it -= n; // Iterator subtraction it = it - n; iterator_type itm (it - n); // Difference n = it1 - it2; // Element operator #ifdef BOOST_UBLAS_ITERATOR_IS_INDEXABLE t = it [n]; #endif t = *(it + n); ignore_unused_variable_warning (itp); ignore_unused_variable_warning (itm); ignore_unused_variable_warning (t); } }; template::difference_type, class T = typename std::iterator_traits::value_type> struct MutableRandomAccessIteratorConcept { typedef I iterator_type; typedef D difference_type; typedef T value_type; static void constraints () { MutableBidirectionalIteratorConcept::constraints (); RandomAccessIteratorConcept::constraints (); iterator_type it = iterator_type (); difference_type n (0); value_type t = value_type (); // Element assignment #ifdef BOOST_UBLAS_ITERATOR_IS_INDEXABLE it [n] = t; #endif *(it + n) = t; } }; template struct Indexed1DIteratorConcept { typedef I iterator_type; static void constraints () { iterator_type it = iterator_type (); // Index it.index (); } }; template struct IndexedBidirectional1DIteratorConcept { typedef I iterator_type; static void constraints () { BidirectionalIteratorConcept::constraints (); Indexed1DIteratorConcept::constraints (); } }; template struct MutableIndexedBidirectional1DIteratorConcept { typedef I iterator_type; static void constraints () { MutableBidirectionalIteratorConcept::constraints (); Indexed1DIteratorConcept::constraints (); } }; template struct IndexedRandomAccess1DIteratorConcept { typedef I iterator_type; static void constraints () { RandomAccessIteratorConcept::constraints (); Indexed1DIteratorConcept::constraints (); } }; template struct MutableIndexedRandomAccess1DIteratorConcept { typedef I iterator_type; static void constraints () { MutableRandomAccessIteratorConcept::constraints (); Indexed1DIteratorConcept::constraints (); } }; template struct Indexed2DIteratorConcept { typedef I iterator_type; typedef typename I::dual_iterator_type dual_iterator_type; typedef typename I::dual_reverse_iterator_type dual_reverse_iterator_type; static void constraints () { iterator_type it = iterator_type (); // Indices it.index1 (); it.index2 (); // Iterator begin/end dual_iterator_type it_begin (it.begin ()); dual_iterator_type it_end (it.end ()); // Reverse iterator begin/end dual_reverse_iterator_type it_rbegin (it.rbegin ()); dual_reverse_iterator_type it_rend (it.rend ()); ignore_unused_variable_warning (it_begin); ignore_unused_variable_warning (it_end); ignore_unused_variable_warning (it_rbegin); ignore_unused_variable_warning (it_rend); } }; template struct IndexedBidirectional2DIteratorConcept { typedef I1 subiterator1_type; typedef I2 subiterator2_type; static void constraints () { BidirectionalIteratorConcept::constraints (); BidirectionalIteratorConcept::constraints (); Indexed2DIteratorConcept::constraints (); Indexed2DIteratorConcept::constraints (); } }; template struct MutableIndexedBidirectional2DIteratorConcept { typedef I1 subiterator1_type; typedef I2 subiterator2_type; static void constraints () { MutableBidirectionalIteratorConcept::constraints (); MutableBidirectionalIteratorConcept::constraints (); Indexed2DIteratorConcept::constraints (); Indexed2DIteratorConcept::constraints (); } }; template struct IndexedRandomAccess2DIteratorConcept { typedef I1 subiterator1_type; typedef I2 subiterator2_type; static void constraints () { RandomAccessIteratorConcept::constraints (); RandomAccessIteratorConcept::constraints (); Indexed2DIteratorConcept::constraints (); Indexed2DIteratorConcept::constraints (); } }; template struct MutableIndexedRandomAccess2DIteratorConcept { typedef I1 subiterator1_type; typedef I2 subiterator2_type; static void constraints () { MutableRandomAccessIteratorConcept::constraints (); MutableRandomAccessIteratorConcept::constraints (); Indexed2DIteratorConcept::constraints (); Indexed2DIteratorConcept::constraints (); } }; template struct ContainerConcept { typedef C container_type; typedef typename C::size_type size_type; typedef typename C::const_iterator const_iterator_type; static void constraints () { DefaultConstructibleConcept::constraints (); container_type c = container_type (); size_type n (0); // Beginning of range const_iterator_type cit_begin (c.begin ()); // End of range const_iterator_type cit_end (c.end ()); // Size n = c.size (); ignore_unused_variable_warning (cit_end); ignore_unused_variable_warning (cit_begin); ignore_unused_variable_warning (n); } }; template struct MutableContainerConcept { typedef C container_type; typedef typename C::iterator iterator_type; static void constraints () { AssignableConcept::constraints (container_type ()); ContainerConcept::constraints (); container_type c = container_type (), c1 = container_type (), c2 = container_type (); // Beginning of range iterator_type it_begin (c.begin ()); // End of range iterator_type it_end (c.end ()); // Swap c1.swap (c2); ignore_unused_variable_warning (it_end); ignore_unused_variable_warning (it_begin); } }; template struct ReversibleContainerConcept { typedef C container_type; typedef typename C::const_reverse_iterator const_reverse_iterator_type; static void constraints () { ContainerConcept::constraints (); const container_type cc = container_type (); // Beginning of reverse range const_reverse_iterator_type crit_begin (cc.rbegin ()); // End of reverse range const_reverse_iterator_type crit_end (cc.rend ()); ignore_unused_variable_warning (crit_end); ignore_unused_variable_warning (crit_begin); } }; template struct MutableReversibleContainerConcept { typedef C container_type; typedef typename C::reverse_iterator reverse_iterator_type; static void constraints () { MutableContainerConcept::constraints (); ReversibleContainerConcept::constraints (); container_type c = container_type (); // Beginning of reverse range reverse_iterator_type rit_begin (c.rbegin ()); // End of reverse range reverse_iterator_type rit_end (c.rend ()); ignore_unused_variable_warning (rit_end); ignore_unused_variable_warning (rit_begin); } }; template struct RandomAccessContainerConcept { typedef C container_type; typedef typename C::size_type size_type; typedef typename C::value_type value_type; static void constraints () { ReversibleContainerConcept::constraints (); container_type c = container_type (); size_type n (0); value_type t = value_type (); // Element access t = c [n]; ignore_unused_variable_warning (t); } }; template struct MutableRandomAccessContainerConcept { typedef C container_type; typedef typename C::size_type size_type; typedef typename C::value_type value_type; static void constraints () { MutableReversibleContainerConcept::constraints (); RandomAccessContainerConcept::constraints (); container_type c = container_type (); size_type n (0); value_type t = value_type (); // Element access c [n] = t; } }; template struct StorageArrayConcept { typedef C container_type; typedef typename C::size_type size_type; typedef typename C::value_type value_type; static void constraints () { RandomAccessContainerConcept::constraints (); size_type n (0); // Sizing constructor container_type c = container_type (n); // Initialised sizing constructor container_type (n, value_type (5)); ignore_unused_variable_warning (c); } }; template struct MutableStorageArrayConcept { typedef C container_type; typedef typename C::size_type size_type; typedef typename C::value_type value_type; typedef typename C::iterator iterator_type; static void constraints () { MutableRandomAccessContainerConcept::constraints (); size_type n (0); // Sizing constructor container_type c = container_type (n); // Initialised sizing constructor c = container_type (n, value_type (3)); // Resize c.resize (n, value_type (5)); // Resize - none preserving c.resize (n); } }; template struct StorageSparseConcept { typedef C container_type; typedef typename C::size_type size_type; static void constraints () { ReversibleContainerConcept::constraints (); } }; template struct MutableStorageSparseConcept { typedef C container_type; typedef typename C::size_type size_type; typedef typename C::value_type value_type; typedef typename C::iterator iterator_type; static void constraints () { MutableReversibleContainerConcept::constraints (); container_type c = container_type (); value_type t = value_type (); iterator_type it = iterator_type (), it1 = iterator_type (), it2 = iterator_type (); // Insert c.insert (it, t); // Erase c.erase (it); // Range erase c.erase (it1, it2); // Clear c.clear (); } }; template struct IndexSetConcept { typedef G generator_type; typedef typename G::size_type size_type; typedef typename G::value_type value_type; static void constraints () { AssignableConcept::constraints (generator_type ()); ReversibleContainerConcept::constraints (); generator_type g = generator_type (); size_type n (0); value_type t; // Element access t = g (n); ignore_unused_variable_warning (t); } }; template struct ScalarExpressionConcept { typedef SE scalar_expression_type; typedef typename SE::value_type value_type; static void constraints () { scalar_expression_type *sp; scalar_expression_type s = *sp; value_type t; // Conversion t = s; ignore_unused_variable_warning (t); } }; template struct VectorExpressionConcept { typedef VE vector_expression_type; typedef typename VE::type_category type_category; typedef typename VE::size_type size_type; typedef typename VE::value_type value_type; typedef typename VE::const_iterator const_iterator_type; typedef typename VE::const_reverse_iterator const_reverse_iterator_type; static void constraints () { vector_expression_type *vp; const vector_expression_type *cvp; vector_expression_type v = *vp; const vector_expression_type cv = *cvp; size_type n (0), i (0); value_type t; // Find (internal?) const_iterator_type cit (v.find (i)); // Beginning of range const_iterator_type cit_begin (v.begin ()); // End of range const_iterator_type cit_end (v.end ()); // Size n = v.size (); // Beginning of reverse range const_reverse_iterator_type crit_begin (cv.rbegin ()); // End of reverse range const_reverse_iterator_type crit_end (cv.rend ()); // Element access t = v (i); ignore_unused_variable_warning (n); ignore_unused_variable_warning (cit); ignore_unused_variable_warning (cit_begin); ignore_unused_variable_warning (cit_end); ignore_unused_variable_warning (crit_begin); ignore_unused_variable_warning (crit_end); ignore_unused_variable_warning (t); } }; template struct MutableVectorExpressionConcept { typedef VE vector_expression_type; typedef typename VE::size_type size_type; typedef typename VE::value_type value_type; typedef typename VE::iterator iterator_type; typedef typename VE::reverse_iterator reverse_iterator_type; static void constraints () { vector_expression_type *vp; AssignableConcept::constraints (*vp); VectorExpressionConcept::constraints (); vector_expression_type v = *vp, v1 = *vp, v2 = *vp; size_type i (0); value_type t = value_type (); // Find (internal?) iterator_type it (v.find (i)); // Beginning of range iterator_type it_begin (v.begin ()); // End of range iterator_type it_end (v.end ()); // Swap v1.swap (v2); // Beginning of reverse range reverse_iterator_type rit_begin (v.rbegin ()); // End of reverse range reverse_iterator_type rit_end (v.rend ()); // Assignments v2 = v1; v2.assign (v1); v2 += v1; v2.plus_assign (v1); v2 -= v1; v2.minus_assign (v1); v *= t; ignore_unused_variable_warning (it); ignore_unused_variable_warning (it_begin); ignore_unused_variable_warning (it_end); ignore_unused_variable_warning (rit_begin); ignore_unused_variable_warning (rit_end); } }; template struct MatrixExpressionConcept { typedef ME matrix_expression_type; typedef typename ME::type_category type_category; typedef typename ME::size_type size_type; typedef typename ME::value_type value_type; typedef typename ME::const_iterator1 const_subiterator1_type; typedef typename ME::const_iterator2 const_subiterator2_type; typedef typename ME::const_reverse_iterator1 const_reverse_subiterator1_type; typedef typename ME::const_reverse_iterator2 const_reverse_subiterator2_type; static void constraints () { matrix_expression_type *mp; const matrix_expression_type *cmp; matrix_expression_type m = *mp; const matrix_expression_type cm = *cmp; size_type n (0), i (0), j (0); value_type t; // Find (internal?) const_subiterator1_type cit1 (m.find1 (0, i, j)); const_subiterator2_type cit2 (m.find2 (0, i, j)); // Beginning of range const_subiterator1_type cit1_begin (m.begin1 ()); const_subiterator2_type cit2_begin (m.begin2 ()); // End of range const_subiterator1_type cit1_end (m.end1 ()); const_subiterator2_type cit2_end (m.end2 ()); // Size n = m.size1 (); n = m.size2 (); // Beginning of reverse range const_reverse_subiterator1_type crit1_begin (cm.rbegin1 ()); const_reverse_subiterator2_type crit2_begin (cm.rbegin2 ()); // End of reverse range const_reverse_subiterator1_type crit1_end (cm.rend1 ()); const_reverse_subiterator2_type crit2_end (cm.rend2 ()); // Element access t = m (i, j); ignore_unused_variable_warning (n); ignore_unused_variable_warning (cit1); ignore_unused_variable_warning (cit2); ignore_unused_variable_warning (cit1_begin); ignore_unused_variable_warning (cit2_begin); ignore_unused_variable_warning (cit1_end); ignore_unused_variable_warning (cit2_end); ignore_unused_variable_warning (crit1_begin); ignore_unused_variable_warning (crit2_begin); ignore_unused_variable_warning (crit1_end); ignore_unused_variable_warning (crit2_end); ignore_unused_variable_warning (t); } }; template struct MutableMatrixExpressionConcept { typedef ME matrix_expression_type; typedef typename ME::size_type size_type; typedef typename ME::value_type value_type; typedef typename ME::iterator1 subiterator1_type; typedef typename ME::iterator2 subiterator2_type; typedef typename ME::reverse_iterator1 reverse_subiterator1_type; typedef typename ME::reverse_iterator2 reverse_subiterator2_type; static void constraints () { matrix_expression_type *mp; AssignableConcept::constraints (*mp); MatrixExpressionConcept::constraints (); matrix_expression_type m = *mp, m1 = *mp, m2 = *mp; size_type i (0), j (0); value_type t = value_type (); // Find (internal?) subiterator1_type it1 (m.find1 (0, i, j)); subiterator2_type it2 (m.find2 (0, i, j)); // Beginning of range subiterator1_type it1_begin (m.begin1 ()); subiterator2_type it2_begin (m.begin2 ()); // End of range subiterator1_type it1_end (m.end1 ()); subiterator2_type it2_end (m.end2 ()); // Swap m1.swap (m2); // Beginning of reverse range reverse_subiterator1_type rit1_begin (m.rbegin1 ()); reverse_subiterator2_type rit2_begin (m.rbegin2 ()); // End of reverse range reverse_subiterator1_type rit1_end (m.rend1 ()); reverse_subiterator2_type rit2_end (m.rend2 ()); // Assignments m2 = m1; m2.assign (m1); m2 += m1; m2.plus_assign (m1); m2 -= m1; m2.minus_assign (m1); m *= t; ignore_unused_variable_warning (it1); ignore_unused_variable_warning (it2); ignore_unused_variable_warning (it1_begin); ignore_unused_variable_warning (it2_begin); ignore_unused_variable_warning (it1_end); ignore_unused_variable_warning (it2_end); ignore_unused_variable_warning (rit1_begin); ignore_unused_variable_warning (rit2_begin); ignore_unused_variable_warning (rit1_end); ignore_unused_variable_warning (rit2_end); } }; template struct VectorConcept { typedef V vector_type; typedef typename V::size_type size_type; typedef typename V::value_type value_type; typedef const value_type *const_pointer; static void constraints () { VectorExpressionConcept::constraints (); size_type n (0); size_type i (0); // Sizing constructor vector_type v (n); // Element support const_pointer p = v.find_element (i); ignore_unused_variable_warning (p); } }; template struct MutableVectorConcept { typedef V vector_type; typedef typename V::size_type size_type; typedef typename V::value_type value_type; typedef value_type *pointer; static void constraints () { VectorConcept::constraints (); MutableVectorExpressionConcept::constraints (); size_type n (0); value_type t = value_type (); size_type i (0); // Sizing constructor vector_type v (n); // Element support pointer p = v.find_element (i); // Element assignment value_type r = v.insert_element (i, t); v.insert_element (i, t) = r; // Zeroing v.clear (); // Resize v.resize (n); ignore_unused_variable_warning (p); ignore_unused_variable_warning (r); } }; template struct SparseVectorConcept { typedef V vector_type; typedef typename V::size_type size_type; static void constraints () { VectorConcept::constraints (); } }; template struct MutableSparseVectorConcept { typedef V vector_type; typedef typename V::size_type size_type; typedef typename V::value_type value_type; static void constraints () { SparseVectorConcept::constraints (); MutableVectorConcept::constraints (); size_type n (0); size_type i (0); // Sizing constructor vector_type v (n); // Element erasure v.erase_element (i); } }; template struct MatrixConcept { typedef M matrix_type; typedef typename M::size_type size_type; typedef typename M::value_type value_type; typedef const value_type *const_pointer; static void constraints () { MatrixExpressionConcept::constraints (); size_type n (0); size_type i (0), j (0); // Sizing constructor matrix_type m (n, n); // Element support #ifndef SKIP_BAD const_pointer p = m.find_element (i, j); #else const_pointer p; ignore_unused_variable_warning (i); ignore_unused_variable_warning (j); #endif ignore_unused_variable_warning (p); } }; template struct MutableMatrixConcept { typedef M matrix_type; typedef typename M::size_type size_type; typedef typename M::value_type value_type; typedef value_type *pointer; static void constraints () { MatrixConcept::constraints (); MutableMatrixExpressionConcept::constraints (); size_type n (0); value_type t = value_type (); size_type i (0), j (0); // Sizing constructor matrix_type m (n, n); // Element support #ifndef SKIP_BAD pointer p = m.find_element (i, j); ignore_unused_variable_warning (i); ignore_unused_variable_warning (j); #else pointer p; #endif // Element assigment value_type r = m.insert_element (i, j, t); m.insert_element (i, j, t) = r; // Zeroing m.clear (); // Resize m.resize (n, n); m.resize (n, n, false); ignore_unused_variable_warning (p); ignore_unused_variable_warning (r); } }; template struct SparseMatrixConcept { typedef M matrix_type; typedef typename M::size_type size_type; static void constraints () { MatrixConcept::constraints (); } }; template struct MutableSparseMatrixConcept { typedef M matrix_type; typedef typename M::size_type size_type; typedef typename M::value_type value_type; static void constraints () { SparseMatrixConcept::constraints (); MutableMatrixConcept::constraints (); size_type n (0); size_type i (0), j (0); // Sizing constructor matrix_type m (n, n); // Elemnent erasure m.erase_element (i, j); } }; template T ZeroElement (T); template<> float ZeroElement (float) { return 0.f; } template<> double ZeroElement (double) { return 0.; } template<> vector ZeroElement (vector) { return zero_vector (); } template<> vector ZeroElement (vector) { return zero_vector (); } template<> matrix ZeroElement (matrix) { return zero_matrix (); } template<> matrix ZeroElement (matrix) { return zero_matrix (); } template<> std::complex ZeroElement (std::complex) { return std::complex (0.f); } template<> std::complex ZeroElement (std::complex) { return std::complex (0.); } template<> vector > ZeroElement (vector >) { return zero_vector > (); } template<> vector > ZeroElement (vector >) { return zero_vector > (); } template<> matrix > ZeroElement (matrix >) { return zero_matrix > (); } template<> matrix > ZeroElement (matrix >) { return zero_matrix > (); } template T OneElement (T); template<> float OneElement (float) { return 1.f; } template<> double OneElement (double) { return 1.; } template<> matrix OneElement (matrix) { return identity_matrix (); } template<> matrix OneElement (matrix) { return identity_matrix (); } template<> std::complex OneElement (std::complex) { return std::complex (1.f); } template<> std::complex OneElement (std::complex) { return std::complex (1.); } template<> matrix > OneElement (matrix >) { return identity_matrix > (); } template<> matrix > OneElement (matrix >) { return identity_matrix > (); } template bool operator == (const vector_expression &e1, const vector_expression &e2) { typedef typename promote_traits::promote_type value_type; typedef typename type_traits::real_type real_type; return norm_inf (e1 - e2) == real_type/*zero*/(); } template bool operator == (const matrix_expression &e1, const matrix_expression &e2) { typedef typename promote_traits::promote_type value_type; typedef typename type_traits::real_type real_type; return norm_inf (e1 - e2) == real_type/*zero*/(); } template struct AdditiveAbelianGroupConcept { typedef T value_type; static void constraints () { bool r; value_type a = value_type (), b = value_type (), c = value_type (); r = (a + b) + c == a + (b + c); r = ZeroElement (value_type ()) + a == a; r = a + ZeroElement (value_type ()) == a; r = a + (- a) == ZeroElement (value_type ()); r = (- a) + a == ZeroElement (value_type ()); r = a + b == b + a; ignore_unused_variable_warning (r); } }; template struct MultiplicativeAbelianGroupConcept { typedef T value_type; static void constraints () { bool r; value_type a = value_type (), b = value_type (), c = value_type (); r = (a * b) * c == a * (b * c); r = OneElement (value_type ()) * a == a; r = a * OneElement (value_type ()) == a; r = a * (OneElement (value_type ()) / a) == a; r = (OneElement (value_type ()) / a) * a == a; r = a * b == b * a; ignore_unused_variable_warning (r); } }; template struct RingWithIdentityConcept { typedef T value_type; static void constraints () { AdditiveAbelianGroupConcept::constraints (); bool r; value_type a = value_type (), b = value_type (), c = value_type (); r = (a * b) * c == a * (b * c); r = (a + b) * c == a * c + b * c; r = OneElement (value_type ()) * a == a; r = a * OneElement (value_type ()) == a; ignore_unused_variable_warning (r); } static void constraints (int) { AdditiveAbelianGroupConcept::constraints (); bool r; value_type a = value_type (), b = value_type (), c = value_type (); r = prod (T (prod (a, b)), c) == prod (a, T (prod (b, c))); r = prod (a + b, c) == prod (a, c) + prod (b, c); r = prod (OneElement (value_type ()), a) == a; r = prod (a, OneElement (value_type ())) == a; ignore_unused_variable_warning (r); } }; template struct CommutativeRingWithIdentityConcept { typedef T value_type; static void constraints () { RingWithIdentityConcept::constraints (); bool r; value_type a = value_type (), b = value_type (); r = a * b == b * a; ignore_unused_variable_warning (r); } }; template struct FieldConcept { typedef T value_type; static void constraints () { CommutativeRingWithIdentityConcept::constraints (); bool r; value_type a = value_type (); r = a == ZeroElement (value_type ()) || a * (OneElement (value_type ()) / a) == a; r = a == ZeroElement (value_type ()) || (OneElement (value_type ()) / a) * a == a; ignore_unused_variable_warning (r); } }; template struct VectorSpaceConcept { typedef T value_type; typedef V vector_type; static void constraints () { FieldConcept::constraints (); AdditiveAbelianGroupConcept::constraints (); bool r; value_type alpha = value_type (), beta = value_type (); vector_type a = vector_type (), b = vector_type (); r = alpha * (a + b) == alpha * a + alpha * b; r = (alpha + beta) * a == alpha * a + beta * a; r = (alpha * beta) * a == alpha * (beta * a); r = OneElement (value_type ()) * a == a; ignore_unused_variable_warning (r); } }; template struct LinearOperatorConcept { typedef T value_type; typedef V vector_type; typedef M matrix_type; static void constraints () { VectorSpaceConcept::constraints (); bool r; value_type alpha = value_type (), beta = value_type (); vector_type a = vector_type (), b = vector_type (); matrix_type A = matrix_type (); r = prod (A, alpha * a + beta * b) == alpha * prod (A, a) + beta * prod (A, b); ignore_unused_variable_warning (r); } }; void concept_checks () { // Allow tests to be group to keep down compiler storage requirement #ifdef INTERAL #define INTERNAL_STORAGE #define INTERNAL_VECTOR #define INTERNAL_MATRIX #define INTERNAL_SPECIAL #define INTERNAL_SPARSE #define INTERNAL_EXPRESSION #endif // Element value type for tests typedef float T; // Storage Array #if defined (INTERNAL_STORAGE) || defined (INTERNAL_STORAGE_DENSE) StorageArrayConcept >::constraints (); MutableStorageArrayConcept >::constraints (); RandomAccessIteratorConcept::const_iterator>::constraints (); MutableRandomAccessIteratorConcept::iterator>::constraints (); StorageArrayConcept >::constraints (); MutableStorageArrayConcept >::constraints (); RandomAccessIteratorConcept::const_iterator>::constraints (); MutableRandomAccessIteratorConcept::iterator>::constraints (); StorageArrayConcept >::constraints (); MutableStorageArrayConcept >::constraints (); RandomAccessIteratorConcept::const_iterator>::constraints (); MutableRandomAccessIteratorConcept::iterator>::constraints (); StorageArrayConcept >::constraints (); MutableStorageArrayConcept >::constraints (); RandomAccessIteratorConcept::const_iterator>::constraints (); MutableRandomAccessIteratorConcept::iterator>::constraints (); IndexSetConcept::constraints (); RandomAccessIteratorConcept::constraints (); IndexSetConcept::constraints (); RandomAccessIteratorConcept::constraints (); IndexSetConcept >::constraints (); RandomAccessIteratorConcept::const_iterator>::constraints (); #endif // Storage Sparse #if defined (INTERNAL_STORAGE) || defined (INTERNAL_STORAGE_SPARSE) StorageSparseConcept >::constraints (); MutableStorageSparseConcept >::constraints (); RandomAccessIteratorConcept::const_iterator>::constraints (); MutableRandomAccessIteratorConcept::iterator>::constraints (); StorageSparseConcept >::constraints (); MutableStorageSparseConcept >::constraints (); BidirectionalIteratorConcept::const_iterator>::constraints (); // Not value_type mutable BidirectionalIteratorConcept::iterator>::constraints (); #endif // Vector #if defined (INTERNAL_VECTOR) || defined (INTERNAL_VECTOR_DENSE) VectorConcept >::constraints (); MutableVectorConcept >::constraints (); IndexedRandomAccess1DIteratorConcept::const_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept::iterator>::constraints (); IndexedRandomAccess1DIteratorConcept::const_reverse_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept::reverse_iterator>::constraints (); VectorConcept >::constraints (); IndexedBidirectional1DIteratorConcept::const_iterator>::constraints (); IndexedBidirectional1DIteratorConcept::const_reverse_iterator>::constraints (); VectorConcept >::constraints (); IndexedBidirectional1DIteratorConcept::const_iterator>::constraints (); IndexedBidirectional1DIteratorConcept::const_reverse_iterator>::constraints (); VectorConcept >::constraints (); IndexedRandomAccess1DIteratorConcept::const_iterator>::constraints (); IndexedRandomAccess1DIteratorConcept::const_reverse_iterator>::constraints (); VectorConcept >::constraints (); MutableVectorConcept >::constraints (); IndexedRandomAccess1DIteratorConcept::const_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept::iterator>::constraints (); IndexedRandomAccess1DIteratorConcept::const_reverse_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept::reverse_iterator>::constraints (); #endif // Vector Proxies #if defined (INTERNAL_VECTOR) || defined (INTERNAL_VECTOR_PROXY) VectorExpressionConcept > >::constraints (); MutableVectorExpressionConcept > >::constraints (); IndexedRandomAccess1DIteratorConcept >::const_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::iterator>::constraints (); IndexedRandomAccess1DIteratorConcept >::const_reverse_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::reverse_iterator>::constraints (); VectorExpressionConcept > >::constraints (); MutableVectorExpressionConcept > >::constraints (); IndexedRandomAccess1DIteratorConcept >::const_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::iterator>::constraints (); IndexedRandomAccess1DIteratorConcept >::const_reverse_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::reverse_iterator>::constraints (); VectorExpressionConcept > >::constraints (); MutableVectorExpressionConcept > >::constraints (); IndexedRandomAccess1DIteratorConcept >::const_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::iterator>::constraints (); IndexedRandomAccess1DIteratorConcept >::const_reverse_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::reverse_iterator>::constraints (); #endif // Sparse Vector #if defined (INTERNAL_SPARSE) || defined (INTERNAL_VECTOR_SPARSE) SparseVectorConcept >::constraints (); MutableSparseVectorConcept >::constraints (); IndexedBidirectional1DIteratorConcept::const_iterator>::constraints (); MutableIndexedBidirectional1DIteratorConcept::iterator>::constraints (); IndexedBidirectional1DIteratorConcept::const_reverse_iterator>::constraints (); MutableIndexedBidirectional1DIteratorConcept::reverse_iterator>::constraints (); SparseVectorConcept >::constraints (); MutableSparseVectorConcept >::constraints (); IndexedBidirectional1DIteratorConcept::const_iterator>::constraints (); MutableIndexedBidirectional1DIteratorConcept::iterator>::constraints (); IndexedBidirectional1DIteratorConcept::const_reverse_iterator>::constraints (); MutableIndexedBidirectional1DIteratorConcept::reverse_iterator>::constraints (); SparseVectorConcept >::constraints (); MutableSparseVectorConcept >::constraints (); IndexedBidirectional1DIteratorConcept::const_iterator>::constraints (); MutableIndexedBidirectional1DIteratorConcept::iterator>::constraints (); IndexedBidirectional1DIteratorConcept::const_reverse_iterator>::constraints (); MutableIndexedBidirectional1DIteratorConcept::reverse_iterator>::constraints (); #endif // Matrix #if defined (INTERNAL_MATRIX) || defined (INTERNAL_MATRIX_DENSE) MatrixConcept >::constraints (); MutableMatrixConcept >::constraints (); IndexedRandomAccess2DIteratorConcept::const_iterator1, matrix::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::iterator1, matrix::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept::const_reverse_iterator1, matrix::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::reverse_iterator1, matrix::reverse_iterator2>::constraints (); MatrixConcept >::constraints (); MutableMatrixConcept >::constraints (); IndexedRandomAccess2DIteratorConcept::const_iterator1, vector_of_vector::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::iterator1, vector_of_vector::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept::const_reverse_iterator1, vector_of_vector::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::reverse_iterator1, vector_of_vector::reverse_iterator2>::constraints (); MatrixConcept >::constraints (); IndexedBidirectional2DIteratorConcept::const_iterator1, zero_matrix::const_iterator2>::constraints (); IndexedBidirectional2DIteratorConcept::const_reverse_iterator1, zero_matrix::const_reverse_iterator2>::constraints (); MatrixConcept >::constraints (); IndexedBidirectional2DIteratorConcept::const_iterator1, identity_matrix::const_iterator2>::constraints (); IndexedBidirectional2DIteratorConcept::const_reverse_iterator1, identity_matrix::const_reverse_iterator2>::constraints (); MatrixConcept >::constraints (); IndexedRandomAccess2DIteratorConcept::const_iterator1, scalar_matrix::const_iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept::const_reverse_iterator1, scalar_matrix::const_reverse_iterator2>::constraints (); MatrixConcept >::constraints (); MutableMatrixConcept >::constraints (); IndexedRandomAccess2DIteratorConcept::const_iterator1, c_matrix::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::iterator1, c_matrix::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept::const_reverse_iterator1, c_matrix::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::reverse_iterator1, c_matrix::reverse_iterator2>::constraints (); #endif // Matrix Proxies #if defined (INTERNAL_MATRIX) || defined (INTERNAL_MATRIX_PROXY) VectorExpressionConcept > >::constraints (); MutableVectorExpressionConcept > >::constraints (); IndexedRandomAccess1DIteratorConcept >::const_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::iterator>::constraints (); IndexedRandomAccess1DIteratorConcept >::const_reverse_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::reverse_iterator>::constraints (); VectorExpressionConcept > >::constraints (); MutableVectorExpressionConcept > >::constraints (); IndexedRandomAccess1DIteratorConcept >::const_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::iterator>::constraints (); IndexedRandomAccess1DIteratorConcept >::const_reverse_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::reverse_iterator>::constraints (); VectorExpressionConcept > >::constraints (); MutableVectorExpressionConcept > >::constraints (); IndexedRandomAccess1DIteratorConcept >::const_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::iterator>::constraints (); IndexedRandomAccess1DIteratorConcept >::const_reverse_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::reverse_iterator>::constraints (); VectorExpressionConcept > >::constraints (); MutableVectorExpressionConcept > >::constraints (); IndexedRandomAccess1DIteratorConcept >::const_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::iterator>::constraints (); IndexedRandomAccess1DIteratorConcept >::const_reverse_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::reverse_iterator>::constraints (); VectorExpressionConcept, vector > >::constraints (); MutableVectorExpressionConcept, vector > >::constraints (); IndexedRandomAccess1DIteratorConcept, vector >::const_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept, vector >::iterator>::constraints (); IndexedRandomAccess1DIteratorConcept, vector >::const_reverse_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept, vector >::reverse_iterator>::constraints (); MatrixExpressionConcept > >::constraints (); MutableMatrixExpressionConcept > >::constraints (); IndexedRandomAccess2DIteratorConcept >::const_iterator1, matrix_range >::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::iterator1, matrix_range >::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept >::const_reverse_iterator1, matrix_range >::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::reverse_iterator1, matrix_range >::reverse_iterator2>::constraints (); MatrixExpressionConcept > >::constraints (); MutableMatrixExpressionConcept > >::constraints (); IndexedRandomAccess2DIteratorConcept >::const_iterator1, matrix_slice >::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::iterator1, matrix_slice >::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept >::const_reverse_iterator1, matrix_slice >::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::reverse_iterator1, matrix_slice >::reverse_iterator2>::constraints (); MatrixExpressionConcept > >::constraints (); MutableMatrixExpressionConcept > >::constraints (); IndexedRandomAccess2DIteratorConcept >::const_iterator1, matrix_indirect >::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::iterator1, matrix_indirect >::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept >::const_reverse_iterator1, matrix_indirect >::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::reverse_iterator1, matrix_indirect >::reverse_iterator2>::constraints (); #endif // Banded Matrix #if defined (INTERNAL_SPECIAL) || defined (INTERNAL_BANDED) MatrixConcept >::constraints (); MutableMatrixConcept >::constraints (); IndexedRandomAccess2DIteratorConcept::const_iterator1, banded_matrix::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::iterator1, banded_matrix::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept::const_reverse_iterator1, banded_matrix::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::reverse_iterator1, banded_matrix::reverse_iterator2>::constraints (); MatrixExpressionConcept > >::constraints (); MutableMatrixExpressionConcept > >::constraints (); IndexedRandomAccess2DIteratorConcept >::const_iterator1, banded_adaptor >::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::iterator1, banded_adaptor >::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept >::const_reverse_iterator1, banded_adaptor >::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::reverse_iterator1, banded_adaptor >::reverse_iterator2>::constraints (); #endif // Triangular Matrix #if defined (INTERNAL_SPECIAL) || defined (INTERNAL_TRIANGULAR) MatrixConcept >::constraints (); MutableMatrixConcept >::constraints (); IndexedRandomAccess2DIteratorConcept::const_iterator1, triangular_matrix::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::iterator1, triangular_matrix::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept::const_reverse_iterator1, triangular_matrix::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::reverse_iterator1, triangular_matrix::reverse_iterator2>::constraints (); MatrixExpressionConcept > >::constraints (); MutableMatrixExpressionConcept > >::constraints (); IndexedRandomAccess2DIteratorConcept >::const_iterator1, triangular_adaptor >::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::iterator1, triangular_adaptor >::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept >::const_reverse_iterator1, triangular_adaptor >::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::reverse_iterator1, triangular_adaptor >::reverse_iterator2>::constraints (); #endif // Symmetric Matrix #if defined (INTERNA_SPECIAL) || defined (INTERNAL_SYMMETRIC) MatrixConcept >::constraints (); MutableMatrixConcept >::constraints (); IndexedRandomAccess2DIteratorConcept::const_iterator1, symmetric_matrix::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::iterator1, symmetric_matrix::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept::const_reverse_iterator1, symmetric_matrix::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::reverse_iterator1, symmetric_matrix::reverse_iterator2>::constraints (); MatrixExpressionConcept > >::constraints (); #ifndef SKIP_BAD // const_iterator (iterator) constructor is bad MutableMatrixExpressionConcept > >::constraints (); #endif IndexedRandomAccess2DIteratorConcept >::const_iterator1, symmetric_adaptor >::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::iterator1, symmetric_adaptor >::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept >::const_reverse_iterator1, symmetric_adaptor >::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::reverse_iterator1, symmetric_adaptor >::reverse_iterator2>::constraints (); #endif // Hermitian Matrix #if defined (INTERNAL_SPECIAL) || defined (INTERNAL_HERMITIAN) MatrixConcept >::constraints (); MutableMatrixConcept >::constraints (); IndexedRandomAccess2DIteratorConcept::const_iterator1, hermitian_matrix::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::iterator1, hermitian_matrix::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept::const_reverse_iterator1, hermitian_matrix::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept::reverse_iterator1, hermitian_matrix::reverse_iterator2>::constraints (); MatrixExpressionConcept > >::constraints (); #ifndef SKIP_BAD // const_iterator (iterator) constructor is bad MutableMatrixExpressionConcept > >::constraints (); #endif IndexedRandomAccess2DIteratorConcept >::const_iterator1, hermitian_adaptor >::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::iterator1, hermitian_adaptor >::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept >::const_reverse_iterator1, hermitian_adaptor >::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::reverse_iterator1, hermitian_adaptor >::reverse_iterator2>::constraints (); #endif // Sparse Matrix #if defined (INTERNAL_SPARSE) || defined (INTERNAL_MATRIX_SPARSE) { typedef mapped_matrix container_model; SparseMatrixConcept::constraints (); MutableSparseMatrixConcept::constraints (); IndexedBidirectional2DIteratorConcept::constraints (); MutableIndexedBidirectional2DIteratorConcept::constraints (); IndexedBidirectional2DIteratorConcept::constraints (); MutableIndexedBidirectional2DIteratorConcept::constraints (); } { typedef mapped_vector_of_mapped_vector container_model; SparseMatrixConcept::constraints (); MutableSparseMatrixConcept::constraints (); IndexedBidirectional2DIteratorConcept::constraints (); MutableIndexedBidirectional2DIteratorConcept::constraints (); IndexedBidirectional2DIteratorConcept::constraints (); MutableIndexedBidirectional2DIteratorConcept::constraints (); } { typedef compressed_matrix container_model; SparseMatrixConcept::constraints (); MutableSparseMatrixConcept::constraints (); IndexedBidirectional2DIteratorConcept::constraints (); MutableIndexedBidirectional2DIteratorConcept::constraints (); IndexedBidirectional2DIteratorConcept::constraints (); MutableIndexedBidirectional2DIteratorConcept::constraints (); } { typedef coordinate_matrix container_model; SparseMatrixConcept::constraints (); MutableSparseMatrixConcept::constraints (); IndexedBidirectional2DIteratorConcept::constraints (); MutableIndexedBidirectional2DIteratorConcept::constraints (); IndexedBidirectional2DIteratorConcept::constraints (); MutableIndexedBidirectional2DIteratorConcept::constraints (); } { typedef generalized_vector_of_vector > > container_model; SparseMatrixConcept::constraints (); MutableSparseMatrixConcept::constraints (); IndexedBidirectional2DIteratorConcept::constraints (); MutableIndexedBidirectional2DIteratorConcept::constraints (); IndexedBidirectional2DIteratorConcept::constraints (); MutableIndexedBidirectional2DIteratorConcept::constraints (); } #endif // Scalar Expressions #if defined (INTERNAL_EXPRESSION) || defined (INTERNAL_VECTOR_EXPRESSION) ScalarExpressionConcept >::constraints (); ScalarExpressionConcept >::constraints (); // Vector Expressions VectorExpressionConcept > >::constraints (); MutableVectorExpressionConcept > >::constraints (); IndexedRandomAccess1DIteratorConcept >::const_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::iterator>::constraints (); IndexedRandomAccess1DIteratorConcept >::const_reverse_iterator>::constraints (); MutableIndexedRandomAccess1DIteratorConcept >::reverse_iterator>::constraints (); VectorExpressionConcept, scalar_identity > >::constraints (); IndexedRandomAccess1DIteratorConcept, scalar_identity >::const_iterator>::constraints (); IndexedRandomAccess1DIteratorConcept, scalar_identity >::const_reverse_iterator>::constraints (); VectorExpressionConcept, vector, scalar_plus > >::constraints (); IndexedRandomAccess1DIteratorConcept, vector, scalar_plus >::const_iterator>::constraints (); IndexedRandomAccess1DIteratorConcept, vector, scalar_plus >::const_reverse_iterator>::constraints (); VectorExpressionConcept, scalar_multiplies > >::constraints (); IndexedRandomAccess1DIteratorConcept, scalar_multiplies >::const_iterator>::constraints (); IndexedRandomAccess1DIteratorConcept, scalar_multiplies >::const_reverse_iterator>::constraints (); VectorExpressionConcept, scalar_value, scalar_multiplies > >::constraints (); IndexedRandomAccess1DIteratorConcept, scalar_value, scalar_multiplies >::const_iterator>::constraints (); IndexedRandomAccess1DIteratorConcept, scalar_value, scalar_multiplies >::const_reverse_iterator>::constraints (); VectorExpressionConcept, vector, scalar_multiplies > >::constraints (); IndexedRandomAccess1DIteratorConcept, vector, scalar_multiplies >::const_iterator>::constraints (); IndexedRandomAccess1DIteratorConcept, vector, scalar_multiplies >::const_reverse_iterator>::constraints (); VectorExpressionConcept, scalar_value, scalar_multiplies > >::constraints (); IndexedRandomAccess1DIteratorConcept, scalar_value, scalar_multiplies >::const_iterator>::constraints (); IndexedRandomAccess1DIteratorConcept, scalar_value, scalar_multiplies >::const_reverse_iterator>::constraints (); ScalarExpressionConcept, vector_sum > >::constraints (); ScalarExpressionConcept, vector_norm_1 > >::constraints (); ScalarExpressionConcept, vector_norm_2 > >::constraints (); ScalarExpressionConcept, vector_norm_inf > >::constraints (); ScalarExpressionConcept, vector, vector_inner_prod > >::constraints (); #endif // Matrix Expressions #if defined (INTERNAL_EXPRESSION) || defined (INTERNAL_MATRIX_EXPRESSION) MatrixExpressionConcept > >::constraints (); MutableMatrixExpressionConcept > >::constraints (); IndexedRandomAccess2DIteratorConcept >::const_iterator1, matrix_reference >::const_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::iterator1, matrix_reference >::iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept >::const_reverse_iterator1, matrix_reference >::const_reverse_iterator2>::constraints (); MutableIndexedRandomAccess2DIteratorConcept >::reverse_iterator1, matrix_reference >::reverse_iterator2>::constraints (); MatrixExpressionConcept, vector, scalar_multiplies > >::constraints (); IndexedRandomAccess2DIteratorConcept, vector, scalar_multiplies >::const_iterator1, vector_matrix_binary, vector, scalar_multiplies >::const_iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept, vector, scalar_multiplies >::const_reverse_iterator1, vector_matrix_binary, vector, scalar_multiplies >::const_reverse_iterator2>::constraints (); MatrixExpressionConcept, scalar_identity > >::constraints (); IndexedRandomAccess2DIteratorConcept, scalar_identity >::const_iterator1, matrix_unary1, scalar_identity >::const_iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept, scalar_identity >::const_reverse_iterator1, matrix_unary1, scalar_identity >::const_reverse_iterator2>::constraints (); MatrixExpressionConcept, scalar_identity > >::constraints (); IndexedRandomAccess2DIteratorConcept, scalar_identity >::const_iterator1, matrix_unary2, scalar_identity >::const_iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept, scalar_identity >::const_reverse_iterator1, matrix_unary2, scalar_identity >::const_reverse_iterator2>::constraints (); MatrixExpressionConcept, matrix, scalar_plus > >::constraints (); IndexedRandomAccess2DIteratorConcept, matrix, scalar_plus >::const_iterator1, matrix_binary, matrix, scalar_plus >::const_iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept, matrix, scalar_plus >::const_reverse_iterator1, matrix_binary, matrix, scalar_plus >::const_reverse_iterator2>::constraints (); MatrixExpressionConcept, scalar_multiplies > >::constraints (); IndexedRandomAccess2DIteratorConcept, scalar_multiplies >::const_iterator1, matrix_binary_scalar1, scalar_multiplies >::const_iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept, scalar_multiplies >::const_reverse_iterator1, matrix_binary_scalar1, scalar_multiplies >::const_reverse_iterator2>::constraints (); MatrixExpressionConcept, T, scalar_multiplies > >::constraints (); IndexedRandomAccess2DIteratorConcept, T, scalar_multiplies >::const_iterator1, matrix_binary_scalar2, T, scalar_multiplies >::const_iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept, T, scalar_multiplies >::const_reverse_iterator1, matrix_binary_scalar2, T, scalar_multiplies >::const_reverse_iterator2>::constraints (); MatrixExpressionConcept, matrix, scalar_multiplies > >::constraints (); IndexedRandomAccess2DIteratorConcept, matrix, scalar_multiplies >::const_iterator1, matrix_binary_scalar1, matrix, scalar_multiplies >::const_iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept, matrix, scalar_multiplies >::const_reverse_iterator1, matrix_binary_scalar1, matrix, scalar_multiplies >::const_reverse_iterator2>::constraints (); MatrixExpressionConcept, scalar_value, scalar_multiplies > >::constraints (); IndexedRandomAccess2DIteratorConcept, scalar_value, scalar_multiplies >::const_iterator1, matrix_binary_scalar2, scalar_value, scalar_multiplies >::const_iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept, scalar_value, scalar_multiplies >::const_reverse_iterator1, matrix_binary_scalar2, scalar_value, scalar_multiplies >::const_reverse_iterator2>::constraints (); VectorExpressionConcept, vector, matrix_vector_prod1 > >::constraints (); IndexedRandomAccess1DIteratorConcept, vector, matrix_vector_prod1 >::const_iterator>::constraints (); IndexedRandomAccess1DIteratorConcept, vector, matrix_vector_prod1 >::const_reverse_iterator>::constraints (); VectorExpressionConcept, matrix, matrix_vector_prod2 > >::constraints (); IndexedRandomAccess1DIteratorConcept, matrix, matrix_vector_prod2 >::const_iterator>::constraints (); IndexedRandomAccess1DIteratorConcept, matrix, matrix_vector_prod2 >::const_reverse_iterator>::constraints (); MatrixExpressionConcept, matrix, matrix_matrix_prod > >::constraints (); IndexedRandomAccess2DIteratorConcept, matrix, matrix_matrix_prod >::const_iterator1, matrix_matrix_binary, matrix, matrix_matrix_prod >::const_iterator2>::constraints (); IndexedRandomAccess2DIteratorConcept, matrix, matrix_matrix_prod >::const_reverse_iterator1, matrix_matrix_binary, matrix, matrix_matrix_prod >::const_reverse_iterator2>::constraints (); ScalarExpressionConcept, matrix_norm_1 > >::constraints (); ScalarExpressionConcept, matrix_norm_frobenius > >::constraints (); ScalarExpressionConcept, matrix_norm_inf > >::constraints (); #endif #ifdef EXTERNAL AdditiveAbelianGroupConcept::constraints (); CommutativeRingWithIdentityConcept::constraints (); FieldConcept::constraints (); VectorSpaceConcept >::constraints (); RingWithIdentityConcept >::constraints (0); VectorSpaceConcept >::constraints (); LinearOperatorConcept, matrix >::constraints (); AdditiveAbelianGroupConcept::constraints (); CommutativeRingWithIdentityConcept::constraints (); FieldConcept::constraints (); VectorSpaceConcept >::constraints (); RingWithIdentityConcept >::constraints (0); VectorSpaceConcept >::constraints (); LinearOperatorConcept, matrix >::constraints (); AdditiveAbelianGroupConcept >::constraints (); CommutativeRingWithIdentityConcept >::constraints (); FieldConcept >::constraints (); VectorSpaceConcept, vector > >::constraints (); RingWithIdentityConcept > >::constraints (0); VectorSpaceConcept, matrix > >::constraints (); LinearOperatorConcept, vector >, matrix > >::constraints (); AdditiveAbelianGroupConcept >::constraints (); CommutativeRingWithIdentityConcept >::constraints (); FieldConcept >::constraints (); VectorSpaceConcept, vector > >::constraints (); RingWithIdentityConcept > >::constraints (0); VectorSpaceConcept, matrix > >::constraints (); LinearOperatorConcept, vector >, matrix > >::constraints (); #endif } }}} #endif