#include <iostream>
#include <cstring>
#include <functional>
#include <memory>
using namespace std;
using namespace std::placeholders;
typedef enum { TCP, SERIAL, CONNECT_COUNT} CONNECT_TYPE;
// Define interface
class IConnector
{
public:
virtual void open() = 0;
virtual void recv(void* buffer, size_t size) = 0;
virtual void send(void* buffer, size_t size) = 0;
virtual void close() = 0;
};
// Define CSerial
class CSerial /*: public IConnector*/ // From 3rd?
{
public:
void open();
void recv(void* buffer, size_t size);
void send(void* buffer, size_t size);
void close();
};
// Define CTcp
class CTcp /*: public IConnector*/ // From 3rd?
{
public:
void open();
void recv(void* buffer, size_t size);
void send(void* buffer, size_t size);
void close();
};
typedef void (OPEN_FUNC)();
typedef void (RECV_FUNC)(void*, size_t);
typedef void (SEND_FUNC)(void*, size_t);
typedef void (CLOSE_FUNC)();
// Define CConnector
class CConnector: public IConnector
{
public:
CConnector();
void open();
void recv(void* buffer, size_t size);
void send(void* buffer, size_t size);
void close();
void setType(CONNECT_TYPE type);
private:
template <class T>
void bindConnector(T* connector);
CONNECT_TYPE mType;
CTcp mTcp;
CSerial mSerial;
std::function<OPEN_FUNC> openFunc;
std::function<RECV_FUNC> recvFunc;
std::function<SEND_FUNC> sendFunc;
std::function<CLOSE_FUNC> closeFunc;
};
// Implement CSerial
void CSerial::open()
{
cout << "CSerial::" << __func__ << endl;
}
void CSerial::recv(void* buffer, size_t size)
{
cout << "CSerial::" << __func__ << endl;
}
void CSerial::send(void* buffer, size_t size)
{
cout << "CSerial::" << __func__ << endl;
}
void CSerial::close()
{
cout << "CSerial::" << __func__ << endl;
}
// Implement CTcp
void CTcp::open()
{
cout << "CTcp::" << __func__ << endl;
}
void CTcp::recv(void* buffer, size_t size)
{
cout << "CTcp::" << __func__ << endl;
}
void CTcp::send(void* buffer, size_t size)
{
cout << "CTcp::" << __func__ << endl;
}
void CTcp::close()
{
cout << "CTcp::" << __func__ << endl;
}
// Implement CConnector
CConnector::CConnector(): mTcp(), mSerial(), openFunc(), recvFunc(), sendFunc(), closeFunc()
{
}
void CConnector::open()
{
if(openFunc != NULL)
openFunc();
}
void CConnector::recv(void* buffer, size_t size)
{
if(recvFunc != NULL)
recvFunc(buffer, size);
}
void CConnector::send(void* buffer, size_t size)
{
if(sendFunc != NULL)
sendFunc(buffer, size);
}
void CConnector::close()
{
if(closeFunc != NULL)
closeFunc();
}
template <class T>
void CConnector::bindConnector(T* connector)
{
openFunc = std::bind(&T::open, connector);
recvFunc = std::bind(&T::recv, connector, _1, _2);
sendFunc = std::bind(&T::send, connector, _1, _2);
closeFunc = std::bind(&T::close, connector);
}
void CConnector::setType(CONNECT_TYPE type)
{
mType = type;
switch(mType)
{
case CONNECT_TYPE::SERIAL:
bindConnector(&mTcp);
break;
case CONNECT_TYPE::TCP:
bindConnector(&mTcp);
break;
default:
throw "error";
}
}
void testTCP()
{
CConnector* conector = new CConnector();
conector->setType(CONNECT_TYPE::TCP);
conector->open();
conector->recv(NULL, 0);
conector->send(NULL, 0);
conector->close();
delete conector;
cout << endl;
}
void testSerial()
{
CConnector* conector = new CConnector();
conector->setType(CONNECT_TYPE::SERIAL);
conector->open();
conector->recv(NULL, 0);
conector->send(NULL, 0);
conector->close();
delete conector;
cout << endl;
}
int main(int argc, char* argv[])
{
testTCP();
testSerial();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxtZW1vcnk+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2Ugc3RkOjpwbGFjZWhvbGRlcnM7Cgp0eXBlZGVmIGVudW0geyBUQ1AsIFNFUklBTCwgQ09OTkVDVF9DT1VOVH0gQ09OTkVDVF9UWVBFOwoKLy8gRGVmaW5lIGludGVyZmFjZQpjbGFzcyBJQ29ubmVjdG9yCnsKcHVibGljOgoJdmlydHVhbCB2b2lkIG9wZW4oKSA9IDA7Cgl2aXJ0dWFsIHZvaWQgcmVjdih2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSA9IDA7Cgl2aXJ0dWFsIHZvaWQgc2VuZCh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSA9IDA7Cgl2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7Cn07CgovLyBEZWZpbmUgQ1NlcmlhbApjbGFzcyBDU2VyaWFsCS8qOiBwdWJsaWMgSUNvbm5lY3RvciovIC8vIEZyb20gM3JkPwp7CnB1YmxpYzoKCXZvaWQgb3BlbigpOwoJdm9pZCByZWN2KHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwoJdm9pZCBzZW5kKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwoJdm9pZCBjbG9zZSgpOwp9OwoKLy8gRGVmaW5lIENUY3AKY2xhc3MgQ1RjcAkgICAvKjogcHVibGljIElDb25uZWN0b3IqLyAvLyBGcm9tIDNyZD8KewpwdWJsaWM6Cgl2b2lkIG9wZW4oKTsKCXZvaWQgcmVjdih2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKCXZvaWQgc2VuZCh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKCXZvaWQgY2xvc2UoKTsKfTsKCnR5cGVkZWYgdm9pZCAoT1BFTl9GVU5DKSgpOwp0eXBlZGVmIHZvaWQgKFJFQ1ZfRlVOQykodm9pZCosIHNpemVfdCk7CnR5cGVkZWYgdm9pZCAoU0VORF9GVU5DKSh2b2lkKiwgc2l6ZV90KTsKdHlwZWRlZiB2b2lkIChDTE9TRV9GVU5DKSgpOwoKLy8gRGVmaW5lIENDb25uZWN0b3IKY2xhc3MgQ0Nvbm5lY3RvcjogcHVibGljIElDb25uZWN0b3IKewpwdWJsaWM6CglDQ29ubmVjdG9yKCk7Cgl2b2lkIG9wZW4oKTsKCXZvaWQgcmVjdih2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKCXZvaWQgc2VuZCh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKCXZvaWQgY2xvc2UoKTsKCXZvaWQgc2V0VHlwZShDT05ORUNUX1RZUEUgdHlwZSk7Cgpwcml2YXRlOgoJdGVtcGxhdGUgPGNsYXNzIFQ+CgkJdm9pZCBiaW5kQ29ubmVjdG9yKFQqIGNvbm5lY3Rvcik7CglDT05ORUNUX1RZUEUgbVR5cGU7CglDVGNwIG1UY3A7CglDU2VyaWFsIG1TZXJpYWw7CglzdGQ6OmZ1bmN0aW9uPE9QRU5fRlVOQz4gb3BlbkZ1bmM7CglzdGQ6OmZ1bmN0aW9uPFJFQ1ZfRlVOQz4gcmVjdkZ1bmM7CglzdGQ6OmZ1bmN0aW9uPFNFTkRfRlVOQz4gc2VuZEZ1bmM7CglzdGQ6OmZ1bmN0aW9uPENMT1NFX0ZVTkM+IGNsb3NlRnVuYzsKfTsKCi8vIEltcGxlbWVudCBDU2VyaWFsCnZvaWQgQ1NlcmlhbDo6b3BlbigpCnsKCWNvdXQgPDwJIkNTZXJpYWw6OiIgPDwgIF9fZnVuY19fIDw8IGVuZGw7Cn0KCnZvaWQgQ1NlcmlhbDo6cmVjdih2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQp7Cgljb3V0IDw8ICJDU2VyaWFsOjoiIDw8IF9fZnVuY19fIDw8IGVuZGw7Cn0KCnZvaWQgQ1NlcmlhbDo6c2VuZCh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQp7Cgljb3V0IDw8ICJDU2VyaWFsOjoiIDw8IF9fZnVuY19fIDw8IGVuZGw7Cn0KCnZvaWQgQ1NlcmlhbDo6Y2xvc2UoKQp7Cgljb3V0IDw8ICJDU2VyaWFsOjoiIDw8IF9fZnVuY19fIDw8IGVuZGw7Cn0KCi8vIEltcGxlbWVudCBDVGNwCnZvaWQgQ1RjcDo6b3BlbigpCnsKCWNvdXQgPDwgIkNUY3A6OiIgPDwgIF9fZnVuY19fIDw8IGVuZGw7Cn0KCnZvaWQgQ1RjcDo6cmVjdih2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQp7Cgljb3V0IDw8ICJDVGNwOjoiIDw8IF9fZnVuY19fIDw8IGVuZGw7Cn0KCnZvaWQgQ1RjcDo6c2VuZCh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQp7Cgljb3V0IDw8ICJDVGNwOjoiIDw8IF9fZnVuY19fIDw8IGVuZGw7Cn0KCnZvaWQgQ1RjcDo6Y2xvc2UoKQp7Cgljb3V0IDw8ICJDVGNwOjoiIDw8IF9fZnVuY19fIDw8IGVuZGw7Cn0KCi8vIEltcGxlbWVudCBDQ29ubmVjdG9yCkNDb25uZWN0b3I6OkNDb25uZWN0b3IoKTogbVRjcCgpLCBtU2VyaWFsKCksIG9wZW5GdW5jKCksIHJlY3ZGdW5jKCksIHNlbmRGdW5jKCksIGNsb3NlRnVuYygpCnsKfQoKdm9pZCBDQ29ubmVjdG9yOjpvcGVuKCkKewoJaWYob3BlbkZ1bmMgIT0gTlVMTCkKCQlvcGVuRnVuYygpOwp9Cgp2b2lkIENDb25uZWN0b3I6OnJlY3Yodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKewoJaWYocmVjdkZ1bmMgIT0gTlVMTCkKCQlyZWN2RnVuYyhidWZmZXIsIHNpemUpOwp9Cgp2b2lkIENDb25uZWN0b3I6OnNlbmQodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKewoJaWYoc2VuZEZ1bmMgIT0gTlVMTCkKCQlzZW5kRnVuYyhidWZmZXIsIHNpemUpOwp9Cgp2b2lkIENDb25uZWN0b3I6OmNsb3NlKCkKewoJaWYoY2xvc2VGdW5jICE9IE5VTEwpCgkJY2xvc2VGdW5jKCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgp2b2lkIENDb25uZWN0b3I6OmJpbmRDb25uZWN0b3IoVCogY29ubmVjdG9yKQp7CglvcGVuRnVuYyA9IHN0ZDo6YmluZCgmVDo6b3BlbiwgY29ubmVjdG9yKTsKCXJlY3ZGdW5jID0gc3RkOjpiaW5kKCZUOjpyZWN2LCBjb25uZWN0b3IsIF8xLCBfMik7CglzZW5kRnVuYyA9IHN0ZDo6YmluZCgmVDo6c2VuZCwgY29ubmVjdG9yLCBfMSwgXzIpOwoJY2xvc2VGdW5jID0gc3RkOjpiaW5kKCZUOjpjbG9zZSwgY29ubmVjdG9yKTsKfQoKdm9pZCBDQ29ubmVjdG9yOjpzZXRUeXBlKENPTk5FQ1RfVFlQRSB0eXBlKQp7CgltVHlwZSA9IHR5cGU7Cglzd2l0Y2gobVR5cGUpCgl7CgkJY2FzZSBDT05ORUNUX1RZUEU6OlNFUklBTDoKCQkJYmluZENvbm5lY3RvcigmbVRjcCk7CgkJCWJyZWFrOwoJCWNhc2UgQ09OTkVDVF9UWVBFOjpUQ1A6CgkJCWJpbmRDb25uZWN0b3IoJm1UY3ApOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQl0aHJvdyAiZXJyb3IiOwoJfQp9Cgp2b2lkIHRlc3RUQ1AoKQp7CglDQ29ubmVjdG9yKiBjb25lY3RvciA9IG5ldyBDQ29ubmVjdG9yKCk7Cgljb25lY3Rvci0+c2V0VHlwZShDT05ORUNUX1RZUEU6OlRDUCk7Cgljb25lY3Rvci0+b3BlbigpOwoJY29uZWN0b3ItPnJlY3YoTlVMTCwgMCk7Cgljb25lY3Rvci0+c2VuZChOVUxMLCAwKTsKCWNvbmVjdG9yLT5jbG9zZSgpOwoJZGVsZXRlIGNvbmVjdG9yOwoJY291dCA8PCBlbmRsOwp9Cgp2b2lkIHRlc3RTZXJpYWwoKQp7CglDQ29ubmVjdG9yKiBjb25lY3RvciA9IG5ldyBDQ29ubmVjdG9yKCk7Cgljb25lY3Rvci0+c2V0VHlwZShDT05ORUNUX1RZUEU6OlNFUklBTCk7Cgljb25lY3Rvci0+b3BlbigpOwoJY29uZWN0b3ItPnJlY3YoTlVMTCwgMCk7Cgljb25lY3Rvci0+c2VuZChOVUxMLCAwKTsKCWNvbmVjdG9yLT5jbG9zZSgpOwoJZGVsZXRlIGNvbmVjdG9yOwoJY291dCA8PCBlbmRsOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQp7Cgl0ZXN0VENQKCk7Cgl0ZXN0U2VyaWFsKCk7CgoJcmV0dXJuIDA7Cn0=