This file is indexed.

/usr/share/doc/properties-cpp/html/README_8md_source.html is in libproperties-cpp-doc 0.0.1+14.04.20140220-0ubuntu1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.6"/>
<title>properties-cpp: /build/buildd/properties-cpp-0.0.1+14.04.20140220/README.md Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
  $(window).load(resizeHeight);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">properties-cpp
   &#160;<span id="projectnumber">0.0.1</span>
   </div>
   <div id="projectbrief">A very simple convenience library for handling properties and signals in C++11.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.6 -->
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('README_8md.html','');});
</script>
<div id="doc-content">
<div class="header">
  <div class="headertitle">
<div class="title">/build/buildd/properties-cpp-0.0.1+14.04.20140220/README.md</div>  </div>
</div><!--header-->
<div class="contents">
<a href="README_8md.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;properties-cpp         {#mainpage}</div>
<div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;===========</div>
<div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;</div>
<div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;process-cpp is a simple header-only implementation of properties and</div>
<div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;signals. It is meant to be used <span class="keywordflow">for</span> developing low-level system</div>
<div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;services. Its <a class="code" href="CMakeFiles_22_88_812_82_2CompilerIdC_2CMakeCCompilerId_8c.html#a0ddf1224851353fc92bfbff6f499fa97">main</a> features include:</div>
<div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;</div>
<div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160; - Thread-safe signal invocation and observer mgmt.</div>
<div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160; - The ability to dispatch signal invocations via arbitrary <span class="keyword">event</span> loops.</div>
<div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160; - Typed properties with an in-place update mechanism that avoids unneccessary deep copies.</div>
<div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160; - Well tested and documented.</div>
<div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;</div>
<div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;A Textfield With an Observable Cursor Position</div>
<div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;----------------------------------------------</div>
<div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;</div>
<div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;~~~~~~~~~~~~~{.cpp}</div>
<div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="keyword">namespace</span></div>
<div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;{</div>
<div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="keyword">struct </span>TextField</div>
<div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;{</div>
<div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;    <span class="keywordtype">void</span> move_cursor_to(<span class="keywordtype">int</span> new_position)</div>
<div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;    {</div>
<div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;        cursor_position.set(new_position);</div>
<div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;    }</div>
<div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;    </div>
<div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;    <a class="code" href="classcore_1_1Property.html">core::Property&lt;int&gt;</a> cursor_position;</div>
<div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;};</div>
<div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;}</div>
<div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;</div>
<div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<a class="code" href="properties__test_8cpp.html#ac8d63f568d5c53eca44a5b691fd9d36d">TEST</a>(Property, cursor_position_changes_are_transported_correctly)</div>
<div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;{</div>
<div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;    <span class="keywordtype">int</span> position = -1;</div>
<div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;</div>
<div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;    TextField tf;</div>
<div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;    </div>
<div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;    <span class="comment">// Setup a connection to the cursor position property</span></div>
<div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;    tf.cursor_position.changed().connect(</div>
<div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;        [&amp;position](<span class="keywordtype">int</span> value) </div>
<div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;        { </div>
<div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;            position = value; </div>
<div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;        });</div>
<div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;</div>
<div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;    <span class="comment">// Move the cursor</span></div>
<div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;    tf.move_cursor_to(22);</div>
<div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;</div>
<div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;    <span class="comment">// Check that the correct value has propagated</span></div>
<div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    EXPECT_EQ(22, position);</div>
<div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;}</div>
<div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;~~~~~~~~~~~~~</div>
<div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;</div>
<div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;Integrating With Arbitrary Event Loops/Reactor Implementations</div>
<div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;--------------------------------------------------------------</div>
<div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;~~~~~~~~~~~~~{.cpp}</div>
<div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;<span class="keyword">namespace</span></div>
<div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;{</div>
<div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;<span class="keyword">struct </span>EventLoop</div>
<div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;{</div>
<div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;    <span class="keyword">typedef</span> std::function&lt;void()&gt; Handler;</div>
<div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;</div>
<div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;    <span class="keywordtype">void</span> stop()</div>
<div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;    {</div>
<div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;        stop_requested = <span class="keyword">true</span>;</div>
<div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;    }</div>
<div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;</div>
<div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;    <span class="keywordtype">void</span> run()</div>
<div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;    {</div>
<div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;        <span class="keywordflow">while</span> (!stop_requested)</div>
<div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;        {</div>
<div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;            std::unique_lock&lt;std::mutex&gt; ul(guard);</div>
<div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;            wait_condition.wait_for(</div>
<div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;                        ul,</div>
<div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;                        std::chrono::milliseconds{500},</div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;                        [<span class="keyword">this</span>]() { <span class="keywordflow">return</span> handlers.size() &gt; 0; });</div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;</div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;            <span class="keywordflow">while</span> (handlers.size() &gt; 0)</div>
<div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;            {</div>
<div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;                handlers.front()();</div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;                handlers.pop();</div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;            }</div>
<div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;        }</div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;    }</div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;</div>
<div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;    <span class="keywordtype">void</span> dispatch(<span class="keyword">const</span> Handler&amp; h)</div>
<div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;    {</div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;        std::lock_guard&lt;std::mutex&gt; lg(guard);</div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;        handlers.push(h);</div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;    }</div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;</div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;    <span class="keywordtype">bool</span> stop_requested = <span class="keyword">false</span>;</div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;    std::queue&lt;Handler&gt; handlers;</div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;    std::mutex guard;</div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;    std::condition_variable wait_condition;</div>
<div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;};</div>
<div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;}</div>
<div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;</div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;<a class="code" href="properties__test_8cpp.html#ac8d63f568d5c53eca44a5b691fd9d36d">TEST</a>(Signal, installing_a_custom_dispatcher_ensures_invocation_on_correct_thread)</div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;{</div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;    <span class="comment">// We instantiate an event loop and run it on a different thread than the main one.</span></div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;    EventLoop dispatcher;</div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;    std::thread dispatcher_thread{[&amp;dispatcher]() { dispatcher.run(); }};</div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;    std::thread::id dispatcher_thread_id = dispatcher_thread.get_id();</div>
<div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;</div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    <span class="comment">// The signal that we want to dispatch via the event loop.</span></div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    <a class="code" href="classcore_1_1Signal.html">core::Signal&lt;int, double&gt;</a> s;</div>
<div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;</div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;    <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> expected_invocation_count = 10000;</div>
<div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;</div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    <span class="comment">// Setup the connection. For each invocation we check that the id of the</span></div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;    <span class="comment">// thread the handler is being called upon equals the thread that the</span></div>
<div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;    <span class="comment">// event loop is running upon.</span></div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;    <span class="keyword">auto</span> connection = s.<a class="code" href="classcore_1_1Signal.html#a0f982cab5160c5dedbbb13315f9d715a">connect</a>(</div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;                [&amp;dispatcher, dispatcher_thread_id](<span class="keywordtype">int</span> value, <span class="keywordtype">double</span> d)</div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;                {</div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;                    EXPECT_EQ(dispatcher_thread_id,</div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;                              std::this_thread::get_id());</div>
<div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;</div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;                    std::cout &lt;&lt; d &lt;&lt; std::endl;</div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;</div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;                    <span class="keywordflow">if</span> (value == expected_invocation_count)</div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;                        dispatcher.stop();</div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;                });</div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;</div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;    <span class="comment">// Route the connection via the dispatcher</span></div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;    connection.dispatch_via(</div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;                std::bind(</div>
<div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;                    &amp;EventLoop::dispatch,</div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;                    std::ref(dispatcher),</div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;                    std::placeholders::_1));</div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;</div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;    <span class="comment">// Invoke the signal from the main thread.</span></div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 1; i &lt;= expected_invocation_count; i++)</div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;        s(i, 42.);</div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;</div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    <span class="keywordflow">if</span> (dispatcher_thread.joinable())</div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;        dispatcher_thread.join();</div>
<div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;}</div>
<div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;~~~~~~~~~~~~~</div>
<div class="ttc" id="CMakeFiles_22_88_812_82_2CompilerIdC_2CMakeCCompilerId_8c_html_a0ddf1224851353fc92bfbff6f499fa97"><div class="ttname"><a href="CMakeFiles_22_88_812_82_2CompilerIdC_2CMakeCCompilerId_8c.html#a0ddf1224851353fc92bfbff6f499fa97">main</a></div><div class="ttdeci">int main(int argc, char *argv[])</div><div class="ttdef"><b>Definition:</b> <a href="CMakeFiles_22_88_812_82_2CompilerIdC_2CMakeCCompilerId_8c_source.html#l00377">CMakeCCompilerId.c:377</a></div></div>
<div class="ttc" id="classcore_1_1Signal_html_a0f982cab5160c5dedbbb13315f9d715a"><div class="ttname"><a href="classcore_1_1Signal.html#a0f982cab5160c5dedbbb13315f9d715a">core::Signal::connect</a></div><div class="ttdeci">Connection connect(const Slot &amp;slot) const </div><div class="ttdoc">Connects the provided slot to this signal instance. </div><div class="ttdef"><b>Definition:</b> <a href="signal_8h_source.html#l00086">signal.h:86</a></div></div>
<div class="ttc" id="classcore_1_1Property_html"><div class="ttname"><a href="classcore_1_1Property.html">core::Property</a></div><div class="ttdoc">A very simple, templated class that allows for uniform declaration of get-able/set-able/observable me...</div><div class="ttdef"><b>Definition:</b> <a href="property_8h_source.html#l00037">property.h:37</a></div></div>
<div class="ttc" id="properties__test_8cpp_html_ac8d63f568d5c53eca44a5b691fd9d36d"><div class="ttname"><a href="properties__test_8cpp.html#ac8d63f568d5c53eca44a5b691fd9d36d">TEST</a></div><div class="ttdeci">TEST(Property, default_construction_yields_default_value)</div><div class="ttdef"><b>Definition:</b> <a href="properties__test_8cpp_source.html#l00023">properties_test.cpp:23</a></div></div>
<div class="ttc" id="classcore_1_1Signal_html"><div class="ttname"><a href="classcore_1_1Signal.html">core::Signal</a></div><div class="ttdoc">A signal class that observers can subscribe to. </div><div class="ttdef"><b>Definition:</b> <a href="signal_8h_source.html#l00036">signal.h:36</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="README_8md.html">README.md</a></li>
    <li class="footer">Generated on Thu Feb 20 2014 20:19:22 for properties-cpp by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.6 </li>
  </ul>
</div>
</body>
</html>