#include <iostream>
using namespace std;
class GO{//game object
public:
static const int numRelation=10;
GO* left[numRelation];
GO* right[numRelation];
public: GO(){
for(int n=0;n<numRelation;n++){
left[n]=nullptr;
right[n]=nullptr;
}
}
};
class DB{//database
int userIndex=-42;
public: DB(){};
public: DB(int us){userIndex=us;}
public: GO* getLeft(GO* g){return g->left[userIndex];}
public: void createRelation(GO* g1,GO* g2){
g2->left[userIndex]=g1;
g1->right[userIndex]=g2;
}
};
class DBGenerator{//quite singleton
int indexCounter=0;
public: DB generate(){return DB(indexCounter++);}
};
//---^ library ^---
//---v user v----
class CageManager{
DB dbHenFood;
DB dbHenCage;
public: CageManager(DBGenerator* gen){
dbHenFood=gen->generate();
dbHenCage=gen->generate();
}
};
class FamilyManager{
public: DB dbHenEgg;
public: FamilyManager(DBGenerator* gen){
dbHenEgg=gen->generate();
}
};
int main() {
DBGenerator commander;
CageManager m1{&commander};
FamilyManager m2{&commander};
GO* hen=new GO();
GO* egg=new GO();
m2.dbHenEgg.createRelation(hen,egg);
GO* henGet=m2.dbHenEgg.getLeft(egg);
if(henGet==hen)std::cout<<"correct";
if(henGet!=hen)std::cout<<"wrong";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgR097Ly9nYW1lIG9iamVjdAoJcHVibGljOgoJc3RhdGljIGNvbnN0IGludCBudW1SZWxhdGlvbj0xMDsKICAgIEdPKiBsZWZ0W251bVJlbGF0aW9uXTsJCiAgICBHTyogcmlnaHRbbnVtUmVsYXRpb25dOwogICAgcHVibGljOiBHTygpewogICAgICAgIGZvcihpbnQgbj0wO248bnVtUmVsYXRpb247bisrKXsKICAgICAgICAgICAgbGVmdFtuXT1udWxscHRyOwogICAgICAgICAgICByaWdodFtuXT1udWxscHRyOwogICAgICAgIH0KICAgIH0KfTsKY2xhc3MgREJ7Ly9kYXRhYmFzZQoJaW50IHVzZXJJbmRleD0tNDI7CglwdWJsaWM6IERCKCl7fTsKCXB1YmxpYzogREIoaW50IHVzKXt1c2VySW5kZXg9dXM7fQoJcHVibGljOiBHTyogZ2V0TGVmdChHTyogZyl7cmV0dXJuIGctPmxlZnRbdXNlckluZGV4XTt9CglwdWJsaWM6IHZvaWQgY3JlYXRlUmVsYXRpb24oR08qIGcxLEdPKiBnMil7CgkgICAgZzItPmxlZnRbdXNlckluZGV4XT1nMTsKCSAgICBnMS0+cmlnaHRbdXNlckluZGV4XT1nMjsKCX0KfTsKY2xhc3MgREJHZW5lcmF0b3J7Ly9xdWl0ZSBzaW5nbGV0b24KCWludCBpbmRleENvdW50ZXI9MDsKCXB1YmxpYzogREIgZ2VuZXJhdGUoKXtyZXR1cm4gREIoaW5kZXhDb3VudGVyKyspO30KfTsKLy8tLS1eIGxpYnJhcnkgXi0tLQoKLy8tLS12IHVzZXIgdi0tLS0KY2xhc3MgQ2FnZU1hbmFnZXJ7CiAgIAogICAgREIgZGJIZW5Gb29kOyAJCiAgICBEQiBkYkhlbkNhZ2U7CiAgICBwdWJsaWM6IENhZ2VNYW5hZ2VyKERCR2VuZXJhdG9yKiBnZW4pewogICAgCWRiSGVuRm9vZD1nZW4tPmdlbmVyYXRlKCk7CiAgICAJZGJIZW5DYWdlPWdlbi0+Z2VuZXJhdGUoKTsKICAgIH0KfTsKY2xhc3MgRmFtaWx5TWFuYWdlcnsKICAgIHB1YmxpYzogREIgZGJIZW5FZ2c7IAogICAgcHVibGljOiBGYW1pbHlNYW5hZ2VyKERCR2VuZXJhdG9yKiBnZW4pewogICAgCWRiSGVuRWdnPWdlbi0+Z2VuZXJhdGUoKTsKICAgIH0KfTsKaW50IG1haW4oKSB7CglEQkdlbmVyYXRvciBjb21tYW5kZXI7CglDYWdlTWFuYWdlciBtMXsmY29tbWFuZGVyfTsKCUZhbWlseU1hbmFnZXIgbTJ7JmNvbW1hbmRlcn07CglHTyogaGVuPW5ldyBHTygpOyAKCUdPKiBlZ2c9bmV3IEdPKCk7CgltMi5kYkhlbkVnZy5jcmVhdGVSZWxhdGlvbihoZW4sZWdnKTsKCUdPKiBoZW5HZXQ9bTIuZGJIZW5FZ2cuZ2V0TGVmdChlZ2cpOwoJaWYoaGVuR2V0PT1oZW4pc3RkOjpjb3V0PDwiY29ycmVjdCI7CglpZihoZW5HZXQhPWhlbilzdGQ6OmNvdXQ8PCJ3cm9uZyI7CglyZXR1cm4gMDsKfQo=