home
about
news
download
doc
source
systems
tests
bugs
contact
IMP Reference Guide
develop.d97d4ead1f,2024/11/21
The Integrative Modeling Platform
IMP Manual
Reference Guide
Tutorial Index
Modules
Classes
Examples
include
IMP
algebra
version 20241121.develop.d97d4ead1f
algebra_macros.h
Go to the documentation of this file.
1
/**
2
* \file IMP/algebra/algebra_macros.h
3
* \brief Various helper macros.
4
*
5
* Copyright 2007-2024 IMP Inventors. All rights reserved.
6
*
7
*/
8
9
#ifndef IMPALGEBRA_MACROS_H
10
#define IMPALGEBRA_MACROS_H
11
#include "
geometric_primitive_macros.h
"
12
#include <boost/range/iterator_range.hpp>
13
14
#ifdef SWIG
15
#define IMP_ALGEBRA_VECTOR_SWIG_METHODS(D) VectorD(const Floats &f);
16
#else
17
#define IMP_ALGEBRA_VECTOR_SWIG_METHODS(D) \
18
template <class R> \
19
VectorD &operator=(const R &o) { \
20
P::operator=(o); \
21
return *this; \
22
}
23
24
#endif
25
26
#define IMP_ALGEBRA_VECTOR_METHODS(D) \
27
typedef VectorBaseD<D> P; \
28
\
29
public: \
30
/** \brief Will accept a list of floats from Python. */
\
31
template <class Range> \
32
explicit VectorD(const Range &r) \
33
: P(r) {} \
34
template <int OD> \
35
VectorD(const VectorD<OD> &o) \
36
: P(o) { \
37
static_assert(OD == D || OD == -1 || D == -1, \
38
"VectorD size mismatch"); \
39
} \
40
IMP_ALGEBRA_VECTOR_SWIG_METHODS(D); \
41
/** The distance between b and e must be equal to D. \
42
*/
\
43
template <class It> \
44
VectorD(It b, It e) \
45
: P(boost::make_iterator_range(b, e)) {} \
46
VectorD() {} \
47
VectorD get_unit_vector() const { return algebra::get_unit_vector(*this); } \
48
VectorD operator*(double s) const { \
49
VectorD ret(*this); \
50
ret *= s; \
51
return ret; \
52
} \
53
VectorD operator/(double s) const { \
54
VectorD ret(*this); \
55
ret /= s; \
56
return ret; \
57
} \
58
VectorD operator-() const { \
59
VectorD ret(*this); \
60
ret *= -1; \
61
return ret; \
62
} \
63
VectorD operator-(const VectorD &o) const { \
64
VectorD ret(*this); \
65
ret -= o; \
66
return ret; \
67
} \
68
VectorD operator+(VectorD ret) const { \
69
ret += *this; \
70
return ret; \
71
} \
72
VectorD &operator+=(const VectorD &o) { \
73
P::operator+=(o); \
74
return *this; \
75
} \
76
VectorD &operator-=(const VectorD &o) { \
77
P::operator-=(o); \
78
return *this; \
79
} \
80
VectorD &operator/=(double f) { \
81
P::operator/=(f); \
82
return *this; \
83
} \
84
VectorD &operator*=(double f) { \
85
P::operator*=(f); \
86
return *this; \
87
} \
88
/* for swig as it doesn't like using. */
\
89
double operator*(const VectorD &o) const { return P::operator*(o); }
90
91
#endif
/* IMPALGEBRA_MACROS_H */
geometric_primitive_macros.h
Various important macros for implementing geometry.