--- /dev/null
+// リファレンスカウンタを利用しない、渡されたポインタの
+// 解体責任を負うためだけのスマートポインタを提供します。
+//
+// ここで言う解体責任とは、scoped_ptrが存在するスコープ
+// を離れた時点で、解体を行うことを保証するものです。
+// scoped_ptrはコピー不可能であるため、スコープが限定されており、
+// 初期化以外は行われないデータにおいて利用されるべきです。
+#ifndef _UTAKATA_SRC_COMMON_PROXY_PTR_H_
+#define _UTAKATA_SRC_COMMON_PROXY_PTR_H_
+
+#include "src/common/uncopyable.h"
+
+namespace utility {
+
+template<class T>
+class scoped_ptr : private Uncopyable {
+ // 利用するscopeが限定されたポインタ専用のスマートポインタです。
+ // smart_ptrと異なる点として、利用されるスコープが限定される
+ // ことで、コピーが不可能であるという点です。コピー不可能である
+ // ため、意図されないポインタのコピーを防ぐことができます。
+ public:
+
+ explicit scoped_ptr(const T* object = NULL) : obj_(object) {}
+ virtual ~scoped_ptr() {reset();}
+
+ T* operator->() const {return obj_;}
+ T& operator*() const {return *obj_;}
+ T* get() const {return obj_;}
+
+ T* release() {
+ T* const p = obj_;
+ obj_ = NULL;
+ return p;
+ }
+
+ // それまで保持していたポインタを、新しく渡されたポインタと
+ // 置換します。
+ // 置換の際、現在保持しているポインタとは別のポインタが渡された
+ // 場合、それまで保持されていた型が空では無い場合、deleteを行います。
+ // 引数が指定されない場合、NULLがデフォルト引数となります。
+ void reset(T* p = NULL) {
+ if (p != obj_) {
+ if (sizeof(T) > 0) {
+ delete obj_;
+ }
+ obj_ = p;
+ }
+ }
+ private:
+
+ T* obj_;
+};
+}; // end of namespace utility
+
+#endif /* _HOME_DERUI_DEVELOP_UTAKATA_SRC_COMMON_SCOPED_PTR_H_ */