18 #ifndef LIBMESH_WRAPPED_PETSC_H
19 #define LIBMESH_WRAPPED_PETSC_H
21 #include "libmesh/libmesh_config.h"
23 #ifdef LIBMESH_HAVE_PETSC
97 std::swap(tmp, *
this);
109 T *
get() {
return &
obj; }
116 operator T()
const {
return obj; }
137 operator bool()
const {
return obj !=
nullptr; }
162 #endif // LIBMESH_HAVE_PETSC
void reset_to_zero()
调用destroy()并将托管对象设置为nullptr。据我所知,PETSc的各种 XXXDestroy()例程不会将obj设置为nullptr,因此我们在包装类的 析构函数中也不这样做,但有些情况下,...
WrappedPetsc()
默认构造函数。这应该模拟我们通常编写的方式,例如: KSP ksp; 然后可以在不同的PETSc例程中使用ksp。也就是说, obj未初始化为任何特定值。
~WrappedPetsc()
析构函数。只调用destroy()函数。
WrappedPetsc & operator=(const WrappedPetsc &)=delete
T & operator*()
"解引用"运算符。返回对托管对象的引用。这在某些情况下是必需的,例如 使用C风格强制转换时: KSP ksp; ...
WrappedPetsc(WrappedPetsc &&other) noexcept
移动构造函数。我们几乎可以默认它,但我们需要将other.obj设置为nullptr, 以便在随后Destroy()时它仅仅是一个空操作,而不会破坏引用计数或尝试双重释放内存。 ...
WrappedPetsc(T obj_in)
构造函数,用于将obj初始化为特定的传入值。这模拟了我们通过 IS is = NULL; 明确创建PETSc对象的代码。从技术上讲,可以在此处传递任何指针值, 但通常只有传递nullptr才有意义。 ...
void destroy()
必须特例化以调用适当的XXXDestroy()例程,以便实例化WrappedPetsc<T>对象。