#include <iostream>
#include <iomanip>
#include <string>
typedef unsigned long long uint_type;
class sc_uint
{
private: uint_type data = 0xABCD;
public:
// User-defined type conversion
operator uint_type () const
{
return data;
}
// Method `print (std::ostream &)` inherited from `sc_dt::sc_uint_base
void print (std::ostream & out)
{
out << "Look! I'm a string: "
<< std::setw (8) << std::setfill ('0')
<< data;
}
};
// There is no `operator << (ostream &)` in `sc_dt::sc_uint <W>`
// but it could be defined elsewhere
std::ostream & operator << (std::ostream & out, sc_uint & foo)
{
foo.print (out);
return out;
}
int main ()
{
sc_uint foo;
// The `std::ostream & operator << (std::ostream &, sc_uint &)` is
// being called. That is why by default it prints four zeros.
std::cout << std::hex << foo << std::endl;
std::cout << std::dec << foo << std::endl;
// The `operator uint_type () const` is now being called turning
// `sc_uint` into `uint_type`, which is `long long`. The `std::cout`
// skips leading zeros.
std::cout << std::hex << (foo & 0xFF) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHN0cmluZz4KCgp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50X3R5cGU7CmNsYXNzIHNjX3VpbnQKewpwcml2YXRlOiB1aW50X3R5cGUgZGF0YSA9IDB4QUJDRDsKcHVibGljOgoKICAgIC8vIFVzZXItZGVmaW5lZCB0eXBlIGNvbnZlcnNpb24KICAgIG9wZXJhdG9yIHVpbnRfdHlwZSAoKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBkYXRhOwogICAgfQoKICAgIC8vIE1ldGhvZCBgcHJpbnQgKHN0ZDo6b3N0cmVhbSAmKWAgaW5oZXJpdGVkIGZyb20gYHNjX2R0OjpzY191aW50X2Jhc2UKICAgIHZvaWQgcHJpbnQgKHN0ZDo6b3N0cmVhbSAmIG91dCkKICAgIHsKICAgICAgICBvdXQgPDwgIkxvb2shIEknbSBhIHN0cmluZzogIgogICAgICAgICAgICA8PCBzdGQ6OnNldHcgKDgpIDw8IHN0ZDo6c2V0ZmlsbCAoJzAnKQogICAgICAgICAgICA8PCBkYXRhOwogICAgfQp9OwoKCi8vIFRoZXJlIGlzIG5vIGBvcGVyYXRvciA8PCAob3N0cmVhbSAmKWAgaW4gYHNjX2R0OjpzY191aW50IDxXPmAKLy8gYnV0IGl0IGNvdWxkIGJlIGRlZmluZWQgZWxzZXdoZXJlCnN0ZDo6b3N0cmVhbSAmIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0gJiBvdXQsIHNjX3VpbnQgJiBmb28pCnsKICAgIGZvby5wcmludCAob3V0KTsKICAgIHJldHVybiBvdXQ7Cn0KCgppbnQgbWFpbiAoKQp7CiAgICBzY191aW50IGZvbzsKCiAgICAvLyBUaGUgYHN0ZDo6b3N0cmVhbSAmIG9wZXJhdG9yIDw8IChzdGQ6Om9zdHJlYW0gJiwgc2NfdWludCAmKWAgaXMKICAgIC8vIGJlaW5nIGNhbGxlZC4gVGhhdCBpcyB3aHkgYnkgZGVmYXVsdCBpdCBwcmludHMgZm91ciB6ZXJvcy4KICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmhleCA8PCBmb28gPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZGVjIDw8IGZvbyA8PCBzdGQ6OmVuZGw7CgogICAgLy8gVGhlIGBvcGVyYXRvciB1aW50X3R5cGUgKCkgY29uc3RgIGlzIG5vdyBiZWluZyBjYWxsZWQgdHVybmluZwogICAgLy8gYHNjX3VpbnRgIGludG8gYHVpbnRfdHlwZWAsIHdoaWNoIGlzIGBsb25nIGxvbmdgLiBUaGUgYHN0ZDo6Y291dGAKICAgIC8vIHNraXBzIGxlYWRpbmcgemVyb3MuCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjpoZXggPDwgKGZvbyAmIDB4RkYpIDw8IHN0ZDo6ZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==