2011年6月15日水曜日

shared_ptr を自分で書いてみる 1

興味本位というか練習のつもりで shared_ptr を自分で書いてみる.

まずは boost::shared_ptr のドキュメントにあるインタフェースを元にして 最低限のものを単純に書いてみた.(ということで例外安全とかスレッドセー フとか難しそうなことはひとまず無視)

template <typename T> class shared_ptr
{
    T* ptr_;
    long* count_;
    
public:
    typedef T element_type;
    
    shared_ptr() :ptr_(0), count_(0) {}
    ~shared_ptr()
    {
        decrement();
    }
    
    template <typename Y> explicit shared_ptr(Y* p)
        :ptr_(p), count_(new long(1))
    {
    }
    shared_ptr(const shared_ptr& r) :ptr_(r.ptr_), count_(r.count_)
    {
        increment();
    }

    shared_ptr& operator = (const shared_ptr& r)
    {
        decrement();
        count_ = r.count_;
        ptr_ = r.ptr_;
        increment();
        return *this;
    }
    
    T& operator * () const { return *ptr_;}
    T* operator -> () const { return ptr_; }

    long use_count() const { return count_ ? *count_ : 0; }
    T* get() const { return ptr_; }

    void swap(shared_ptr& r)
    {
        std::swap(ptr_, r.ptr_);
        std::swap(count_, r.count_);
    }
    void reset()
    {
        shared_ptr().swap(*this);
    }

private:
    void decrement()
    {
        if (count_) {
            if (--(*count_) == 0) {
                delete count_;
                delete ptr_;
            }
        }
    }

    void increment()
    {
        if (count_) {
            ++(*count_);
        }
    }
};

0 件のコメント:

コメントを投稿