1. 27 Jun, 2017 1 commit
  2. 25 Jun, 2017 1 commit
  3. 24 Jun, 2017 3 commits
  4. 15 Jun, 2017 1 commit
  5. 12 Jun, 2017 1 commit
    • Jason Rhinelander's avatar
      Support multiple inheritance from python · e45c2114
      Jason Rhinelander authored
      This commit allows multiple inheritance of pybind11 classes from
      Python, e.g.
      
          class MyType(Base1, Base2):
              def __init__(self):
                  Base1.__init__(self)
                  Base2.__init__(self)
      
      where Base1 and Base2 are pybind11-exported classes.
      
      This requires collapsing the various builtin base objects
      (pybind11_object_56, ...) introduced in 2.1 into a single
      pybind11_object of a fixed size; this fixed size object allocates enough
      space to contain either a simple object (one base class & small* holder
      instance), or a pointer to a new allocation that can contain an
      arbitrary number of base classes and holders, with holder size
      unrestricted.
      
      * "small" here means having a sizeof() of at most 2 pointers, which is
      enough to fit unique_ptr (sizeof is 1 ptr) and shared_ptr (sizeof is 2
      ptrs).
      
      To minimize the performance impact, this repurposes
      `internals::registered_types_py` to store a vector of pybind-registered
      base types.  For direct-use pybind types (e.g. the `PyA` for a C++ `A`)
      this is simply storing the same thing as before, but now in a vector;
      for Python-side inherited types, the map lets us avoid having to do a
      base class traversal as long as we've seen the class before.  The
      change to vector is needed for multiple inheritance: Python types
      inheriting from multiple registered bases have one entry per base.
      e45c2114
  6. 08 Jun, 2017 1 commit
  7. 31 May, 2017 1 commit
  8. 29 May, 2017 1 commit
    • Dean Moldovan's avatar
      Replace PYBIND11_PLUGIN with PYBIND11_MODULE · 443ab594
      Dean Moldovan authored
      This commit also adds `doc()` to `object_api` as a shortcut for the
      `attr("__doc__")` accessor.
      
      The module macro changes from:
      ```c++
      PYBIND11_PLUGIN(example) {
          pybind11::module m("example", "pybind11 example plugin");
          m.def("add", [](int a, int b) { return a + b; });
          return m.ptr();
      }
      ```
      
      to:
      
      ```c++
      PYBIND11_MODULE(example, m) {
          m.doc() = "pybind11 example plugin";
          m.def("add", [](int a, int b) { return a + b; });
      }
      ```
      
      Using the old macro results in a deprecation warning. The warning
      actually points to the `pybind11_init` function (since attributes
      don't bind to macros), but the message should be quite clear:
      "PYBIND11_PLUGIN is deprecated, use PYBIND11_MODULE".
      443ab594
  9. 28 May, 2017 2 commits
  10. 27 May, 2017 2 commits
  11. 25 May, 2017 1 commit
    • Jason Rhinelander's avatar
      vectorize: pass-through of non-vectorizable args · f3ce00ea
      Jason Rhinelander authored
      This extends py::vectorize to automatically pass through
      non-vectorizable arguments.  This removes the need for the documented
      "explicitly exclude an argument" workaround.
      
      Vectorization now applies to arithmetic, std::complex, and POD types,
      passed as plain value or by const lvalue reference (previously only
      pass-by-value types were supported).  Non-const lvalue references and
      any other types are passed through as-is.
      
      Functions with rvalue reference arguments (whether vectorizable or not)
      are explicitly prohibited: an rvalue reference is inherently not
      something that can be passed multiple times and is thus unsuitable to
      being in a vectorized function.
      
      The vectorize returned value is also now more sensitive to inputs:
      previously it would return by value when all inputs are of size 1; this
      is now amended to having all inputs of size 1 *and* 0 dimensions.  Thus
      if you pass in, for example, [[1]], you get back a 1x1, 2D array, while
      previously you got back just the resulting single value.
      
      Vectorization of member function specializations is now also supported
      via `py::vectorize(&Class::method)`; this required passthrough support
      for the initial object pointer on the wrapping function pointer.
      f3ce00ea
  12. 24 May, 2017 1 commit
  13. 10 May, 2017 2 commits
    • Bruce Merry's avatar
      Allow std::complex field with PYBIND11_NUMPY_DTYPE (#831) · b82c0f0a
      Bruce Merry authored
      This exposed a few underlying issues:
      
      1. is_pod_struct was too strict to allow this. I've relaxed it to
      require only trivially copyable and standard layout, rather than POD
      (which additionally requires a trivial constructor, which std::complex
      violates).
      
      2. format_descriptor<std::complex<T>>::format() returned numpy format
      strings instead of PEP3118 format strings, but register_dtype
      feeds format codes of its fields to _dtype_from_pep3118. I've changed it
      to return PEP3118 format codes. format_descriptor is a public type, so
      this may be considered an incompatible change.
      
      3. register_structured_dtype tried to be smart about whether to mark
      fields as unaligned (with ^). However, it's examining the C++ alignment,
      rather than what numpy (or possibly PEP3118) thinks the alignment should
      be. For complex values those are different. I've made it mark all fields
      as ^ unconditionally, which should always be safe even if they are
      aligned, because we explicitly mark the padding.
      b82c0f0a
    • Bruce Merry's avatar
      Support arrays inside PYBIND11_NUMPY_DTYPE (#832) · 8e0d832c
      Bruce Merry authored
      Resolves #800.
      
      Both C++ arrays and std::array are supported, including mixtures like
      std::array<int, 2>[4]. In a multi-dimensional array of char, the last
      dimension is used to construct a numpy string type.
      8e0d832c
  14. 09 May, 2017 1 commit
    • Jason Rhinelander's avatar
      Make PYBIND11_CPP_STANDARD work under MSVC · 77710ff0
      Jason Rhinelander authored
      Under MSVC we were ignoring PYBIND11_CPP_STANDARD and simply not
      passing any standard (which makes MSVC default to its C++14 mode).
      
      MSVC 2015u3 added the `/std:c++14` and `/std:c++latest` flags; the
      latter, under MSVC 2017, enables some C++17 features (such as
      `std::optional` and `std::variant`), so it is something we need to
      start supporting under MSVC.
      
      This makes the PYBIND11_CPP_STANDARD cmake variable work under MSVC,
      defaulting it to /std:c++14 (matching the default -std=c++14 for
      non-MSVC).
      
      It also adds a new appveyor test running under MSVC 2017 with
      /std:c++latest, which runs (and passes) the
      `std::optional`/`std::variant` tests.
      
      Also updated the documentation to clarify the c++ flags and add show
      MSVC flag examples.
      77710ff0
  15. 08 May, 2017 1 commit
  16. 07 May, 2017 3 commits
    • Cris Luengo's avatar
    • Jason Rhinelander's avatar
      Use numpy rather than Eigen for copying · b68959e8
      Jason Rhinelander authored
      We're current copy by creating an Eigen::Map into the input numpy
      array, then assigning that to the basic eigen type, effectively having
      Eigen do the copy.  That doesn't work for negative strides, though:
      Eigen doesn't allow them.
      
      This commit makes numpy do the copying instead by allocating the eigen
      type, then having numpy copy from the input array into a numpy reference
      into the eigen object's data.  This also saves a copy when type
      conversion is required: numpy can do the conversion on-the-fly as part
      of the copy.
      
      Finally this commit also makes non-reference parameters respect the
      convert flag, declining the load when called in a noconvert pass with a
      convertible, but non-array input or an array with the wrong dtype.
      b68959e8
    • Cris Luengo's avatar
      d400f60c
  17. 29 Apr, 2017 1 commit
  18. 07 Apr, 2017 1 commit
  19. 02 Apr, 2017 1 commit
    • Dean Moldovan's avatar
      Add a scope guard call policy · 1ac19036
      Dean Moldovan authored
      ```c++
      m.def("foo", foo, py::call_guard<T>());
      ```
      
      is equivalent to:
      
      ```c++
      m.def("foo", [](args...) {
          T scope_guard;
          return foo(args...); // forwarded arguments
      });
      ```
      1ac19036
  20. 28 Mar, 2017 1 commit
  21. 22 Mar, 2017 7 commits
    • Wenzel Jakob's avatar
      minor style fix · 0d92938f
      Wenzel Jakob authored
      0d92938f
    • Wenzel Jakob's avatar
      d405b1b3
    • Wenzel Jakob's avatar
      Changelog for v2.1.0 (#759) · 62e5fef0
      Wenzel Jakob authored
      62e5fef0
    • Wenzel Jakob's avatar
      Nicer API to pass py::capsule destructor (#752) · b16421ed
      Wenzel Jakob authored
      * nicer py::capsule destructor mechanism
      * added destructor-only version of capsule & tests
      * added documentation for module destructors (fixes #733)
      b16421ed
    • Wenzel Jakob's avatar
      ab26259c
    • Jason Rhinelander's avatar
      array-unchecked: add runtime dimension support and array-compatible methods · 773339f1
      Jason Rhinelander authored
      The extends the previous unchecked support with the ability to
      determine the dimensions at runtime.  This incurs a small performance
      hit when used (versus the compile-time fixed alternative), but is still considerably
      faster than the full checks on every call that happen with
      `.at()`/`.mutable_at()`.
      773339f1
    • Jason Rhinelander's avatar
      array: add unchecked access via proxy object · 423a49b8
      Jason Rhinelander authored
      This adds bounds-unchecked access to arrays through a `a.unchecked<Type,
      Dimensions>()` method.  (For `array_t<T>`, the `Type` template parameter
      is omitted).  The mutable version (which requires the array have the
      `writeable` flag) is available as `a.mutable_unchecked<...>()`.
      
      Specifying the Dimensions as a template parameter allows storage of an
      std::array; having the strides and sizes stored that way (as opposed to
      storing a copy of the array's strides/shape pointers) allows the
      compiler to make significant optimizations of the shape() method that it
      can't make with a pointer; testing with nested loops of the form:
      
          for (size_t i0 = 0; i0 < r.shape(0); i0++)
              for (size_t i1 = 0; i1 < r.shape(1); i1++)
                  ...
                      r(i0, i1, ...) += 1;
      
      over a 10 million element array gives around a 25% speedup (versus using
      a pointer) for the 1D case, 33% for 2D, and runs more than twice as fast
      with a 5D array.
      423a49b8
  22. 12 Mar, 2017 1 commit
    • Dean Moldovan's avatar
      Fix readthedocs build (#721) · b7017c3d
      Dean Moldovan authored
      RTD updated their build environment which broke the 1.8.14.dev build of
      doxygen that we were using. The update also breaks the conda-forge build
      of 1.8.13 (but that version has other issues).
      
      Luckily, the RTD update did bring their doxygen version up to 1.8.11
      which is enough to parse the C++11 code we need (ref qualifiers) and it
      also avoids the segfault found in 1.8.13.
      
      Since we're using the native doxygen, conda isn't required anymore and
      we can simplify the RTD configuration.
      
      [skip ci]
      b7017c3d
  23. 03 Mar, 2017 1 commit
  24. 24 Feb, 2017 1 commit
    • Jason Rhinelander's avatar
      Eigen<->numpy referencing support · 17d0283e
      Jason Rhinelander authored
      This commit largely rewrites the Eigen dense matrix support to avoid
      copying in many cases: Eigen arguments can now reference numpy data, and
      numpy objects can now reference Eigen data (given compatible types).
      
      Eigen::Ref<...> arguments now also make use of the new `convert`
      argument use (added in PR #634) to avoid conversion, allowing
      `py::arg().noconvert()` to be used when binding a function to prohibit
      copying when invoking the function.  Respecting `convert` also means
      Eigen overloads that avoid copying will be preferred during overload
      resolution to ones that require copying.
      
      This commit also rewrites the Eigen documentation and test suite to
      explain and test the new capabilities.
      17d0283e
  25. 23 Feb, 2017 2 commits
    • Dean Moldovan's avatar
      Enable static properties (py::metaclass) by default · dd01665e
      Dean Moldovan authored
      Now that only one shared metaclass is ever allocated, it's extremely
      cheap to enable it for all pybind11 types.
      
      * Deprecate the default py::metaclass() since it's not needed anymore.
      * Allow users to specify a custom metaclass via py::metaclass(handle).
      dd01665e
    • Dean Moldovan's avatar
      Minor docs build maintenance (#692) · a3f4a02c
      Dean Moldovan authored
      * Switch breathe to stable releases. It was previously pulling directly
        from master because a required bugfix was not in a stable release yet.
      
      * Force update sphinx and RTD theme. When using conda, readthedocs pins
        sphinx==1.3.5 and sphinx_rtd_theme==0.1.7, which is a bit older than
        the ones used in the RTD regular (non-conda) build. The newer theme
        has nicer sidebar navigation (4-level depth vs. only 2-level on the
        older version). Note that the python==3.5 requirement must stay
        because RTD still installs the older sphinx at one point which isn't
        available with Python 3.6.
      
      [skip ci]
      a3f4a02c
  26. 17 Feb, 2017 1 commit