ob_compressed_pair.hpp

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

HPP
511
字号
            compressed_pair_3() : T1(), T2() {}            compressed_pair_3(first_param_type x, second_param_type y) : T1(x), T2(y) {}   template <class A>   explicit compressed_pair_3(const A& val)   {      init_one<best_conversion_traits<A, T1, T2>::value>::init(val, static_cast<T1*>(this), static_cast<T2*>(this));   }   compressed_pair_3(const ::boost::compressed_pair<T1,T2>& x)      : T1(x.first()), T2(x.second()) {}   first_reference       first()       { return *this; }   first_const_reference first() const { return *this; }   second_reference       second()       { return *this; }   second_const_reference second() const { return *this; }   void swap(compressed_pair_3& y)   {      // no need to swap empty base classes:   }};// T1 == T2, and emptytemplate <class T1, class T2>class compressed_pair_4 : 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_4() : T1() {}            compressed_pair_4(first_param_type x, second_param_type y) : T1(x), m_second(y) {}   // only one single argument constructor since T1 == T2   explicit compressed_pair_4(first_param_type x) : T1(x), m_second(x) {}   compressed_pair_4(const ::boost::compressed_pair<T1,T2>& x)      : T1(x.first()), m_second(x.second()) {}   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(compressed_pair_4& y)   {      // no need to swap empty base classes:   }private:   T2 m_second;};// T1 == T2, not emptytemplate <class T1, class T2>class compressed_pair_5{private:   T1 _first;   T2 _second;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_5() : _first(), _second() {}            compressed_pair_5(first_param_type x, second_param_type y) : _first(x), _second(y) {}   // only one single argument constructor since T1 == T2   explicit compressed_pair_5(first_param_type x) : _first(x), _second(x) {}   compressed_pair_5(const ::boost::compressed_pair<T1,T2>& c)       : _first(c.first()), _second(c.second()) {}   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(compressed_pair_5& y)   {      using std::swap;      swap(_first, y._first);      swap(_second, y._second);   }};template <bool e1, bool e2, bool same>struct compressed_pair_chooser{   template <class T1, class T2>   struct rebind   {      typedef compressed_pair_0<T1, T2> type;   };};template <>struct compressed_pair_chooser<false, true, false>{   template <class T1, class T2>   struct rebind   {      typedef compressed_pair_1<T1, T2> type;   };};template <>struct compressed_pair_chooser<true, false, false>{   template <class T1, class T2>   struct rebind   {      typedef compressed_pair_2<T1, T2> type;   };};template <>struct compressed_pair_chooser<true, true, false>{   template <class T1, class T2>   struct rebind   {      typedef compressed_pair_3<T1, T2> type;   };};template <>struct compressed_pair_chooser<true, true, true>{   template <class T1, class T2>   struct rebind   {      typedef compressed_pair_4<T1, T2> type;   };};template <>struct compressed_pair_chooser<false, false, true>{   template <class T1, class T2>   struct rebind   {      typedef compressed_pair_5<T1, T2> type;   };};template <class T1, class T2>struct compressed_pair_traits{private:   typedef compressed_pair_chooser<is_empty<T1>::value, is_empty<T2>::value, is_same<T1,T2>::value> chooser;   typedef typename chooser::template rebind<T1, T2> bound_type;public:   typedef typename bound_type::type type;};} // namespace detailtemplate <class T1, class T2>class compressed_pair : public detail::compressed_pair_traits<T1, T2>::type{private:   typedef typename detail::compressed_pair_traits<T1, T2>::type base_type;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_type() {}            compressed_pair(first_param_type x, second_param_type y) : base_type(x, y) {}   template <class A>   explicit compressed_pair(const A& x) : base_type(x){}   first_reference       first()       { return base_type::first(); }   first_const_reference first() const { return base_type::first(); }   second_reference       second()       { return base_type::second(); }   second_const_reference second() const { return base_type::second(); }};template <class T1, class T2>inline void swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y){   x.swap(y);}#else// no partial specialisation, no member templates:template <class T1, class T2>class compressed_pair{private:   T1 _first;   T2 _second;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() : _first(), _second() {}            compressed_pair(first_param_type x, second_param_type y) : _first(x), _second(y) {}   explicit compressed_pair(first_param_type x) : _first(x), _second() {}   // can't define this in case T1 == T2:   // explicit compressed_pair(second_param_type y) : _first(), _second(y) {}   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(compressed_pair& y)   {      using std::swap;      swap(_first, y._first);      swap(_second, y._second);   }};template <class T1, class T2>inline void swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y){   x.swap(y);}#endif} // boost#endif // BOOST_OB_COMPRESSED_PAIR_HPP

⌨️ 快捷键说明

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