1. 16 Sep, 2017 1 commit
    • Dean Moldovan's avatar
      Use semi-constexpr signatures on MSVC · 56613945
      Dean Moldovan authored
      MSCV does not allow `&typeid(T)` in constexpr contexts, but the string
      part of the type signature can still be constexpr. In order to avoid
      `typeid` as long as possible, `descr` is modified to collect type
      information as template parameters instead of constexpr `typeid`.
      The actual `std::type_info` pointers are only collected in the end,
      as a `constexpr` (gcc/clang) or regular (MSVC) function call.
      
      Not only does it significantly reduce binary size on MSVC, gcc/clang
      benefit a little bit as well, since they can skip some intermediate
      `std::type_info*` arrays.
      56613945
  2. 14 Sep, 2017 1 commit
  3. 13 Sep, 2017 2 commits
  4. 12 Sep, 2017 2 commits
    • Dean Moldovan's avatar
      Make TypeErrors more informative when an optional header is missing · 2b4477eb
      Dean Moldovan authored
      E.g. trying to convert a `list` to a `std::vector<int>` without
      including <pybind11/stl.h> will now raise an error with a note that
      suggests checking the headers.
      
      The note is only appended if `std::` is found in the function
      signature. This should only be the case when a header is missing.
      E.g. when stl.h is included, the signature would contain `List[int]`
      instead of `std::vector<int>` while using stl_bind.h would produce
      something like `MyVector`. Similarly for `std::map`/`Dict`, `complex`,
      `std::function`/`Callable`, etc.
      
      There's a possibility for false positives, but it's pretty low.
      2b4477eb
    • Gunnar Läthén's avatar
      c64e6b16
  5. 10 Sep, 2017 3 commits
  6. 08 Sep, 2017 1 commit
  7. 07 Sep, 2017 1 commit
  8. 06 Sep, 2017 2 commits
  9. 04 Sep, 2017 2 commits
  10. 01 Sep, 2017 1 commit
  11. 31 Aug, 2017 4 commits
  12. 30 Aug, 2017 5 commits
  13. 28 Aug, 2017 3 commits
  14. 25 Aug, 2017 2 commits
  15. 23 Aug, 2017 2 commits
  16. 22 Aug, 2017 3 commits
  17. 20 Aug, 2017 2 commits
  18. 19 Aug, 2017 2 commits
    • Patrik Huber's avatar
      Fix typos in Eigen documentation · d265933d
      Patrik Huber authored
      Fixes one small variable name typo, and two instances where `py::arg().nocopy()` is used, where I think it should be `py::arg().noconvert()` instead. Probably `nocopy()` was the old/original name for it and then it was changed.
      d265933d
    • Jason Rhinelander's avatar
      Allow module-local classes to be loaded externally · 5e14aa6a
      Jason Rhinelander authored
      The main point of `py::module_local` is to make the C++ -> Python cast
      unique so that returning/casting a C++ instance is well-defined.
      Unfortunately it also makes loading unique, but this isn't particularly
      desirable: when an instance contains `Type` instance there's no reason
      it shouldn't be possible to pass that instance to a bound function
      taking a `Type` parameter, even if that function is in another module.
      
      This commit solves the issue by allowing foreign module (and global)
      type loaders have a chance to load the value if the local module loader
      fails.  The implementation here does this by storing a module-local
      loading function in a capsule in the python type, which we can then call
      if the local (and possibly global, if the local type is masking a global
      type) version doesn't work.
      5e14aa6a
  19. 17 Aug, 2017 1 commit
    • Jason Rhinelander's avatar
      Allow binding factory functions as constructors · 464d9896
      Jason Rhinelander authored
      This allows you to use:
      
          cls.def(py::init(&factory_function));
      
      where `factory_function` returns a pointer, holder, or value of the
      class type (or a derived type).  Various compile-time checks
      (static_asserts) are performed to ensure the function is valid, and
      various run-time type checks where necessary.
      
      Some other details of this feature:
      - The `py::init` name doesn't conflict with the templated no-argument
        `py::init<...>()`, but keeps the naming consistent: the existing
        templated, no-argument one wraps constructors, the no-template,
        function-argument one wraps factory functions.
      - If returning a CppClass (whether by value or pointer) when an CppAlias
        is required (i.e. python-side inheritance and a declared alias), a
        dynamic_cast to the alias is attempted (for the pointer version); if
        it fails, or if returned by value, an Alias(Class &&) constructor
        is invoked.  If this constructor doesn't exist, a runtime error occurs.
      - for holder returns when an alias is required, we try a dynamic_cast of
        the wrapped pointer to the alias to see if it is already an alias
        instance; if it isn't, we raise an error.
      - `py::init(class_factory, alias_factory)` is also available that takes
        two factories: the first is called when an alias is not needed, the
        second when it is.
      - Reimplement factory instance clearing.  The previous implementation
        failed under python-side multiple inheritance: *each* inherited
        type's factory init would clear the instance instead of only setting
        its own type value.  The new implementation here clears just the
        relevant value pointer.
      - dealloc is updated to explicitly set the leftover value pointer to
        nullptr and the `holder_constructed` flag to false so that it can be
        used to clear preallocated value without needing to rebuild the
        instance internals data.
      - Added various tests to test out new allocation/deallocation code.
      - With preallocation now done lazily, init factory holders can
        completely avoid the extra overhead of needing an extra
        allocation/deallocation.
      - Updated documentation to make factory constructors the default
        advanced constructor style.
      - If an `__init__` is called a second time, we have two choices: we can
        throw away the first instance, replacing it with the second; or we can
        ignore the second call.  The latter is slightly easier, so do that.
      464d9896