/*
 * The Spar Library - modular math parser
 * Copyright (C) 2000,2001 Davide Angelocola <davide178@inwind.it>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License.
 *
 * 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., 59 Temple Place - Suite 330,
 * Boston, MA  02111-1307, USA.
 *
 */

#include <spar/sl_vector.h>
#include <spar/sl_util.h>
#include <spar/sl_math.h>


sl_vector
sl_vector_add_scalar (sl_vector v, double n)
{
  if (SL_IS_ZERO (n))
    {
      return v;
    }
  else
    {
      sl_size i;

      for (i = 0; i < v.dim; i++)
	v.data[i] += n;

      return v;
    }
}

sl_vector *
sl_vector_add_scalar_p (sl_vector * v, double n)
{
  sl_assert (v != NULL);

  if (SL_IS_ZERO (n))
    {
      return v;
    }
  else
    {
      sl_size i;

      for (i = 0; i < v->dim; i++)
	v->data[i] += n;

      return v;
    }
}

sl_vector
sl_vector_sub_scalar (sl_vector v, double n)
{
  if (SL_IS_ZERO (n))
    {
      return v;
    }
  else
    {
      sl_size i;

      for (i = 0; i < v.dim; i++)
	v.data[i] -= n;

      return v;
    }
}

sl_vector *
sl_vector_sub_scalar_p (sl_vector * v, double n)
{
  sl_assert (v != NULL);

  if (SL_IS_ZERO (n))
    {
      return v;
    }
  else
    {
      sl_size i;

      for (i = 0; i < v->dim; i++)
	v->data[i] -= n;

      return v;
    }
}

sl_vector
sl_vector_mul_scalar (sl_vector v, double n)
{
  if (n == 1)
    {
      return v;
    }
  else
    {
      sl_size i;

      for (i = 0; i < v.dim; i++)
	v.data[i] *= n;

      return v;
    }
}

sl_vector *
sl_vector_mul_scalar_p (sl_vector * v, double n)
{
  sl_assert (v != NULL);

  if (n == 1.)
    {
      return v;
    }
  else
    {
      sl_size i;

      for (i = 0; i < v->dim; i++)
	v->data[i] *= n;

      return v;
    }
}

sl_vector
sl_vector_div_scalar (sl_vector v, double n)
{
  if (n == 1.)
    {
      return v;
    }
  else
    {
      sl_size i;

      for (i = 0; i < v.dim; i++)
	v.data[i] /= n;

      return v;
    }
}

sl_vector *
sl_vector_div_scalar_p (sl_vector * v, double n)
{
  sl_assert (v != NULL);

  if (n == 1.)
    {
      return v;
    }
  else
    {
      sl_size i;

      for (i = 0; i < v->dim; i++)
	v->data[i] /= v->data[i] + n;

      return v;
    }
}

sl_vector *
sl_vector_add (sl_vector v1, sl_vector v2)
{
  if (v1.dim != v2.dim)
    {
      return NULL;
    }
  else
    {
      sl_size i;
      sl_vector *r = sl_vector_new (v1.dim);

      for (i = 0; i < v1.dim; i++)
	r->data[i] = v1.data[i] + v2.data[i];

      return r;
    }
}

sl_vector *
sl_vector_add_p (sl_vector * v1, sl_vector * v2)
{
  sl_assert (v1 != NULL);
  sl_assert (v2 != NULL);

  if (v1->dim != v2->dim)
    {
      return NULL;
    }
  else
    {
      sl_size i;
      sl_vector *r = sl_vector_new (v1->dim);

      for (i = 0; i < v1->dim; i++)
	r->data[i] = v1->data[i] + v2->data[i];

      return r;
    }
}

sl_vector *
sl_vector_sub (sl_vector v1, sl_vector v2)
{
  if (v1.dim != v2.dim)
    {
      return NULL;
    }
  else
    {
      sl_size i;
      sl_vector *r = sl_vector_new (v1.dim);

      for (i = 0; i < v1.dim; i++)
	r->data[i] = v1.data[i] - v2.data[i];

      return r;
    }
}


sl_vector *
sl_vector_sub_p (sl_vector * v1, sl_vector * v2)
{
  sl_assert (v1 != NULL);
  sl_assert (v2 != NULL);

  if (v1->dim != v2->dim)
    {
      return NULL;
    }
  else
    {
      sl_size i;
      sl_vector *r = sl_vector_new (v1->dim);

      for (i = 0; i < v1->dim; i++)
	r->data[i] = v1->data[i] - v2->data[i];

      return r;
    }
}


syntax highlighted by Code2HTML, v. 0.9.1