#ifndef	V_VECTOR_H
#define	V_VECTOR_H

typedef struct	vector_s
{
	u32_t	size;
	vec_t	*elements;
}	vector_t, *vector_p;

#ifdef	__cplusplus
extern "C" {
#endif	/* __cplusplus */
    vector_p	V_GLOBAL	vecAlloc(u32_t size);
    vector_p	V_GLOBAL	vecDuplicate(vector_t *v);
	vector_p	V_GLOBAL	vecDuplicateEx(vector_t *src,u32_t newsize);
	void	V_GLOBAL	vecAdd(vector_t *dest,vector_t *v1,vector_t *v2);
	void	V_GLOBAL	vecSub(vector_t *dest,vector_t *v1,vector_t *v2);
	void		V_GLOBAL	vecScale(vector_t *dest,vector_t *v,vec_t x);
	void		V_GLOBAL	vecNegate(vector_t *v);
	vec_t		V_GLOBAL	vecDot(vector_t *v1,vector_t *v2);
    vec_t		V_GLOBAL	vecAbs(vector_t *v);
	vboolean	V_GLOBAL	vecCompare(vector_t *v1,vector_t *v2);
	u32_t		V_GLOBAL	vecMin(vector_t *v);
	u32_t		V_GLOBAL	vecMax(vector_t *v);
	void		V_GLOBAL	vecCopyElements(vector_p dest,vector_p source,
		s32_t dest_idx,u32_t src_left,u32_t src_right);
#ifdef			VECTOR_NO_MACRO
    u32_t		V_GLOBAL	vecCount(vector_t *v);
    void		V_GLOBAL	vecCopy(vector_t *dst,vector_t *src);
    void		V_GLOBAL	vecZero(vector_t *v);
    void		V_GLOBAL	vecUnit(vector_t *v);
#endif			/* VECTOR_NO_MACRO */
#ifdef	__cplusplus
}
#endif	/* __cplusplus */

#ifndef	VECTOR_NO_MACRO

#define	vecCount(v)				((v)->size)

#define	vecCopy(dst,src)\
		V_ASSERT((dst)->size==(src)->size);\
		v_copydw((dst)->elements,(src)->elements,\
			(dst)->size*sizeof(vec_t)>>2);

#define	vecZero(v)\
		V_ASSERT(v);\
		v_zerodw((v)->elements,(v)->size*sizeof(vec_t)>>2);

#define	vecUnit(v) {\
			V_ASSERT(v);\
			vec_t ra;\
			ra=vecAbs(v);\
			if(!IsZero(ra)) {\
				ra=1/ra;\
				vecScale(v,v,ra);\
			} \
		}

#endif	/* VECTOR_NO_MACRO */

#endif	/* V_VECTOR_H */
