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

📄 test7.cpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 CPP
字号:
//-----------------------------------------------------------------------------// boost-libs variant/test/test7.cpp header file// See http://www.boost.org for updates, documentation, and revision history.//-----------------------------------------------------------------------------//// Copyright (c) 2003// Eric Friedman, Itay Maman//// Distributed under 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)#include "boost/test/minimal.hpp"#include "boost/variant.hpp"#include "jobs.h"#include <iostream>#include <algorithm>#include <string>#include <map>#include "boost/detail/workaround.hpp"#if BOOST_WORKAROUND(BOOST_MSVC, <= 1200)#   include "boost/mpl/bool.hpp"#   include "boost/type_traits/is_same.hpp"#endifusing namespace boost;using namespace std;struct jas{   jas(int n = 364);   jas(const jas& other);   ~jas();   jas& operator=(const jas& other);   void swap(jas& other);   int n_;   int sn_;   static int s_inst_id_;}; struct Tracker{   typedef map<const jas*,int> table_type;   typedef table_type::iterator iterator_type;   static table_type s_this_to_sn_;   static void insert(const jas& j)   {      s_this_to_sn_[&j] = j.sn_;            cout << "jas( " << j.sn_ << ") Registered" << endl;   }      static void remove(const jas& j)   {      iterator_type iter = s_this_to_sn_.find(&j);      BOOST_CHECK(iter != s_this_to_sn_.end());      BOOST_CHECK( ((*iter).second) == j.sn_);      int sn = (*iter).second;      if(sn != j.sn_)      {         cout << "Mismatch: this = " << (*iter).first << ", sn_ = " << sn            << ", other: this = " << &j << ", j.sn_ = " << j.sn_ << endl;      }      BOOST_CHECK(sn == j.sn_);               s_this_to_sn_.erase(&j);      cout << "jas( " << j.sn_ << ") Removed" << endl;   }   static void check()   {      BOOST_CHECK(s_this_to_sn_.empty());         }};Tracker::table_type Tracker::s_this_to_sn_;jas::jas(int n) : n_(n) {    sn_ = s_inst_id_;   s_inst_id_ += 1;         Tracker::insert(*this);}jas::jas(const jas& other) : n_(other.n_){   sn_ = s_inst_id_;   s_inst_id_ += 1;         Tracker::insert(*this);}jas::~jas(){   Tracker::remove(*this);}jas& jas::operator=(const jas& other){   jas temp(other);   swap(temp);   return *this;}void jas::swap(jas& other){      Tracker::remove(*this);   Tracker::remove(other);   std::swap(n_, other.n_);   std::swap(sn_, other.sn_);   Tracker::insert(*this);   Tracker::insert(other);}int jas::s_inst_id_ = 0;bool operator==(const jas& a, const jas& b){   return a.n_ == b.n_;}ostream& operator<<(ostream& out, const jas& a){   cout << "jas::n_ = " << a.n_;   return out;}template<typename ValueType>struct compare_helper : boost::static_visitor<bool>{   compare_helper(ValueType& expected) : expected_(expected) { }#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1200)   bool operator()(const ValueType& value)   {      return value == expected_;   }   template <typename T>   bool operator()(const T& )   {      return false;            }#else // MSVC6private:   bool compare_impl(const ValueType& value, boost::mpl::true_)   {      return value == expected_;   }   template <typename T>   bool compare_impl(const T&, boost::mpl::false_)   {      return false;   }public:   template <typename T>   bool operator()(const T& value)   {      typedef typename boost::is_same<T, ValueType>::type          T_is_ValueType;      return compare_impl(value, T_is_ValueType());   }#endif // MSVC6 workaround   ValueType& expected_;};template<typename VariantType, typename ExpectedType>void var_compare(const VariantType& v, ExpectedType expected){   compare_helper<ExpectedType> ch(expected);   bool checks = boost::apply_visitor(ch, v);   BOOST_CHECK(checks);}void run(){      variant<string, short> v0;   var_compare(v0, string(""));   v0 = 8;   var_compare(v0, static_cast<short>(8));   v0 = "penny lane";   var_compare(v0, string("penny lane"));   variant<jas, string, int> v1, v2 = jas(195);   var_compare(v1, jas(364));   v1 = jas(500);   v1.swap(v2);   var_compare(v1, jas(195));   var_compare(v2, jas(500));   variant<string, int> v3;   var_compare(v3, string(""));}int test_main(int , char* []){   run();   Tracker::check();   return 0;}

⌨️ 快捷键说明

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