1 /* Copyright 2003-2015 Joaquin M Lopez Munoz.
2  * Distributed under the Boost Software License, Version 1.0.
3  * (See accompanying file LICENSE_1_0.txt or copy at
4  * http://www.boost.org/LICENSE_1_0.txt)
5  *
6  * See http://www.boost.org/libs/multi_index for library home page.
7  */
8 
9 #ifndef BOOST_MULTI_INDEX_ORDERED_INDEX_HPP
10 #define BOOST_MULTI_INDEX_ORDERED_INDEX_HPP
11 
12 #if defined(_MSC_VER)
13 #pragma once
14 #endif
15 
16 #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
17 #include <boost/multi_index/detail/ord_index_impl.hpp>
18 #include <boost/multi_index/ordered_index_fwd.hpp>
19 
20 namespace boost{
21 
22 namespace multi_index{
23 
24 namespace detail{
25 
26 /* no augment policy for plain ordered indices */
27 
28 struct null_augment_policy
29 {
30   template<typename OrderedIndexImpl>
31   struct augmented_interface
32   {
33     typedef OrderedIndexImpl type;
34   };
35 
36   template<typename OrderedIndexNodeImpl>
37   struct augmented_node
38   {
39     typedef OrderedIndexNodeImpl type;
40   };
41 
addboost::multi_index::detail::null_augment_policy42   template<typename Pointer> static void add(Pointer,Pointer){}
removeboost::multi_index::detail::null_augment_policy43   template<typename Pointer> static void remove(Pointer,Pointer){}
copyboost::multi_index::detail::null_augment_policy44   template<typename Pointer> static void copy(Pointer,Pointer){}
rotate_leftboost::multi_index::detail::null_augment_policy45   template<typename Pointer> static void rotate_left(Pointer,Pointer){}
rotate_rightboost::multi_index::detail::null_augment_policy46   template<typename Pointer> static void rotate_right(Pointer,Pointer){}
47 
48 #if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)
49   /* invariant stuff */
50 
invariantboost::multi_index::detail::null_augment_policy51   template<typename Pointer> static bool invariant(Pointer){return true;}
52 
53 #endif
54 };
55 
56 } /* namespace multi_index::detail */
57 
58 /* ordered_index specifiers */
59 
60 template<typename Arg1,typename Arg2,typename Arg3>
61 struct ordered_unique
62 {
63   typedef typename detail::ordered_index_args<
64     Arg1,Arg2,Arg3>                                index_args;
65   typedef typename index_args::tag_list_type::type tag_list_type;
66   typedef typename index_args::key_from_value_type key_from_value_type;
67   typedef typename index_args::compare_type        compare_type;
68 
69   template<typename Super>
70   struct node_class
71   {
72     typedef detail::ordered_index_node<detail::null_augment_policy,Super> type;
73   };
74 
75   template<typename SuperMeta>
76   struct index_class
77   {
78     typedef detail::ordered_index<
79       key_from_value_type,compare_type,
80       SuperMeta,tag_list_type,detail::ordered_unique_tag,
81       detail::null_augment_policy>                        type;
82   };
83 };
84 
85 template<typename Arg1,typename Arg2,typename Arg3>
86 struct ordered_non_unique
87 {
88   typedef detail::ordered_index_args<
89     Arg1,Arg2,Arg3>                                index_args;
90   typedef typename index_args::tag_list_type::type tag_list_type;
91   typedef typename index_args::key_from_value_type key_from_value_type;
92   typedef typename index_args::compare_type        compare_type;
93 
94   template<typename Super>
95   struct node_class
96   {
97     typedef detail::ordered_index_node<detail::null_augment_policy,Super> type;
98   };
99 
100   template<typename SuperMeta>
101   struct index_class
102   {
103     typedef detail::ordered_index<
104       key_from_value_type,compare_type,
105       SuperMeta,tag_list_type,detail::ordered_non_unique_tag,
106       detail::null_augment_policy>                            type;
107   };
108 };
109 
110 } /* namespace multi_index */
111 
112 } /* namespace boost */
113 
114 #endif
115