#ifndef _popcorn_property_hpp_
#define _popcorn_property_hpp_
namespace popcorn
{
enum property_flag
{
read = 1 << 0,
write = 1 << 1,
readwrite = read | write,
};
template<typename T, int flags = 0>
struct property;
template<typename T>
struct property<T, 0>
{ protected: T value; };
template<typename T>
struct property<T, read> : protected virtual property<T, 0>
{
operator T&() { return this->value; }
operator const T&() const { return this->value; }
};
template<typename T>
struct property<T, write> : protected virtual property<T, 0>
{
property<T, write>& operator=(T val) { this->value = val; return *this; }
};
template<typename T>
struct property<T, readwrite> : property<T, read>, property<T, write>
{
property<T, readwrite>& operator=(T val) { this->value = val; return *this; }
};
}
#endif
int main()
{
using namespace popcorn;
property<int, read> read_only;
property<int, write> write_only;
property<int, read | write> read_write;
property<int> no_access;
static_cast<int>(read_only);
write_only = 42;
static_cast<int>(read_write);
read_write = 42;
}
I2lmbmRlZiBfcG9wY29ybl9wcm9wZXJ0eV9ocHBfCiNkZWZpbmUgX3BvcGNvcm5fcHJvcGVydHlfaHBwXwoKbmFtZXNwYWNlIHBvcGNvcm4KewogICAgZW51bSBwcm9wZXJ0eV9mbGFnCiAgICB7CiAgICAgICAgcmVhZCAgPSAxIDw8IDAsCiAgICAgICAgd3JpdGUgPSAxIDw8IDEsCiAgICAgICAgcmVhZHdyaXRlID0gcmVhZCB8IHdyaXRlLAogICAgfTsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgZmxhZ3MgPSAwPgogICAgICAgIHN0cnVjdCBwcm9wZXJ0eTsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgIHN0cnVjdCBwcm9wZXJ0eTxULCAwPgogICAgICAgIHsgIHByb3RlY3RlZDogVCB2YWx1ZTsgfTsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgIHN0cnVjdCBwcm9wZXJ0eTxULCByZWFkPiA6IHByb3RlY3RlZCB2aXJ0dWFsIHByb3BlcnR5PFQsIDA+CiAgICAgICAgewogICAgICAgICAgICBvcGVyYXRvciBUJigpICAgICAgICAgICAgIHsgcmV0dXJuIHRoaXMtPnZhbHVlOyB9CiAgICAgICAgICAgIG9wZXJhdG9yIGNvbnN0IFQmKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+dmFsdWU7IH0KICAgICAgICB9OwoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgICAgc3RydWN0IHByb3BlcnR5PFQsIHdyaXRlPiA6IHByb3RlY3RlZCB2aXJ0dWFsIHByb3BlcnR5PFQsIDA+CiAgICAgICAgewogICAgICAgICAgICBwcm9wZXJ0eTxULCB3cml0ZT4mIG9wZXJhdG9yPShUIHZhbCkgICAgIHsgdGhpcy0+dmFsdWUgPSB2YWw7IHJldHVybiAqdGhpczsgfQogICAgICAgIH07CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICAgICBzdHJ1Y3QgcHJvcGVydHk8VCwgcmVhZHdyaXRlPiA6IHByb3BlcnR5PFQsIHJlYWQ+LCBwcm9wZXJ0eTxULCB3cml0ZT4KICAgICAgICB7CiAgICAgICAgICAgIHByb3BlcnR5PFQsIHJlYWR3cml0ZT4mIG9wZXJhdG9yPShUIHZhbCkgeyB0aGlzLT52YWx1ZSA9IHZhbDsgcmV0dXJuICp0aGlzOyB9CiAgICAgICAgfTsKfQoKI2VuZGlmCgppbnQgbWFpbigpCnsKICAgIHVzaW5nIG5hbWVzcGFjZSBwb3Bjb3JuOwogICAgcHJvcGVydHk8aW50LCByZWFkPiByZWFkX29ubHk7CiAgICBwcm9wZXJ0eTxpbnQsIHdyaXRlPiB3cml0ZV9vbmx5OwogICAgcHJvcGVydHk8aW50LCByZWFkIHwgd3JpdGU+IHJlYWRfd3JpdGU7CiAgICBwcm9wZXJ0eTxpbnQ+IG5vX2FjY2VzczsKCiAgICBzdGF0aWNfY2FzdDxpbnQ+KHJlYWRfb25seSk7CiAgICB3cml0ZV9vbmx5ID0gNDI7CiAgICBzdGF0aWNfY2FzdDxpbnQ+KHJlYWRfd3JpdGUpOwogICAgcmVhZF93cml0ZSA9IDQyOwp9Cg==