// COMPILE: g++ -Wall -Wno-deprecated -g3 -I/opt/local/include/ -L/opt/local/lib/ test.cc -o test  -lgsl


#include <iostream>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_matrix.h>

using namespace std;
#define DIM 4

//*******************************************************************
class myMember_t {
public:
  // constructors
  myMember_t();
  myMember_t(double num);
  
  // destructor
  ~myMember_t();

  // assignment operator
  myMember_t& operator=(const myMember_t& rtSide);

  // members (public so that I can test)
  gsl_vector *v;

private:

};

// constructor
myMember_t::myMember_t()
{
  v = gsl_vector_alloc(DIM);
  gsl_vector_set_zero(v);
}
// constructor
myMember_t::myMember_t(double num)
{
  v = gsl_vector_alloc(DIM);
  gsl_vector_set_all(v,num);
}

// destructor
myMember_t::~myMember_t()
{
  gsl_vector_free(v);
}

// assignment operator
myMember_t& myMember_t::operator=(const myMember_t& rtSide)
{
  // copy the values of data elements
  gsl_vector_memcpy(this->v, rtSide.v);
  return *this;
}

//*******************************************************************
class myClass_t {
public:
  // default constructor and destructor are fine for now

  // set the member variable
  int setMember(myMember_t member_in);

  // member which has a gsl_vector as member
  myMember_t member;
private:
};

// set the member
int myClass_t::setMember(myMember_t member_in)
{
  // cout << &member_in << endl;
  this->member=member_in;
  return 0;
}

//*******************************************************************
// display gsl vector values
int displayVector(gsl_vector* v_in)
{
  size_t dim_i = v_in->size;
  for (int i=0; i<(int)dim_i; i++)
    cout << gsl_vector_get(v_in, (size_t)i) << " ";
  cout << endl;
  return 0;
}

//*******************************************************************
int main(int argc, char **argv)
{
  // initialize class object
  myClass_t mC;
  cout << "mC.member before = " << endl;  
  displayVector(mC.member.v);

  // initialize a local member 
  myMember_t mM(2.0);
  cout << "mM before = " << endl;  
  displayVector(mC.member.v);

  // assign member of mC object to local member mM
  // This works since the members are public
  // mC.member = mM;

  // when I use this, then mM data gets corrupted and mM cannot be deallocated
  mC.setMember(mM);

  cout << "mC.member after = " << endl;  
  displayVector(mC.member.v);

  cout << "mM after = " << endl;  
  displayVector(mM.v);
}

