OSDN Git Service

・textarrayformat.*をsrc/commonに移動した。
[simplecms/utakata.git] / src / common / scoped_ptr.h
diff --git a/src/common/scoped_ptr.h b/src/common/scoped_ptr.h
new file mode 100755 (executable)
index 0000000..dc3d31f
--- /dev/null
@@ -0,0 +1,55 @@
+// リファレンスカウンタを利用しない、渡されたポインタの
+// 解体責任を負うためだけのスマートポインタを提供します。
+//
+// ここで言う解体責任とは、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_ */