compressed_pair.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 435 行 · 第 1/2 页

HPP
435
字号
   class compressed_pair_imp<T1, T2, 3>      : private T1,        private T2   {   public:      typedef T1                                                 first_type;      typedef T2                                                 second_type;      typedef typename call_traits<first_type>::param_type       first_param_type;      typedef typename call_traits<second_type>::param_type      second_param_type;      typedef typename call_traits<first_type>::reference        first_reference;      typedef typename call_traits<second_type>::reference       second_reference;      typedef typename call_traits<first_type>::const_reference  first_const_reference;      typedef typename call_traits<second_type>::const_reference second_const_reference;      compressed_pair_imp() {}      compressed_pair_imp(first_param_type x, second_param_type y)         : first_type(x), second_type(y) {}      compressed_pair_imp(first_param_type x)         : first_type(x) {}      compressed_pair_imp(second_param_type y)         : second_type(y) {}      first_reference       first()       {return *this;}      first_const_reference first() const {return *this;}      second_reference       second()       {return *this;}      second_const_reference second() const {return *this;}      //      // no need to swap empty bases:      void swap(::boost::compressed_pair<T1,T2>&) {}   };   // JM   // 4    T1 == T2, T1 and T2 both empty   //      Note does not actually store an instance of T2 at all -   //      but reuses T1 base class for both first() and second().   template <class T1, class T2>   class compressed_pair_imp<T1, T2, 4>      : private T1   {   public:      typedef T1                                                 first_type;      typedef T2                                                 second_type;      typedef typename call_traits<first_type>::param_type       first_param_type;      typedef typename call_traits<second_type>::param_type      second_param_type;      typedef typename call_traits<first_type>::reference        first_reference;      typedef typename call_traits<second_type>::reference       second_reference;      typedef typename call_traits<first_type>::const_reference  first_const_reference;      typedef typename call_traits<second_type>::const_reference second_const_reference;      compressed_pair_imp() {}      compressed_pair_imp(first_param_type x, second_param_type y)         : first_type(x), m_second(y) {}      compressed_pair_imp(first_param_type x)         : first_type(x), m_second(x) {}      first_reference       first()       {return *this;}      first_const_reference first() const {return *this;}      second_reference       second()       {return m_second;}      second_const_reference second() const {return m_second;}      void swap(::boost::compressed_pair<T1,T2>&) {}   private:      T2 m_second;   };   // 5    T1 == T2 and are not empty:   //JM   template <class T1, class T2>   class compressed_pair_imp<T1, T2, 5>   {   public:      typedef T1                                                 first_type;      typedef T2                                                 second_type;      typedef typename call_traits<first_type>::param_type       first_param_type;      typedef typename call_traits<second_type>::param_type      second_param_type;      typedef typename call_traits<first_type>::reference        first_reference;      typedef typename call_traits<second_type>::reference       second_reference;      typedef typename call_traits<first_type>::const_reference  first_const_reference;      typedef typename call_traits<second_type>::const_reference second_const_reference;      compressed_pair_imp() {}      compressed_pair_imp(first_param_type x, second_param_type y)         : first_(x), second_(y) {}      compressed_pair_imp(first_param_type x)         : first_(x), second_(x) {}      first_reference       first()       {return first_;}      first_const_reference first() const {return first_;}      second_reference       second()       {return second_;}      second_const_reference second() const {return second_;}      void swap(::boost::compressed_pair<T1, T2>& y)      {         cp_swap(first_, y.first());         cp_swap(second_, y.second());      }   private:      first_type first_;      second_type second_;   };}  // detailstemplate <class T1, class T2>class compressed_pair   : private ::boost::details::compressed_pair_imp<T1, T2,             ::boost::details::compressed_pair_switch<                    T1,                    T2,                    ::boost::is_same<typename remove_cv<T1>::type, typename remove_cv<T2>::type>::value,                    ::boost::is_empty<T1>::value,                    ::boost::is_empty<T2>::value>::value>{private:   typedef details::compressed_pair_imp<T1, T2,             ::boost::details::compressed_pair_switch<                    T1,                    T2,                    ::boost::is_same<typename remove_cv<T1>::type, typename remove_cv<T2>::type>::value,                    ::boost::is_empty<T1>::value,                    ::boost::is_empty<T2>::value>::value> base;public:   typedef T1                                                 first_type;   typedef T2                                                 second_type;   typedef typename call_traits<first_type>::param_type       first_param_type;   typedef typename call_traits<second_type>::param_type      second_param_type;   typedef typename call_traits<first_type>::reference        first_reference;   typedef typename call_traits<second_type>::reference       second_reference;   typedef typename call_traits<first_type>::const_reference  first_const_reference;   typedef typename call_traits<second_type>::const_reference second_const_reference;            compressed_pair() : base() {}            compressed_pair(first_param_type x, second_param_type y) : base(x, y) {}   explicit compressed_pair(first_param_type x) : base(x) {}   explicit compressed_pair(second_param_type y) : base(y) {}   first_reference       first()       {return base::first();}   first_const_reference first() const {return base::first();}   second_reference       second()       {return base::second();}   second_const_reference second() const {return base::second();}   void swap(compressed_pair& y) { base::swap(y); }};// JM// Partial specialisation for case where T1 == T2://template <class T>class compressed_pair<T, T>   : private details::compressed_pair_imp<T, T,             ::boost::details::compressed_pair_switch<                    T,                    T,                    ::boost::is_same<typename remove_cv<T>::type, typename remove_cv<T>::type>::value,                    ::boost::is_empty<T>::value,                    ::boost::is_empty<T>::value>::value>{private:   typedef details::compressed_pair_imp<T, T,             ::boost::details::compressed_pair_switch<                    T,                    T,                    ::boost::is_same<typename remove_cv<T>::type, typename remove_cv<T>::type>::value,                    ::boost::is_empty<T>::value,                    ::boost::is_empty<T>::value>::value> base;public:   typedef T                                                  first_type;   typedef T                                                  second_type;   typedef typename call_traits<first_type>::param_type       first_param_type;   typedef typename call_traits<second_type>::param_type      second_param_type;   typedef typename call_traits<first_type>::reference        first_reference;   typedef typename call_traits<second_type>::reference       second_reference;   typedef typename call_traits<first_type>::const_reference  first_const_reference;   typedef typename call_traits<second_type>::const_reference second_const_reference;            compressed_pair() : base() {}            compressed_pair(first_param_type x, second_param_type y) : base(x, y) {}#if !(defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530))   explicit #endif      compressed_pair(first_param_type x) : base(x) {}   first_reference       first()       {return base::first();}   first_const_reference first() const {return base::first();}   second_reference       second()       {return base::second();}   second_const_reference second() const {return base::second();}   void swap(::boost::compressed_pair<T,T>& y) { base::swap(y); }};template <class T1, class T2>inlinevoidswap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y){   x.swap(y);}} // boost#endif // BOOST_DETAIL_COMPRESSED_PAIR_HPP

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?