1. 13 Aug, 2016 7 commits
  2. 12 Aug, 2016 1 commit
    • Jason Rhinelander's avatar
      Added pybind11::make_key_iterator for map iteration · 5aa85be2
      Jason Rhinelander authored
      This allows exposing a dict-like interface to python code, allowing
      iteration over keys via:
      
          for k in custommapping:
              ...
      
      while still allowing iteration over pairs, so that you can also
      implement 'dict.items()' functionality which returns a pair iterator,
      allowing:
      
          for k, v in custommapping.items():
              ...
      
      example-sequences-and-iterators is updated with a custom class providing
      both types of iteration.
      5aa85be2
  3. 11 Aug, 2016 1 commit
    • Jason Rhinelander's avatar
      Silence MSVC warning · e20fc61a
      Jason Rhinelander authored
      PR #329 generates the following warning under MSVC:
      
          ...\cast.h(202): warning C4456: declaration of 'it' hides previous local declaration
      
      This renames the second iterator to silence it.
      e20fc61a
  4. 10 Aug, 2016 1 commit
    • Jason Rhinelander's avatar
      Implement reference_internal with a keep_alive · f2ecd892
      Jason Rhinelander authored
      reference_internal requires an `instance` field to track the returned
      reference's parent, but that's just a duplication of what
      keep_alive<0,1> does, so use a keep alive to do this to eliminate the
      duplication.
      f2ecd892
  5. 09 Aug, 2016 1 commit
    • Jason Rhinelander's avatar
      Track registered instances that share a pointer address · 1b05ce5b
      Jason Rhinelander authored
      The pointer to the first member of a class instance is the same as the
      pointer to instance itself; pybind11 has some workarounds for this to
      not track registered instances that have a registered parent with the
      same address.  This doesn't work everywhere, however: issue #328 is a
      failure of this for a mutator operator which resolves its argument to
      the parent rather than the child, as is needed in #328.
      
      This commit resolves the issue (and restores tracking of same-address
      instances) by changing registered_instances from an unordered_map to an
      unordered_multimap that allows duplicate instances for the same pointer
      to be recorded, then resolves these differences by checking the type of
      each matched instance when looking up an instance.  (A
      unordered_multimap seems cleaner for this than a unordered_map<list> or
      similar because, the vast majority of the time, the instance will be
      unique).
      1b05ce5b
  6. 08 Aug, 2016 1 commit
    • Jason Rhinelander's avatar
      Move support for return values of called Python functions · ed14879a
      Jason Rhinelander authored
      Currently pybind11 always translates values returned by Python functions
      invoked from C++ code by copying, even when moving is feasible--and,
      more importantly, even when moving is required.
      
      The first, and relatively minor, concern is that moving may be
      considerably more efficient for some types.  The second problem,
      however, is more serious: there's currently no way python code can
      return a non-copyable type to C++ code.
      
      I ran into this while trying to add a PYBIND11_OVERLOAD of a virtual
      method that returns just such a type: it simply fails to compile because
      this:
      
          overload = ...
          overload(args).template cast<ret_type>();
      
      involves a copy: overload(args) returns an object instance, and the
      invoked object::cast() loads the returned value, then returns a copy of
      the loaded value.
      
      We can, however, safely move that returned value *if* the object has the
      only reference to it (i.e. if ref_count() == 1) and the object is
      itself temporary (i.e. if it's an rvalue).
      
      This commit does that by adding an rvalue-qualified object::cast()
      method that allows the returned value to be move-constructed out of the
      stored instance when feasible.
      
      This basically comes down to three cases:
      
      - For objects that are movable but not copyable, we always try the move,
        with a runtime exception raised if this would involve moving a value
        with multiple references.
      - When the type is both movable and non-trivially copyable, the move
        happens only if the invoked object has a ref_count of 1, otherwise the
        object is copied.  (Trivially copyable types are excluded from this
        case because they are typically just collections of primitive types,
        which can be copied just as easily as they can be moved.)
      - Non-movable and trivially copy constructible objects are simply
        copied.
      
      This also adds examples to example-virtual-functions that shows both a
      non-copyable object and a movable/copyable object in action: the former
      raises an exception if returned while holding a reference, the latter
      invokes a move constructor if unreferenced, or a copy constructor if
      referenced.
      
      Basically this allows code such as:
      
          class MyClass(Pybind11Class):
              def somemethod(self, whatever):
                  mt = MovableType(whatever)
                  # ...
                  return mt
      
      which allows the MovableType instance to be returned to the C++ code
      via its move constructor.
      
      Of course if you attempt to violate this by doing something like:
      
          self.value = MovableType(whatever)
          return self.value
      
      you get an exception--but right now, the pybind11-side of that code
      won't compile at all.
      ed14879a
  7. 04 Aug, 2016 7 commits
    • Dean Moldovan's avatar
      Fix signedness warnings · cb6cd695
      Dean Moldovan authored
      cb6cd695
    • Dean Moldovan's avatar
    • Dean Moldovan's avatar
      Use generic arg names for functions without explicitly named arguments · ecced6c5
      Dean Moldovan authored
      Example signatures (old => new):
        foo(int) => foo(arg0: int)
        bar(Object, int) => bar(self: Object, arg0: int)
      
      The change makes the signatures uniform for named and unnamed arguments
      and it helps static analysis tools reconstruct function signatures from
      docstrings.
      
      This also tweaks the signature whitespace style to better conform to
      PEP 8 for annotations and default arguments:
        " : " => ": "
        " = " => "="
      ecced6c5
    • Jason Rhinelander's avatar
      Eigen support for special matrix objects · 9ffb3dda
      Jason Rhinelander authored
      Functions returning specialized Eigen matrices like Eigen::DiagonalMatrix and
      Eigen::SelfAdjointView--which inherit from EigenBase but not
      DenseBase--isn't currently allowed; such classes are explicitly copyable
      into a Matrix (by definition), and so we can support functions that
      return them by copying the value into a Matrix then casting that
      resulting dense Matrix into a numpy.ndarray.  This commit does exactly
      that.
      9ffb3dda
    • Jason Rhinelander's avatar
      Fix eigen copying of non-standard stride values · 8657f308
      Jason Rhinelander authored
      Some Eigen objects, such as those returned by matrix.diagonal() and
      matrix.block() have non-standard stride values because they are
      basically just maps onto the underlying matrix without copying it (for
      example, the primary diagonal of a 3x3 matrix is a vector-like object
      with .src equal to the full matrix data, but with stride 4).  Returning
      such an object from a pybind11 method breaks, however, because pybind11
      assumes vectors have stride 1, and that matrices have strides equal to
      the number of rows/columns or 1 (depending on whether the matrix is
      stored column-major or row-major).
      
      This commit fixes the issue by making pybind11 use Eigen's stride
      methods when copying the data.
      8657f308
    • Jason Rhinelander's avatar
      Only support ==/!= int on unscoped enums · d41a2730
      Jason Rhinelander authored
      This makes the Python interface mirror the C++ interface:
      pybind11-exported scoped enums aren't directly comparable to the
      underlying integer values.
      d41a2730
    • Jason Rhinelander's avatar
      Fix scoped enums and add scoped enum example · 61354194
      Jason Rhinelander authored
      PR #309 broke scoped enums, which failed to compile because the added:
      
          value == value2
      
      comparison isn't valid for a scoped enum (they aren't implicitly
      convertible to the underlying type).  This commit fixes it by
      explicitly converting the enum value to its underlying type before
      doing the comparison.
      
      It also adds a scoped enum example to the constants-and-functions
      example that triggers the problem fixed in this commit.
      61354194
  8. 03 Aug, 2016 2 commits
    • Jason Rhinelander's avatar
      Add support for Eigen::Ref<...> function arguments · 5fd5074a
      Jason Rhinelander authored
      Eigen::Ref is a common way to pass eigen dense types without needing a
      template, e.g. the single definition `void
      func(Eigen::Ref<Eigen::MatrixXd> x)` can be called with any double
      matrix-like object.
      
      The current pybind11 eigen support fails with internal errors if
      attempting to bind a function with an Eigen::Ref<...> argument because
      Eigen::Ref<...> satisfies the "is_eigen_dense" requirement, but can't
      compile if actually used: Eigen::Ref<...> itself is not default
      constructible, and so the argument std::tuple containing an
      Eigen::Ref<...> isn't constructible, which results in compilation
      failure.
      
      This commit adds support for Eigen::Ref<...> by giving it its own
      type_caster implementation which consists of an internal type_caster of
      the referenced type, load/cast methods that dispatch to the internal
      type_caster, and a unique_ptr to an Eigen::Ref<> instance that gets
      set during load().
      
      There is, of course, no performance advantage for pybind11-using code of
      using Eigen::Ref<...>--we are allocating a matrix of the derived type
      when loading it--but this has the advantage of allowing pybind11 to bind
      transparently to C++ methods taking Eigen::Refs.
      5fd5074a
    • Pim Schellart's avatar
      Fix zero valued enum comparison error · 3d079fbd
      Pim Schellart authored
      3d079fbd
  9. 02 Aug, 2016 1 commit
  10. 01 Aug, 2016 1 commit
  11. 19 Jul, 2016 2 commits
  12. 18 Jul, 2016 2 commits
  13. 17 Jul, 2016 1 commit
    • Jason Rhinelander's avatar
      Fix #283: don't print first arg of constructor · 4e45e180
      Jason Rhinelander authored
      This changes the exception error message of a bad-arguments error to
      suppress the constructor argument when the failure is a constructor.
      
      This changes both the "Invoked with: " output to omit the object
      instances, and rewrites the constructor signature to make it look
      like a constructor (changing the first argument to the object name, and
      removing the ' -> NoneType' return type.
      4e45e180
  14. 12 Jul, 2016 1 commit
  15. 11 Jul, 2016 2 commits
  16. 10 Jul, 2016 1 commit
  17. 09 Jul, 2016 1 commit
  18. 08 Jul, 2016 5 commits
  19. 07 Jul, 2016 2 commits
    • Jason Rhinelander's avatar
      Only disable placement-new warning under gcc >= 6 · 0b12f91f
      Jason Rhinelander authored
      Otherwise this would create unknown option warnings under g++ < 6.
      0b12f91f
    • Jason Rhinelander's avatar
      Disable -Wplacement-new warning false alarm · cae0e009
      Jason Rhinelander authored
      GCC-6 adds a -Wplacement-new warning that warns for placement-new into a
      space that is too small, which is sometimes being triggered here (e.g.
      example5 always generates the warning under g++-6).  It's a false
      warning, however: the line immediately before just checked the size, and
      so this line is never going to actually be reached in the cases where
      the GCC warning is being triggered.
      
      This localizes the warning disabling just to this one spot as there are
      other placement-new uses in pybind11 where this warning could warn about
      legitimate future problems.
      cae0e009