zoukankan      html  css  js  c++  java
  • c++: simple signal lib

    //typedef function0 <int> FunctionType;
    #include <iostream>
    #include <boost/shared_ptr.hpp>
    #include <vector>
    #include <algorithm>

    using namespace boost;
    using namespace std;

    typedef int RType;
    typedef RType (*FunctionType)();

    class MySlot
    {
    public:
        bool IsValid() {return fun_!=0;}
        //bool operator == (MySlot const &rls) {return this==&rls;}
    //protected:
    //private:
        //friend class MyConnection;
        FunctionType    fun_;
    };

    class MySignal0;

    class MyConnection
    {
    public:
        bool    IsValid() {return slot_ && slot_->IsValid();}
        void     Disconnect();
        
        bool operator == (MyConnection const &rls) {return signal_ == rls.signal_ && rls.slot_ == slot_;}
        
    //protected:
    //private:
        //friend class MySignal0;
        shared_ptr<MySlot>    slot_;    //for see connection's state
        MySignal0*            signal_;//for disconnect
    };

        
        
    class MySignal0
    {
    public:
        
        //MyConnection Connect(const FunctionType & fun)    
        MyConnection Connect(FunctionType fun)    
        {
            MyConnection con;
            con.slot_.reset(new MySlot);
            con.slot_->fun_ = fun;
            con.signal_ = this;
            
            cons_.push_back(con);
            
            return con;
        }
        
        RType operator()()
        {
            vector <MyConnection>::iterator it = cons_.begin();
            vector <MyConnection>::iterator itEnd = cons_.end();
            RType r = RType();
            
            for(;it!=itEnd;++it)
            {
                if((*it).slot_)
                    r = (*it).slot_->fun_();
            }
                
            return r;
        }
        
    //protected:
    //private:
        void Remove(MyConnection const &con)
        {
            vector <MyConnection>::iterator it = std::find(cons_.begin(),cons_.end(),con);
            if(it!=cons_.end())
            {
                (*it).slot_.reset();
                std::remove(cons_.begin(),cons_.end(),con);
                cout<<"Remove Succeed.\n";
            }
            else
                cout<<"Remove Fail.\n";
        }
        
        vector <MyConnection>  cons_;
        
    };

    void     MyConnection::Disconnect(){    
            signal_->Remove(*this);
    }

    int f() {
        cout<<"f()\n";
        return 0;
    }

    void main1()
    {
        MySignal0 sig;
        
        MyConnection con = sig.Connect(f);
        sig();
        con.Disconnect();
        sig();
    }

    void main()
    {
        MyConnection con;
        
        cout<<"after init con:\n";
        cout<<"con is_valid:"<<con.IsValid()<<endl;
        
        {
            MySignal0 sig;
            
            cout<<"after connect to sig:\n";
            con = sig.Connect(f);
            sig();
            cout<<"con is_valid:"<<con.IsValid()<<endl;
            
            cout<<"after disconnect:\n";
            con.Disconnect();
            sig();
            cout<<"con is_valid:"<<con.IsValid()<<endl;
        }
        
        cout<<"after signal destruct:\n";
        cout<<"con is_valid:"<<con.IsValid()<<endl;
    }
  • 相关阅读:
    Redis(01)基础知识
    MySQL(05)触发器&事件&事务&锁
    MySQL(04)索引&存储过程
    MySQL(02)DDL&DML
    MySQL(03)表查询
    Go高级编程(01)
    兼容IE8灰色遮罩层处理方法
    AJAX请求跨域的问题
    Sql Server批量删除数据表
    [转]SQL操作日期
  • 原文地址:https://www.cnblogs.com/cutepig/p/1956933.html
Copyright © 2011-2022 走看看