#include "../sparsemat.h"
#include <algo.h>
#include <iostream.h>

template <class Field>
Field sparsemat<Field>::operator[] (const pair<int, int>& ind) const
// returns a reference to a copy of the element A[ind.first, ind.second]
// E.g.,  A[make_pair(3, 5)]
// If the indices are out of range, and error is printed
//    and Field(0) is returned
{int i = ind.first;
 int j = ind.second;
 const sparsemat<Field>::row_type& row_i = A[i];
 sparsemat<Field>::const_row_iter p;
 p = lower_bound(row_i.begin(), row_i.end(), j,
                 sparsemat<Field>::comp_w_col_ind()
                );
 
 bool found = true;
 if(row_i.end() == p) found = false;
 else {if( (*p).first != j ) found = false;}
 
 if(!found)
   return Field(0);
 else return (*p).second;
}

template <class Field>
void sparsemat<Field>::put_value (const pair<int, int>& ind, const Field& a)
// sets A[ind.first, ind.second] = a
// E.g., A.put_value(make_pair(3, 5), Field(-4))
// If the indices are out of range, and error is printed
{int i = ind.first;
 int j = ind.second;
 sparsemat<Field>::row_type& row_i = A[i];
 sparsemat<Field>::row_iter p;
 bool found = true;

 if(row_i.begin() == row_i.end())
   p = row_i.end();
 else
   p = lower_bound(row_i.begin(), row_i.end(), j,
                   sparsemat<Field>::comp_w_col_ind()
                  );

 if(row_i.end() == p) found = false;
 else {if( (*p).first != j ) found = false;}

 if(!found)
  {if(a != Field(0))
     row_i.insert(p, make_pair(j, a));
  }
 else // found
  {if(a == Field(0))
     row_i.erase(p); // set to zero
   else (*p).second = a; // replace current value
  };
}

template <class Field>
void swaprow(int i, int j) // exchanges row i and j in A
{
}

template <class Field>
void addrow(int i, int j, const Field& a)
// adds a*(row i) to (row j) in A
{
}

int main(int argc, char* argv[])
  {sparsemat<int> M(5,5);
   M.put_value(make_pair(1,2), 7);
   cout << M;
   M.put_value(make_pair(4,3), -3);
   cout << M;
   M.put_value(make_pair(1,2), 0);
   cout << M;
   M.put_value(make_pair(4,3), 6);
   cout << M;
   sparsemat<float> N(3,3);
   cin >> N;
   cout << N;
  }
