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 + -
显示快捷键?