DLG4::VolumeBuilders
A fluent interface for Geant4 geometry definition.
Loading...
Searching...
No Matches
Classes | Typedefs | Functions | Variables
DLG4::Units Namespace Reference

Classes

class  Angle
 
class  Density
 
struct  is_valid_expr
 
struct  is_valid_expr< T, std::void_t< decltype(std::declval< T >()())> >
 
class  Length
 
class  Length3Vec
 
class  Mass
 
class  MoreTest
 
class  UnitBase
 
struct  UnitOrValue
 
class  UnitProperties_
 
struct  UnitTag
 
class  Volume
 

Typedefs

template<typename Dimension >
using Unit = UnitBase< Dimension, G4double >
 
using Length3Vec = Length3Vec
 
template<typename T , typename U >
using ResultType = std::conditional_t< std::is_base_of_v< UnitTag, T >, T, U >
 
template<typename T >
using NativeType = std::conditional_t< std::is_base_of_v< Length3Vec, T >, G4ThreeVector, std::conditional_t< std::is_base_of_v< UnitTag, T >, G4double, T > >
 
using UnitlessG4Transform3D = G4Transform3D
 

Functions

template<typename T >
void SetGlobalDefaultUnit (T unit)
 
Density operator/ (const Mass &m, const Volume &v)
 
template<typename T , typename U , typename = std::enable_if_t<std::is_base_of_v<UnitTag, T> != std::is_base_of_v<UnitTag, U>>>
auto operator* (const T &a, const U &b)
 
template<typename T , typename U , typename = std::enable_if_t<std::is_base_of_v<UnitTag, T> && !std::is_base_of_v<UnitTag, U>>>
auto operator/ (const T &a, const U &b)
 
template<typename T , typename = std::enable_if_t<std::is_base_of_v<UnitTag, T> >>
operator+ (const T &a, const T &b)
 
template<typename T , typename = std::enable_if_t<std::is_base_of_v<UnitTag, T> >>
operator- (const T &a, const T &b)
 

Variables

template<typename T >
G4double global_default_unit = 1.0
 
template<typename F >
constexpr bool is_invalid_expression = !is_valid_expr<F>::value
 

Detailed Description

Typesafe units!! No accidental mixing values and units.

Typedef Documentation

◆ Length3Vec

A 3 vector that is scalable with/to Units.

Definition at line 44 of file DLG4Units.hh.

◆ NativeType

template<typename T >
using NativeType = std::conditional_t<std::is_base_of_v<Length3Vec, T>, G4ThreeVector, std::conditional_t<std::is_base_of_v<UnitTag, T>, G4double, T> >

Definition at line 643 of file DLG4Units.hh.

◆ ResultType

template<typename T , typename U >
using ResultType = std::conditional_t<std::is_base_of_v<UnitTag, T>, T, U>

Definition at line 641 of file DLG4Units.hh.

◆ Unit

template<typename Dimension >
using Unit = UnitBase<Dimension, G4double>

Definition at line 41 of file DLG4Units.hh.

◆ UnitlessG4Transform3D

using UnitlessG4Transform3D = G4Transform3D

Definition at line 677 of file DLG4Units.hh.

Function Documentation

◆ operator*()

template<typename T , typename U , typename = std::enable_if_t<std::is_base_of_v<UnitTag, T> != std::is_base_of_v<UnitTag, U>>>
auto operator* ( const T &  a,
const U &  b 
)
inline

Definition at line 650 of file DLG4Units.hh.

650 {
651 using R = ResultType<T, U>;
652 return R(UnitOrValue<T, NativeType<T> >(a).val * UnitOrValue<U, NativeType<U> >(b).val, R::native);
653 }
std::conditional_t< std::is_base_of_v< Length3Vec, T >, G4ThreeVector, std::conditional_t< std::is_base_of_v< UnitTag, T >, G4double, T > > NativeType
Definition DLG4Units.hh:645
std::conditional_t< std::is_base_of_v< UnitTag, T >, T, U > ResultType
Definition DLG4Units.hh:641
Type-erases unit or value to just a value.
Definition DLG4Units.hh:620

◆ operator+()

template<typename T , typename = std::enable_if_t<std::is_base_of_v<UnitTag, T> >>
T operator+ ( const T &  a,
const T &  b 
)
inline

Definition at line 665 of file DLG4Units.hh.

665 {
666 // Uses the protected constructor/FromNative to return a new dimensioned object
667 return T::FromNative(a.Native + b.Native);
668 }

◆ operator-()

template<typename T , typename = std::enable_if_t<std::is_base_of_v<UnitTag, T> >>
T operator- ( const T &  a,
const T &  b 
)
inline

Definition at line 672 of file DLG4Units.hh.

672 {
673 return T::FromNative(a.Native - b.Native);
674 }

◆ operator/() [1/2]

Density operator/ ( const Mass m,
const Volume v 
)
inline

Definition at line 421 of file DLG4Units.hh.

421 {
422 Density x = Density::FromNative(m.Native / v.Native);
423 return x;
424 }

◆ operator/() [2/2]

template<typename T , typename U , typename = std::enable_if_t<std::is_base_of_v<UnitTag, T> && !std::is_base_of_v<UnitTag, U>>>
auto operator/ ( const T &  a,
const U &  b 
)
inline

Definition at line 658 of file DLG4Units.hh.

658 {
659 // T is the Unit, U is the Scalar
660 return T(UnitOrValue<T, NativeType<T> >(a).val / static_cast<double>(b), T::native);
661 }

Variable Documentation

◆ global_default_unit

template<typename T >
G4double global_default_unit = 1.0
inline

Definition at line 48 of file DLG4Units.hh.

◆ is_invalid_expression

template<typename F >
constexpr bool is_invalid_expression = !is_valid_expr<F>::value
inlineconstexpr

Definition at line 689 of file DLG4Units.hh.