| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545 | /* Multiply indexed container. * * Copyright 2003-2020 Joaquin M Lopez Munoz. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) * * See http://www.boost.org/libs/multi_index for library home page. */#ifndef BOOST_MULTI_INDEX_HPP#define BOOST_MULTI_INDEX_HPP#if defined(_MSC_VER)#pragma once#endif#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */#include <algorithm>#include <boost/core/addressof.hpp>#include <boost/detail/no_exceptions_support.hpp>#include <boost/detail/workaround.hpp>#include <boost/move/core.hpp>#include <boost/move/utility_core.hpp>#include <boost/mpl/at.hpp>#include <boost/mpl/contains.hpp>#include <boost/mpl/find_if.hpp>#include <boost/mpl/identity.hpp>#include <boost/mpl/int.hpp>#include <boost/mpl/size.hpp>#include <boost/mpl/deref.hpp>#include <boost/multi_index_container_fwd.hpp>#include <boost/multi_index/detail/access_specifier.hpp>#include <boost/multi_index/detail/adl_swap.hpp>#include <boost/multi_index/detail/allocator_traits.hpp>#include <boost/multi_index/detail/base_type.hpp>#include <boost/multi_index/detail/do_not_copy_elements_tag.hpp>#include <boost/multi_index/detail/converter.hpp>#include <boost/multi_index/detail/header_holder.hpp>#include <boost/multi_index/detail/has_tag.hpp>#include <boost/multi_index/detail/no_duplicate_tags.hpp>#include <boost/multi_index/detail/safe_mode.hpp>#include <boost/multi_index/detail/scope_guard.hpp>#include <boost/multi_index/detail/vartempl_support.hpp>#include <boost/static_assert.hpp>#include <boost/type_traits/integral_constant.hpp>#include <boost/type_traits/is_same.hpp>#include <boost/utility/base_from_member.hpp>#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)#include <initializer_list>#endif#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)#include <boost/multi_index/detail/archive_constructed.hpp>#include <boost/multi_index/detail/serialization_version.hpp>#include <boost/serialization/collection_size_type.hpp>#include <boost/serialization/nvp.hpp>#include <boost/serialization/split_member.hpp>#include <boost/serialization/version.hpp>#include <boost/throw_exception.hpp> #endif#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)#include <boost/multi_index/detail/invariant_assert.hpp>#define BOOST_MULTI_INDEX_CHECK_INVARIANT_OF(x)                              \  detail::scope_guard BOOST_JOIN(check_invariant_,__LINE__)=                 \    detail::make_obj_guard(x,&multi_index_container::check_invariant_);      \  BOOST_JOIN(check_invariant_,__LINE__).touch();#define BOOST_MULTI_INDEX_CHECK_INVARIANT                                    \  BOOST_MULTI_INDEX_CHECK_INVARIANT_OF(*this)#else#define BOOST_MULTI_INDEX_CHECK_INVARIANT_OF(x)#define BOOST_MULTI_INDEX_CHECK_INVARIANT#endifnamespace boost{namespace multi_index{namespace detail{struct unequal_alloc_move_ctor_tag{};} /* namespace multi_index::detail */#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500))#pragma warning(push)#pragma warning(disable:4522) /* spurious warning on multiple operator=()'s */#endiftemplate<typename Value,typename IndexSpecifierList,typename Allocator>class multi_index_container:  private ::boost::base_from_member<    typename detail::rebind_alloc_for<      Allocator,      typename detail::multi_index_node_type<        Value,IndexSpecifierList,Allocator>::type    >::type  >,  BOOST_MULTI_INDEX_PRIVATE_IF_MEMBER_TEMPLATE_FRIENDS detail::header_holder<    typename detail::allocator_traits<      typename detail::rebind_alloc_for<        Allocator,        typename detail::multi_index_node_type<          Value,IndexSpecifierList,Allocator>::type      >::type    >::pointer,    multi_index_container<Value,IndexSpecifierList,Allocator> >,  public detail::multi_index_base_type<    Value,IndexSpecifierList,Allocator>::type{#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\    BOOST_WORKAROUND(__MWERKS__,<=0x3003)/* The "ISO C++ Template Parser" option in CW8.3 has a problem with the * lifetime of const references bound to temporaries --precisely what * scopeguards are. */#pragma parse_mfunc_templ off#endifprivate:  BOOST_COPYABLE_AND_MOVABLE(multi_index_container)#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)  template <typename,typename,typename> friend class  detail::index_base;  template <typename,typename>          friend struct detail::header_holder;  template <typename,typename>          friend struct detail::converter;#endif  typedef typename detail::multi_index_base_type<      Value,IndexSpecifierList,Allocator>::type    super;  typedef typename detail::rebind_alloc_for<    Allocator,    typename super::node_type  >::type                                          node_allocator;  typedef detail::allocator_traits<node_allocator> node_alloc_traits;  typedef typename node_alloc_traits::pointer      node_pointer;  typedef ::boost::base_from_member<    node_allocator>                                bfm_allocator;  typedef detail::header_holder<    node_pointer,    multi_index_container>                         bfm_header;public:  /* All types are inherited from super, a few are explicitly   * brought forward here to save us some typename's.   */  typedef typename super::ctor_args_list           ctor_args_list;  typedef IndexSpecifierList                       index_specifier_type_list;   typedef typename super::index_type_list          index_type_list;  typedef typename super::iterator_type_list       iterator_type_list;  typedef typename super::const_iterator_type_list const_iterator_type_list;  typedef typename super::value_type               value_type;  typedef typename super::final_allocator_type     allocator_type;  typedef typename super::size_type                size_type;  typedef typename super::iterator                 iterator;  typedef typename super::const_iterator           const_iterator;  BOOST_STATIC_ASSERT(    detail::no_duplicate_tags_in_index_list<index_type_list>::value);  /* global project() needs to see this publicly */  typedef typename super::node_type node_type;  /* construct/copy/destroy */  multi_index_container():    bfm_allocator(allocator_type()),    super(ctor_args_list(),bfm_allocator::member),    node_count(0)  {    BOOST_MULTI_INDEX_CHECK_INVARIANT;  }  explicit multi_index_container(    const ctor_args_list& args_list,#if BOOST_WORKAROUND(__IBMCPP__,<=600)    /* VisualAge seems to have an ETI issue with the default value for     * argument al.     */    const allocator_type& al=      typename mpl::identity<multi_index_container>::type::        allocator_type()):#else    const allocator_type& al=allocator_type()):#endif    bfm_allocator(al),    super(args_list,bfm_allocator::member),    node_count(0)  {    BOOST_MULTI_INDEX_CHECK_INVARIANT;  }  explicit multi_index_container(const allocator_type& al):    bfm_allocator(al),    super(ctor_args_list(),bfm_allocator::member),    node_count(0)  {    BOOST_MULTI_INDEX_CHECK_INVARIANT;  }    template<typename InputIterator>  multi_index_container(    InputIterator first,InputIterator last,#if BOOST_WORKAROUND(__IBMCPP__,<=600)    /* VisualAge seems to have an ETI issue with the default values     * for arguments args_list and al.     */    const ctor_args_list& args_list=      typename mpl::identity<multi_index_container>::type::        ctor_args_list(),    const allocator_type& al=      typename mpl::identity<multi_index_container>::type::        allocator_type()):#else    const ctor_args_list& args_list=ctor_args_list(),    const allocator_type& al=allocator_type()):#endif    bfm_allocator(al),    super(args_list,bfm_allocator::member),    node_count(0)  {    BOOST_MULTI_INDEX_CHECK_INVARIANT;    BOOST_TRY{      iterator hint=super::end();      for(;first!=last;++first){        hint=super::make_iterator(          insert_ref_(*first,hint.get_node()).first);        ++hint;      }    }    BOOST_CATCH(...){      clear_();      BOOST_RETHROW;    }    BOOST_CATCH_END  }#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)  multi_index_container(    std::initializer_list<Value> list,    const ctor_args_list& args_list=ctor_args_list(),    const allocator_type& al=allocator_type()):    bfm_allocator(al),    super(args_list,bfm_allocator::member),    node_count(0)  {    BOOST_MULTI_INDEX_CHECK_INVARIANT;    BOOST_TRY{      typedef const Value* init_iterator;      iterator hint=super::end();      for(init_iterator first=list.begin(),last=list.end();          first!=last;++first){        hint=super::make_iterator(insert_(*first,hint.get_node()).first);        ++hint;      }    }    BOOST_CATCH(...){      clear_();      BOOST_RETHROW;    }    BOOST_CATCH_END  }#endif  multi_index_container(    const multi_index_container<Value,IndexSpecifierList,Allocator>& x):    bfm_allocator(      node_alloc_traits::select_on_container_copy_construction(        x.bfm_allocator::member)),    bfm_header(),    super(x),    node_count(0)  {    copy_construct_from(x);  }  multi_index_container(BOOST_RV_REF(multi_index_container) x):    bfm_allocator(boost::move(x.bfm_allocator::member)),    bfm_header(),    super(x,detail::do_not_copy_elements_tag()),    node_count(0)  {    BOOST_MULTI_INDEX_CHECK_INVARIANT;    BOOST_MULTI_INDEX_CHECK_INVARIANT_OF(x);    swap_elements_(x);  }  multi_index_container(    const multi_index_container<Value,IndexSpecifierList,Allocator>& x,    const allocator_type& al):    bfm_allocator(al),    bfm_header(),    super(x),    node_count(0)  {    copy_construct_from(x);  }  multi_index_container(    BOOST_RV_REF(multi_index_container) x,const allocator_type& al):    bfm_allocator(al),    bfm_header(),    super(x,detail::do_not_copy_elements_tag()),    node_count(0)  {    BOOST_MULTI_INDEX_CHECK_INVARIANT;    BOOST_MULTI_INDEX_CHECK_INVARIANT_OF(x);    if(al==x.get_allocator()){      swap_elements_(x);    }    else{      multi_index_container y(x,al,detail::unequal_alloc_move_ctor_tag());      swap_elements_(y);    }  }  ~multi_index_container()  {    delete_all_nodes_();  }#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)  /* As per http://www.boost.org/doc/html/move/emulation_limitations.html   * #move.emulation_limitations.assignment_operator   */  multi_index_container<Value,IndexSpecifierList,Allocator>& operator=(    const multi_index_container<Value,IndexSpecifierList,Allocator>& x)  {    multi_index_container y(      x,      node_alloc_traits::propagate_on_container_copy_assignment::value?        x.get_allocator():this->get_allocator());    swap_(y,boost::true_type() /* swap_allocators */);    return *this;  }#endif  multi_index_container<Value,IndexSpecifierList,Allocator>& operator=(    BOOST_COPY_ASSIGN_REF(multi_index_container) x)  {    multi_index_container y(      x,      node_alloc_traits::propagate_on_container_copy_assignment::value?        x.get_allocator():this->get_allocator());    swap_(y,boost::true_type() /* swap_allocators */);    return *this;  }  multi_index_container<Value,IndexSpecifierList,Allocator>& operator=(    BOOST_RV_REF(multi_index_container) x)  {#if !defined(BOOST_NO_CXX17_IF_CONSTEXPR)#define BOOST_MULTI_INDEX_IF_CONSTEXPR if constexpr#else#define BOOST_MULTI_INDEX_IF_CONSTEXPR if#if defined(BOOST_MSVC)#pragma warning(push)#pragma warning(disable:4127) /* conditional expression is constant */#endif#endif    BOOST_MULTI_INDEX_IF_CONSTEXPR(      node_alloc_traits::propagate_on_container_move_assignment::value){      swap_(x,boost::true_type() /* swap_allocators */);    }    else if(this->get_allocator()==x.get_allocator()){      swap_(x,boost::false_type() /* swap_allocators */);    }    else{      multi_index_container y(boost::move(x),this->get_allocator());      swap_(y,boost::false_type() /* swap_allocators */);    }    return *this;#undef BOOST_MULTI_INDEX_IF_CONSTEXPR #if defined(BOOST_NO_CXX17_IF_CONSTEXPR)&&defined(BOOST_MSVC)#pragma warning(pop) /* C4127 */#endif  }#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)  multi_index_container<Value,IndexSpecifierList,Allocator>& operator=(    std::initializer_list<Value> list)  {    BOOST_MULTI_INDEX_CHECK_INVARIANT;    typedef const Value* init_iterator;    multi_index_container x(*this,detail::do_not_copy_elements_tag());        iterator hint=x.end();    for(init_iterator first=list.begin(),last=list.end();        first!=last;++first){      hint=x.make_iterator(x.insert_(*first,hint.get_node()).first);      ++hint;    }    x.swap_elements_(*this);    return*this;  }#endif  allocator_type get_allocator()const BOOST_NOEXCEPT  {    return allocator_type(bfm_allocator::member);  }  /* retrieval of indices by number */#if !defined(BOOST_NO_MEMBER_TEMPLATES)  template<int N>  struct nth_index  {    BOOST_STATIC_ASSERT(N>=0&&N<mpl::size<index_type_list>::type::value);    typedef typename mpl::at_c<index_type_list,N>::type type;  };  template<int N>  typename nth_index<N>::type& get()BOOST_NOEXCEPT  {    BOOST_STATIC_ASSERT(N>=0&&N<mpl::size<index_type_list>::type::value);    return *this;  }  template<int N>  const typename nth_index<N>::type& get()const BOOST_NOEXCEPT  {    BOOST_STATIC_ASSERT(N>=0&&N<mpl::size<index_type_list>::type::value);    return *this;  }#endif  /* retrieval of indices by tag */#if !defined(BOOST_NO_MEMBER_TEMPLATES)  template<typename Tag>  struct index  {    typedef typename mpl::find_if<      index_type_list,      detail::has_tag<Tag>    >::type                                    iter;    BOOST_STATIC_CONSTANT(      bool,index_found=!(is_same<iter,typename mpl::end<index_type_list>::type >::value));    BOOST_STATIC_ASSERT(index_found);    typedef typename mpl::deref<iter>::type    type;  };  template<typename Tag>  typename index<Tag>::type& get()BOOST_NOEXCEPT  {    return *this;  }  template<typename Tag>  const typename index<Tag>::type& get()const BOOST_NOEXCEPT  {    return *this;  }#endif  /* projection of iterators by number */#if !defined(BOOST_NO_MEMBER_TEMPLATES)  template<int N>  struct nth_index_iterator  {    typedef typename nth_index<N>::type::iterator type;  };  template<int N>  struct nth_index_const_iterator  {    typedef typename nth_index<N>::type::const_iterator type;  };  template<int N,typename IteratorType>  typename nth_index_iterator<N>::type project(IteratorType it)  {    typedef typename nth_index<N>::type index_type;#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* fails in Sun C++ 5.7 */    BOOST_STATIC_ASSERT(      (mpl::contains<iterator_type_list,IteratorType>::value));#endif    BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);    BOOST_MULTI_INDEX_CHECK_IS_OWNER(      it,static_cast<typename IteratorType::container_type&>(*this));    return index_type::make_iterator(static_cast<node_type*>(it.get_node()));  }  template<int N,typename IteratorType>  typename nth_index_const_iterator<N>::type project(IteratorType it)const  {    typedef typename nth_index<N>::type index_type;#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* fails in Sun C++ 5.7 */    BOOST_STATIC_ASSERT((      mpl::contains<iterator_type_list,IteratorType>::value||      mpl::contains<const_iterator_type_list,IteratorType>::value));#endif    BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);    BOOST_MULTI_INDEX_CHECK_IS_OWNER(      it,static_cast<const typename IteratorType::container_type&>(*this));    return index_type::make_iterator(static_cast<node_type*>(it.get_node()));  }#endif  /* projection of iterators by tag */#if !defined(BOOST_NO_MEMBER_TEMPLATES)  template<typename Tag>  struct index_iterator  {    typedef typename index<Tag>::type::iterator type;  };  template<typename Tag>  struct index_const_iterator  {    typedef typename index<Tag>::type::const_iterator type;  };  template<typename Tag,typename IteratorType>  typename index_iterator<Tag>::type project(IteratorType it)  {    typedef typename index<Tag>::type index_type;#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* fails in Sun C++ 5.7 */    BOOST_STATIC_ASSERT(      (mpl::contains<iterator_type_list,IteratorType>::value));#endif    BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);    BOOST_MULTI_INDEX_CHECK_IS_OWNER(      it,static_cast<typename IteratorType::container_type&>(*this));    return index_type::make_iterator(static_cast<node_type*>(it.get_node()));  }  template<typename Tag,typename IteratorType>  typename index_const_iterator<Tag>::type project(IteratorType it)const  {    typedef typename index<Tag>::type index_type;#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* fails in Sun C++ 5.7 */    BOOST_STATIC_ASSERT((      mpl::contains<iterator_type_list,IteratorType>::value||      mpl::contains<const_iterator_type_list,IteratorType>::value));#endif    BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);    BOOST_MULTI_INDEX_CHECK_IS_OWNER(      it,static_cast<const typename IteratorType::container_type&>(*this));    return index_type::make_iterator(static_cast<node_type*>(it.get_node()));  }#endifBOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS:  typedef typename super::copy_map_type copy_map_type;  multi_index_container(    multi_index_container<Value,IndexSpecifierList,Allocator>& x,    const allocator_type& al,    detail::unequal_alloc_move_ctor_tag):    bfm_allocator(al),    bfm_header(),    super(x),    node_count(0)  {    BOOST_MULTI_INDEX_CHECK_INVARIANT_OF(x);    BOOST_TRY{      copy_map_type map(bfm_allocator::member,x.size(),x.header(),header());      for(const_iterator it=x.begin(),it_end=x.end();it!=it_end;++it){        map.move_clone(it.get_node());      }      super::copy_(x,map);      map.release();      node_count=x.size();      x.clear();    }    BOOST_CATCH(...){      x.clear();      BOOST_RETHROW;    }    BOOST_CATCH_END    /* Not until this point are the indices required to be consistent,     * hence the position of the invariant checker.     */    BOOST_MULTI_INDEX_CHECK_INVARIANT;  }#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)  multi_index_container(    const multi_index_container<Value,IndexSpecifierList,Allocator>& x,    detail::do_not_copy_elements_tag):    bfm_allocator(x.bfm_allocator::member),    bfm_header(),    super(x,detail::do_not_copy_elements_tag()),    node_count(0)  {    BOOST_MULTI_INDEX_CHECK_INVARIANT;  }#endif  void copy_construct_from(    const multi_index_container<Value,IndexSpecifierList,Allocator>& x)  {    copy_map_type map(bfm_allocator::member,x.size(),x.header(),header());    for(const_iterator it=x.begin(),it_end=x.end();it!=it_end;++it){      map.copy_clone(it.get_node());    }    super::copy_(x,map);    map.release();    node_count=x.size();    /* Not until this point are the indices required to be consistent,     * hence the position of the invariant checker.     */    BOOST_MULTI_INDEX_CHECK_INVARIANT;  }  node_type* header()const  {    return &*bfm_header::member;  }  node_type* allocate_node()  {    return &*node_alloc_traits::allocate(bfm_allocator::member,1);  }  void deallocate_node(node_type* x)  {    node_alloc_traits::deallocate(      bfm_allocator::member,static_cast<node_pointer>(x),1);  }  void construct_value(node_type* x,const Value& v)  {    node_alloc_traits::construct(      bfm_allocator::member,boost::addressof(x->value()),v);  }  void construct_value(node_type* x,BOOST_RV_REF(Value) v)  {    node_alloc_traits::construct(      bfm_allocator::member,boost::addressof(x->value()),boost::move(v));  }  BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG(    void,construct_value,vartempl_construct_value_impl,node_type*,x)  void destroy_value(node_type* x)  {    node_alloc_traits::destroy(      bfm_allocator::member,boost::addressof(x->value()));  }  bool empty_()const  {    return node_count==0;  }  size_type size_()const  {    return node_count;  }  size_type max_size_()const  {    return static_cast<size_type>(-1);  }  template<typename Variant>  std::pair<node_type*,bool> insert_(const Value& v,Variant variant)  {    node_type* x=0;    node_type* res=super::insert_(v,x,variant);    if(res==x){      ++node_count;      return std::pair<node_type*,bool>(res,true);    }    else{      return std::pair<node_type*,bool>(res,false);    }  }  std::pair<node_type*,bool> insert_(const Value& v)  {    return insert_(v,detail::lvalue_tag());  }  std::pair<node_type*,bool> insert_rv_(const Value& v)  {    return insert_(v,detail::rvalue_tag());  }  template<typename T>  std::pair<node_type*,bool> insert_ref_(T& t)  {    node_type* x=allocate_node();    BOOST_TRY{      construct_value(x,t);      BOOST_TRY{        node_type* res=super::insert_(x->value(),x,detail::emplaced_tag());        if(res==x){          ++node_count;          return std::pair<node_type*,bool>(res,true);        }        else{          destroy_value(x);          deallocate_node(x);          return std::pair<node_type*,bool>(res,false);        }      }      BOOST_CATCH(...){        destroy_value(x);        BOOST_RETHROW;      }      BOOST_CATCH_END    }    BOOST_CATCH(...){      deallocate_node(x);      BOOST_RETHROW;    }    BOOST_CATCH_END  }  std::pair<node_type*,bool> insert_ref_(const value_type& x)  {    return insert_(x);  }  std::pair<node_type*,bool> insert_ref_(value_type& x)  {    return insert_(x);  }  template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>  std::pair<node_type*,bool> emplace_(    BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)  {    node_type* x=allocate_node();    BOOST_TRY{      construct_value(x,BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);      BOOST_TRY{        node_type* res=super::insert_(x->value(),x,detail::emplaced_tag());        if(res==x){          ++node_count;          return std::pair<node_type*,bool>(res,true);        }        else{          destroy_value(x);          deallocate_node(x);          return std::pair<node_type*,bool>(res,false);        }      }      BOOST_CATCH(...){        destroy_value(x);        BOOST_RETHROW;      }      BOOST_CATCH_END    }    BOOST_CATCH(...){      deallocate_node(x);      BOOST_RETHROW;    }    BOOST_CATCH_END  }  template<typename Variant>  std::pair<node_type*,bool> insert_(    const Value& v,node_type* position,Variant variant)  {    node_type* x=0;    node_type* res=super::insert_(v,position,x,variant);    if(res==x){      ++node_count;      return std::pair<node_type*,bool>(res,true);    }    else{      return std::pair<node_type*,bool>(res,false);    }  }  std::pair<node_type*,bool> insert_(const Value& v,node_type* position)  {    return insert_(v,position,detail::lvalue_tag());  }  std::pair<node_type*,bool> insert_rv_(const Value& v,node_type* position)  {    return insert_(v,position,detail::rvalue_tag());  }  template<typename T>  std::pair<node_type*,bool> insert_ref_(    T& t,node_type* position)  {    node_type* x=allocate_node();    BOOST_TRY{      construct_value(x,t);      BOOST_TRY{        node_type* res=super::insert_(          x->value(),position,x,detail::emplaced_tag());        if(res==x){          ++node_count;          return std::pair<node_type*,bool>(res,true);        }        else{          destroy_value(x);          deallocate_node(x);          return std::pair<node_type*,bool>(res,false);        }      }      BOOST_CATCH(...){        destroy_value(x);        BOOST_RETHROW;      }      BOOST_CATCH_END    }    BOOST_CATCH(...){      deallocate_node(x);      BOOST_RETHROW;    }    BOOST_CATCH_END  }  std::pair<node_type*,bool> insert_ref_(    const value_type& x,node_type* position)  {    return insert_(x,position);  }  std::pair<node_type*,bool> insert_ref_(    value_type& x,node_type* position)  {    return insert_(x,position);  }  template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>  std::pair<node_type*,bool> emplace_hint_(    node_type* position,    BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)  {    node_type* x=allocate_node();    BOOST_TRY{      construct_value(x,BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);      BOOST_TRY{        node_type* res=super::insert_(          x->value(),position,x,detail::emplaced_tag());        if(res==x){          ++node_count;          return std::pair<node_type*,bool>(res,true);        }        else{          destroy_value(x);          deallocate_node(x);          return std::pair<node_type*,bool>(res,false);        }      }      BOOST_CATCH(...){        destroy_value(x);        BOOST_RETHROW;      }      BOOST_CATCH_END    }    BOOST_CATCH(...){      deallocate_node(x);      BOOST_RETHROW;    }    BOOST_CATCH_END  }  void erase_(node_type* x)  {    --node_count;    super::erase_(x);    deallocate_node(x);  }  void delete_node_(node_type* x)  {    super::delete_node_(x);    deallocate_node(x);  }  void delete_all_nodes_()  {    super::delete_all_nodes_();  }  void clear_()  {    delete_all_nodes_();    super::clear_();    node_count=0;  }  void swap_(multi_index_container<Value,IndexSpecifierList,Allocator>& x)  {    swap_(      x,      boost::integral_constant<        bool,node_alloc_traits::propagate_on_container_swap::value>());  }  void swap_(    multi_index_container<Value,IndexSpecifierList,Allocator>& x,    boost::true_type swap_allocators)  {    detail::adl_swap(bfm_allocator::member,x.bfm_allocator::member);    std::swap(bfm_header::member,x.bfm_header::member);    super::swap_(x,swap_allocators);    std::swap(node_count,x.node_count);  }  void swap_(    multi_index_container<Value,IndexSpecifierList,Allocator>& x,    boost::false_type swap_allocators)  {    std::swap(bfm_header::member,x.bfm_header::member);    super::swap_(x,swap_allocators);    std::swap(node_count,x.node_count);  }  void swap_elements_(    multi_index_container<Value,IndexSpecifierList,Allocator>& x)  {    std::swap(bfm_header::member,x.bfm_header::member);    super::swap_elements_(x);    std::swap(node_count,x.node_count);  }  bool replace_(const Value& k,node_type* x)  {    return super::replace_(k,x,detail::lvalue_tag());  }  bool replace_rv_(const Value& k,node_type* x)  {    return super::replace_(k,x,detail::rvalue_tag());  }  template<typename Modifier>  bool modify_(Modifier& mod,node_type* x)  {    BOOST_TRY{      mod(const_cast<value_type&>(x->value()));    }    BOOST_CATCH(...){      this->erase_(x);      BOOST_RETHROW;    }    BOOST_CATCH_END    BOOST_TRY{      if(!super::modify_(x)){        deallocate_node(x);        --node_count;        return false;      }      else return true;    }    BOOST_CATCH(...){      deallocate_node(x);      --node_count;      BOOST_RETHROW;    }    BOOST_CATCH_END  }  template<typename Modifier,typename Rollback>  bool modify_(Modifier& mod,Rollback& back_,node_type* x)  {    BOOST_TRY{      mod(const_cast<value_type&>(x->value()));    }    BOOST_CATCH(...){      this->erase_(x);      BOOST_RETHROW;    }    BOOST_CATCH_END    bool b;    BOOST_TRY{      b=super::modify_rollback_(x);    }    BOOST_CATCH(...){      BOOST_TRY{        back_(const_cast<value_type&>(x->value()));        if(!super::check_rollback_(x))this->erase_(x);        BOOST_RETHROW;      }      BOOST_CATCH(...){        this->erase_(x);        BOOST_RETHROW;      }      BOOST_CATCH_END    }    BOOST_CATCH_END    BOOST_TRY{      if(!b){        back_(const_cast<value_type&>(x->value()));        if(!super::check_rollback_(x))this->erase_(x);        return false;      }      else return true;    }    BOOST_CATCH(...){      this->erase_(x);      BOOST_RETHROW;    }    BOOST_CATCH_END  }#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)  /* serialization */  friend class boost::serialization::access;  BOOST_SERIALIZATION_SPLIT_MEMBER()  typedef typename super::index_saver_type        index_saver_type;  typedef typename super::index_loader_type       index_loader_type;  template<class Archive>  void save(Archive& ar,const unsigned int version)const  {    const serialization::collection_size_type       s(size_());    const detail::serialization_version<value_type> value_version;    ar<<serialization::make_nvp("count",s);    ar<<serialization::make_nvp("value_version",value_version);    index_saver_type sm(bfm_allocator::member,s);    for(iterator it=super::begin(),it_end=super::end();it!=it_end;++it){      serialization::save_construct_data_adl(        ar,boost::addressof(*it),value_version);      ar<<serialization::make_nvp("item",*it);      sm.add(it.get_node(),ar,version);    }    sm.add_track(header(),ar,version);    super::save_(ar,version,sm);  }  template<class Archive>  void load(Archive& ar,const unsigned int version)  {    BOOST_MULTI_INDEX_CHECK_INVARIANT;    clear_();     serialization::collection_size_type       s;    detail::serialization_version<value_type> value_version;    if(version<1){      std::size_t sz;      ar>>serialization::make_nvp("count",sz);      s=static_cast<serialization::collection_size_type>(sz);    }    else{      ar>>serialization::make_nvp("count",s);    }    if(version<2){      value_version=0;    }    else{      ar>>serialization::make_nvp("value_version",value_version);    }    index_loader_type lm(bfm_allocator::member,s);    for(std::size_t n=0;n<s;++n){      detail::archive_constructed<Value> value("item",ar,value_version);      std::pair<node_type*,bool> p=insert_rv_(        value.get(),super::end().get_node());      if(!p.second)throw_exception(        archive::archive_exception(          archive::archive_exception::other_exception));      ar.reset_object_address(        boost::addressof(p.first->value()),boost::addressof(value.get()));      lm.add(p.first,ar,version);    }    lm.add_track(header(),ar,version);    super::load_(ar,version,lm);  }#endif#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)  /* invariant stuff */  bool invariant_()const  {    return super::invariant_();  }  void check_invariant_()const  {    BOOST_MULTI_INDEX_INVARIANT_ASSERT(invariant_());  }#endifprivate:  template<BOOST_MULTI_INDEX_TEMPLATE_PARAM_PACK>  void vartempl_construct_value_impl(    node_type* x,BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK)  {    node_alloc_traits::construct(      bfm_allocator::member,boost::addressof(x->value()),      BOOST_MULTI_INDEX_FORWARD_PARAM_PACK);  }  size_type node_count;#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\    BOOST_WORKAROUND(__MWERKS__,<=0x3003)#pragma parse_mfunc_templ reset#endif};#if BOOST_WORKAROUND(BOOST_MSVC,BOOST_TESTED_AT(1500))#pragma warning(pop) /* C4522 */#endif/* retrieval of indices by number */template<typename MultiIndexContainer,int N>struct nth_index{  BOOST_STATIC_CONSTANT(    int,    M=mpl::size<typename MultiIndexContainer::index_type_list>::type::value);  BOOST_STATIC_ASSERT(N>=0&&N<M);  typedef typename mpl::at_c<    typename MultiIndexContainer::index_type_list,N>::type type;};template<int N,typename Value,typename IndexSpecifierList,typename Allocator>typename nth_index<  multi_index_container<Value,IndexSpecifierList,Allocator>,N>::type&get(  multi_index_container<Value,IndexSpecifierList,Allocator>& m)BOOST_NOEXCEPT{  typedef multi_index_container<    Value,IndexSpecifierList,Allocator>    multi_index_type;  typedef typename nth_index<    multi_index_container<      Value,IndexSpecifierList,Allocator>,    N  >::type                                  index_type;  BOOST_STATIC_ASSERT(N>=0&&    N<    mpl::size<      BOOST_DEDUCED_TYPENAME multi_index_type::index_type_list    >::type::value);  return detail::converter<multi_index_type,index_type>::index(m);}template<int N,typename Value,typename IndexSpecifierList,typename Allocator>const typename nth_index<  multi_index_container<Value,IndexSpecifierList,Allocator>,N>::type&get(  const multi_index_container<Value,IndexSpecifierList,Allocator>& m)BOOST_NOEXCEPT{  typedef multi_index_container<    Value,IndexSpecifierList,Allocator>    multi_index_type;  typedef typename nth_index<    multi_index_container<      Value,IndexSpecifierList,Allocator>,    N  >::type                                  index_type;  BOOST_STATIC_ASSERT(N>=0&&    N<    mpl::size<      BOOST_DEDUCED_TYPENAME multi_index_type::index_type_list    >::type::value);  return detail::converter<multi_index_type,index_type>::index(m);}/* retrieval of indices by tag */template<typename MultiIndexContainer,typename Tag>struct index{  typedef typename MultiIndexContainer::index_type_list index_type_list;  typedef typename mpl::find_if<    index_type_list,    detail::has_tag<Tag>  >::type                                      iter;  BOOST_STATIC_CONSTANT(    bool,index_found=!(is_same<iter,typename mpl::end<index_type_list>::type >::value));  BOOST_STATIC_ASSERT(index_found);  typedef typename mpl::deref<iter>::type       type;};template<  typename Tag,typename Value,typename IndexSpecifierList,typename Allocator>typename ::boost::multi_index::index<  multi_index_container<Value,IndexSpecifierList,Allocator>,Tag>::type&get(  multi_index_container<Value,IndexSpecifierList,Allocator>& m)BOOST_NOEXCEPT{  typedef multi_index_container<    Value,IndexSpecifierList,Allocator>         multi_index_type;  typedef typename ::boost::multi_index::index<    multi_index_container<      Value,IndexSpecifierList,Allocator>,    Tag  >::type                                       index_type;  return detail::converter<multi_index_type,index_type>::index(m);}template<  typename Tag,typename Value,typename IndexSpecifierList,typename Allocator>const typename ::boost::multi_index::index<  multi_index_container<Value,IndexSpecifierList,Allocator>,Tag>::type&get(  const multi_index_container<Value,IndexSpecifierList,Allocator>& m)BOOST_NOEXCEPT{  typedef multi_index_container<    Value,IndexSpecifierList,Allocator>         multi_index_type;  typedef typename ::boost::multi_index::index<    multi_index_container<      Value,IndexSpecifierList,Allocator>,    Tag  >::type                                       index_type;  return detail::converter<multi_index_type,index_type>::index(m);}/* projection of iterators by number */template<typename MultiIndexContainer,int N>struct nth_index_iterator{  typedef typename nth_index<MultiIndexContainer,N>::type::iterator type;};template<typename MultiIndexContainer,int N>struct nth_index_const_iterator{  typedef typename nth_index<MultiIndexContainer,N>::type::const_iterator type;};template<  int N,typename IteratorType,  typename Value,typename IndexSpecifierList,typename Allocator>typename nth_index_iterator<  multi_index_container<Value,IndexSpecifierList,Allocator>,N>::typeproject(  multi_index_container<Value,IndexSpecifierList,Allocator>& m,  IteratorType it){  typedef multi_index_container<    Value,IndexSpecifierList,Allocator>                multi_index_type;  typedef typename nth_index<multi_index_type,N>::type index_type;#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* Sun C++ 5.7 fails */  BOOST_STATIC_ASSERT((    mpl::contains<      BOOST_DEDUCED_TYPENAME multi_index_type::iterator_type_list,      IteratorType>::value));#endif  BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)  typedef detail::converter<    multi_index_type,    BOOST_DEDUCED_TYPENAME IteratorType::container_type> converter;  BOOST_MULTI_INDEX_CHECK_IS_OWNER(it,converter::index(m));#endif  return detail::converter<multi_index_type,index_type>::iterator(    m,static_cast<typename multi_index_type::node_type*>(it.get_node()));}template<  int N,typename IteratorType,  typename Value,typename IndexSpecifierList,typename Allocator>typename nth_index_const_iterator<  multi_index_container<Value,IndexSpecifierList,Allocator>,N>::typeproject(  const multi_index_container<Value,IndexSpecifierList,Allocator>& m,  IteratorType it){  typedef multi_index_container<    Value,IndexSpecifierList,Allocator>                multi_index_type;  typedef typename nth_index<multi_index_type,N>::type index_type;#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* Sun C++ 5.7 fails */  BOOST_STATIC_ASSERT((    mpl::contains<      BOOST_DEDUCED_TYPENAME multi_index_type::iterator_type_list,      IteratorType>::value||    mpl::contains<      BOOST_DEDUCED_TYPENAME multi_index_type::const_iterator_type_list,      IteratorType>::value));#endif  BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)  typedef detail::converter<    multi_index_type,    BOOST_DEDUCED_TYPENAME IteratorType::container_type> converter;  BOOST_MULTI_INDEX_CHECK_IS_OWNER(it,converter::index(m));#endif  return detail::converter<multi_index_type,index_type>::const_iterator(    m,static_cast<typename multi_index_type::node_type*>(it.get_node()));}/* projection of iterators by tag */template<typename MultiIndexContainer,typename Tag>struct index_iterator{  typedef typename ::boost::multi_index::index<    MultiIndexContainer,Tag>::type::iterator    type;};template<typename MultiIndexContainer,typename Tag>struct index_const_iterator{  typedef typename ::boost::multi_index::index<    MultiIndexContainer,Tag>::type::const_iterator type;};template<  typename Tag,typename IteratorType,  typename Value,typename IndexSpecifierList,typename Allocator>typename index_iterator<  multi_index_container<Value,IndexSpecifierList,Allocator>,Tag>::typeproject(  multi_index_container<Value,IndexSpecifierList,Allocator>& m,  IteratorType it){  typedef multi_index_container<    Value,IndexSpecifierList,Allocator>         multi_index_type;  typedef typename ::boost::multi_index::index<    multi_index_type,Tag>::type                 index_type;#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* Sun C++ 5.7 fails */  BOOST_STATIC_ASSERT((    mpl::contains<      BOOST_DEDUCED_TYPENAME multi_index_type::iterator_type_list,      IteratorType>::value));#endif  BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)  typedef detail::converter<    multi_index_type,    BOOST_DEDUCED_TYPENAME IteratorType::container_type> converter;  BOOST_MULTI_INDEX_CHECK_IS_OWNER(it,converter::index(m));#endif  return detail::converter<multi_index_type,index_type>::iterator(    m,static_cast<typename multi_index_type::node_type*>(it.get_node()));}template<  typename Tag,typename IteratorType,  typename Value,typename IndexSpecifierList,typename Allocator>typename index_const_iterator<  multi_index_container<Value,IndexSpecifierList,Allocator>,Tag>::typeproject(  const multi_index_container<Value,IndexSpecifierList,Allocator>& m,  IteratorType it){  typedef multi_index_container<    Value,IndexSpecifierList,Allocator>         multi_index_type;  typedef typename ::boost::multi_index::index<    multi_index_type,Tag>::type                 index_type;#if !defined(__SUNPRO_CC)||!(__SUNPRO_CC<0x580) /* Sun C++ 5.7 fails */  BOOST_STATIC_ASSERT((    mpl::contains<      BOOST_DEDUCED_TYPENAME multi_index_type::iterator_type_list,      IteratorType>::value||    mpl::contains<      BOOST_DEDUCED_TYPENAME multi_index_type::const_iterator_type_list,      IteratorType>::value));#endif  BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(it);#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)  typedef detail::converter<    multi_index_type,    BOOST_DEDUCED_TYPENAME IteratorType::container_type> converter;  BOOST_MULTI_INDEX_CHECK_IS_OWNER(it,converter::index(m));#endif  return detail::converter<multi_index_type,index_type>::const_iterator(    m,static_cast<typename multi_index_type::node_type*>(it.get_node()));}/* Comparison. Simple forward to first index. */template<  typename Value1,typename IndexSpecifierList1,typename Allocator1,  typename Value2,typename IndexSpecifierList2,typename Allocator2>bool operator==(  const multi_index_container<Value1,IndexSpecifierList1,Allocator1>& x,  const multi_index_container<Value2,IndexSpecifierList2,Allocator2>& y){  return get<0>(x)==get<0>(y);}template<  typename Value1,typename IndexSpecifierList1,typename Allocator1,  typename Value2,typename IndexSpecifierList2,typename Allocator2>bool operator<(  const multi_index_container<Value1,IndexSpecifierList1,Allocator1>& x,  const multi_index_container<Value2,IndexSpecifierList2,Allocator2>& y){  return get<0>(x)<get<0>(y);}template<  typename Value1,typename IndexSpecifierList1,typename Allocator1,  typename Value2,typename IndexSpecifierList2,typename Allocator2>bool operator!=(  const multi_index_container<Value1,IndexSpecifierList1,Allocator1>& x,  const multi_index_container<Value2,IndexSpecifierList2,Allocator2>& y){  return get<0>(x)!=get<0>(y);}template<  typename Value1,typename IndexSpecifierList1,typename Allocator1,  typename Value2,typename IndexSpecifierList2,typename Allocator2>bool operator>(  const multi_index_container<Value1,IndexSpecifierList1,Allocator1>& x,  const multi_index_container<Value2,IndexSpecifierList2,Allocator2>& y){  return get<0>(x)>get<0>(y);}template<  typename Value1,typename IndexSpecifierList1,typename Allocator1,  typename Value2,typename IndexSpecifierList2,typename Allocator2>bool operator>=(  const multi_index_container<Value1,IndexSpecifierList1,Allocator1>& x,  const multi_index_container<Value2,IndexSpecifierList2,Allocator2>& y){  return get<0>(x)>=get<0>(y);}template<  typename Value1,typename IndexSpecifierList1,typename Allocator1,  typename Value2,typename IndexSpecifierList2,typename Allocator2>bool operator<=(  const multi_index_container<Value1,IndexSpecifierList1,Allocator1>& x,  const multi_index_container<Value2,IndexSpecifierList2,Allocator2>& y){  return get<0>(x)<=get<0>(y);}/*  specialized algorithms */template<typename Value,typename IndexSpecifierList,typename Allocator>void swap(  multi_index_container<Value,IndexSpecifierList,Allocator>& x,  multi_index_container<Value,IndexSpecifierList,Allocator>& y){  x.swap(y);}} /* namespace multi_index */#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)/* class version = 1 : we now serialize the size through * boost::serialization::collection_size_type. * class version = 2 : proper use of {save|load}_construct_data. */namespace serialization {template<typename Value,typename IndexSpecifierList,typename Allocator>struct version<  boost::multi_index_container<Value,IndexSpecifierList,Allocator>>{  BOOST_STATIC_CONSTANT(int,value=2);};} /* namespace serialization */#endif/* Associated global functions are promoted to namespace boost, except * comparison operators and swap, which are meant to be Koenig looked-up. */using multi_index::get;using multi_index::project;} /* namespace boost */#undef BOOST_MULTI_INDEX_CHECK_INVARIANT#undef BOOST_MULTI_INDEX_CHECK_INVARIANT_OF#endif
 |