1 |
/* |
/* |
2 |
* $Id: Pointer.h,v 1.4 2007-08-18 08:52:18 maya Exp $ |
* $Id: Pointer.h,v 1.4 2007-08-18 08:52:18 maya Exp $ |
3 |
*/ |
*/ |
4 |
|
|
5 |
#if _MSC_VER >= 1000 |
#if _MSC_VER >= 1000 |
6 |
#pragma once |
#pragma once |
7 |
#endif // _MSC_VER >= 1000 |
#endif // _MSC_VER >= 1000 |
8 |
|
|
9 |
#ifndef _YCL_POINTER_H_ |
#ifndef _YCL_POINTER_H_ |
10 |
#define _YCL_POINTER_H_ |
#define _YCL_POINTER_H_ |
11 |
|
|
12 |
#include <YCL/Array.h> |
#include <YCL/Array.h> |
13 |
|
|
14 |
namespace yebisuya { |
namespace yebisuya { |
15 |
|
|
16 |
// ポインタをラップするためのクラス。 |
// ポインタをラップするためのクラス。 |
17 |
template<class TYPE, class REFCTRL = Object > |
template<class TYPE, class REFCTRL = Object > |
18 |
class Pointer { |
class Pointer { |
19 |
private: |
private: |
20 |
// 格納するポインタ |
// 格納するポインタ |
21 |
TYPE* value; |
TYPE* value; |
22 |
protected: |
protected: |
23 |
// ポインタを置き換える |
// ポインタを置き換える |
24 |
void set(TYPE* ptr) { |
void set(TYPE* ptr) { |
25 |
value = (TYPE*) REFCTRL::set(value, ptr); |
value = (TYPE*) REFCTRL::set(value, ptr); |
26 |
} |
} |
27 |
public: |
public: |
28 |
// デフォルトコンストラクタ |
// デフォルトコンストラクタ |
29 |
Pointer():value(NULL) { |
Pointer():value(NULL) { |
30 |
} |
} |
31 |
// 初期値付きコンストラクタ |
// 初期値付きコンストラクタ |
32 |
Pointer(TYPE* ptr):value(NULL) { |
Pointer(TYPE* ptr):value(NULL) { |
33 |
set(ptr); |
set(ptr); |
34 |
} |
} |
35 |
// コピーコンストラクタ |
// コピーコンストラクタ |
36 |
Pointer(const Pointer& ptr):value(NULL) { |
Pointer(const Pointer& ptr):value(NULL) { |
37 |
set(ptr.value); |
set(ptr.value); |
38 |
} |
} |
39 |
// デストラクタ |
// デストラクタ |
40 |
~Pointer() { |
~Pointer() { |
41 |
set(NULL); |
set(NULL); |
42 |
} |
} |
43 |
// 代入演算子 |
// 代入演算子 |
44 |
Pointer& operator=(TYPE* ptr) { |
Pointer& operator=(TYPE* ptr) { |
45 |
set(ptr); |
set(ptr); |
46 |
return *this; |
return *this; |
47 |
} |
} |
48 |
// コピー代入演算子 |
// コピー代入演算子 |
49 |
Pointer& operator=(const Pointer& ptr) { |
Pointer& operator=(const Pointer& ptr) { |
50 |
set(ptr.value); |
set(ptr.value); |
51 |
return *this; |
return *this; |
52 |
} |
} |
53 |
// 間接演算子 |
// 間接演算子 |
54 |
TYPE& operator*()const { |
TYPE& operator*()const { |
55 |
return *value; |
return *value; |
56 |
} |
} |
57 |
// メンバ選択演算子 |
// メンバ選択演算子 |
58 |
TYPE* operator->()const { |
TYPE* operator->()const { |
59 |
return value; |
return value; |
60 |
} |
} |
61 |
// キャスト演算子 |
// キャスト演算子 |
62 |
operator TYPE*()const { |
operator TYPE*()const { |
63 |
return value; |
return value; |
64 |
} |
} |
65 |
}; |
}; |
66 |
|
|
67 |
// PointerのArray<TYPE>型への特殊化 |
// PointerのArray<TYPE>型への特殊化 |
68 |
// 配列要素演算子[]を提供する |
// 配列要素演算子[]を提供する |
69 |
template<class TYPE> |
template<class TYPE> |
70 |
class PointerArray : public Pointer< Array<TYPE> > { |
class PointerArray : public Pointer< Array<TYPE> > { |
71 |
public: |
public: |
72 |
// デフォルトコンストラクタ |
// デフォルトコンストラクタ |
73 |
PointerArray() { |
PointerArray() { |
74 |
} |
} |
75 |
// 初期値付きコンストラクタ |
// 初期値付きコンストラクタ |
76 |
PointerArray(Array<TYPE>* ptr):Pointer< Array<TYPE> >(ptr) { |
PointerArray(Array<TYPE>* ptr):Pointer< Array<TYPE> >(ptr) { |
77 |
} |
} |
78 |
// コピーコンストラクタ |
// コピーコンストラクタ |
79 |
PointerArray(const PointerArray& ptr):Pointer< Array<TYPE> >(ptr) { |
PointerArray(const PointerArray& ptr):Pointer< Array<TYPE> >(ptr) { |
80 |
} |
} |
81 |
// 代入演算子 |
// 代入演算子 |
82 |
PointerArray& operator=(Array<TYPE>* ptr) { |
PointerArray& operator=(Array<TYPE>* ptr) { |
83 |
set(ptr); |
set(ptr); |
84 |
return *this; |
return *this; |
85 |
} |
} |
86 |
// 配列要素演算子 |
// 配列要素演算子 |
87 |
TYPE& operator[](int index) { |
TYPE& operator[](int index) { |
88 |
Array<TYPE>* ptr = *this; |
Array<TYPE>* ptr = *this; |
89 |
return (**this)[index]; |
return (**this)[index]; |
90 |
} |
} |
91 |
TYPE operator[](int index)const { |
TYPE operator[](int index)const { |
92 |
Array<TYPE>* ptr = *this; |
Array<TYPE>* ptr = *this; |
93 |
return (**this)[index]; |
return (**this)[index]; |
94 |
} |
} |
95 |
}; |
}; |
96 |
|
|
97 |
} |
} |
98 |
|
|
99 |
#endif//_YCL_POINTER_H_ |
#endif//_YCL_POINTER_H_ |