#include <iostream>
#include <sys/stat.h>
#include <fcntl.h>
#include <thread>
#include <memory>
#include <unistd.h>
#include <atomic>
class FD
{
private:
int fd;
static int count;
public:
FD(const char* FilePath, int flags) : fd(open(FilePath, flags)) {++FD::count;}
FD(const FD& other) : fd(other.fd) {++FD::count;}
FD(FD&& other) : fd(other.fd) { other.fd = -1; }
~FD()
{
FD::count -= 1;
if (FD::count == 0)
{
std::cout<<"Destroyed\n";
if (is_open())
close(fd);
}
}
bool is_open() {return fd != -1;}
FD* operator &() {return nullptr;}
operator int() {return fd;}
FD& operator = (FD other)
{
fd = other.fd;
FD::count += 1;
return *this;
}
FD& operator = (FD&& other)
{
fd = other.fd;
other.fd = -1;
return *this;
}
};
int FD::count = 0;
int main()
{
FD fd = FD("Unicode.cpp", O_RDONLY);
FD copy = fd;
FD cpy = FD(copy);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDx0aHJlYWQ+CiNpbmNsdWRlIDxtZW1vcnk+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPGF0b21pYz4KCmNsYXNzIEZECnsKICAgIHByaXZhdGU6CiAgICAgICAgaW50IGZkOwogICAgICAgIHN0YXRpYyBpbnQgY291bnQ7CgogICAgcHVibGljOgogICAgICAgIEZEKGNvbnN0IGNoYXIqIEZpbGVQYXRoLCBpbnQgZmxhZ3MpIDogZmQob3BlbihGaWxlUGF0aCwgZmxhZ3MpKSB7KytGRDo6Y291bnQ7fQogICAgICAgIEZEKGNvbnN0IEZEJiBvdGhlcikgOiBmZChvdGhlci5mZCkgeysrRkQ6OmNvdW50O30KICAgICAgICBGRChGRCYmIG90aGVyKSA6IGZkKG90aGVyLmZkKSB7IG90aGVyLmZkID0gLTE7IH0KCiAgICAgICAgfkZEKCkKICAgICAgICB7CiAgICAgICAgICAgIEZEOjpjb3VudCAtPSAxOwogICAgICAgICAgICBpZiAoRkQ6OmNvdW50ID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZDo6Y291dDw8IkRlc3Ryb3llZFxuIjsKICAgICAgICAgICAgICAgIGlmIChpc19vcGVuKCkpCiAgICAgICAgICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBib29sIGlzX29wZW4oKSB7cmV0dXJuIGZkICE9IC0xO30KICAgICAgICBGRCogb3BlcmF0b3IgJigpIHtyZXR1cm4gbnVsbHB0cjt9CiAgICAgICAgb3BlcmF0b3IgaW50KCkge3JldHVybiBmZDt9CgogICAgICAgIEZEJiBvcGVyYXRvciA9IChGRCBvdGhlcikKICAgICAgICB7CiAgICAgICAgICAgIGZkID0gb3RoZXIuZmQ7CiAgICAgICAgICAgIEZEOjpjb3VudCArPSAxOwogICAgICAgICAgICByZXR1cm4gKnRoaXM7CiAgICAgICAgfQoKICAgICAgICBGRCYgb3BlcmF0b3IgPSAoRkQmJiBvdGhlcikKICAgICAgICB7CiAgICAgICAgICAgIGZkID0gb3RoZXIuZmQ7CiAgICAgICAgICAgIG90aGVyLmZkID0gLTE7CiAgICAgICAgICAgIHJldHVybiAqdGhpczsKICAgICAgICB9Cn07CgppbnQgRkQ6OmNvdW50ID0gMDsKCmludCBtYWluKCkKewoJRkQgZmQgPSBGRCgiVW5pY29kZS5jcHAiLCBPX1JET05MWSk7CglGRCBjb3B5ID0gZmQ7CglGRCBjcHkgPSBGRChjb3B5KTsKCglyZXR1cm4gMDsKfQo=