MyraMath
Number.h
Go to the documentation of this file.
1 // ========================================================================= //
2 // This file is part of MyraMath, copyright (c) 2014-2019 by Ryan A Chilton //
3 // and distributed by MyraCore, LLC. See LICENSE.txt for license terms. //
4 // ========================================================================= //
5 
6 #ifndef MYRAMATH_UTILITY_NUMBER_H
7 #define MYRAMATH_UTILITY_NUMBER_H
8 
14 #include <myramath/utility/detail/LIBPUBLIC.h>
15 
16 #include <complex>
17 
18 namespace myra {
19 
21 typedef float NumberS;
22 typedef double NumberD;
23 typedef std::complex<float> NumberC;
24 typedef std::complex<double> NumberZ;
25 
27 template<class Number> char typechar();
28 
30 template<class Number> const char* typestring();
31 
33 template<class Number> class ReflectPrecision;
34 
36 template<> class ReflectPrecision<NumberS>
37  { public: typedef NumberS type; };
38 template<> class ReflectPrecision<NumberD>
39  { public: typedef NumberD type; };
40 template<> class ReflectPrecision<NumberC>
41  { public: typedef NumberS type; };
42 template<> class ReflectPrecision<NumberZ>
43  { public: typedef NumberD type; };
44 
46 template<class Precision> class ReflectComplex;
47 
49 template<> class ReflectComplex<NumberS>
50  { public: typedef NumberC type; };
51 template<> class ReflectComplex<NumberD>
52  { public: typedef NumberZ type; };
53 
55 template<class Container> class ReflectNumber;
56 
58 LIBPUBLIC NumberD raise_precision(NumberS s);
59 LIBPUBLIC NumberZ raise_precision(NumberC c);
60 
62 template<class Number> class RaisePrecision;
63 template<> class RaisePrecision<NumberS>
64  { public: typedef NumberD type; };
65 template<> class RaisePrecision<NumberC>
66  { public: typedef NumberZ type; };
67 
69 LIBPUBLIC NumberS lower_precision(NumberD d);
70 LIBPUBLIC NumberC lower_precision(NumberZ z);
71 
73 template<class Number> class LowerPrecision;
74 template<> class LowerPrecision<NumberD>
75  { public: typedef NumberS type; };
76 template<> class LowerPrecision<NumberZ>
77  { public: typedef NumberC type; };
78 
80 LIBPUBLIC NumberS scalar_norm2(NumberS x);
81 LIBPUBLIC NumberD scalar_norm2(NumberD x);
82 LIBPUBLIC NumberS scalar_norm2(NumberC x);
83 LIBPUBLIC NumberD scalar_norm2(NumberZ x);
84 
86 LIBPUBLIC NumberS scalar_norm1(NumberS x);
87 LIBPUBLIC NumberD scalar_norm1(NumberD x);
88 LIBPUBLIC NumberS scalar_norm1(NumberC x);
89 LIBPUBLIC NumberD scalar_norm1(NumberZ x);
90 
92 LIBPUBLIC NumberS realpart(NumberS s);
93 LIBPUBLIC NumberD realpart(NumberD d);
94 LIBPUBLIC NumberS realpart(NumberC c);
95 LIBPUBLIC NumberD realpart(NumberZ z);
96 
98 LIBPUBLIC NumberS imagpart(NumberS s);
99 LIBPUBLIC NumberD imagpart(NumberD d);
100 LIBPUBLIC NumberS imagpart(NumberC c);
101 LIBPUBLIC NumberD imagpart(NumberZ z);
102 
104 LIBPUBLIC NumberS conjugate(NumberS s);
105 LIBPUBLIC NumberD conjugate(NumberD d);
106 LIBPUBLIC NumberC conjugate(NumberC c);
107 LIBPUBLIC NumberZ conjugate(NumberZ z);
108 
110 LIBPUBLIC NumberS argument(NumberS s);
111 LIBPUBLIC NumberD argument(NumberD d);
112 LIBPUBLIC NumberS argument(NumberC c);
113 LIBPUBLIC NumberD argument(NumberZ z);
114 
116 template<class NumberA, class NumberB> class ReflectField;
117 
118 // ReflectField rules for matched Number types.
119 template<> class ReflectField<NumberS,NumberS> { public: typedef NumberS type; }; // float @ float = float
120 template<> class ReflectField<NumberD,NumberD> { public: typedef NumberD type; }; // double @ double = double
121 template<> class ReflectField<NumberC,NumberC> { public: typedef NumberC type; }; // complex<float > @ complex<float > = complex<float >
122 template<> class ReflectField<NumberZ,NumberZ> { public: typedef NumberZ type; }; // complex<double> @ complex<double> = complex<double>
123 
124 // ReflectField rules for mismatched Number types.
125 template<> class ReflectField<NumberS,NumberC> { public: typedef NumberC type; }; // float @ complex<float > = complex<float >
126 template<> class ReflectField<NumberD,NumberZ> { public: typedef NumberZ type; }; // double @ complex<double> = complex<double>
127 template<> class ReflectField<NumberC,NumberS> { public: typedef NumberC type; }; // complex<float > @ float = complex<float >
128 template<> class ReflectField<NumberZ,NumberD> { public: typedef NumberZ type; }; // complex<double> @ double = complex<double>
129 
130 // Occasionally, int's can wander into expressions. They are always promoted to match the "other" type.
131 template<> class ReflectField<NumberS,int> { public: typedef NumberS type; }; // float @ int = float
132 template<> class ReflectField<NumberD,int> { public: typedef NumberD type; }; // double @ int = double
133 template<> class ReflectField<NumberC,int> { public: typedef NumberC type; }; // complex<float > @ int = complex<float >
134 template<> class ReflectField<NumberZ,int> { public: typedef NumberZ type; }; // complex<double> @ int = complex<double>
135 template<> class ReflectField<int,NumberS> { public: typedef NumberS type; }; // int @ float = float
136 template<> class ReflectField<int,NumberD> { public: typedef NumberD type; }; // int @ double = double
137 template<> class ReflectField<int,NumberC> { public: typedef NumberC type; }; // int @ complex<float > = complex<float >
138 template<> class ReflectField<int,NumberZ> { public: typedef NumberZ type; }; // int @ complex<double> = complex<double>
139 
141 template<class NumberA, class NumberB> class MatchNumber;
142 template<> class MatchNumber<NumberS,NumberS> { public: typedef NumberS type; };
143 template<> class MatchNumber<NumberD,NumberD> { public: typedef NumberD type; };
144 template<> class MatchNumber<NumberC,NumberC> { public: typedef NumberC type; };
145 template<> class MatchNumber<NumberZ,NumberZ> { public: typedef NumberZ type; };
146 template<> class MatchNumber<NumberS,int> { public: typedef NumberS type; };
147 template<> class MatchNumber<NumberD,int> { public: typedef NumberD type; };
148 template<> class MatchNumber<NumberC,int> { public: typedef NumberC type; };
149 template<> class MatchNumber<NumberZ,int> { public: typedef NumberZ type; };
150 template<> class MatchNumber<int,NumberS> { public: typedef NumberS type; };
151 template<> class MatchNumber<int,NumberD> { public: typedef NumberD type; };
152 template<> class MatchNumber<int,NumberC> { public: typedef NumberC type; };
153 template<> class MatchNumber<int,NumberZ> { public: typedef NumberZ type; };
154 
155 } // namespace myra
156 
157 #endif
Reflects Number trait for a Container, containers of Numbers (Matrix&#39;s, Vector&#39;s, etc) should special...
Definition: Number.h:55
Rules for mixing Number types, template-heavy code uses this to figure out (eg) the resulting type of...
Definition: Number.h:116
Reflectors that raise the Precision of a Number type.
Definition: Number.h:62
const char * typestring()
Returns a const char* (string literal) representing a Number type.
char typechar()
Returns a char representing a Number type.
Definition: syntax.dox:1
Reflects a Precision type into a complex type.
Definition: Number.h:46
Reflectors that lower the Precision of a Number type.
Definition: Number.h:73
Reflects Precision trait for a Number, scalar Number types should specialize it.
Definition: Number.h:33
Helper class to make sure that two Number&#39;s match.
Definition: Number.h:141
float NumberS
Useful typedefs.
Definition: Number.h:21