/*  instance.c  */

#include "../ZV.h"

/*--------------------------------------------------------------------*/
/*
   -----------------------------------------------
   return 1 if the entries are owned by the object
   return 0 otherwise

   created -- 98jan22, cca
   -----------------------------------------------
*/
int
ZV_owned (
   ZV   *dv
) {
if ( dv == NULL ) {
   fprintf(stderr, "\n fatal error in ZV_owned(%p)"
           "\n bad input\n", dv) ;
   exit(-1) ;
}
return(dv->owned) ; }

/*--------------------------------------------------------------------*/
/*
   -----------------------
   return the vector size

   created -- 98jan22, cca
   -----------------------
*/
int
ZV_maxsize (
   ZV   *dv
) {
if ( dv == NULL ) {
   fprintf(stderr, "\n fatal error in ZV_maxsize(%p)"
           "\n bad input\n", dv) ;
   exit(-1) ;
}
return(dv->maxsize) ; }

/*--------------------------------------------------------------------*/
/*
   -----------------------
   return the vector size

   created -- 98jan22, cca
   -----------------------
*/
int
ZV_size (
   ZV   *dv
) {
if ( dv == NULL ) {
   fprintf(stderr, "\n fatal error in ZV_size(%p)"
           "\n bad input\n", dv) ;
   exit(-1) ;
}
return(dv->size) ; }

/*--------------------------------------------------------------------*/
/*
   -------------------------------------------------
   return the loc'th entry of a vector.
 
   created -- 98jan22, cca
   -------------------------------------------------
*/
void
ZV_entry (
   ZV       *dv,
   int      loc,
   double   *pReal,
   double   *pImag
) {
if ( dv == NULL || pReal == NULL || pImag == NULL ) {
   fprintf(stderr, "\n fatal error in ZV_entry(%p,%d,%p,%p)"
           "\n bad input\n", dv, loc, pReal, pImag) ;
   exit(-1) ;
}
if ( loc < 0 || loc >= dv->size || dv->vec == NULL ) {
   fprintf(stderr, "\n fatal error in ZV_entry(%p,%d,%p,%p)"
           "\n bad state: size = %d, vec = %p\n",
           dv, loc, pReal, pImag, dv->size, dv->vec) ;
   exit(-1) ;
}
*pReal = dv->vec[2*loc] ;
*pImag = dv->vec[2*loc+1] ;

return ; }
 
/*--------------------------------------------------------------------*/
/*
   -------------------------------------------------
   return pointers to the loc'th entry of a vector.
 
   created -- 98jan22, cca
   -------------------------------------------------
*/
void
ZV_pointersToEntry (
   ZV       *dv,
   int      loc,
   double   **ppReal,
   double   **ppImag
) {
if ( dv == NULL || ppReal == NULL || ppImag == NULL ) {
   fprintf(stderr, "\n fatal error in ZV_pointersToEntry(%p,%d,%p,%p)"
           "\n bad input\n", dv, loc, ppReal, ppImag) ;
   exit(-1) ;
}
if ( loc < 0 || loc >= dv->size || dv->vec == NULL ) {
   fprintf(stderr, "\n fatal error in ZV_pointersToEntry(%p,%d,%p,%p)"
           "\n bad state: size = %d, vec = %p\n",
           dv, loc, ppReal, ppImag, dv->size, dv->vec) ;
   exit(-1) ;
}
*ppReal = &dv->vec[2*loc] ;
*ppImag = &dv->vec[2*loc+1] ;

return ; }
 
/*--------------------------------------------------------------------*/
/*
   ----------------------------------------------
   return a pointer to the object's entries array

   created -- 98jan22, cca
   ----------------------------------------------
*/
double *
ZV_entries (
   ZV   *dv
) {
if ( dv == NULL ) {
   fprintf(stderr, "\n fatal error in ZV_entries(%p)"
           "\n bad input\n", dv) ;
   exit(-1) ;
}
return(dv->vec) ; }

/*--------------------------------------------------------------------*/
/*
   --------------------------------------------
   fill *psize with the vector's size
   and *pentries with the address of the vector

   created -- 98jan22, cca
   --------------------------------------------
*/
void
ZV_sizeAndEntries (
   ZV       *dv,
   int      *psize,
   double   **pentries
) {
if ( dv == NULL || psize == NULL || pentries == NULL ) {
   fprintf(stderr, "\n fatal error in ZV_sizeAndEntries(%p,%p,%p)"
           "\n bad input\n", dv, psize, pentries) ;
   exit(-1) ;
}
*psize    = dv->size ;
*pentries = dv->vec  ;

return ; }

/*--------------------------------------------------------------------*/
/*
   ---------------------------
   set and entry in the vector
 
   created -- 98jan22, cca
   ---------------------------
*/
void
ZV_setEntry (
   ZV       *dv,
   int      loc,
   double   real,
   double   imag
) {
/*
   ---------------
   check the input
   ---------------
*/
if ( dv == NULL || loc < 0 ) {
   fprintf(stderr, "\n fatal error in ZV_setEntry(%p,%d,%f,%f)"
           "\n bad input\n", dv, loc, real, imag) ;
   exit(-1) ;
}
if ( loc >= dv->maxsize ) {
   int newmaxsize = (int) 1.25*dv->maxsize ;
   if ( newmaxsize < 10 ) {
      newmaxsize = 10 ;
   }
   if ( loc >= newmaxsize ) {
      newmaxsize = loc + 1 ;
   }
   ZV_setMaxsize(dv, newmaxsize) ;
}
if ( loc >= dv->size ) {
   dv->size = loc + 1 ;
}
dv->vec[2*loc]   = real ;
dv->vec[2*loc+1] = imag ;
 
return ; }

/*--------------------------------------------------------------------*/


syntax highlighted by Code2HTML, v. 0.9.1