1 /*=============================================================================
2     Copyright (c) 2005-2007 Dan Marsden
3     Copyright (c) 2005-2007 Joel de Guzman
4 
5     Distributed under the Boost Software License, Version 1.0. (See accompanying
6     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 ==============================================================================*/
8 
9 #include <functional>
10 #include <boost/phoenix/core.hpp>
11 #include <boost/phoenix/stl/algorithm/transformation.hpp>
12 #include <boost/detail/lightweight_test.hpp>
13 
14 #include <list>
15 
16 namespace
17 {
18     struct even
19     {
operator ()__anon2a6e008d0111::even20         bool operator()(const int i) const
21         {
22             return i % 2 == 0;
23         }
24     };
25 
rotate_test()26     void rotate_test()
27     {
28         using boost::phoenix::rotate;
29         using boost::phoenix::arg_names::arg1;
30         int array[] = {1,2,3};
31         rotate(arg1, array + 1)(array);
32         std::cout << array[0] << array[1] << array[2] << std::endl;
33         BOOST_TEST(array[0] == 2);
34         BOOST_TEST(array[1] == 3);
35         BOOST_TEST(array[2] == 1);
36 
37         return;
38     }
39 
rotate_copy_test()40     void rotate_copy_test()
41     {
42         using boost::phoenix::rotate_copy;
43         using boost::phoenix::arg_names::arg1;
44         using boost::phoenix::arg_names::arg2;
45         int array[] = {1,2,3};
46         int array2[3];
47         rotate_copy(arg1, array + 1, arg2)(array, array2);
48         BOOST_TEST(array2[0] == 2);
49         BOOST_TEST(array2[1] == 3);
50         BOOST_TEST(array2[2] == 1);
51 
52         return;
53     }
54 
random_shuffle_test()55     void random_shuffle_test()
56     {
57 #ifndef BOOST_NO_CXX98_RANDOM_SHUFFLE
58         using boost::phoenix::random_shuffle;
59         using boost::phoenix::arg_names::arg1;
60         int array[] = {1,2,3};
61         random_shuffle(arg1)(array);
62         const int first = array[0];
63         BOOST_TEST(first == 1 || first == 2 || first == 3);
64         const int second = array[1];
65         BOOST_TEST(second == 1 || second == 2 || second == 3);
66         BOOST_TEST(first != second);
67         const int third = array[2];
68         BOOST_TEST(third == 1 || third == 2 || third == 3);
69         BOOST_TEST(first != third && second != third);
70         return;
71 #endif
72     }
73 
partition_test()74     void partition_test()
75     {
76         using boost::phoenix::partition;
77         using boost::phoenix::arg_names::arg1;
78         int array[] = {1,2,3};
79         int* const end = partition(arg1, even())(array);
80         BOOST_TEST(end == array + 1);
81         BOOST_TEST(array[0] % 2 == 0);
82         BOOST_TEST(array[1] % 2 != 0);
83         BOOST_TEST(array[2] % 2 != 0);
84         return;
85     }
86 
stable_partition_test()87     void stable_partition_test()
88     {
89         using boost::phoenix::stable_partition;
90         using boost::phoenix::arg_names::arg1;
91         int array[] = {1,2,3};
92         int* const end = stable_partition(arg1, even())(array);
93         BOOST_TEST(end == array + 1);
94         BOOST_TEST(array[0] == 2);
95         BOOST_TEST(array[1] == 1);
96         BOOST_TEST(array[2] == 3);
97         return;
98     }
99 
sort_test()100     void sort_test()
101     {
102         using boost::phoenix::sort;
103         using boost::phoenix::arg_names::arg1;
104         int array[] = {3,1,2};
105         std::list<int> test_list(array, array + 3);
106         sort(arg1)(array);
107         BOOST_TEST(array[0] == 1);
108         BOOST_TEST(array[1] == 2);
109         BOOST_TEST(array[2] == 3);
110 
111         sort(arg1)(test_list);
112         std::list<int>::const_iterator it(test_list.begin());
113         BOOST_TEST(*it++ == 1);
114         BOOST_TEST(*it++ == 2);
115         BOOST_TEST(*it++ == 3);
116 
117         boost::phoenix::sort(arg1, std::greater<int>())(array);
118         BOOST_TEST(array[0] == 3);
119         BOOST_TEST(array[1] == 2);
120         BOOST_TEST(array[2] == 1);
121 
122         boost::phoenix::sort(arg1, std::greater<int>())(test_list);
123         std::list<int>::const_iterator jt(test_list.begin());
124         BOOST_TEST(*jt++ == 3);
125         BOOST_TEST(*jt++ == 2);
126         BOOST_TEST(*jt++ == 1);
127 
128         return;
129     }
130 
stable_sort_test()131     void stable_sort_test()
132     {
133         using boost::phoenix::stable_sort;
134         using boost::phoenix::arg_names::arg1;
135         int array[] = {3,1,2};
136         stable_sort(arg1)(array);
137         BOOST_TEST(array[0] == 1);
138         BOOST_TEST(array[1] == 2);
139         BOOST_TEST(array[2] == 3);
140 
141         boost::phoenix::stable_sort(arg1, std::greater<int>())(array);
142         BOOST_TEST(array[0] == 3);
143         BOOST_TEST(array[1] == 2);
144         BOOST_TEST(array[2] == 1);
145 
146         return;
147     }
148 
partial_sort_test()149     void partial_sort_test()
150     {
151         using boost::phoenix::partial_sort;
152         using boost::phoenix::arg_names::arg1;
153         int array[] = {2,4,1,3};
154         partial_sort(arg1, array + 2)(array);
155         BOOST_TEST(array[0] == 1);
156         BOOST_TEST(array[1] == 2);
157 
158         boost::phoenix::partial_sort(arg1, array + 2, std::greater<int>())(array);
159         BOOST_TEST(array[0] == 4);
160         BOOST_TEST(array[1] == 3);
161         return;
162     }
163 
partial_sort_copy_test()164     void partial_sort_copy_test()
165     {
166         using boost::phoenix::partial_sort_copy;
167         using boost::phoenix::arg_names::arg1;
168         using boost::phoenix::arg_names::arg2;
169         int array[] = {2,4,1,3};
170         int array2[2];
171         partial_sort_copy(arg1, arg2)(array, array2);
172         BOOST_TEST(array2[0] == 1);
173         BOOST_TEST(array2[1] == 2);
174 
175         boost::phoenix::partial_sort_copy(arg1, arg2, std::greater<int>())(array, array2);
176         BOOST_TEST(array2[0] == 4);
177         BOOST_TEST(array2[1] == 3);
178 
179         return;
180     }
181 }
182 
main()183 int main()
184 {
185     rotate_test();
186     rotate_copy_test();
187     random_shuffle_test();
188     partition_test();
189     stable_partition_test();
190     sort_test();
191     stable_sort_test();
192     partial_sort_test();
193     partial_sort_copy_test();
194     return boost::report_errors();
195 }
196