Merge pull request #269 from jagerman/ternary-description

Add _<bool>("s1", "s2") ternary & use TYPE_CASTER
This commit is contained in:
Wenzel Jakob 2016-07-06 07:09:00 +02:00 committed by GitHub
commit 4be37c17d7
3 changed files with 18 additions and 48 deletions

View File

@ -369,22 +369,7 @@ public:
} }
} }
static handle cast(const T *src, return_value_policy policy, handle parent) { PYBIND11_TYPE_CASTER(T, _<std::is_integral<T>::value>("int", "float"));
return cast(*src, policy, parent);
}
template <typename T2 = T, typename std::enable_if<std::is_integral<T2>::value, int>::type = 0>
static PYBIND11_DESCR name() { return type_descr(_("int")); }
template <typename T2 = T, typename std::enable_if<!std::is_integral<T2>::value, int>::type = 0>
static PYBIND11_DESCR name() { return type_descr(_("float")); }
operator T*() { return &value; }
operator T&() { return value; }
template <typename T2> using cast_op_type = pybind11::detail::cast_op_type<T2>;
protected:
T value;
}; };
template <> class type_caster<void_type> { template <> class type_caster<void_type> {

View File

@ -83,6 +83,16 @@ template <size_t...Digits> struct int_to_str<0, Digits...> {
static constexpr auto digits = descr<sizeof...(Digits), 0>({ ('0' + Digits)..., '\0' }, { nullptr }); static constexpr auto digits = descr<sizeof...(Digits), 0>({ ('0' + Digits)..., '\0' }, { nullptr });
}; };
// Ternary description (like std::conditional)
template <bool B, size_t Size1, size_t Size2>
constexpr typename std::enable_if<B, descr<Size1 - 1, 0>>::type _(char const(&text1)[Size1], char const(&)[Size2]) {
return _(text1);
}
template <bool B, size_t Size1, size_t Size2>
constexpr typename std::enable_if<!B, descr<Size2 - 1, 0>>::type _(char const(&)[Size1], char const(&text2)[Size2]) {
return _(text2);
}
template <size_t Size> auto constexpr _() { template <size_t Size> auto constexpr _() {
return int_to_str<Size / 10, Size % 10>::digits; return int_to_str<Size / 10, Size % 10>::digits;
} }
@ -153,6 +163,9 @@ PYBIND11_NOINLINE inline descr _(const char *text) {
return descr(text, types); return descr(text, types);
} }
template <bool B> PYBIND11_NOINLINE typename std::enable_if<B, descr>::type _(const char *text1, const char *) { return _(text1); }
template <bool B> PYBIND11_NOINLINE typename std::enable_if<!B, descr>::type _(char const *, const char *text2) { return _(text2); }
template <typename Type> PYBIND11_NOINLINE descr _() { template <typename Type> PYBIND11_NOINLINE descr _() {
const std::type_info *types[2] = { &typeid(Type), nullptr }; const std::type_info *types[2] = { &typeid(Type), nullptr };
return descr("%", types); return descr("%", types);

View File

@ -99,10 +99,6 @@ struct type_caster<Type, typename std::enable_if<is_eigen_dense<Type>::value>::t
return true; return true;
} }
static handle cast(const Type *src, return_value_policy policy, handle parent) {
return cast(*src, policy, parent);
}
static handle cast(const Type &src, return_value_policy /* policy */, handle /* parent */) { static handle cast(const Type &src, return_value_policy /* policy */, handle /* parent */) {
if (isVector) { if (isVector) {
return array(buffer_info( return array(buffer_info(
@ -139,15 +135,8 @@ struct type_caster<Type, typename std::enable_if<is_eigen_dense<Type>::value>::t
} }
} }
template <typename _T> using cast_op_type = pybind11::detail::cast_op_type<_T>; PYBIND11_TYPE_CASTER(Type, _("numpy.ndarray[dtype=") + npy_format_descriptor<Scalar>::name() +
_(", shape=(") + rows() + _(", ") + cols() + _(")]"));
static PYBIND11_DESCR name() {
return _("numpy.ndarray[dtype=") + npy_format_descriptor<Scalar>::name() +
_(", shape=(") + rows() + _(", ") + cols() + _(")]");
}
operator Type*() { return &value; }
operator Type&() { return value; }
protected: protected:
template <typename T = Type, typename std::enable_if<T::RowsAtCompileTime == Eigen::Dynamic, int>::type = 0> template <typename T = Type, typename std::enable_if<T::RowsAtCompileTime == Eigen::Dynamic, int>::type = 0>
@ -158,9 +147,6 @@ protected:
static PYBIND11_DESCR cols() { return _("n"); } static PYBIND11_DESCR cols() { return _("n"); }
template <typename T = Type, typename std::enable_if<T::ColsAtCompileTime != Eigen::Dynamic, int>::type = 0> template <typename T = Type, typename std::enable_if<T::ColsAtCompileTime != Eigen::Dynamic, int>::type = 0>
static PYBIND11_DESCR cols() { return _<T::ColsAtCompileTime>(); } static PYBIND11_DESCR cols() { return _<T::ColsAtCompileTime>(); }
protected:
Type value;
}; };
template<typename Type> template<typename Type>
@ -214,10 +200,6 @@ struct type_caster<Type, typename std::enable_if<is_eigen_sparse<Type>::value>::
return true; return true;
} }
static handle cast(const Type *src, return_value_policy policy, handle parent) {
return cast(*src, policy, parent);
}
static handle cast(const Type &src, return_value_policy /* policy */, handle /* parent */) { static handle cast(const Type &src, return_value_policy /* policy */, handle /* parent */) {
const_cast<Type&>(src).makeCompressed(); const_cast<Type&>(src).makeCompressed();
@ -275,18 +257,8 @@ struct type_caster<Type, typename std::enable_if<is_eigen_sparse<Type>::value>::
).release(); ).release();
} }
template <typename _T> using cast_op_type = pybind11::detail::cast_op_type<_T>; PYBIND11_TYPE_CASTER(Type, _<(Type::Flags & Eigen::RowMajorBit) != 0>("scipy.sparse.csr_matrix[dtype=", "scipy.sparse.csc_matrix[dtype=")
+ npy_format_descriptor<Scalar>::name() + _("]"));
template <typename T = Type, typename std::enable_if<(T::Flags & Eigen::RowMajorBit) != 0, int>::type = 0>
static PYBIND11_DESCR name() { return _("scipy.sparse.csr_matrix[dtype=") + npy_format_descriptor<Scalar>::name() + _("]"); }
template <typename T = Type, typename std::enable_if<(T::Flags & Eigen::RowMajorBit) == 0, int>::type = 0>
static PYBIND11_DESCR name() { return _("scipy.sparse.csc_matrix[dtype=") + npy_format_descriptor<Scalar>::name() + _("]"); }
operator Type*() { return &value; }
operator Type&() { return value; }
protected:
Type value;
}; };
NAMESPACE_END(detail) NAMESPACE_END(detail)