1/* Boost.MultiIndex test for key extractors.
2 *
3 * Copyright 2003-2022 Joaquin M Lopez Munoz.
4 * Distributed under the Boost Software License, Version 1.0.
5 * (See accompanying file LICENSE_1_0.txt or copy at
6 * http://www.boost.org/LICENSE_1_0.txt)
7 *
8 * See http://www.boost.org/libs/multi_index for library home page.
9 */
10
11#include "test_key_extractors.hpp"
12
13#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
14#include <boost/core/ref.hpp>
15#include <boost/detail/lightweight_test.hpp>
16#include "pre_multi_index.hpp"
17#include <boost/multi_index/key_extractors.hpp>
18#include <boost/scoped_ptr.hpp>
19#include <list>
20
21using namespace boost::multi_index;
22using namespace boost::tuples;
23
24struct test_class
25{
26 int int_member;
27 const int int_cmember;
28
29 bool bool_mem_fun_const()const{return true;}
30 bool bool_mem_fun(){return false;}
31 bool bool_mem_fun_volatile()volatile{return false;}
32 bool bool_mem_fun_cv()const volatile{return true;}
33
34#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
35
36 bool bool_mem_fun_cref()const&{return true;}
37 bool bool_mem_fun_ref()&{return false;}
38 bool bool_mem_fun_vref()volatile&{return false;}
39 bool bool_mem_fun_cvref()const volatile&{return true;}
40
41#endif
42
43 static bool bool_global_fun(test_class){return true;}
44 static bool bool_global_fun_const_ref(const test_class&){return false;}
45 static bool bool_global_fun_ref(test_class&){return true;}
46
47 test_class(int i=0):int_member(i),int_cmember(i){}
48 test_class(int i,int j):int_member(i),int_cmember(j){}
49 test_class(const test_class& x):
50 int_member(x.int_member),int_cmember(x.int_cmember){}
51
52 test_class& operator=(const test_class& x)
53 {
54 int_member=x.int_member;
55 return *this;
56 }
57
58 bool operator<(const test_class& x)const
59 {
60 if(int_member<x.int_member)return true;
61 if(x.int_member<int_member)return false;
62 return int_cmember<x.int_cmember;
63 }
64
65 bool operator==(const test_class& x)const
66 {
67 return int_member==x.int_member&&int_cmember==x.int_cmember;
68 }
69};
70
71struct test_derived_class:test_class
72{
73 test_derived_class(int i=0):test_class(i){}
74 test_derived_class(int i,int j):test_class(i,j){}
75};
76
77typedef identity<test_class> idn;
78typedef identity<const test_class> cidn;
79typedef BOOST_MULTI_INDEX_MEMBER(test_class,int,int_member) key_m;
80typedef BOOST_MULTI_INDEX_MEMBER(test_class,const int,int_member) ckey_m;
81typedef BOOST_MULTI_INDEX_MEMBER(test_class,const int,int_cmember) key_cm;
82typedef BOOST_MULTI_INDEX_MEM_FUN(test_class,bool,bool_mem_fun) key_mf;
83typedef BOOST_MULTI_INDEX_CONST_MEM_FUN(
84 test_class,bool,bool_mem_fun_const) key_cmf;
85typedef volatile_mem_fun<
86 test_class,bool,&test_class::bool_mem_fun_volatile> key_vmf;
87typedef cv_mem_fun<test_class,bool,&test_class::bool_mem_fun_cv> key_cvmf;
88
89#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
90
91typedef cref_mem_fun<
92 test_class,bool,&test_class::bool_mem_fun_cref> key_crmf;
93typedef ref_mem_fun<test_class,bool,&test_class::bool_mem_fun_ref> key_rmf;
94typedef vref_mem_fun<
95 test_class,bool,&test_class::bool_mem_fun_vref> key_vrmf;
96typedef cvref_mem_fun<
97 test_class,bool,&test_class::bool_mem_fun_cvref> key_cvrmf;
98
99#endif
100
101typedef global_fun<test_class,bool,&test_class::bool_global_fun> key_gf;
102typedef global_fun<
103 const test_class&,bool,
104 &test_class::bool_global_fun_const_ref
105 > key_gcrf;
106typedef global_fun<
107 test_class&,bool,
108 &test_class::bool_global_fun_ref
109 > key_grf;
110typedef composite_key<
111 test_class,
112 idn,
113 key_m,
114 key_cm,
115 key_cmf
116 > compkey;
117typedef composite_key<
118 test_class,
119 cidn,
120 ckey_m
121 > ccompkey;
122typedef composite_key<
123 boost::reference_wrapper<test_class>,
124 key_mf
125 > ccompw_key;
126
127#if !defined(BOOST_NO_SFINAE)
128/* testcases for problems with non-copyable classes reported at
129 * http://lists.boost.org/Archives/boost/2006/04/103065.php
130 */
131
132struct test_nc_class
133{
134 int int_member;
135 const int int_cmember;
136
137 bool bool_mem_fun_const()const{return true;}
138 bool bool_mem_fun(){return false;}
139
140 static bool bool_global_fun_const_ref(const test_nc_class&){return false;}
141 static bool bool_global_fun_ref(test_nc_class&){return true;}
142
143 test_nc_class(int i=0):int_member(i),int_cmember(i){}
144 test_nc_class(int i,int j):int_member(i),int_cmember(j){}
145
146 bool operator==(const test_nc_class& x)const
147 {
148 return int_member==x.int_member&&int_cmember==x.int_cmember;
149 }
150
151private:
152 test_nc_class(const test_nc_class&);
153 test_nc_class& operator=(const test_nc_class&);
154};
155
156struct test_nc_derived_class:test_nc_class
157{
158 test_nc_derived_class(int i=0):test_nc_class(i){}
159 test_nc_derived_class(int i,int j):test_nc_class(i,j){}
160};
161
162typedef identity<test_nc_class> nc_idn;
163typedef identity<const test_nc_class> nc_cidn;
164typedef BOOST_MULTI_INDEX_MEMBER(test_nc_class,int,int_member) nc_key_m;
165typedef BOOST_MULTI_INDEX_MEMBER(
166 test_nc_class,const int,int_member) nc_ckey_m;
167typedef BOOST_MULTI_INDEX_CONST_MEM_FUN(
168 test_nc_class,bool,bool_mem_fun_const) nc_key_cmf;
169typedef BOOST_MULTI_INDEX_MEM_FUN(
170 test_nc_class,bool,bool_mem_fun) nc_key_mf;
171typedef global_fun<
172 const test_nc_class&,bool,
173 &test_nc_class::bool_global_fun_const_ref
174 > nc_key_gcrf;
175typedef global_fun<
176 test_nc_class&,bool,
177 &test_nc_class::bool_global_fun_ref
178 > nc_key_grf;
179typedef composite_key<
180 test_nc_class,
181 nc_idn,
182 nc_key_m,
183 nc_ckey_m,
184 nc_key_cmf
185 > nc_compkey;
186#endif
187
188void test_key_extractors()
189{
190 idn id;
191 cidn cid;
192 key_m k_m;
193 ckey_m ck_m;
194 key_cm k_cm;
195 key_cmf k_cmf;
196 key_mf k_mf;
197 key_vmf k_vmf;
198 key_cvmf k_cvmf;
199#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
200 key_crmf k_crmf;
201 key_rmf k_rmf;
202 key_vrmf k_vrmf;
203 key_cvrmf k_cvrmf;
204#endif
205 key_gf k_gf;
206 key_gcrf k_gcrf;
207 key_grf k_grf;
208 compkey cmpk;
209 ccompkey ccmpk;
210 ccompw_key ccmpk_w;
211
212 test_derived_class td(-1,0);
213 const test_derived_class& ctdr=td;
214
215 test_class& tr=td;
216 const test_class& ctr=tr;
217
218 test_derived_class* tdp=&td;
219 const test_derived_class* ctdp=&ctdr;
220
221 test_class* tp=&tr;
222 const test_class* ctp=&tr;
223
224 test_class** tpp=&tp;
225 const test_class** ctpp=&ctp;
226
227 boost::scoped_ptr<test_class*> tap(new test_class*(tp));
228 boost::scoped_ptr<const test_class*> ctap(new const test_class*(ctp));
229
230 boost::reference_wrapper<test_class> tw(tr);
231 boost::reference_wrapper<const test_class> ctw(tr);
232
233 id(tr).int_member=0;
234 BOOST_TEST(id(tr).int_member==0);
235 BOOST_TEST(cid(tr).int_member==0);
236 BOOST_TEST(k_m(tr)==0);
237 BOOST_TEST(ck_m(tr)==0);
238 BOOST_TEST(cmpk(tr)==make_tuple(test_class(0,0),0,0,true));
239 BOOST_TEST(ccmpk(tr)==make_tuple(test_class(0,0),0));
240 BOOST_TEST(id(ctr).int_member==0);
241 BOOST_TEST(cid(ctr).int_member==0);
242 BOOST_TEST(k_m(ctr)==0);
243 BOOST_TEST(ck_m(ctr)==0);
244 BOOST_TEST(cmpk(ctr)==make_tuple(test_class(0,0),0,0,true));
245 BOOST_TEST(ccmpk(ctr)==make_tuple(test_class(0,0),0));
246
247#if !defined(BOOST_NO_SFINAE)
248 BOOST_TEST(id(td).int_member==0);
249 BOOST_TEST(cid(td).int_member==0);
250 BOOST_TEST(k_m(td)==0);
251 BOOST_TEST(ck_m(td)==0);
252 BOOST_TEST(cmpk(td)==make_tuple(test_class(0,0),0,0,true));
253 BOOST_TEST(ccmpk(td)==make_tuple(test_class(0,0),0));
254 BOOST_TEST(id(ctdr).int_member==0);
255 BOOST_TEST(cid(ctdr).int_member==0);
256 BOOST_TEST(k_m(ctdr)==0);
257 BOOST_TEST(ck_m(ctdr)==0);
258 BOOST_TEST(cmpk(ctdr)==make_tuple(test_class(0,0),0,0,true));
259 BOOST_TEST(ccmpk(ctdr)==make_tuple(test_class(0,0),0));
260#endif
261
262 k_m(tr)=1;
263 BOOST_TEST(id(tp).int_member==1);
264 BOOST_TEST(cid(tp).int_member==1);
265 BOOST_TEST(k_m(tp)==1);
266 BOOST_TEST(ck_m(tp)==1);
267 BOOST_TEST(cmpk(tp)==make_tuple(test_class(1,0),1,0,true));
268 BOOST_TEST(ccmpk(tp)==make_tuple(test_class(1,0),1));
269 BOOST_TEST(cid(ctp).int_member==1);
270 BOOST_TEST(ck_m(ctp)==1);
271 BOOST_TEST(cmpk(ctp)==make_tuple(test_class(1,0),1,0,true));
272 BOOST_TEST(ccmpk(ctp)==make_tuple(test_class(1,0),1));
273
274#if !defined(BOOST_NO_SFINAE)
275 BOOST_TEST(id(tdp).int_member==1);
276 BOOST_TEST(cid(tdp).int_member==1);
277 BOOST_TEST(k_m(tdp)==1);
278 BOOST_TEST(ck_m(tdp)==1);
279 BOOST_TEST(cmpk(tdp)==make_tuple(test_class(1,0),1,0,true));
280 BOOST_TEST(ccmpk(tdp)==make_tuple(test_class(1,0),1));
281 BOOST_TEST(cid(ctdp).int_member==1);
282 BOOST_TEST(ck_m(ctdp)==1);
283 BOOST_TEST(cmpk(ctdp)==make_tuple(test_class(1,0),1,0,true));
284 BOOST_TEST(ccmpk(ctdp)==make_tuple(test_class(1,0),1));
285#endif
286
287 k_m(tp)=2;
288 BOOST_TEST(id(tpp).int_member==2);
289 BOOST_TEST(cid(tpp).int_member==2);
290 BOOST_TEST(k_m(tpp)==2);
291 BOOST_TEST(ck_m(tpp)==2);
292 BOOST_TEST(cmpk(tpp)==make_tuple(test_class(2,0),2,0,true));
293 BOOST_TEST(ccmpk(tpp)==make_tuple(test_class(2,0),2));
294 BOOST_TEST(cid(ctpp).int_member==2);
295 BOOST_TEST(ck_m(ctpp)==2);
296 BOOST_TEST(cmpk(ctpp)==make_tuple(test_class(2,0),2,0,true));
297 BOOST_TEST(ccmpk(ctpp)==make_tuple(test_class(2,0),2));
298
299 k_m(tpp)=3;
300 BOOST_TEST(id(tap).int_member==3);
301 BOOST_TEST(cid(tap).int_member==3);
302 BOOST_TEST(k_m(tap)==3);
303 BOOST_TEST(ck_m(tap)==3);
304 BOOST_TEST(cmpk(tap)==make_tuple(test_class(3,0),3,0,true));
305 BOOST_TEST(ccmpk(tap)==make_tuple(test_class(3,0),3));
306 BOOST_TEST(cid(ctap).int_member==3);
307 BOOST_TEST(ck_m(ctap)==3);
308 BOOST_TEST(cmpk(ctap)==make_tuple(test_class(3,0),3,0,true));
309 BOOST_TEST(ccmpk(ctap)==make_tuple(test_class(3,0),3));
310
311 k_m(tap)=4;
312 BOOST_TEST(id(tw).int_member==4);
313 BOOST_TEST(cid(tw).int_member==4);
314 BOOST_TEST(k_m(tw)==4);
315 BOOST_TEST(ck_m(tw)==4);
316 BOOST_TEST(cmpk(tw)==make_tuple(test_class(4,0),4,0,true));
317 BOOST_TEST(ccmpk(tw)==make_tuple(test_class(4,0),4));
318
319 k_m(tw)=5;
320 BOOST_TEST(id(ctw).int_member==5);
321 BOOST_TEST(cid(ctw).int_member==5);
322 BOOST_TEST(k_m(ctw)==5);
323 BOOST_TEST(ck_m(ctw)==5);
324 BOOST_TEST(cmpk(ctw)==make_tuple(test_class(5,0),5,0,true));
325 BOOST_TEST(ccmpk(ctw)==make_tuple(test_class(5,0),5));
326
327 BOOST_TEST(k_cm(tr)==0);
328 BOOST_TEST(k_cm(ctr)==0);
329
330#if !defined(BOOST_NO_SFINAE)
331 BOOST_TEST(k_cm(td)==0);
332 BOOST_TEST(k_cm(ctdr)==0);
333#endif
334
335 BOOST_TEST(k_cm(tp)==0);
336 BOOST_TEST(k_cm(ctp)==0);
337
338#if !defined(BOOST_NO_SFINAE)
339 BOOST_TEST(k_cm(tdp)==0);
340 BOOST_TEST(k_cm(ctdp)==0);
341#endif
342
343 BOOST_TEST(k_cm(tpp)==0);
344 BOOST_TEST(k_cm(ctpp)==0);
345 BOOST_TEST(k_cm(tap)==0);
346 BOOST_TEST(k_cm(ctap)==0);
347
348 BOOST_TEST(k_cm(tw)==0);
349 BOOST_TEST(k_cm(ctw)==0);
350
351 BOOST_TEST(k_cmf(tr));
352 BOOST_TEST(k_cmf(ctr));
353 BOOST_TEST(k_cvmf(tr));
354 BOOST_TEST(k_cvmf(ctr));
355
356#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
357 BOOST_TEST(k_crmf(tr));
358 BOOST_TEST(k_crmf(ctr));
359 BOOST_TEST(k_cvrmf(tr));
360 BOOST_TEST(k_cvrmf(ctr));
361#endif
362
363#if !defined(BOOST_NO_SFINAE)
364 BOOST_TEST(k_cmf(td));
365 BOOST_TEST(k_cmf(ctdr));
366 BOOST_TEST(k_cvmf(td));
367 BOOST_TEST(k_cvmf(ctdr));
368
369#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
370 BOOST_TEST(k_crmf(td));
371 BOOST_TEST(k_crmf(ctdr));
372 BOOST_TEST(k_cvrmf(td));
373 BOOST_TEST(k_cvrmf(ctdr));
374#endif
375#endif
376
377 BOOST_TEST(k_cmf(tp));
378 BOOST_TEST(k_cmf(ctp));
379 BOOST_TEST(k_cvmf(tp));
380 BOOST_TEST(k_cvmf(ctp));
381
382#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
383 BOOST_TEST(k_crmf(tp));
384 BOOST_TEST(k_crmf(ctp));
385 BOOST_TEST(k_cvrmf(tp));
386 BOOST_TEST(k_cvrmf(ctp));
387#endif
388
389#if !defined(BOOST_NO_SFINAE)
390 BOOST_TEST(k_cmf(tdp));
391 BOOST_TEST(k_cmf(ctdp));
392 BOOST_TEST(k_cvmf(tdp));
393 BOOST_TEST(k_cvmf(ctdp));
394
395#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
396 BOOST_TEST(k_crmf(tdp));
397 BOOST_TEST(k_crmf(ctdp));
398 BOOST_TEST(k_cvrmf(tdp));
399 BOOST_TEST(k_cvrmf(ctdp));
400#endif
401#endif
402
403 BOOST_TEST(k_cmf(tpp));
404 BOOST_TEST(k_cmf(ctpp));
405 BOOST_TEST(k_cmf(tap));
406 BOOST_TEST(k_cmf(ctap));
407 BOOST_TEST(k_cvmf(tpp));
408 BOOST_TEST(k_cvmf(ctpp));
409 BOOST_TEST(k_cvmf(tap));
410 BOOST_TEST(k_cvmf(ctap));
411
412#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
413 BOOST_TEST(k_crmf(tpp));
414 BOOST_TEST(k_crmf(ctpp));
415 BOOST_TEST(k_crmf(tap));
416 BOOST_TEST(k_crmf(ctap));
417 BOOST_TEST(k_cvrmf(tpp));
418 BOOST_TEST(k_cvrmf(ctpp));
419 BOOST_TEST(k_cvrmf(tap));
420 BOOST_TEST(k_cvrmf(ctap));
421#endif
422
423 BOOST_TEST(k_cmf(tw));
424 BOOST_TEST(k_cmf(ctw));
425 BOOST_TEST(k_cvmf(tw));
426 BOOST_TEST(k_cvmf(ctw));
427
428#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
429 BOOST_TEST(k_crmf(tw));
430 BOOST_TEST(k_crmf(ctw));
431 BOOST_TEST(k_cvrmf(tw));
432 BOOST_TEST(k_cvrmf(ctw));
433#endif
434
435 BOOST_TEST(!k_mf(tr));
436 BOOST_TEST(!k_vmf(tr));
437
438#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
439 BOOST_TEST(!k_rmf(tr));
440 BOOST_TEST(!k_vrmf(tr));
441#endif
442
443#if !defined(BOOST_NO_SFINAE)
444 BOOST_TEST(!k_mf(td));
445 BOOST_TEST(!k_vmf(td));
446
447#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
448 BOOST_TEST(!k_rmf(td));
449 BOOST_TEST(!k_vrmf(td));
450#endif
451#endif
452
453 BOOST_TEST(!k_mf(tp));
454 BOOST_TEST(!k_vmf(tp));
455
456#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
457 BOOST_TEST(!k_rmf(tp));
458 BOOST_TEST(!k_vrmf(tp));
459#endif
460
461#if !defined(BOOST_NO_SFINAE)
462 BOOST_TEST(!k_mf(tdp));
463 BOOST_TEST(!k_vmf(tdp));
464
465#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
466 BOOST_TEST(!k_rmf(tdp));
467 BOOST_TEST(!k_vrmf(tdp));
468#endif
469#endif
470
471 BOOST_TEST(!k_mf(tpp));
472 BOOST_TEST(!k_mf(tap));
473 BOOST_TEST(!k_mf(tw));
474 BOOST_TEST(!k_vmf(tpp));
475 BOOST_TEST(!k_vmf(tap));
476 BOOST_TEST(!k_vmf(tw));
477
478#if !defined(BOOST_NO_CXX11_REF_QUALIFIERS)
479 BOOST_TEST(!k_rmf(tpp));
480 BOOST_TEST(!k_rmf(tap));
481 BOOST_TEST(!k_rmf(tw));
482 BOOST_TEST(!k_vrmf(tpp));
483 BOOST_TEST(!k_vrmf(tap));
484 BOOST_TEST(!k_vrmf(tw));
485#endif
486
487 BOOST_TEST(k_gf(tr));
488 BOOST_TEST(k_gf(ctr));
489
490#if !defined(BOOST_NO_SFINAE)
491 BOOST_TEST(k_gf(td));
492 BOOST_TEST(k_gf(ctdr));
493#endif
494
495 BOOST_TEST(k_gf(tp));
496 BOOST_TEST(k_gf(ctp));
497
498#if !defined(BOOST_NO_SFINAE)
499 BOOST_TEST(k_gf(tdp));
500 BOOST_TEST(k_gf(ctdp));
501#endif
502
503 BOOST_TEST(k_gf(tpp));
504 BOOST_TEST(k_gf(ctpp));
505 BOOST_TEST(k_gf(tap));
506 BOOST_TEST(k_gf(ctap));
507
508 BOOST_TEST(k_gf(tw));
509 BOOST_TEST(k_gf(ctw));
510
511 BOOST_TEST(!k_gcrf(tr));
512 BOOST_TEST(!k_gcrf(ctr));
513
514#if !defined(BOOST_NO_SFINAE)
515 BOOST_TEST(!k_gcrf(td));
516 BOOST_TEST(!k_gcrf(ctdr));
517#endif
518
519 BOOST_TEST(!k_gcrf(tp));
520 BOOST_TEST(!k_gcrf(ctp));
521
522#if !defined(BOOST_NO_SFINAE)
523 BOOST_TEST(!k_gcrf(tdp));
524 BOOST_TEST(!k_gcrf(ctdp));
525#endif
526
527 BOOST_TEST(!k_gcrf(tpp));
528 BOOST_TEST(!k_gcrf(ctpp));
529 BOOST_TEST(!k_gcrf(tap));
530 BOOST_TEST(!k_gcrf(ctap));
531
532 BOOST_TEST(!k_gcrf(tw));
533 BOOST_TEST(!k_gcrf(ctw));
534
535 BOOST_TEST(k_grf(tr));
536
537#if !defined(BOOST_NO_SFINAE)
538 BOOST_TEST(k_grf(td));
539#endif
540
541 BOOST_TEST(k_grf(tp));
542
543#if !defined(BOOST_NO_SFINAE)
544 BOOST_TEST(k_grf(tdp));
545#endif
546
547 BOOST_TEST(k_grf(tpp));
548 BOOST_TEST(k_grf(tap));
549 BOOST_TEST(k_grf(tw));
550
551 BOOST_TEST(ccmpk_w(tw)==make_tuple(false));
552
553#if !defined(BOOST_NO_SFINAE)
554/* testcases for problems with non-copyable classes reported at
555 * http://lists.boost.org/Archives/boost/2006/04/103065.php
556 */
557
558 nc_idn nc_id;
559 nc_cidn nc_cid;
560 nc_key_m nc_k_m;
561 nc_ckey_m nc_ck_m;
562 nc_key_cmf nc_k_cmf;
563 nc_key_mf nc_k_mf;
564 nc_key_gcrf nc_k_gcrf;
565 nc_key_grf nc_k_grf;
566 nc_compkey nc_cmpk;
567
568 test_nc_derived_class nc_td(-1,0);
569
570 nc_id(nc_td).int_member=0;
571 BOOST_TEST(nc_id(nc_td).int_member==0);
572 BOOST_TEST(nc_cid(nc_td).int_member==0);
573
574 nc_k_m(&nc_td)=1;
575 BOOST_TEST(nc_k_m(&nc_td)==1);
576 BOOST_TEST(nc_ck_m(&nc_td)==1);
577
578 BOOST_TEST(nc_k_cmf(nc_td));
579 BOOST_TEST(!nc_k_mf(nc_td));
580
581 BOOST_TEST(!nc_k_gcrf(nc_td));
582 BOOST_TEST(nc_k_grf(nc_td));
583
584 test_nc_class nc_t(1,0);
585 BOOST_TEST(nc_cmpk(nc_td)==make_tuple(boost::cref(nc_t),1,1,true));
586#endif
587
588 std::list<test_class> tl;
589 for(int i=0;i<20;++i)tl.push_back(x: test_class(i));
590
591 int j=0;
592 for(std::list<test_class>::iterator it=tl.begin();it!=tl.end();++it){
593 BOOST_TEST(k_m(it)==j);
594 BOOST_TEST(k_cm(it)==j);
595 BOOST_TEST(k_cmf(it));
596 BOOST_TEST(!k_mf(it));
597 BOOST_TEST(k_gf(it));
598 BOOST_TEST(!k_gcrf(it));
599 BOOST_TEST(k_grf(it));
600 BOOST_TEST(cmpk(it)==make_tuple(test_class(j),j,j,true));
601 BOOST_TEST(ccmpk(it)==make_tuple(test_class(j),j));
602 ++j;
603 }
604}
605

source code of boost/libs/multi_index/test/test_key_extractors.cpp