1 | // Copyright John Maddock 2018. |
2 | // Use, modification and distribution are subject to the |
3 | // Boost Software License, Version 1.0. (See accompanying file |
4 | // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
5 | |
6 | // |
7 | // Tools for operator on complex as well as scalar types. |
8 | // |
9 | |
10 | #ifndef BOOST_MATH_TOOLS_COMPLEX_HPP |
11 | #define BOOST_MATH_TOOLS_COMPLEX_HPP |
12 | |
13 | #include <boost/type_traits/is_complex.hpp> |
14 | |
15 | namespace boost { |
16 | namespace math { |
17 | namespace tools { |
18 | |
19 | // |
20 | // Specialize this trait for user-defined complex types (ie Boost.Multiprecision): |
21 | // |
22 | template <class T> |
23 | struct is_complex_type : public boost::is_complex<T> {}; |
24 | // |
25 | // Use this trait to typecast integer literals to something |
26 | // that will interoperate with T: |
27 | // |
28 | template <class T, bool = is_complex_type<T>::value> |
29 | struct integer_scalar_type |
30 | { |
31 | typedef int type; |
32 | }; |
33 | template <class T> |
34 | struct integer_scalar_type<T, true> |
35 | { |
36 | typedef typename T::value_type type; |
37 | }; |
38 | template <class T, bool = is_complex_type<T>::value> |
39 | struct unsigned_scalar_type |
40 | { |
41 | typedef unsigned type; |
42 | }; |
43 | template <class T> |
44 | struct unsigned_scalar_type<T, true> |
45 | { |
46 | typedef typename T::value_type type; |
47 | }; |
48 | template <class T, bool = is_complex_type<T>::value> |
49 | struct scalar_type |
50 | { |
51 | typedef T type; |
52 | }; |
53 | template <class T> |
54 | struct scalar_type<T, true> |
55 | { |
56 | typedef typename T::value_type type; |
57 | }; |
58 | |
59 | |
60 | } } } |
61 | |
62 | #endif // BOOST_MATH_TOOLS_COMPLEX_HPP |
63 | |