#ifndef _SOCKET_
#define _SOCKET_

#include "sys/sys"
#include "error/error"
#include "config/config"
#include "SocketHandling/basesocket/basesocket"

// To have the smart-socket approach generate debug info:
// #define SOCKET_DEBUG

class Socket {
public:
    Socket();
    Socket(Socket const &other);
    Socket(int fd);
    Socket(Basesocket *b);
    ~Socket();

    Socket const &operator=(Socket const &other);
    Socket accept();

    int fd() {
	return _basesocket->fd();
    }
    void fd(int f) {
	_basesocket->fd(f);
    }
    void bind(string const &addr, int port) {
	_basesocket->bind(addr, port);
    }
    bool operator==(Socket const &other) const {
	return *_basesocket == *(other._basesocket);
    }
    void close() {
	_basesocket->close();
	*_refcount = 1;
    }

    struct sockaddr_in clientaddr() {
	return _basesocket->clientaddr();
    }

    string description();

private:
    int *_refcount;
    Basesocket *_basesocket;
};

#endif
