mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-10 23:21:47 +08:00
merge
This commit is contained in:
commit
24fa7a01bd
@ -507,7 +507,6 @@ set ( EIGEN_VERSION_MINOR ${EIGEN_MAJOR_VERSION} )
|
|||||||
set ( EIGEN_VERSION_PATCH ${EIGEN_MINOR_VERSION} )
|
set ( EIGEN_VERSION_PATCH ${EIGEN_MINOR_VERSION} )
|
||||||
set ( EIGEN_DEFINITIONS "")
|
set ( EIGEN_DEFINITIONS "")
|
||||||
set ( EIGEN_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/${INCLUDE_INSTALL_DIR}" )
|
set ( EIGEN_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/${INCLUDE_INSTALL_DIR}" )
|
||||||
set ( EIGEN_INCLUDE_DIRS ${EIGEN_INCLUDE_DIR} )
|
|
||||||
set ( EIGEN_ROOT_DIR ${CMAKE_INSTALL_PREFIX} )
|
set ( EIGEN_ROOT_DIR ${CMAKE_INSTALL_PREFIX} )
|
||||||
|
|
||||||
# Interface libraries require at least CMake 3.0
|
# Interface libraries require at least CMake 3.0
|
||||||
@ -531,6 +530,7 @@ if (NOT CMAKE_VERSION VERSION_LESS 3.0)
|
|||||||
configure_package_config_file (
|
configure_package_config_file (
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3Config.cmake.in
|
${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3Config.cmake.in
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
|
${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
|
||||||
|
PATH_VARS EIGEN_INCLUDE_DIR EIGEN_ROOT_DIR
|
||||||
INSTALL_DESTINATION ${CMAKEPACKAGE_INSTALL_DIR}
|
INSTALL_DESTINATION ${CMAKEPACKAGE_INSTALL_DIR}
|
||||||
NO_CHECK_REQUIRED_COMPONENTS_MACRO # Eigen does not provide components
|
NO_CHECK_REQUIRED_COMPONENTS_MACRO # Eigen does not provide components
|
||||||
)
|
)
|
||||||
@ -560,10 +560,30 @@ if (NOT CMAKE_VERSION VERSION_LESS 3.0)
|
|||||||
DESTINATION ${CMAKEPACKAGE_INSTALL_DIR})
|
DESTINATION ${CMAKEPACKAGE_INSTALL_DIR})
|
||||||
else (NOT CMAKE_VERSION VERSION_LESS 3.0)
|
else (NOT CMAKE_VERSION VERSION_LESS 3.0)
|
||||||
# Fallback to legacy Eigen3Config.cmake without the imported target
|
# Fallback to legacy Eigen3Config.cmake without the imported target
|
||||||
configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3ConfigLegacy.cmake.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
|
# If CMakePackageConfigHelpers module is available (CMake >= 2.8.8)
|
||||||
@ONLY ESCAPE_QUOTES
|
# create a relocatable Config file, otherwise leave the hardcoded paths
|
||||||
)
|
include(CMakePackageConfigHelpers OPTIONAL RESULT_VARIABLE CPCH_PATH)
|
||||||
|
|
||||||
|
if(CPCH_PATH)
|
||||||
|
configure_package_config_file (
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3ConfigLegacy.cmake.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
|
||||||
|
PATH_VARS EIGEN_INCLUDE_DIR EIGEN_ROOT_DIR
|
||||||
|
INSTALL_DESTINATION ${CMAKEPACKAGE_INSTALL_DIR}
|
||||||
|
NO_CHECK_REQUIRED_COMPONENTS_MACRO # Eigen does not provide components
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
# The PACKAGE_* variables are defined by the configure_package_config_file
|
||||||
|
# but without it we define them manually to the hardcoded paths
|
||||||
|
set(PACKAGE_INIT "")
|
||||||
|
set(PACKAGE_EIGEN_INCLUDE_DIR ${EIGEN_INCLUDE_DIR})
|
||||||
|
set(PACKAGE_EIGEN_ROOT_DIR ${EIGEN_ROOT_DIR})
|
||||||
|
configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Eigen3ConfigLegacy.cmake.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
|
||||||
|
@ONLY ESCAPE_QUOTES
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
install ( FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/UseEigen3.cmake
|
install ( FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/UseEigen3.cmake
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
|
${CMAKE_CURRENT_BINARY_DIR}/Eigen3Config.cmake
|
||||||
|
@ -407,7 +407,7 @@ struct dense_assignment_loop<Kernel, LinearVectorizedTraversal, NoUnrolling>
|
|||||||
: int(Kernel::AssignmentTraits::DstAlignment),
|
: int(Kernel::AssignmentTraits::DstAlignment),
|
||||||
srcAlignment = Kernel::AssignmentTraits::JointAlignment
|
srcAlignment = Kernel::AssignmentTraits::JointAlignment
|
||||||
};
|
};
|
||||||
const Index alignedStart = dstIsAligned ? 0 : internal::first_aligned<requestedAlignment>(&kernel.dstEvaluator().coeffRef(0), size);
|
const Index alignedStart = dstIsAligned ? 0 : internal::first_aligned<requestedAlignment>(kernel.dstDataPtr(), size);
|
||||||
const Index alignedEnd = alignedStart + ((size-alignedStart)/packetSize)*packetSize;
|
const Index alignedEnd = alignedStart + ((size-alignedStart)/packetSize)*packetSize;
|
||||||
|
|
||||||
unaligned_dense_assignment_loop<dstIsAligned!=0>::run(kernel, 0, alignedStart);
|
unaligned_dense_assignment_loop<dstIsAligned!=0>::run(kernel, 0, alignedStart);
|
||||||
@ -527,7 +527,7 @@ struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, NoUnrolling>
|
|||||||
dstAlignment = alignable ? int(requestedAlignment)
|
dstAlignment = alignable ? int(requestedAlignment)
|
||||||
: int(Kernel::AssignmentTraits::DstAlignment)
|
: int(Kernel::AssignmentTraits::DstAlignment)
|
||||||
};
|
};
|
||||||
const Scalar *dst_ptr = &kernel.dstEvaluator().coeffRef(0,0);
|
const Scalar *dst_ptr = kernel.dstDataPtr();
|
||||||
if((!bool(dstIsAligned)) && (UIntPtr(dst_ptr) % sizeof(Scalar))>0)
|
if((!bool(dstIsAligned)) && (UIntPtr(dst_ptr) % sizeof(Scalar))>0)
|
||||||
{
|
{
|
||||||
// the pointer is not aligend-on scalar, so alignment is not possible
|
// the pointer is not aligend-on scalar, so alignment is not possible
|
||||||
@ -683,6 +683,11 @@ public:
|
|||||||
: int(DstEvaluatorType::Flags)&RowMajorBit ? inner
|
: int(DstEvaluatorType::Flags)&RowMajorBit ? inner
|
||||||
: outer;
|
: outer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EIGEN_DEVICE_FUNC const Scalar* dstDataPtr() const
|
||||||
|
{
|
||||||
|
return m_dstExpr.data();
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
DstEvaluatorType& m_dst;
|
DstEvaluatorType& m_dst;
|
||||||
|
@ -432,7 +432,6 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
// friend class internal::GenericSparseBlockInnerIteratorImpl<XprType,BlockRows,BlockCols,InnerPanel>;
|
// friend class internal::GenericSparseBlockInnerIteratorImpl<XprType,BlockRows,BlockCols,InnerPanel>;
|
||||||
friend class ReverseInnerIterator;
|
|
||||||
friend struct internal::unary_evaluator<Block<XprType,BlockRows,BlockCols,InnerPanel>, internal::IteratorBased, Scalar >;
|
friend struct internal::unary_evaluator<Block<XprType,BlockRows,BlockCols,InnerPanel>, internal::IteratorBased, Scalar >;
|
||||||
|
|
||||||
Index nonZeros() const { return Dynamic; }
|
Index nonZeros() const { return Dynamic; }
|
||||||
@ -468,8 +467,6 @@ struct unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBa
|
|||||||
typedef typename XprType::StorageIndex StorageIndex;
|
typedef typename XprType::StorageIndex StorageIndex;
|
||||||
typedef typename XprType::Scalar Scalar;
|
typedef typename XprType::Scalar Scalar;
|
||||||
|
|
||||||
class ReverseInnerIterator;
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
IsRowMajor = XprType::IsRowMajor,
|
IsRowMajor = XprType::IsRowMajor,
|
||||||
|
|
||||||
|
@ -273,7 +273,6 @@ struct evaluator<SparseCompressedBase<Derived> >
|
|||||||
{
|
{
|
||||||
typedef typename Derived::Scalar Scalar;
|
typedef typename Derived::Scalar Scalar;
|
||||||
typedef typename Derived::InnerIterator InnerIterator;
|
typedef typename Derived::InnerIterator InnerIterator;
|
||||||
typedef typename Derived::ReverseInnerIterator ReverseInnerIterator;
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CoeffReadCost = NumTraits<Scalar>::ReadCost,
|
CoeffReadCost = NumTraits<Scalar>::ReadCost,
|
||||||
|
@ -68,7 +68,6 @@ protected:
|
|||||||
typedef typename XprType::StorageIndex StorageIndex;
|
typedef typename XprType::StorageIndex StorageIndex;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
class ReverseInnerIterator;
|
|
||||||
class InnerIterator
|
class InnerIterator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -161,7 +160,6 @@ protected:
|
|||||||
typedef typename XprType::StorageIndex StorageIndex;
|
typedef typename XprType::StorageIndex StorageIndex;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
class ReverseInnerIterator;
|
|
||||||
class InnerIterator
|
class InnerIterator
|
||||||
{
|
{
|
||||||
enum { IsRowMajor = (int(Rhs::Flags)&RowMajorBit)==RowMajorBit };
|
enum { IsRowMajor = (int(Rhs::Flags)&RowMajorBit)==RowMajorBit };
|
||||||
@ -249,7 +247,6 @@ protected:
|
|||||||
typedef typename XprType::StorageIndex StorageIndex;
|
typedef typename XprType::StorageIndex StorageIndex;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
class ReverseInnerIterator;
|
|
||||||
class InnerIterator
|
class InnerIterator
|
||||||
{
|
{
|
||||||
enum { IsRowMajor = (int(Lhs::Flags)&RowMajorBit)==RowMajorBit };
|
enum { IsRowMajor = (int(Lhs::Flags)&RowMajorBit)==RowMajorBit };
|
||||||
@ -402,7 +399,6 @@ protected:
|
|||||||
typedef typename traits<XprType>::Scalar Scalar;
|
typedef typename traits<XprType>::Scalar Scalar;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
class ReverseInnerIterator;
|
|
||||||
class InnerIterator
|
class InnerIterator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -487,7 +483,6 @@ protected:
|
|||||||
typedef typename traits<XprType>::Scalar Scalar;
|
typedef typename traits<XprType>::Scalar Scalar;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
class ReverseInnerIterator;
|
|
||||||
class InnerIterator
|
class InnerIterator
|
||||||
{
|
{
|
||||||
enum { IsRowMajor = (int(RhsArg::Flags)&RowMajorBit)==RowMajorBit };
|
enum { IsRowMajor = (int(RhsArg::Flags)&RowMajorBit)==RowMajorBit };
|
||||||
@ -561,7 +556,6 @@ protected:
|
|||||||
typedef typename traits<XprType>::Scalar Scalar;
|
typedef typename traits<XprType>::Scalar Scalar;
|
||||||
public:
|
public:
|
||||||
|
|
||||||
class ReverseInnerIterator;
|
|
||||||
class InnerIterator
|
class InnerIterator
|
||||||
{
|
{
|
||||||
enum { IsRowMajor = (int(LhsArg::Flags)&RowMajorBit)==RowMajorBit };
|
enum { IsRowMajor = (int(LhsArg::Flags)&RowMajorBit)==RowMajorBit };
|
||||||
|
@ -22,7 +22,6 @@ struct unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>
|
|||||||
typedef CwiseUnaryOp<UnaryOp, ArgType> XprType;
|
typedef CwiseUnaryOp<UnaryOp, ArgType> XprType;
|
||||||
|
|
||||||
class InnerIterator;
|
class InnerIterator;
|
||||||
class ReverseInnerIterator;
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CoeffReadCost = evaluator<ArgType>::CoeffReadCost + functor_traits<UnaryOp>::Cost,
|
CoeffReadCost = evaluator<ArgType>::CoeffReadCost + functor_traits<UnaryOp>::Cost,
|
||||||
@ -41,7 +40,6 @@ struct unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
|
typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
|
||||||
// typedef typename evaluator<ArgType>::ReverseInnerIterator EvalReverseIterator;
|
|
||||||
|
|
||||||
const UnaryOp m_functor;
|
const UnaryOp m_functor;
|
||||||
evaluator<ArgType> m_argImpl;
|
evaluator<ArgType> m_argImpl;
|
||||||
@ -70,33 +68,6 @@ class unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::InnerIterat
|
|||||||
Scalar& valueRef();
|
Scalar& valueRef();
|
||||||
};
|
};
|
||||||
|
|
||||||
// template<typename UnaryOp, typename ArgType>
|
|
||||||
// class unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::ReverseInnerIterator
|
|
||||||
// : public unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::EvalReverseIterator
|
|
||||||
// {
|
|
||||||
// typedef typename XprType::Scalar Scalar;
|
|
||||||
// typedef typename unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::EvalReverseIterator Base;
|
|
||||||
// public:
|
|
||||||
//
|
|
||||||
// EIGEN_STRONG_INLINE ReverseInnerIterator(const XprType& unaryOp, typename XprType::Index outer)
|
|
||||||
// : Base(unaryOp.derived().nestedExpression(),outer), m_functor(unaryOp.derived().functor())
|
|
||||||
// {}
|
|
||||||
//
|
|
||||||
// EIGEN_STRONG_INLINE ReverseInnerIterator& operator--()
|
|
||||||
// { Base::operator--(); return *this; }
|
|
||||||
//
|
|
||||||
// EIGEN_STRONG_INLINE Scalar value() const { return m_functor(Base::value()); }
|
|
||||||
//
|
|
||||||
// protected:
|
|
||||||
// const UnaryOp m_functor;
|
|
||||||
// private:
|
|
||||||
// Scalar& valueRef();
|
|
||||||
// };
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template<typename ViewOp, typename ArgType>
|
template<typename ViewOp, typename ArgType>
|
||||||
struct unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>
|
struct unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>
|
||||||
: public evaluator_base<CwiseUnaryView<ViewOp,ArgType> >
|
: public evaluator_base<CwiseUnaryView<ViewOp,ArgType> >
|
||||||
@ -105,7 +76,6 @@ struct unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>
|
|||||||
typedef CwiseUnaryView<ViewOp, ArgType> XprType;
|
typedef CwiseUnaryView<ViewOp, ArgType> XprType;
|
||||||
|
|
||||||
class InnerIterator;
|
class InnerIterator;
|
||||||
class ReverseInnerIterator;
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CoeffReadCost = evaluator<ArgType>::CoeffReadCost + functor_traits<ViewOp>::Cost,
|
CoeffReadCost = evaluator<ArgType>::CoeffReadCost + functor_traits<ViewOp>::Cost,
|
||||||
@ -120,7 +90,6 @@ struct unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
|
typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
|
||||||
// typedef typename evaluator<ArgType>::ReverseInnerIterator EvalReverseIterator;
|
|
||||||
|
|
||||||
const ViewOp m_functor;
|
const ViewOp m_functor;
|
||||||
evaluator<ArgType> m_argImpl;
|
evaluator<ArgType> m_argImpl;
|
||||||
@ -148,29 +117,6 @@ class unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::InnerItera
|
|||||||
const ViewOp m_functor;
|
const ViewOp m_functor;
|
||||||
};
|
};
|
||||||
|
|
||||||
// template<typename ViewOp, typename ArgType>
|
|
||||||
// class unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::ReverseInnerIterator
|
|
||||||
// : public unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::EvalReverseIterator
|
|
||||||
// {
|
|
||||||
// typedef typename XprType::Scalar Scalar;
|
|
||||||
// typedef typename unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::EvalReverseIterator Base;
|
|
||||||
// public:
|
|
||||||
//
|
|
||||||
// EIGEN_STRONG_INLINE ReverseInnerIterator(const XprType& unaryOp, typename XprType::Index outer)
|
|
||||||
// : Base(unaryOp.derived().nestedExpression(),outer), m_functor(unaryOp.derived().functor())
|
|
||||||
// {}
|
|
||||||
//
|
|
||||||
// EIGEN_STRONG_INLINE ReverseInnerIterator& operator--()
|
|
||||||
// { Base::operator--(); return *this; }
|
|
||||||
//
|
|
||||||
// EIGEN_STRONG_INLINE Scalar value() const { return m_functor(Base::value()); }
|
|
||||||
// EIGEN_STRONG_INLINE Scalar& valueRef() { return m_functor(Base::valueRef()); }
|
|
||||||
//
|
|
||||||
// protected:
|
|
||||||
// const ViewOp m_functor;
|
|
||||||
// };
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
|
@ -185,20 +185,27 @@ class Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType
|
|||||||
EIGEN_SPARSE_PUBLIC_INTERFACE(Ref)
|
EIGEN_SPARSE_PUBLIC_INTERFACE(Ref)
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
inline Ref(const SparseMatrixBase<Derived>& expr)
|
inline Ref(const SparseMatrixBase<Derived>& expr) : m_hasCopy(false)
|
||||||
{
|
{
|
||||||
construct(expr.derived(), typename Traits::template match<Derived>::type());
|
construct(expr.derived(), typename Traits::template match<Derived>::type());
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Ref(const Ref& other) : Base(other) {
|
inline Ref(const Ref& other) : Base(other), m_hasCopy(false) {
|
||||||
// copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy
|
// copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename OtherRef>
|
template<typename OtherRef>
|
||||||
inline Ref(const RefBase<OtherRef>& other) {
|
inline Ref(const RefBase<OtherRef>& other) : m_hasCopy(false) {
|
||||||
construct(other.derived(), typename Traits::template match<OtherRef>::type());
|
construct(other.derived(), typename Traits::template match<OtherRef>::type());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~Ref() {
|
||||||
|
if(m_hasCopy) {
|
||||||
|
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes);
|
||||||
|
obj->~TPlainObjectType();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
template<typename Expression>
|
template<typename Expression>
|
||||||
@ -208,6 +215,7 @@ class Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType
|
|||||||
{
|
{
|
||||||
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes);
|
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes);
|
||||||
::new (obj) TPlainObjectType(expr);
|
::new (obj) TPlainObjectType(expr);
|
||||||
|
m_hasCopy = true;
|
||||||
Base::construct(*obj);
|
Base::construct(*obj);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -221,11 +229,13 @@ class Ref<const SparseMatrix<MatScalar,MatOptions,MatIndex>, Options, StrideType
|
|||||||
{
|
{
|
||||||
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes);
|
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes);
|
||||||
::new (obj) TPlainObjectType(expr);
|
::new (obj) TPlainObjectType(expr);
|
||||||
|
m_hasCopy = true;
|
||||||
Base::construct(*obj);
|
Base::construct(*obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
char m_object_bytes[sizeof(TPlainObjectType)];
|
char m_object_bytes[sizeof(TPlainObjectType)];
|
||||||
|
bool m_hasCopy;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -293,20 +303,27 @@ class Ref<const SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType
|
|||||||
EIGEN_SPARSE_PUBLIC_INTERFACE(Ref)
|
EIGEN_SPARSE_PUBLIC_INTERFACE(Ref)
|
||||||
|
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
inline Ref(const SparseMatrixBase<Derived>& expr)
|
inline Ref(const SparseMatrixBase<Derived>& expr) : m_hasCopy(false)
|
||||||
{
|
{
|
||||||
construct(expr.derived(), typename Traits::template match<Derived>::type());
|
construct(expr.derived(), typename Traits::template match<Derived>::type());
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Ref(const Ref& other) : Base(other) {
|
inline Ref(const Ref& other) : Base(other), m_hasCopy(false) {
|
||||||
// copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy
|
// copy constructor shall not copy the m_object, to avoid unnecessary malloc and copy
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename OtherRef>
|
template<typename OtherRef>
|
||||||
inline Ref(const RefBase<OtherRef>& other) {
|
inline Ref(const RefBase<OtherRef>& other) : m_hasCopy(false) {
|
||||||
construct(other.derived(), typename Traits::template match<OtherRef>::type());
|
construct(other.derived(), typename Traits::template match<OtherRef>::type());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~Ref() {
|
||||||
|
if(m_hasCopy) {
|
||||||
|
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes);
|
||||||
|
obj->~TPlainObjectType();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
template<typename Expression>
|
template<typename Expression>
|
||||||
@ -320,11 +337,13 @@ class Ref<const SparseVector<MatScalar,MatOptions,MatIndex>, Options, StrideType
|
|||||||
{
|
{
|
||||||
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes);
|
TPlainObjectType* obj = reinterpret_cast<TPlainObjectType*>(m_object_bytes);
|
||||||
::new (obj) TPlainObjectType(expr);
|
::new (obj) TPlainObjectType(expr);
|
||||||
|
m_hasCopy = true;
|
||||||
Base::construct(*obj);
|
Base::construct(*obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
char m_object_bytes[sizeof(TPlainObjectType)];
|
char m_object_bytes[sizeof(TPlainObjectType)];
|
||||||
|
bool m_hasCopy;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
@ -56,7 +56,6 @@ struct unary_evaluator<Transpose<ArgType>, IteratorBased>
|
|||||||
: public evaluator_base<Transpose<ArgType> >
|
: public evaluator_base<Transpose<ArgType> >
|
||||||
{
|
{
|
||||||
typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
|
typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
|
||||||
typedef typename evaluator<ArgType>::ReverseInnerIterator EvalReverseIterator;
|
|
||||||
public:
|
public:
|
||||||
typedef Transpose<ArgType> XprType;
|
typedef Transpose<ArgType> XprType;
|
||||||
|
|
||||||
@ -75,17 +74,6 @@ struct unary_evaluator<Transpose<ArgType>, IteratorBased>
|
|||||||
Index col() const { return EvalIterator::row(); }
|
Index col() const { return EvalIterator::row(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
class ReverseInnerIterator : public EvalReverseIterator
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
EIGEN_STRONG_INLINE ReverseInnerIterator(const unary_evaluator& unaryOp, Index outer)
|
|
||||||
: EvalReverseIterator(unaryOp.m_argImpl,outer)
|
|
||||||
{}
|
|
||||||
|
|
||||||
Index row() const { return EvalReverseIterator::col(); }
|
|
||||||
Index col() const { return EvalReverseIterator::row(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
|
CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
|
||||||
Flags = XprType::Flags
|
Flags = XprType::Flags
|
||||||
|
@ -11,9 +11,9 @@ set (EIGEN3_FOUND 1)
|
|||||||
set (EIGEN3_USE_FILE "${CMAKE_CURRENT_LIST_DIR}/UseEigen3.cmake")
|
set (EIGEN3_USE_FILE "${CMAKE_CURRENT_LIST_DIR}/UseEigen3.cmake")
|
||||||
|
|
||||||
set (EIGEN3_DEFINITIONS "@EIGEN_DEFINITIONS@")
|
set (EIGEN3_DEFINITIONS "@EIGEN_DEFINITIONS@")
|
||||||
set (EIGEN3_INCLUDE_DIR "@EIGEN_INCLUDE_DIR@")
|
set (EIGEN3_INCLUDE_DIR "@PACKAGE_EIGEN_INCLUDE_DIR@")
|
||||||
set (EIGEN3_INCLUDE_DIRS "@EIGEN_INCLUDE_DIRS@")
|
set (EIGEN3_INCLUDE_DIRS "@PACKAGE_EIGEN_INCLUDE_DIR@")
|
||||||
set (EIGEN3_ROOT_DIR "@EIGEN_ROOT_DIR@")
|
set (EIGEN3_ROOT_DIR "@PACKAGE_EIGEN_ROOT_DIR@")
|
||||||
|
|
||||||
set (EIGEN3_VERSION_STRING "@EIGEN_VERSION_STRING@")
|
set (EIGEN3_VERSION_STRING "@EIGEN_VERSION_STRING@")
|
||||||
set (EIGEN3_VERSION_MAJOR "@EIGEN_VERSION_MAJOR@")
|
set (EIGEN3_VERSION_MAJOR "@EIGEN_VERSION_MAJOR@")
|
||||||
|
@ -14,13 +14,15 @@
|
|||||||
# EIGEN3_VERSION_MINOR - The minor version of Eigen
|
# EIGEN3_VERSION_MINOR - The minor version of Eigen
|
||||||
# EIGEN3_VERSION_PATCH - The patch version of Eigen
|
# EIGEN3_VERSION_PATCH - The patch version of Eigen
|
||||||
|
|
||||||
|
@PACKAGE_INIT@
|
||||||
|
|
||||||
set ( EIGEN3_FOUND 1 )
|
set ( EIGEN3_FOUND 1 )
|
||||||
set ( EIGEN3_USE_FILE "${CMAKE_CURRENT_LIST_DIR}/UseEigen3.cmake" )
|
set ( EIGEN3_USE_FILE "${CMAKE_CURRENT_LIST_DIR}/UseEigen3.cmake" )
|
||||||
|
|
||||||
set ( EIGEN3_DEFINITIONS "@EIGEN_DEFINITIONS@" )
|
set ( EIGEN3_DEFINITIONS "@EIGEN_DEFINITIONS@" )
|
||||||
set ( EIGEN3_INCLUDE_DIR "@EIGEN_INCLUDE_DIR@" )
|
set ( EIGEN3_INCLUDE_DIR "@PACKAGE_EIGEN_INCLUDE_DIR@" )
|
||||||
set ( EIGEN3_INCLUDE_DIRS "@EIGEN_INCLUDE_DIRS@" )
|
set ( EIGEN3_INCLUDE_DIRS "@PACKAGE_EIGEN_INCLUDE_DIR@" )
|
||||||
set ( EIGEN3_ROOT_DIR "@EIGEN_ROOT_DIR@" )
|
set ( EIGEN3_ROOT_DIR "@PACKAGE_EIGEN_ROOT_DIR@" )
|
||||||
|
|
||||||
set ( EIGEN3_VERSION_STRING "@EIGEN_VERSION_STRING@" )
|
set ( EIGEN3_VERSION_STRING "@EIGEN_VERSION_STRING@" )
|
||||||
set ( EIGEN3_VERSION_MAJOR "@EIGEN_VERSION_MAJOR@" )
|
set ( EIGEN3_VERSION_MAJOR "@EIGEN_VERSION_MAJOR@" )
|
||||||
|
@ -32,6 +32,11 @@ which requires at least version 3.3 of %Eigen. Here, `path-to-example-directory`
|
|||||||
is the path to the directory that contains both `CMakeLists.txt` and
|
is the path to the directory that contains both `CMakeLists.txt` and
|
||||||
`example.cpp`.
|
`example.cpp`.
|
||||||
|
|
||||||
|
If you have multiple installed version of %Eigen, you can pick your favorite one by setting the \c Eigen3_DIR cmake's variable to the respective path containing the \c Eigen3*.cmake files. For instance:
|
||||||
|
\code
|
||||||
|
cmake path-to-example-directory -DEigen3_DIR=$HOME/mypackages/share/eigen3/cmake/
|
||||||
|
\endcode
|
||||||
|
|
||||||
If the `REQUIRED` option is omitted when locating %Eigen using
|
If the `REQUIRED` option is omitted when locating %Eigen using
|
||||||
`find_package`, one can check whether the package was found as follows:
|
`find_package`, one can check whether the package was found as follows:
|
||||||
\code{.cmake}
|
\code{.cmake}
|
||||||
@ -45,5 +50,3 @@ endif (TARGET Eigen3::Eigen)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// vim: set ft=cpp.doxygen
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user