#include <typeinfo>
#include <bitset>
#include <map>
#include <type_traits>
class Component { } ;
class ComponentA : public Component { } ;
class ComponentB : public Component { } ;
class NonComponent { } ;
constexpr int BITSIZE = 10 ;
class ComponentType {
public : std:: bitset < BITSIZE> getBit( ) { return std:: bitset < BITSIZE> ( ) ; }
} ;
namespace {
std:: map < std:: size_t ,ComponentType* > componentTypes;
ComponentType & getTypeFor( const std:: type_info & t) {
ComponentType * type = componentTypes[ t.hash_code ( ) ] ;
if ( ! type)
{
type = new ComponentType( ) ;
componentTypes[ t.hash_code ( ) ] = type;
}
return * type;
} ;
template < typename T>
typename std:: enable_if < std:: is_base_of < Component,T> :: value ,
std:: bitset < BITSIZE>> :: type
getBit( const T & t) {
return getTypeFor( typeid ( t) ) .getBit ( ) ;
}
}
int main( ) {
ComponentA a;
getBit( a) ;
NonComponent n;
getBit( n) ; // error, won't compile
}
I2luY2x1ZGUgPHR5cGVpbmZvPgojaW5jbHVkZSA8Yml0c2V0PgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpjbGFzcyBDb21wb25lbnQge307CgpjbGFzcyBDb21wb25lbnRBIDogcHVibGljIENvbXBvbmVudCB7fTsKY2xhc3MgQ29tcG9uZW50QiA6IHB1YmxpYyBDb21wb25lbnQge307CmNsYXNzIE5vbkNvbXBvbmVudCB7fTsKCmNvbnN0ZXhwciBpbnQgQklUU0laRSA9IDEwOwoKY2xhc3MgQ29tcG9uZW50VHlwZSB7CnB1YmxpYzogc3RkOjpiaXRzZXQ8QklUU0laRT4gZ2V0Qml0KCkgeyByZXR1cm4gc3RkOjpiaXRzZXQ8QklUU0laRT4oKTsgfQp9OwoKbmFtZXNwYWNlIHsKICAgIHN0ZDo6bWFwPHN0ZDo6c2l6ZV90LENvbXBvbmVudFR5cGUqPiBjb21wb25lbnRUeXBlczsKCiAgICBDb21wb25lbnRUeXBlICZnZXRUeXBlRm9yKGNvbnN0IHN0ZDo6dHlwZV9pbmZvICZ0KXsKICAgICAgICBDb21wb25lbnRUeXBlICp0eXBlID0gY29tcG9uZW50VHlwZXNbdC5oYXNoX2NvZGUoKV07CgogICAgICAgIGlmKCF0eXBlKQogICAgICAgIHsKICAgICAgICAgICAgdHlwZSA9IG5ldyBDb21wb25lbnRUeXBlKCk7CiAgICAgICAgICAgIGNvbXBvbmVudFR5cGVzW3QuaGFzaF9jb2RlKCldID0gdHlwZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAqdHlwZTsKCiAgICB9OwogICAgCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPENvbXBvbmVudCxUPjo6dmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpdHNldDxCSVRTSVpFPj46OnR5cGUKICAgIGdldEJpdChjb25zdCBUICZ0KSB7CiAgICAgICAgcmV0dXJuIGdldFR5cGVGb3IodHlwZWlkKHQpKS5nZXRCaXQoKTsKICAgIH0KICAgIAp9CgppbnQgbWFpbigpIHsKICAgIENvbXBvbmVudEEgYTsKICAgIGdldEJpdChhKTsKICAgIAogICAgTm9uQ29tcG9uZW50IG47CiAgICBnZXRCaXQobik7IC8vIGVycm9yLCB3b24ndCBjb21waWxlCn0=