|
Mundy: Multibody Nonlocal Dynamics Version of the Day
|
Classes | |
| struct | mundy::is_scalar< TypeToCheck > |
| Type trait to determine if a type is an AScalar. More... | |
| class | mundy::AScalar< T, Accessor > |
| Class for an owning or viewing arithmetic scalar. More... | |
Namespaces | |
| namespace | mundy |
Concepts | |
| concept | mundy::ValidScalarType |
| Concept satisfied by any type that behaves as a mathematical scalar. | |
Functions | |
Output stream | |
| template<typename T, ValidAccessor< T > Accessor> | |
| std::ostream & | mundy::operator<< (std::ostream &os, const AScalar< T, Accessor > &s) |
Comparison | |
| template<typename U, typename T, ValidAccessor< U > Accessor1, ValidAccessor< T > Accessor2> | |
| constexpr bool | mundy::is_close (const AScalar< U, Accessor1 > &a, const AScalar< T, Accessor2 > &b, const decltype(get_comparison_tolerance< T, U >())&tol=get_comparison_tolerance< T, U >()) |
| template<typename U, typename T, ValidAccessor< U > Accessor1, ValidAccessor< T > Accessor2> | |
| constexpr bool | mundy::is_approx_close (const AScalar< U, Accessor1 > &a, const AScalar< T, Accessor2 > &b, const decltype(get_relaxed_comparison_tolerance< T, U >())&tol=get_relaxed_comparison_tolerance< T, U >()) |
Non-member arithmetic: arithmetic op AScalar | |
| template<typename U, typename T, ValidAccessor< T > Accessor> | |
| constexpr auto | mundy::operator+ (const U &scalar, const AScalar< T, Accessor > &s) |
| template<typename U, typename T, ValidAccessor< T > Accessor> | |
| constexpr auto | mundy::operator- (const U &scalar, const AScalar< T, Accessor > &s) |
| template<typename U, typename T, ValidAccessor< T > Accessor> | |
| constexpr auto | mundy::operator* (const U &scalar, const AScalar< T, Accessor > &s) |
| template<typename U, typename T, ValidAccessor< T > Accessor> | |
| constexpr auto | mundy::operator/ (const U &scalar, const AScalar< T, Accessor > &s) |
| arithmetic / AScalar — promotes integral/integral to double | |
Non-member arithmetic: AScalar op AVector / AVector op AScalar | |
| template<size_t N, typename T, typename U, ValidAccessor< T > Accessor1, ValidAccessor< U > Accessor2> | |
| constexpr auto | mundy::operator* (const AVector< T, N, Accessor1 > &vec, const AScalar< U, Accessor2 > &s) -> AVector< std::common_type_t< T, U >, N > |
| AVector * AScalar. | |
| template<size_t N, typename U, typename T, ValidAccessor< U > Accessor1, ValidAccessor< T > Accessor2> | |
| constexpr auto | mundy::operator* (const AScalar< U, Accessor1 > &s, const AVector< T, N, Accessor2 > &vec) -> AVector< std::common_type_t< T, U >, N > |
| AScalar * AVector (commutative). | |
| template<size_t N, typename T, typename U, ValidAccessor< T > Accessor1, ValidAccessor< U > Accessor2> | |
| constexpr auto | mundy::operator/ (const AVector< T, N, Accessor1 > &vec, const AScalar< U, Accessor2 > &s) |
| AVector / AScalar — delegates to AVector::operator/, preserving its integer-promotion behaviour. | |
Non-member arithmetic: AScalar op AMatrix / AMatrix op AScalar | |
| template<size_t N, size_t M, typename T, typename U, ValidAccessor< T > Accessor1, ValidAccessor< U > Accessor2> | |
| constexpr auto | mundy::operator* (const AMatrix< T, N, M, Accessor1 > &mat, const AScalar< U, Accessor2 > &s) -> AMatrix< std::common_type_t< T, U >, N, M > |
| AMatrix * AScalar. | |
| template<size_t N, size_t M, typename U, typename T, ValidAccessor< U > Accessor1, ValidAccessor< T > Accessor2> | |
| constexpr auto | mundy::operator* (const AScalar< U, Accessor1 > &s, const AMatrix< T, N, M, Accessor2 > &mat) -> AMatrix< std::common_type_t< T, U >, N, M > |
| AScalar * AMatrix (commutative). | |
| template<size_t N, size_t M, typename T, typename U, ValidAccessor< T > Accessor1, ValidAccessor< U > Accessor2> | |
| constexpr auto | mundy::operator/ (const AMatrix< T, N, M, Accessor1 > &mat, const AScalar< U, Accessor2 > &s) |
| AMatrix / AScalar — delegates to AMatrix::operator/, preserving its integer-promotion behaviour. | |
Utility free functions | |
| template<typename T, ValidAccessor< T > Accessor> | |
| constexpr auto | mundy::abs (const AScalar< T, Accessor > &s) |
| Absolute value of a scalar. | |
| template<ValidScalarType ScalarType> | |
| constexpr auto | mundy::copy (const ScalarType &s) |
| Deep copy (mirrors the AVector free function). | |
| template<typename U, ValidScalarType ScalarType> | |
| constexpr auto | mundy::cast (const ScalarType &s) |
| Cast a scalar to a different arithmetic type. | |
Atomic memory operations on raw scalars | |
| template<typename T> | |
| T | mundy::atomic_load (T *const s) |
| Atomic load: s_copy = *s. | |
| template<typename T, typename U> | |
| void | mundy::atomic_store (T *const s, const U &value) |
| Atomic store: *s = value. | |
| template<typename T, typename U> | |
| void | mundy::atomic_add (T *const s, const U &value) |
| Atomic *s += value. | |
| template<typename T, typename Acc, typename U> | |
| void | mundy::atomic_add (AScalar< T, Acc > *const s, const U &value) |
| Atomic *s += value — AScalar overload: operates on the underlying scalar, bypassing AScalar's operator+ (which returns a different storage type incompatible with CAS loops). | |
| template<typename T, typename U> | |
| void | mundy::atomic_sub (T *const s, const U &value) |
| Atomic *s -= value. | |
| template<typename T, typename Acc, typename U> | |
| void | mundy::atomic_sub (AScalar< T, Acc > *const s, const U &value) |
| Atomic *s -= value — AScalar overload. | |
| template<typename T, typename U> | |
| void | mundy::atomic_mul (T *const s, const U &value) |
| Atomic *s *= value. | |
| template<typename T, typename Acc, typename U> | |
| void | mundy::atomic_mul (AScalar< T, Acc > *const s, const U &value) |
| Atomic *s *= value — AScalar overload. | |
| template<typename T, typename U> | |
| void | mundy::atomic_div (T *const s, const U &value) |
| Atomic *s /= value. | |
| template<typename T, typename Acc, typename U> | |
| void | mundy::atomic_div (AScalar< T, Acc > *const s, const U &value) |
| Atomic *s /= value — AScalar overload. | |
| template<typename T, typename U> | |
| T | mundy::atomic_fetch_add (T *const s, const U &value) |
| Atomic *s += value; returns old *s. | |
| template<typename T, typename U> | |
| T | mundy::atomic_fetch_sub (T *const s, const U &value) |
| Atomic *s -= value; returns old *s. | |
| template<typename T, typename U> | |
| T | mundy::atomic_fetch_mul (T *const s, const U &value) |
| Atomic *s *= value; returns old *s. | |
| template<typename T, typename U> | |
| T | mundy::atomic_fetch_div (T *const s, const U &value) |
| Atomic *s /= value; returns old *s. | |
| template<typename T, typename U> | |
| T | mundy::atomic_add_fetch (T *const s, const U &value) |
| Atomic *s += value; returns new *s. | |
| template<typename T, typename U> | |
| T | mundy::atomic_sub_fetch (T *const s, const U &value) |
| Atomic *s -= value; returns new *s. | |
| template<typename T, typename U> | |
| T | mundy::atomic_mul_fetch (T *const s, const U &value) |
| Atomic *s *= value; returns new *s. | |
| template<typename T, typename U> | |
| T | mundy::atomic_div_fetch (T *const s, const U &value) |
| Atomic *s /= value; returns new *s. | |
View and owning helpers | |
| template<typename T, ValidAccessor< T > Accessor> | |
| constexpr auto | mundy::get_scalar_view (Accessor &&data) |
| Create a non-owning AScalar view over an existing accessor. | |
| template<typename T, ValidAccessor< T > Accessor> | |
| constexpr auto | mundy::get_owning_scalar (Accessor &&data) |
| Create an owning AScalar by moving the accessor. | |
AScalar type traits | |
| template<typename T> | |
| using | mundy::Scalar = AScalar<T, Array<T, 1>> |
| Owning scalar with the default Array<T,1> accessor. | |
| template<typename TypeToCheck> | |
| constexpr bool | mundy::is_scalar_v = is_scalar<TypeToCheck>::value |