/****************************************************************************/
/* Class implementation tri_vector.cc   (triangle vector)                   */
/****************************************************************************/

#include "tri_tnvector.h"

/****************************************************************************/
/* constructor                                                              */
/****************************************************************************/

template<class type>
tri_vector<type>::tri_vector(int t_size)
{
  size=t_size;
  vec= new type[size*(size+1)/2];
}

/****************************************************************************/
/* copy constructor                                                         */
/****************************************************************************/

template<class type>
tri_vector<type>::tri_vector(const tri_vector<type> &tv)
{
  size= tv.size;
  vec= new type[size*(size+1)/2];
  for(i= 0; i < size*(size+1)/2; i++)
  {
    vec[i]= tv.vec[i];
  }
}

/****************************************************************************/
/* public member operator=                                                  */
/* copies all data members from the passed tri_vector.                      */
/****************************************************************************/

template<class type>
const tri_vector<type> &tri_vector<type>::operator=(const tri_vector<type> &tv)
{
  size= tv.size;
  delete vec;
  vec= new type[size*(size+1)/2];
  for(i= 0; i < size*(size+1)/2; i++)
  {
    vec[i]= tv.vec[i];
  }
  return *this;
}

/****************************************************************************/
/* destructor                                                               */
/****************************************************************************/

template <class type>
tri_vector<type>::~tri_vector()
{
  delete vec;
}

/****************************************************************************/
/* public member function get                                               */
/* takes two arguments of type int and returns the value of the cell        */
/* corresponding to these coordinates.                                      */
/****************************************************************************/

template <class type>
type tri_vector<type>::get(int x, int y)
{
  assert(y < size);

  if (x <= y)
  {
    return vec[y*(y+1)/2+x];
  }
  else
  {
    return -vec[x*(x+1)/2+y];
  }
}

/****************************************************************************/
/* public member function set                                               */
/* takes two coordinates and a value of type and sets the value of the      */
/* cell corresponding to the coordinates to the value passed.               */
/****************************************************************************/

template <class type>
void tri_vector<type>::set(int x, int y, type value)
{
  assert(y < size);

  if (x <= y)
  {
    vec[y*(y+1)/2+x]= value;
  }
  else
  {
    vec[x*(x+1)/2+y]= -value;
  }
}