#ifndef TYPETOKEN_HPP_
#define TYPETOKEN_HPP_
#include <atomic>
namespace typetoken
{
using token_t = std:: size_t ;
template < typename T> token_t getToken( void ) ;
class tokenbase {
private :
tokenbase( void ) = delete ;
static volatile std:: atomic < token_t> counter;
template < typename Q>
friend token_t getToken( void ) ;
} ;
template < typename T>
struct typetoken : tokenbase {
private :
typetoken( void ) = delete ;
static token_t ID;
template < typename Q>
friend token_t getToken( void ) ;
} ;
template < typename T>
token_t typetoken< T> :: ID = 0 ;
template < typename T>
token_t getToken( void ) {
typedef typetoken< T> token;
if ( ! token:: ID ) {
token:: ID = ++ token:: counter ;
}
return token:: ID ;
}
} // namespace typetoken
#endif /* TYPETOKEN_HPP_ */
#include <iostream>
int main( ) {
std:: cout << typetoken:: getToken < int > ( ) << ' ' << typetoken:: getToken < signed int > ( ) << ' ' << typetoken:: getToken < char > ( ) << ' ' << typetoken:: getToken < int > ( ) << '\n ' ;
}
I2lmbmRlZiBUWVBFVE9LRU5fSFBQXwojZGVmaW5lIFRZUEVUT0tFTl9IUFBfCgojaW5jbHVkZSA8YXRvbWljPgoKbmFtZXNwYWNlIHR5cGV0b2tlbgp7CgoJdXNpbmcgdG9rZW5fdCA9IHN0ZDo6c2l6ZV90OwoJdGVtcGxhdGU8dHlwZW5hbWUgVD4gdG9rZW5fdCBnZXRUb2tlbih2b2lkKTsKCgljbGFzcyB0b2tlbmJhc2UgewoJcHJpdmF0ZToKCQl0b2tlbmJhc2Uodm9pZCkgPSBkZWxldGU7CgkJc3RhdGljIHZvbGF0aWxlIHN0ZDo6YXRvbWljPHRva2VuX3Q+IGNvdW50ZXI7CgoJCXRlbXBsYXRlPHR5cGVuYW1lIFE+CgkJZnJpZW5kIHRva2VuX3QgZ2V0VG9rZW4odm9pZCk7Cgl9OwoKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+CglzdHJ1Y3QgdHlwZXRva2VuIDogdG9rZW5iYXNlIHsKCXByaXZhdGU6CgkJdHlwZXRva2VuKHZvaWQpID0gZGVsZXRlOwoJCXN0YXRpYyB0b2tlbl90IElEOwoKCQl0ZW1wbGF0ZTx0eXBlbmFtZSBRPgoJCWZyaWVuZCB0b2tlbl90IGdldFRva2VuKHZvaWQpOwoJfTsKCgl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJdG9rZW5fdCB0eXBldG9rZW48VD46OklEID0gMDsKCgl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJdG9rZW5fdCBnZXRUb2tlbih2b2lkKSB7CgkJdHlwZWRlZiB0eXBldG9rZW48VD4gdG9rZW47CgkJaWYgKCF0b2tlbjo6SUQpIHsKCQkJdG9rZW46OklEID0gKyt0b2tlbjo6Y291bnRlcjsKCQl9CgkJcmV0dXJuIHRva2VuOjpJRDsKCX0KfSAvLyBuYW1lc3BhY2UgdHlwZXRva2VuCgojZW5kaWYgLyogVFlQRVRPS0VOX0hQUF8gKi8KCiNpbmNsdWRlIDxpb3N0cmVhbT4KCmludCBtYWluKCl7CglzdGQ6OmNvdXQgPDwgdHlwZXRva2VuOjpnZXRUb2tlbjxpbnQ+KCkgPDwgJyAnIDw8IHR5cGV0b2tlbjo6Z2V0VG9rZW48c2lnbmVkIGludD4oKSA8PCAnICcgPDwgdHlwZXRva2VuOjpnZXRUb2tlbjxjaGFyPigpIDw8ICcgJyA8PCB0eXBldG9rZW46OmdldFRva2VuPGludD4oKSA8PCAnXG4nOwp9Cg==