Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct SharedPtr
- {
- template<class P>
- struct Wrapper
- {
- P* ptr;
- long count;
- Wrapper(P* ptr) : ptr(ptr), count(1)
- { if (ptr == nullptr ) throw "Invalid pointer"; }
- ~Wrapper() { delete ptr; }
- void addRef() { ++count; }
- void release()
- {
- if (--count == 0)
- {
- delete this;
- }
- }
- };
- explicit SharedPtr(Expression *ptr = nullptr)
- : holder(ptr ? new Wrapper<Expression>(ptr) : nullptr)
- {
- }
- SharedPtr(const SharedPtr& other) : holder(nullptr)
- {
- copy(other);
- }
- ~SharedPtr()
- {
- clear();
- }
- SharedPtr& operator=(const SharedPtr& other)
- {
- if (this != &other)
- {
- copy(other);
- }
- return *this;
- }
- Expression* get() const { return holder ? holder->ptr : nullptr;}
- void reset(Expression *ptr = nullptr)
- {
- clear();
- if (ptr != nullptr)
- {
- holder = new Wrapper<Expression>(ptr);
- }
- }
- const Expression& operator*() const
- {
- if (holder == nullptr) throw "Invalid pointer";
- return *holder->ptr;
- }
- Expression& operator*()
- {
- if (holder == nullptr) throw "Invalid pointer";
- return *holder->ptr;
- }
- Expression* operator->() const
- {
- return get();
- }
- private:
- void copy(const SharedPtr& other)
- {
- clear();
- if (other.holder)
- {
- holder = other.holder;
- holder->addRef();
- }
- }
- void clear()
- {
- if (holder)
- {
- holder->release();
- holder = nullptr;
- }
- }
- Wrapper<Expression> *holder;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement