rnd_index_ptr_array.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 144 行
HPP
144 行
/* Copyright 2003-2008 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_DETAIL_RND_INDEX_PTR_ARRAY_HPP#define BOOST_MULTI_INDEX_DETAIL_RND_INDEX_PTR_ARRAY_HPP#if defined(_MSC_VER)&&(_MSC_VER>=1200)#pragma once#endif#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */#include <algorithm>#include <boost/detail/allocator_utilities.hpp>#include <boost/multi_index/detail/auto_space.hpp>#include <boost/multi_index/detail/prevent_eti.hpp>#include <boost/multi_index/detail/rnd_index_node.hpp>#include <boost/noncopyable.hpp>#include <cstddef>namespace boost{namespace multi_index{namespace detail{/* pointer structure for use by random access indices */template<typename Allocator>class random_access_index_ptr_array:private noncopyable{ typedef typename prevent_eti< Allocator, random_access_index_node_impl< typename boost::detail::allocator::rebind_to< Allocator, char >::type > >::type node_impl_type;public: typedef typename node_impl_type::pointer value_type; typedef typename prevent_eti< Allocator, typename boost::detail::allocator::rebind_to< Allocator,value_type >::type >::type::pointer pointer; random_access_index_ptr_array( const Allocator& al,value_type end_,std::size_t size): size_(size), capacity_(size), spc(al,capacity_+1) { *end()=end_; end_->up()=end(); } std::size_t size()const{return size_;} std::size_t capacity()const{return capacity_;} void room_for_one() { if(size_==capacity_){ reserve(capacity_<=10?15:capacity_+capacity_/2); } } void reserve(std::size_t c) { if(c>capacity_){ auto_space<value_type,Allocator> spc1(spc.get_allocator(),c+1); node_impl_type::transfer(begin(),end()+1,spc1.data()); spc.swap(spc1); capacity_=c; } } pointer begin()const{return ptrs();} pointer end()const{return ptrs()+size_;} pointer at(std::size_t n)const{return ptrs()+n;} void push_back(value_type x) { *(end()+1)=*end(); (*(end()+1))->up()=end()+1; *end()=x; (*end())->up()=end(); ++size_; } void erase(value_type x) { node_impl_type::extract(x->up(),end()+1); --size_; } void clear() { *begin()=*end(); (*begin())->up()=begin(); size_=0; } void swap(random_access_index_ptr_array& x) { std::swap(size_,x.size_); std::swap(capacity_,x.capacity_); spc.swap(x.spc); }private: std::size_t size_; std::size_t capacity_; auto_space<value_type,Allocator> spc; pointer ptrs()const { return spc.data(); }};template<typename Allocator>void swap( random_access_index_ptr_array<Allocator>& x, random_access_index_ptr_array<Allocator>& y){ x.swap(y);}} /* namespace multi_index::detail */} /* namespace multi_index */} /* namespace boost */#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?