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