mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-22 01:29:35 +08:00
Enabled the construction of a fixed sized tensor directly from an expression.
This commit is contained in:
parent
3912ca0d53
commit
b80036abec
@ -492,6 +492,7 @@ class TensorBase<Derived, ReadOnlyAccessors>
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
template <typename Scalar, std::size_t NumIndices, int Options, typename IndexType> friend class Tensor;
|
template <typename Scalar, std::size_t NumIndices, int Options, typename IndexType> friend class Tensor;
|
||||||
|
template <typename Scalar, typename Dimensions, int Option, typename IndexTypes> friend class TensorFixedSize;
|
||||||
template <typename OtherDerived, int AccessLevel> friend class TensorBase;
|
template <typename OtherDerived, int AccessLevel> friend class TensorBase;
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
EIGEN_STRONG_INLINE const Derived& derived() const { return *static_cast<const Derived*>(this); }
|
EIGEN_STRONG_INLINE const Derived& derived() const { return *static_cast<const Derived*>(this); }
|
||||||
@ -508,6 +509,7 @@ class TensorBase<Derived, WriteAccessors> : public TensorBase<Derived, ReadOnlyA
|
|||||||
static const int NumDimensions = DerivedTraits::NumDimensions;
|
static const int NumDimensions = DerivedTraits::NumDimensions;
|
||||||
|
|
||||||
template <typename Scalar, std::size_t NumIndices, int Options, typename IndexType> friend class Tensor;
|
template <typename Scalar, std::size_t NumIndices, int Options, typename IndexType> friend class Tensor;
|
||||||
|
template <typename Scalar, typename Dimensions, int Option, typename IndexTypes> friend class TensorFixedSize;
|
||||||
template <typename OtherDerived, int AccessLevel> friend class TensorBase;
|
template <typename OtherDerived, int AccessLevel> friend class TensorBase;
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
|
@ -197,6 +197,23 @@ class TensorFixedSize : public TensorBase<TensorFixedSize<Scalar_, Dimensions_,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE TensorFixedSize(const TensorBase<OtherDerived, ReadOnlyAccessors>& other)
|
||||||
|
{
|
||||||
|
typedef TensorAssignOp<TensorFixedSize, const OtherDerived> Assign;
|
||||||
|
Assign assign(*this, other.derived());
|
||||||
|
internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
|
||||||
|
}
|
||||||
|
template<typename OtherDerived>
|
||||||
|
EIGEN_DEVICE_FUNC
|
||||||
|
EIGEN_STRONG_INLINE TensorFixedSize(const TensorBase<OtherDerived, WriteAccessors>& other)
|
||||||
|
{
|
||||||
|
typedef TensorAssignOp<TensorFixedSize, const OtherDerived> Assign;
|
||||||
|
Assign assign(*this, other.derived());
|
||||||
|
internal::TensorExecutor<const Assign, DefaultDevice>::run(assign, DefaultDevice());
|
||||||
|
}
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
EIGEN_STRONG_INLINE TensorFixedSize& operator=(const TensorFixedSize& other)
|
EIGEN_STRONG_INLINE TensorFixedSize& operator=(const TensorFixedSize& other)
|
||||||
{
|
{
|
||||||
|
@ -68,10 +68,23 @@ void test_unsigned_64bit()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void test_specific()
|
||||||
|
{
|
||||||
|
// A particular combination that exposed a bug in the past.
|
||||||
|
int64_t div = 209715200;
|
||||||
|
int64_t num = 3238002688;
|
||||||
|
Eigen::internal::TensorIntDivisor<int64_t> divider =
|
||||||
|
Eigen::internal::TensorIntDivisor<int64_t>(div);
|
||||||
|
int64_t result = num/div;
|
||||||
|
int64_t result_op = divider.divide(num);
|
||||||
|
VERIFY_IS_EQUAL(result, result_op);
|
||||||
|
}
|
||||||
|
|
||||||
void test_cxx11_tensor_intdiv()
|
void test_cxx11_tensor_intdiv()
|
||||||
{
|
{
|
||||||
CALL_SUBTEST_1(test_signed_32bit());
|
CALL_SUBTEST_1(test_signed_32bit());
|
||||||
CALL_SUBTEST_2(test_unsigned_32bit());
|
CALL_SUBTEST_2(test_unsigned_32bit());
|
||||||
CALL_SUBTEST_3(test_signed_64bit());
|
CALL_SUBTEST_3(test_signed_64bit());
|
||||||
CALL_SUBTEST_4(test_unsigned_64bit());
|
CALL_SUBTEST_4(test_unsigned_64bit());
|
||||||
|
CALL_SUBTEST_5(test_specific());
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user