#ifndef bbs_h
#define bbs_h

#include "bbsimpl.h"

class IvocVect;

class BBS {
public:
	BBS();
	BBS(int nhost);
	virtual ~BBS();

	bool look(const char*);

	void take(const char*); /* blocks til something to take */
	bool look_take(const char*); /* returns false if nothing to take */
	// after taking use these
	int upkint();
	double upkdouble();
	void upkvec(int n, double* px); // n input px space must exist
	char* upkstr(); // delete [] char* when finished
	char* upkpickle(size_t* size); // delete [] char* when finished

	// before posting use these
	void pkbegin();
	void pkint(int);
	void pkdouble(double);
	void pkvec(int n, double* px); // doesn't pack n
	void pkstr(const char*);
	void pkpickle(const char*, size_t size);
	void post(const char*);

	int submit(int userid);
	bool working(int &id, double& x, int& userid);
	void master_works(int flag);
	void context();

	bool is_master();
	void worker(); // forever execute
	void done(); // prints timing

	void perror(const char*);
	double time();
	double wait_time();
	double integ_time();
	double send_time();
	void add_wait_time(double); // add interval since arg

	int nhost();
	int myid();

	// netpar interface
	void set_gid2node(int, int);
	int gid_exists(int);
	double threshold();
	void cell();
	void outputcell(int);
	void spike_record(int, IvocVect*, IvocVect*);
	void spike_record(IvocVect*, IvocVect*, IvocVect*);
	void netpar_solve(double);
	Object** gid2obj(int);
	Object** gid2cell(int);
	Object** gid_connect(int);
	double netpar_mindelay(double maxdelay);
	void netpar_spanning_statistics(int*, int*, int*, int*);
	IvocVect* netpar_max_histogram(IvocVect*);
	Object** pyret();
protected:
	void init(int);
protected:
	BBSImpl* impl_;
};

#endif
