#include <stdio.h>
#include <stdint.h>
class A
{
public:
A()
{
myCtr = ++ctr;
printf("class A default Constructor - object id: %u\n", myCtr);
}
A(const A &a2) {
myCtr = ++ctr;
printf("class A copy constructor - object id: %u\n", myCtr);
}
A(A &&a2) {
myCtr = a2.myCtr;
a2.myCtr = 0;
printf("class A move constructor - object id: %u\n", myCtr);
}
A & operator=(const A &a2) {
myCtr = ++ctr;
printf("class A copy assignment - from object id: %u - to object id: %u\n", a2.myCtr, myCtr);
return *this;
}
A & operator=(A &&a2) {
printf("class A move assignment - from object id: %u - to object id: %u\n", a2.myCtr, myCtr);
if (this != &a2) {
//myCtr = a2.myCtr;
//a2.myCtr = 0;
}
return *this;
}
~A()
{
printf("class A destructor - object id: %u\n", myCtr);
}
private:
uint64_t myCtr;
static uint64_t ctr;
};
class B
{
public:
B() {
}
B(char * input, uint32_t len) {
for (uint32_t i = 0; i < len; i++)
{
/* do something */
}
}
B(const B &b2) : characters(b2.characters)
{
}
B(B &&b2) {
characters = A(b2.characters);
}
B & operator=(const B &b2) {
characters = A(b2.characters);
}
B & operator=(B &&b2) {
characters = A(b2.characters);
}
~B() {
}
private:
A characters;
};
uint64_t A::ctr = 0;
int main(int argc, char *argv[]) {
B b1 = B((char *)"b1", 2);
B b2 = b1;
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KCmNsYXNzIEEKewpwdWJsaWM6CiAgICBBKCkKICAgIHsKICAgICAgICBteUN0ciA9ICsrY3RyOwogICAgICAgIHByaW50ZigiY2xhc3MgQSBkZWZhdWx0IENvbnN0cnVjdG9yIC0gb2JqZWN0IGlkOiAldVxuIiwgbXlDdHIpOwogICAgfQoKICAgIEEoY29uc3QgQSAmYTIpIHsKICAgICAgICBteUN0ciA9ICsrY3RyOwogICAgICAgIHByaW50ZigiY2xhc3MgQSBjb3B5IGNvbnN0cnVjdG9yIC0gb2JqZWN0IGlkOiAldVxuIiwgbXlDdHIpOwoKICAgIH0KCiAgICBBKEEgJiZhMikgewogICAgICAgIG15Q3RyID0gYTIubXlDdHI7CiAgICAgICAgYTIubXlDdHIgPSAwOwoKICAgICAgICBwcmludGYoImNsYXNzIEEgbW92ZSBjb25zdHJ1Y3RvciAtIG9iamVjdCBpZDogJXVcbiIsIG15Q3RyKTsKCiAgICB9CgogICAgQSAmIG9wZXJhdG9yPShjb25zdCBBICZhMikgewogICAgICAgIG15Q3RyID0gKytjdHI7CgogICAgICAgIHByaW50ZigiY2xhc3MgQSBjb3B5IGFzc2lnbm1lbnQgLSBmcm9tIG9iamVjdCBpZDogJXUgLSB0byBvYmplY3QgaWQ6ICV1XG4iLCBhMi5teUN0ciwgbXlDdHIpOwoKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgQSAmIG9wZXJhdG9yPShBICYmYTIpIHsKICAgICAgICBwcmludGYoImNsYXNzIEEgbW92ZSBhc3NpZ25tZW50IC0gZnJvbSBvYmplY3QgaWQ6ICV1IC0gdG8gb2JqZWN0IGlkOiAldVxuIiwgYTIubXlDdHIsIG15Q3RyKTsKCiAgICAgICAgaWYgKHRoaXMgIT0gJmEyKSB7CiAgICAgICAgICAgIC8vbXlDdHIgPSBhMi5teUN0cjsKICAgICAgICAgICAgLy9hMi5teUN0ciA9IDA7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgfkEoKQogICAgewogICAgICAgIHByaW50ZigiY2xhc3MgQSBkZXN0cnVjdG9yIC0gb2JqZWN0IGlkOiAldVxuIiwgbXlDdHIpOwogICAgfQoKcHJpdmF0ZToKICAgIHVpbnQ2NF90IG15Q3RyOwogICAgc3RhdGljIHVpbnQ2NF90IGN0cjsKfTsKCmNsYXNzIEIKewpwdWJsaWM6CiAgICBCKCkgewoKICAgIH0KCiAgICBCKGNoYXIgKiBpbnB1dCwgdWludDMyX3QgbGVuKSB7CiAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgLyogZG8gc29tZXRoaW5nICovCiAgICAgICAgfQogICAgfQoKICAgIEIoY29uc3QgQiAmYjIpIDogY2hhcmFjdGVycyhiMi5jaGFyYWN0ZXJzKQogICAgewogICAgfQoJCiAgICBCKEIgJiZiMikgewogICAgICAgIGNoYXJhY3RlcnMgPSBBKGIyLmNoYXJhY3RlcnMpOwogICAgfQoKICAgIEIgJiBvcGVyYXRvcj0oY29uc3QgQiAmYjIpIHsKICAgICAgICBjaGFyYWN0ZXJzID0gQShiMi5jaGFyYWN0ZXJzKTsKICAgIH0KCiAgICBCICYgb3BlcmF0b3I9KEIgJiZiMikgewogICAgICAgIGNoYXJhY3RlcnMgPSBBKGIyLmNoYXJhY3RlcnMpOwogICAgfQoKICAgIH5CKCkgewoKICAgIH0KCgpwcml2YXRlOgogICAgQSBjaGFyYWN0ZXJzOwp9OwoKdWludDY0X3QgQTo6Y3RyID0gMDsKCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgIEIgYjEgPSBCKChjaGFyICopImIxIiwgMik7CiAgICBCIGIyID0gYjE7CgogICAgcmV0dXJuIDA7Cn0=