#include <iostream>
#include <memory>
#include <map>
template <class X>
X& Singleton()
{
static X x;
return x;
}
template<class GUID_T, class MAP_T, class T>
class TypeFactory {
protected:
bool ContainsInternal(MAP_T id) {
auto it = types.find(id);
return (it != types.end());
}
typedef GUID_T GUID;
inline virtual MAP_T GetTypeID(GUID guid) = 0;
std::map<MAP_T, T> types;
public :
void Add(GUID guid, const T & value) {
auto id = GetTypeID(guid);
if(!ContainsInternal(id)) {
types.insert(std::make_pair(id, T(value)));
}
}
bool Contains(GUID guid) {
return ContainsInternal(GetTypeID(guid));
}
std::shared_ptr<T> Get(GUID guid) {
auto id = GetTypeID(guid);
std::shared_ptr<T> result;
auto it = types.find(id);
if(it != types.end()) {
result = std::make_shared<T>(it->second);
}
return result;
}
std::map<MAP_T, T> & GetAll() {
return types;
}
};
template<class T>
class IntTypeFactory : public TypeFactory<int, int, T> {
protected:
inline virtual int GetTypeID(typename TypeFactory<int, int, T>::GUID guid) {
return guid;
}
};
class Type {
public: int a;
};
int main() {
IntTypeFactory<Type> & Types (Singleton< IntTypeFactory<Type> >());
IntTypeFactory<Type> & Types2 (Singleton< IntTypeFactory<Type> >());
auto t_in = Type();
t_in.a = 10;
Types.Add(1, t_in);
auto t_out = Types2.Get(1);
std::cout << t_out->a << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8bWFwPgoKdGVtcGxhdGUgPGNsYXNzIFg+ClgmIFNpbmdsZXRvbigpCnsKICAgIHN0YXRpYyBYIHg7CglyZXR1cm4geDsKfQoKdGVtcGxhdGU8Y2xhc3MgR1VJRF9ULCBjbGFzcyBNQVBfVCwgY2xhc3MgVD4KY2xhc3MgVHlwZUZhY3Rvcnkgewpwcm90ZWN0ZWQ6Cglib29sIENvbnRhaW5zSW50ZXJuYWwoTUFQX1QgaWQpIHsKCQlhdXRvIGl0ID0gdHlwZXMuZmluZChpZCk7CgkJcmV0dXJuIChpdCAhPSB0eXBlcy5lbmQoKSk7Cgl9CgoJdHlwZWRlZiBHVUlEX1QgR1VJRDsKCWlubGluZSB2aXJ0dWFsIE1BUF9UIEdldFR5cGVJRChHVUlEIGd1aWQpID0gMDsKCXN0ZDo6bWFwPE1BUF9ULCBUPiB0eXBlczsKcHVibGljIDoKCXZvaWQgQWRkKEdVSUQgZ3VpZCwgY29uc3QgVCAmIHZhbHVlKSB7CgkJYXV0byBpZCA9IEdldFR5cGVJRChndWlkKTsKCQlpZighQ29udGFpbnNJbnRlcm5hbChpZCkpIHsKCQkJdHlwZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGlkLCBUKHZhbHVlKSkpOwoJCX0KCX0KCglib29sIENvbnRhaW5zKEdVSUQgZ3VpZCkgewoJCXJldHVybiBDb250YWluc0ludGVybmFsKEdldFR5cGVJRChndWlkKSk7Cgl9CgoJc3RkOjpzaGFyZWRfcHRyPFQ+IEdldChHVUlEIGd1aWQpIHsKCQlhdXRvIGlkID0gR2V0VHlwZUlEKGd1aWQpOwoJCXN0ZDo6c2hhcmVkX3B0cjxUPiByZXN1bHQ7CgkJYXV0byBpdCA9IHR5cGVzLmZpbmQoaWQpOwoJCWlmKGl0ICE9IHR5cGVzLmVuZCgpKSB7CgkJCXJlc3VsdCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VD4oaXQtPnNlY29uZCk7CgkJfQoJCXJldHVybiByZXN1bHQ7Cgl9CgoJc3RkOjptYXA8TUFQX1QsIFQ+ICYgR2V0QWxsKCkgewoJCXJldHVybiB0eXBlczsKCX0KfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIEludFR5cGVGYWN0b3J5IDogcHVibGljIFR5cGVGYWN0b3J5PGludCwgaW50LCBUPiB7CnByb3RlY3RlZDoKCWlubGluZSB2aXJ0dWFsIGludCBHZXRUeXBlSUQodHlwZW5hbWUgVHlwZUZhY3Rvcnk8aW50LCBpbnQsIFQ+OjpHVUlEIGd1aWQpIHsKCQlyZXR1cm4gZ3VpZDsKCX0KfTsKY2xhc3MgVHlwZSB7CnB1YmxpYzogaW50IGE7Cn07CgppbnQgbWFpbigpIHsKCUludFR5cGVGYWN0b3J5PFR5cGU+ICYgVHlwZXMgKFNpbmdsZXRvbjwgSW50VHlwZUZhY3Rvcnk8VHlwZT4gPigpKTsKCUludFR5cGVGYWN0b3J5PFR5cGU+ICYgVHlwZXMyIChTaW5nbGV0b248IEludFR5cGVGYWN0b3J5PFR5cGU+ID4oKSk7CgoJYXV0byB0X2luID0gVHlwZSgpOwoJdF9pbi5hID0gMTA7CglUeXBlcy5BZGQoMSwgdF9pbik7CglhdXRvIHRfb3V0ID0gVHlwZXMyLkdldCgxKTsKCXN0ZDo6Y291dCA8PCB0X291dC0+YSA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQ==