-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathiter_adapter.hh
106 lines (93 loc) · 3.57 KB
/
iter_adapter.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#ifndef DOZERG_ITERATOR_ADAPTER_H_20081013
#define DOZERG_ITERATOR_ADAPTER_H_20081013
/*
提供迭代器的适配器
可以通过自定义的函数(仿函数)改变对迭代器的访问行为
const_iter_adapt 通过仿函数自定义访问const迭代器的行为(只读)
iter_adapt 通过仿函数自定义访问非const迭代器的行为(可读写)
const_iter_adapt_fun 通过函数自定义访问const迭代器的行为(只读)
iter_adapt_fun 通过函数自定义访问非const迭代器的行为(可读写)
使用示例:
template<class Iter>
void checkInt(Iter first, Iter last){ //对给定的序列进行操作
for(;first != last;++first)
cout<<*first<<endl;
}
struct A{
int v1;
string v2;
};
const int & ExtV1(const A & a){
return a.v1;
}
int main(){
vector<A> vecA;
//... //向vecA中加入了一些元素
//如果我们要调用checkInt()处理vecA中每个元素的v1成员,怎么办?
//只要定义了函数ExtV1(),我们就可以实现如下:
checkInt(const_iter_adapt_fun<int>(vecA.begin(), ExtV1),
const_iter_adapt_fun<int>(vecA.end(), ExtV1));
}
//由于v1在函数checkInt()里没有改变, 所以使用const_iter_adapt_fun
//否则应该使用iter_adapt_fun
//类型int必须提供给const_iter_adapt_fun和iter_adapt_fun,因为适配器需要知道返回什么类型给checkInt()函数
//ExtV1()的返回值必须是引用,const或非const都行,根据实际需要定义
//如果定义一个仿函数,完成和ExtV1一样的功能
//那么就可以使用const_iter_adapt和iter_adapt
//例如:
struct ExtV1Func{
typedef A argument_type;
typedef int result_type;
const result_type & operator ()(const argument_type & a) const{
return a.v1;
}
};
int main(){
vector<A> vecA;
//...
checkInt(const_iter_adapt(vecA.begin(), ExtV1Func()),
const_iter_adapt(vecA.end(), ExtV1Func()));
}
//result_type是仿函数必须提供的一个类型定义,表示返回给checkInt()函数的类型
//ExtV1Func::operator ()的返回值必须是引用,const或非const都行,根据实际需要定义
//*/
#include "impl/iter_adapter_impl.hh"
NS_SERVER_BEGIN
//const_iter_adapt
template<class Ext, class ConstIt>
inline NS_IMPL::CConstIterAdapter<ConstIt, Ext> const_iter_adapt(ConstIt it, Ext ext)
{
return NS_IMPL::CConstIterAdapter<ConstIt, Ext>(it, ext);
}
template<class Ext, class ConstIt>
inline NS_IMPL::CConstIterAdapter<ConstIt, Ext> const_iter_adapt(ConstIt it)
{
return NS_IMPL::CConstIterAdapter<ConstIt, Ext>(it, Ext());
}
//iter_adapt
template<class Ext, class It>
inline NS_IMPL::CIterAdapter<It, Ext> iter_adapt(It it, Ext ext)
{
return NS_IMPL::CIterAdapter<It, Ext>(it, ext);
}
template<class Ext, class It>
inline NS_IMPL::CIterAdapter<It, Ext> iter_adapt(It it)
{
return NS_IMPL::CIterAdapter<It, Ext>(it, Ext());
}
//const_iter_adapt_fun
template<class T, class ConstIt, class Func>
inline NS_IMPL::CConstIterAdapter<ConstIt, NS_IMPL::CIterAdapterFunctor<ConstIt, T, Func> > const_iter_adapt_fun(ConstIt it, Func func)
{
typedef NS_IMPL::CIterAdapterFunctor<ConstIt, T, Func> __Ext;
return NS_IMPL::CConstIterAdapter<ConstIt, __Ext>(it, __Ext(func));
}
//iter_adapt_fun
template<class T, class It, class Func>
inline NS_IMPL::CIterAdapter<It, NS_IMPL::CIterAdapterFunctor<It, T, Func> > iter_adapt_fun(It it, Func func)
{
typedef NS_IMPL::CIterAdapterFunctor<It, T, Func> __Ext;
return NS_IMPL::CIterAdapter<It, __Ext>(it, __Ext(func));
}
NS_SERVER_END
#endif