/**
* Copyright 2005-2007 ECMWF
*
* Licensed under the GNU Lesser General Public License which
* incorporates the terms and conditions of version 3 of the GNU
* General Public License.
* See LICENSE and gpl-3.0.txt for details.
*/

/***************************************************************************
 *
 *   Enrico Fucile
 *
 ***************************************************************************/

#include "grib_api_internal.h"

grib_iarray* grib_iarray_new(grib_context* c,size_t size,size_t incsize) {
  grib_iarray* v=NULL;
  if (!c) c=grib_context_get_default();
  v=(grib_iarray*)grib_context_malloc(c,sizeof(grib_iarray));
  if (!v) {
    grib_context_log(c,GRIB_LOG_ERROR,
          "grib_iarray_new unable to allocate %d bytes\n",sizeof(grib_iarray));
    return NULL;
  }
  v->size=size;
  v->n=0;
  v->incsize=incsize;
  v->v=(long*)grib_context_malloc(c,sizeof(long)*size);
  if (!v->v) {
    grib_context_log(c,GRIB_LOG_ERROR,
          "grib_iarray_new unable to allocate %d bytes\n",sizeof(long)*size);
    return NULL;
  }
  return v;
}

grib_iarray* grib_iarray_resize(grib_context* c,grib_iarray* v) {
  int newsize=v->incsize+v->size;

  if (!c) c=grib_context_get_default();

  v->v=grib_context_realloc(c,v->v,newsize*sizeof(long));
  v->size=newsize;
  if (!v->v) {
    grib_context_log(c,GRIB_LOG_ERROR,
          "grib_iarray_resize unable to allocate %d bytes\n",sizeof(long)*newsize);
    return NULL;
  }
  return v;
}

grib_iarray* grib_iarray_push(grib_context* c,grib_iarray* v,long val) {
  size_t start_size=100;
  size_t start_incsize=100;
  if (!v) v=grib_iarray_new(c,start_size,start_incsize);

  if (v->n >= v->size) v=grib_iarray_resize(c,v);
  v->v[v->n]=val;
  v->n++;
  return v;
}

void grib_iarray_delete(grib_context* c,grib_iarray* v) {
  if (!v) return;
  if (!c) grib_context_get_default();
  if (v->v) grib_context_free(c,v->v);
  grib_context_free(c,v);
}