OSDN Git Service

utakataの標準となる例外クラス及びマクロを定義した。
[simplecms/utakata.git] / src / data_space.h
index 9114d84..92dd07b 100755 (executable)
 // DataSpace同士の比較においては、utakata::type名前空間において、
 // 内部の利便性のためにオペレータオーバロードが実装されています。
 // DataSpace自体にはオペレータオーバロードは実装されません。
-#ifndef _DEVELOP_UTAKATA_SRC_DATA_SPACE_H_
-#define _DEVELOP_UTAKATA_SRC_DATA_SPACE_H_
-
+#ifndef _UTAKATA_SRC_DATA_SPACE_H_
+#define _UTAKATA_SRC_DATA_SPACE_H_
 
 #include <algorithm>
 #include "src/common/smart_ptr.h"
+#include "src/common/scoped_ptr.h"
 
 namespace utakata {
 
 namespace type {
-class TypeDescripter;
+class Type;
 };
 
+namespace interpreter {
+class IObject;
+}
+
 namespace data {
 
 class DataSpace {
@@ -31,32 +35,48 @@ class DataSpace {
   // オペレータオーバロードが実装されている。
  public:
   DataSpace(const DataSpace& space);
-  explicit DataSpace(const smart_ptr<type::TypeDescripter>& data);
+  DataSpace(const type::Type& type,
+            const utility::smart_ptr<interpreter::IObject>& object);
   virtual ~DataSpace() {}
 
   // DataSpaceが、渡されたspaceと同じ領域を指すように変更します。
-  DataSpace& operator=(const DataSpace& space);
+  DataSpace& operator=(const DataSpace& space) {
+    DataSpace tmp(space);
+    swap(tmp);
+    return *this;
+  }
+
+  // 内部で保持している型オブジェクトを返します。
+  const type::Type& type() {return *type_;}
 
-  const type::TypeDescripter& type_descripter() {return *type_descripter_;}
+  // 内部で保持されているオブジェクトの実体へのポインタを返します。
+  interpreter::IObject* object() {return object_.get();}
 
   // 同一の領域を保持している場合、trueを返します。
-  bool Equal(const DataSpace& space);
+  bool Equal(const DataSpace& space) {return object_ == space.object_;}
 
  private:
 
   // データ領域を交換する。
-  void swap(DataSpace& space);
+  void Swap(DataSpace& space);
 
-  // データの実体を保持するTypeDescripter
-  smart_ptr<type::TypeDescripter> type_descripter_;
+  // 保持している型に対する型オブジェクトを保持します。
+  utility::scoped_ptr<type::Type> type_;
+
+  // データ領域に格納されているオブジェクトへのポインタです。
+  utility::smart_ptr<interpreter::IObject> object_;
 };
 
 // DataSpace同士が同一領域を指している場合trueを返します。
-bool operator==(const DataSpace& space);
+bool operator==(const DataSpace& lh, const DataSpace& rh) {
+  return lh.Equal(rh);
+}
 
 // DataSpace同士が別々の領域を指している場合trueを返します。
-bool operator!=(const DataSpace& space);
-};
-};
+bool operator!=(const DataSpace& lh, const DataSpace& rh) {
+  return !(lh == rh);
+}
+}
+}
 
-#endif /* __HOME_DERUI_DEVELOP_UTAKATA_SRC_DATA_SPACE_H_ */
+#endif /* _UTAKATA_SRC_DATA_SPACE_H_ */