📄 concepts.hpp
字号:
#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); } }; template<class T> T ZeroElement (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 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -