#ifndef member_h
#define member_h

#include "../rpc/rpc.h"

class member {
	private: 
		int cid;
        sockaddr_in addr;
        std::string hostname;
		
	public:
		member() {};
		member(int cid) { this->cid = cid;}
		member(std::string hostname);
		member(std::string hostname, int cid);

		//GET INFO
		int get_client_id() {return cid;}
		sockaddr_in get_addr() {return addr;}	
        std::string get_hostname() {return hostname;}
		bool equals(member m) {return cid == m.get_client_id();}	

};

inline marshall& 
operator<<(marshall & b, member m) {
	b << m.get_client_id();
	b << m.get_hostname();
	return b;
}

inline unmarshall& 
operator>>(unmarshall &b, member &m) {
	int cid;
   	std::string hostname;
    b >> cid; 
	b >> hostname; 
	m = *(new member(hostname, cid));
	return b;
	
}

inline marshall &
operator<<(marshall &m, std::list<member> v)
{
  m << (unsigned int) v.size();
  std::list<member>::iterator i;
  for(i = v.begin(); i != v.end(); i++)
      m << *i;
  return m;
}

inline unmarshall &
operator>>(unmarshall &u, std::list<member> &v)
{
  int n;
  u >> n;
  for(int i = 0; i < n; i++){
    member z;
    u >> z;
    v.push_back(z);
  }
  return u;
}


#endif
