#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <utility>
using namespace std;
#define NONCOPYABLE(clazz_) \
clazz_(clazz_ const&) = delete; \
clazz_& operator=(clazz_ const&) = delete
struct Person
{
string name;
vector<Person*> freunde;
};
struct Welt
{
list<Person> bewohner;
Welt(){}
NONCOPYABLE(Welt);
Person* neuer_bewohner(string name);
};
Person* Welt::neuer_bewohner(string name)
{
bewohner.emplace_back();
Person* r = &bewohner.back();
r->name = std::move(name);
return r;
}
void befreunde(Person* wen, Person* mit)
{
// TODO: ueberlegen, ob und wie man abfangen soll,
// falls die zwei personen schon befreundet sind
// oder ob wen==mit gilt.
wen->freunde.push_back(mit);
mit->freunde.push_back(wen);
}
int main()
{
Welt w;
Person* hans = w.neuer_bewohner("Hans Wurst");
Person* daniel = w.neuer_bewohner("Daniel Kaese");
befreunde(hans,daniel);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHV0aWxpdHk+CiAKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAojZGVmaW5lIE5PTkNPUFlBQkxFKGNsYXp6XykgXAogIGNsYXp6XyhjbGF6el8gY29uc3QmKSA9IGRlbGV0ZTsgXAogIGNsYXp6XyYgb3BlcmF0b3I9KGNsYXp6XyBjb25zdCYpID0gZGVsZXRlCiAKc3RydWN0IFBlcnNvbgp7CiAgc3RyaW5nIG5hbWU7CiAgdmVjdG9yPFBlcnNvbio+IGZyZXVuZGU7Cn07CiAKc3RydWN0IFdlbHQKewogIGxpc3Q8UGVyc29uPiBiZXdvaG5lcjsKIAogIFdlbHQoKXt9CiAgTk9OQ09QWUFCTEUoV2VsdCk7CiAKICBQZXJzb24qIG5ldWVyX2Jld29obmVyKHN0cmluZyBuYW1lKTsKfTsKIApQZXJzb24qIFdlbHQ6Om5ldWVyX2Jld29obmVyKHN0cmluZyBuYW1lKQp7CiAgYmV3b2huZXIuZW1wbGFjZV9iYWNrKCk7CiAgUGVyc29uKiByID0gJmJld29obmVyLmJhY2soKTsKICByLT5uYW1lID0gc3RkOjptb3ZlKG5hbWUpOwogIHJldHVybiByOwp9CiAKdm9pZCBiZWZyZXVuZGUoUGVyc29uKiB3ZW4sIFBlcnNvbiogbWl0KQp7CiAgLy8gVE9ETzogdWViZXJsZWdlbiwgb2IgdW5kIHdpZSBtYW4gYWJmYW5nZW4gc29sbCwKICAvLyBmYWxscyBkaWUgendlaSBwZXJzb25lbiBzY2hvbiBiZWZyZXVuZGV0IHNpbmQKICAvLyBvZGVyIG9iIHdlbj09bWl0IGdpbHQuCiAgd2VuLT5mcmV1bmRlLnB1c2hfYmFjayhtaXQpOwogIG1pdC0+ZnJldW5kZS5wdXNoX2JhY2sod2VuKTsKfQogCmludCBtYWluKCkKewogIFdlbHQgdzsKICBQZXJzb24qIGhhbnMgICA9IHcubmV1ZXJfYmV3b2huZXIoIkhhbnMgV3Vyc3QiKTsKICBQZXJzb24qIGRhbmllbCA9IHcubmV1ZXJfYmV3b2huZXIoIkRhbmllbCBLYWVzZSIpOwogIGJlZnJldW5kZShoYW5zLGRhbmllbCk7Cn0K