epoc32/include/stdapis/boost/multi_index/detail/index_base.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
williamr@2
     1
/* Copyright 2003-2005 Joaquín M López Muñoz.
williamr@2
     2
 * Distributed under the Boost Software License, Version 1.0.
williamr@2
     3
 * (See accompanying file LICENSE_1_0.txt or copy at
williamr@2
     4
 * http://www.boost.org/LICENSE_1_0.txt)
williamr@2
     5
 *
williamr@2
     6
 * See http://www.boost.org/libs/multi_index for library home page.
williamr@2
     7
 */
williamr@2
     8
williamr@2
     9
#ifndef BOOST_MULTI_INDEX_DETAIL_INDEX_BASE_HPP
williamr@2
    10
#define BOOST_MULTI_INDEX_DETAIL_INDEX_BASE_HPP
williamr@2
    11
williamr@2
    12
#if defined(_MSC_VER)&&(_MSC_VER>=1200)
williamr@2
    13
#pragma once
williamr@2
    14
#endif
williamr@2
    15
williamr@2
    16
#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
williamr@2
    17
#include <boost/call_traits.hpp>
williamr@2
    18
#include <boost/detail/workaround.hpp>
williamr@2
    19
#include <boost/mpl/vector.hpp>
williamr@2
    20
#include <boost/multi_index/detail/copy_map.hpp>
williamr@2
    21
#include <boost/multi_index/detail/node_type.hpp>
williamr@2
    22
#include <boost/multi_index_container_fwd.hpp>
williamr@2
    23
#include <boost/tuple/tuple.hpp>
williamr@2
    24
#include <utility>
williamr@2
    25
williamr@2
    26
#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
williamr@2
    27
#include <boost/multi_index/detail/index_loader.hpp>
williamr@2
    28
#include <boost/multi_index/detail/index_saver.hpp>
williamr@2
    29
#endif
williamr@2
    30
williamr@2
    31
namespace boost{
williamr@2
    32
williamr@2
    33
namespace multi_index{
williamr@2
    34
williamr@2
    35
namespace detail{
williamr@2
    36
williamr@2
    37
/* The role of this class is threefold:
williamr@2
    38
 *   - tops the linear hierarchy of indices.
williamr@2
    39
 *   - terminates some cascading backbone function calls (insert_, etc.),
williamr@2
    40
 *   - grants access to the backbone functions of the final
williamr@2
    41
 *     multi_index_container class (for access restriction reasons, these
williamr@2
    42
 *     cannot be called directly from the index classes.)
williamr@2
    43
 */
williamr@2
    44
williamr@2
    45
template<typename Value,typename IndexSpecifierList,typename Allocator>
williamr@2
    46
class index_base
williamr@2
    47
{
williamr@2
    48
protected:
williamr@2
    49
  typedef index_node_base<Value>              node_type;
williamr@2
    50
  typedef typename multi_index_node_type<
williamr@2
    51
    Value,IndexSpecifierList,Allocator>::type final_node_type;
williamr@2
    52
  typedef multi_index_container<
williamr@2
    53
    Value,IndexSpecifierList,Allocator>       final_type;
williamr@2
    54
  typedef tuples::null_type                   ctor_args_list;
williamr@2
    55
  typedef typename 
williamr@2
    56
    boost::detail::allocator::rebind_to<
williamr@2
    57
      Allocator,
williamr@2
    58
      typename Allocator::value_type>::type   final_allocator_type;
williamr@2
    59
  typedef mpl::vector0<>                      index_type_list;
williamr@2
    60
  typedef mpl::vector0<>                      iterator_type_list;
williamr@2
    61
  typedef mpl::vector0<>                      const_iterator_type_list;
williamr@2
    62
  typedef copy_map<
williamr@2
    63
    final_node_type,
williamr@2
    64
    final_allocator_type>                     copy_map_type;
williamr@2
    65
williamr@2
    66
#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
williamr@2
    67
  typedef index_saver<
williamr@2
    68
    node_type,
williamr@2
    69
    final_allocator_type>                     index_saver_type;
williamr@2
    70
  typedef index_loader<
williamr@2
    71
    node_type,
williamr@2
    72
    final_node_type,
williamr@2
    73
    final_allocator_type>                     index_loader_type;
williamr@2
    74
#endif
williamr@2
    75
williamr@2
    76
private:
williamr@2
    77
  typedef typename call_traits<Value>::param_type value_param_type;
williamr@2
    78
williamr@2
    79
protected:
williamr@2
    80
  explicit index_base(const ctor_args_list&,const Allocator&){}
williamr@2
    81
williamr@2
    82
  void copy_(
williamr@2
    83
    const index_base<Value,IndexSpecifierList,Allocator>&,const copy_map_type&)
williamr@2
    84
  {}
williamr@2
    85
williamr@2
    86
  node_type* insert_(value_param_type v,node_type* x)
williamr@2
    87
  {
williamr@2
    88
    boost::detail::allocator::construct(&x->value(),v);
williamr@2
    89
    return x;
williamr@2
    90
  }
williamr@2
    91
williamr@2
    92
  node_type* insert_(value_param_type v,node_type*,node_type* x)
williamr@2
    93
  {
williamr@2
    94
    boost::detail::allocator::construct(&x->value(),v);
williamr@2
    95
    return x;
williamr@2
    96
  }
williamr@2
    97
williamr@2
    98
  void erase_(node_type* x)
williamr@2
    99
  {
williamr@2
   100
    boost::detail::allocator::destroy(&x->value());
williamr@2
   101
  }
williamr@2
   102
williamr@2
   103
  void delete_node_(node_type* x)
williamr@2
   104
  {
williamr@2
   105
    boost::detail::allocator::destroy(&x->value());
williamr@2
   106
  }
williamr@2
   107
williamr@2
   108
  void clear_(){}
williamr@2
   109
williamr@2
   110
  void swap_(index_base<Value,IndexSpecifierList,Allocator>&){}
williamr@2
   111
williamr@2
   112
  bool replace_(value_param_type v,node_type* x)
williamr@2
   113
  {
williamr@2
   114
    x->value()=v;
williamr@2
   115
    return true;
williamr@2
   116
  }
williamr@2
   117
williamr@2
   118
  bool modify_(node_type*){return true;}
williamr@2
   119
williamr@2
   120
#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
williamr@2
   121
  /* serialization */
williamr@2
   122
williamr@2
   123
  template<typename Archive>
williamr@2
   124
  void save_(Archive&,const unsigned int,const index_saver_type&)const{}
williamr@2
   125
williamr@2
   126
  template<typename Archive>
williamr@2
   127
  void load_(Archive&,const unsigned int,const index_loader_type&){}
williamr@2
   128
#endif
williamr@2
   129
williamr@2
   130
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)
williamr@2
   131
  /* invariant stuff */
williamr@2
   132
williamr@2
   133
  bool invariant_()const{return true;}
williamr@2
   134
#endif
williamr@2
   135
williamr@2
   136
  /* access to backbone memfuns of Final class */
williamr@2
   137
williamr@2
   138
  final_type&       final(){return *static_cast<final_type*>(this);}
williamr@2
   139
  const final_type& final()const{return *static_cast<const final_type*>(this);}
williamr@2
   140
williamr@2
   141
  final_node_type* final_header()const{return final().header();}
williamr@2
   142
williamr@2
   143
  bool        final_empty_()const{return final().empty_();}
williamr@2
   144
  std::size_t final_size_()const{return final().size_();}
williamr@2
   145
  std::size_t final_max_size_()const{return final().max_size_();}
williamr@2
   146
williamr@2
   147
  std::pair<final_node_type*,bool> final_insert_(value_param_type x)
williamr@2
   148
    {return final().insert_(x);}
williamr@2
   149
  std::pair<final_node_type*,bool> final_insert_(
williamr@2
   150
    value_param_type x,final_node_type* position)
williamr@2
   151
    {return final().insert_(x,position);}
williamr@2
   152
williamr@2
   153
  void final_erase_(final_node_type* x){final().erase_(x);}
williamr@2
   154
williamr@2
   155
  void final_delete_node_(final_node_type* x){final().delete_node_(x);}
williamr@2
   156
  void final_delete_all_nodes_(){final().delete_all_nodes_();}
williamr@2
   157
  void final_clear_(){final().clear_();}
williamr@2
   158
williamr@2
   159
  void final_swap_(final_type& x){final().swap_(x);}
williamr@2
   160
  bool final_replace_(
williamr@2
   161
    value_param_type k,final_node_type* x)
williamr@2
   162
    {return final().replace_(k,x);}
williamr@2
   163
williamr@2
   164
  template<typename Modifier>
williamr@2
   165
  bool final_modify_(Modifier mod,final_node_type* x)
williamr@2
   166
    {return final().modify_(mod,x);}
williamr@2
   167
williamr@2
   168
#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)
williamr@2
   169
  void final_check_invariant_()const{final().check_invariant_();}
williamr@2
   170
#endif
williamr@2
   171
};
williamr@2
   172
williamr@2
   173
} /* namespace multi_index::detail */
williamr@2
   174
williamr@2
   175
} /* namespace multi_index */
williamr@2
   176
williamr@2
   177
} /* namespace boost */
williamr@2
   178
williamr@2
   179
#endif