Advanced Multi-Physics (AMP)
On-Line Documentation
Scalar.h
Go to the documentation of this file.
1#ifndef included_AMP_Scalar
2#define included_AMP_Scalar
3
4#include <any>
5#include <cstddef>
6#include <cstdint>
7
8#include "AMP/utils/TypeTraits.h"
9#include "AMP/utils/typeid.h"
10
11
12namespace AMP {
13
14
20class Scalar
21{
22public:
24 inline Scalar() = default;
25
31 template<class TYPE>
32 Scalar( const TYPE &x );
33
35 Scalar( const Scalar & ) = default;
36
38 Scalar( Scalar && ) = default;
39
41 Scalar &operator=( const Scalar & ) = default;
42
44 Scalar &operator=( Scalar && ) = default;
45
51 template<class TYPE>
52 Scalar create( const TYPE &x ) const;
53
59 template<class TYPE>
60 TYPE get( double tol = Scalar::getTol<TYPE>() ) const;
61
63 inline bool is_floating_point() const { return d_type == 'f'; }
64
66 inline bool is_integral() const { return d_type == 'i'; }
67
69 inline bool is_complex() const { return d_type == 'c'; }
70
72 inline const auto &type() const { return d_data.type(); }
73
79 inline uint32_t getTypeHash() const { return d_hash; }
80
82 inline bool has_value() const noexcept { return d_data.has_value(); }
83
85 template<class TYPE>
86 static constexpr double getTol()
87 {
88 if constexpr ( std::is_integral_v<TYPE> ) {
89 return 0;
90 } else if constexpr ( std::is_floating_point_v<TYPE> ) {
91 constexpr double tol = 10 * std::numeric_limits<TYPE>::epsilon();
92 return tol;
93 } else if constexpr ( AMP::is_complex_v<TYPE> ) {
94 constexpr double tol = 10 * std::numeric_limits<TYPE>::epsilon().real();
95 return tol;
96 } else {
97 constexpr double tol = 10 * std::numeric_limits<TYPE>::epsilon();
98 return tol;
99 }
100 }
101
103 void print( std::ostream &out ) const;
104
105
106public: // Comparison operators
107 bool operator==( const Scalar &rhs ) const;
108 bool operator!=( const Scalar &rhs ) const;
109 bool operator>( const Scalar &rhs ) const;
110 bool operator>=( const Scalar &rhs ) const;
111 bool operator<( const Scalar &rhs ) const;
112 bool operator<=( const Scalar &rhs ) const;
113
114
115public: // Overload some typecast operators
116 template<class TYPE>
117 inline explicit operator TYPE() const
118 {
119 return get<TYPE>();
120 }
121
122
123public: // Limits
130
137
142 Scalar zero() const;
143
144
145public: // Math functions
146 Scalar abs() const;
147 Scalar sqrt() const;
148
149
150private: // Helper functions
151 template<class TYPE>
152 inline void store( const TYPE &x );
153
154
155private: // Internal data
156 char d_type = 0;
157 uint32_t d_hash = 0;
158 std::any d_data;
159};
160
161
162/********************************************************************
163 * Operator overloading *
164 ********************************************************************/
166Scalar operator+( const Scalar &x, const Scalar &y );
167Scalar operator-( const Scalar &x, const Scalar &y );
168Scalar operator*( const Scalar &x, const Scalar &y );
169Scalar operator/( const Scalar &x, const Scalar &y );
170inline bool operator==( double x, const Scalar &y ) { return y.operator==( x ); }
171
172
173/********************************************************
174 * ostream operator *
175 ********************************************************/
176template<class TYPE>
177typename std::enable_if_t<std::is_same_v<TYPE, Scalar>, std::ostream &>
178operator<<( std::ostream &out, const TYPE &x )
179{
180 x.print( out );
181 return out;
182}
183
184
185} // namespace AMP
186
187#endif
Scalar is a class used to store a scalar variable that may be different types/precision.
Definition Scalar.h:21
Scalar limitsMin() const
Return the minimum allowed value.
void print(std::ostream &out) const
Print the value to a stream.
uint32_t d_hash
Definition Scalar.h:157
bool operator<=(const Scalar &rhs) const
const auto & type() const
Return the storage type.
Definition Scalar.h:72
bool operator<(const Scalar &rhs) const
static constexpr double getTol()
Get default tolerance.
Definition Scalar.h:86
Scalar & operator=(Scalar &&)=default
Move operator.
bool operator>(const Scalar &rhs) const
Scalar(Scalar &&)=default
Move constructor.
bool is_floating_point() const
Return true if the type is a floating point type.
Definition Scalar.h:63
bool is_integral() const
Return true if the type is a integer point type.
Definition Scalar.h:66
bool has_value() const noexcept
Check if we are storing a value.
Definition Scalar.h:82
std::any d_data
Definition Scalar.h:158
Scalar(const Scalar &)=default
Copy constructor.
uint32_t getTypeHash() const
Return the storage type.
Definition Scalar.h:79
Scalar zero() const
Return a zero.
Scalar abs() const
Scalar create(const TYPE &x) const
Construct a Scalar value.
bool operator!=(const Scalar &rhs) const
Scalar & operator=(const Scalar &)=default
Assignment operator.
bool operator==(const Scalar &rhs) const
bool is_complex() const
Return true if the type is a complex type.
Definition Scalar.h:69
Scalar limitsMax() const
Return the maximum allowed value.
char d_type
Definition Scalar.h:156
TYPE get(double tol=Scalar::getTol< TYPE >()) const
Construct a scalar value.
void store(const TYPE &x)
bool operator>=(const Scalar &rhs) const
Scalar()=default
Empty constructor.
Scalar sqrt() const
Scalar(const TYPE &x)
Construct a Scalar value.
bool operator==(double x, const Scalar &y)
Definition Scalar.h:170
Scalar operator/(const Scalar &x, const Scalar &y)
Array< TYPE, FUN, Allocator > operator-(const Array< TYPE, FUN, Allocator > &a, const Array< TYPE, FUN, Allocator > &b)
Definition Array.h:889
std::ostream & operator<<(std::ostream &out, const AMP::ArraySize &s)
Definition Array.h:861
Array< TYPE, FUN, Allocator > operator*(const Array< TYPE, FUN, Allocator > &a, const Array< TYPE, FUN, Allocator > &b)
Definition Array.h:897
Array< TYPE, FUN, Allocator > operator+(const Array< TYPE, FUN, Allocator > &a, const Array< TYPE, FUN, Allocator > &b)
Definition Array.h:881



Advanced Multi-Physics (AMP)
Oak Ridge National Laboratory
Idaho National Laboratory
Los Alamos National Laboratory
This page automatically produced from the
source code by doxygen
Last updated: Tue Mar 10 2026 13:06:41.
Comments on this page