• Jason Rhinelander's avatar
    Numpy: better compilation errors, long double support (#619) · f7f5bc8e
    Jason Rhinelander authored
    * Clarify PYBIND11_NUMPY_DTYPE documentation
    
    The current documentation and example reads as though
    PYBIND11_NUMPY_DTYPE is a declarative macro along the same lines as
    PYBIND11_DECLARE_HOLDER_TYPE, but it isn't.  The changes the
    documentation and docs example to make it clear that you need to "call"
    the macro.
    
    * Add satisfies_{all,any,none}_of<T, Preds>
    
    `satisfies_all_of<T, Pred1, Pred2, Pred3>` is a nice legibility-enhanced
    shortcut for `is_all<Pred1<T>, Pred2<T>, Pred3<T>>`.
    
    * Give better error message for non-POD dtype attempts
    
    If you try to use a non-POD data type, you get difficult-to-interpret
    compilation errors (about ::name() not being a member of an internal
    pybind11 struct, among others), for which isn't at all obvious what the
    problem is.
    
    This adds a static_assert for such cases.
    
    It also changes the base case from an empty struct to the is_pod_struct
    case by no longer using `enable_if<is_pod_struct>` but instead using a
    static_assert: thus specializations avoid the base class, POD types
    work, and non-POD types (and unimplemented POD types like std::array)
    get a more informative static_assert failure.
    
    * Prefix macros with PYBIND11_
    
    numpy.h uses unprefixed macros, which seems undesirable.  This prefixes
    them with PYBIND11_ to match all the other macros in numpy.h (and
    elsewhere).
    
    * Add long double support
    
    This adds long double and std::complex<long double> support for numpy
    arrays.
    
    This allows some simplification of the code used to generate format
    descriptors; the new code uses fewer macros, instead putting the code as
    different templated options; the template conditions end up simpler with
    this because we are now supporting all basic C++ arithmetic types (and
    so can use is_arithmetic instead of is_integral + multiple
    different specializations).
    
    In addition to testing that it is indeed working in the test script, it
    also adds various offset and size calculations there, which
    fixes the test failures under x86 compilations.
    f7f5bc8e
numpy.rst 10.7 KB