OSDN Git Service

first commit.
[gintenlib/gintenlib.git] / tests / move_ptr.cc
1 #include "../gintenlib/move_ptr.hpp"
2
3 // ²¾¥Æ¥¹¥È¥³¡¼¥É¤Ê¤Î¤Ç
4 // boost.test ¤Ï¤Þ¤À»È¤ï¤Ê¤¤¡£
5 // ¥³¥á¥ó¥È¤â¾¯¤Ê¤¯Èó¾ï¤Ë¸«Æñ¤¤¥Æ¥¹¥È¤Ç¤¹¤¬¡¢
6 // ½ÐÎϤȥ½¡¼¥¹¤ò¸«Èæ¤Ù¤Æ²¿¤¬µ¯¤³¤Ã¤Æ¤ë¤«¤òÇÄ°®¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤
7
8 struct hoge
9 {
10   // virtual implementation model
11   virtual ~hoge() {}
12
13   virtual void foo() = 0;
14
15   // ´Ø¿ô¤ÎÌá¤êÃͤȤ·¤Æ»È¤¦¤³¤È¤¬½ÐÍè¤ë
16   static gintenlib::move_ptr<hoge> create( int i );
17   // static std::auto_ptr<hoge> create( int i );
18
19 };
20
21 #include <iostream>
22 using namespace std;
23
24 // Ê̤ÎÎã¡¢ºï½üÍÑ¥Õ¥¡¥ó¥¯¥¿¤òÍÑ°Õ¤¹¤ë
25 struct my_deleter
26 {
27   my_deleter( int x = 0 ) : i(x) {}
28   
29   template<typename T>
30   void operator()( T* ptr )
31   {
32     cout << *this << ": deleting '" << *ptr << "'...\n";
33     delete ptr;
34   }
35   
36   friend ostream& operator<< ( ostream& os, const my_deleter& rhs )
37   {
38     os << "my_deleter";
39     
40     if( rhs.i > 0 )
41     {
42       os << " No." << rhs.i;
43     }
44     
45     return os;
46   }
47   
48   int i;
49 };
50
51 int main()
52 {
53   gintenlib::move_ptr<hoge> p1, p2( hoge::create(2) );
54   
55   assert( !p1 );
56   assert( p1 == 0 );
57   assert( p2 );
58   assert( p2 != 0 );
59   
60   assert( p1 != p2 );
61   assert( !( p1 == p2 ) );
62   
63   gintenlib::move_ptr<hoge> p3 = p2;
64   
65   assert( !p2 );
66   assert( p3 );
67   
68   swap( p1, p3 );
69   
70   assert( p1 );
71   assert( !p3 );
72   
73   p1->foo();
74   p1.reset();
75   
76   // ¼«ºî¥Ç¥ê¡¼¥¿¤ò»È¤Ã¤Æ¤ß¤ë
77   gintenlib::move_ptr< int, my_deleter > p4( new int(4) ), p5( new int(5), my_deleter(2) );
78   p4 = p5;
79   cout << *p4 << endl;
80   
81   gintenlib::move_ptr< const int, my_deleter > p6( p4 );
82   p4.reset( new int(4), my_deleter(3) );
83   
84   my_deleter del;
85   cout << get_deleter(p4) << endl;
86   delete p4.release( del );
87   cout << del << endl;
88   
89   p4 = gintenlib::const_pointer_cast<int>(p6);
90   assert( !p6 );
91   
92   cout << "scope out.\n";
93 }
94
95 // ËÜÍè¤ÏÊÌ¥Õ¥¡¥¤¥ë¤ËÃÖ¤¯¤Ù¤­¤Ç¤¹¤¬´Êά¤Î¤¿¤á¡£
96 gintenlib::move_ptr<hoge> hoge::create( int i )
97 {
98   struct impl : hoge
99   {
100     explicit impl( int x = 0 ) : i(x)
101     {
102       cout << "hoge(" << i << ") is constructed.\n";
103     }
104     ~impl()
105     {
106       cout << "hoge(" << i << ") is destructed.\n";
107     }
108     
109     virtual void foo()
110     {
111       cout << "hoge(" << i << ").foo() is called.\n";
112     }
113     
114    private:
115     int i;
116   };
117   
118   return gintenlib::move_ptr<hoge>( new impl(i) );
119 }