123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575 |
- //
- // 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 <boost/concept_check.hpp>
- // Concept checks based on ideas of Jeremy Siek
- namespace boost { namespace numeric { namespace ublas {
- template<class I>
- struct Indexed1DIteratorConcept {
- typedef I iterator_type;
- void constraints () {
- iterator_type it = iterator_type ();
- // Index
- it.index ();
- }
- };
- template<class I>
- struct IndexedBidirectional1DIteratorConcept {
- typedef I iterator_type;
- void constraints () {
- function_requires< BidirectionalIteratorConcept<iterator_type> >();
- function_requires< Indexed1DIteratorConcept<iterator_type> >();
- }
- };
- template<class I>
- struct Mutable_IndexedBidirectional1DIteratorConcept {
- typedef I iterator_type;
- void constraints () {
- function_requires< Mutable_BidirectionalIteratorConcept<iterator_type> >();
- function_requires< Indexed1DIteratorConcept<iterator_type> >();
- }
- };
- template<class I>
- struct IndexedRandomAccess1DIteratorConcept {
- typedef I iterator_type;
- void constraints () {
- function_requires< RandomAccessIteratorConcept<iterator_type> >();
- function_requires< Indexed1DIteratorConcept<iterator_type> >();
- }
- };
- template<class I>
- struct Mutable_IndexedRandomAccess1DIteratorConcept {
- typedef I iterator_type;
- void constraints () {
- function_requires< Mutable_RandomAccessIteratorConcept<iterator_type> >();
- function_requires< Indexed1DIteratorConcept<iterator_type> >();
- }
- };
- template<class I>
- 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<class I1, class I2>
- struct IndexedBidirectional2DIteratorConcept {
- typedef I1 subiterator1_type;
- typedef I2 subiterator2_type;
- void constraints () {
- function_requires< BidirectionalIteratorConcept<subiterator1_type> >();
- function_requires< BidirectionalIteratorConcept<subiterator2_type> >();
- function_requires< Indexed2DIteratorConcept<subiterator1_type> >();
- function_requires< Indexed2DIteratorConcept<subiterator2_type> >();
- }
- };
- template<class I1, class I2>
- struct Mutable_IndexedBidirectional2DIteratorConcept {
- typedef I1 subiterator1_type;
- typedef I2 subiterator2_type;
- void constraints () {
- function_requires< Mutable_BidirectionalIteratorConcept<subiterator1_type> >();
- function_requires< Mutable_BidirectionalIteratorConcept<subiterator2_type> >();
- function_requires< Indexed2DIteratorConcept<subiterator1_type> >();
- function_requires< Indexed2DIteratorConcept<subiterator2_type> >();
- }
- };
- template<class I1, class I2>
- struct IndexedRandomAccess2DIteratorConcept {
- typedef I1 subiterator1_type;
- typedef I2 subiterator2_type;
- void constraints () {
- function_requires< RandomAccessIteratorConcept<subiterator1_type> >();
- function_requires< RandomAccessIteratorConcept<subiterator2_type> >();
- function_requires< Indexed2DIteratorConcept<subiterator1_type> >();
- function_requires< Indexed2DIteratorConcept<subiterator2_type> >();
- }
- };
- template<class I1, class I2>
- struct Mutable_IndexedRandomAccess2DIteratorConcept {
- typedef I1 subiterator1_type;
- typedef I2 subiterator2_type;
- void constraints () {
- function_requires< Mutable_RandomAccessIteratorConcept<subiterator1_type> >();
- function_requires< Mutable_RandomAccessIteratorConcept<subiterator2_type> >();
- function_requires< Indexed2DIteratorConcept<subiterator1_type> >();
- function_requires< Indexed2DIteratorConcept<subiterator2_type> >();
- }
- };
- template<class C>
- 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<container_type> >();
- 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<class C>
- 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<container_type> > ();
- 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<class C>
- struct StorageSparseConcept {
- typedef C container_type;
- typedef typename C::size_type size_type;
- void constraints () {
- function_requires< ReversibleContainerConcept<container_type> > ();
- }
- };
- template<class C>
- 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> >();
- 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<class G>
- 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<generator_type> >();
- function_requires< ReversibleContainerConcept<generator_type> >();
- 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<class SE>
- 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<class VE>
- 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<class VE>
- 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<vector_expression_type> >();
- function_requires< VectorExpressionConcept<vector_expression_type> >();
- 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<class ME>
- 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<class ME>
- 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<matrix_expression_type> >();
- function_requires< MatrixExpressionConcept<matrix_expression_type> >();
- 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<class V>
- 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<vector_type> >();
- 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<class V>
- 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<vector_type> >();
- function_requires< DefaultConstructible<vector_type> >();
- function_requires< Mutable_VectorExpressionConcept<vector_type> >();
- 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<class V>
- struct SparseVectorConcept {
- typedef V vector_type;
- typedef typename V::size_type size_type;
- void constraints () {
- function_requires< VectorConcept<vector_type> >();
- }
- };
- template<class V>
- 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<vector_type> >();
- function_requires< Mutable_VectorConcept<vector_type> >();
- size_type i (0);
- vector_type v;
- // Element erasure
- v.erase_element (i);
- }
- };
- template<class M>
- 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<matrix_type> >();
- 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<class M>
- 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<matrix_type> >();
- function_requires< DefaultConstructible<matrix_type> >();
- function_requires< Mutable_MatrixExpressionConcept<matrix_type> >();
- 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<class M>
- struct SparseMatrixConcept {
- typedef M matrix_type;
- typedef typename M::size_type size_type;
- void constraints () {
- function_requires< MatrixConcept<matrix_type> >();
- }
- };
- template<class M>
- 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<matrix_type> >();
- function_requires< Mutable_MatrixConcept<matrix_type> >();
- 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<class T>
- T
- ZeroElement (T) {
- return T(0.0);
- }
- template<class T>
- vector<T>
- ZeroElement (vector<T>) {
- return zero_vector<T> ();
- }
- template<class T>
- matrix<T>
- ZeroElement (matrix<T>) {
- return zero_matrix<T> ();
- }
- template<class T>
- T
- OneElement (T) {
- return T(0.0);
- }
- template<class T>
- vector<T>
- OneElement (vector<T>) {
- return zero_vector<T> ();
- }
- template<class T>
- matrix<T>
- OneElement (matrix<T>) {
- return identity_matrix<T> ();
- }
- // template<>
- // float
- // ZeroElement (float) {
- // return 0.f;
- // }
- // template<>
- // double
- // ZeroElement (double) {
- // return 0.;
- // }
- // template<>
- // vector<float>
- // ZeroElement (vector<float>) {
- // return zero_vector<float> ();
- // }
- // template<>
- // vector<double>
- // ZeroElement (vector<double>) {
- // return zero_vector<double> ();
- // }
- // template<>
- // matrix<float>
- // ZeroElement (matrix<float>) {
- // return zero_matrix<float> ();
- // }
- // template<>
- // matrix<double>
- // ZeroElement (matrix<double>) {
- // return zero_matrix<double> ();
- // }
- // template<>
- // std::complex<float>
- // ZeroElement (std::complex<float>) {
- // return std::complex<float> (0.f);
- // }
- // template<>
- // std::complex<double>
- // ZeroElement (std::complex<double>) {
- // return std::complex<double> (0.);
- // }
- // template<>
- // vector<std::complex<float> >
- // ZeroElement (vector<std::complex<float> >) {
- // return zero_vector<std::complex<float> > ();
- // }
- // template<>
- // vector<std::complex<double> >
- // ZeroElement (vector<std::complex<double> >) {
- // return zero_vector<std::complex<double> > ();
- // }
- // template<>
- // matrix<std::complex<float> >
- // ZeroElement (matrix<std::complex<float> >) {
- // return zero_matrix<std::complex<float> > ();
- // }
- // template<>
- // matrix<std::complex<double> >
- // ZeroElement (matrix<std::complex<double> >) {
- // return zero_matrix<std::complex<double> > ();
- // }
- // template<class T>
- // T
- // OneElement (T);
- // template<>
- // float
- // OneElement (float) {
- // return 1.f;
- // }
- // template<>
- // double
- // OneElement (double) {
- // return 1.;
- // }
- // template<>
- // matrix<float>
- // OneElement (matrix<float>) {
- // return identity_matrix<float> ();
- // }
- // template<>
- // matrix<double>
- // OneElement (matrix<double>) {
- // return identity_matrix<double> ();
- // }
- // template<>
- // std::complex<float>
- // OneElement (std::complex<float>) {
- // return std::complex<float> (1.f);
- // }
- // template<>
- // std::complex<double>
- // OneElement (std::complex<double>) {
- // return std::complex<double> (1.);
- // }
- // template<>
- // matrix<std::complex<float> >
- // OneElement (matrix<std::complex<float> >) {
- // return identity_matrix<std::complex<float> > ();
- // }
- // template<>
- // matrix<std::complex<double> >
- // OneElement (matrix<std::complex<double> >) {
- // return identity_matrix<std::complex<double> > ();
- // }
- template<class E1, class E2>
- bool
- operator == (const vector_expression<E1> &e1, const vector_expression<E2> &e2) {
- typedef typename promote_traits<typename E1::value_type,
- typename E2::value_type>::promote_type value_type;
- typedef typename type_traits<value_type>::real_type real_type;
- return norm_inf (e1 - e2) == real_type/*zero*/();
- }
- template<class E1, class E2>
- bool
- operator == (const matrix_expression<E1> &e1, const matrix_expression<E2> &e2) {
- typedef typename promote_traits<typename E1::value_type,
- typename E2::value_type>::promote_type value_type;
- typedef typename type_traits<value_type>::real_type real_type;
- return norm_inf (e1 - e2) == real_type/*zero*/();
- }
- template<class T>
- 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<class T>
- 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<class T>
- struct RingWithIdentityConcept {
- typedef T value_type;
- void constraints () {
- function_requires< AdditiveAbelianGroupConcept<value_type> >();
- 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<class T>
- struct Prod_RingWithIdentityConcept {
- typedef T value_type;
- void constraints () {
- function_requires< AdditiveAbelianGroupConcept<value_type> >();
- 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<class T>
- struct CommutativeRingWithIdentityConcept {
- typedef T value_type;
- void constraints () {
- function_requires< RingWithIdentityConcept<value_type> >();
- bool r;
- value_type a = value_type (), b = value_type ();
- r = a * b == b * a;
- ignore_unused_variable_warning (r);
- }
- };
- template<class T>
- struct FieldConcept {
- typedef T value_type;
- void constraints () {
- function_requires< CommutativeRingWithIdentityConcept<value_type> >();
- 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<class T, class V>
- struct VectorSpaceConcept {
- typedef T value_type;
- typedef V vector_type;
- void constraints () {
- function_requires< FieldConcept<value_type> >();
- function_requires< AdditiveAbelianGroupConcept<vector_type> >();
- 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<class T, class V, class M>
- struct LinearOperatorConcept {
- typedef T value_type;
- typedef V vector_type;
- typedef M matrix_type;
- void constraints () {
- function_requires< VectorSpaceConcept<value_type, vector_type> >();
- 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<T> container_model;
- function_requires< Mutable_StorageArrayConcept<container_model> >();
- function_requires< RandomAccessIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_RandomAccessIteratorConcept<container_model::iterator> >();
- }
- {
- typedef bounded_array<T, 1> container_model;
- function_requires< Mutable_StorageArrayConcept<container_model> >();
- function_requires< RandomAccessIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_RandomAccessIteratorConcept<container_model::iterator> >();
- }
- {
- typedef unbounded_array<T> container_model;
- function_requires< Mutable_StorageArrayConcept<container_model> >();
- function_requires< RandomAccessIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_RandomAccessIteratorConcept<container_model::iterator> >();
- }
- /* FIXME array_adaptors are in progress
- {
- typedef array_adaptor<T> container_model;
- function_requires< Mutable_StorageArrayConcept<container_model> >();
- function_requires< RandomAccessIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_RandomAccessIteratorConcept<container_model::iterator> >();
- }
- */
- {
- typedef range container_model;
- function_requires< IndexSetConcept<range> >();
- function_requires< RandomAccessIteratorConcept<range::const_iterator> >();
- }
- {
- typedef slice container_model;
- function_requires< IndexSetConcept<range> >();
- function_requires< RandomAccessIteratorConcept<range::const_iterator> >();
- }
- {
- typedef indirect_array<> container_model;
- function_requires< IndexSetConcept<range> >();
- function_requires< RandomAccessIteratorConcept<range::const_iterator> >();
- }
- #endif
- // Storage Sparse
- #if defined (INTERNAL_STORAGE) || defined (INTERNAL_STORAGE_SPARSE)
- {
- typedef map_array<std::size_t, T> container_model;
- function_requires< Mutable_StorageSparseConcept<container_model> >();
- function_requires< RandomAccessIteratorConcept<container_model::const_iterator> >();
- function_requires< RandomAccessIteratorConcept<container_model::iterator> >();
- }
- {
- typedef std::map<std::size_t, T> container_model;
- function_requires< Mutable_StorageSparseConcept<container_model > >();
- function_requires< BidirectionalIteratorConcept<container_model::const_iterator> >();
- function_requires< BidirectionalIteratorConcept<container_model::iterator> >();
- }
- #endif
- #ifdef VIEW_CONCEPTS
- // read only vectors
- {
- typedef vector_view<T> container_model;
- function_requires< RandomAccessContainerConcept<container_model> >();
- function_requires< VectorConcept<container_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_reverse_iterator> >();
- }
- #endif
- // Vector
- #if defined (INTERNAL_VECTOR) || defined (INTERNAL_VECTOR_DENSE)
- {
- typedef vector<T> container_model;
- function_requires< RandomAccessContainerConcept<container_model> >();
- function_requires< Mutable_VectorConcept<container_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::reverse_iterator> >();
- }
- {
- typedef zero_vector<T> container_model;
- function_requires< VectorConcept<container_model> >();
- function_requires< IndexedBidirectional1DIteratorConcept<container_model::const_iterator> >();
- function_requires< IndexedBidirectional1DIteratorConcept<container_model::const_reverse_iterator> >();
- }
- {
- typedef unit_vector<T> container_model;
- function_requires< VectorConcept<container_model> >();
- function_requires< IndexedBidirectional1DIteratorConcept<container_model::const_iterator> >();
- function_requires< IndexedBidirectional1DIteratorConcept<container_model::const_reverse_iterator> >();
- }
- {
- typedef scalar_vector<T> container_model;
- function_requires< VectorConcept<container_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_reverse_iterator> >();
- }
- {
- typedef c_vector<T, 1> container_model;
- function_requires< Mutable_VectorConcept<container_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::reverse_iterator> >();
- }
- #endif
- // Vector Proxies
- #if defined (INTERNAL_VECTOR) || defined (INTERNAL_VECTOR_PROXY)
- {
- typedef vector_range<vector<T> > container_model;
- function_requires< Mutable_VectorExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::reverse_iterator> >();
- }
- {
- typedef vector_slice<vector<T> > container_model;
- function_requires< Mutable_VectorExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::reverse_iterator> >();
- }
- {
- typedef vector_indirect<vector<T> > container_model;
- function_requires< Mutable_VectorExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::reverse_iterator> >();
- }
- #endif
- // Sparse Vector
- #if defined (INTERNAL_SPARSE) || defined (INTERNAL_VECTOR_SPARSE)
- {
- typedef mapped_vector<T> container_model;
- function_requires< Mutable_SparseVectorConcept<container_model> >();
- function_requires< IndexedBidirectional1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedBidirectional1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedBidirectional1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedBidirectional1DIteratorConcept<container_model::reverse_iterator> >();
- }
- {
- typedef compressed_vector<T> container_model;
- function_requires< Mutable_SparseVectorConcept<container_model> >();
- function_requires< IndexedBidirectional1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedBidirectional1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedBidirectional1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedBidirectional1DIteratorConcept<container_model::reverse_iterator> >();
- }
- {
- typedef coordinate_vector<T> container_model;
- function_requires< Mutable_SparseVectorConcept<container_model> >();
- function_requires< IndexedBidirectional1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedBidirectional1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedBidirectional1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedBidirectional1DIteratorConcept<container_model::reverse_iterator> >();
- }
- #endif
- // Matrix
- #if defined (INTERNAL_MATRIX) || defined (INTERNAL_MATRIX_DENSE)
- {
- typedef matrix<T> container_model;
- function_requires< Mutable_MatrixConcept<matrix<T> > >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- {
- typedef vector_of_vector<T> container_model;
- function_requires< Mutable_MatrixConcept<matrix<T> > >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- {
- typedef zero_matrix<T> container_model;
- function_requires< Mutable_MatrixConcept<matrix<T> > >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- }
- {
- typedef identity_matrix<T> container_model;
- function_requires< Mutable_MatrixConcept<matrix<T> > >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- }
- {
- typedef scalar_matrix<T> container_model;
- function_requires< Mutable_MatrixConcept<matrix<T> > >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- }
- {
- typedef c_matrix<T, 1, 1> container_model;
- function_requires< Mutable_MatrixConcept<matrix<T> > >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- #endif
- // Matrix Proxies
- #if defined (INTERNAL_MATRIX) || defined (INTERNAL_MATRIX_PROXY)
- {
- typedef matrix_row<matrix<T> > container_model;
- function_requires< Mutable_VectorExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::reverse_iterator> >();
- }
- {
- typedef matrix_column<matrix<T> > container_model;
- function_requires< Mutable_VectorExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::reverse_iterator> >();
- }
- {
- typedef matrix_vector_range<matrix<T> > container_model;
- function_requires< Mutable_VectorExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::reverse_iterator> >();
- }
- {
- typedef matrix_vector_slice<matrix<T> > container_model;
- function_requires< Mutable_VectorExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::reverse_iterator> >();
- }
- {
- typedef matrix_vector_indirect<matrix<T> > container_model;
- function_requires< Mutable_VectorExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<container_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<container_model::reverse_iterator> >();
- }
- {
- typedef matrix_range<matrix<T> > container_model;
- function_requires< Mutable_MatrixExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- {
- typedef matrix_slice<matrix<T> > container_model;
- function_requires< Mutable_MatrixExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- {
- typedef matrix_indirect<matrix<T> > container_model;
- function_requires< Mutable_MatrixExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- #endif
- // Banded Matrix
- #if defined (INTERNAL_SPECIAL) || defined (INTERNAL_BANDED)
- {
- typedef banded_matrix<T> container_model;
- function_requires< Mutable_MatrixConcept<container_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- {
- typedef banded_adaptor<matrix<T> > container_model;
- function_requires< Mutable_MatrixExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- #endif
- // Triangular Matrix
- #if defined (INTERNAL_SPECIAL) || defined (INTERNAL_TRIANGULAR)
- {
- typedef triangular_matrix<T> container_model;
- function_requires< Mutable_MatrixConcept<container_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- {
- typedef triangular_adaptor<matrix<T> > container_model;
- function_requires< Mutable_MatrixExpressionConcept<container_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- #endif
- // Symmetric Matrix
- #if defined (INTERNA_SPECIAL) || defined (INTERNAL_SYMMETRIC)
- {
- typedef symmetric_matrix<T> container_model;
- function_requires< Mutable_MatrixConcept<container_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- {
- typedef banded_adaptor<matrix<T> > container_model;
- #ifndef SKIP_BAD
- // const_iterator (iterator) constructor is bad
- function_requires< Mutable_MatrixExpressionConcept<container_model> >();
- #endif
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- #endif
- // Hermitian Matrix
- #if defined (INTERNAL_SPECIAL) || defined (INTERNAL_HERMITIAN)
- {
- typedef hermitian_matrix<T> container_model;
- function_requires< Mutable_MatrixConcept<container_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
-
- {
- typedef hermitian_adaptor<matrix<T> > container_model;
- #ifndef SKIP_BAD
- // const_iterator (iterator) constructor is bad
- function_requires< Mutable_MatrixExpressionConcept<container_model> >();
- #endif
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- #endif
- // Sparse Matrix
- #if defined (INTERNAL_SPARSE) || defined (INTERNAL_MATRIX_SPARSE)
- {
- typedef mapped_matrix<T> container_model;
- function_requires< Mutable_SparseMatrixConcept<container_model> >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedBidirectional2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedBidirectional2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- {
- typedef mapped_vector_of_mapped_vector<T> container_model;
- function_requires< Mutable_SparseMatrixConcept<container_model> >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedBidirectional2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedBidirectional2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- {
- typedef compressed_matrix<T> container_model;
- function_requires< Mutable_SparseMatrixConcept<container_model> >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedBidirectional2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedBidirectional2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- {
- typedef coordinate_matrix<T> container_model;
- function_requires< Mutable_SparseMatrixConcept<container_model> >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedBidirectional2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedBidirectional2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- {
- typedef generalized_vector_of_vector<T, row_major, vector< coordinate_vector<T> > > container_model;
- function_requires< Mutable_SparseMatrixConcept<container_model> >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_iterator1, container_model::const_iterator2> >();
- function_requires< Mutable_IndexedBidirectional2DIteratorConcept<container_model::iterator1, container_model::iterator2> >();
- function_requires< IndexedBidirectional2DIteratorConcept<container_model::const_reverse_iterator1, container_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedBidirectional2DIteratorConcept<container_model::reverse_iterator1, container_model::reverse_iterator2> >();
- }
- #endif
- // Scalar Expressions
- #if defined (INTERNAL_EXPRESSION) || defined (INTERNAL_VECTOR_EXPRESSION)
- function_requires< ScalarExpressionConcept<scalar_value<T> > >();
- function_requires< ScalarExpressionConcept<scalar_reference<T> > >();
- // Vector Expressions
- {
- typedef vector_reference<vector<T> > expression_model;
- function_requires< VectorExpressionConcept<expression_model> >();
- function_requires< Mutable_VectorExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<expression_model::iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_reverse_iterator> >();
- function_requires< Mutable_IndexedRandomAccess1DIteratorConcept<expression_model::reverse_iterator> >();
- }
- {
- typedef vector_unary<vector<T>, scalar_identity<T> > expression_model;
- function_requires< VectorExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_reverse_iterator> >();
- }
- {
- typedef vector_binary<vector<T>, vector<T>, scalar_plus<T, T> > expression_model;
- function_requires< VectorExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_reverse_iterator> >();
- }
- {
- typedef vector_binary_scalar1<T, vector<T>, scalar_multiplies<T, T> > expression_model;
- function_requires< VectorExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_reverse_iterator> >();
- }
- {
- typedef vector_binary_scalar2<vector<T>, scalar_value<T>, scalar_multiplies<T, T> > expression_model;
- function_requires< VectorExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_reverse_iterator> >();
- }
- {
- typedef vector_binary_scalar1<scalar_value<T>, vector<T>, scalar_multiplies<T, T> > expression_model;
- function_requires< VectorExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_reverse_iterator> >();
- }
- {
- typedef vector_binary_scalar2<vector<T>, scalar_value<T>, scalar_multiplies<T, T> > expression_model;
- function_requires< VectorExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_reverse_iterator> >();
- }
- function_requires< ScalarExpressionConcept<vector_scalar_unary<vector<T>, vector_sum<vector<T> > > > >();
- function_requires< ScalarExpressionConcept<vector_scalar_unary<vector<T>, vector_norm_1<vector<T> > > > >();
- function_requires< ScalarExpressionConcept<vector_scalar_unary<vector<T>, vector_norm_2<vector<T> > > > >();
- function_requires< ScalarExpressionConcept<vector_scalar_unary<vector<T>, vector_norm_inf<vector<T> > > > >();
- function_requires< ScalarExpressionConcept<vector_scalar_binary<vector<T>, vector<T>, vector_inner_prod<vector<T>, vector<T>, T> > > >();
- #endif
- // Matrix Expressions
- #if defined (INTERNAL_EXPRESSION) || defined (INTERNAL_MATRIX_EXPRESSION)
- {
- typedef matrix_reference<matrix<T> > expression_model;
- function_requires< MatrixExpressionConcept<expression_model> >();
- function_requires< Mutable_MatrixExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_iterator1, expression_model::const_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<expression_model::iterator1, expression_model::iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_reverse_iterator1, expression_model::const_reverse_iterator2> >();
- function_requires< Mutable_IndexedRandomAccess2DIteratorConcept<expression_model::reverse_iterator1, expression_model::reverse_iterator2> >();
- }
- {
- typedef vector_matrix_binary<vector<T>, vector<T>, scalar_multiplies<T, T> > expression_model;
- function_requires< MatrixExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_iterator1, expression_model::const_iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_reverse_iterator1, expression_model::const_reverse_iterator2> >();
- }
- {
- typedef matrix_unary1<matrix<T>, scalar_identity<T> > expression_model;
- function_requires< MatrixExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_iterator1, expression_model::const_iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_reverse_iterator1, expression_model::const_reverse_iterator2> >();
- }
- {
- typedef matrix_unary2<matrix<T>, scalar_identity<T> > expression_model;
- function_requires< MatrixExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_iterator1, expression_model::const_iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_reverse_iterator1, expression_model::const_reverse_iterator2> >();
- }
- {
- typedef matrix_binary<matrix<T>, matrix<T>, scalar_plus<T, T> > expression_model;
- function_requires< MatrixExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_iterator1, expression_model::const_iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_reverse_iterator1, expression_model::const_reverse_iterator2> >();
- }
- {
- typedef matrix_binary_scalar1<T, matrix<T>, scalar_multiplies<T, T> > expression_model;
- function_requires< MatrixExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_iterator1, expression_model::const_iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_reverse_iterator1, expression_model::const_reverse_iterator2> >();
- }
- {
- typedef matrix_binary_scalar2<matrix<T>, T, scalar_multiplies<T, T> > expression_model;
- function_requires< MatrixExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_iterator1, expression_model::const_iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_reverse_iterator1, expression_model::const_reverse_iterator2> >();
- }
- {
- typedef matrix_binary_scalar1<scalar_value<T>, matrix<T>, scalar_multiplies<T, T> > expression_model;
- function_requires< MatrixExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_iterator1, expression_model::const_iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_reverse_iterator1, expression_model::const_reverse_iterator2> >();
- }
- {
- typedef matrix_binary_scalar2<matrix<T>, scalar_value<T>, scalar_multiplies<T, T> > expression_model;
- function_requires< MatrixExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_iterator1, expression_model::const_iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_reverse_iterator1, expression_model::const_reverse_iterator2> >();
- }
- {
- typedef matrix_vector_binary1<matrix<T>, vector<T>, matrix_vector_prod1<matrix<T>, vector<T>, T> > expression_model;
- function_requires< VectorExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_reverse_iterator> >();
- }
- {
- typedef matrix_vector_binary2<vector<T>, matrix<T>, matrix_vector_prod2<matrix<T>, vector<T>, T > > expression_model;
- function_requires< VectorExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_iterator> >();
- function_requires< IndexedRandomAccess1DIteratorConcept<expression_model::const_reverse_iterator> >();
- }
- {
- typedef matrix_matrix_binary<matrix<T>, matrix<T>, matrix_matrix_prod<matrix<T>, matrix<T>, T > > expression_model;
- function_requires< MatrixExpressionConcept<expression_model> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_iterator1, expression_model::const_iterator2> >();
- function_requires< IndexedRandomAccess2DIteratorConcept<expression_model::const_reverse_iterator1, expression_model::const_reverse_iterator2> >();
- }
- function_requires< ScalarExpressionConcept<matrix_scalar_unary<matrix<T>, matrix_norm_1<vector<T> > > > >();
- function_requires< ScalarExpressionConcept<matrix_scalar_unary<matrix<T>, matrix_norm_frobenius<vector<T> > > > >();
- function_requires< ScalarExpressionConcept<matrix_scalar_unary<matrix<T>, matrix_norm_inf<vector<T> > > > >();
- #endif
- #ifdef EXTERNAL
- function_requires< AdditiveAbelianGroupConcept<T> >();
- function_requires< CommutativeRingWithIdentityConcept<T> >();
- function_requires< FieldConcept<T> >();
- function_requires< VectorSpaceConcept<T, vector<T> > >();
- function_requires< Prod_RingWithIdentityConcept<matrix<T> > >();
- function_requires< VectorSpaceConcept<T, matrix<T> > >();
- function_requires< LinearOperatorConcept<T, vector<T>, matrix<T> > >();
- function_requires< AdditiveAbelianGroupConcept<std::complex<T> > >();
- function_requires< CommutativeRingWithIdentityConcept<std::complex<T> > >();
- function_requires< FieldConcept<std::complex<T> > >();
- function_requires< VectorSpaceConcept<std::complex<T>, vector<std::complex<T> > > >();
- function_requires< Prod_RingWithIdentityConcept<matrix<std::complex<T> > > >();
- function_requires< VectorSpaceConcept<std::complex<T>, matrix<std::complex<T> > > >();
- function_requires< LinearOperatorConcept<std::complex<T>, vector<std::complex<T> >, matrix<std::complex<T> > > >();
- #endif
- }
- } // end of anonymous namespace
- }}}
- #endif
|