intersegment_ptr.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 1,042 行 · 第 1/3 页
HPP
1,042 行
//!intersegment_ptr + std::ptrdiff_t. //!Never throws. intersegment_ptr operator+ (std::ptrdiff_t idx) const { intersegment_ptr result (*this); result.inc_offset(idx*sizeof(T)); return result; } //!intersegment_ptr - std::ptrdiff_t. //!Never throws. intersegment_ptr operator- (std::ptrdiff_t idx) const { intersegment_ptr result (*this); result.dec_offset(idx*sizeof(T)); return result; } //!intersegment_ptr += std::ptrdiff_t. //!Never throws. intersegment_ptr &operator+= (std::ptrdiff_t offset) { base_t::inc_offset(offset*sizeof(T)); return *this; } //!intersegment_ptr -= std::ptrdiff_t. //!Never throws. intersegment_ptr &operator-= (std::ptrdiff_t offset) { base_t::dec_offset(offset*sizeof(T)); return *this; } //!++intersegment_ptr. //!Never throws. intersegment_ptr& operator++ (void) { base_t::inc_offset(sizeof(T)); return *this; } //!intersegment_ptr++. //!Never throws. intersegment_ptr operator++ (int) { intersegment_ptr temp(*this); ++*this; return temp; } //!--intersegment_ptr. //!Never throws. intersegment_ptr& operator-- (void) { base_t::dec_offset(sizeof(T)); return *this; } //!intersegment_ptr--. //!Never throws. intersegment_ptr operator-- (int) { intersegment_ptr temp(*this); --*this; return temp; } //!Safe bool conversion operator. //!Never throws. operator unspecified_bool_type() const { return base_t::is_null()? 0 : &self_t::unspecified_bool_type_func; } //!Not operator. Not needed in theory, but improves portability. //!Never throws. bool operator! () const { return base_t::is_null(); } //!Swaps two intersegment_ptr-s. More efficient than std::swap. //!Never throws. void swap(intersegment_ptr &other) { base_t::swap(other); } //!Calculates the distance between two intersegment_ptr-s. //!This only works with two basic_intersegment_ptr pointing //!to the same segment. Otherwise undefined template <class T2> ptrdiff_t _diff(const intersegment_ptr<T2> &other) const { return base_t::diff(other); } //!Returns true if both point to the //!same object template <class T2> bool _equal(const intersegment_ptr<T2>&other) const { return base_t::equal(other); } //!Returns true if *this is less than other. //!This only works with two basic_intersegment_ptr pointing //!to the same segment group. Otherwise undefined. Never throws template <class T2> bool _less(const intersegment_ptr<T2> &other) const { return base_t::less(other); }};//!Compares the equality of two intersegment_ptr-s.//!Never throws.template <class T1, class T2> inlinebool operator ==(const intersegment_ptr<T1> &left, const intersegment_ptr<T2> &right){ //Make sure both pointers can be compared bool e = typename intersegment_ptr<T1>::pointer(0) == typename intersegment_ptr<T2>::pointer(0); (void)e; return left._equal(right); }//!Returns true if *this is less than other.//!This only works with two basic_intersegment_ptr pointing//!to the same segment group. Otherwise undefined. Never throwstemplate <class T1, class T2> inlinebool operator <(const intersegment_ptr<T1> &left, const intersegment_ptr<T2> &right){ //Make sure both pointers can be compared bool e = typename intersegment_ptr<T1>::pointer(0) < typename intersegment_ptr<T2>::pointer(0); (void)e; return left._less(right); }template<class T1, class T2> inlinebool operator!= (const intersegment_ptr<T1> &pt1, const intersegment_ptr<T2> &pt2){ return !(pt1 ==pt2); }//!intersegment_ptr<T1> <= intersegment_ptr<T2>.//!Never throws.template<class T1, class T2> inlinebool operator<= (const intersegment_ptr<T1> &pt1, const intersegment_ptr<T2> &pt2){ return !(pt1 > pt2); }//!intersegment_ptr<T1> > intersegment_ptr<T2>.//!Never throws.template<class T1, class T2> inlinebool operator> (const intersegment_ptr<T1> &pt1, const intersegment_ptr<T2> &pt2){ return (pt2 < pt1); }//!intersegment_ptr<T1> >= intersegment_ptr<T2>.//!Never throws.template<class T1, class T2> inlinebool operator>= (const intersegment_ptr<T1> &pt1, const intersegment_ptr<T2> &pt2){ return !(pt1 < pt2); }//!operator<<template<class E, class T, class U> inlinestd::basic_ostream<E, T> & operator<< (std::basic_ostream<E, T> & os, const intersegment_ptr<U> & p){ return os << p.get(); }//!operator>>template<class E, class T, class U> inlinestd::basic_istream<E, T> & operator>> (std::basic_istream<E, T> & os, intersegment_ptr<U> & p){ U * tmp; return os >> tmp; p = tmp; }//!std::ptrdiff_t + intersegment_ptr. //!The result is another pointer of the same segmenttemplate<class T> inlineintersegment_ptr<T> operator+ (std::ptrdiff_t diff, const intersegment_ptr<T>& right){ return right + diff; }//!intersegment_ptr - intersegment_ptr. //!This only works with two intersegment_ptr-s that point to the//!same segmenttemplate <class T, class T2> inlinestd::ptrdiff_t operator- (const intersegment_ptr<T> &pt, const intersegment_ptr<T2> &pt2){ return pt._diff(pt2)/sizeof(T); }//! swap specializationtemplate<class T> inlinevoid swap (boost::interprocess::intersegment_ptr<T> &pt, boost::interprocess::intersegment_ptr<T> &pt2){ pt.swap(pt2); }//!get_pointer() enables boost::mem_fn to recognize intersegment_ptr. //!Never throws.template<class T> inlineT * get_pointer(boost::interprocess::intersegment_ptr<T> const & p){ return p.get(); }//!Simulation of static_cast between pointers.//!Never throws.template<class T, class U> inline boost::interprocess::intersegment_ptr<T> static_pointer_cast(const boost::interprocess::intersegment_ptr<U> &r){ return boost::interprocess::intersegment_ptr<T>(r, boost::interprocess::detail::static_cast_tag()); }//!Simulation of const_cast between pointers.//!Never throws.template<class T, class U> inline boost::interprocess::intersegment_ptr<T> const_pointer_cast(const boost::interprocess::intersegment_ptr<U> &r){ return boost::interprocess::intersegment_ptr<T>(r, boost::interprocess::detail::const_cast_tag()); }//!Simulation of dynamic_cast between pointers.//!Never throws.template<class T, class U> inline boost::interprocess::intersegment_ptr<T> dynamic_pointer_cast(const boost::interprocess::intersegment_ptr<U> &r){ return boost::interprocess::intersegment_ptr<T>(r, boost::interprocess::detail::dynamic_cast_tag()); }//!Simulation of reinterpret_cast between pointers.//!Never throws.template<class T, class U> inlineboost::interprocess::intersegment_ptr<T> reinterpret_pointer_cast(const boost::interprocess::intersegment_ptr<U> &r){ return boost::interprocess::intersegment_ptr<T>(r, boost::interprocess::detail::reinterpret_cast_tag()); }//!Trait class to detect if an smart pointer has //!multi-segment addressing capabilities.template <class T>struct is_multisegment_ptr <boost::interprocess::intersegment_ptr<T> >{ static const bool value = true;};} //namespace interprocess {#if defined(_MSC_VER) && (_MSC_VER < 1400)//!get_pointer() enables boost::mem_fn to recognize intersegment_ptr. //!Never throws.template<class T> inlineT * get_pointer(boost::interprocess::intersegment_ptr<T> const & p){ return p.get(); }#endif//!has_trivial_constructor<> == true_type specialization//!for optimizationstemplate <class T>struct has_trivial_constructor < boost::interprocess::intersegment_ptr<T> > : public true_type{};//!has_trivial_destructor<> == true_type specialization//!for optimizationstemplate <class T>struct has_trivial_destructor < boost::interprocess::intersegment_ptr<T> > : public true_type{};} //namespace boost {#include <boost/interprocess/detail/config_end.hpp>#if 0//bits//-> is_segmented//-> is_relative//-> is_in_stack//-> is_pointee_outside//Data//segmented://// std::size_t ctrl : CTRL_BITS;// std::size_t segment : MAX_SEGMENT_BITS;// std::size_t offset;//RELATIVE_SIZE_BITS = SIZE_T_BITS -// MAX_SEGMENT_BITS - // CTRL_BITS 10 10//MAX_SEGMENT_SIZE = SIZE_T_BITS - ALIGN_BITS 20 52//SIZE_T_BITS - 1 - ALIGN_BITS 19 51//POW_SIZE_BITS = upper_log2// (SIZE_T_BITS - 1 - ALIGN_BITS) 5 6//FRC_SIZE_BITS = SIZE_T_BITS - CTRL_BITS// MAX_SEGMENT_SIZE_ALIGNBITS - POW_SIZE_BITS 6 5//relative://// std::size_t ctrl : CTRL_BITS; 2 2// std::size_t size_pow : POW_SIZE_BITS 5 6// std::size_t size_frc : FRC_SIZE_BITS; 6 5// std::size_t start : MAX_SEGMENT_SIZE_ALIGNBITS;19 51// std::ptrdiff_t distance : SIZE_T_BITS; 32 64//direct://// std::size_t ctrl : CTRL_BITS; 2 2// std::size_t dummy : SIZE_T_BITS - CTRL_BITS 30 62// void *addr : SIZE_T_BITS; 32 64//32 bits systems://Page alignment: 2**12////!Obtains the address pointed by the//!objectvoid *get_pointer() const{ if(this->is_pointee_outside() || this->is_in_stack()){ return raw_address(); } else if(this->is_relative()){ return (const_cast<char*>(reinterpret_cast<const char*>(this))) + this->relative_pointee_offset(); } else{ group_manager *m = get_segment_group_manager(addr); char *base = static_cast<char*>(m->get_id_address(this->segmented_id())); return base + this->segmented_offset(); }}void set_from_pointer(const void *ptr){ if(!ptr){ this->set_pointee_outside(); this->raw_address(ptr); } else if(this->is_in_stack()){ this->raw_address(ptr); } else if(this->is_relative() && ( (ptr >= this->relative_start()) &&(ptr < this->relative_start() + this->relative_size())) ){ this->relative_offset(ptr - this); } else{ segment_info_t ptr_info = get_id_from_addr(ptr); segment_info_t this_info = get_id_from_addr(this); if(ptr_info.segment_group != this_info.segment_group){ if(!ptr_info.segment_group){ this->set_in_stack(); } else{ this->set_pointee_outside(); } } else if(ptr_info.segment_id == this_info.segment_id){ set_relative(); this->relative_size (ptr_info.size); this->relative_offset(static_cast<const char*>(ptr) - reinterpret_cast<const char*>(this)); this->relative_start (ptr_info.base); } }}void set_from_other(const self_t &other){ this->set_from_pointer(other.get_pointer()); }#endif#endif //#ifndef BOOST_INTERPROCESS_INTERSEGMENT_PTR_HPP
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?