123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- //-----------------------------------------------------------------------------
- // 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/type_index.hpp"
- #include "boost/detail/workaround.hpp"
- #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0551))
- # pragma warn -lvc
- #endif
- struct 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 type
- struct 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_double
- struct 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_printer
- struct 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_adder
- template<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_TEST(boost::apply_visitor(total_sizeof(), cvar) == sizeof(S));
- BOOST_TEST(cvar.type() == boost::typeindex::type_id<S>());
- //
- // Check get<>()
- //
- BOOST_TEST(boost::get<S>(&var));
- BOOST_TEST(boost::get<S>(&cvar));
- const S* ptr1 = 0;
- const S* ptr2 = 0;
- try
- {
- S& r = boost::get<S>(var);
- ptr1 = &r;
- }
- catch(const boost::bad_get& )
- {
- BOOST_ERROR( "get<S> failed unexpectedly" );
- }
- try
- {
- const S& cr = boost::get<S>(cvar);
- ptr2 = &cr;
- }
- catch(const boost::bad_get& )
- {
- BOOST_ERROR( "get<S> const failed unexpectedly" );
- }
- BOOST_TEST(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_TEST(temp == str);
- }
- }
- template<typename VariantType, typename S>
- inline void verify_not(VariantType& var, spec<S>)
- {
- const VariantType& cvar = var;
- BOOST_TEST(cvar.type() != boost::typeindex::type_id<S>());
- //
- // Check get<>()
- //
- BOOST_TEST(!boost::get<S>(&var));
- BOOST_TEST(!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(const 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(const boost::bad_get& )
- {
- // do nothing except pass-through
- }
- BOOST_TEST(ptr1 == 0 && ptr2 == 0);
- }
- #endif //_JOBSH_INC_
|