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