x
Yes
No
Do you want to visit DriveHQ English website?
首页
产品服务
价格
免费试用
下载客户端
关于我们
云文件服务
|
云备份服务
|
FTP服务
|
企业邮箱服务
|
网站托管
|
客户端软件
云文件服务
云备份服务
FTP服务
企业级邮箱服务
网站托管
客户端软件
ob_compressed_pair.hpp - Hosted on DriveHQ Cloud IT Platform
返回上层目录
上传
下载
共享
发布
新建文件夹
新建文件
复制
剪切
删除
粘贴
评论
升级服务
路径: \\game3dprogramming\materials\GameFactory\GameFactoryDemo\references\boost_1_35_0\boost\detail\ob_compressed_pair.hpp
旋转
特效
属性
历史版本
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000. // Use, modification and distribution are subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt). // // See http://www.boost.org/libs/utility for most recent version including documentation. // see libs/utility/compressed_pair.hpp // /* Release notes: 20 Jan 2001: Fixed obvious bugs (David Abrahams) 07 Oct 2000: Added better single argument constructor support. 03 Oct 2000: Added VC6 support (JM). 23rd July 2000: Additional comments added. (JM) Jan 2000: Original version: this version crippled for use with crippled compilers - John Maddock Jan 2000. */ #ifndef BOOST_OB_COMPRESSED_PAIR_HPP #define BOOST_OB_COMPRESSED_PAIR_HPP #include
#ifndef BOOST_OBJECT_TYPE_TRAITS_HPP #include
#endif #ifndef BOOST_SAME_TRAITS_HPP #include
#endif #ifndef BOOST_CALL_TRAITS_HPP #include
#endif namespace boost { #ifdef BOOST_MSVC6_MEMBER_TEMPLATES // // use member templates to emulate // partial specialisation. Note that due to // problems with overload resolution with VC6 // each of the compressed_pair versions that follow // have one template single-argument constructor // in place of two specific constructors: // template
class compressed_pair; namespace detail{ template
struct best_conversion_traits { typedef char one; typedef char (&two)[2]; static A a; static one test(T1); static two test(T2); enum { value = sizeof(test(a)) }; }; template
struct init_one; template <> struct init_one<1> { template
static void init(const A& a, T1* p1, T2*) { *p1 = a; } }; template <> struct init_one<2> { template
static void init(const A& a, T1*, T2* p2) { *p2 = a; } }; // T1 != T2, both non-empty template
class compressed_pair_0 { private: T1 _first; T2 _second; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits
::param_type first_param_type; typedef typename call_traits
::param_type second_param_type; typedef typename call_traits
::reference first_reference; typedef typename call_traits
::reference second_reference; typedef typename call_traits
::const_reference first_const_reference; typedef typename call_traits
::const_reference second_const_reference; compressed_pair_0() : _first(), _second() {} compressed_pair_0(first_param_type x, second_param_type y) : _first(x), _second(y) {} template
explicit compressed_pair_0(const A& val) { init_one
::value>::init(val, &_first, &_second); } compressed_pair_0(const ::boost::compressed_pair
& x) : _first(x.first()), _second(x.second()) {} #if 0 compressed_pair_0& operator=(const compressed_pair_0& x) { cout << "assigning compressed pair 0" << endl; _first = x._first; _second = x._second; cout << "finished assigning compressed pair 0" << endl; return *this; } #endif 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_0& y) { using std::swap; swap(_first, y._first); swap(_second, y._second); } }; // T1 != T2, T2 empty template
class compressed_pair_1 : T2 { private: T1 _first; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits
::param_type first_param_type; typedef typename call_traits
::param_type second_param_type; typedef typename call_traits
::reference first_reference; typedef typename call_traits
::reference second_reference; typedef typename call_traits
::const_reference first_const_reference; typedef typename call_traits
::const_reference second_const_reference; compressed_pair_1() : T2(), _first() {} compressed_pair_1(first_param_type x, second_param_type y) : T2(y), _first(x) {} template
explicit compressed_pair_1(const A& val) { init_one
::value>::init(val, &_first, static_cast
(this)); } compressed_pair_1(const ::boost::compressed_pair
& x) : T2(x.second()), _first(x.first()) {} #if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 // Total weirdness. If the assignment to _first is moved after // the call to the inherited operator=, then this breaks graph/test/graph.cpp // by way of iterator_adaptor. compressed_pair_1& operator=(const compressed_pair_1& x) { _first = x._first; T2::operator=(x); return *this; } #endif first_reference first() { return _first; } first_const_reference first() const { return _first; } second_reference second() { return *this; } second_const_reference second() const { return *this; } void swap(compressed_pair_1& y) { // no need to swap empty base class: using std::swap; swap(_first, y._first); } }; // T1 != T2, T1 empty template
class compressed_pair_2 : T1 { private: T2 _second; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits
::param_type first_param_type; typedef typename call_traits
::param_type second_param_type; typedef typename call_traits
::reference first_reference; typedef typename call_traits
::reference second_reference; typedef typename call_traits
::const_reference first_const_reference; typedef typename call_traits
::const_reference second_const_reference; compressed_pair_2() : T1(), _second() {} compressed_pair_2(first_param_type x, second_param_type y) : T1(x), _second(y) {} template
explicit compressed_pair_2(const A& val) { init_one
::value>::init(val, static_cast
(this), &_second); } compressed_pair_2(const ::boost::compressed_pair
& x) : T1(x.first()), _second(x.second()) {} #if 0 compressed_pair_2& operator=(const compressed_pair_2& x) { cout << "assigning compressed pair 2" << endl; T1::operator=(x); _second = x._second; cout << "finished assigning compressed pair 2" << endl; return *this; } #endif first_reference first() { return *this; } first_const_reference first() const { return *this; } second_reference second() { return _second; } second_const_reference second() const { return _second; } void swap(compressed_pair_2& y) { // no need to swap empty base class: using std::swap; swap(_second, y._second); } }; // T1 != T2, both empty template
class compressed_pair_3 : T1, T2 { public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits
::param_type first_param_type; typedef typename call_traits
::param_type second_param_type; typedef typename call_traits
::reference first_reference; typedef typename call_traits
::reference second_reference; typedef typename call_traits
::const_reference first_const_reference; typedef typename call_traits
::const_reference second_const_reference; compressed_pair_3() : T1(), T2() {} compressed_pair_3(first_param_type x, second_param_type y) : T1(x), T2(y) {} template
explicit compressed_pair_3(const A& val) { init_one
::value>::init(val, static_cast
(this), static_cast
(this)); } compressed_pair_3(const ::boost::compressed_pair
& 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 empty template
class compressed_pair_4 : T1 { public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits
::param_type first_param_type; typedef typename call_traits
::param_type second_param_type; typedef typename call_traits
::reference first_reference; typedef typename call_traits
::reference second_reference; typedef typename call_traits
::const_reference first_const_reference; typedef typename call_traits
::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
& 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 empty template
class compressed_pair_5 { private: T1 _first; T2 _second; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits
::param_type first_param_type; typedef typename call_traits
::param_type second_param_type; typedef typename call_traits
::reference first_reference; typedef typename call_traits
::reference second_reference; typedef typename call_traits
::const_reference first_const_reference; typedef typename call_traits
::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
& 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
struct compressed_pair_chooser { template
struct rebind { typedef compressed_pair_0
type; }; }; template <> struct compressed_pair_chooser
{ template
struct rebind { typedef compressed_pair_1
type; }; }; template <> struct compressed_pair_chooser
{ template
struct rebind { typedef compressed_pair_2
type; }; }; template <> struct compressed_pair_chooser
{ template
struct rebind { typedef compressed_pair_3
type; }; }; template <> struct compressed_pair_chooser
{ template
struct rebind { typedef compressed_pair_4
type; }; }; template <> struct compressed_pair_chooser
{ template
struct rebind { typedef compressed_pair_5
type; }; }; template
struct compressed_pair_traits { private: typedef compressed_pair_chooser
::value, is_empty
::value, is_same
::value> chooser; typedef typename chooser::template rebind
bound_type; public: typedef typename bound_type::type type; }; } // namespace detail template
class compressed_pair : public detail::compressed_pair_traits
::type { private: typedef typename detail::compressed_pair_traits
::type base_type; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits
::param_type first_param_type; typedef typename call_traits
::param_type second_param_type; typedef typename call_traits
::reference first_reference; typedef typename call_traits
::reference second_reference; typedef typename call_traits
::const_reference first_const_reference; typedef typename call_traits
::const_reference second_const_reference; compressed_pair() : base_type() {} compressed_pair(first_param_type x, second_param_type y) : base_type(x, y) {} template
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
inline void swap(compressed_pair
& x, compressed_pair
& y) { x.swap(y); } #else // no partial specialisation, no member templates: template
class compressed_pair { private: T1 _first; T2 _second; public: typedef T1 first_type; typedef T2 second_type; typedef typename call_traits
::param_type first_param_type; typedef typename call_traits
::param_type second_param_type; typedef typename call_traits
::reference first_reference; typedef typename call_traits
::reference second_reference; typedef typename call_traits
::const_reference first_const_reference; typedef typename call_traits
::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
inline void swap(compressed_pair
& x, compressed_pair
& y) { x.swap(y); } #endif } // boost #endif // BOOST_OB_COMPRESSED_PAIR_HPP
ob_compressed_pair.hpp
网页地址
文件地址
上一页
37/61
下一页
下载
( 16 KB )
Comments
Total ratings:
0
Average rating:
无评论
of 10
Would you like to comment?
Join now
, or
Logon
if you are already a member.