Mundy: Multibody Nonlocal Dynamics Version of the Day
Loading...
Searching...
No Matches
Scalar.hpp File Reference

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>
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>
mundy::atomic_fetch_add (T *const s, const U &value)
 Atomic *s += value; returns old *s.
template<typename T, typename U>
mundy::atomic_fetch_sub (T *const s, const U &value)
 Atomic *s -= value; returns old *s.
template<typename T, typename U>
mundy::atomic_fetch_mul (T *const s, const U &value)
 Atomic *s *= value; returns old *s.
template<typename T, typename U>
mundy::atomic_fetch_div (T *const s, const U &value)
 Atomic *s /= value; returns old *s.
template<typename T, typename U>
mundy::atomic_add_fetch (T *const s, const U &value)
 Atomic *s += value; returns new *s.
template<typename T, typename U>
mundy::atomic_sub_fetch (T *const s, const U &value)
 Atomic *s -= value; returns new *s.
template<typename T, typename U>
mundy::atomic_mul_fetch (T *const s, const U &value)
 Atomic *s *= value; returns new *s.
template<typename T, typename U>
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