/*  init.C  */

#include "../DV.h"

/*--------------------------------------------------------------------*/
/*
   ---------------------------------------------
   simplest initialization method

   if entries != NULL
      the object does not own the entries,
      it just points to the entries base address
   else if size > 0
      the object will own the entries, 
      it allocates a vector of size doubles's.
   else 
      nothing happens
   endif

   created -- 96aug28, cca
   ---------------------------------------------
*/
void
DV_init (
   DV       *dv,
   int      size,
   double   *entries 
) {
if ( dv == NULL || size < 0 ) {
   fprintf(stderr, "\n fatal error in DV_init(%p,%d,%p)"
           "\n bad input\n", dv, size, entries) ;
   exit(-1) ;
}
/*
   --------------
   clear any data
   --------------
*/
DV_clearData(dv) ;
/*
   -----------------------------
   set the size and maximum size
   -----------------------------
*/
dv->maxsize = dv->size = size ;
/*
   -------------------------
   set vector and owner flag
   -------------------------
*/
if ( entries != NULL ) {
   dv->owned = 0 ;
   dv->vec   = entries ; 
} else if ( size > 0 ) {
   dv->owned = 1 ;
/*
   dv->vec   = DVinit(size, 0.0) ;
*/
   dv->vec   = DVinit2(size) ;
}
return ; }
   
/*--------------------------------------------------------------------*/
/*
   -------------------------
   basic initializion method
 
   created -- 95oct06, cca
   -------------------------
*/
void
DV_init1 ( 
   DV    *dv,
   int   size
) {
DV_init(dv, size, NULL) ;

return ; }

/*--------------------------------------------------------------------*/
/*
   -------------------------
   total initializion method
 
   created -- 95oct06, cca
   -------------------------
*/
void
DV_init2 ( 
   DV       *dv,
   int      size, 
   int      maxsize, 
   int      owned, 
   double   *vec 
) {
/*
   ---------------
   check the input
   ---------------
*/
if ( dv == NULL ) {
   fprintf(stderr, "\n fatal error in DV_init2(%p,%d,%d,%d,%p)"
           "\n bad input\n", dv, size, maxsize, owned, vec) ;
   exit(-1) ;
}
if ( size < 0 || maxsize < size ) {
   fprintf(stderr, "\n fatal error in DV_init2(%p,%d,%d,%d,%p)"
           "\n size = %d, maxsize = %d \n", 
           dv, size, maxsize, owned, vec, size, maxsize) ;
   exit(-1) ;
}
if ( owned < 0 || 1 < owned ) {
   fprintf(stderr, "\n fatal error in DV_init2(%p,%d,%d,%d,%p)"
           "\n owned = %d\n", dv, size, maxsize, owned, vec, owned) ;
   exit(-1) ;
}
if ( owned == 1 && vec == NULL ) {
   fprintf(stderr, "\n fatal error in DV_init2(%p,%d,%d,%d,%p)"
           "\n owned = %d and vec = %p", 
           dv, size, maxsize, owned, vec, owned, vec) ;
   exit(-1) ;
} 
/*
   --------------
   clear any data
   --------------
*/
DV_clearData(dv) ;

if ( vec == NULL ) {
/*
   ----------------------------------------------
   no entries input, use the simplest initializer
   ----------------------------------------------
*/
   DV_init(dv, size, NULL) ;
} else {
/*
   ---------------------------------
   entries are input, set the fields
   ---------------------------------
*/
   dv->size    = size    ;
   dv->maxsize = maxsize ;
   dv->owned   = owned   ;
   dv->vec     = vec     ;
}
return ; }

/*--------------------------------------------------------------------*/
/*
   ----------------------------------
   set the maximum size of the vector

   created -- 96dec08, cca
   ----------------------------------
*/
void
DV_setMaxsize (
   DV    *dv,
   int   newmaxsize
) {
/*
   ---------------
   check the input
   ---------------
*/
if ( dv == NULL || newmaxsize < 0 ) {
   fprintf(stderr, "\n fatal error in DV_setMaxsize(%p,%d)"
           "\n bad input\n", dv, newmaxsize) ;
   exit(-1) ;
}
if ( dv->maxsize > 0 && dv->owned == 0 ) {
   fprintf(stderr, "\n fatal error in DV_setMaxsize(%p,%d)"
           "\n dv->maxsize = %d, dv->owned = %d\n", 
           dv, newmaxsize, dv->maxsize, dv->owned) ;
   exit(-1) ;
}
if ( dv->maxsize != newmaxsize ) {
/*
   -----------------------------------
   allocate new storage for the vector
   -----------------------------------
*/
   double   *vec ;
/*
   vec = DVinit(newmaxsize, 0.0) ;
*/
   vec = DVinit2(newmaxsize) ;
   if ( dv->size > 0 ) {
/*
      ---------------------------------
      copy old entries into new entries
      ---------------------------------
*/
      if ( dv->vec == NULL ) {
         fprintf(stderr, "\n fatal error in DV_setMaxsize(%p,%d)"
                 "\n dv->size = %d, dv->vec is NULL\n", 
                 dv, newmaxsize, dv->size) ;
         exit(-1) ;
      }
      if ( dv->size <= newmaxsize ) {
         DVcopy(dv->size, vec, dv->vec) ;
      } else {
/*
         -----------------------
         note, data is truncated
         -----------------------
*/
         DVcopy(newmaxsize, vec, dv->vec) ;
         dv->size = newmaxsize ;
      }
   }
   if ( dv->vec != NULL ) {
/*
      ----------------
      free old entries
      ----------------
*/
      DVfree(dv->vec) ;
   }
/*
   ----------
   set fields
   ----------
*/
   dv->maxsize = newmaxsize ;
   dv->owned   = 1 ;
   dv->vec     = vec ;
}
return ; }

/*--------------------------------------------------------------------*/
/*
   --------------------------
   set the size of the vector

   created -- 96dec08, cca
   --------------------------
*/
void
DV_setSize (
   DV    *dv,
   int   newsize
) {
/*
   ---------------
   check the input
   ---------------
*/
if ( dv == NULL || newsize < 0 ) {
   fprintf(stderr, "\n fatal error in DV_setSize(%p,%d)"
           "\n bad input\n", dv, newsize) ;
   exit(-1) ;
}
if ( 0 < dv->maxsize && dv->maxsize < newsize && dv->owned == 0 ) {
   fprintf(stderr, "\n fatal error in DV_setSize(%p,%d)"
           "\n dv->maxsize = %d, newsize = %d, dv->owned = %d\n", 
           dv, newsize, dv->maxsize, newsize, dv->owned) ;
   exit(-1) ;
}
if ( dv->maxsize < newsize ) {
/*
   -------------------------------------------------------------
   new size requested is more than maxsize, set new maximum size 
   -------------------------------------------------------------
*/
   DV_setMaxsize(dv, newsize) ;
}
dv->size = newsize ;

return ; }

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


syntax highlighted by Code2HTML, v. 0.9.1