From 595d7cf4b437fc3ad7756f51095cbc8a037d2405 Mon Sep 17 00:00:00 2001 From: Matthias Maier Date: Sat, 12 Sep 2015 19:29:55 -0500 Subject: [PATCH] Overloads for mixed complex floating point type multiplication Those variants are defined in a separate namespace and can be included on an if needed basis. --- include/deal.II/base/complex_overloads.h | 90 ++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 include/deal.II/base/complex_overloads.h diff --git a/include/deal.II/base/complex_overloads.h b/include/deal.II/base/complex_overloads.h new file mode 100644 index 0000000000..fa1b1f35ea --- /dev/null +++ b/include/deal.II/base/complex_overloads.h @@ -0,0 +1,90 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 1998 - 2015 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + +#ifndef dealii__complex_overloads_h +#define dealii__complex_overloads_h + +#include +#include + +DEAL_II_NAMESPACE_OPEN + +/** + * A namespace that contains overloads of operator* for complex + * numbers. Those overloads allow mixed floating point type multiplication + * between complex and real valued types. + * + * Unfortunately, the standard library does not provide those function + * overloads (neither C++98, C++11, C++14, nor C++17), so we provide a + * namespace with them. + */ +namespace ComplexOverloads +{ + /** + * Provide an operator* that operates on mixed complex floating + * point types. Annoyingly, the standard library does not provide such an + * operator... + * + * @relates ProductType + */ + template + typename ProductType, std::complex >::type + inline + operator*(const std::complex &left, const std::complex &right) + { + typedef typename ProductType, std::complex >::type result_type; + return static_cast(left) * static_cast(right); + } + + + /** + * Provide an operator* for a scalar multiplication of a complex + * floating point type with a different real floating point type. + * Annoyingly, the standard library does not provide such an operator... + * + * @relates EnableIfScalar + * @relates ProductType + */ + template + typename ProductType, typename EnableIfScalar::type>::type + inline + operator*(const std::complex &left, const U &right) + { + typedef typename ProductType, U>::type result_type; + return static_cast(left) * static_cast(right); + } + + + /** + * Provide an operator* for a scalar multiplication of a real + * floating point type with a different complex floating point type. + * Annoyingly, the standard library does not provide such an operator... + * + * @relates EnableIfScalar + * @relates ProductType + */ + template + typename ProductType::type, std::complex >::type + inline + operator*(const T &left, const std::complex &right) + { + typedef typename ProductType, U>::type result_type; + return static_cast(left) * static_cast(right); + } +} /* namespace ComplexOverloads */ + +DEAL_II_NAMESPACE_CLOSE + +#endif -- 2.39.5