⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compressed_pair.hpp

📁 system C源码 一种替代verilog的语言
💻 HPP
📖 第 1 页 / 共 2 页
字号:
//  (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.// compressed_pair: pair that "compresses" empty members// (see libs/utility/compressed_pair.htm)//// JM changes 25 Jan 2004:// For the case where T1 == T2 and both are empty, then first() and second()// should return different objects.// JM changes 25 Jan 2000:// Removed default arguments from compressed_pair_switch to get// C++ Builder 4 to accept them// rewriten swap to get gcc and C++ builder to compile.// added partial specialisations for case T1 == T2 to avoid duplicate constructor defs.#ifndef BOOST_DETAIL_COMPRESSED_PAIR_HPP#define BOOST_DETAIL_COMPRESSED_PAIR_HPP#include <algorithm>#include <sysc/packages/boost/type_traits/remove_cv.hpp>#include <sysc/packages/boost/type_traits/is_empty.hpp>#include <sysc/packages/boost/type_traits/is_same.hpp>#include <sysc/packages/boost/call_traits.hpp>namespace boost{template <class T1, class T2>class compressed_pair;// compressed_pairnamespace details{   // JM altered 26 Jan 2000:   template <class T1, class T2, bool IsSame, bool FirstEmpty, bool SecondEmpty>   struct compressed_pair_switch;   template <class T1, class T2>   struct compressed_pair_switch<T1, T2, false, false, false>      {static const int value = 0;};   template <class T1, class T2>   struct compressed_pair_switch<T1, T2, false, true, true>      {static const int value = 3;};   template <class T1, class T2>   struct compressed_pair_switch<T1, T2, false, true, false>      {static const int value = 1;};   template <class T1, class T2>   struct compressed_pair_switch<T1, T2, false, false, true>      {static const int value = 2;};   template <class T1, class T2>   struct compressed_pair_switch<T1, T2, true, true, true>      {static const int value = 4;};   template <class T1, class T2>   struct compressed_pair_switch<T1, T2, true, false, false>      {static const int value = 5;};   template <class T1, class T2, int Version> class compressed_pair_imp;#ifdef __GNUC__   // workaround for GCC (JM):   using std::swap;#endif   //   // can't call unqualified swap from within classname::swap   // as Koenig lookup rules will find only the classname::swap   // member function not the global declaration, so use cp_swap   // as a forwarding function (JM):   template <typename T>   inline void cp_swap(T& t1, T& t2)   {#ifndef __GNUC__      using std::swap;#endif      swap(t1, t2);   }   // 0    derive from neither   template <class T1, class T2>   class compressed_pair_imp<T1, T2, 0>   {   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) {}      compressed_pair_imp(second_param_type y)         : 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(::boost::compressed_pair<T1, T2>& y)      {         cp_swap(first_, y.first());         cp_swap(second_, y.second());      }   private:      first_type first_;      second_type second_;   };   // 1    derive from T1   template <class T1, class T2>   class compressed_pair_imp<T1, T2, 1>      : private ::boost::remove_cv<T1>::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_imp() {}      compressed_pair_imp(first_param_type x, second_param_type y)         : first_type(x), second_(y) {}      compressed_pair_imp(first_param_type x)         : first_type(x) {}      compressed_pair_imp(second_param_type y)         : second_(y) {}      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(::boost::compressed_pair<T1,T2>& y)      {         // no need to swap empty base class:         cp_swap(second_, y.second());      }   private:      second_type second_;   };   // 2    derive from T2   template <class T1, class T2>   class compressed_pair_imp<T1, T2, 2>      : private ::boost::remove_cv<T2>::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_imp() {}      compressed_pair_imp(first_param_type x, second_param_type y)         : second_type(y), first_(x) {}      compressed_pair_imp(first_param_type x)         : first_(x) {}      compressed_pair_imp(second_param_type y)         : second_type(y) {}      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(::boost::compressed_pair<T1,T2>& y)      {         // no need to swap empty base class:         cp_swap(first_, y.first());      }   private:      first_type first_;   };   // 3    derive from T1 and T2

⌨️ 快捷键说明

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