111986Sandreas.sandberg@arm.com/* 211986Sandreas.sandberg@arm.com pybind11/complex.h: Complex number support 311986Sandreas.sandberg@arm.com 411986Sandreas.sandberg@arm.com Copyright (c) 2016 Wenzel Jakob <wenzel.jakob@epfl.ch> 511986Sandreas.sandberg@arm.com 611986Sandreas.sandberg@arm.com All rights reserved. Use of this source code is governed by a 711986Sandreas.sandberg@arm.com BSD-style license that can be found in the LICENSE file. 811986Sandreas.sandberg@arm.com*/ 911986Sandreas.sandberg@arm.com 1011986Sandreas.sandberg@arm.com#pragma once 1111986Sandreas.sandberg@arm.com 1211986Sandreas.sandberg@arm.com#include "pybind11.h" 1311986Sandreas.sandberg@arm.com#include <complex> 1411986Sandreas.sandberg@arm.com 1511986Sandreas.sandberg@arm.com/// glibc defines I as a macro which breaks things, e.g., boost template names 1611986Sandreas.sandberg@arm.com#ifdef I 1711986Sandreas.sandberg@arm.com# undef I 1811986Sandreas.sandberg@arm.com#endif 1911986Sandreas.sandberg@arm.com 2012391Sjason@lowepower.comNAMESPACE_BEGIN(PYBIND11_NAMESPACE) 2112391Sjason@lowepower.com 2212391Sjason@lowepower.comtemplate <typename T> struct format_descriptor<std::complex<T>, detail::enable_if_t<std::is_floating_point<T>::value>> { 2312391Sjason@lowepower.com static constexpr const char c = format_descriptor<T>::c; 2412391Sjason@lowepower.com static constexpr const char value[3] = { 'Z', c, '\0' }; 2512391Sjason@lowepower.com static std::string format() { return std::string(value); } 2612391Sjason@lowepower.com}; 2712391Sjason@lowepower.com 2814299Sbbruce@ucdavis.edu#ifndef PYBIND11_CPP17 2914299Sbbruce@ucdavis.edu 3012391Sjason@lowepower.comtemplate <typename T> constexpr const char format_descriptor< 3112391Sjason@lowepower.com std::complex<T>, detail::enable_if_t<std::is_floating_point<T>::value>>::value[3]; 3212391Sjason@lowepower.com 3314299Sbbruce@ucdavis.edu#endif 3414299Sbbruce@ucdavis.edu 3512037Sandreas.sandberg@arm.comNAMESPACE_BEGIN(detail) 3611986Sandreas.sandberg@arm.com 3712391Sjason@lowepower.comtemplate <typename T> struct is_fmt_numeric<std::complex<T>, detail::enable_if_t<std::is_floating_point<T>::value>> { 3812037Sandreas.sandberg@arm.com static constexpr bool value = true; 3912037Sandreas.sandberg@arm.com static constexpr int index = is_fmt_numeric<T>::index + 3; 4012037Sandreas.sandberg@arm.com}; 4111986Sandreas.sandberg@arm.com 4211986Sandreas.sandberg@arm.comtemplate <typename T> class type_caster<std::complex<T>> { 4311986Sandreas.sandberg@arm.compublic: 4412037Sandreas.sandberg@arm.com bool load(handle src, bool convert) { 4511986Sandreas.sandberg@arm.com if (!src) 4611986Sandreas.sandberg@arm.com return false; 4712037Sandreas.sandberg@arm.com if (!convert && !PyComplex_Check(src.ptr())) 4812037Sandreas.sandberg@arm.com return false; 4911986Sandreas.sandberg@arm.com Py_complex result = PyComplex_AsCComplex(src.ptr()); 5011986Sandreas.sandberg@arm.com if (result.real == -1.0 && PyErr_Occurred()) { 5111986Sandreas.sandberg@arm.com PyErr_Clear(); 5211986Sandreas.sandberg@arm.com return false; 5311986Sandreas.sandberg@arm.com } 5411986Sandreas.sandberg@arm.com value = std::complex<T>((T) result.real, (T) result.imag); 5511986Sandreas.sandberg@arm.com return true; 5611986Sandreas.sandberg@arm.com } 5711986Sandreas.sandberg@arm.com 5811986Sandreas.sandberg@arm.com static handle cast(const std::complex<T> &src, return_value_policy /* policy */, handle /* parent */) { 5911986Sandreas.sandberg@arm.com return PyComplex_FromDoubles((double) src.real(), (double) src.imag()); 6011986Sandreas.sandberg@arm.com } 6111986Sandreas.sandberg@arm.com 6211986Sandreas.sandberg@arm.com PYBIND11_TYPE_CASTER(std::complex<T>, _("complex")); 6311986Sandreas.sandberg@arm.com}; 6411986Sandreas.sandberg@arm.comNAMESPACE_END(detail) 6512391Sjason@lowepower.comNAMESPACE_END(PYBIND11_NAMESPACE) 66