1. Sep 07, 2016
    • Jason Rhinelander's avatar
      Allow passing base types as a template parameter · 6b52c838
      Jason Rhinelander authored
      This allows a slightly cleaner base type specification of:
      
          py::class_<Type, Base>("Type")
      
      as an alternative to
      
          py::class_<Type>("Type", py::base<Base>())
      
      As with the other template parameters, the order relative to the holder
      or trampoline types doesn't matter.
      
      This also includes a compile-time assertion failure if attempting to
      specify more than one base class (but is easily extendible to support
      multiple inheritance, someday, by updating the class_selector::set_bases
      function to set multiple bases).
      6b52c838
    • Jason Rhinelander's avatar
      Allow arbitrary class_ template option ordering · 5fffe200
      Jason Rhinelander authored
      The current pybind11::class_<Type, Holder, Trampoline> fixed template
      ordering results in a requirement to repeat the Holder with its default
      value (std::unique_ptr<Type>) argument, which is a little bit annoying:
      it needs to be specified not because we want to override the default,
      but rather because we need to specify the third argument.
      
      This commit removes this limitation by making the class_ template take
      the type name plus a parameter pack of options.  It then extracts the
      first valid holder type and the first subclass type for holder_type and
      trampoline type_alias, respectively.  (If unfound, both fall back to
      their current defaults, `std::unique_ptr<type>` and `type`,
      respectively).  If any unmatched template arguments are provided, a
      static assertion fails.
      
      What this means is that you can specify or omit the arguments in any
      order:
      
          py::class_<A, PyA> c1(m, "A");
          py::class_<B, PyB, std::shared_ptr<B>> c2(m, "B");
          py::class_<C, std::shared_ptr<C>, PyB> c3(m, "C");
      
      It also allows future class attributes (such as base types in the next
      commit) to be passed as class template types rather than needing to use
      a py::base<> wrapper.
      5fffe200
  2. Sep 06, 2016
  3. Sep 05, 2016
  4. Sep 04, 2016
    • Wenzel Jakob's avatar
      minor code style fixes · f3be07c6
      Wenzel Jakob authored
      f3be07c6
    • Wenzel Jakob's avatar
      Merge pull request #379 from nevion/buffer_info · 987be18f
      Wenzel Jakob authored
      Buffer info improvements
      987be18f
    • Wenzel Jakob's avatar
      minor code style checker update · 85f07e18
      Wenzel Jakob authored
      85f07e18
    • Wenzel Jakob's avatar
      Merge pull request #381 from jagerman/tests-self-registering · 2ea4b8e8
      Wenzel Jakob authored
      Make test initialization self-registering
      2ea4b8e8
    • Jason Rhinelander's avatar
      Make test initialization self-registering · 52f4be89
      Jason Rhinelander authored
      Adding or removing tests is a little bit cumbersome currently: the test
      needs to be added to CMakeLists.txt, the init function needs to be
      predeclared in pybind11_tests.cpp, then called in the plugin
      initialization.  While this isn't a big deal for tests that are being
      committed, it's more of a hassle when working on some new feature or
      test code for which I temporarily only care about building and linking
      the test being worked on rather than the entire test suite.
      
      This commit changes tests to self-register their initialization by
      having each test initialize a local object (which stores the
      initialization function in a static variable).  This makes changing the
      set of tests being build easy: one only needs to add or comment out
      test names in tests/CMakeLists.txt.
      
      A couple other minor changes that go along with this:
      
      - test_eigen.cpp is now included in the test list, then removed if eigen
        isn't available.  This lets you disable the eigen tests by commenting
        it out, just like all the other tests, but keeps the build working
        without eigen eigen isn't available.  (Also, if it's commented out, we
        don't even bother looking for and reporting the building with/without
        eigen status message).
      
      - pytest is now invoked with all the built test names (with .cpp changed
        to .py) so that it doesn't try to run tests that weren't built.
      52f4be89
  5. Sep 03, 2016
  6. Aug 30, 2016
    • Wenzel Jakob's avatar
      Merge pull request #373 from jagerman/style-check-fix · 06d8de11
      Wenzel Jakob authored
      Fix check-style exit status and improve failure messages
      06d8de11
    • Wenzel Jakob's avatar
      Merge pull request #374 from jagerman/tpl-tramp-resolution-fix · c50bd5cb
      Wenzel Jakob authored
      Fix template trampoline overload lookup failure
      c50bd5cb
    • Jason Rhinelander's avatar
      Add line numbers; show and highlight found tabs · d472f0f0
      Jason Rhinelander authored
      This makes the output considerably easier to use: it now highlights (in
      red) matched tabs (instead of just listing the filenames), and adds
      line numbers to both the tabs check and the space-less if check outputs.
      d472f0f0
    • Jason Rhinelander's avatar
      Fix template trampoline overload lookup failure · 20978263
      Jason Rhinelander authored
      Problem
      =======
      
      The template trampoline pattern documented in PR #322 has a problem with
      virtual method overloads in intermediate classes in the inheritance
      chain between the trampoline class and the base class.
      
      For example, consider the following inheritance structure, where `B` is
      the actual class, `PyB<B>` is the trampoline class, and `PyA<B>` is an
      intermediate class adding A's methods into the trampoline:
      
          PyB<B> -> PyA<B> -> B -> A
      
      Suppose PyA<B> has a method `some_method()` with a PYBIND11_OVERLOAD in
      it to overload the virtual `A::some_method()`.  If a Python class `C` is
      defined that inherits from the pybind11-registered `B` and tries to
      provide an overriding `some_method()`, the PYBIND11_OVERLOADs declared
      in PyA<B> fails to find this overloaded method, and thus never invoke it
      (or, if pure virtual and not overridden in PyB<B>, raises an exception).
      
      This happens because the base (internal) `PYBIND11_OVERLOAD_INT` macro
      simply calls `get_overload(this, name)`; `get_overload()` then uses the
      inferred type of `this` to do a type lookup in `registered_types_cpp`.
      This is where it fails: `this` will be a `PyA<B> *`, but `PyA<B>` is
      neither the base type (`B`) nor the trampoline type (`PyB<B>`).  As a
      result, the overload fails and we get a failed overload lookup.
      
      The fix
      =======
      
      The fix is relatively simple: we can cast `this` passed to
      `get_overload()` to a `const B *`, which lets get_overload look up the
      correct class.  Since trampoline classes should be derived from `B`
      classes anyway, this cast should be perfectly safe.
      
      This does require adding the class name as an argument to the
      PYBIND11_OVERLOAD_INT macro, but leaves the public macro signatures
      unchanged.
      20978263
    • Jason Rhinelander's avatar
      Fix check-style exit status · 5a3570c4
      Jason Rhinelander authored
      The check-style exit status wasn't being propagated properly because
      the loops were running in a subshell (and so the change the the
      `errors` variable wasn't in the active command shell).  This fixes it
      by running the greps in subshells and the loops in the main shell.
      
      This also avoids the if(/for(/while( style check on
      tests/CMakeLists.txt, since it *does* have if() statements with no space
      that are producing error messages, but that is (acceptable) CMake style.
      5a3570c4
    • Wenzel Jakob's avatar
      Merge pull request #371 from jagerman/overload-name-doc-fix · d9b3db3e
      Wenzel Jakob authored
      Doc fix for OVERLOAD*_NAME macros
      d9b3db3e