• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 58,  comments - 75,  trackbacks - 0

            connection BOOST_SIGNALS_SIGNAL::connect(const slot_type& in_slot, //引發(fā)slot的構(gòu)造,主要初始化存儲(chǔ)信號(hào)源信息的結(jié)構(gòu)
                                        connect_position at)
            {
             using boost::BOOST_SIGNALS_NAMESPACE::detail::stored_group;

             if (!in_slot.is_active())
             {
              return BOOST_SIGNALS_NAMESPACE::connection();
                }

             return impl->connect_slot(in_slot.get_slot_function(), stored_group(),
                        in_slot.get_data(), at); //調(diào)用了signal_base_impl的connect_slot
            }

            slot的構(gòu)造函數(shù)簡版?zhèn)未a

            slot(const function& f) : slot_function(get_invocable_slot(f, tag_type(f)))
            {
             this->data.reset(new data_t);

             basic_connection* con = new basic_connection();

             con->signal = static_cast<void*>(this);
             con->signal_data = 0;
             con->blocked_ = false ;
             con->signal_disconnect = &bound_object_destructed;

             data->watch_bound_objects.reset(con);
             data->watch_bound_objects.set_controlling(true);
            }

            connection signal_base_impl::connect_slot(const any& slot_, //這里其實(shí)傳入的是function
                               const stored_group& name,
                               shared_ptr<slot_base::data_t> data, //slot構(gòu)造的用來存儲(chǔ)信號(hào)源信息的結(jié)構(gòu)
                               connect_position at)
            {
             data->watch_bound_objects.set_controlling(false);
             scoped_connection safe_connection(data->watch_bound_objects);

             std::auto_ptr<iterator> saved_iter(new iterator);

             iterator pos = slots_.insert(name, data->watch_bound_objects, slot_, at); //將連接與function插入到map中

             *saved_iter = pos;

             data->watch_bound_objects.get_connection()->signal = this; //連接的signal
             data->watch_bound_objects.get_connection()->signal_data = saved_iter.release(); //在容器中的迭代位子
             data->watch_bound_objects.get_connection()->signal_disconnect = &signal_base_impl::slot_disconnected; //斷開連接的函數(shù)

             pos->first.set_controlling();
             return safe_connection.release();
            }

            //map的插入,將一個(gè)連接和function組成一個(gè)pair,插入到map中
            named_slot_map::iterator
            named_slot_map::insert(const stored_group& name, const connection& con,
                                   const any& slot, connect_position at)
            {
              group_iterator group;
              if (name.empty()) {
                switch (at) {
                case at_front: group = groups.begin(); break;
                case at_back: group = back; break;
                }
              } else {
                group = groups.find(name);
                if (group == groups.end()) {
                  slot_container_type::value_type v(name, group_list());
                  group = groups.insert(v).first;
                }
              }
              iterator it;
              it.group = group;
              it.last_group = groups.end();

              switch (at) {
              case at_back:
                group->second.push_back(connection_slot_pair(con, slot));
                it.slot_ = group->second.end();
                it.slot_assigned = true;
                --(it.slot_);
                break;

              case at_front:
                group->second.push_front(connection_slot_pair(con, slot));
                it.slot_ = group->second.begin();
                it.slot_assigned = true;
                break;
              }
              return it;
            }

            連接的結(jié)構(gòu)
            struct basic_connection
            {
             void* signal; //signal對(duì)象指針,是這個(gè)connection的管理者
             void* signal_data; //在signal中的slot管理器中的迭代器對(duì)象的指針
             void (*signal_disconnect)(void*, void*); //解除連接的函數(shù)執(zhí)政
             bool blocked_;

             std::list<bound_object> bound_objects;
            };

            class BOOST_SIGNALS_DECL connection :
              private less_than_comparable1<connection>,
              private equality_comparable1<connection>
            {
            public:
              connection() : con(), controlling_connection(false) {}
              connection(const connection&);
              ~connection();

              // Block he connection: if the connection is still active, there
              // will be no notification
              void block(bool should_block = true) { con->blocked_ = should_block; }
              void unblock() { con->blocked_ = false; }
              bool blocked() const { return !connected() || con->blocked_; }

              // Disconnect the signal and slot, if they are connected
              void disconnect() const;

              // Returns true if the signal and slot are connected
              bool connected() const { return con.get() && con->signal_disconnect; }

              // Comparison of connections
              bool operator==(const connection& other) const;
              bool operator<(const connection& other) const;

              // Connection assignment
              connection& operator=(const connection& other) ;

              // Swap connections
              void swap(connection& other);

            public: // TBD: CHANGE THIS
              // Set whether this connection object is controlling or not
              void set_controlling(bool control = true)
              { controlling_connection = control; }

              shared_ptr<BOOST_SIGNALS_NAMESPACE::detail::basic_connection>
              get_connection() const
              { return con; }

            private:
              friend class detail::signal_base_impl;
              friend class detail::slot_base;
              friend class trackable;

              // Reset this connection to refer to a different actual connection
              void reset(BOOST_SIGNALS_NAMESPACE::detail::basic_connection*);

              // Add a bound object to this connection (not for users)
              void add_bound_object(const BOOST_SIGNALS_NAMESPACE::detail::bound_object& b);

              friend class BOOST_SIGNALS_NAMESPACE::detail::bound_objects_visitor;

              // Pointer to the actual contents of the connection
              shared_ptr<BOOST_SIGNALS_NAMESPACE::detail::basic_connection> con;

              // True if the destruction of this connection object should disconnect
              bool controlling_connection;
            };

            posted on 2007-04-23 15:04 walkspeed 閱讀(582) 評(píng)論(0)  編輯 收藏 引用 所屬分類: boost學(xué)習(xí)

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(4)

            隨筆分類(64)

            隨筆檔案(58)

            文章分類(3)

            文章檔案(3)

            相冊

            收藏夾(9)

            C++零碎

            好友

            搜索

            •  

            積分與排名

            • 積分 - 161396
            • 排名 - 163

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久天天躁狠狠躁夜夜2020一| 亚洲AV日韩精品久久久久| 精品久久久无码人妻中文字幕| 精品无码人妻久久久久久| 99久久综合狠狠综合久久| 久久人人爽人人澡人人高潮AV| 久久精品女人天堂AV麻| 精品熟女少妇AV免费久久| 久久亚洲中文字幕精品有坂深雪| 狠狠色丁香久久综合五月| 久久久久综合国产欧美一区二区| 午夜精品久久久久9999高清| 精品久久久久久无码中文字幕一区 | 久久男人中文字幕资源站| 亚洲国产视频久久| 久久99毛片免费观看不卡| 久久一区二区免费播放| 亚洲AV无码久久精品狠狠爱浪潮| 久久综合久久久| 激情伊人五月天久久综合| 久久影视综合亚洲| 97久久精品无码一区二区| 性欧美丰满熟妇XXXX性久久久| 国产精品久久久99| 国内精品久久久久影院一蜜桃| 久久婷婷人人澡人人| 精品999久久久久久中文字幕| 久久精品卫校国产小美女| 久久九九久精品国产免费直播| 99国产欧美久久久精品蜜芽| 热久久视久久精品18| 久久免费99精品国产自在现线 | 女人香蕉久久**毛片精品| 久久人人青草97香蕉| 久久久久99精品成人片| 国产精品欧美亚洲韩国日本久久| 99re这里只有精品热久久| 久久ww精品w免费人成| 狠色狠色狠狠色综合久久| 久久天天躁狠狠躁夜夜躁2O2O | 伊色综合久久之综合久久|