/** * The destructor only deletes the pointers if count reaches zero. */ ~workspace(){ if( count == 0 or --*count == 0 ){ // could have allocated null pointer if( ccgsl_pointer != 0 ) gsl_fft_real_workspace_float_free( ccgsl_pointer ); delete count; } }
static void PyGSL_transform_space_dealloc(PyGSL_transform_space * self) { FUNC_MESS_BEGIN(); assert(PyGSL_transform_space_check(self)); assert(self->space.v); switch(self->type){ case COMPLEX_WORKSPACE: gsl_fft_complex_workspace_free(self->space.cws); break; case COMPLEX_WAVETABLE: gsl_fft_complex_wavetable_free(self->space.cwt); break; case REAL_WORKSPACE: gsl_fft_real_workspace_free(self->space.rws); break; case REAL_WAVETABLE: gsl_fft_real_wavetable_free(self->space.rwt); break; case HALFCOMPLEX_WAVETABLE: gsl_fft_halfcomplex_wavetable_free(self->space.hcwt); break; case COMPLEX_WORKSPACE_FLOAT: gsl_fft_complex_workspace_float_free(self->space.cwsf); break; case COMPLEX_WAVETABLE_FLOAT: gsl_fft_complex_wavetable_float_free(self->space.cwtf); break; case REAL_WORKSPACE_FLOAT: gsl_fft_real_workspace_float_free(self->space.rwsf); break; case REAL_WAVETABLE_FLOAT: gsl_fft_real_wavetable_float_free(self->space.rwtf); break; case HALFCOMPLEX_WAVETABLE_FLOAT: gsl_fft_halfcomplex_wavetable_float_free(self->space.hcwtf); break; #ifdef _PYGSL_GSL_HAS_WAVELET case WAVELET_WORKSPACE : gsl_wavelet_workspace_free(self->space.wws); break; #endif default: pygsl_error("Got unknown switch", filename, __LINE__, GSL_ESANITY); break; } self->space.v = NULL; FUNC_MESS_END(); }
/** * The assignment operator. This copies elementwise. * @param v The workspace to copy */ workspace& operator=( workspace const& v ){ // first, possibly delete anything pointed to by this if( count == 0 or --*count == 0 ){ if( ccgsl_pointer != 0 ) gsl_fft_real_workspace_float_free( ccgsl_pointer ); delete count; } // Then copy ccgsl_pointer = v.ccgsl_pointer; count = v.count; if( count != 0 ) ++*count; return *this; }
/** * The default constructor creates a new workspace of size n. * @param n The size of the workspace. */ explicit workspace( size_t const n ){ ccgsl_pointer = gsl_fft_real_workspace_float_alloc( n ); // just plausibly we could allocate workspace but not count try { count = new size_t; } catch( std::bad_alloc& e ){ // try to tidy up before rethrowing gsl_fft_real_workspace_float_free( ccgsl_pointer ); throw e; } *count = 1; // initially there is just one reference to ccgsl_pointer }