#include <iostream>
#include <string>
#include <vector>
using namespace std;
#define DBG(TEXT) do{cout << "( " << m_name << m_id << " " << #TEXT << " )" << endl;}while(0)
#define USE_MOVE_SEMANTICS
class Foo
{
string m_name;
unsigned int m_id;
public:
// constructor
Foo(const char *name)
: m_name(name)
, m_id(0)
{
DBG(constructor);
}
// destructor
~Foo()
{
DBG(destructor);
}
// copy constructor
Foo(const Foo &other)
: m_name(other.m_name)
, m_id(other.m_id + 1)
{
DBG(copy constructor);
}
// copy assignment operator
Foo &operator=(const Foo &other)
{
m_name = other.m_name;
m_id = other.m_id + 1;
DBG(copy assignment operator);
return *this;
}
#ifdef USE_MOVE_SEMANTICS
// move constructor
Foo(Foo &&other)
: m_name(other.m_name)
, m_id(other.m_id + 1)
{
DBG(move constructor);
}
// move assignment operator
Foo &operator=(Foo &&other)
{
m_name = other.m_name;
m_id = other.m_id + 1;
DBG(move assignment operator);
return *this;
}
#endif // USE_MOVE_SEMANTICS
};
int main(void)
{
vector<Foo> vec;
vec.reserve(1);
cout << "Foo a(\"A\");" << endl;
Foo a("A");
cout << "vec.push_back(a);" << endl;
vec.push_back(a); // No reallocation.
cout << "vec.push_back(Foo(\"B\"));" << endl;
vec.push_back(Foo("B")); // Reallocate memory and move elements.
cout << "vec[0] = Foo(\"C\");" << endl;
vec[0] = Foo("C");
cout << "return 0;" << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgREJHKFRFWFQpIGRve2NvdXQgPDwgIiggIiA8PCBtX25hbWUgPDwgbV9pZCA8PCAiICIgPDwgI1RFWFQgPDwgIiApIiA8PCBlbmRsO313aGlsZSgwKQoKI2RlZmluZSBVU0VfTU9WRV9TRU1BTlRJQ1MKCmNsYXNzIEZvbwp7CiAgICBzdHJpbmcgbV9uYW1lOwoJdW5zaWduZWQgaW50IG1faWQ7CnB1YmxpYzoKCgkvLyBjb25zdHJ1Y3RvcgoJRm9vKGNvbnN0IGNoYXIgKm5hbWUpCgkJOiBtX25hbWUobmFtZSkKCQksIG1faWQoMCkKCXsKCQlEQkcoY29uc3RydWN0b3IpOwoJfQoKCS8vIGRlc3RydWN0b3IKCX5Gb28oKQoJewoJCURCRyhkZXN0cnVjdG9yKTsKCX0KCgkvLyBjb3B5IGNvbnN0cnVjdG9yCglGb28oY29uc3QgRm9vICZvdGhlcikKCQk6IG1fbmFtZShvdGhlci5tX25hbWUpCgkJLCBtX2lkKG90aGVyLm1faWQgKyAxKQoJewoJCURCRyhjb3B5IGNvbnN0cnVjdG9yKTsKCX0KCgkvLyBjb3B5IGFzc2lnbm1lbnQgb3BlcmF0b3IKCUZvbyAmb3BlcmF0b3I9KGNvbnN0IEZvbyAmb3RoZXIpCgl7CgkJbV9uYW1lID0gb3RoZXIubV9uYW1lOwoJCW1faWQgPSBvdGhlci5tX2lkICsgMTsKCQlEQkcoY29weSBhc3NpZ25tZW50IG9wZXJhdG9yKTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgojaWZkZWYgVVNFX01PVkVfU0VNQU5USUNTCgoJLy8gbW92ZSBjb25zdHJ1Y3RvcgoJRm9vKEZvbyAmJm90aGVyKQoJCTogbV9uYW1lKG90aGVyLm1fbmFtZSkKCQksIG1faWQob3RoZXIubV9pZCArIDEpCgl7CgkJREJHKG1vdmUgY29uc3RydWN0b3IpOwoJfQoKCS8vIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvcgoJRm9vICZvcGVyYXRvcj0oRm9vICYmb3RoZXIpCgl7CgkJbV9uYW1lID0gb3RoZXIubV9uYW1lOwoJCW1faWQgPSBvdGhlci5tX2lkICsgMTsKCQlEQkcobW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yKTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgojZW5kaWYgLy8gVVNFX01PVkVfU0VNQU5USUNTCgp9OwoKaW50IG1haW4odm9pZCkKewoJdmVjdG9yPEZvbz4gdmVjOwoJdmVjLnJlc2VydmUoMSk7CgoJY291dCA8PCAiRm9vIGEoXCJBXCIpOyIgPDwgZW5kbDsKCUZvbyBhKCJBIik7CgoJY291dCA8PCAidmVjLnB1c2hfYmFjayhhKTsiIDw8IGVuZGw7Cgl2ZWMucHVzaF9iYWNrKGEpOyAvLyBObyByZWFsbG9jYXRpb24uCgoJY291dCA8PCAidmVjLnB1c2hfYmFjayhGb28oXCJCXCIpKTsiIDw8IGVuZGw7Cgl2ZWMucHVzaF9iYWNrKEZvbygiQiIpKTsgLy8gUmVhbGxvY2F0ZSBtZW1vcnkgYW5kIG1vdmUgZWxlbWVudHMuCgoJY291dCA8PCAidmVjWzBdID0gRm9vKFwiQ1wiKTsiIDw8IGVuZGw7Cgl2ZWNbMF0gPSBGb28oIkMiKTsKCgljb3V0IDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CglyZXR1cm4gMDsKfQo=