]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/intrusive/example/doc_derivation_value_traits.cpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / libs / intrusive / example / doc_derivation_value_traits.cpp
CommitLineData
7c673cae
FG
1/////////////////////////////////////////////////////////////////////////////
2//
3// (C) Copyright Ion Gaztanaga 2006-2014
4//
5// Distributed under the Boost Software License, Version 1.0.
6// (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8//
9// See http://www.boost.org/libs/intrusive for documentation.
10//
11/////////////////////////////////////////////////////////////////////////////
12#include <boost/intrusive/link_mode.hpp>
13#include <boost/intrusive/list.hpp>
14#include <boost/intrusive/derivation_value_traits.hpp>
15#include <vector>
16
17struct simple_node
18{
19 simple_node *prev_;
20 simple_node *next_;
21};
22
23//Define the node traits. A single node_traits will be enough.
24struct simple_node_traits
25{
26 typedef simple_node node;
27 typedef node * node_ptr;
28 typedef const node * const_node_ptr;
29 static node *get_next(const node *n) { return n->next_; }
30 static void set_next(node *n, node *next) { n->next_ = next; }
31 static node *get_previous(const node *n) { return n->prev_; }
32 static void set_previous(node *n, node *prev) { n->prev_ = prev; }
33};
34
35//[doc_derivation_value_traits_value_traits
36class base_1{};
37class base_2{};
38
39struct value_1 : public base_1, public simple_node
40{
41 int id_;
42 simple_node node_;
43};
44
45struct value_2 : public base_1, public base_2, public simple_node
46{
47 simple_node node_;
48 float id_;
49};
50
51using namespace boost::intrusive;
52
53//Now define the needed value traits using derivation_value_traits
54typedef derivation_value_traits<value_1, simple_node_traits, normal_link> ValueTraits1;
55typedef derivation_value_traits<value_2, simple_node_traits, normal_link> ValueTraits2;
56
57//Now define two intrusive lists. Both lists will use the same algorithms:
58// circular_list_algorithms<simple_node_traits>
59typedef list <value_1, value_traits<ValueTraits1> > Value1List;
60typedef list <value_2, value_traits<ValueTraits2> > Value2List;
61//]
62
63//[doc_derivation_value_traits_test
64int main()
65{
66 typedef std::vector<value_1> Vect1;
67 typedef std::vector<value_2> Vect2;
68
69 //Create values, with a different internal number
70 Vect1 values1;
71 Vect2 values2;
72 for(int i = 0; i < 100; ++i){
73 value_1 v1; v1.id_ = i; values1.push_back(v1);
74 value_2 v2; v2.id_ = (float)i; values2.push_back(v2);
75 }
76
77 //Create the lists with the objects
78 Value1List list1(values1.begin(), values1.end());
79 Value2List list2(values2.begin(), values2.end());
80
81 //Now test both lists
82 Value1List::const_iterator bit1(list1.begin()), bitend1(list1.end());
83 Value2List::const_iterator bit2(list2.begin()), bitend2(list2.end());
84
85 Vect1::const_iterator it1(values1.begin()), itend1(values1.end());
86 Vect2::const_iterator it2(values2.begin()), itend2(values2.end());
87
88 //Test the objects inserted in our lists
89 for(; it1 != itend1; ++it1, ++bit1, ++it2, ++bit2){
92f5a8d4 90 if(&*bit1 != &*it1 || &*bit2 != &*it2) return 1;
7c673cae
FG
91 }
92 return 0;
93}
94//]