Reference count (Rc aka shared_ptr) implementation
This commit is contained in:
parent
b17d7543cf
commit
168f49d0b2
2 changed files with 84 additions and 0 deletions
5
refcount/Makefile
Normal file
5
refcount/Makefile
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# Only define if needed:
|
||||||
|
# TARGET = main.elf
|
||||||
|
# SRCS = main.cc
|
||||||
|
|
||||||
|
include ../config.mk
|
79
refcount/main.cc
Normal file
79
refcount/main.cc
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
/* RefCounter. Analogous to std::shared_ptr. */
|
||||||
|
template <typename T>
|
||||||
|
class Rc {
|
||||||
|
T *data;
|
||||||
|
std::size_t *refs;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit Rc(const T &); // Copy ctor
|
||||||
|
explicit Rc(T &&); // Move ctor
|
||||||
|
|
||||||
|
Rc(const Rc &); // Copy ctor
|
||||||
|
Rc(Rc &&); // Move ctor
|
||||||
|
|
||||||
|
void operator=(const Rc &); // Copy assign
|
||||||
|
void operator=(Rc &&); // Move assign
|
||||||
|
|
||||||
|
~Rc();
|
||||||
|
const T &borrow() noexcept;
|
||||||
|
T &borrow_mut() noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
Rc<T>::Rc(const T &data)
|
||||||
|
: Rc(std::move(data)) {}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
Rc<T>::Rc(T &&data)
|
||||||
|
: data(new T(std::move(data)))
|
||||||
|
, refs(new std::size_t(1)) {}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
Rc<T>::Rc(const Rc &other)
|
||||||
|
: data(other.data)
|
||||||
|
, refs(other.refs) {
|
||||||
|
refs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
Rc<T>::Rc(Rc &&other)
|
||||||
|
: data(other.data)
|
||||||
|
, refs(other.refs) {
|
||||||
|
other.refs = nullptr;
|
||||||
|
other.data = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void Rc<T>::operator=(const Rc &other) {}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void Rc<T>::operator=(Rc &&other) {}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
Rc<T>::~Rc() {
|
||||||
|
if (--refs == 0)
|
||||||
|
delete data;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
const T &Rc<T>::borrow() noexcept {
|
||||||
|
return *data;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T &Rc<T>::borrow_mut() noexcept {
|
||||||
|
return *data;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
std::cout << "Template" << std::endl;
|
||||||
|
Rc<int> a = Rc(10);
|
||||||
|
auto b = Rc(10);
|
||||||
|
b.borrow_mut()++;
|
||||||
|
std::cout << a.borrow() << std::endl;
|
||||||
|
std::cout << b.borrow() << std::endl;
|
||||||
|
|
||||||
|
a = b;
|
||||||
|
}
|
Loading…
Reference in a new issue