Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 62 additions & 6 deletions module-1/homework/SharedPointer/src/control/control.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,81 @@

class SharedCount {
public:
// Your code goes here...
size_t Get() const {
return counter_.load();
}

virtual bool Empty() {
return counter_ > 0;
}

virtual bool Remove() {
if (counter_ == 0) {
return false;
}

--counter_;
return true;
}

void Add() {
++counter_;
}

protected:
// Your code goes here...
std::atomic<size_t> counter_{0};
};

class SharedWeakCount : public SharedCount {
public:
// Your code goes here...
void AddWeak() {
++weak_counter_;
}

bool RemoveWeak() {
if (weak_counter_ == 0) {
return false;
}

--weak_counter_;
return true;
}

size_t GetWeak() const {
return weak_counter_.load();
}

bool Empty() override {
return (counter_ == 0) and (weak_counter_ == 0);
}

protected:
// Your code goes here...
std::atomic<size_t> weak_counter_{0};
};

template <typename T, typename Deleter>
class ControlBlock : public SharedWeakCount {
public:
// Your code goes here...
explicit ControlBlock(T* value) : value_{value} {
assert(value_ != nullptr);
Add();
}

ControlBlock(ControlBlock&) = delete;
void operator=(ControlBlock&) = delete;

bool Remove() override {
if (SharedCount::Remove()) {
if (Get() == 0) {
Deleter deleter;
deleter(value_);
value_ = nullptr;
}
return true;
}
return false;
}

private:
// Your code goes here...
T* value_;
};
Loading