backup
[platform/upstream/libzypp.git] / devel / devel.ma / MaTest.cc
1 #include <iostream>
2
3 #include <boost/signal.hpp>
4 #include <boost/bind.hpp>
5
6 #include <zypp/base/LogTools.h>
7 #include <zypp/base/Easy.h>
8
9 using std::endl;
10 using std::cout;
11
12 namespace boost
13 {
14   template<class Tp>
15       std::ostream & operator<<( std::ostream & str, const signal<Tp> & obj )
16   {
17     return str << "Connected slots: " << obj.num_slots();
18   }
19
20  namespace signals
21  {
22   std::ostream & operator<<( std::ostream & str, const connection & obj )
23   {
24     return str << "Connection: "
25         << ( obj.connected() ? '*' : '_' )
26         << ( obj.blocked()   ? 'B' : '_' )
27         ;
28   }
29  }
30 }
31
32 using namespace zypp;
33
34 using boost::signal;
35 using boost::signals::connection;
36 using boost::signals::trackable;
37
38 struct HelloWorld
39 {
40   HelloWorld() {++i;}
41   HelloWorld(const HelloWorld &) {++i;}
42   ~HelloWorld() { --i;}
43
44   void operator()(unsigned) const
45   {
46     USR << "Hello, World! " << i << std::endl;
47   }
48
49   static int i;
50 };
51
52 int HelloWorld::i = 0;
53
54 struct M
55 {
56   void ping() const
57   {
58     static unsigned i = 0;
59     _sigA( ++i );
60   }
61
62   typedef signal<void(unsigned)> SigA;
63
64   SigA & siga() const { return _sigA; }
65
66   mutable SigA _sigA;
67 };
68
69 struct X : public trackable
70 {
71   X() {++s;}
72   X( const X & ) {++s;}
73   ~X() {--s;}
74   static int s;
75
76   void pong( unsigned i ) const
77   {
78     DBG << s << ' ' << i << endl;
79   }
80 };
81
82 int X::s;
83
84 /******************************************************************
85 **
86 **      FUNCTION NAME : main
87 **      FUNCTION TYPE : int
88 */
89 int main( int argc, const char * argv[] )
90 {
91   --argc; ++argv; // skip arg 0
92
93   M m;
94   X xx;
95   m.siga().connect( boost::bind( &X::pong, &xx, _1 ) );
96   m.ping();
97
98   {
99     X x;
100     m.siga().connect( boost::bind( &X::pong, &x, _1 ) );
101     m.ping();
102   }
103
104   m.ping();
105
106   ///////////////////////////////////////////
107
108   INT << "---STOP" << endl;
109   return 0;
110 }
111