Created
December 6, 2012 22:55
-
-
Save bfroehle/4229230 to your computer and use it in GitHub Desktop.
UMFPACK Numeric/Symbolic Smart Pointer in C++
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "umfpack.h" | |
/** | |
* Smart pointer versions of the typical "void *Numeric" and | |
* "void *Symbolic" defintions. | |
* | |
* For example: | |
* umfpack_dl_numeric_ptr Numeric; | |
* umfpack_dl_numeric(..., &Numeric, ...); | |
* // No call to umfpack_dl_free_numeric required, as it is | |
* // called automatically when Numeric goes out of scope. | |
*/ | |
template <void (*umfpack_free)(void**)> | |
class umfpack_void_ptr { | |
void *ptr; | |
public: | |
umfpack_void_ptr() : ptr(NULL) {} | |
// Disable copying. | |
umfpack_void_ptr(const umfpack_void_ptr &) = delete; | |
umfpack_void_ptr& operator=(const umfpack_void_ptr &) = delete; | |
// Allow moving. | |
umfpack_void_ptr(umfpack_void_ptr &&other) : ptr(NULL) { | |
std::swap(ptr, other.ptr); | |
} | |
umfpack_void_ptr& operator=(umfpack_void_ptr &&other) { | |
std::swap(ptr, other.ptr); | |
return *this; | |
} | |
~umfpack_void_ptr() { | |
if (ptr != NULL) | |
umfpack_free(&ptr); | |
} | |
void ** operator&() { return &ptr; } | |
operator void*() { return ptr; } | |
}; | |
typedef umfpack_void_ptr<umfpack_di_free_numeric> umfpack_di_numeric_ptr; | |
typedef umfpack_void_ptr<umfpack_di_free_symbolic> umfpack_di_symbolic_ptr; | |
typedef umfpack_void_ptr<umfpack_dl_free_numeric> umfpack_dl_numeric_ptr; | |
typedef umfpack_void_ptr<umfpack_dl_free_symbolic> umfpack_dl_symbolic_ptr; | |
typedef umfpack_void_ptr<umfpack_zi_free_numeric> umfpack_zi_numeric_ptr; | |
typedef umfpack_void_ptr<umfpack_zi_free_symbolic> umfpack_zi_symbolic_ptr; | |
typedef umfpack_void_ptr<umfpack_zl_free_numeric> umfpack_zl_numeric_ptr; | |
typedef umfpack_void_ptr<umfpack_zl_free_symbolic> umfpack_zl_symbolic_ptr; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment