/usr/include/boost/numeric/ublas/detail
Edit: /usr/include/boost/numeric/ublas/detail/concepts.hpp (71037B)
//
// Copyright (c) 2000-2002
// Joerg Walter, Mathias Koch
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// 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 Indexed1DIteratorConcept {
typedef I iterator_type;
void constraints () {
iterator_type it = iterator_type ();
// Index
it.index ();
}
};
template
struct IndexedBidirectional1DIteratorConcept {
typedef I iterator_type;
void constraints () {
function_requires< BidirectionalIteratorConcept >();
function_requires< Indexed1DIteratorConcept >();
}
};
template
struct Mutable_IndexedBidirectional1DIteratorConcept {
typedef I iterator_type;
void constraints () {
function_requires< Mutable_BidirectionalIteratorConcept >();
function_requires< Indexed1DIteratorConcept >();
}
};
template
struct IndexedRandomAccess1DIteratorConcept {
typedef I iterator_type;
void constraints () {
function_requires< RandomAccessIteratorConcept >();
function_requires< Indexed1DIteratorConcept >();
}
};
template
struct Mutable_IndexedRandomAccess1DIteratorConcept {
typedef I iterator_type;
void constraints () {
function_requires< Mutable_RandomAccessIteratorConcept >();
function_requires< Indexed1DIteratorConcept >();
}
};
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;
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;
void constraints () {
function_requires< BidirectionalIteratorConcept >();
function_requires< BidirectionalIteratorConcept >();
function_requires< Indexed2DIteratorConcept >();
function_requires< Indexed2DIteratorConcept >();
}
};
template
struct Mutable_IndexedBidirectional2DIteratorConcept {
typedef I1 subiterator1_type;
typedef I2 subiterator2_type;
void constraints () {
function_requires< Mutable_BidirectionalIteratorConcept >();
function_requires< Mutable_BidirectionalIteratorConcept >();
function_requires< Indexed2DIteratorConcept >();
function_requires< Indexed2DIteratorConcept >();
}
};
template
struct IndexedRandomAccess2DIteratorConcept {
typedef I1 subiterator1_type;
typedef I2 subiterator2_type;
void constraints () {
function_requires< RandomAccessIteratorConcept >();
function_requires< RandomAccessIteratorConcept >();
function_requires< Indexed2DIteratorConcept >();
function_requires< Indexed2DIteratorConcept >();
}
};
template
struct Mutable_IndexedRandomAccess2DIteratorConcept {
typedef I1 subiterator1_type;
typedef I2 subiterator2_type;
void constraints () {
function_requires< Mutable_RandomAccessIteratorConcept >();
function_requires< Mutable_RandomAccessIteratorConcept >();
function_requires< Indexed2DIteratorConcept >();
function_requires< Indexed2DIteratorConcept >();
}
};
template
struct StorageArrayConcept {
typedef C container_type;
typedef typename C::size_type size_type;
typedef typename C::value_type value_type;
void constraints () {
function_requires< RandomAccessContainerConcept >();
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 Mutable_StorageArrayConcept {
typedef C container_type;
typedef typename C::size_type size_type;
typedef typename C::value_type value_type;
typedef typename C::iterator iterator_type;
void constraints () {
function_requires< Mutable_RandomAccessContainerConcept > ();
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;
void constraints () {
function_requires< ReversibleContainerConcept > ();
}
};
template
struct Mutable_StorageSparseConcept {
typedef C container_type;
typedef typename C::size_type size_type;
typedef typename C::value_type value_type;
typedef typename C::iterator iterator_type;
void constraints () {
// NOTE - Not Mutable_ReversibleContainerConcept
function_requires< ReversibleContainerConcept >();
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;
void constraints () {
function_requires< AssignableConcept >();
function_requires< ReversibleContainerConcept >();
generator_type g = generator_type ();
size_type n (0);
value_type t;
// Element access
t = g (n);
ignore_unused_variable_warning (t);
}
};
/** \brief Scalar expression concept.
*
* requirements
* \li \c SE::value_type is the type of the scalar expression
* \li \c SE must be convertable to \c SE::value_type
* \li the constant \c SE::complexity must exist
*
* \param SE the type of the scalar expression
*/
template
struct ScalarExpressionConcept {
typedef SE scalar_expression_type;
typedef typename SE::value_type value_type;
static const unsigned complexity = SE::complexity;
void constraints () {
scalar_expression_type *sp;
scalar_expression_type s = *sp;
value_type t;
// Conversion
t = s;
ignore_unused_variable_warning (t);
}
};
/** \brief Vector expression concept.
*
* requirements
* \li \c VE::value_type is the type of the elements
* \li \c VE::const_reference The return type when accessing an element of a constant vector
* expression. Must be convertable to a \c value_type.
* \li \c VE::size_type is the (unsigned) type of the indices
* \li \c VE::difference_type is the (signed) type of distances between indices
* \li \c VE::category
*
* \li the constant \c SE::complexity must exist
*
* \param SE the type of the scalar expression
*/
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::difference_type difference_type;
typedef typename VE::value_type value_type;
typedef typename VE::const_reference const_reference;
typedef typename VE::const_iterator const_iterator_type;
typedef typename VE::const_reverse_iterator const_reverse_iterator_type;
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 Mutable_VectorExpressionConcept {
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;
void constraints () {
function_requires< AssignableConcept >();
function_requires< VectorExpressionConcept >();
vector_expression_type *vp;
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;
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 Mutable_MatrixExpressionConcept {
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;
void constraints () {
function_requires< AssignableConcept >();
function_requires< MatrixExpressionConcept >();
matrix_expression_type *mp;
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;
void constraints () {
function_requires< VectorExpressionConcept >();
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 Mutable_VectorConcept {
typedef V vector_type;
typedef typename V::size_type size_type;
typedef typename V::value_type value_type;
typedef value_type *pointer;
void constraints () {
function_requires< VectorConcept >();
function_requires< DefaultConstructible >();
function_requires< Mutable_VectorExpressionConcept >();
size_type n (0);
value_type t = value_type ();
size_type i (0);
vector_type v;
// 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;
void constraints () {
function_requires< VectorConcept >();
}
};
template
struct Mutable_SparseVectorConcept {
typedef V vector_type;
typedef typename V::size_type size_type;
typedef typename V::value_type value_type;
void constraints () {
function_requires< SparseVectorConcept >();
function_requires< Mutable_VectorConcept >();
size_type i (0);
vector_type v;
// 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;
void constraints () {
function_requires< MatrixExpressionConcept >();
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 Mutable_MatrixConcept {
typedef M matrix_type;
typedef typename M::size_type size_type;
typedef typename M::value_type value_type;
typedef value_type *pointer;
void constraints () {
function_requires< MatrixConcept >();
function_requires< DefaultConstructible >();
function_requires< Mutable_MatrixExpressionConcept >();
size_type n (0);
value_type t = value_type ();
size_type i (0), j (0);
matrix_type m;
// 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;
void constraints () {
function_requires< MatrixConcept >();
}
};
template
struct Mutable_SparseMatrixConcept {
typedef M matrix_type;
typedef typename M::size_type size_type;
typedef typename M::value_type value_type;
void constraints () {
function_requires< SparseMatrixConcept >();
function_requires< Mutable_MatrixConcept >();
size_type i (0), j (0);
matrix_type m;
// Elemnent erasure
m.erase_element (i, j);
}
};
/** introduce anonymous namespace to make following functions
* local to the current compilation unit.
*/
namespace {
// Replaced the ZeroElement and OneElement functions with the templated versions
// because the former where giving warnings with clang
template
T
ZeroElement (T) {
return static_cast (0);
}
template
vector
ZeroElement (vector) {
return zero_vector ();
}
template
matrix
ZeroElement (matrix) {
return zero_matrix ();
}
template
T
OneElement (T) {
return static_cast (1);
}
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;
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;
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;
void constraints () {
function_requires< AdditiveAbelianGroupConcept >();
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);
}
};
template
struct Prod_RingWithIdentityConcept {
typedef T value_type;
void constraints () {
function_requires< AdditiveAbelianGroupConcept >();
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;
void constraints () {
function_requires< RingWithIdentityConcept >();
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;
void constraints () {
function_requires< CommutativeRingWithIdentityConcept >();
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;
void constraints () {
function_requires< FieldConcept >();
function_requires< AdditiveAbelianGroupConcept >();
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;
void constraints () {
function_requires< VectorSpaceConcept >();
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);
}
};
inline 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
// TODO enable this for development
// #define VIEW_CONCEPTS
// Element value type for tests
typedef float T;
// Storage Array
#if defined (INTERNAL_STORAGE) || defined (INTERNAL_STORAGE_DENSE)
{
typedef std::vector container_model;
function_requires< Mutable_StorageArrayConcept >();
function_requires< RandomAccessIteratorConcept >();
function_requires< Mutable_RandomAccessIteratorConcept >();
}
{
typedef bounded_array container_model;
function_requires< Mutable_StorageArrayConcept >();
function_requires< RandomAccessIteratorConcept >();
function_requires< Mutable_RandomAccessIteratorConcept >();
}
{
typedef unbounded_array container_model;
function_requires< Mutable_StorageArrayConcept >();
function_requires< RandomAccessIteratorConcept >();
function_requires< Mutable_RandomAccessIteratorConcept >();
}
/* FIXME array_adaptors are in progress
{
typedef array_adaptor container_model;
function_requires< Mutable_StorageArrayConcept >();
function_requires< RandomAccessIteratorConcept >();
function_requires< Mutable_RandomAccessIteratorConcept >();
}
*/
{
typedef range container_model;
function_requires< IndexSetConcept >();
function_requires< RandomAccessIteratorConcept >();
}
{
typedef slice container_model;
function_requires< IndexSetConcept >();
function_requires< RandomAccessIteratorConcept >();
}
{
typedef indirect_array<> container_model;
function_requires< IndexSetConcept >();
function_requires< RandomAccessIteratorConcept >();
}
#endif
// Storage Sparse
#if defined (INTERNAL_STORAGE) || defined (INTERNAL_STORAGE_SPARSE)
{
typedef map_array container_model;
function_requires< Mutable_StorageSparseConcept >();
function_requires< RandomAccessIteratorConcept >();
function_requires< RandomAccessIteratorConcept >();
}
{
typedef std::map container_model;
function_requires< Mutable_StorageSparseConcept >();
function_requires< BidirectionalIteratorConcept >();
function_requires< BidirectionalIteratorConcept >();
}
#endif
#ifdef VIEW_CONCEPTS
// read only vectors
{
typedef vector_view container_model;
function_requires< RandomAccessContainerConcept >();
function_requires< VectorConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
}
#endif
// Vector
#if defined (INTERNAL_VECTOR) || defined (INTERNAL_VECTOR_DENSE)
{
typedef vector container_model;
function_requires< RandomAccessContainerConcept >();
function_requires< Mutable_VectorConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >();
}
{
typedef zero_vector container_model;
function_requires< VectorConcept >();
function_requires< IndexedBidirectional1DIteratorConcept >();
function_requires< IndexedBidirectional1DIteratorConcept >();
}
{
typedef unit_vector container_model;
function_requires< VectorConcept >();
function_requires< IndexedBidirectional1DIteratorConcept >();
function_requires< IndexedBidirectional1DIteratorConcept >();
}
{
typedef scalar_vector container_model;
function_requires< VectorConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
}
{
typedef c_vector container_model;
function_requires< Mutable_VectorConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >();
}
#endif
// Vector Proxies
#if defined (INTERNAL_VECTOR) || defined (INTERNAL_VECTOR_PROXY)
{
typedef vector_range > container_model;
function_requires< Mutable_VectorExpressionConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >();
}
{
typedef vector_slice > container_model;
function_requires< Mutable_VectorExpressionConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >();
}
{
typedef vector_indirect > container_model;
function_requires< Mutable_VectorExpressionConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >();
}
#endif
// Sparse Vector
#if defined (INTERNAL_SPARSE) || defined (INTERNAL_VECTOR_SPARSE)
{
typedef mapped_vector container_model;
function_requires< Mutable_SparseVectorConcept >();
function_requires< IndexedBidirectional1DIteratorConcept >();
function_requires< Mutable_IndexedBidirectional1DIteratorConcept >();
function_requires< IndexedBidirectional1DIteratorConcept >();
function_requires< Mutable_IndexedBidirectional1DIteratorConcept >();
}
{
typedef compressed_vector container_model;
function_requires< Mutable_SparseVectorConcept >();
function_requires< IndexedBidirectional1DIteratorConcept >();
function_requires< Mutable_IndexedBidirectional1DIteratorConcept >();
function_requires< IndexedBidirectional1DIteratorConcept >();
function_requires< Mutable_IndexedBidirectional1DIteratorConcept >();
}
{
typedef coordinate_vector container_model;
function_requires< Mutable_SparseVectorConcept >();
function_requires< IndexedBidirectional1DIteratorConcept >();
function_requires< Mutable_IndexedBidirectional1DIteratorConcept >();
function_requires< IndexedBidirectional1DIteratorConcept >();
function_requires< Mutable_IndexedBidirectional1DIteratorConcept >();
}
#endif
// Matrix
#if defined (INTERNAL_MATRIX) || defined (INTERNAL_MATRIX_DENSE)
{
typedef matrix container_model;
function_requires< Mutable_MatrixConcept > >();
function_requires< IndexedRandomAccess2DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >();
function_requires< IndexedRandomAccess2DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >();
}
{
typedef vector_of_vector container_model;
function_requires< Mutable_MatrixConcept > >();
function_requires< IndexedRandomAccess2DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >();
function_requires< IndexedRandomAccess2DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >();
}
{
typedef zero_matrix container_model;
function_requires< Mutable_MatrixConcept > >();
function_requires< IndexedBidirectional2DIteratorConcept >();
function_requires< IndexedBidirectional2DIteratorConcept >();
}
{
typedef identity_matrix container_model;
function_requires< Mutable_MatrixConcept > >();
function_requires< IndexedBidirectional2DIteratorConcept >();
function_requires< IndexedBidirectional2DIteratorConcept >();
}
{
typedef scalar_matrix container_model;
function_requires< Mutable_MatrixConcept > >();
function_requires< IndexedRandomAccess2DIteratorConcept >();
function_requires< IndexedRandomAccess2DIteratorConcept >();
}
{
typedef c_matrix container_model;
function_requires< Mutable_MatrixConcept > >();
function_requires< IndexedRandomAccess2DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >();
function_requires< IndexedRandomAccess2DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess2DIteratorConcept >();
}
#endif
// Matrix Proxies
#if defined (INTERNAL_MATRIX) || defined (INTERNAL_MATRIX_PROXY)
{
typedef matrix_row > container_model;
function_requires< Mutable_VectorExpressionConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept >();
}
{
typedef matrix_column > container_model;
function_requires< Mutable_VectorExpressionConcept >();
function_requires< IndexedRandomAccess1DIteratorConcept >();
function_requires< Mutable_IndexedRandomAccess1DIteratorConcept