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