stdcpp/tsrc/Boost_test/variant/src/test7.cpp
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 //-----------------------------------------------------------------------------
       
     2 // boost-libs variant/test/test7.cpp header file
       
     3 // See http://www.boost.org for updates, documentation, and revision history.
       
     4 //-----------------------------------------------------------------------------
       
     5 //
       
     6 // Copyright (c) 2003
       
     7 // Eric Friedman, Itay Maman
       
     8 //
       
     9 // Distributed under the Boost Software License, Version 1.0. (See
       
    10 // accompanying file LICENSE_1_0.txt or copy at
       
    11 // http://www.boost.org/LICENSE_1_0.txt)
       
    12 /*
       
    13  * © Portions copyright (c) 2006-2007 Nokia Corporation.  All rights reserved.
       
    14 */
       
    15 
       
    16 #include "boost/test/minimal.hpp"
       
    17 #include "boost/variant.hpp"
       
    18 
       
    19 #include "jobs.h"
       
    20 
       
    21 #include <iostream>
       
    22 #include <algorithm>
       
    23 #include <string>
       
    24 #include <map>
       
    25 
       
    26 #include "boost/detail/workaround.hpp"
       
    27 #if BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
       
    28 #   include "boost/mpl/bool.hpp"
       
    29 #   include "boost/type_traits/is_same.hpp"
       
    30 #endif
       
    31 
       
    32 
       
    33 using namespace boost;
       
    34 using namespace std;
       
    35 
       
    36 
       
    37 struct jas
       
    38 {
       
    39    jas(int n = 364);
       
    40    jas(const jas& other);
       
    41 
       
    42    ~jas();
       
    43    jas& operator=(const jas& other);
       
    44 
       
    45    void swap(jas& other);
       
    46 
       
    47    int n_;
       
    48 
       
    49    int sn_;
       
    50    static int s_inst_id_;
       
    51 }; 
       
    52 
       
    53 struct Tracker
       
    54 {
       
    55    typedef map<const jas*,int> table_type;
       
    56    typedef table_type::iterator iterator_type;
       
    57 
       
    58    static table_type s_this_to_sn_;
       
    59 
       
    60    static void insert(const jas& j)
       
    61    {
       
    62       s_this_to_sn_[&j] = j.sn_;      
       
    63       cout << "jas( " << j.sn_ << ") Registered" << endl;
       
    64    }
       
    65    
       
    66    static void remove(const jas& j)
       
    67    {
       
    68       iterator_type iter = s_this_to_sn_.find(&j);
       
    69       BOOST_CHECK(iter != s_this_to_sn_.end());
       
    70       BOOST_CHECK( ((*iter).second) == j.sn_);
       
    71 
       
    72       int sn = (*iter).second;
       
    73       if(sn != j.sn_)
       
    74       {
       
    75          cout << "Mismatch: this = " << (*iter).first << ", sn_ = " << sn
       
    76             << ", other: this = " << &j << ", j.sn_ = " << j.sn_ << endl;
       
    77       }
       
    78 
       
    79       BOOST_CHECK(sn == j.sn_);
       
    80 
       
    81    
       
    82 
       
    83       
       
    84 
       
    85       s_this_to_sn_.erase(&j);
       
    86       cout << "jas( " << j.sn_ << ") Removed" << endl;
       
    87    }
       
    88 
       
    89    static void check()
       
    90    {
       
    91       BOOST_CHECK(s_this_to_sn_.empty());      
       
    92    }
       
    93 };
       
    94 
       
    95 Tracker::table_type Tracker::s_this_to_sn_;
       
    96 
       
    97 
       
    98 
       
    99 jas::jas(int n) : n_(n) 
       
   100 { 
       
   101    sn_ = s_inst_id_;
       
   102    s_inst_id_ += 1;
       
   103       
       
   104    Tracker::insert(*this);
       
   105 }
       
   106 
       
   107 jas::jas(const jas& other) : n_(other.n_)
       
   108 {
       
   109    sn_ = s_inst_id_;
       
   110    s_inst_id_ += 1;      
       
   111 
       
   112    Tracker::insert(*this);
       
   113 }
       
   114 
       
   115 jas::~jas()
       
   116 {
       
   117    Tracker::remove(*this);
       
   118 }
       
   119 
       
   120 jas& jas::operator=(const jas& other)
       
   121 {
       
   122    jas temp(other);
       
   123    swap(temp);
       
   124 
       
   125    return *this;
       
   126 }
       
   127 
       
   128 void jas::swap(jas& other)
       
   129 {   
       
   130    Tracker::remove(*this);
       
   131    Tracker::remove(other);
       
   132 
       
   133    std::swap(n_, other.n_);
       
   134    std::swap(sn_, other.sn_);
       
   135 
       
   136    Tracker::insert(*this);
       
   137    Tracker::insert(other);
       
   138 }
       
   139 
       
   140 int jas::s_inst_id_ = 0;
       
   141 
       
   142 
       
   143 bool operator==(const jas& a, const jas& b)
       
   144 {
       
   145    return a.n_ == b.n_;
       
   146 }
       
   147 
       
   148 ostream& operator<<(ostream& out, const jas& a)
       
   149 {
       
   150    cout << "jas::n_ = " << a.n_;
       
   151    return out;
       
   152 }
       
   153 
       
   154 
       
   155 template<typename ValueType>
       
   156 struct compare_helper : boost::static_visitor<bool>
       
   157 {
       
   158    compare_helper(ValueType& expected) : expected_(expected) { }
       
   159 
       
   160 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
       
   161 
       
   162    bool operator()(const ValueType& value)
       
   163    {
       
   164       return value == expected_;
       
   165    }
       
   166 
       
   167    template <typename T>
       
   168    bool operator()(const T& )
       
   169    {
       
   170       return false;         
       
   171    }
       
   172 
       
   173 #else // MSVC6
       
   174 
       
   175 private:
       
   176 
       
   177    bool compare_impl(const ValueType& value, boost::mpl::true_)
       
   178    {
       
   179       return value == expected_;
       
   180    }
       
   181 
       
   182    template <typename T>
       
   183    bool compare_impl(const T&, boost::mpl::false_)
       
   184    {
       
   185       return false;
       
   186    }
       
   187 
       
   188 public:
       
   189 
       
   190    template <typename T>
       
   191    bool operator()(const T& value)
       
   192    {
       
   193       typedef typename boost::is_same<T, ValueType>::type
       
   194           T_is_ValueType;
       
   195 
       
   196       return compare_impl(value, T_is_ValueType());
       
   197    }
       
   198 
       
   199 #endif // MSVC6 workaround
       
   200 
       
   201    ValueType& expected_;
       
   202 
       
   203 };
       
   204 
       
   205 template<typename VariantType, typename ExpectedType>
       
   206 void var_compare(const VariantType& v, ExpectedType expected)
       
   207 {
       
   208    compare_helper<ExpectedType> ch(expected);
       
   209 
       
   210    bool checks = boost::apply_visitor(ch, v);
       
   211    BOOST_CHECK(checks);
       
   212 }
       
   213 
       
   214 
       
   215 void run()
       
   216 {   
       
   217    variant<string, short> v0;
       
   218 
       
   219    var_compare(v0, string(""));
       
   220 
       
   221    v0 = 8;
       
   222    var_compare(v0, static_cast<short>(8));
       
   223 
       
   224    v0 = "penny lane";
       
   225    var_compare(v0, string("penny lane"));
       
   226 
       
   227    variant<jas, string, int> v1, v2 = jas(195);
       
   228    var_compare(v1, jas(364));
       
   229 
       
   230    v1 = jas(500);
       
   231    v1.swap(v2);
       
   232 
       
   233    var_compare(v1, jas(195));
       
   234    var_compare(v2, jas(500));
       
   235 
       
   236 
       
   237    variant<string, int> v3;
       
   238    var_compare(v3, string(""));
       
   239 }
       
   240 
       
   241 
       
   242 int test_main(int , char* [])
       
   243 {
       
   244 std_log(LOG_FILENAME_LINE,"[Test Case for test7]");
       
   245    run();
       
   246    Tracker::check();
       
   247 
       
   248 #ifdef __SYMBIAN32__
       
   249    	testResultXml("test7");
       
   250 	close_log_file();
       
   251 #endif
       
   252    return 0;
       
   253 }
       
   254