diff --git a/include/boost/numeric/ublas/detail/concepts.hpp b/include/boost/numeric/ublas/detail/concepts.hpp new file mode 100644 index 00000000..14ba2e59 --- /dev/null +++ b/include/boost/numeric/ublas/detail/concepts.hpp @@ -0,0 +1,1655 @@ +// +// 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_H +#define BOOST_UBLAS_CONCEPTS_H + +#include + +// #define INTERNAL_STORAGE +// #define INTERNAL_STORAGE_SPARSE +// #define INTERNAL_VECTOR +// #define INTERNAL_VECTOR_PROXY +// #define INTERNAL_VECTOR_SPARSE +// #define INTERNAL_MATRIX +// #define INTERNAL_MATRIX_PROXY +// #define INTERNAL_BANDED +// #define INTERNAL_TRIANGULAR +// #define INTERNAL_SYMMETRIC +// #define INTERNAL_HERMITIAN +// #define INTERNAL_MATRIX_SPARSE +// #define INTERNAL_VECTOR_EXPRESSION +// #define INTERNAL_MATRIX_EXPRESSION + +// #define EXTERNAL + +// 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 iterator1_type; + typedef I2 iterator2_type; + + static void constraints () { + BidirectionalIteratorConcept::constraints (); + BidirectionalIteratorConcept::constraints (); + Indexed2DIteratorConcept::constraints (); + Indexed2DIteratorConcept::constraints (); + } + }; + + template + struct MutableIndexedBidirectional2DIteratorConcept { + typedef I1 iterator1_type; + typedef I2 iterator2_type; + + static void constraints () { + MutableBidirectionalIteratorConcept::constraints (); + MutableBidirectionalIteratorConcept::constraints (); + Indexed2DIteratorConcept::constraints (); + Indexed2DIteratorConcept::constraints (); + } + }; + + template + struct IndexedRandomAccess2DIteratorConcept { + typedef I1 iterator1_type; + typedef I2 iterator2_type; + + static void constraints () { + RandomAccessIteratorConcept::constraints (); + RandomAccessIteratorConcept::constraints (); + Indexed2DIteratorConcept::constraints (); + Indexed2DIteratorConcept::constraints (); + } + }; + + template + struct MutableIndexedRandomAccess2DIteratorConcept { + typedef I1 iterator1_type; + typedef I2 iterator2_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 () { + DefaultConstructibleConcept::constraints (); + 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 S scalar_type; + typedef typename S::value_type value_type; + + static void constraints () { + DefaultConstructibleConcept::constraints (); + scalar_type s = scalar_type (); + value_type t; + // Conversion + t = s; + ignore_unused_variable_warning (t); + } + }; + + template + struct VectorExpressionConcept { + typedef V vector_type; + typedef typename V::type_category type_category; + typedef typename V::size_type size_type; + typedef typename V::value_type value_type; + typedef typename V::const_iterator const_iterator_type; + typedef typename V::const_reverse_iterator const_reverse_iterator_type; + + static void constraints () { + DefaultConstructibleConcept::constraints (); + vector_type v = vector_type (); + 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 vector_type cv = vector_type (); + 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 V vector_type; + typedef typename V::size_type size_type; + typedef typename V::value_type value_type; + typedef typename V::iterator iterator_type; + typedef typename V::reverse_iterator reverse_iterator_type; + + static void constraints () { + AssignableConcept::constraints (vector_type ()); + VectorExpressionConcept::constraints (); + vector_type v = vector_type (), v1 = vector_type (), v2 = vector_type (); + 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 M matrix_type; + typedef typename M::type_category type_category; + typedef typename M::size_type size_type; + typedef typename M::value_type value_type; + typedef typename M::const_iterator1 const_iterator1_type; + typedef typename M::const_iterator2 const_iterator2_type; + typedef typename M::const_reverse_iterator1 const_reverse_iterator1_type; + typedef typename M::const_reverse_iterator2 const_reverse_iterator2_type; + + static void constraints () { + DefaultConstructibleConcept::constraints (); + matrix_type m = matrix_type (); + size_type n (0), i (0), j (0); + value_type t; + // Find (internal?) + const_iterator1_type cit1 (m.find1 (0, i, j)); + const_iterator2_type cit2 (m.find2 (0, i, j)); + // Beginning of range + const_iterator1_type cit1_begin (m.begin1 ()); + const_iterator2_type cit2_begin (m.begin2 ()); + // End of range + const_iterator1_type cit1_end (m.end1 ()); + const_iterator2_type cit2_end (m.end2 ()); + // Size + n = m.size1 (); + n = m.size2 (); + // Beginning of reverse range + const matrix_type cm = matrix_type (); + const_reverse_iterator1_type crit1_begin (cm.rbegin1 ()); + const_reverse_iterator2_type crit2_begin (cm.rbegin2 ()); + // End of reverse range + const_reverse_iterator1_type crit1_end (cm.rend1 ()); + const_reverse_iterator2_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 M matrix_type; + typedef typename M::size_type size_type; + typedef typename M::value_type value_type; + typedef typename M::iterator1 iterator1_type; + typedef typename M::iterator2 iterator2_type; + typedef typename M::reverse_iterator1 reverse_iterator1_type; + typedef typename M::reverse_iterator2 reverse_iterator2_type; + + static void constraints () { + AssignableConcept::constraints (matrix_type ()); + MatrixExpressionConcept::constraints (); + matrix_type m = matrix_type (), m1 = matrix_type (), m2 = matrix_type (); + size_type i (0), j (0); + value_type t = value_type (); + // Find (internal?) + iterator1_type it1 (m.find1 (0, i, j)); + iterator2_type it2 (m.find2 (0, i, j)); + // Beginning of range + iterator1_type it1_begin (m.begin1 ()); + iterator2_type it2_begin (m.begin2 ()); + // End of range + iterator1_type it1_end (m.end1 ()); + iterator2_type it2_end (m.end2 ()); + // Swap + m1.swap (m2); + // Beginning of reverse range + reverse_iterator1_type rit1_begin (m.rbegin1 ()); + reverse_iterator2_type rit2_begin (m.rbegin2 ()); + // End of reverse range + reverse_iterator1_type rit1_end (m.rend1 ()); + reverse_iterator2_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; + + static void constraints () { + VectorExpressionConcept::constraints (); + size_type n (0); + // Sizing constructor + vector_type v (n); + } + }; + + template + struct MutableVectorConcept { + typedef V vector_type; + typedef typename V::size_type size_type; + typedef typename V::value_type value_type; + + 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); + // Insert + v.insert (i, t); + // Erase + v.erase (i); + // Clear + v.clear (); + // Resize + v.resize (n); + } + }; + + template + struct MatrixConcept { + typedef M matrix_type; + typedef typename M::size_type size_type; + + static void constraints () { + MatrixExpressionConcept::constraints (); + size_type n (0); + // Sizing constructor + matrix_type m (n, n); + } + }; + + template + struct MutableMatrixConcept { + typedef M matrix_type; + typedef typename M::size_type size_type; + typedef typename M::value_type value_type; + + 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); + // Insert + m.insert (i, j, t); + // Erase + m.erase (i, j); + // Clear + m.clear (); + // Resize + m.resize (n, n); + m.resize (n, n, false); + } + }; + + 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 (); + } +#if !(defined(BOOST_MSVC) && BOOST_MSVC <= 1300) + 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 > (); + } +#endif + + 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 (); + } +#if !(defined(BOOST_MSVC) && BOOST_MSVC <= 1300) + 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 > (); + } +#endif + + template + bool + operator == (const vector_expression &e1, const vector_expression &e2) { + typedef BOOST_UBLAS_TYPENAME promote_traits::promote_type value_type; + typedef BOOST_UBLAS_TYPENAME type_traits::real_type real_type; + return norm_inf (e1 - e2) == real_type (0); + } + template + bool + operator == (const matrix_expression &e1, const matrix_expression &e2) { + typedef BOOST_UBLAS_TYPENAME promote_traits::promote_type value_type; + typedef BOOST_UBLAS_TYPENAME type_traits::real_type real_type; + return norm_inf (e1 - e2) == real_type (0); + } + + 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 () { + + // Storage Array +#if defined (INTERNAL) || defined (INTERNAL_STORAGE) + 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) || 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 (); + +#ifdef BOOST_UBLAS_DEPRACATED + StorageSparseConcept >::constraints (); + MutableStorageSparseConcept >::constraints (); + RandomAccessIteratorConcept::const_iterator>::constraints (); + MutableRandomAccessIteratorConcept::iterator>::constraints (); + + StorageSparseConcept >::constraints (); + MutableStorageSparseConcept >::constraints (); + BidirectionalIteratorConcept::const_iterator>::constraints (); + MutableBidirectionalIteratorConcept::iterator>::constraints (); +#endif + +#endif + + // Vector +#if defined (INTERNAL) || defined (INTERNAL_VECTOR) + VectorConcept >::constraints (); + MutableVectorConcept >::constraints (); + IndexedRandomAccess1DIteratorConcept::const_iterator>::constraints (); + MutableIndexedRandomAccess1DIteratorConcept::iterator>::constraints (); + IndexedRandomAccess1DIteratorConcept::const_reverse_iterator>::constraints (); + MutableIndexedRandomAccess1DIteratorConcept::reverse_iterator>::constraints (); + + VectorConcept >::constraints (); + IndexedRandomAccess1DIteratorConcept::const_iterator>::constraints (); + IndexedRandomAccess1DIteratorConcept::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) || 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) || defined (INTERNAL_VECTOR_SPARSE) + VectorConcept >::constraints (); + MutableVectorConcept >::constraints (); + IndexedBidirectional1DIteratorConcept::const_iterator>::constraints (); + MutableIndexedBidirectional1DIteratorConcept::iterator>::constraints (); + IndexedBidirectional1DIteratorConcept::const_reverse_iterator>::constraints (); + MutableIndexedBidirectional1DIteratorConcept::reverse_iterator>::constraints (); + + VectorConcept >::constraints (); + MutableVectorConcept >::constraints (); + IndexedBidirectional1DIteratorConcept::const_iterator>::constraints (); + MutableIndexedBidirectional1DIteratorConcept::iterator>::constraints (); + IndexedBidirectional1DIteratorConcept::const_reverse_iterator>::constraints (); + MutableIndexedBidirectional1DIteratorConcept::reverse_iterator>::constraints (); + + VectorConcept >::constraints (); + MutableVectorConcept >::constraints (); + IndexedBidirectional1DIteratorConcept::const_iterator>::constraints (); + MutableIndexedBidirectional1DIteratorConcept::iterator>::constraints (); + IndexedBidirectional1DIteratorConcept::const_reverse_iterator>::constraints (); + MutableIndexedBidirectional1DIteratorConcept::reverse_iterator>::constraints (); +#endif + + // Matrix +#if defined (INTERNAL) || defined (INTERNAL_MATRIX) + 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 (); + IndexedRandomAccess2DIteratorConcept::const_iterator1, + identity_matrix::const_iterator2>::constraints (); + IndexedRandomAccess2DIteratorConcept::const_reverse_iterator1, + identity_matrix::const_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 (); + 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) || 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) || 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) || 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 (INTERNAL) || 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) || 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) || defined (INTERNAL_MATRIX_SPARSE) + MatrixConcept >::constraints (); + MutableMatrixConcept >::constraints (); + IndexedBidirectional2DIteratorConcept::const_iterator1, + sparse_matrix::const_iterator2>::constraints (); + MutableIndexedBidirectional2DIteratorConcept::iterator1, + sparse_matrix::iterator2>::constraints (); + IndexedBidirectional2DIteratorConcept::const_reverse_iterator1, + sparse_matrix::const_reverse_iterator2>::constraints (); + MutableIndexedBidirectional2DIteratorConcept::reverse_iterator1, + sparse_matrix::reverse_iterator2>::constraints (); + + MatrixConcept >::constraints (); + MutableMatrixConcept >::constraints (); + IndexedBidirectional2DIteratorConcept::const_iterator1, + sparse_vector_of_sparse_vector::const_iterator2>::constraints (); + MutableIndexedBidirectional2DIteratorConcept::iterator1, + sparse_vector_of_sparse_vector::iterator2>::constraints (); + IndexedBidirectional2DIteratorConcept::const_reverse_iterator1, + sparse_vector_of_sparse_vector::const_reverse_iterator2>::constraints (); + MutableIndexedBidirectional2DIteratorConcept::reverse_iterator1, + sparse_vector_of_sparse_vector::reverse_iterator2>::constraints (); + + MatrixConcept >::constraints (); + MutableMatrixConcept >::constraints (); + IndexedBidirectional2DIteratorConcept::const_iterator1, + compressed_matrix::const_iterator2>::constraints (); + MutableIndexedBidirectional2DIteratorConcept::iterator1, + compressed_matrix::iterator2>::constraints (); + IndexedBidirectional2DIteratorConcept::const_reverse_iterator1, + compressed_matrix::const_reverse_iterator2>::constraints (); + MutableIndexedBidirectional2DIteratorConcept::reverse_iterator1, + compressed_matrix::reverse_iterator2>::constraints (); + + MatrixConcept >::constraints (); + MutableMatrixConcept >::constraints (); + IndexedBidirectional2DIteratorConcept::const_iterator1, + coordinate_matrix::const_iterator2>::constraints (); + MutableIndexedBidirectional2DIteratorConcept::iterator1, + coordinate_matrix::iterator2>::constraints (); + IndexedBidirectional2DIteratorConcept::const_reverse_iterator1, + coordinate_matrix::const_reverse_iterator2>::constraints (); + MutableIndexedBidirectional2DIteratorConcept::reverse_iterator1, + coordinate_matrix::reverse_iterator2>::constraints (); +#endif + + // Scalar Expressions +#if defined (INTERNAL) || defined (INTERNAL_VECTOR_EXPRESSION) + ScalarExpressionConcept >::constraints (); + ScalarExpressionConcept >::constraints (); + + // Vector Expressions +#ifndef BOOST_UBLAS_CT_REFERENCE_BASE_TYPEDEFS + VectorExpressionConcept > >::constraints (); + IndexedRandomAccess1DIteratorConcept >::const_iterator>::constraints (); + IndexedRandomAccess1DIteratorConcept >::const_reverse_iterator>::constraints (); +#endif + + 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, scalar_reference > >::constraints (); + IndexedRandomAccess1DIteratorConcept, scalar_multiplies, scalar_reference >::const_iterator>::constraints (); + IndexedRandomAccess1DIteratorConcept, scalar_multiplies, scalar_reference >::const_reverse_iterator>::constraints (); + + VectorExpressionConcept, scalar_value, scalar_multiplies, scalar_reference > >::constraints (); + IndexedRandomAccess1DIteratorConcept, scalar_value, scalar_multiplies, scalar_reference >::const_iterator>::constraints (); + IndexedRandomAccess1DIteratorConcept, scalar_value, scalar_multiplies, scalar_reference >::const_reverse_iterator>::constraints (); + + VectorExpressionConcept, vector, scalar_multiplies, scalar_reference > > >::constraints (); + IndexedRandomAccess1DIteratorConcept, vector, scalar_multiplies, scalar_reference > >::const_iterator>::constraints (); + IndexedRandomAccess1DIteratorConcept, vector, scalar_multiplies, scalar_reference > >::const_reverse_iterator>::constraints (); + + VectorExpressionConcept, scalar_value, scalar_multiplies, scalar_reference > > >::constraints (); + IndexedRandomAccess1DIteratorConcept, scalar_value, scalar_multiplies, scalar_reference > >::const_iterator>::constraints (); + IndexedRandomAccess1DIteratorConcept, scalar_value, scalar_multiplies, scalar_reference > >::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) || 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, scalar_reference > >::constraints (); + IndexedRandomAccess2DIteratorConcept, scalar_multiplies, scalar_reference >::const_iterator1, + matrix_binary_scalar1, scalar_multiplies, scalar_reference >::const_iterator2>::constraints (); + IndexedRandomAccess2DIteratorConcept, scalar_multiplies, scalar_reference >::const_reverse_iterator1, + matrix_binary_scalar1, scalar_multiplies, scalar_reference >::const_reverse_iterator2>::constraints (); + + MatrixExpressionConcept, double, scalar_multiplies, scalar_reference > >::constraints (); + IndexedRandomAccess2DIteratorConcept, double, scalar_multiplies, scalar_reference >::const_iterator1, + matrix_binary_scalar2, double, scalar_multiplies, scalar_reference >::const_iterator2>::constraints (); + IndexedRandomAccess2DIteratorConcept, double, scalar_multiplies, scalar_reference >::const_reverse_iterator1, + matrix_binary_scalar2, double, scalar_multiplies, scalar_reference >::const_reverse_iterator2>::constraints (); + + MatrixExpressionConcept, matrix, scalar_multiplies, scalar_reference > > >::constraints (); + IndexedRandomAccess2DIteratorConcept, matrix, scalar_multiplies, scalar_reference > >::const_iterator1, + matrix_binary_scalar1, matrix, scalar_multiplies, scalar_reference > >::const_iterator2>::constraints (); + IndexedRandomAccess2DIteratorConcept, matrix, scalar_multiplies, scalar_reference > >::const_reverse_iterator1, + matrix_binary_scalar1, matrix, scalar_multiplies, scalar_reference > >::const_reverse_iterator2>::constraints (); + + MatrixExpressionConcept, scalar_value, scalar_multiplies, scalar_reference > > >::constraints (); + IndexedRandomAccess2DIteratorConcept, scalar_value, scalar_multiplies, scalar_reference > >::const_iterator1, + matrix_binary_scalar2, scalar_value, scalar_multiplies, scalar_reference > >::const_iterator2>::constraints (); + IndexedRandomAccess2DIteratorConcept, scalar_value, scalar_multiplies, scalar_reference > >::const_reverse_iterator1, + matrix_binary_scalar2, scalar_value, scalar_multiplies, scalar_reference > >::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 (); + +#if !(defined(BOOST_MSVC) && BOOST_MSVC <= 1300) + 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 + } + +}}} + +#endif diff --git a/include/boost/numeric/ublas/documentation.hpp b/include/boost/numeric/ublas/detail/documentation.hpp similarity index 100% rename from include/boost/numeric/ublas/documentation.hpp rename to include/boost/numeric/ublas/detail/documentation.hpp