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

📄 jobs.h

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 H
字号:
//-----------------------------------------------------------------------------// boost-libs variant/libs/test/jobs.h 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)#ifndef _JOBSH_INC_#define _JOBSH_INC_#include <algorithm>#include <iostream>#include <sstream>#include <string>#include <typeinfo>#include <vector>#include "boost/variant/variant_fwd.hpp"#include "boost/variant/get.hpp"#include "boost/variant/apply_visitor.hpp"#include "boost/variant/static_visitor.hpp"#include "boost/detail/workaround.hpp"#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0551))#    pragma warn -lvc#endifstruct to_text : boost::static_visitor<std::string>{private: // NO_FUNCTION_TEMPLATE_ORDERING workaround    template < BOOST_VARIANT_ENUM_PARAMS(typename U) >    std::string to_text_impl(          const boost::variant< BOOST_VARIANT_ENUM_PARAMS(U) >& operand, long        ) const    {        std::ostringstream ost;        ost << "[V] " << boost::apply_visitor(to_text(), operand);        return ost.str();    }    template <typename Value>    std::string to_text_impl(const Value& operand, int) const    {        std::ostringstream ost;        ost << "[V] " << operand;        return ost.str();    }public:    template <typename T>    std::string operator()(const T& operand) const    {        return to_text_impl(operand, 1L);    }};struct total_sizeof : boost::static_visitor<int>{   total_sizeof() : total_(0) { }   template<class Value>   int operator()(const Value&) const   {      total_ += sizeof(Value);      return total_;   }   int result() const   {      return total_;   }   mutable int total_;}; // total_sizeof//Function object: sum_int//Description: Compute total sum of a series of numbers, (when called successively)//Use sizeof(T) if applied with a non-integral typestruct sum_int : boost::static_visitor<int>{      sum_int() : total_(0) { }   template<int n>   struct int_to_type   {      BOOST_STATIC_CONSTANT(int, value = n);   };    //Integral type - add numerical value   template<typename T>   void add(T t, int_to_type<true> ) const   {      total_ += t;   }   //Other types - add sizeof<T>   template<typename T>   void add(T& , int_to_type<false> ) const   {      total_ += sizeof(T);   }   template<typename T>   int operator()(const T& t) const   {      //Int_to_type is used to select the correct add() overload      add(t, int_to_type<boost::is_integral<T>::value>());      return total_;   }   int result() const   {      return total_;   }private:   mutable int total_;}; //sum_int//Function object: sum_double//Description: Compute total sum of a series of numbers, (when called successively)//Accpetable input types: float, double (Other types are silently ignored)struct sum_double : boost::static_visitor<double>{      sum_double() : total_(0) { }   void operator()(float value) const   {      total_ += value;   }   void operator()(double value) const   {      total_ += value;   }   template<typename T>   void operator()(const T&) const   {      //Do nothing   }   double result() const   {      return total_;   }private:   mutable double total_;}; //sum_doublestruct int_printer : boost::static_visitor<std::string>{      int_printer(std::string prefix_s = "") : prefix_s_(prefix_s) { }   int_printer(const int_printer& other) : prefix_s_(other.prefix_s_)   {      ost_ << other.str();   }   std::string operator()(int x) const   {      ost_ << prefix_s_ << x;      return str();   }   std::string operator()(const std::vector<int>& x) const   {      ost_ << prefix_s_;      //Use another Int_printer object for printing a list of all integers      int_printer job(",");      ost_ << std::for_each(x.begin(), x.end(), job).str();            return str();   }   std::string str() const   {      return ost_.str();   }private:   std::string prefix_s_;   mutable std::ostringstream ost_;};  //int_printerstruct int_adder : boost::static_visitor<>{      int_adder(int rhs) : rhs_(rhs) { }   result_type operator()(int& lhs) const   {      lhs += rhs_;   }   template<typename T>   result_type operator()(const T& ) const   {      //Do nothing   }   int rhs_;}; //int_adderstruct held_type_name : boost::static_visitor<std::string>{      template<typename T>   std::string operator()(const T& ) const   {      ost_ << '[' << typeid(T).name() << ']';      return result();   }   std::string result() const   {      return ost_.str();   }   mutable std::ostringstream ost_;}; //held_type_nametemplate<typename T>struct spec {   typedef T result;};template<typename VariantType, typename S>inline void verify(VariantType& var, spec<S>, std::string str = ""){   const VariantType& cvar = var;   BOOST_CHECK(boost::apply_visitor(total_sizeof(), cvar) == sizeof(S));   BOOST_CHECK(cvar.type() == typeid(S));   //   // Check get<>()   //   BOOST_CHECK(boost::get<S>(&var));   BOOST_CHECK(boost::get<S>(&cvar));   const S* ptr1 = 0;   const S* ptr2 = 0;   try   {      S& r = boost::get<S>(var);      ptr1 = &r;   }   catch(boost::bad_get& )   {      BOOST_ERROR( "get<S> failed unexpectedly" );   }   try   {      const S& cr = boost::get<S>(cvar);      ptr2 = &cr;   }   catch(boost::bad_get& )   {      BOOST_ERROR( "get<S> const failed unexpectedly" );   }   BOOST_CHECK(ptr1 != 0 && ptr2 == ptr1);   //   // Check string content   //   if(str.length() > 0)   {      std::string temp = boost::apply_visitor(to_text(), cvar);      std::cout << "temp = " << temp << ", str = " << str << std::endl;      BOOST_CHECK(temp == str);            }}template<typename VariantType, typename S>inline void verify_not(VariantType& var, spec<S>){   const VariantType& cvar = var;   BOOST_CHECK(cvar.type() != typeid(S));   //   // Check get<>()   //   BOOST_CHECK(!boost::get<S>(&var));   BOOST_CHECK(!boost::get<S>(&cvar));   const S* ptr1 = 0;   const S* ptr2 = 0;   try   {      S& r = boost::get<S>(var); // should throw      BOOST_ERROR( "get<S> passed unexpectedly" );      ptr1 = &r;   }   catch(boost::bad_get& )   {      // do nothing except pass-through   }   try   {      const S& cr = boost::get<S>(var); // should throw      BOOST_ERROR( "get<S> const passed unexpectedly" );      ptr2 = &cr;   }   catch(boost::bad_get& )   {      // do nothing except pass-through   }   BOOST_CHECK(ptr1 == 0 && ptr2 == 0);   }#endif //_JOBSH_INC_

⌨️ 快捷键说明

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