27 using T =
typename V::ValueType;
28 using M =
typename V::MatrixType;
33 constexpr AffineXf()
noexcept =
default;
34 constexpr AffineXf(
const M & A,
const V & b ) noexcept : A( A ), b( b ) { }
42 [[nodiscard]]
static constexpr AffineXf translation(
const V & b )
noexcept {
return AffineXf{
M{}, b }; }
44 [[nodiscard]]
static constexpr AffineXf linear(
const M & A )
noexcept {
return AffineXf{ A, V{} }; }
46 [[nodiscard]]
static constexpr AffineXf xfAround(
const M & A,
const V & stable )
noexcept {
return AffineXf{ A, stable - A * stable }; }
49 [[nodiscard]]
constexpr V operator() (
const V & x )
const noexcept {
return A * x + b; }
52 [[nodiscard]]
constexpr V linearOnly(
const V & x )
const noexcept {
return A * x; }
58 res.b = -( res.A * b );
65 {
return { u.A * v.A, u.A * v.b + u.b }; }
70 return a.A == b.A && a.b == b.b;
79 friend std::ostream& operator<<( std::ostream& s,
const AffineXf& xf )
81 return s << xf.A << xf.b;
84 friend std::istream& operator>>( std::istream& s,
AffineXf& xf )
86 return s >> xf.A >> xf.b;
bool operator==(const BitSet &a, const BitSet &b)
compare that two bit sets have the same set bits (they can be equal even if sizes are distinct but la...