#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>
#include <cassert>
template <typename T>
class UniquePtr {
public:
//UniquePtr(): ptr(nullptr) {}
explicit UniquePtr(T* p): ptr(std::move(p)) {
}
UniquePtr(UniquePtr&& u): ptr(std::move(u.ptr)) {
//delete u.ptr;
u.ptr = nullptr;
}
UniquePtr& operator = (UniquePtr&& u) {
ptr = std::move(u.ptr);
//delete u.ptr;
u.ptr = nullptr;
return *this;
}
UniquePtr(const UniquePtr&) = delete;
UniquePtr& operator = (const UniquePtr&) = delete;
~UniquePtr() {
//std::cout << 'j';
// if (ptr) {
delete ptr;
// }
}
T* get() const {
return ptr;
}
T& operator*() const {
return *ptr;
}
T* operator->() const {
return ptr;
}
private:
T* ptr;
};
template <typename T>
using WeakPtr = std::weak_ptr<T>;
template <typename T>
using SharedPtr = std::shared_ptr<T>;
int main() {
/*
{
for (int i = 0; i < 1'000'000; ++i) {
auto u = UniquePtr<long long>(new long long(5));
auto uu = UniquePtr<long long>(new long long(10));
u = std::move(uu);
assert(*u == 10);
assert(uu.get() == nullptr);
auto uuu = std::move(uu);
uuu = std::move(u);
}
}
*/
{
for (int k = 0; k < 10; ++k) {
std::vector<UniquePtr<int>> v;
for (int i = 0; i < 100'000; ++i) {
v.push_back(UniquePtr<int>(new int(i)));
}
std::reverse(v.begin(), v.end());
assert(*v[20'000] == 79'999);
}
}
auto p = UniquePtr<std::string>(new std::string("1234567890"));
assert(p->length() == 10);
}