message: fixed ek::select() for custom data structures
diff: @@ -250,23 +250,25 @@ template <typename T, enable_if_not_array_t<T> = 0> T andnot(const T &a1, const
  template <typename M, typename T, typename F>
  ENOKI_INLINE auto select(const M &m, const T &t, const F &f) {
  + if constexpr (is_enoki_struct_v<T> && std::is_same_v<T, F>) {
  + T result;
  + struct_support_t<T>::apply_3(
  + t, f, result,
  + [&m](auto const &x1, auto const &x2, auto &x3) ENOKI_INLINE_LAMBDA {
  + x3 = select(m, x1, x2);
  + });
  + return result;
  + } else {
  using E = replace_scalar_t<array_t<typename detail::deepest<T, F, M>::type>,
  typename detail::expr<scalar_t<T>, scalar_t<F>>::type>;
  using EM = mask_t<E>;
  +
  if constexpr (!is_array_v<E>) {
  return (bool) m ? (E) t : (E) f;
  } else if constexpr (std::is_same_v<M, EM> &&
  std::is_same_v<T, E> &&
  std::is_same_v<F, E>) {
  return E::select_(m.derived(), t.derived(), f.derived());
  - } else if constexpr (is_enoki_struct_v<T> && std::is_same_v<T, F>) {
  - T result;
  - struct_support_t<T>::apply_3(
  - t, f, result,
  - [&m](auto const &x1, auto const &x2, auto &x3) ENOKI_INLINE_LAMBDA {
  - x3 = select(m, x1, x2);
  - });
  - return result;
  } else {
  return select(
  static_cast<ref_cast_t<M, EM>>(m),
  @@ -274,6 +276,7 @@ ENOKI_INLINE auto select(const M &m, const T &t, const F &f) {
  static_cast<ref_cast_t<F, E>>(f));
  }
  }
  +}
  /// Shuffle the entries of an array
  template <size_t... Is, typename T>
  