Date:
2008-02-06
Tags:
work,
cpp
C++のtemplateでBREW用にshared_ptrを書いてみた¶
追記: 修正版があります! http://www.freia.jp/taka/blog/594
とりあえずVC++ではビルドできるけど、実機で問題なく使えるかどうかは不明。ARMコンパイラがちゃんとビルドしてくれれば動くかもしれない。夜中に寝ながら書いたので動作保証ありません、と言ったら職場で採用が見送られました。そんなコードですが、誰か使ってみてうまくいったら教えてください。次のプロジェクトで使ってみます。
いや、冗談ですが、半分本気です。なんて言うか、このへん動作保証できるBREWアプリ開発者が日本に何人いるのか非常に怪しい、と思うくらいにBREW開発って罠が多い気がする。
コード中では operators.h をインクルードしてるけど、これはソフィアあたりから取得してください。operator new 系をBREWのMALLOCで実装してるやつです。
以下、コード。
#ifndef __BREW_SHARED_PTR_H__
#define __BREW_SHARED_PTR_H__
#include ".\operators.h"
class shared_counter {
private:
int count;
public:
shared_counter():count(1){}
~shared_counter(){}
int inc() {return ++count;}
int dec() {return --count;}
};
template<class T>
class shared_ptr {
private:
T* px;
shared_counter* pn;
public:
shared_ptr()
:px(0),pn(0)
{}
template<class T>
shared_ptr(T* p)
:px(p),pn(0)
{
pn = new shared_counter()
}
template<class T>
shared_ptr(shared_ptr<T> r)
:px(r.px),pn(r.pn)
{
pn->inc();
}
~shared_ptr()
{
if(pn && pn->dec()==0)
{
delete pn;
delete px;
}
}
template<class T>
shared_ptr& operator=(T* const p)
{
if(pn && pn->dec()==0)
{
delete pn;
delete px;
}
px = p;
pn = new shared_counter();
return *this;
}
template<class T>
shared_ptr& operator=(shared_ptr<T> const & r)
{
px = r.px;
pn = r.pn;
pn->inc();
return *this;
}
T& operator*() const
{
return *px;
}
T* operator->() const
{
return px;
}
operator T*() const
{
return px;
}
};
#endif // __BREW_SHARED_PTR_H__