/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
/*
 * Copyright (c) 2011 University of California, Los Angeles
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation;
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
 */

#include "ccn_indexbuf.h"

/**
 * @file ccn_indexbuf.c
 * @brief Support for expandable buffer of non-negative values.
 * 
 * Part of the CCNx C Library.
 *
 * Copyright (C) 2008, 2009 Palo Alto Research Center, Inc.
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License version 2.1
 * as published by the Free Software Foundation.
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details. You should have received
 * a copy of the GNU Lesser General Public License along with this library;
 * if not, write to the Free Software Foundation, Inc., 51 Franklin Street,
 * Fifth Floor, Boston, MA 02110-1301 USA.
 */
#include <stddef.h>
#include <stdlib.h>
#include <string.h>

#define ELEMENT size_t

/**
 * Create a new indexbuf.
 */
struct ccn_indexbuf *
ccn_indexbuf_create(void)
{
  struct ccn_indexbuf *c;
  c = (ccn_indexbuf*)calloc(1, sizeof(*c));
  return(c);
}

/**
 * Deallocate indexbuf.
 */
void
ccn_indexbuf_destroy(struct ccn_indexbuf **cbp)
{
  struct ccn_indexbuf *c = *cbp;
  if (c != NULL) {
    if (c->buf != NULL) {
      free(c->buf);
    }
    free(c);
    *cbp = NULL;
  }
}

/**
 * Expand buffer as necessary to hold at least n more values.
 * @returns pointer to reserved space
 */
ELEMENT *
ccn_indexbuf_reserve(struct ccn_indexbuf *c, size_t n)
{
  size_t newlim = n + c->n;
  size_t oldlim = c->limit;
  ELEMENT *buf = c->buf;
  if (newlim < n)
    return(NULL);
  if (newlim > oldlim) {
    if (2 * oldlim > newlim)
      newlim = 2 * oldlim;
    buf = (size_t*)realloc(c->buf, newlim * sizeof(ELEMENT));
    if (buf == NULL)
      return(NULL);
    memset(buf + oldlim, 0, (newlim - oldlim) * sizeof(ELEMENT));
    c->buf = buf;
    c->limit = newlim;
  }
  buf += c->n;
  return(buf);
}

/**
 * Append multiple elements to the indexbuf.
 * @returns 0 for success, -1 for failure.
 */
int
ccn_indexbuf_append(struct ccn_indexbuf *c, const ELEMENT *p, size_t n)
{
  ELEMENT *dst = ccn_indexbuf_reserve(c, n);
  if (dst == NULL)
    return(-1);
  memcpy(dst, p, n * sizeof(ELEMENT));
  c->n += n;
  return(0);
}

/**
 * Append v to the indexbuf
 * @returns 0 for success, -1 for failure.
 */
int
ccn_indexbuf_append_element(struct ccn_indexbuf *c, ELEMENT v)
{
  ELEMENT *dst = ccn_indexbuf_reserve(c, 1);
  if (dst == NULL)
    return(-1);
  *dst = v;
  c->n += 1;
  return(0);
}

/**
 * @returns index at which the element was found or appended, or -1 if not found.
 */
int
ccn_indexbuf_member(struct ccn_indexbuf *x, ELEMENT val)
{
  int i;
  if (x == NULL)
    return (-1);
  for (i = x->n - 1; i >= 0; i--)
    if (x->buf[i] == val)
      return(i);
  return(-1);
}

/**
 * Removes up to one instance of val from the indexbuf.
 * Order of elements not preserved.
 */
void
ccn_indexbuf_remove_element(struct ccn_indexbuf *x, ELEMENT val)
{
  int i;
  if (x == NULL) return;
  for (i = x->n - 1; i >= 0; i--)
    if (x->buf[i] == val) {
      x->buf[i] = x->buf[--x->n]; /* move last element into vacant spot */
      return;
    }
}

/**
 * @returns index at which the element was found or appended,
 *          or -1 in case of error.
 */
int
ccn_indexbuf_set_insert(struct ccn_indexbuf *x, ELEMENT val)
{
  int i;
  if (x == NULL)
    return (-1);
  for (i = 0; i < (int)x->n; i++)
    if (x->buf[i] == val)
      return(i);
  if (ccn_indexbuf_append_element(x, val) < 0)
    return(-1);
  return(i);
}

/**
 * Removes first occurrence of val, preserving order
 * @returns index at which the element was found,
 *          or -1 if the element was not found.
 */
int
ccn_indexbuf_remove_first_match(struct ccn_indexbuf *x, ELEMENT val)
{
  int i;
  int n;
  if (x == NULL)
    return (-1);
  for (i = 0, n = x->n; i < n; i++) {
    if (x->buf[i] == val) {
      if (i + 1 < n)
        memmove(&(x->buf[i]),
                &(x->buf[i + 1]),
                sizeof(x->buf[i]) * (n - i - 1));
      x->n--;
      return(i);
    }
  }
  return(-1);
}

/**
 * If val is present in the indexbuf, move it to the final place.
 */
void
ccn_indexbuf_move_to_end(struct ccn_indexbuf *x, ELEMENT val)
{
  int i;
  int n;
  if (x == NULL)
    return;
  for (i = 0, n = x->n; i + 1 < n; i++) {
    if (x->buf[i] == val) {
      memmove(&(x->buf[i]),
              &(x->buf[i + 1]),
              sizeof(x->buf[i]) * (n - i - 1));
      x->buf[n - 1] = val;
      return;
    }
  }
}

/**
 * If val is present in the indexbuf, move it to the first place.
 */
void
ccn_indexbuf_move_to_front(struct ccn_indexbuf *x, ELEMENT val)
{
  int i;
  int n;
  if (x == NULL)
    return;
  for (i = 0, n = x->n; i < n; i++) {
    if (x->buf[i] == val) {
      memmove(&(x->buf[1]),
              &(x->buf[0]),
              sizeof(x->buf[i]) * i);
      x->buf[0] = val;
      return;
    }
  }
  
}

