Wyrd

move_if_rr test

Mar 26th, 2012
163
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include "StdAfx.h"
  2.  
  3. #include <iostream>
  4. #include <tchar.h>
  5. #include <type_traits>
  6. #include <vector>
  7.  
  8. namespace
  9. {
  10.     // put your realization here
  11. }
  12.  
  13. namespace meta
  14. {
  15.     template< class T >
  16.     struct identity
  17.     {
  18.         typedef T
  19.             type;
  20.     };
  21.  
  22.     namespace impl
  23.     {
  24.         template< class T >
  25.         struct investigate_type__impl
  26.             :   identity< typename identity< T >::type >
  27.         {
  28.         };
  29.  
  30.     } // namespace impl
  31.  
  32.     template< class T >
  33.     struct investigate_type
  34.         :   identity< T >,
  35.             impl::investigate_type__impl< T >
  36.     {
  37.         struct X
  38.         {
  39.         };
  40.  
  41.         typedef X type;
  42.     };
  43.  
  44. } // namespace meta
  45.  
  46. std::vector< int > v;
  47.  
  48. struct A
  49. {
  50.     A() {}
  51.    
  52.     A( const A & )
  53.     {
  54.         v.push_back( 0 );
  55.  
  56.         std::cout << "copy" << std::endl;
  57.     }
  58.  
  59.     A( A && )
  60.     {
  61.         v.push_back( 1 );
  62.  
  63.         std::cout << "move" << std::endl;
  64.     }
  65.  
  66.     A &operator =( const A & )
  67.     {
  68.         v.push_back( 0 );
  69.  
  70.         std::cout << "copy" << std::endl;
  71.  
  72.         return *this;
  73.     }
  74.  
  75.     A &operator =( A && )
  76.     {
  77.         v.push_back( 1 );
  78.  
  79.         std::cout << "move" << std::endl;
  80.  
  81.         return *this;
  82.     }
  83. };
  84.  
  85. template< class U >
  86. class Container
  87. {  
  88.     U member;
  89.  
  90. public:
  91.  
  92.     U &Get(){ return member; }
  93.     const U &Get() const{ return member; }
  94.  
  95. public:
  96.  
  97.     template< class T > void dummy( const Container< T > & ); // copy
  98.     template< class T > void dummy( Container< T > && ); // move
  99.  
  100. public:
  101.  
  102.     // Ожидается, что T - это нечто совместимое с Container
  103.     template< class T >
  104.     void Fwd( T &&rr )
  105.     {
  106.         member = move_if_rr< T >( rr.Get() );
  107.  
  108.         // dummy( std::forward< T >( rr ) )
  109.     }
  110. };
  111.  
  112. int _tmain( int argc, _TCHAR* argv[] )
  113. {
  114.     {
  115.         struct A {};
  116.         struct B {};
  117.  
  118.         //
  119.         // < Result Type > = move_if_rr< In Fwd Type >( In Arg Type );
  120.         //
  121.         //                                                   In Fwd Type          In Arg Type                           Result Type
  122.         //                                                /***************/  /******************/                    /****************/
  123.         static_assert( std::is_same< decltype( move_if_rr</**/A        /**/>(/**/(const B &&)/**/(*(B *)nullptr) ) ),/**/const B &&/**/>::type::value, "Test failed!" );
  124.         static_assert( std::is_same< decltype( move_if_rr</**/A        /**/>(/**/(const B &) /**/(*(B *)nullptr) ) ),/**/const B &&/**/>::type::value, "Test failed!" );
  125.         static_assert( std::is_same< decltype( move_if_rr</**/A        /**/>(/**/(B &&)      /**/(*(B *)nullptr) ) ),/**/B &&      /**/>::type::value, "Test failed!" );
  126.         static_assert( std::is_same< decltype( move_if_rr</**/A        /**/>(/**/(B &)       /**/(*(B *)nullptr) ) ),/**/B &&      /**/>::type::value, "Test failed!" );
  127.         //                                                /**/         /**/  /**/            /**/                    /**/          /**/
  128.         static_assert( std::is_same< decltype( move_if_rr</**/A &      /**/>(/**/(const B &&)/**/(*(B *)nullptr) ) ),/**/const B & /**/>::type::value, "Test failed!" );
  129.         static_assert( std::is_same< decltype( move_if_rr</**/A &      /**/>(/**/(const B &) /**/(*(B *)nullptr) ) ),/**/const B & /**/>::type::value, "Test failed!" );
  130.         static_assert( std::is_same< decltype( move_if_rr</**/A &      /**/>(/**/(B &&)      /**/(*(B *)nullptr) ) ),/**/B &       /**/>::type::value, "Test failed!" );
  131.         static_assert( std::is_same< decltype( move_if_rr</**/A &      /**/>(/**/(B &)       /**/(*(B *)nullptr) ) ),/**/B &       /**/>::type::value, "Test failed!" );
  132.         //                                                /**/         /**/  /**/            /**/                    /**/          /**/
  133.         static_assert( std::is_same< decltype( move_if_rr</**/const A &/**/>(/**/(const B &&)/**/(*(B *)nullptr) ) ),/**/const B & /**/>::type::value, "Test failed!" );
  134.         static_assert( std::is_same< decltype( move_if_rr</**/const A &/**/>(/**/(const B &) /**/(*(B *)nullptr) ) ),/**/const B & /**/>::type::value, "Test failed!" );
  135.         static_assert( std::is_same< decltype( move_if_rr</**/const A &/**/>(/**/(B &&)      /**/(*(B *)nullptr) ) ),/**/B &       /**/>::type::value, "Test failed!" );
  136.         static_assert( std::is_same< decltype( move_if_rr</**/const A &/**/>(/**/(B &)       /**/(*(B *)nullptr) ) ),/**/B &       /**/>::type::value, "Test failed!" );
  137.         //                                                /**/         /**/  /**/            /**/                    /**/          /**/
  138.         static_assert( std::is_same< decltype( move_if_rr</**/const A  /**/>(/**/(const B &&)/**/(*(B *)nullptr) ) ),/**/const B & /**/>::type::value, "Test failed!" );
  139.         static_assert( std::is_same< decltype( move_if_rr</**/const A  /**/>(/**/(const B &) /**/(*(B *)nullptr) ) ),/**/const B & /**/>::type::value, "Test failed!" );
  140.         static_assert( std::is_same< decltype( move_if_rr</**/const A  /**/>(/**/(B &&)      /**/(*(B *)nullptr) ) ),/**/B &       /**/>::type::value, "Test failed!" );
  141.         static_assert( std::is_same< decltype( move_if_rr</**/const A  /**/>(/**/(B &)       /**/(*(B *)nullptr) ) ),/**/B &       /**/>::type::value, "Test failed!" );
  142.         //                                                /***************/  /******************/                    /****************/
  143.     }
  144.  
  145.     Container< A >       a;
  146.     Container< A >       x;
  147.     const Container< A > cx;
  148.  
  149.     a.Fwd( (const Container< A > &)cx );
  150.     a.Fwd( x );
  151.     a.Fwd( cx );
  152.     a.Fwd( std::move( x ) );
  153.     a.Fwd( std::move( cx ) );
  154.     a.Fwd( Container< A >() );
  155.  
  156.     std::cout << std::endl;
  157.  
  158.     if( v.size() == 6 &&
  159.         v[0] == 0 &&
  160.         v[1] == 0 &&
  161.         v[2] == 0 &&
  162.         v[3] == 1 &&
  163.         v[4] == 0 &&
  164.         v[5] == 1 )
  165.     {
  166.         std::cout << "Passed." << std::endl;
  167.     }
  168.     else
  169.     {
  170.         std::cout << "Failed." << std::endl;
  171.     }
  172.    
  173.     return 0;
  174. }
RAW Paste Data