﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-选择C/C++-文章分类-boost学习</title><link>http://www.cppblog.com/walkspeed/category/4138.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 19:18:12 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 19:18:12 GMT</pubDate><ttl>60</ttl><item><title>slot定义与create_connection实现代码</title><link>http://www.cppblog.com/walkspeed/articles/22724.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Tue, 24 Apr 2007 07:15:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/articles/22724.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/22724.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/articles/22724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/22724.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/22724.html</trackback:ping><description><![CDATA[<p>/////////////////////////////////////////////////////////////////////<br>//slot_base<br>class BOOST_SIGNALS_DECL slot_base <br>{<br>public:<br>&nbsp;struct data_t <br>&nbsp;{<br>&nbsp;&nbsp;std::vector&lt;const trackable*&gt; bound_objects;<br>&nbsp;&nbsp;connection watch_bound_objects;<br>&nbsp;};<br>&nbsp;shared_ptr&lt;data_t&gt; get_data() const { return data; }</p>
<p>&nbsp;std::vector&lt;const trackable*&gt;&amp; get_bound_objects() const <br>&nbsp;{ <br>&nbsp;&nbsp;return data-&gt;bound_objects; <br>&nbsp;}</p>
<p>&nbsp;bool is_active() const <br>&nbsp;{ <br>&nbsp;&nbsp;return data-&gt;watch_bound_objects.connected(); <br>&nbsp;}</p>
<p>protected:<br>&nbsp;void create_connection();<br>&nbsp;shared_ptr&lt;data_t&gt; data;</p>
<p>private:<br>&nbsp;static void bound_object_destructed(void*, void*) {}<br>};</p>
<p>//////////////////////////////////////////////////////////////////////////////////<br>//slot<br>template&lt;typename SlotFunction&gt;<br>class slot : public BOOST_SIGNALS_NAMESPACE::detail::slot_base <br>{<br>&nbsp;typedef BOOST_SIGNALS_NAMESPACE::detail::slot_base inherited;<br>&nbsp;typedef typename inherited::data_t data_t;<br>public:<br>&nbsp;template&lt;typename F&gt;<br>&nbsp;slot(const F&amp; f) : slot_function(BOOST_SIGNALS_NAMESPACE::get_invocable_slot(f, BOOST_SIGNALS_NAMESPACE::tag_type(f)))<br>&nbsp;{<br>&nbsp;&nbsp;this-&gt;data.reset(new data_t);<br>&nbsp;&nbsp;BOOST_SIGNALS_NAMESPACE::detail::bound_objects_visitor do_bind(this-&gt;data-&gt;bound_objects);<br>&nbsp;&nbsp;visit_each(do_bind, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BOOST_SIGNALS_NAMESPACE::get_inspectable_slot<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (f, BOOST_SIGNALS_NAMESPACE::tag_type(f)));<br>&nbsp;&nbsp;create_connection();<br>&nbsp;}<br>public:<br>&nbsp;const SlotFunction&amp; get_slot_function() const { return slot_function; }</p>
<p>&nbsp;void release() const { data-&gt;watch_bound_objects.set_controlling(false); }</p>
<p>private:<br>&nbsp;slot(); <br>&nbsp;slot&amp; operator=(const slot&amp;); </p>
<p>&nbsp;SlotFunction slot_function;<br>};</p>
<p>//////////////////////////////////////////////////////////////////////////<br>//slot_base::create_connection<br>void slot_base::create_connection()<br>{<br>&nbsp;basic_connection* con = new basic_connection();</p>
<p>&nbsp;{<br>&nbsp;&nbsp;con-&gt;signal = static_cast&lt;void*&gt;(this);<br>&nbsp;&nbsp;con-&gt;signal_data = 0;<br>&nbsp;&nbsp;con-&gt;blocked_ = false ;<br>&nbsp;&nbsp;con-&gt;signal_disconnect = &amp;bound_object_destructed;<br>&nbsp;}<br>&nbsp;<br>&nbsp;data-&gt;watch_bound_objects.reset(con);</p>
<p>&nbsp;scoped_connection safe_connection(data-&gt;watch_bound_objects);</p>
<p>&nbsp;for(std::vector&lt;const trackable*&gt;::iterator i = data-&gt;bound_objects.begin();<br>&nbsp;&nbsp;i != data-&gt;bound_objects.end(); ++i) <br>&nbsp;{<br>&nbsp;&nbsp;BOOST_SIGNALS_NAMESPACE::detail::bound_object binding;<br>&nbsp;&nbsp;(*i)-&gt;signal_connected(data-&gt;watch_bound_objects, binding);</p>
<p>&nbsp;&nbsp;BOOST_SIGNALS_NAMESPACE::detail::auto_disconnect_bound_object disconnector(binding);</p>
<p>&nbsp;&nbsp;con-&gt;bound_objects.push_back(binding);<br>&nbsp;&nbsp;disconnector.release();<br>&nbsp;}</p>
<p>&nbsp;safe_connection.release();<br>&nbsp;data-&gt;watch_bound_objects.set_controlling(true);<br>}<br></p>
<img src ="http://www.cppblog.com/walkspeed/aggbug/22724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-04-24 15:15 <a href="http://www.cppblog.com/walkspeed/articles/22724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>signal中的connection的构造和slot记录</title><link>http://www.cppblog.com/walkspeed/articles/22645.html</link><dc:creator>walkspeed</dc:creator><author>walkspeed</author><pubDate>Mon, 23 Apr 2007 07:04:00 GMT</pubDate><guid>http://www.cppblog.com/walkspeed/articles/22645.html</guid><wfw:comment>http://www.cppblog.com/walkspeed/comments/22645.html</wfw:comment><comments>http://www.cppblog.com/walkspeed/articles/22645.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/walkspeed/comments/commentRss/22645.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/walkspeed/services/trackbacks/22645.html</trackback:ping><description><![CDATA[<p>connection　BOOST_SIGNALS_SIGNAL::connect(const slot_type&amp; in_slot, //引发slot的构造，主要初始化存储信号源信息的结构<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　　　　　　　　　　　　　 connect_position at)<br>{<br>&nbsp;using boost::BOOST_SIGNALS_NAMESPACE::detail::stored_group;</p>
<p>&nbsp;if (!in_slot.is_active()) <br>&nbsp;{<br>&nbsp;&nbsp;return BOOST_SIGNALS_NAMESPACE::connection();<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;return impl-&gt;connect_slot(in_slot.get_slot_function(), stored_group(),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in_slot.get_data(), at); //调用了signal_base_impl的connect_slot<br>}</p>
<p>slot的构造函数简版伪码</p>
<p>slot(const function&amp; f) : slot_function(get_invocable_slot(f, tag_type(f)))<br>{<br>&nbsp;this-&gt;data.reset(new data_t);</p>
<p>&nbsp;basic_connection* con = new basic_connection();</p>
<p>&nbsp;con-&gt;signal = static_cast&lt;void*&gt;(this);<br>&nbsp;con-&gt;signal_data = 0;<br>&nbsp;con-&gt;blocked_ = false ;<br>&nbsp;con-&gt;signal_disconnect = &amp;bound_object_destructed;</p>
<p>&nbsp;data-&gt;watch_bound_objects.reset(con);<br>&nbsp;data-&gt;watch_bound_objects.set_controlling(true);<br>}</p>
<p>connection signal_base_impl::connect_slot(const any&amp; slot_, //这里其实传入的是function<br>&nbsp;&nbsp;&nbsp; 　　　　　　　　　　　　　　 const stored_group&amp; name,<br>&nbsp;&nbsp;&nbsp; 　　　　　　　　　　　　　　 shared_ptr&lt;slot_base::data_t&gt; data, //slot构造的用来存储信号源信息的结构<br>&nbsp;&nbsp;&nbsp; 　　　　　　　　　　　　　　 connect_position at)<br>{<br>&nbsp;data-&gt;watch_bound_objects.set_controlling(false);<br>&nbsp;scoped_connection safe_connection(data-&gt;watch_bound_objects);</p>
<p>&nbsp;std::auto_ptr&lt;iterator&gt; saved_iter(new iterator);</p>
<p>&nbsp;iterator pos =　slots_.insert(name, data-&gt;watch_bound_objects, slot_, at); //将连接与function插入到map中</p>
<p>&nbsp;*saved_iter = pos;</p>
<p>&nbsp;data-&gt;watch_bound_objects.get_connection()-&gt;signal = this; //连接的signal<br>&nbsp;data-&gt;watch_bound_objects.get_connection()-&gt;signal_data =　saved_iter.release(); //在容器中的迭代位子<br>&nbsp;data-&gt;watch_bound_objects.get_connection()-&gt;signal_disconnect =　&amp;signal_base_impl::slot_disconnected; //断开连接的函数</p>
<p>&nbsp;pos-&gt;first.set_controlling();<br>&nbsp;return safe_connection.release();<br>}</p>
<p>//map的插入，将一个连接和function组成一个pair，插入到map中<br>named_slot_map::iterator<br>named_slot_map::insert(const stored_group&amp; name, const connection&amp; con,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const any&amp; slot, connect_position at)<br>{<br>&nbsp; group_iterator group;<br>&nbsp; if (name.empty()) {<br>&nbsp;&nbsp;&nbsp; switch (at) {<br>&nbsp;&nbsp;&nbsp; case at_front: group = groups.begin(); break;<br>&nbsp;&nbsp;&nbsp; case at_back: group = back; break;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; } else {<br>&nbsp;&nbsp;&nbsp; group = groups.find(name);<br>&nbsp;&nbsp;&nbsp; if (group == groups.end()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; slot_container_type::value_type v(name, group_list());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group = groups.insert(v).first;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }<br>&nbsp; iterator it;<br>&nbsp; it.group = group;<br>&nbsp; it.last_group = groups.end();</p>
<p>&nbsp; switch (at) {<br>&nbsp; case at_back:<br>&nbsp;&nbsp;&nbsp; group-&gt;second.push_back(connection_slot_pair(con, slot));<br>&nbsp;&nbsp;&nbsp; it.slot_ = group-&gt;second.end();<br>&nbsp;&nbsp;&nbsp; it.slot_assigned = true;<br>&nbsp;&nbsp;&nbsp; --(it.slot_);<br>&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp; case at_front:<br>&nbsp;&nbsp;&nbsp; group-&gt;second.push_front(connection_slot_pair(con, slot));<br>&nbsp;&nbsp;&nbsp; it.slot_ = group-&gt;second.begin();<br>&nbsp;&nbsp;&nbsp; it.slot_assigned = true;<br>&nbsp;&nbsp;&nbsp; break;<br>&nbsp; }<br>&nbsp; return it;<br>}</p>
<p>连接的结构<br>struct basic_connection <br>{<br>&nbsp;void* signal; //signal对象指针，是这个connection的管理者<br>&nbsp;void* signal_data; //在signal中的slot管理器中的迭代器对象的指针<br>&nbsp;void (*signal_disconnect)(void*, void*); //解除连接的函数执政<br>&nbsp;bool blocked_;</p>
<p>&nbsp;std::list&lt;bound_object&gt; bound_objects;<br>};</p>
<p>class BOOST_SIGNALS_DECL connection :<br>&nbsp; private less_than_comparable1&lt;connection&gt;,<br>&nbsp; private equality_comparable1&lt;connection&gt;<br>{<br>public:<br>&nbsp; connection() : con(), controlling_connection(false) {}<br>&nbsp; connection(const connection&amp;);<br>&nbsp; ~connection();</p>
<p>&nbsp; // Block he connection: if the connection is still active, there<br>&nbsp; // will be no notification<br>&nbsp; void block(bool should_block = true) { con-&gt;blocked_ = should_block; }<br>&nbsp; void unblock() { con-&gt;blocked_ = false; }<br>&nbsp; bool blocked() const { return !connected() || con-&gt;blocked_; }</p>
<p>&nbsp; // Disconnect the signal and slot, if they are connected<br>&nbsp; void disconnect() const;</p>
<p>&nbsp; // Returns true if the signal and slot are connected<br>&nbsp; bool connected() const { return con.get() &amp;&amp; con-&gt;signal_disconnect; }</p>
<p>&nbsp; // Comparison of connections<br>&nbsp; bool operator==(const connection&amp; other) const;<br>&nbsp; bool operator&lt;(const connection&amp; other) const;</p>
<p>&nbsp; // Connection assignment<br>&nbsp; connection&amp; operator=(const connection&amp; other) ;</p>
<p>&nbsp; // Swap connections<br>&nbsp; void swap(connection&amp; other);</p>
<p>public: // TBD: CHANGE THIS<br>&nbsp; // Set whether this connection object is controlling or not<br>&nbsp; void set_controlling(bool control = true)<br>&nbsp; { controlling_connection = control; }</p>
<p>&nbsp; shared_ptr&lt;BOOST_SIGNALS_NAMESPACE::detail::basic_connection&gt;<br>&nbsp; get_connection() const<br>&nbsp; { return con; }</p>
<p>private:<br>&nbsp; friend class detail::signal_base_impl;<br>&nbsp; friend class detail::slot_base;<br>&nbsp; friend class trackable;</p>
<p>&nbsp; // Reset this connection to refer to a different actual connection<br>&nbsp; void reset(BOOST_SIGNALS_NAMESPACE::detail::basic_connection*);</p>
<p>&nbsp; // Add a bound object to this connection (not for users)<br>&nbsp; void add_bound_object(const BOOST_SIGNALS_NAMESPACE::detail::bound_object&amp; b);</p>
<p>&nbsp; friend class BOOST_SIGNALS_NAMESPACE::detail::bound_objects_visitor;</p>
<p>&nbsp; // Pointer to the actual contents of the connection<br>&nbsp; shared_ptr&lt;BOOST_SIGNALS_NAMESPACE::detail::basic_connection&gt; con;</p>
<p>&nbsp; // True if the destruction of this connection object should disconnect<br>&nbsp; bool controlling_connection;<br>};</p>
<img src ="http://www.cppblog.com/walkspeed/aggbug/22645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/walkspeed/" target="_blank">walkspeed</a> 2007-04-23 15:04 <a href="http://www.cppblog.com/walkspeed/articles/22645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>