/*
 * 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.
 *
 */

#ifndef _sl_vector_h
#define _sl_vector_h

#include <spar/sl_conf.h>

struct vector_s
{
  sl_size dim;
  double *data;
};

typedef struct vector_s sl_vector;


__BEGIN_DECLS
/*
 *  Generic functions
 */
  sl_vector * sl_vector_new (const sl_size m);
sl_vector *sl_vector_new_from (const sl_size m, double first, ...);

int sl_vector_delete (sl_vector * v);

int sl_vector_init (sl_vector v, double x);
int sl_vector_init_p (sl_vector * v, double x);

int sl_vector_print (sl_vector v);
int sl_vector_print_p (sl_vector * v);

int sl_vector_get_item (sl_vector * v, sl_size i, double *item);
int sl_vector_set_item (sl_vector * v, sl_size i, double data);

int sl_vector_copy (sl_vector r, sl_vector v);
int sl_vector_copy_p (sl_vector * r, sl_vector * v);

sl_vector *sl_vector_dup (sl_vector * v);

/*
 *  Vector Math
 *   
 *  there are two version of each operator:
 *  	1. without pointer
 *  	2. with pointer (more efficient) that ends with "_p"
 * 
 */
sl_vector sl_vector_add_scalar (sl_vector v, double n);
sl_vector *sl_vector_add_scalar_p (sl_vector * v, double n);

sl_vector sl_vector_sub_scalar (sl_vector v, double n);
sl_vector *sl_vector_sub_scalar_p (sl_vector * v, double n);

sl_vector sl_vector_mul_scalar (sl_vector v, double n);
sl_vector *sl_vector_mul_scalar_p (sl_vector * v, double n);

sl_vector sl_vector_div_scalar (sl_vector v, double n);
sl_vector *sl_vector_div_scalar_p (sl_vector * v, double n);

sl_vector *sl_vector_add (sl_vector v1, sl_vector v2);
sl_vector *sl_vector_add_p (sl_vector * v1, sl_vector * v2);

sl_vector *sl_vector_sub (sl_vector v1, sl_vector v2);
sl_vector *sl_vector_sub_p (sl_vector * v1, sl_vector * v2);


__END_DECLS
#endif /* _sl_vector_h */


syntax highlighted by Code2HTML, v. 0.9.1