Skip to content

Instantly share code, notes, and snippets.

@bfroehle
Created December 6, 2012 22:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bfroehle/4229230 to your computer and use it in GitHub Desktop.
Save bfroehle/4229230 to your computer and use it in GitHub Desktop.
UMFPACK Numeric/Symbolic Smart Pointer in C++
#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