<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <title>computer science goes bonk</title>
    <link>http://blog.natekohl.net</link>
    <description></description>
    <pubDate>Tue, 05 Nov 2013 14:05:49 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>programming gibberish</title>
      <link>http://blog.natekohl.net/programming-gibberish</link>
      <pubDate>Mon, 25 Feb 2013 20:58:00 EST</pubDate>
      <category><![CDATA[visualization]]></category>
      <category><![CDATA[programming]]></category>
      <guid isPermaLink="true">http://blog.natekohl.net/programming-gibberish</guid>
      <description>programming gibberish</description>
      <content:encoded><![CDATA[<p>One way to generate plausible-sounding gibberish is called <a href="http://en.wikipedia.org/wiki/Markov_chain#Markov_text_generators">Markov-chain text generation</a>. It goes like this:</p>
<ol>
<li>Grab a bunch of text (Shakespeare's Hamlet, the lyrics to Baby got Back, etc.)</li>
<li>Generate probabilities of which letters will follow other letters in that text</li>
<li>Randomly pick new letters using the probabilities you just generated</li>
</ol>
<p>The result is something that <em>looks</em> like the original text, but is nonetheless random.</p>
<p>How random is it?  One interesting knob you can turn when running this algorithm is <strong>how many letters</strong> you use to figure out the probability of a subsequent letter.<br />
</p>
<p>Let's look at a little example of this using the current C++ language standard.  We'll generate a new language (call it C++14!) and see how turning this knob affects the output.</p>
<p>Basing our probabilities off of one letter gives us this version of C++, apparently sung by Sigur Ros:</p>
<blockquote>
<p>A tiss cop(18) sted 1 vathecv-titeceteand ig blld: al, s) YZ fistauctoshatd, r) ce uliten 33.4 (C 24) tis ioitrome t, atingof s&lt;clare rtinisherairTh t C 2); coruranond ubuns cowhaueme prendocatst Ty, frularelaisspate ons op().</p>
</blockquote>
<p>Upping to three letters switches genres to Edgar Allan Poe:</p>
<blockquote>
<p>Two set typed ways poweversions // 20 defining res perfor_type id; stdardle nevel programe shower therence at bool volving: I1, or eachin the bming&amp; wherwise, the double&gt;, an tempty arent_everencess but cons [b.conver defix-expres: the function over. </p>
</blockquote>
<p>Six letters begins to sound frighteningly plausible:</p>
<blockquote>
<p>join(c, d) in_between the hash_function or a type openmode model reflects throughout the associated from the sequently left squared memory for facets, and  Key, respectively): —  If T is defining object used with *this has that has a nested class error.</p>
</blockquote>
<p>And here is the result with nine letters:</p>
<blockquote>
<p>Note: This guarantee is not zero, the functions F returns the null pointer to an integral conversion specified belongs is implementation-defined native character string literal, 29 boolean literal, 29, 1165 Boolean type, 71 bound argument must be used to represents a BLAS-like slice out of the standard C library, how a well-formed.</p>
</blockquote>
<p>Well look at that -- I believe we have a new language.</p>]]></content:encoded>
    </item>
    <item>
      <title>the bar exam for language lawyers</title>
      <link>http://blog.natekohl.net/the-bar-exam-for-language-lawyers</link>
      <pubDate>Wed, 20 Feb 2013 16:33:00 EST</pubDate>
      <category><![CDATA[visualization]]></category>
      <category><![CDATA[programming]]></category>
      <guid isPermaLink="true">http://blog.natekohl.net/the-bar-exam-for-language-lawyers</guid>
      <description>the bar exam for language lawyers</description>
      <content:encoded><![CDATA[<p>Here's a question for language lawyers studying for your bar exams: </p>
<p>Match the language standard (<a href="/images/wc_c.pdf">C</a>, <a href="/images/wc_c++.pdf">C++</a>,
<a href="/images/wc_c%23.pdf">C#</a>, <a href="/images/wc_go.pdf">Go</a>, <a href="/images/wc_java.pdf">Java</a>, or
<a href="/images/wc_javascript.pdf">Javascript</a>) to the tag cloud:</p>
<p><img alt="???" src="/images/wc_c++.png" />
<a href="#" onclick="document.getElementById('q1').style.display='inline';return false;">answer:</a>
<span id='q1' style="display:none">C++</span></p>
<p><img alt="???" src="/images/wc_javascript.png" />
<a href="#" onclick="document.getElementById('q2').style.display='inline';return false;">answer:</a>
<span id='q2' style="display:none">Javascript</span></p>
<p><img alt="???" src="/images/wc_java.png" />
<a href="#" onclick="document.getElementById('q3').style.display='inline';return false;">answer:</a>
<span id='q3' style="display:none">Java</span></p>
<p><img alt="???" src="/images/wc_c.png" />
<a href="#" onclick="document.getElementById('q4').style.display='inline';return false;">answer:</a>
<span id='q4' style="display:none">C</span></p>
<p><img alt="???" src="/images/wc_c%23.png" />
<a href="#" onclick="document.getElementById('q5').style.display='inline';return false;">answer:</a>
<span id='q5' style="display:none">C#</span></p>
<p><img alt="???" src="/images/wc_go.png" />
<a href="#" onclick="document.getElementById('q6').style.display='inline';return false;">answer:</a>
<span id='q6' style="display:none">Go</span></p>
<p>If you got all six right, then I'm impressed. Get thee to a law firm!</p>]]></content:encoded>
    </item>
    <item>
      <title>cross-compiling and popularity</title>
      <link>http://blog.natekohl.net/cross-compiling-and-popularity</link>
      <pubDate>Wed, 30 Jan 2013 15:44:00 EST</pubDate>
      <category><![CDATA[visualization]]></category>
      <category><![CDATA[programming]]></category>
      <guid isPermaLink="true">http://blog.natekohl.net/cross-compiling-and-popularity</guid>
      <description>cross-compiling and popularity</description>
      <content:encoded><![CDATA[<p>Apropos nothing, here is a visualization of programming language popularity compared to interest in cross-compiling between various languages:</p>
<p><a href="/images/cross_compile.pdf"><img alt="popularity vs. crosscompiling interest" src="/images/cross_compile.png" /></a></p>
<h2>Observations</h2>
<ul>
<li>Unsurprisingly, C is a popular target to compile to.</li>
<li>Popularity doesn't necessarily correlate with cross-compiler interest.  Look at Objective-C and Javascript, for example -- Javascript isn't as hot as Objective-C, but <a href="http://www.hanselman.com/blog/JavaScriptisAssemblyLanguagefortheWebPart2MadnessorjustInsanity.aspx">everybody wants to compile down to Javascript</a>.</li>
<li>Nobody wants to compile to Bash.</li>
</ul>
<h2>About the visualization</h2>
<p>Popularity is represented by color, with data from good ol' 
<a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">TIOBE 2013</a>.</p>
<p>Interest in cross-compiling between languages is represented by node and edge size, 
using data based on the number of results from search engine queries like 
"compile c++ to ada" or "c++ to ada compiler".</p>]]></content:encoded>
    </item>
    <item>
      <title>what's in an enum?</title>
      <link>http://blog.natekohl.net/what's-in-an-enum-</link>
      <pubDate>Fri, 30 Nov 2012 11:16:22 EST</pubDate>
      <category><![CDATA[C++]]></category>
      <guid isPermaLink="true">http://blog.natekohl.net/what's-in-an-enum-</guid>
      <description>what's in an enum?</description>
      <content:encoded><![CDATA[<p>Pop quiz, hotshot:</p>
<div class="pygments_murphy"><pre><span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">enum</span> <span class="n">Result</span> <span class="p">{</span>
    <span class="n">LOSE</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
    <span class="n">WIN</span><span class="p">,</span>
    <span class="n">DIE_TRYING</span>
  <span class="p">}</span> <span class="n">result</span><span class="p">;</span>

  <span class="k">switch</span> <span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="p">{</span> 
   <span class="k">case</span> <span class="nl">LOSE:</span>
    <span class="k">break</span><span class="p">;</span>
   <span class="k">case</span> <span class="nl">WIN:</span>
    <span class="k">break</span><span class="p">;</span>
   <span class="k">case</span> <span class="nl">DIE_TRYING:</span>
    <span class="k">break</span><span class="p">;</span>
   <span class="k">default</span><span class="o">:</span>
    <span class="c1">// can&#39;t get here?</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>How many possible values can <code>result</code> hold?</p>
<p>...</p>
<p>The answer, of course, is four.  In addition to <code>LOSE</code>, <code>WIN</code>, and <code>DIE_TRYING</code>, 
<code>WIN | DIE_TRYING</code> is a valid value for <code>result</code>.</p>
<p>A rule of thumb is that enums can hold any value that fits into the smallest 
bit pattern required by the enum.  Since the <code>Result</code> enum needs two bits
to store <code>00b</code>, <code>01b</code>, and <code>10b</code>, one
valid value is <code>11b</code>, a.k.a. <code>WIN | DIE_TRYING</code>.</p>]]></content:encoded>
    </item>
    <item>
      <title>rvalue references and rvalues</title>
      <link>http://blog.natekohl.net/rvalue-references-and-rvalues</link>
      <pubDate>Sat, 19 May 2012 12:28:22 EDT</pubDate>
      <category><![CDATA[rvalues]]></category>
      <category><![CDATA[C++11]]></category>
      <guid isPermaLink="true">http://blog.natekohl.net/rvalue-references-and-rvalues</guid>
      <description>rvalue references and rvalues</description>
      <content:encoded><![CDATA[<p>Since C++11 came off the presses, people have spent a lot of time talking about
rvalues and rvalue references.  What isn't always clearly explained is rvalues
and rvalue references are completely separate concepts.<br />
</p>
<h1>There are two things going on here</h1>
<ul>
<li>
<p>An rvalue reference is a type.  Everyone knows what types are.  Examples include <code>T&amp;&amp;</code>,
<code>const T&amp;</code>, and <code>T</code>.</p>
</li>
<li>
<p>The term <em>rvalue</em> is a property of an expression.  In C++11, <em>rvalues</em> were
renamed to <em>prvalues</em>, and every expression is either a <em>prvalue</em>, an <em>lvalue</em>, or
an <em>xvalue</em>.  The official names for these terms are <strong>value categories</strong>.</p>
</li>
</ul>
<p>To reiterate: value categories (<em>prvalues</em>, <em>lvalues</em>, <em>xvalues</em>) are properties of
expressions, whereas rvalue references (<code>T&amp;&amp;</code>) are types.</p>
<h1>So what are <em>prvalues</em>, <em>lvalues</em>, and <em>xvalues</em>?</h1>
<p>Every expression is either a <em>prvalue</em>, an <em>lvalue</em>, or an <em>xvalue</em>.  In fact, there's a
whole taxonomy that C++11 defines:</p>
<p><img alt="value categories" src="/images/value-categories.png" /></p>
<ul>
<li>
<p><em>lvalues</em> represent objects that will stick around for a while.  Examples include named
objects and functions calls that return references to objects.  Because
they're not going anywhere, you can assign things to them and take their address.</p>
</li>
<li>
<p><em>prvalues</em> represent temporary objects, i.e. objects that will not persist past
the outermost expression that they appear in.  Examples include temporary
objects explicitly created inline and function calls that return objects by value.</p>
</li>
<li>
<p><em>xvalues</em> represent objects that are about to expire.  A function call that returns an
rvalue reference (like <code>std::move(foo)</code>) is an example of an <em>xvalue</em>.</p>
</li>
</ul>
<p><em>glvalues</em> are expressions that are either <em>lvalues</em> or <em>xvalues</em>.  <em>rvalues</em> are expressions
that are either <em>prvalues</em> or <em>xvalues</em>.</p>
<p>Here's an annotated example that shows value categories and types:</p>
<div class="pygments_murphy"><pre><span class="cp">#include &lt;string&gt;</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
<span class="kt">void</span> <span class="n">swap</span><span class="p">(</span><span class="n">T</span><span class="o">&amp;</span> <span class="n">t1</span><span class="p">,</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">t2</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">//        --     --     types (T&amp;)</span>

   <span class="n">T</span> <span class="n">tmp</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">t1</span><span class="p">));</span>
<span class="c1">// -                    type (regular T)</span>
<span class="c1">//                 --  lvalue</span>
<span class="c1">//       ------------- xvalue</span>

   <span class="n">t1</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">t2</span><span class="p">);</span>
<span class="c1">// --             --   lvalues</span>
<span class="c1">//      -------------  xvalue</span>

   <span class="n">t2</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">tmp</span><span class="p">);</span>
<span class="c1">// --             ---  lvalues</span>
<span class="c1">//      -------------  xvalue</span>
<span class="p">}</span>

<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">get_greeting</span><span class="p">()</span> <span class="p">{</span>
   <span class="k">return</span> <span class="s">&quot;Good news, everyone!&quot;</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
   <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">s1</span><span class="p">,</span> <span class="n">s2</span><span class="p">;</span>
<span class="c1">// -----------          type (regular std::string)</span>

   <span class="n">s1</span> <span class="o">=</span> <span class="n">get_greeting</span><span class="p">();</span>
<span class="c1">// --                  lvalue </span>
<span class="c1">//      -------------- prvalue</span>

   <span class="n">s2</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">move</span><span class="p">(</span><span class="n">get_greeting</span><span class="p">());</span>
<span class="c1">// --                             lvalue </span>
<span class="c1">//                --------------  prvalue </span>
<span class="c1">//      ------------------------- xvalue</span>

   <span class="n">swap</span><span class="p">(</span><span class="n">s1</span><span class="p">,</span> <span class="n">s2</span><span class="p">);</span>
<span class="c1">//      --  --   lvalues</span>
<span class="p">}</span>
</pre></div>

<p>Next up: why <code>std::move(get_greeting())</code> in the above example is unecessary.</p>]]></content:encoded>
    </item>
    <item>
      <title>a type by any other name</title>
      <link>http://blog.natekohl.net/a-type-by-any-other-name</link>
      <pubDate>Wed, 25 Apr 2012 18:29:21 EDT</pubDate>
      <category><![CDATA[templates]]></category>
      <category><![CDATA[C++]]></category>
      <guid isPermaLink="true">http://blog.natekohl.net/a-type-by-any-other-name</guid>
      <description>a type by any other name</description>
      <content:encoded><![CDATA[<p><img src="/images/typename-fail2.png" style="float:right; border:1px solid #555"/></p>
<p>There are only two hard problems in computer science: </p>
<ol>
<li>naming things,</li>
<li>cache invalidation, and</li>
<li>off-by-one errors.<br />
</li>
</ol>
<p>This is a post about naming things.  Consider the following code:</p>
<div class="pygments_murphy"><pre><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
<span class="kt">void</span> <span class="n">foo</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">T</span><span class="o">::</span><span class="n">iterator</span> <span class="n">it</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{}</span>
</pre></div>

<h1>Will this code compile?</h1>
<p>No, because the compiler doesn't know that <code>T::iterator</code> refers to a type.</p>
<h1>How do I fix it?</h1>
<p>You need to use the
<a href="http://en.cppreference.com/w/cpp/keyword/typename">typename</a> keyword, like so:</p>
<div class="pygments_murphy"><pre><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
<span class="kt">void</span> <span class="n">foo</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">typename</span> <span class="n">T</span><span class="o">::</span><span class="n">iterator</span> <span class="n">it</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{}</span>
</pre></div>

<h1>Why is <code>typename</code> necessary?</h1>
<p><code>T::iterator</code> is called a dependent name, because it depends on what <code>T</code>
is. Most of the time, dependent names in templates are not assumed to be types.</p>
<h1>Why can't the compiler assume this dependent name is a type?</h1>
<p>Because <code>T::iterator</code> might not refer to a type.  Here's an example of a potential <code>T</code>
where <code>T::iterator</code> isn't a type:</p>
<div class="pygments_murphy"><pre><span class="k">struct</span> <span class="n">Bar</span> <span class="p">{</span>
  <span class="k">static</span> <span class="kt">int</span> <span class="n">iterator</span><span class="p">;</span>
<span class="p">};</span>
</pre></div>

<h1>Why can't the compiler figure out which names refer to types automatically?</h1>
<p>Because the template definition might work either way -- with <code>T::iterator</code> as a type
<strong>or</strong> with <code>T::iterator</code> as a variable:</p>
<div class="pygments_murphy"><pre><span class="kt">int</span> <span class="n">b</span><span class="p">;</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
<span class="kt">void</span> <span class="n">baz</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">T</span><span class="o">::</span><span class="n">iterator</span> <span class="o">*</span><span class="n">b</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>

<p>In the above code, does the body of <code>baz</code>:</p>
<ul>
<li>declare a variable named <code>b</code> that is a pointer to the type <code>T::iterator</code>, or</li>
<li>multiply the global variable <code>b</code> with the static variable <code>T::iterator</code>, and ignore the result?</li>
</ul>
<p>If all we've seen is the template, we don't know.  It could be either.</p>
<h1>Why doesn't the compiler delay processing the template definition until it sees an instantiation?</h1>
<p>Good question.  Here are some reasons why the compiler parses template
definitions when it sees them:</p>
<ul>
<li>
<p>It allows the compiler to generate errors sooner.</p>
</li>
<li>
<p>If the compiler waited until it saw an instantiation, it would have to decide if code that appears between
definition and instantiation could be used in the template.  For example, a
better match for an overloaded function call might be introduced -- should it
be ignored?</p>
</li>
<li>
<p>Worst of all, different instantiations of the ambiguous template above would mean the same
chunk of code could produce totally different parse trees, which seems unlikely to
match programmer intent.</p>
</li>
</ul>
<h1>My head hurts.</h1>
<p><strong>TL;DR</strong>: Use the <code>typename</code> keyword with dependent names in templates to indicate those names are types.</p>]]></content:encoded>
    </item>
    <item>
      <title>diary of an unemployed software engineer, day 5</title>
      <link>http://blog.natekohl.net/diary-of-an-unemployed-software-engineer,-day-5</link>
      <pubDate>Thu, 09 Feb 2012 14:42:47 EST</pubDate>
      <category><![CDATA[diary]]></category>
      <guid isPermaLink="true">http://blog.natekohl.net/diary-of-an-unemployed-software-engineer,-day-5</guid>
      <description>diary of an unemployed software engineer, day 5</description>
      <content:encoded><![CDATA[<p>After five days outside of the structure of a work environment, the engineer began to notice changes in his physical appearance.</p>
<p><img alt="" src="/images/beard.jpg" /></p>
<p>His inability to shave was caused by a back injury, triggered by either (a) an extended session of applying polyurethane to newly-created office furniture or (b) the subsequent sloth of watching an Office Space marathon on the couch.  Both events were exhausting.</p>
<p><img alt="" src="/images/PC_Load_Letter.jpg" /></p>
<p>On an unrelated note, after consulting on a live website that was littered with identical statements of the form:</p>
<div class="pygments_murphy"><pre><span class="cp">&lt;?php</span> <span class="k">eval</span><span class="p">(</span><span class="nb">base64_decode</span><span class="p">(</span><span class="s2">&quot;DUshdagHsdhl...WEJxckl==&quot;</span><span class="p">));</span> <span class="cp">?&gt;</span><span class="x"></span>
</pre></div>

<p>...the engineer concluded that repeatedly <code>eval</code>ing a fixed base64-encoded string is probably a sign that something is amiss.</p>]]></content:encoded>
    </item>
    <item>
      <title>diary of an unemployed software engineer, day 1</title>
      <link>http://blog.natekohl.net/diary-of-an-unemployed-software-engineer,-day-1</link>
      <pubDate>Mon, 06 Feb 2012 21:06:47 EST</pubDate>
      <category><![CDATA[diary]]></category>
      <guid isPermaLink="true">http://blog.natekohl.net/diary-of-an-unemployed-software-engineer,-day-1</guid>
      <description>diary of an unemployed software engineer, day 1</description>
      <content:encoded><![CDATA[<p><img alt="" src="/images/truck1.jpg" /></p>
<p>For the first time in 7 months, the engineer spent most of the day out-of-doors trying to build something with his hands.  The sun was brighter than the engineer remembered, but there were no cubicle walls to protect him from the elements.</p>
<p>Around noon, a lunch truck pulled up to the work site across the street and honked.  On the bed of the truck perched a ridiculously large tin kitchen that was leaking steam from a thousand fissures.  Everyone seemed happy to see the truck.  The engineer wistfully remembered when <a href="http://money.cnn.com/galleries/2012/pf/jobs/1201/gallery.best-companies-unusual-perks.fortune/7.html">delicious food trucks used to visit him at work</a>.</p>
<p><img alt="" src="/images/saw1.jpg" /></p>
<p>The engineer's jigsaw became briefly sentient and attempted to perform ocular surgery on the engineer.  The engineer could not recall <a href="http://msdn.microsoft.com/en-us/windows/hardware/gg463009">windbg </a> ever being so unexpectedly malicious.</p>
<p>Fortunately, the day ended with minimal injuries.</p>
<p><img alt="" src="/images/fingers1.jpg" /></p>]]></content:encoded>
    </item>
    <item>
      <title>explicit out-parameters</title>
      <link>http://blog.natekohl.net/explicit-out-parameters</link>
      <pubDate>Sat, 17 Dec 2011 19:47:15 EST</pubDate>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[C++]]></category>
      <guid isPermaLink="true">http://blog.natekohl.net/explicit-out-parameters</guid>
      <description>explicit out-parameters</description>
      <content:encoded><![CDATA[<div style="float:right">
<img src="/images/explicit.png" alt="" title="explicit code" />
</div>

<p><strong>Can we have C#-style explicit outparams in C++?</strong>  <a href="http://stackoverflow.com/users/61289/logan-capaldo">elcapaldo</a> showed me a neat approach last week that I'll try to reproduce here.  (Of course Logan supplied the cool stuff; any errors are all mine.)</p>
<h1>How it looks in C#</h1>
<p>In C#, everything <a href="http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx">defaults to pass-by-value</a>.  If you want to be able to modify an argument to a method, you have to attach either a <code>ref</code> or <code>out</code> modifier to the argument at both the method definition and at each call site:</p>
<div class="pygments_murphy"><pre><span class="c1">// &#39;value&#39; is marked as an outparam</span>
<span class="k">public</span> <span class="kt">bool</span> <span class="n">TryGetValue</span><span class="p">(</span><span class="n">string</span> <span class="n">key</span><span class="p">,</span> <span class="n">out</span> <span class="n">string</span> <span class="n">value</span><span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>

<span class="k">public</span> <span class="kt">void</span> <span class="n">SomeMethod</span><span class="p">()</span>
<span class="p">{</span>
  <span class="n">string</span> <span class="n">value</span><span class="p">;</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">TryGetValue</span><span class="p">(</span><span class="s">&quot;bar&quot;</span><span class="p">,</span> <span class="n">out</span> <span class="n">value</span><span class="p">))</span>   <span class="c1">// &#39;value&#39; must be marked as an outparam</span>
  <span class="p">{</span>
    <span class="p">...</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>The <code>out</code> keyword implies <a href="http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx">a number of things</a>, but the most noticeable effect is that consumers of methods with outparams have to explicitly acknowledge that they're using outparams.</p>
<p>Can we do something similar in C++?</p>
<h1>How it looks in C++</h1>
<p>Consider the following definition of the <code>Out</code> type, along with a couple of helper functions named <code>out</code>:</p>
<div class="pygments_murphy"><pre><span class="c1">// parameters of type T can be passed as type Out&lt;T&gt;</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
<span class="k">class</span> <span class="nc">Out</span> <span class="p">{</span>
<span class="k">private</span><span class="o">:</span>
  <span class="k">struct</span> <span class="n">OutRefHolder</span> <span class="p">{</span>
    <span class="n">T</span> <span class="o">&amp;</span><span class="n">ref_</span><span class="p">;</span>
    <span class="k">explicit</span> <span class="n">OutRefHolder</span><span class="p">(</span><span class="n">T</span> <span class="o">&amp;</span><span class="n">ref</span><span class="p">)</span> <span class="o">:</span> <span class="n">ref_</span><span class="p">(</span><span class="n">ref</span><span class="p">)</span> <span class="p">{}</span>
  <span class="p">};</span>

<span class="k">public</span><span class="o">:</span>
  <span class="n">Out</span><span class="p">(</span><span class="n">OutRefHolder</span> <span class="o">&amp;&amp;</span><span class="n">oref</span><span class="p">)</span> <span class="o">:</span> <span class="n">ref_</span><span class="p">(</span><span class="n">oref</span><span class="p">.</span><span class="n">ref_</span><span class="p">)</span> <span class="p">{}</span>
  <span class="n">Out</span><span class="p">(</span><span class="n">Out</span> <span class="o">&amp;&amp;</span><span class="n">o</span><span class="p">)</span> <span class="o">:</span> <span class="n">ref_</span><span class="p">(</span><span class="n">o</span><span class="p">.</span><span class="n">ref_</span><span class="p">)</span> <span class="p">{}</span>
  <span class="n">Out</span><span class="p">(</span><span class="k">const</span> <span class="n">Out</span><span class="o">&amp;</span><span class="p">)</span> <span class="o">=</span> <span class="k">delete</span><span class="p">;</span>
  <span class="n">Out</span><span class="p">()</span> <span class="o">=</span> <span class="k">delete</span><span class="p">;</span>

  <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">Q</span><span class="o">&gt;</span>
  <span class="kt">void</span> <span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="n">Q</span> <span class="o">&amp;&amp;</span><span class="n">q</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">ref_</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">forward</span><span class="o">&lt;</span><span class="n">Q</span><span class="o">&gt;</span><span class="p">(</span><span class="n">q</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">Y</span><span class="o">&gt;</span>
  <span class="k">friend</span> <span class="k">typename</span> <span class="n">Out</span><span class="o">&lt;</span><span class="n">Y</span><span class="o">&gt;::</span><span class="n">OutRefHolder</span> <span class="n">out</span><span class="p">(</span><span class="n">Y</span> <span class="o">&amp;</span><span class="n">ref</span><span class="p">);</span>
  <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">Y</span><span class="o">&gt;</span>
  <span class="k">friend</span> <span class="k">typename</span> <span class="n">Out</span><span class="o">&lt;</span><span class="n">Y</span><span class="o">&gt;::</span><span class="n">OutRefHolder</span> <span class="n">out</span><span class="p">(</span><span class="n">Out</span><span class="o">&lt;</span><span class="n">Y</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">o</span><span class="p">);</span>

<span class="k">private</span><span class="o">:</span>
  <span class="n">T</span> <span class="o">&amp;</span><span class="n">ref_</span><span class="p">;</span>
<span class="p">};</span>

<span class="c1">// helper functions to create something convertible to an Out&lt;Y&gt;</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">Y</span><span class="o">&gt;</span>
<span class="k">typename</span> <span class="n">Out</span><span class="o">&lt;</span><span class="n">Y</span><span class="o">&gt;::</span><span class="n">OutRefHolder</span> <span class="n">out</span><span class="p">(</span><span class="n">Y</span> <span class="o">&amp;</span><span class="n">ref</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="k">typename</span> <span class="n">Out</span><span class="o">&lt;</span><span class="n">Y</span><span class="o">&gt;::</span><span class="n">OutRefHolder</span><span class="p">(</span><span class="n">ref</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">Y</span><span class="o">&gt;</span>
<span class="k">typename</span> <span class="n">Out</span><span class="o">&lt;</span><span class="n">Y</span><span class="o">&gt;::</span><span class="n">OutRefHolder</span> <span class="n">out</span><span class="p">(</span><span class="n">Out</span><span class="o">&lt;</span><span class="n">Y</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">o</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="k">typename</span> <span class="n">Out</span><span class="o">&lt;</span><span class="n">Y</span><span class="o">&gt;::</span><span class="n">OutRefHolder</span><span class="p">(</span><span class="n">o</span><span class="p">.</span><span class="n">ref_</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>

<p>Given that definition, we can use the <code>Out</code> type and the <code>out</code> functions like so:</p>
<div class="pygments_murphy"><pre><span class="cp">#include &lt;iostream&gt;</span>
<span class="cp">#include &lt;string&gt;</span>
<span class="cp">#include &quot;Out.h&quot;</span>

<span class="kt">bool</span> <span class="n">get_prop</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="o">&amp;</span><span class="n">key</span><span class="p">,</span> <span class="n">Out</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">value</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">key</span> <span class="o">==</span> <span class="s">&quot;keymaster&quot;</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">value</span> <span class="o">=</span> <span class="s">&quot;gatekeeper&quot;</span><span class="p">;</span>
    <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">value</span><span class="p">;</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">get_prop</span><span class="p">(</span><span class="s">&quot;keymaster&quot;</span><span class="p">,</span> <span class="n">out</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">value</span> <span class="o">&lt;&lt;</span> <span class="sc">&#39;\n&#39;</span><span class="p">;</span>  <span class="c1">// displays &quot;gatekeeper&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>

<p>The definition of <code>Out</code> makes it hard to mis-use: an <code>Out&lt;T&gt;</code> isn't copyable and isn't easy to create, except indirectly via the <code>out</code> functions.</p>
<p>The result: if you write functions that take an <code>Out&lt;T&gt;</code>, the easiest path by far forces people to explicitly acknowledge that they're passing an outparam.  Just like C#.</p>]]></content:encoded>
    </item>
    <item>
      <title>get yer filthy hands off my control block</title>
      <link>http://blog.natekohl.net/get-yer-filthy-hands-off-my-control-block</link>
      <pubDate>Thu, 17 Nov 2011 22:53:42 EST</pubDate>
      <category><![CDATA[C++]]></category>
      <guid isPermaLink="true">http://blog.natekohl.net/get-yer-filthy-hands-off-my-control-block</guid>
      <description>get yer filthy hands off my control block</description>
      <content:encoded><![CDATA[<h3>Exposition</h3>
<p>Yesterday, <a href="http://meta-meta.blogspot.com/">Logan</a> pointed out that you can construct a <code>shared_ptr&lt;T&gt;</code> that manages some <code>T</code> but shares a control block with some completely different <code>shared_ptr&lt;U&gt;</code>:</p>
<div class="pygments_murphy"><pre><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span> <span class="k">class</span> <span class="nc">shared_ptr</span> <span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
  <span class="c1">// constructs a shared_ptr that shares ownership with r and stores p</span>
  <span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">U</span><span class="o">&gt;</span> <span class="n">shared_ptr</span><span class="p">(</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">U</span><span class="o">&gt;</span> <span class="k">const</span> <span class="o">&amp;</span><span class="n">r</span><span class="p">,</span> <span class="n">T</span> <span class="o">*</span><span class="n">p</span><span class="p">);</span>
  <span class="c1">// ...</span>
<span class="p">};</span>
</pre></div>

<p>This is a pretty cool use of <a href="http://en.cppreference.com/w/cpp/memory/shared_ptr"><code>shared_ptr</code></a> that I had not seen before.</p>
<h3>A Compelling Example</h3>
<p>Say you have two objects -- one nested inside the other -- that need to be able to refer to eachother.  If you give each object a <code>shared_ptr</code> to the other object, they'll leak-lock eachother until your program dies of consumption.  You could break the symmetry by giving one a <code>weak_ptr</code> to the other, but then you run the risk of one object expiring before the other.</p>
<p>What we really want is both objects to stay alive as long as either is around:</p>
<div class="pygments_murphy"><pre><span class="cp">#include &lt;memory&gt;</span>
<span class="cp">#include &lt;iostream&gt;</span>

<span class="k">struct</span> <span class="n">Foo</span><span class="p">;</span>

<span class="k">struct</span> <span class="n">Bar</span> <span class="p">{</span>
  <span class="n">Bar</span><span class="p">(</span><span class="n">Foo</span> <span class="o">*</span><span class="n">f</span><span class="p">)</span> <span class="o">:</span> <span class="n">foo</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Bar</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">;</span> <span class="p">}</span>
  <span class="o">~</span><span class="n">Bar</span><span class="p">()</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;~Bar</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">;</span> <span class="p">}</span>
  <span class="c1">// goal: this Foo should be valid as long as this Bar is alive</span>
  <span class="n">Foo</span> <span class="o">*</span><span class="n">foo</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="n">Foo</span> <span class="o">:</span> <span class="n">std</span><span class="o">::</span><span class="n">enable_shared_from_this</span><span class="o">&lt;</span><span class="n">Foo</span><span class="o">&gt;</span> <span class="p">{</span>
  <span class="n">Foo</span><span class="p">()</span> <span class="o">:</span> <span class="n">bar</span><span class="p">(</span><span class="k">new</span> <span class="n">Bar</span><span class="p">(</span><span class="k">this</span><span class="p">))</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;Foo</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">;</span> <span class="p">}</span>
  <span class="o">~</span><span class="n">Foo</span><span class="p">()</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;~Foo</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">;</span> <span class="p">}</span>
  <span class="c1">// give someone access to our Bar</span>
  <span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">Bar</span><span class="o">&gt;</span> <span class="n">getBar</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">Bar</span><span class="o">&gt;</span><span class="p">(</span><span class="n">shared_from_this</span><span class="p">(),</span> <span class="n">bar</span><span class="p">.</span><span class="n">get</span><span class="p">());</span>
  <span class="p">}</span>
  <span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o">&lt;</span><span class="n">Bar</span><span class="o">&gt;</span> <span class="n">bar</span><span class="p">;</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
  <span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">Bar</span><span class="o">&gt;</span> <span class="n">bar</span><span class="p">;</span>
  <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o">&lt;</span><span class="n">Foo</span><span class="o">&gt;</span> <span class="n">foo</span><span class="p">(</span><span class="k">new</span> <span class="n">Foo</span><span class="p">);</span>
    <span class="n">bar</span> <span class="o">=</span> <span class="n">foo</span><span class="o">-&gt;</span><span class="n">getBar</span><span class="p">();</span>
  <span class="p">}</span>
  <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&quot;foo is dead now...or is it?</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>

<p>When run, the above code produces the following output:</p>
<pre>
Bar
Foo
foo is dead now...or is it?
~Foo
~Bar
</pre>

<h3>The Thrilling Conclusion</h3>
<p>By attaching the <code>shared_ptr&lt;Bar&gt;</code> to the control block for the <code>shared_ptr&lt;Foo&gt;</code>, we can enforce the idea that if we grab a <code>Bar</code> from a <code>Foo</code>, the <code>Foo</code> will live at least as long as the <code>Bar</code> does.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
