Line data Source code
1 : //
2 : // Author: Vladimir Migashko <migashko@gmail.com>, (C) 2012
3 : //
4 : // Copyright: See COPYING file that comes with this distribution
5 : //
6 :
7 : #include <vset/multiset.hpp>
8 : #include <fas/testing.hpp>
9 : #include <fas/type_list.hpp>
10 : #include <fas/typemanip.hpp>
11 : #include <set>
12 :
13 : #include <vset/comparators/compare.hpp>
14 : #include <vset/comparators/compare_member.hpp>
15 : #include <vset/comparators/compare_list.hpp>
16 : #include <vset/comparators/pointer_compare.hpp>
17 :
18 :
19 : struct data
20 : {
21 : int data1;
22 : int data2;
23 : int data3;
24 : };
25 :
26 : data create_data(int data1, int data2, int data3);
27 :
28 : struct cmp_data
29 : {
30 10 : bool operator()(const data& l, const data& r) const
31 : {
32 19 : return l.data1 < r.data1 ||
33 29 : ( ! ( r.data1 < l.data1 ) && l.data2 > r.data2 ) ||
34 23 : ( ! ( r.data1 < l.data1 ) && ! ( r.data2 > l.data2 ) && l.data3 < r.data3 );
35 : }
36 : };
37 :
38 : struct cmp_data1
39 : {
40 10 : bool operator()(const data& l, const data& r) const
41 : {
42 10 : if ( l.data1 < r.data1 )
43 1 : return true;
44 :
45 9 : if ( r.data1 < l.data1)
46 1 : return false;
47 :
48 8 : if ( l.data2 > r.data2 )
49 2 : return true;
50 :
51 6 : if ( r.data2 > l.data2 )
52 2 : return false;
53 :
54 4 : return l.data3 < r.data3;
55 : }
56 : };
57 :
58 : struct access_stub
59 : {
60 : template<typename T>
61 : const T& operator()(const T& t) const
62 : {
63 : return t;
64 : }
65 : };
66 :
67 83 : data create_data(int data1, int data2, int data3)
68 : {
69 : data d;
70 83 : d.data1 = data1;
71 83 : d.data2 = data2;
72 83 : d.data3 = data3;
73 83 : return d;
74 : }
75 :
76 :
77 : template<typename C>
78 4 : bool test(C c)
79 : {
80 4 : bool flag = true;
81 4 : flag &= !c( create_data(1,2,3), create_data(1,2,3)) && !c( create_data(1,2,3), create_data(1,2,3) );
82 4 : flag &= c( create_data(1,2,3), create_data(2,3,4)) && !c( create_data(2,3,4), create_data(1,2,3) );
83 4 : flag &= c( create_data(2,3,3), create_data(2,2,2)) && !c( create_data(2,2,2), create_data(2,3,3) );
84 4 : flag &= c( create_data(2,5,4), create_data(2,3,4)) && !c( create_data(2,3,4), create_data(2,5,4) );
85 4 : flag &= c( create_data(2,3,2), create_data(2,3,3)) && !c( create_data(2,3,3), create_data(2,3,2) );
86 4 : return flag;
87 : }
88 :
89 : typedef fas::type_list_n<
90 : vset::compare< fas::member<data, int, &data::data1>, std::less<int> >,
91 : vset::compare< fas::member<data, int, &data::data2>, std::greater<int> >,
92 : vset::compare< fas::member<data, int, &data::data3>, std::less<int> >
93 : >::type compare1_list;
94 :
95 : typedef fas::type_list_n<
96 : vset::compare_member< data, int, &data::data1>,
97 : vset::compare_member< data, int, &data::data2, std::greater<int> >,
98 : vset::compare_member< data, int, &data::data3, std::less<int> >
99 : >::type compare2_list;
100 :
101 :
102 : struct cmp_data2: vset::compare_list<compare1_list> {};
103 : struct cmp_data3: vset::compare_list<compare2_list> {};
104 :
105 3 : UNIT(comparator_basic, "")
106 : {
107 : using namespace fas::testing;
108 : using namespace vset;
109 :
110 1 : t << is_true<expect>( test(cmp_data() ) ) << FAS_TESTING_FILE_LINE;
111 1 : t << is_true<expect>( test(cmp_data1() ) ) << FAS_TESTING_FILE_LINE;
112 1 : t << is_true<expect>( test(cmp_data2() ) ) << FAS_TESTING_FILE_LINE;
113 1 : t << is_true<expect>( test(cmp_data3() ) ) << FAS_TESTING_FILE_LINE;
114 :
115 1 : t << nothing;
116 1 : }
117 :
118 3 : UNIT(comparator_set, "")
119 : {
120 : using namespace fas::testing;
121 : using namespace vset;
122 1 : std::set<data, cmp_data> set1;
123 1 : set1.insert( create_data(1,2,3) );
124 2 : std::set<data, cmp_data2> set2;
125 1 : set2.insert( create_data(1,2,3) );
126 2 : std::set<data*, vset::pointer_compare<cmp_data2> > set3;
127 1 : set3.insert(new data( create_data(1,2,3) ) );
128 2 : std::set<int*, vset::pointer_compare<std::less<int> > > set4;
129 1 : int d[]={1,2,3};
130 1 : set4.insert(d);
131 1 : set4.insert(d+1);
132 1 : set4.insert(d+2);
133 2 : t << nothing;
134 1 : }
135 :
136 1 : BEGIN_SUITE(comparator_suite, "")
137 : ADD_UNIT(comparator_basic)
138 : ADD_UNIT(comparator_set)
139 7 : END_SUITE(comparator_suite)
|