• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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