ord_index_impl.hpp
Go to the documentation of this file.
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  * The internal implementation of red-black trees is based on that of SGI STL
9  * stl_tree.h file:
10  *
11  * Copyright (c) 1996,1997
12  * Silicon Graphics Computer Systems, Inc.
13  *
14  * Permission to use, copy, modify, distribute and sell this software
15  * and its documentation for any purpose is hereby granted without fee,
16  * provided that the above copyright notice appear in all copies and
17  * that both that copyright notice and this permission notice appear
18  * in supporting documentation. Silicon Graphics makes no
19  * representations about the suitability of this software for any
20  * purpose. It is provided "as is" without express or implied warranty.
21  *
22  *
23  * Copyright (c) 1994
24  * Hewlett-Packard Company
25  *
26  * Permission to use, copy, modify, distribute and sell this software
27  * and its documentation for any purpose is hereby granted without fee,
28  * provided that the above copyright notice appear in all copies and
29  * that both that copyright notice and this permission notice appear
30  * in supporting documentation. Hewlett-Packard Company makes no
31  * representations about the suitability of this software for any
32  * purpose. It is provided "as is" without express or implied warranty.
33  *
34  */
35 
36 #ifndef BOOST_MULTI_INDEX_DETAIL_ORD_INDEX_IMPL_HPP
37 #define BOOST_MULTI_INDEX_DETAIL_ORD_INDEX_IMPL_HPP
38 
39 #if defined(_MSC_VER)
40 #pragma once
41 #endif
42 
43 #include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
44 #include <algorithm>
45 #include <boost/call_traits.hpp>
48 #include <boost/foreach_fwd.hpp>
50 #include <boost/move/core.hpp>
51 #include <boost/mpl/bool.hpp>
52 #include <boost/mpl/if.hpp>
53 #include <boost/mpl/push_front.hpp>
67 #include <boost/ref.hpp>
68 #include <boost/tuple/tuple.hpp>
70 #include <utility>
71 
72 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
73 #include <initializer_list>
74 #endif
75 
76 #if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
78 #include <boost/bind.hpp>
80 #include <boost/throw_exception.hpp>
81 #endif
82 
83 #if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)
84 #define BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT_OF(x) \
85  detail::scope_guard BOOST_JOIN(check_invariant_,__LINE__)= \
86  detail::make_obj_guard(x,&ordered_index_impl::check_invariant_); \
87  BOOST_JOIN(check_invariant_,__LINE__).touch();
88 #define BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT \
89  BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT_OF(*this)
90 #else
91 #define BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT_OF(x)
92 #define BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT
93 #endif
94 
95 namespace boost{
96 
97 namespace multi_index{
98 
99 namespace detail{
100 
101 /* ordered_index adds a layer of ordered indexing to a given Super and accepts
102  * an augmenting policy for optional addition of order statistics.
103  */
104 
105 /* Most of the implementation of unique and non-unique indices is
106  * shared. We tell from one another on instantiation time by using
107  * these tags.
108  */
109 
112 
113 template<
114  typename KeyFromValue,typename Compare,
115  typename SuperMeta,typename TagList,typename Category,typename AugmentPolicy
116 >
118 
119 template<
120  typename KeyFromValue,typename Compare,
121  typename SuperMeta,typename TagList,typename Category,typename AugmentPolicy
122 >
125 
126 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
127  ,public safe_mode::safe_container<
128  ordered_index_impl<
129  KeyFromValue,Compare,SuperMeta,TagList,Category,AugmentPolicy> >
130 #endif
131 
132 {
133 #if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\
134  BOOST_WORKAROUND(__MWERKS__,<=0x3003)
135 /* The "ISO C++ Template Parser" option in CW8.3 has a problem with the
136  * lifetime of const references bound to temporaries --precisely what
137  * scopeguards are.
138  */
139 
140 #pragma parse_mfunc_templ off
141 #endif
142 
143  typedef typename SuperMeta::type super;
144 
145 protected:
146  typedef ordered_index_node<
147  AugmentPolicy,typename super::node_type> node_type;
148 
149 protected: /* for the benefit of AugmentPolicy::augmented_interface */
152 
153 public:
154  /* types */
155 
157  typedef typename node_type::value_type value_type;
158  typedef KeyFromValue key_from_value;
159  typedef Compare key_compare;
160  typedef value_comparison<
161  value_type,KeyFromValue,Compare> value_compare;
163  typedef typename super::final_allocator_type allocator_type;
164  typedef typename allocator_type::reference reference;
165  typedef typename allocator_type::const_reference const_reference;
166 
167 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
168  typedef safe_mode::safe_iterator<
171 #else
173 #endif
174 
176 
177  typedef std::size_t size_type;
178  typedef std::ptrdiff_t difference_type;
179  typedef typename allocator_type::pointer pointer;
180  typedef typename allocator_type::const_pointer const_pointer;
181  typedef typename
183  typedef typename
185  typedef TagList tag_list;
186 
187 protected:
188  typedef typename super::final_node_type final_node_type;
189  typedef tuples::cons<
190  ctor_args,
191  typename super::ctor_args_list> ctor_args_list;
192  typedef typename mpl::push_front<
193  typename super::index_type_list,
195  KeyFromValue,Compare,
196  SuperMeta,TagList,Category,AugmentPolicy
198  typedef typename mpl::push_front<
199  typename super::iterator_type_list,
201  typedef typename mpl::push_front<
202  typename super::const_iterator_type_list,
204  typedef typename super::copy_map_type copy_map_type;
205 
206 #if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
207  typedef typename super::index_saver_type index_saver_type;
208  typedef typename super::index_loader_type index_loader_type;
209 #endif
210 
211 protected:
212 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
213  typedef safe_mode::safe_container<
214  ordered_index_impl> safe_super;
215 #endif
216 
217  typedef typename call_traits<
219  typedef typename call_traits<
220  key_type>::param_type key_param_type;
221 
222  /* Needed to avoid commas in BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL
223  * expansion.
224  */
225 
226  typedef std::pair<iterator,bool> emplace_return_type;
227 
228 public:
229 
230  /* construct/copy/destroy
231  * Default and copy ctors are in the protected section as indices are
232  * not supposed to be created on their own. No range ctor either.
233  * Assignment operators defined at ordered_index rather than here.
234  */
235 
237  {
238  return this->final().get_allocator();
239  }
240 
241  /* iterators */
242 
243  iterator
247  iterator
260  cbegin()const BOOST_NOEXCEPT{return begin();}
262  cend()const BOOST_NOEXCEPT{return end();}
264  crbegin()const BOOST_NOEXCEPT{return rbegin();}
266  crend()const BOOST_NOEXCEPT{return rend();}
267 
269  {
270  return make_iterator(node_from_value<node_type>(&x));
271  }
272 
274  {
275  return make_iterator(node_from_value<node_type>(&x));
276  }
277 
278  /* capacity */
279 
280  bool empty()const BOOST_NOEXCEPT{return this->final_empty_();}
281  size_type size()const BOOST_NOEXCEPT{return this->final_size_();}
282  size_type max_size()const BOOST_NOEXCEPT{return this->final_max_size_();}
283 
284  /* modifiers */
285 
288 
291 
292  std::pair<iterator,bool> insert(const value_type& x)
293  {
295  std::pair<final_node_type*,bool> p=this->final_insert_(x);
296  return std::pair<iterator,bool>(make_iterator(p.first),p.second);
297  }
298 
299  std::pair<iterator,bool> insert(BOOST_RV_REF(value_type) x)
300  {
302  std::pair<final_node_type*,bool> p=this->final_insert_rv_(x);
303  return std::pair<iterator,bool>(make_iterator(p.first),p.second);
304  }
305 
306  iterator insert(iterator position,const value_type& x)
307  {
309  BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
311  std::pair<final_node_type*,bool> p=this->final_insert_(
312  x,static_cast<final_node_type*>(position.get_node()));
313  return make_iterator(p.first);
314  }
315 
317  {
319  BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
321  std::pair<final_node_type*,bool> p=this->final_insert_rv_(
322  x,static_cast<final_node_type*>(position.get_node()));
323  return make_iterator(p.first);
324  }
325 
326  template<typename InputIterator>
327  void insert(InputIterator first,InputIterator last)
328  {
330  node_type* hint=header(); /* end() */
331  for(;first!=last;++first){
332  hint=this->final_insert_ref_(
333  *first,static_cast<final_node_type*>(hint)).first;
334  node_type::increment(hint);
335  }
336  }
337 
338 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
339  void insert(std::initializer_list<value_type> list)
340  {
341  insert(list.begin(),list.end());
342  }
343 #endif
344 
346  {
349  BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
351  this->final_erase_(static_cast<final_node_type*>(position++.get_node()));
352  return position;
353  }
354 
356  {
358  std::pair<iterator,iterator> p=equal_range(x);
359  size_type s=0;
360  while(p.first!=p.second){
361  p.first=erase(p.first);
362  ++s;
363  }
364  return s;
365  }
366 
368  {
375  while(first!=last){
376  first=erase(first);
377  }
378  return first;
379  }
380 
381  bool replace(iterator position,const value_type& x)
382  {
385  BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
387  return this->final_replace_(
388  x,static_cast<final_node_type*>(position.get_node()));
389  }
390 
392  {
395  BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
397  return this->final_replace_rv_(
398  x,static_cast<final_node_type*>(position.get_node()));
399  }
400 
401  template<typename Modifier>
402  bool modify(iterator position,Modifier mod)
403  {
406  BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
408 
409 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
410  /* MSVC++ 6.0 optimizer on safe mode code chokes if this
411  * this is not added. Left it for all compilers as it does no
412  * harm.
413  */
414 
415  position.detach();
416 #endif
417 
418  return this->final_modify_(
419  mod,static_cast<final_node_type*>(position.get_node()));
420  }
421 
422  template<typename Modifier,typename Rollback>
423  bool modify(iterator position,Modifier mod,Rollback back_)
424  {
427  BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
429 
430 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
431  /* MSVC++ 6.0 optimizer on safe mode code chokes if this
432  * this is not added. Left it for all compilers as it does no
433  * harm.
434  */
435 
436  position.detach();
437 #endif
438 
439  return this->final_modify_(
440  mod,back_,static_cast<final_node_type*>(position.get_node()));
441  }
442 
443  template<typename Modifier>
444  bool modify_key(iterator position,Modifier mod)
445  {
448  BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
450  return modify(
452  }
453 
454  template<typename Modifier,typename Rollback>
455  bool modify_key(iterator position,Modifier mod,Rollback back_)
456  {
459  BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
461  return modify(
462  position,
465  }
466 
467  void swap(
469  KeyFromValue,Compare,SuperMeta,TagList,Category,AugmentPolicy>& x)
470  {
473  this->final_swap_(x.final());
474  }
475 
477  {
479  this->final_clear_();
480  }
481 
482  /* observers */
483 
485  key_compare key_comp()const{return comp_;}
487 
488  /* set operations */
489 
490  /* Internally, these ops rely on const_iterator being the same
491  * type as iterator.
492  */
493 
494  template<typename CompatibleKey>
495  iterator find(const CompatibleKey& x)const
496  {
498  }
499 
500  template<typename CompatibleKey,typename CompatibleCompare>
502  const CompatibleKey& x,const CompatibleCompare& comp)const
503  {
504  return make_iterator(ordered_index_find(root(),header(),key,x,comp));
505  }
506 
507  template<typename CompatibleKey>
508  size_type count(const CompatibleKey& x)const
509  {
510  return count(x,comp_);
511  }
512 
513  template<typename CompatibleKey,typename CompatibleCompare>
514  size_type count(const CompatibleKey& x,const CompatibleCompare& comp)const
515  {
516  std::pair<iterator,iterator> p=equal_range(x,comp);
517  size_type n=std::distance(p.first,p.second);
518  return n;
519  }
520 
521  template<typename CompatibleKey>
522  iterator lower_bound(const CompatibleKey& x)const
523  {
524  return make_iterator(
526  }
527 
528  template<typename CompatibleKey,typename CompatibleCompare>
530  const CompatibleKey& x,const CompatibleCompare& comp)const
531  {
532  return make_iterator(
534  }
535 
536  template<typename CompatibleKey>
537  iterator upper_bound(const CompatibleKey& x)const
538  {
539  return make_iterator(
541  }
542 
543  template<typename CompatibleKey,typename CompatibleCompare>
545  const CompatibleKey& x,const CompatibleCompare& comp)const
546  {
547  return make_iterator(
549  }
550 
551  template<typename CompatibleKey>
552  std::pair<iterator,iterator> equal_range(
553  const CompatibleKey& x)const
554  {
555  std::pair<node_type*,node_type*> p=
557  return std::pair<iterator,iterator>(
558  make_iterator(p.first),make_iterator(p.second));
559  }
560 
561  template<typename CompatibleKey,typename CompatibleCompare>
562  std::pair<iterator,iterator> equal_range(
563  const CompatibleKey& x,const CompatibleCompare& comp)const
564  {
565  std::pair<node_type*,node_type*> p=
567  return std::pair<iterator,iterator>(
568  make_iterator(p.first),make_iterator(p.second));
569  }
570 
571  /* range */
572 
573  template<typename LowerBounder,typename UpperBounder>
574  std::pair<iterator,iterator>
575  range(LowerBounder lower,UpperBounder upper)const
576  {
577  typedef typename mpl::if_<
583  >::type,
588  >::type
589  >::type dispatch;
590 
591  return range(lower,upper,dispatch());
592  }
593 
596  super(args_list.get_tail(),al),
597  key(tuples::get<0>(args_list.get_head())),
598  comp_(tuples::get<1>(args_list.get_head()))
599  {
601  }
602 
604  const ordered_index_impl<
605  KeyFromValue,Compare,SuperMeta,TagList,Category,AugmentPolicy>& x):
606  super(x),
607 
608 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
609  safe_super(),
610 #endif
611 
612  key(x.key),
613  comp_(x.comp_)
614  {
615  /* Copy ctor just takes the key and compare objects from x. The rest is
616  * done in a subsequent call to copy_().
617  */
618  }
619 
621  const ordered_index_impl<
622  KeyFromValue,Compare,SuperMeta,TagList,Category,AugmentPolicy>& x,
625 
626 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
627  safe_super(),
628 #endif
629 
630  key(x.key),
631  comp_(x.comp_)
632  {
634  }
635 
637  {
638  /* the container is guaranteed to be empty by now */
639  }
640 
641 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
642  iterator make_iterator(node_type* node){return iterator(node,this);}
644  {return const_iterator(node,const_cast<ordered_index_impl*>(this));}
645 #else
646  iterator make_iterator(node_type* node){return iterator(node);}
648  {return const_iterator(node);}
649 #endif
650 
651  void copy_(
652  const ordered_index_impl<
653  KeyFromValue,Compare,SuperMeta,TagList,Category,AugmentPolicy>& x,
654  const copy_map_type& map)
655  {
656  if(!x.root()){
658  }
659  else{
660  header()->color()=x.header()->color();
661  AugmentPolicy::copy(x.header()->impl(),header()->impl());
662 
663  node_type* root_cpy=map.find(static_cast<final_node_type*>(x.root()));
664  header()->parent()=root_cpy->impl();
665 
666  node_type* leftmost_cpy=map.find(
667  static_cast<final_node_type*>(x.leftmost()));
668  header()->left()=leftmost_cpy->impl();
669 
670  node_type* rightmost_cpy=map.find(
671  static_cast<final_node_type*>(x.rightmost()));
672  header()->right()=rightmost_cpy->impl();
673 
674  typedef typename copy_map_type::const_iterator copy_map_iterator;
675  for(copy_map_iterator it=map.begin(),it_end=map.end();it!=it_end;++it){
676  node_type* org=it->first;
677  node_type* cpy=it->second;
678 
679  cpy->color()=org->color();
680  AugmentPolicy::copy(org->impl(),cpy->impl());
681 
682  node_impl_pointer parent_org=org->parent();
683  if(parent_org==node_impl_pointer(0))cpy->parent()=node_impl_pointer(0);
684  else{
685  node_type* parent_cpy=map.find(
686  static_cast<final_node_type*>(node_type::from_impl(parent_org)));
687  cpy->parent()=parent_cpy->impl();
688  if(parent_org->left()==org->impl()){
689  parent_cpy->left()=cpy->impl();
690  }
691  else if(parent_org->right()==org->impl()){
692  /* header() does not satisfy this nor the previous check */
693  parent_cpy->right()=cpy->impl();
694  }
695  }
696 
697  if(org->left()==node_impl_pointer(0))
698  cpy->left()=node_impl_pointer(0);
699  if(org->right()==node_impl_pointer(0))
700  cpy->right()=node_impl_pointer(0);
701  }
702  }
703 
704  super::copy_(x,map);
705  }
706 
707  template<typename Variant>
709  value_param_type v,final_node_type*& x,Variant variant)
710  {
711  link_info inf;
712  if(!link_point(key(v),inf,Category())){
713  return static_cast<final_node_type*>(node_type::from_impl(inf.pos));
714  }
715 
716  final_node_type* res=super::insert_(v,x,variant);
717  if(res==x){
719  static_cast<node_type*>(x)->impl(),inf.side,inf.pos,header()->impl());
720  }
721  return res;
722  }
723 
724  template<typename Variant>
726  value_param_type v,node_type* position,final_node_type*& x,Variant variant)
727  {
728  link_info inf;
729  if(!hinted_link_point(key(v),position,inf,Category())){
730  return static_cast<final_node_type*>(node_type::from_impl(inf.pos));
731  }
732 
733  final_node_type* res=super::insert_(v,position,x,variant);
734  if(res==x){
736  static_cast<node_type*>(x)->impl(),inf.side,inf.pos,header()->impl());
737  }
738  return res;
739  }
740 
741  void erase_(node_type* x)
742  {
744  x->impl(),header()->parent(),header()->left(),header()->right());
745  super::erase_(x);
746 
747 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
748  detach_iterators(x);
749 #endif
750  }
751 
753  {
755  }
756 
757  void clear_()
758  {
759  super::clear_();
761 
762 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
763  safe_super::detach_dereferenceable_iterators();
764 #endif
765  }
766 
767  void swap_(
769  KeyFromValue,Compare,SuperMeta,TagList,Category,AugmentPolicy>& x)
770  {
771  std::swap(key,x.key);
772  std::swap(comp_,x.comp_);
773 
774 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
775  safe_super::swap(x);
776 #endif
777 
778  super::swap_(x);
779  }
780 
783  KeyFromValue,Compare,SuperMeta,TagList,Category,AugmentPolicy>& x)
784  {
785 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
786  safe_super::swap(x);
787 #endif
788 
789  super::swap_elements_(x);
790  }
791 
792  template<typename Variant>
793  bool replace_(value_param_type v,node_type* x,Variant variant)
794  {
795  if(in_place(v,x,Category())){
796  return super::replace_(v,x,variant);
797  }
798 
799  node_type* next=x;
801 
803  x->impl(),header()->parent(),header()->left(),header()->right());
804 
805  BOOST_TRY{
806  link_info inf;
807  if(link_point(key(v),inf,Category())&&super::replace_(v,x,variant)){
808  node_impl_type::link(x->impl(),inf.side,inf.pos,header()->impl());
809  return true;
810  }
811  node_impl_type::restore(x->impl(),next->impl(),header()->impl());
812  return false;
813  }
814  BOOST_CATCH(...){
815  node_impl_type::restore(x->impl(),next->impl(),header()->impl());
817  }
819  }
820 
822  {
823  bool b;
824  BOOST_TRY{
825  b=in_place(x->value(),x,Category());
826  }
827  BOOST_CATCH(...){
828  erase_(x);
830  }
832  if(!b){
834  x->impl(),header()->parent(),header()->left(),header()->right());
835  BOOST_TRY{
836  link_info inf;
837  if(!link_point(key(x->value()),inf,Category())){
838  super::erase_(x);
839 
840 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
841  detach_iterators(x);
842 #endif
843  return false;
844  }
845  node_impl_type::link(x->impl(),inf.side,inf.pos,header()->impl());
846  }
847  BOOST_CATCH(...){
848  super::erase_(x);
849 
850 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
851  detach_iterators(x);
852 #endif
853 
855  }
857  }
858 
859  BOOST_TRY{
860  if(!super::modify_(x)){
862  x->impl(),header()->parent(),header()->left(),header()->right());
863 
864 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
865  detach_iterators(x);
866 #endif
867 
868  return false;
869  }
870  else return true;
871  }
872  BOOST_CATCH(...){
874  x->impl(),header()->parent(),header()->left(),header()->right());
875 
876 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
877  detach_iterators(x);
878 #endif
879 
881  }
883  }
884 
886  {
887  if(in_place(x->value(),x,Category())){
888  return super::modify_rollback_(x);
889  }
890 
891  node_type* next=x;
893 
895  x->impl(),header()->parent(),header()->left(),header()->right());
896 
897  BOOST_TRY{
898  link_info inf;
899  if(link_point(key(x->value()),inf,Category())&&
900  super::modify_rollback_(x)){
901  node_impl_type::link(x->impl(),inf.side,inf.pos,header()->impl());
902  return true;
903  }
904  node_impl_type::restore(x->impl(),next->impl(),header()->impl());
905  return false;
906  }
907  BOOST_CATCH(...){
908  node_impl_type::restore(x->impl(),next->impl(),header()->impl());
910  }
912  }
913 
914 #if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
915  /* serialization */
916 
917  template<typename Archive>
918  void save_(
919  Archive& ar,const unsigned int version,const index_saver_type& sm)const
920  {
921  save_(ar,version,sm,Category());
922  }
923 
924  template<typename Archive>
925  void load_(Archive& ar,const unsigned int version,const index_loader_type& lm)
926  {
927  load_(ar,version,lm,Category());
928  }
929 #endif
930 
931 #if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)
932  /* invariant stuff */
933 
934  bool invariant_()const
935  {
936  if(size()==0||begin()==end()){
937  if(size()!=0||begin()!=end()||
938  header()->left()!=header()->impl()||
939  header()->right()!=header()->impl())return false;
940  }
941  else{
942  if((size_type)std::distance(begin(),end())!=size())return false;
943 
944  std::size_t len=node_impl_type::black_count(
945  leftmost()->impl(),root()->impl());
946  for(const_iterator it=begin(),it_end=end();it!=it_end;++it){
947  node_type* x=it.get_node();
948  node_type* left_x=node_type::from_impl(x->left());
949  node_type* right_x=node_type::from_impl(x->right());
950 
951  if(x->color()==red){
952  if((left_x&&left_x->color()==red)||
953  (right_x&&right_x->color()==red))return false;
954  }
955  if(left_x&&comp_(key(x->value()),key(left_x->value())))return false;
956  if(right_x&&comp_(key(right_x->value()),key(x->value())))return false;
957  if(!left_x&&!right_x&&
958  node_impl_type::black_count(x->impl(),root()->impl())!=len)
959  return false;
960  if(!AugmentPolicy::invariant(x->impl()))return false;
961  }
962 
963  if(leftmost()->impl()!=node_impl_type::minimum(root()->impl()))
964  return false;
965  if(rightmost()->impl()!=node_impl_type::maximum(root()->impl()))
966  return false;
967  }
968 
969  return super::invariant_();
970  }
971 
972 
973  /* This forwarding function eases things for the boost::mem_fn construct
974  * in BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT. Actually,
975  * final_check_invariant is already an inherited member function of
976  * ordered_index_impl.
977  */
978  void check_invariant_()const{this->final_check_invariant_();}
979 #endif
980 
981 protected: /* for the benefit of AugmentPolicy::augmented_interface */
982  node_type* header()const{return this->final_header();}
983  node_type* root()const{return node_type::from_impl(header()->parent());}
984  node_type* leftmost()const{return node_type::from_impl(header()->left());}
985  node_type* rightmost()const{return node_type::from_impl(header()->right());}
986 
987 private:
989  {
990  header()->color()=red;
991  /* used to distinguish header() from root, in iterator.operator++ */
992 
994  header()->left()=header()->impl();
995  header()->right()=header()->impl();
996  }
997 
998  struct link_info
999  {
1000  /* coverity[uninit_ctor]: suppress warning */
1002 
1005  };
1006 
1008  {
1009  node_type* y=header();
1010  node_type* x=root();
1011  bool c=true;
1012  while(x){
1013  y=x;
1014  c=comp_(k,key(x->value()));
1015  x=node_type::from_impl(c?x->left():x->right());
1016  }
1017  node_type* yy=y;
1018  if(c){
1019  if(yy==leftmost()){
1020  inf.side=to_left;
1021  inf.pos=y->impl();
1022  return true;
1023  }
1024  else node_type::decrement(yy);
1025  }
1026 
1027  if(comp_(key(yy->value()),k)){
1028  inf.side=c?to_left:to_right;
1029  inf.pos=y->impl();
1030  return true;
1031  }
1032  else{
1033  inf.pos=yy->impl();
1034  return false;
1035  }
1036  }
1037 
1039  {
1040  node_type* y=header();
1041  node_type* x=root();
1042  bool c=true;
1043  while (x){
1044  y=x;
1045  c=comp_(k,key(x->value()));
1046  x=node_type::from_impl(c?x->left():x->right());
1047  }
1048  inf.side=c?to_left:to_right;
1049  inf.pos=y->impl();
1050  return true;
1051  }
1052 
1054  {
1055  node_type* y=header();
1056  node_type* x=root();
1057  bool c=false;
1058  while (x){
1059  y=x;
1060  c=comp_(key(x->value()),k);
1061  x=node_type::from_impl(c?x->right():x->left());
1062  }
1063  inf.side=c?to_right:to_left;
1064  inf.pos=y->impl();
1065  return true;
1066  }
1067 
1070  {
1071  if(position->impl()==header()->left()){
1072  if(size()>0&&comp_(k,key(position->value()))){
1073  inf.side=to_left;
1074  inf.pos=position->impl();
1075  return true;
1076  }
1077  else return link_point(k,inf,ordered_unique_tag());
1078  }
1079  else if(position==header()){
1080  if(comp_(key(rightmost()->value()),k)){
1081  inf.side=to_right;
1082  inf.pos=rightmost()->impl();
1083  return true;
1084  }
1085  else return link_point(k,inf,ordered_unique_tag());
1086  }
1087  else{
1088  node_type* before=position;
1089  node_type::decrement(before);
1090  if(comp_(key(before->value()),k)&&comp_(k,key(position->value()))){
1091  if(before->right()==node_impl_pointer(0)){
1092  inf.side=to_right;
1093  inf.pos=before->impl();
1094  return true;
1095  }
1096  else{
1097  inf.side=to_left;
1098  inf.pos=position->impl();
1099  return true;
1100  }
1101  }
1102  else return link_point(k,inf,ordered_unique_tag());
1103  }
1104  }
1105 
1108  {
1109  if(position->impl()==header()->left()){
1110  if(size()>0&&!comp_(key(position->value()),k)){
1111  inf.side=to_left;
1112  inf.pos=position->impl();
1113  return true;
1114  }
1115  else return lower_link_point(k,inf,ordered_non_unique_tag());
1116  }
1117  else if(position==header()){
1118  if(!comp_(k,key(rightmost()->value()))){
1119  inf.side=to_right;
1120  inf.pos=rightmost()->impl();
1121  return true;
1122  }
1123  else return link_point(k,inf,ordered_non_unique_tag());
1124  }
1125  else{
1126  node_type* before=position;
1127  node_type::decrement(before);
1128  if(!comp_(k,key(before->value()))){
1129  if(!comp_(key(position->value()),k)){
1130  if(before->right()==node_impl_pointer(0)){
1131  inf.side=to_right;
1132  inf.pos=before->impl();
1133  return true;
1134  }
1135  else{
1136  inf.side=to_left;
1137  inf.pos=position->impl();
1138  return true;
1139  }
1140  }
1141  else return lower_link_point(k,inf,ordered_non_unique_tag());
1142  }
1143  else return link_point(k,inf,ordered_non_unique_tag());
1144  }
1145  }
1146 
1148  {
1149  if(!x)return;
1150 
1153  this->final_delete_node_(static_cast<final_node_type*>(x));
1154  }
1155 
1157  {
1158  node_type* y;
1159  if(x!=leftmost()){
1160  y=x;
1162  if(!comp_(key(y->value()),key(v)))return false;
1163  }
1164 
1165  y=x;
1167  return y==header()||comp_(key(v),key(y->value()));
1168  }
1169 
1171  {
1172  node_type* y;
1173  if(x!=leftmost()){
1174  y=x;
1176  if(comp_(key(v),key(y->value())))return false;
1177  }
1178 
1179  y=x;
1181  return y==header()||!comp_(key(y->value()),key(v));
1182  }
1183 
1184 #if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
1185  void detach_iterators(node_type* x)
1186  {
1187  iterator it=make_iterator(x);
1188  safe_mode::detach_equivalent_iterators(it);
1189  }
1190 #endif
1191 
1192  template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
1194  {
1196  std::pair<final_node_type*,bool>p=
1197  this->final_emplace_(BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);
1198  return std::pair<iterator,bool>(make_iterator(p.first),p.second);
1199  }
1200 
1201  template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>
1204  {
1206  BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this);
1208  std::pair<final_node_type*,bool>p=
1209  this->final_emplace_hint_(
1210  static_cast<final_node_type*>(position.get_node()),
1212  return make_iterator(p.first);
1213  }
1214 
1215  template<typename LowerBounder,typename UpperBounder>
1216  std::pair<iterator,iterator>
1217  range(LowerBounder lower,UpperBounder upper,none_unbounded_tag)const
1218  {
1219  node_type* y=header();
1220  node_type* z=root();
1221 
1222  while(z){
1223  if(!lower(key(z->value()))){
1224  z=node_type::from_impl(z->right());
1225  }
1226  else if(!upper(key(z->value()))){
1227  y=z;
1228  z=node_type::from_impl(z->left());
1229  }
1230  else{
1231  return std::pair<iterator,iterator>(
1232  make_iterator(
1234  make_iterator(
1236  }
1237  }
1238 
1239  return std::pair<iterator,iterator>(make_iterator(y),make_iterator(y));
1240  }
1241 
1242  template<typename LowerBounder,typename UpperBounder>
1243  std::pair<iterator,iterator>
1244  range(LowerBounder,UpperBounder upper,lower_unbounded_tag)const
1245  {
1246  return std::pair<iterator,iterator>(
1247  begin(),
1249  }
1250 
1251  template<typename LowerBounder,typename UpperBounder>
1252  std::pair<iterator,iterator>
1253  range(LowerBounder lower,UpperBounder,upper_unbounded_tag)const
1254  {
1255  return std::pair<iterator,iterator>(
1257  end());
1258  }
1259 
1260  template<typename LowerBounder,typename UpperBounder>
1261  std::pair<iterator,iterator>
1262  range(LowerBounder,UpperBounder,both_unbounded_tag)const
1263  {
1264  return std::pair<iterator,iterator>(begin(),end());
1265  }
1266 
1267  template<typename LowerBounder>
1268  node_type * lower_range(node_type* top,node_type* y,LowerBounder lower)const
1269  {
1270  while(top){
1271  if(lower(key(top->value()))){
1272  y=top;
1273  top=node_type::from_impl(top->left());
1274  }
1275  else top=node_type::from_impl(top->right());
1276  }
1277 
1278  return y;
1279  }
1280 
1281  template<typename UpperBounder>
1282  node_type * upper_range(node_type* top,node_type* y,UpperBounder upper)const
1283  {
1284  while(top){
1285  if(!upper(key(top->value()))){
1286  y=top;
1287  top=node_type::from_impl(top->left());
1288  }
1289  else top=node_type::from_impl(top->right());
1290  }
1291 
1292  return y;
1293  }
1294 
1295 #if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
1296  template<typename Archive>
1297  void save_(
1298  Archive& ar,const unsigned int version,const index_saver_type& sm,
1299  ordered_unique_tag)const
1300  {
1301  super::save_(ar,version,sm);
1302  }
1303 
1304  template<typename Archive>
1305  void load_(
1306  Archive& ar,const unsigned int version,const index_loader_type& lm,
1308  {
1309  super::load_(ar,version,lm);
1310  }
1311 
1312  template<typename Archive>
1313  void save_(
1314  Archive& ar,const unsigned int version,const index_saver_type& sm,
1316  {
1317  typedef duplicates_iterator<node_type,value_compare> dup_iterator;
1318 
1319  sm.save(
1320  dup_iterator(begin().get_node(),end().get_node(),value_comp()),
1321  dup_iterator(end().get_node(),value_comp()),
1322  ar,version);
1323  super::save_(ar,version,sm);
1324  }
1325 
1326  template<typename Archive>
1327  void load_(
1328  Archive& ar,const unsigned int version,const index_loader_type& lm,
1330  {
1331  lm.load(
1332  ::boost::bind(
1334  ::boost::arg<1>(),::boost::arg<2>()),
1335  ar,version);
1336  super::load_(ar,version,lm);
1337  }
1338 
1339  void rearranger(node_type* position,node_type *x)
1340  {
1341  if(!position||comp_(key(position->value()),key(x->value()))){
1342  position=lower_bound(key(x->value())).get_node();
1343  }
1344  else if(comp_(key(x->value()),key(position->value()))){
1345  /* inconsistent rearrangement */
1349  }
1350  else node_type::increment(position);
1351 
1352  if(position!=x){
1354  x->impl(),header()->parent(),header()->left(),header()->right());
1356  x->impl(),position->impl(),header()->impl());
1357  }
1358  }
1359 #endif /* serialization */
1360 
1361 protected: /* for the benefit of AugmentPolicy::augmented_interface */
1364 
1365 #if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\
1366  BOOST_WORKAROUND(__MWERKS__,<=0x3003)
1367 #pragma parse_mfunc_templ reset
1368 #endif
1369 };
1370 
1371 template<
1372  typename KeyFromValue,typename Compare,
1373  typename SuperMeta,typename TagList,typename Category,typename AugmentPolicy
1374 >
1375 class ordered_index:
1376  public AugmentPolicy::template augmented_interface<
1377  ordered_index_impl<
1378  KeyFromValue,Compare,SuperMeta,TagList,Category,AugmentPolicy
1379  >
1380  >::type
1381 {
1382  typedef typename AugmentPolicy::template
1383  augmented_interface<
1385  KeyFromValue,Compare,
1386  SuperMeta,TagList,Category,AugmentPolicy
1387  >
1389 public:
1390  typedef typename super::ctor_args_list ctor_args_list;
1391  typedef typename super::allocator_type allocator_type;
1392  typedef typename super::iterator iterator;
1393 
1394  /* construct/copy/destroy
1395  * Default and copy ctors are in the protected section as indices are
1396  * not supposed to be created on their own. No range ctor either.
1397  */
1398 
1400  {
1401  this->final()=x.final();
1402  return *this;
1403  }
1404 
1405 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
1407  std::initializer_list<BOOST_DEDUCED_TYPENAME super::value_type> list)
1408  {
1409  this->final()=list;
1410  return *this;
1411  }
1412 #endif
1413 
1414 protected:
1416  const ctor_args_list& args_list,const allocator_type& al):
1417  super(args_list,al){}
1418 
1420 
1423 };
1424 
1425 /* comparison */
1426 
1427 template<
1428  typename KeyFromValue1,typename Compare1,
1429  typename SuperMeta1,typename TagList1,typename Category1,
1430  typename AugmentPolicy1,
1431  typename KeyFromValue2,typename Compare2,
1432  typename SuperMeta2,typename TagList2,typename Category2,
1433  typename AugmentPolicy2
1434 >
1436  const ordered_index<
1437  KeyFromValue1,Compare1,SuperMeta1,TagList1,Category1,AugmentPolicy1>& x,
1438  const ordered_index<
1439  KeyFromValue2,Compare2,SuperMeta2,TagList2,Category2,AugmentPolicy2>& y)
1440 {
1441  return x.size()==y.size()&&std::equal(x.begin(),x.end(),y.begin());
1442 }
1443 
1444 template<
1445  typename KeyFromValue1,typename Compare1,
1446  typename SuperMeta1,typename TagList1,typename Category1,
1447  typename AugmentPolicy1,
1448  typename KeyFromValue2,typename Compare2,
1449  typename SuperMeta2,typename TagList2,typename Category2,
1450  typename AugmentPolicy2
1451 >
1453  const ordered_index<
1454  KeyFromValue1,Compare1,SuperMeta1,TagList1,Category1,AugmentPolicy1>& x,
1455  const ordered_index<
1456  KeyFromValue2,Compare2,SuperMeta2,TagList2,Category2,AugmentPolicy2>& y)
1457 {
1458  return std::lexicographical_compare(x.begin(),x.end(),y.begin(),y.end());
1459 }
1460 
1461 template<
1462  typename KeyFromValue1,typename Compare1,
1463  typename SuperMeta1,typename TagList1,typename Category1,
1464  typename AugmentPolicy1,
1465  typename KeyFromValue2,typename Compare2,
1466  typename SuperMeta2,typename TagList2,typename Category2,
1467  typename AugmentPolicy2
1468 >
1470  const ordered_index<
1471  KeyFromValue1,Compare1,SuperMeta1,TagList1,Category1,AugmentPolicy1>& x,
1472  const ordered_index<
1473  KeyFromValue2,Compare2,SuperMeta2,TagList2,Category2,AugmentPolicy2>& y)
1474 {
1475  return !(x==y);
1476 }
1477 
1478 template<
1479  typename KeyFromValue1,typename Compare1,
1480  typename SuperMeta1,typename TagList1,typename Category1,
1481  typename AugmentPolicy1,
1482  typename KeyFromValue2,typename Compare2,
1483  typename SuperMeta2,typename TagList2,typename Category2,
1484  typename AugmentPolicy2
1485 >
1487  const ordered_index<
1488  KeyFromValue1,Compare1,SuperMeta1,TagList1,Category1,AugmentPolicy1>& x,
1489  const ordered_index<
1490  KeyFromValue2,Compare2,SuperMeta2,TagList2,Category2,AugmentPolicy2>& y)
1491 {
1492  return y<x;
1493 }
1494 
1495 template<
1496  typename KeyFromValue1,typename Compare1,
1497  typename SuperMeta1,typename TagList1,typename Category1,
1498  typename AugmentPolicy1,
1499  typename KeyFromValue2,typename Compare2,
1500  typename SuperMeta2,typename TagList2,typename Category2,
1501  typename AugmentPolicy2
1502 >
1504  const ordered_index<
1505  KeyFromValue1,Compare1,SuperMeta1,TagList1,Category1,AugmentPolicy1>& x,
1506  const ordered_index<
1507  KeyFromValue2,Compare2,SuperMeta2,TagList2,Category2,AugmentPolicy2>& y)
1508 {
1509  return !(x<y);
1510 }
1511 
1512 template<
1513  typename KeyFromValue1,typename Compare1,
1514  typename SuperMeta1,typename TagList1,typename Category1,
1515  typename AugmentPolicy1,
1516  typename KeyFromValue2,typename Compare2,
1517  typename SuperMeta2,typename TagList2,typename Category2,
1518  typename AugmentPolicy2
1519 >
1521  const ordered_index<
1522  KeyFromValue1,Compare1,SuperMeta1,TagList1,Category1,AugmentPolicy1>& x,
1523  const ordered_index<
1524  KeyFromValue2,Compare2,SuperMeta2,TagList2,Category2,AugmentPolicy2>& y)
1525 {
1526  return !(x>y);
1527 }
1528 
1529 /* specialized algorithms */
1530 
1531 template<
1532  typename KeyFromValue,typename Compare,
1533  typename SuperMeta,typename TagList,typename Category,typename AugmentPolicy
1534 >
1535 void swap(
1536  ordered_index<
1537  KeyFromValue,Compare,SuperMeta,TagList,Category,AugmentPolicy>& x,
1538  ordered_index<
1539  KeyFromValue,Compare,SuperMeta,TagList,Category,AugmentPolicy>& y)
1540 {
1541  x.swap(y);
1542 }
1543 
1544 } /* namespace multi_index::detail */
1545 
1546 } /* namespace multi_index */
1547 
1548 } /* namespace boost */
1549 
1550 /* Boost.Foreach compatibility */
1551 
1552 template<
1553  typename KeyFromValue,typename Compare,
1554  typename SuperMeta,typename TagList,typename Category,typename AugmentPolicy
1555 >
1558  KeyFromValue,Compare,SuperMeta,TagList,Category,AugmentPolicy>*&,
1560 {
1561  return 0;
1562 }
1563 
1564 #undef BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT
1565 #undef BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT_OF
1566 
1567 #endif
boost::multi_index::detail::ordered_index_impl::final_node_type
super::final_node_type final_node_type
Definition: ord_index_impl.hpp:188
boost::multi_index::detail::ordered_index_impl::equal_range
std::pair< iterator, iterator > equal_range(const CompatibleKey &x) const
Definition: ord_index_impl.hpp:552
value_compare.hpp
boost::multi_index::detail::ordered_index_impl::value_compare
value_comparison< value_type, KeyFromValue, Compare > value_compare
Definition: ord_index_impl.hpp:161
boost::multi_index::detail::ordered_index_impl::modify
bool modify(iterator position, Modifier mod)
Definition: ord_index_impl.hpp:402
duplicates_iterator.hpp
boost::multi_index::detail::ordered_index_impl::in_place
bool in_place(value_param_type v, node_type *x, ordered_unique_tag)
Definition: ord_index_impl.hpp:1156
boost::multi_index::detail::do_not_copy_elements_tag
Definition: do_not_copy_elements_tag.hpp:26
boost::multi_index::detail::ordered_index_impl::lower_bound
iterator lower_bound(const CompatibleKey &x, const CompatibleCompare &comp) const
Definition: ord_index_impl.hpp:529
boost::multi_index::detail::ordered_index_impl::insert_
final_node_type * insert_(value_param_type v, final_node_type *&x, Variant variant)
Definition: ord_index_impl.hpp:708
boost::multi_index::detail::ordered_index_impl::begin
const_iterator begin() const BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:246
boost::multi_index::detail::ordered_index_node
Definition: ord_index_node.hpp:585
no_exceptions_support.hpp
boost::multi_index::detail::ordered_index_impl::const_reverse_iterator
boost::reverse_iterator< const_iterator > const_reverse_iterator
Definition: ord_index_impl.hpp:184
access_specifier.hpp
boost::multi_index::detail::ordered_index_node_impl
Definition: ord_index_node.hpp:68
boost::multi_index::detail::ordered_index_impl::rbegin
const_reverse_iterator rbegin() const BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:254
boost::multi_index::detail::ordered_index_impl::value_type
node_type::value_type value_type
Definition: ord_index_impl.hpp:157
boost::multi_index::detail::ordered_index_impl::comp_
key_compare comp_
Definition: ord_index_impl.hpp:1363
boost::multi_index::detail::ordered_index_impl::cbegin
const_iterator cbegin() const BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:260
boost::multi_index::detail::ordered_index_impl::emplace_hint
emplace_hint
Definition: ord_index_impl.hpp:290
boost::multi_index::detail::upper_unbounded_tag
Definition: unbounded.hpp:57
boost::multi_index::detail::ordered_index_impl::save_
void save_(Archive &ar, const unsigned int version, const index_saver_type &sm) const
Definition: ord_index_impl.hpp:918
boost::multi_index::detail::ordered_index_impl::rend
reverse_iterator rend() BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:256
boost::multi_index::detail::ordered_index_node::right
impl_pointer & right()
Definition: ord_index_node.hpp:604
boost::multi_index::detail::ordered_index_impl::range
std::pair< iterator, iterator > range(LowerBounder lower, UpperBounder upper, none_unbounded_tag) const
Definition: ord_index_impl.hpp:1217
boost::multi_index::detail::value_comparison
Definition: value_compare.hpp:26
config.hpp
boost::multi_index::detail::ordered_index_impl::upper_bound
iterator upper_bound(const CompatibleKey &x, const CompatibleCompare &comp) const
Definition: ord_index_impl.hpp:544
BOOST_MULTI_INDEX_CHECK_IS_OWNER
#define BOOST_MULTI_INDEX_CHECK_IS_OWNER(it, cont)
Definition: safe_mode.hpp:78
boost::multi_index::detail::ordered_unique_tag
Definition: ord_index_impl.hpp:110
boost::multi_index::detail::ordered_index_impl::insert
std::pair< iterator, bool > insert(BOOST_RV_REF(value_type) x)
Definition: ord_index_impl.hpp:299
scope_guard.hpp
boost::multi_index::detail::duplicates_iterator
Definition: duplicates_iterator.hpp:31
unbounded.hpp
s
XmlRpcServer s
boost::multi_index::detail::ordered_index
Definition: ord_index_impl.hpp:117
boost::multi_index::get
nth_index< multi_index_container< Value, IndexSpecifierList, Allocator >, N >::type & get(multi_index_container< Value, IndexSpecifierList, Allocator > &m) BOOST_NOEXCEPT
Definition: multi_index_container.hpp:981
boost::multi_index::detail::ordered_index_impl::key_from_value
KeyFromValue key_from_value
Definition: ord_index_impl.hpp:158
boost::multi_index::detail::swap
void swap(ordered_index< KeyFromValue, Compare, SuperMeta, TagList, Category, AugmentPolicy > &x, ordered_index< KeyFromValue, Compare, SuperMeta, TagList, Category, AugmentPolicy > &y)
Definition: ord_index_impl.hpp:1535
boost::multi_index::detail::red
@ red
Definition: ord_index_node.hpp:64
tuple.hpp
boost::multi_index::detail::ordered_index_impl::find
iterator find(const CompatibleKey &x, const CompatibleCompare &comp) const
Definition: ord_index_impl.hpp:501
boost_foreach_is_noncopyable
boost::mpl::true_ * boost_foreach_is_noncopyable(boost::multi_index::detail::ordered_index< KeyFromValue, Compare, SuperMeta, TagList, Category, AugmentPolicy > *&, boost_foreach_argument_dependent_lookup_hack)
Definition: ord_index_impl.hpp:1556
boost::multi_index::detail::ordered_index_node_impl::maximum
static pointer maximum(pointer x)
Definition: ord_index_node.hpp:310
BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS
#define BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS
Definition: access_specifier.hpp:28
boost::multi_index::detail::ordered_index_impl::get_allocator
allocator_type get_allocator() const BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:236
boost::multi_index::detail::ordered_index_impl::emplace_hint_impl
iterator emplace_hint_impl(iterator position, BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
Definition: ord_index_impl.hpp:1202
boost::multi_index::detail::ordered_index_node::color
impl_color_ref color()
Definition: ord_index_node.hpp:598
boost::type
Definition: type.hpp:14
result_type
result_traits< R, F >::type result_type
Definition: bind_template.hpp:15
boost::multi_index::detail::ordered_index_impl::modify_key
bool modify_key(iterator position, Modifier mod, Rollback back_)
Definition: ord_index_impl.hpp:455
boost::multi_index::detail::ordered_index_impl::erase
iterator erase(iterator position)
Definition: ord_index_impl.hpp:345
boost::throw_exception
BOOST_NORETURN void throw_exception(E const &e)
Definition: throw_exception.hpp:62
boost::multi_index::detail::ordered_index_impl::link_point
bool link_point(key_param_type k, link_info &inf, ordered_unique_tag)
Definition: ord_index_impl.hpp:1007
bool.hpp
boost::multi_index::detail::ordered_index_impl::upper_bound
iterator upper_bound(const CompatibleKey &x) const
Definition: ord_index_impl.hpp:537
upper
upper
call_traits.hpp
boost::multi_index::detail::ordered_index_impl::clear
void clear() BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:476
boost::multi_index::detail::ordered_index_impl::make_iterator
const_iterator make_iterator(node_type *node) const
Definition: ord_index_impl.hpp:647
boost::multi_index::detail::ordered_index_impl::value_param_type
call_traits< value_type >::param_type value_param_type
Definition: ord_index_impl.hpp:218
boost::multi_index::detail::ordered_index_impl::insert
iterator insert(iterator position, BOOST_RV_REF(value_type) x)
Definition: ord_index_impl.hpp:316
bind.hpp
boost::multi_index::detail::ordered_index_impl::begin
iterator begin() BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:244
boost::multi_index::detail::ordered_index_impl::iterator_to
const_iterator iterator_to(const value_type &x) const
Definition: ord_index_impl.hpp:273
boost::multi_index::detail::ordered_index::ordered_index
ordered_index(const ordered_index &x)
Definition: ord_index_impl.hpp:1419
boost::multi_index::detail::ordered_index_impl::delete_all_nodes
void delete_all_nodes(node_type *x)
Definition: ord_index_impl.hpp:1147
boost
BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE.
boost::multi_index::detail::ordered_index_impl::size_type
std::size_t size_type
Definition: ord_index_impl.hpp:177
boost::multi_index::detail::ordered_index_impl::BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL(emplace_return_type, emplace, emplace_impl) BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG(iterator
boost::multi_index::detail::ordered_index_impl::end
const_iterator end() const BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:250
boost::mpl::push_front
Definition: push_front.hpp:29
boost::multi_index::detail::ordered_index_node_impl::restore
static void restore(pointer x, pointer position, pointer header)
Definition: ord_index_node.hpp:537
boost::multi_index::detail::ordered_index_impl::lower_range
node_type * lower_range(node_type *top, node_type *y, LowerBounder lower) const
Definition: ord_index_impl.hpp:1268
boost::multi_index::detail::ordered_index_impl::max_size
size_type max_size() const BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:282
boost::multi_index::detail::ordered_index_node::impl
impl_pointer impl()
Definition: ord_index_node.hpp:607
boost::multi_index::detail::ordered_index_impl::replace
bool replace(iterator position, const value_type &x)
Definition: ord_index_impl.hpp:381
boost::multi_index::detail::ordered_index_impl::iterator_to
iterator iterator_to(const value_type &x)
Definition: ord_index_impl.hpp:268
boost::multi_index::detail::ordered_index_impl::range
std::pair< iterator, iterator > range(LowerBounder, UpperBounder upper, lower_unbounded_tag) const
Definition: ord_index_impl.hpp:1244
boost::multi_index::detail::ordered_index_impl::delete_all_nodes_
void delete_all_nodes_()
Definition: ord_index_impl.hpp:752
BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT_OF
#define BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT_OF(x)
Definition: ord_index_impl.hpp:91
boost::multi_index::detail::ordered_index_node::parent
impl_parent_ref parent()
Definition: ord_index_node.hpp:600
boost::multi_index::detail::ordered_index_impl::replace
bool replace(iterator position, BOOST_RV_REF(value_type) x)
Definition: ord_index_impl.hpp:391
boost::multi_index::detail::ordered_index_impl::range
std::pair< iterator, iterator > range(LowerBounder, UpperBounder, both_unbounded_tag) const
Definition: ord_index_impl.hpp:1262
boost::multi_index::detail::ordered_index_equal_range
std::pair< Node *, Node * > ordered_index_equal_range(Node *top, Node *y, const KeyFromValue &key, const CompatibleKey &x, const CompatibleCompare &comp)
Definition: ord_index_ops.hpp:207
boost::multi_index::detail::operator==
bool operator==(const bidir_node_iterator< Node > &x, const bidir_node_iterator< Node > &y)
Definition: bidir_node_iterator.hpp:101
boost::multi_index::detail::both_unbounded_tag
Definition: unbounded.hpp:58
push_front.hpp
ref.hpp
boost::multi_index::detail::ordered_index_node_impl::link
static void link(pointer x, ordered_index_side side, pointer position, pointer header)
Definition: ord_index_node.hpp:375
boost::is_same
Definition: type_traits/is_same.hpp:29
boost::multi_index::detail::ordered_index_node_impl::minimum
static pointer minimum(pointer x)
Definition: ord_index_node.hpp:304
boost::multi_index::detail::ordered_index_impl::rightmost
node_type * rightmost() const
Definition: ord_index_impl.hpp:985
boost::multi_index::detail::ordered_index::super
AugmentPolicy::template augmented_interface< ordered_index_impl< KeyFromValue, Compare, SuperMeta, TagList, Category, AugmentPolicy > >::type super
Definition: ord_index_impl.hpp:1388
boost::multi_index::detail::ordered_index_impl::find
iterator find(const CompatibleKey &x) const
Definition: ord_index_impl.hpp:495
boost::multi_index::detail::ordered_index_impl::pointer
allocator_type::pointer pointer
Definition: ord_index_impl.hpp:179
boost::multi_index::detail::ordered_index_impl::lower_bound
iterator lower_bound(const CompatibleKey &x) const
Definition: ord_index_impl.hpp:522
boost::multi_index::detail::ordered_index_node_impl::rebalance_for_erase
static pointer rebalance_for_erase(pointer z, parent_ref root, pointer &leftmost, pointer &rightmost)
Definition: ord_index_node.hpp:401
boost::multi_index::detail::ordered_index_impl::erase
size_type erase(key_param_type x)
Definition: ord_index_impl.hpp:355
boost::archive::archive_exception::other_exception
@ other_exception
Definition: archive_exception.hpp:55
boost::multi_index::detail::ordered_index_impl::index_type_list
mpl::push_front< typename super::index_type_list, ordered_index< KeyFromValue, Compare, SuperMeta, TagList, Category, AugmentPolicy > >::type index_type_list
Definition: ord_index_impl.hpp:197
boost::multi_index::detail::lower_unbounded_tag
Definition: unbounded.hpp:56
boost::multi_index::detail::ordered_index_impl::reverse_iterator
boost::reverse_iterator< iterator > reverse_iterator
Definition: ord_index_impl.hpp:182
boost::multi_index::detail::modify_key_adaptor
Definition: modify_key_adaptor.hpp:28
boost::multi_index::detail::none_unbounded_tag
Definition: unbounded.hpp:55
boost::multi_index::detail::ordered_index_impl::equal_range
std::pair< iterator, iterator > equal_range(const CompatibleKey &x, const CompatibleCompare &comp) const
Definition: ord_index_impl.hpp:562
boost::multi_index::detail::ordered_index::iterator
super::iterator iterator
Definition: ord_index_impl.hpp:1392
boost::multi_index::detail::ordered_index_impl::key_param_type
call_traits< key_type >::param_type key_param_type
Definition: ord_index_impl.hpp:220
boost::tuples::tuple
Definition: tuple_basic.hpp:81
BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG
#define BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG( ret, name_from, name_to, extra_arg_type, extra_arg_name)
Definition: vartempl_support.hpp:220
boost::arg
Definition: bind/arg.hpp:29
boost::multi_index::detail::ordered_index_impl::tag_list
TagList tag_list
Definition: ord_index_impl.hpp:185
ord_index_impl_fwd.hpp
boost::multi_index::detail::ordered_index_impl::erase_
void erase_(node_type *x)
Definition: ord_index_impl.hpp:741
boost::multi_index::detail::ordered_index_impl::leftmost
node_type * leftmost() const
Definition: ord_index_impl.hpp:984
boost::iterators::make_reverse_iterator
reverse_iterator< BidirectionalIterator > make_reverse_iterator(BidirectionalIterator x)
Definition: iterator/reverse_iterator.hpp:62
boost::multi_index::detail::ordered_index_impl::key_extractor
key_from_value key_extractor() const
Definition: ord_index_impl.hpp:484
boost::multi_index::detail::ordered_index::allocator_type
super::allocator_type allocator_type
Definition: ord_index_impl.hpp:1391
boost::multi_index::detail::ordered_index_impl::swap
void swap(ordered_index< KeyFromValue, Compare, SuperMeta, TagList, Category, AugmentPolicy > &x)
Definition: ord_index_impl.hpp:467
boost::multi_index::detail::ordered_index_impl::swap_
void swap_(ordered_index_impl< KeyFromValue, Compare, SuperMeta, TagList, Category, AugmentPolicy > &x)
Definition: ord_index_impl.hpp:767
boost::multi_index::detail::ordered_index_find
Node * ordered_index_find(Node *top, Node *y, const KeyFromValue &key, const CompatibleKey &x, const CompatibleCompare &comp)
Definition: ord_index_ops.hpp:65
BOOST_NOEXCEPT
#define BOOST_NOEXCEPT
Definition: suffix.hpp:938
boost::multi_index::detail::bidir_node_iterator
Definition: bidir_node_iterator.hpp:35
boost::multi_index::detail::ordered_index_impl::modify_key
bool modify_key(iterator position, Modifier mod)
Definition: ord_index_impl.hpp:444
boost::multi_index::detail::ordered_index_impl::ctor_args_list
tuples::cons< ctor_args, typename super::ctor_args_list > ctor_args_list
Definition: ord_index_impl.hpp:191
boost::multi_index::detail::operator<=
bool operator<=(const ordered_index< KeyFromValue1, Compare1, SuperMeta1, TagList1, Category1, AugmentPolicy1 > &x, const ordered_index< KeyFromValue2, Compare2, SuperMeta2, TagList2, Category2, AugmentPolicy2 > &y)
Definition: ord_index_impl.hpp:1520
boost::multi_index::detail::ordered_index_impl::~ordered_index_impl
~ordered_index_impl()
Definition: ord_index_impl.hpp:636
boost_foreach_argument_dependent_lookup_hack
boost_foreach_argument_dependent_lookup_hack
Definition: foreach_fwd.hpp:18
boost::multi_index::detail::ordered_index_impl::erase
iterator erase(iterator first, iterator last)
Definition: ord_index_impl.hpp:367
boost::multi_index::detail::ordered_index_impl::end
iterator end() BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:248
boost::multi_index::detail::ordered_index_impl::iterator_type_list
mpl::push_front< typename super::iterator_type_list, iterator >::type iterator_type_list
Definition: ord_index_impl.hpp:200
boost::multi_index::detail::ordered_index_impl::index_loader_type
super::index_loader_type index_loader_type
Definition: ord_index_impl.hpp:208
boost::multi_index::detail::ordered_index_impl::copy_
void copy_(const ordered_index_impl< KeyFromValue, Compare, SuperMeta, TagList, Category, AugmentPolicy > &x, const copy_map_type &map)
Definition: ord_index_impl.hpp:651
boost::multi_index::detail::ordered_index_impl::key_compare
Compare key_compare
Definition: ord_index_impl.hpp:159
boost::multi_index::detail::ordered_index_impl::make_iterator
iterator make_iterator(node_type *node)
Definition: ord_index_impl.hpp:646
boost::multi_index::detail::ordered_index_impl::load_
void load_(Archive &ar, const unsigned int version, const index_loader_type &lm, ordered_unique_tag)
Definition: ord_index_impl.hpp:1305
boost::multi_index::detail::ordered_index_node::increment
static void increment(ordered_index_node *&x)
Definition: ord_index_node.hpp:637
boost::multi_index::detail::ordered_index_node::from_impl
static ordered_index_node * from_impl(impl_pointer x)
Definition: ord_index_node.hpp:619
boost::multi_index::detail::ordered_index_impl::empty
bool empty() const BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:280
boost::multi_index::detail::ordered_index_impl::load_
void load_(Archive &ar, const unsigned int version, const index_loader_type &lm)
Definition: ord_index_impl.hpp:925
boost::multi_index::detail::ordered_index::operator=
ordered_index & operator=(std::initializer_list< BOOST_DEDUCED_TYPENAME super::value_type > list)
Definition: ord_index_impl.hpp:1406
boost::multi_index::detail::ordered_index_impl::al
BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS const allocator_type & al
Definition: ord_index_impl.hpp:596
is_same.hpp
boost::multi_index::detail::ordered_index_impl::cend
const_iterator cend() const BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:262
boost::multi_index::detail::ordered_index_impl::range
std::pair< iterator, iterator > range(LowerBounder lower, UpperBounder upper) const
Definition: ord_index_impl.hpp:575
boost::multi_index::detail::ordered_index_impl::link_point
bool link_point(key_param_type k, link_info &inf, ordered_non_unique_tag)
Definition: ord_index_impl.hpp:1038
boost::multi_index::detail::operator>=
bool operator>=(const ordered_index< KeyFromValue1, Compare1, SuperMeta1, TagList1, Category1, AugmentPolicy1 > &x, const ordered_index< KeyFromValue2, Compare2, SuperMeta2, TagList2, Category2, AugmentPolicy2 > &y)
Definition: ord_index_impl.hpp:1503
boost::iterators::reverse_iterator
Definition: iterator/reverse_iterator.hpp:21
reverse_iterator.hpp
boost::multi_index::detail::ordered_index_impl::reference
allocator_type::reference reference
Definition: ord_index_impl.hpp:164
BOOST_TRY
#define BOOST_TRY
Definition: core/no_exceptions_support.hpp:27
boost::multi_index::detail::ordered_index_impl::size
size_type size() const BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:281
boost::multi_index::detail::operator!=
bool operator!=(const duplicates_iterator< Node, Predicate > &x, const duplicates_iterator< Node, Predicate > &y)
Definition: duplicates_iterator.hpp:107
BOOST_RV_REF
#define BOOST_RV_REF(TYPE)
Definition: core.hpp:340
boost::multi_index::detail::ordered_index_impl::super
SuperMeta::type super
Definition: ord_index_impl.hpp:143
vartempl_support.hpp
boost::multi_index::detail::ordered_index_impl::lower_link_point
bool lower_link_point(key_param_type k, link_info &inf, ordered_non_unique_tag)
Definition: ord_index_impl.hpp:1053
boost::multi_index::detail::ordered_index_impl::insert
void insert(std::initializer_list< value_type > list)
Definition: ord_index_impl.hpp:339
BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR
#define BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it)
Definition: safe_mode.hpp:58
boost::multi_index::detail::ordered_index_impl::insert_
final_node_type * insert_(value_param_type v, node_type *position, final_node_type *&x, Variant variant)
Definition: ord_index_impl.hpp:725
boost::multi_index::detail::ordered_index_impl::save_
void save_(Archive &ar, const unsigned int version, const index_saver_type &sm, ordered_non_unique_tag) const
Definition: ord_index_impl.hpp:1313
BOOST_CATCH
#define BOOST_CATCH(x)
Definition: core/no_exceptions_support.hpp:28
BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK
#define BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK
Definition: vartempl_support.hpp:209
boost::multi_index::detail::ordered_index_node::left
impl_pointer & left()
Definition: ord_index_node.hpp:602
boost::multi_index::detail::ordered_index_impl::clear_
void clear_()
Definition: ord_index_impl.hpp:757
boost::multi_index::detail::ordered_index_impl::key
key_from_value key
Definition: ord_index_impl.hpp:1362
boost::multi_index::detail::ordered_index_impl::const_iterator_type_list
mpl::push_front< typename super::const_iterator_type_list, const_iterator >::type const_iterator_type_list
Definition: ord_index_impl.hpp:203
boost::multi_index::detail::ordered_index_impl::modify_
bool modify_(node_type *x)
Definition: ord_index_impl.hpp:821
boost::multi_index::detail::ordered_index_impl::upper_range
node_type * upper_range(node_type *top, node_type *y, UpperBounder upper) const
Definition: ord_index_impl.hpp:1282
boost::property_tree::detail::rapidxml::node_type
node_type
Definition: rapidxml.hpp:117
foreach_fwd.hpp
boost::multi_index::detail::ordered_index_impl::ctor_args
tuple< key_from_value, key_compare > ctor_args
Definition: ord_index_impl.hpp:162
boost::multi_index::detail::ordered_index_impl::insert
iterator insert(iterator position, const value_type &x)
Definition: ord_index_impl.hpp:306
boost::multi_index::detail::ordered_index_impl::insert
position std::pair< iterator, bool > insert(const value_type &x)
Definition: ord_index_impl.hpp:292
BOOST_DEDUCED_TYPENAME
#define BOOST_DEDUCED_TYPENAME
Definition: suffix.hpp:467
boost::next
T next(T x)
Definition: next_prior.hpp:146
boost::multi_index::detail::ordered_index::ordered_index
ordered_index(const ctor_args_list &args_list, const allocator_type &al)
Definition: ord_index_impl.hpp:1415
boost::multi_index::detail::ordered_index_impl::load_
void load_(Archive &ar, const unsigned int version, const index_loader_type &lm, ordered_non_unique_tag)
Definition: ord_index_impl.hpp:1327
boost::multi_index::detail::ordered_index_impl::ordered_index_impl
ordered_index_impl(const ordered_index_impl< KeyFromValue, Compare, SuperMeta, TagList, Category, AugmentPolicy > &x)
Definition: ord_index_impl.hpp:603
boost::multi_index::detail::ordered_index_impl::key_comp
key_compare key_comp() const
Definition: ord_index_impl.hpp:485
boost::multi_index::detail::ordered_index_side
ordered_index_side
Definition: ord_index_node.hpp:65
boost::multi_index::detail::ordered_index_impl::count
size_type count(const CompatibleKey &x, const CompatibleCompare &comp) const
Definition: ord_index_impl.hpp:514
boost::multi_index::detail::ordered_index_impl::hinted_link_point
bool hinted_link_point(key_param_type k, node_type *position, link_info &inf, ordered_non_unique_tag)
Definition: ord_index_impl.hpp:1106
ord_index_node.hpp
safe_mode.hpp
index_node_base.hpp
boost::multi_index::detail::ordered_index_impl::rend
const_reverse_iterator rend() const BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:258
boost::multi_index::detail::ordered_index_impl::difference_type
std::ptrdiff_t difference_type
Definition: ord_index_impl.hpp:178
std
boost::multi_index::detail::ordered_index_impl::allocator_type
super::final_allocator_type allocator_type
Definition: ord_index_impl.hpp:163
boost::multi_index::detail::ordered_index_impl::range
std::pair< iterator, iterator > range(LowerBounder lower, UpperBounder, upper_unbounded_tag) const
Definition: ord_index_impl.hpp:1253
boost::multi_index::detail::to_left
@ to_left
Definition: ord_index_node.hpp:65
boost::multi_index::detail::ordered_index_impl::modify
bool modify(iterator position, Modifier mod, Rollback back_)
Definition: ord_index_impl.hpp:423
boost::multi_index::detail::ordered_index_impl::const_iterator
iterator const_iterator
Definition: ord_index_impl.hpp:175
boost::mpl::if_
Definition: dmc/basic_bind.hpp:374
boost::multi_index::detail::ordered_index::operator=
ordered_index & operator=(const ordered_index &x)
Definition: ord_index_impl.hpp:1399
boost::multi_index::detail::ordered_index_impl::insert
void insert(InputIterator first, InputIterator last)
Definition: ord_index_impl.hpp:327
boost::multi_index::detail::ordered_index_node::decrement
static void decrement(ordered_index_node *&x)
Definition: ord_index_node.hpp:644
bidir_node_iterator.hpp
boost::multi_index::detail::ordered_index_impl::emplace_impl
std::pair< iterator, bool > emplace_impl(BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)
Definition: ord_index_impl.hpp:1193
boost::multi_index::detail::ordered_non_unique_tag
Definition: ord_index_impl.hpp:111
BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT
#define BOOST_MULTI_INDEX_ORD_INDEX_CHECK_INVARIANT
Definition: ord_index_impl.hpp:92
boost::multi_index::detail::swap
void swap(auto_space< T, Allocator > &x, auto_space< T, Allocator > &y)
Definition: auto_space.hpp:80
BOOST_RETHROW
#define BOOST_RETHROW
Definition: core/no_exceptions_support.hpp:29
boost::multi_index::detail::ordered_index_impl::iterator
bidir_node_iterator< node_type > iterator
Definition: ord_index_impl.hpp:172
true_
bool_< true > true_
Definition: bool_fwd.hpp:21
boost::multi_index::detail::ordered_index_impl::index_saver_type
super::index_saver_type index_saver_type
Definition: ord_index_impl.hpp:207
boost::multi_index::detail::ordered_index_impl::emplace_hint_impl
emplace_hint_impl
Definition: ord_index_impl.hpp:290
boost::multi_index::detail::ordered_index_upper_bound
Node * ordered_index_upper_bound(Node *top, Node *y, const KeyFromValue &key, const CompatibleKey &x, const CompatibleCompare &comp)
Definition: ord_index_ops.hpp:161
boost::multi_index::detail::ordered_index_impl::rbegin
reverse_iterator rbegin() BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:252
boost::call_traits
Definition: detail/call_traits.hpp:74
boost::archive::archive_exception
Definition: archive_exception.hpp:42
boost::multi_index::detail::ordered_index_impl::crend
const_reverse_iterator crend() const BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:266
boost::multi_index::detail::ordered_index_impl::value_comp
value_compare value_comp() const
Definition: ord_index_impl.hpp:486
boost::multi_index::detail::ordered_index_impl::emplace_return_type
std::pair< iterator, bool > emplace_return_type
Definition: ord_index_impl.hpp:226
boost::multi_index::detail::to_right
@ to_right
Definition: ord_index_node.hpp:65
boost::multi_index::detail::operator>
bool operator>(const ordered_index< KeyFromValue1, Compare1, SuperMeta1, TagList1, Category1, AugmentPolicy1 > &x, const ordered_index< KeyFromValue2, Compare2, SuperMeta2, TagList2, Category2, AugmentPolicy2 > &y)
Definition: ord_index_impl.hpp:1486
BOOST_CATCH_END
#define BOOST_CATCH_END
Definition: core/no_exceptions_support.hpp:30
core.hpp
boost::multi_index::detail::ordered_index_impl::header
node_type * header() const
Definition: ord_index_impl.hpp:982
boost::multi_index::detail::ordered_index_impl::modify_rollback_
bool modify_rollback_(node_type *x)
Definition: ord_index_impl.hpp:885
boost::multi_index::detail::ordered_index_impl::rearranger
void rearranger(node_type *position, node_type *x)
Definition: ord_index_impl.hpp:1339
BOOST_MULTI_INDEX_CHECK_VALID_RANGE
#define BOOST_MULTI_INDEX_CHECK_VALID_RANGE(it0, it1)
Definition: safe_mode.hpp:88
modify_key_adaptor.hpp
boost::multi_index::detail::ordered_index_impl::key_type
KeyFromValue::result_type key_type
Definition: ord_index_impl.hpp:156
throw_exception.hpp
boost::multi_index::detail::ordered_index_node_impl::pointer
super::pointer pointer
Definition: ord_index_node.hpp:247
boost::multi_index::detail::ordered_index_impl::copy_map_type
super::copy_map_type copy_map_type
Definition: ord_index_impl.hpp:204
lower
lower
boost::multi_index::detail::ordered_index::ordered_index
ordered_index(const ordered_index &x, do_not_copy_elements_tag)
Definition: ord_index_impl.hpp:1421
boost::multi_index::detail::ordered_index_impl::node_impl_type
node_type::impl_type node_impl_type
Definition: ord_index_impl.hpp:150
boost::multi_index::detail::ordered_index_impl::const_reference
allocator_type::const_reference const_reference
Definition: ord_index_impl.hpp:165
do_not_copy_elements_tag.hpp
ord_index_ops.hpp
boost::multi_index::detail::ordered_index_impl
Definition: ord_index_impl.hpp:123
boost::multi_index::detail::ordered_index_impl::crbegin
const_reverse_iterator crbegin() const BOOST_NOEXCEPT
Definition: ord_index_impl.hpp:264
boost::multi_index::detail::ordered_index_impl::node_type
ordered_index_node< AugmentPolicy, typename super::node_type > node_type
Definition: ord_index_impl.hpp:147
boost::multi_index::detail::ordered_index_impl::root
node_type * root() const
Definition: ord_index_impl.hpp:983
workaround.hpp
boost::multi_index::detail::ordered_index_impl::save_
void save_(Archive &ar, const unsigned int version, const index_saver_type &sm, ordered_unique_tag) const
Definition: ord_index_impl.hpp:1297
boost::tuples::cons
Definition: tuple_basic.hpp:72
boost::multi_index::detail::ordered_index_impl::ordered_index_impl
ordered_index_impl(const ordered_index_impl< KeyFromValue, Compare, SuperMeta, TagList, Category, AugmentPolicy > &x, do_not_copy_elements_tag)
Definition: ord_index_impl.hpp:620
boost::multi_index::detail::ordered_index_impl::in_place
bool in_place(value_param_type v, node_type *x, ordered_non_unique_tag)
Definition: ord_index_impl.hpp:1170
boost::multi_index::detail::ordered_index_impl::swap_elements_
void swap_elements_(ordered_index_impl< KeyFromValue, Compare, SuperMeta, TagList, Category, AugmentPolicy > &x)
Definition: ord_index_impl.hpp:781
boost::multi_index::detail::ordered_index::ctor_args_list
super::ctor_args_list ctor_args_list
Definition: ord_index_impl.hpp:1390
if.hpp
archive_exception.hpp
boost::multi_index::detail::ordered_index_impl::hinted_link_point
bool hinted_link_point(key_param_type k, node_type *position, link_info &inf, ordered_unique_tag)
Definition: ord_index_impl.hpp:1068
BOOST_MULTI_INDEX_FORWARD_PARAM_PACK
#define BOOST_MULTI_INDEX_FORWARD_PARAM_PACK
Definition: vartempl_support.hpp:210
boost::multi_index::detail::ordered_index_impl::count
size_type count(const CompatibleKey &x) const
Definition: ord_index_impl.hpp:508
boost::multi_index::detail::ordered_index_impl::empty_initialize
void empty_initialize()
Definition: ord_index_impl.hpp:988
BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR
#define BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(it)
Definition: safe_mode.hpp:63
boost::multi_index::detail::ordered_index_impl::const_pointer
allocator_type::const_pointer const_pointer
Definition: ord_index_impl.hpp:180
boost::multi_index::detail::ordered_index_impl::node_impl_pointer
node_impl_type::pointer node_impl_pointer
Definition: ord_index_impl.hpp:151
boost::multi_index::detail::operator<
bool operator<(const random_access_iter_adaptor_base< Derived, Base > &x, const random_access_iter_adaptor_base< Derived, Base > &y)
Definition: iter_adaptor.hpp:264
boost::multi_index::detail::bidir_node_iterator::get_node
Node * get_node() const
Definition: bidir_node_iterator.hpp:94
boost::multi_index::detail::ordered_index_impl::replace_
bool replace_(value_param_type v, node_type *x, Variant variant)
Definition: ord_index_impl.hpp:793
boost::multi_index::detail::ordered_index_lower_bound
Node * ordered_index_lower_bound(Node *top, Node *y, const KeyFromValue &key, const CompatibleKey &x, const CompatibleCompare &comp)
Definition: ord_index_ops.hpp:115


sick_visionary_ros
Author(s): SICK AG TechSupport 3D Snapshot
autogenerated on Thu Feb 8 2024 03:45:35