TNB Library
TnbComparator.h
[詳解]
1#pragma once
13#include "TnbStr.h"
14#include "TnbComparable.h"
15
16
17
18//TNB Library
19namespace TNB
20{
21
22
23
44template<typename TYP>
46{
48 virtual ~IComparatorT(void) {}
49
58 virtual INT_PTR CompareTo(const TYP& t1, const TYP& t2) const = 0;
59
67 virtual bool IsEqualTo(const TYP& t1, const TYP& t2) const
68 {
69 return CompareTo(t1, t2) == 0;
70 }
71
80 static IComparatorT& GetDefault(void);
81};
82
83
84
85#ifndef _TnbDOXYGEN //Document作成用シンボル
86
87
88
92template<typename TYP>
93class CAutoComparatorT
94{
95 // IComparableTインターフェース実装型用
96 template<typename T>
97 struct TMyCompCompareT : IComparatorT<TYP>
98 {
99 INT_PTR CompareTo(const TYP& t1, const TYP& t2) const
100 {
101 //ポイント;C型キャストを用いることで型に応じたキャストが行われる。
102 return ((const IComparableT<T>*)&t1)->Compare(t2);
103 }
104 bool IsEqualTo(const TYP& t1, const TYP& t2) const
105 {
106 //ポイント;C型キャストを用いることで型に応じたキャストが行われる。
107 return ((const IComparableT<T>*)&t1)->IsEqual(t2);
108 }
109 };
110
111 // その他の型用
112 struct TMyCompElse : IComparatorT<TYP>
113 {
114 // SubSub ポインタ比較
115 template<typename T>
116 INT_PTR m_SubSub(const T& t, LPCVOID t1, LPCVOID t2) const
117 {
118 return static_cast<const BYTE *>(t1) - static_cast<const BYTE *>(t2);
119 }
120
121 // SubSub 比較できない
122 template<typename T>
123 INT_PTR m_SubSub(const T& t, ...) const
124 {
125 #ifndef _WIN32_WCE
126 ASSERT1(
127 false,
128 "オートComparator内",
129 "比較機能のない[%s]型を IComparator指定無しで比較しました。結果は常に EVEN になります。",
130 typeid(T).name()
131 );
132 #else
133 ASSERT0(
134 false,
135 "オートComparator内",
136 "比較機能のない型を IComparator指定無しで比較しました。結果は常に EVEN になります。"
137 );
138 #endif // _WIN32_WCE
139 return 0;
140 }
141
142 // <Sub> その他の型。 SubSubに依頼
143 template<typename T>
144 INT_PTR m_Sub(const T& t1, const T& t2) const
145 {
146 return m_SubSub(t1, t1, t2);
147 }
148
149 // <Sub> CAscii型だ
150 template<> INT_PTR m_Sub(const CAscii& i1, const CAscii& i2) const
151 {
152 return i1.Compare(i2);
153 }
154
155 // <Sub> CUnicode型だ
156 template<> INT_PTR m_Sub(const CUnicode& i1, const CUnicode& i2) const
157 {
158 return i1.Compare(i2);
159 }
160
161 // <Sub> 基本型だ
162 #define _COLLECTCOMP(TY) \
163 template<> INT_PTR m_Sub(const TY& i1, const TY& i2) const { \
164 if ( i1 == i2 ){ return 0; } \
165 return (i1 > i2) ? 1 : -1; \
166 }
167 _COLLECTCOMP(bool)
168 _COLLECTCOMP(BYTE)
169 _COLLECTCOMP(char)
170 _COLLECTCOMP(WORD)
171 _COLLECTCOMP(short)
172 _COLLECTCOMP(DWORD)
173 _COLLECTCOMP(long)
174 _COLLECTCOMP(UINT)
175 _COLLECTCOMP(int)
176 _COLLECTCOMP(ULONGLONG)
177 _COLLECTCOMP(LONGLONG)
178 _COLLECTCOMP(long double)
179 _COLLECTCOMP(double)
180 _COLLECTCOMP(float)
181 #ifdef __AFX_H__
182 _COLLECTCOMP(CString)
183 #endif
184 #undef _COLLECTCOMP
185
186 // 比較関数
187 INT_PTR CompareTo(const TYP& t1, const TYP& t2) const
188 {
189 return m_Sub(t1, t2);
190 }
191 };
192
193public:
194
200 template<typename T>
201 static IComparatorT<TYP>& MakeAutoComp(const IComparableT<T>* P)
202 {
203 static TMyCompCompareT<T> s_comp;
204 return s_comp;
205 }
206
212 static IComparatorT<TYP>& MakeAutoComp(LPCVOID P)
213 {
214 static TMyCompElse s_comp;
215 return s_comp;
216 }
217};
218
219#endif
220
221
222
223template<typename TYP>
225{
226 return CAutoComparatorT<TYP>::MakeAutoComp(static_cast<TYP*>(NULL));
227};
228
229
230
231};
比較機能関係のヘッダ
文字列管理関係のヘッダ
int Compare(const TYP *lpszSubject) const
[確認] 文字列比較
Definition: TnbStr.h:658
TNB Library
Definition: TnbDoxyTitle.txt:2
比較機能インターフェース.
Definition: TnbComparable.h:54
コンパレータインターフェース.
Definition: TnbComparator.h:46
virtual INT_PTR CompareTo(const TYP &t1, const TYP &t2) const =0
[確認] 比較
static IComparatorT & GetDefault(void)
[作成] 汎用コンパレータ取得.
virtual ~IComparatorT(void)
デストラクタ
Definition: TnbComparator.h:48
virtual bool IsEqualTo(const TYP &t1, const TYP &t2) const
[確認] 比較
Definition: TnbComparator.h:67