<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://slashvar.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://slashvar.github.io/" rel="alternate" type="text/html" /><updated>2026-04-02T12:08:42+00:00</updated><id>https://slashvar.github.io/feed.xml</id><title type="html">Marwan’s Tutorial Blog</title><subtitle>My blog for technical tutorials and related stuff (from beginner to more advanced.)</subtitle><entry><title type="html">Of Geeks, Engineers, and Gnomes</title><link href="https://slashvar.github.io/2026/04/02/of-geeks-engineers-and-gnomes.html" rel="alternate" type="text/html" title="Of Geeks, Engineers, and Gnomes" /><published>2026-04-02T00:00:00+00:00</published><updated>2026-04-02T00:00:00+00:00</updated><id>https://slashvar.github.io/2026/04/02/of-geeks-engineers-and-gnomes</id><content type="html" xml:base="https://slashvar.github.io/2026/04/02/of-geeks-engineers-and-gnomes.html"><![CDATA[<p><img src="/assets/images/gnome-coding.png" alt="A gnome writing code" /></p>

<p>I’ve been away from this blog for a while (nothing new) but I’m back and now we got some tiny gnomes to help us write text or even code.</p>

<p>In fact, those gnomes are the main characters for this new post as we’re going to talk about vibe coding (yes, <em>yet another vibe coding blog post</em>). Along the way, we’ll look at the dual personality of programmers, the long history of programs writing programs, why natural languages are a poor fit for describing code, and where all of this might be heading.</p>

<h2 id="context-foreword-introduction-">Context, foreword, introduction …</h2>

<p>I won’t split hairs on vocabulary: vibe coding, AI assisted code writing, whatever you call it, all of this falls into the same trend: leveraging new AI models’ ability to work with code.</p>

<p>Now, for more context: I am a software engineer but I have been a computer science teacher (and programming was one of my main lectures for years) and I have been writing code for decades (I was about 8 or 9 years old when I wrote my first lines of BASIC on a zx81 in the mid 1980s). The biggest impact for today’s topic is that writing code is something natural for me, to a point where it’s sometimes (even often) easier to write the code than to explain what it should do. When I was building my programming lectures, to cover a new topic, I was usually starting by writing code and then derive my teaching materials from it.</p>

<p>But we are in 2026, and I work as a software engineer, and as such, ignoring AI tools is no longer an option. I, too, have my gnomes working for me everyday, I am OK with it, I can’t even say that I don’t like having them around. Now, we are in a transition period, and it’s interesting to think about it, look at what we get from it and try to identify the traps on the road.</p>

<p>To make sense of how we react to all this, it helps to look at who we are as programmers.</p>

<h2 id="the-geek-and-the-engineer-the-dual-mind-of-a-coder">The geek and the engineer, the dual mind of a coder</h2>

<blockquote>
  <p><em>Disclaimer: I have no degree in psychology or whatever social science. I’m an engineer but as I said I’ve been a teacher and as such, I’ve spent a lot of time trying to understand the mechanism and relationship to code in my students and by extension to my colleagues.</em></p>
</blockquote>

<p>Across the years, I’ve come to the observation that software engineers usually have a mix of two <em>personalities</em>: a geek and an engineer.</p>

<p>The <strong>geek</strong> is the passionate programmer, the guy that writes code just for the pleasure of doing it. This is the part of us that gets excited by new programming languages, the part of us that pushes us to write smart and elegant code for the beauty of the result. This is also the part of us that gets highly opinionated on tech topics at the expense of productivity and pragmatism.</p>

<p>On the other side the <strong>engineer</strong> is the professional guy who wants to deliver. Writing code is only a way to get the job done. A good engineer should not waste time on writing the best code, the goal is to bring a solution that meets the expectations and relevant choices are those heading in that direction.</p>

<p>I believe, most of us are a mix of a geek and an engineer. I also believe that both can bring value to our job. Pure pragmatism can make mistakes in the long run, while over enthusiasm may lead to tunnel vision on the wrong things, but combine them and you can get a very efficient software engineer. Of course, it could also lead to disastrous results …</p>

<p>Back to our topic, the geek and the engineer have a lot to do with our relations to those AI stuff. When I first read <a href="https://karpathy.github.io/2015/05/21/rnn-effectiveness/">The Unreasonable Effectiveness of Recurrent Neural Networks</a>, I was thrilled (geek side) by the part where the RNN is generating LateX or C code, and even today after using assistants for a while, I’m amazed by some results. At work, the things I gave to my gnomes were all those long and repetitive tasks on which we waste so much of our time (probably the engineer side, pushed by the geek).</p>

<p>But the geek persona is also the one complaining the most about vibe coding. <strong>Afterall, where is the fun if we let the gnomes write the code for us!</strong></p>

<blockquote>
  <p>On this topic, there is an excellent blog post by Sarah Dayan <a href="https://www.sarahdayan.com/blog/whats-left-when-agents-write-better-code-than-you">What’s left when agents write better code than you</a>.</p>
</blockquote>

<p>I won’t go in that direction. You can do vibe coding for boring parts and use your time to focus on interesting bits, this is where the fun is. In fact, I think that the geek in us has more to gain than the engineer.</p>

<p>Our geek and our engineer have more to do with how we react to those new technologies than with what we will do with them. The engineer shrugs and asks “does it ship faster?”; the geek crosses their arms and asks “but where is the craft?” Understanding which voice is speaking helps us sort the signal from the noise.</p>

<p>And with that lens, let’s look at the bigger picture.</p>

<h2 id="the-long-story-of-programs-writing-programs">The long story of programs writing programs</h2>

<blockquote>
  <p><em>One of the privileges of being old, is that you’ve always seen it before …</em></p>
</blockquote>

<p>So, our gnomes are only the last incarnation on a long list of programs writing programs. Some were successful (as far as I know, we still use compilers) and some far less so (where is Rational Rose now?).</p>

<p>Looking back at the emergence point of those technologies, you can see that people always reacted in a similar way: some were excessively enthusiastic while others rejected them outright. I’m not old enough to remember when the first compilers were introduced, but when I was a student, we were still discussing the benefits of using compiled languages over writing assembly. That’s probably why I was so interested in programming language design and compilers (and I’m still into it).</p>

<p>I can’t tell if there’s a pattern of successful tools, but there’s a trend that I want to dig into. When I look at these technologies, they seem to split into two big categories.</p>

<p>So, when it comes to programs writing programs, we can class them into: those that try to be <em>userfriendly</em> and those that abstract technical complexity while remaining technical.</p>

<p>In the first class, you will find graphical UI to build software without writing code, products that produce code out of specifications or modeling and so on.</p>

<p>On the other side, you have programming languages and their compilers, parser generators, templating engines, preprocessors …</p>

<p>And as far as I can tell, almost all <em>userfriendly</em> tools had a short life. They may have had some success, but they did not stay. On the other hand, languages created in the 1970s or 1980s are still being used widely and are still part of the top languages.</p>

<p>In which category do I put vibe coding tools? Surprisingly, the answer is not straightforward. If you consider the archetypal use case where a complete newbie prompts some AI tool, asking something like “build my website for me”, then we’re definitely in the <em>userfriendly</em> class.</p>

<p>But that use case is broken. There is this <em>80/20 rule</em>, that essentially says that our newbies will be able to get the first 80% of their project and then they will struggle with the remaining 20% as it requires deeper understanding of software building.</p>

<p>In fact, if you look at how we are using those tools, you will see patterns that are not very different from what we’ve been doing for decades. Most of the discussions I’ve seen are not really about what to put in the prompt, but how to control the process: how do you enforce structured and reproducible behaviors? Think about it: we write rules files, configuration files, structured prompts, we set up hooks and checks – we are building toolchains around our gnomes. Somehow, the gnomes start to look more and more like compilers, code generators and other transpilers and less like the <em>userfriendly</em> click-click tools.</p>

<p>And that observation leads to a deeper question.</p>

<h2 id="are-natural-languages-suited-to-describe-programs">Are natural languages suited to describe programs?</h2>

<blockquote>
  <p><em>If your code needs a comment to be understood, it would be better to rewrite it so it’s easier to understand.</em> Rob Pike, Notes on Programming in C</p>
</blockquote>

<p>This is not a new problem. Formal disciplines have always struggled with natural language. Consider this passage:</p>

<blockquote>
  <p><em>If a first magnitude and a third are equal multiples of a second and a fourth, and a fifth and a sixth are equal multiples of the second and fourth, then the first magnitude and fifth, being added together, and the third and the sixth, being added together, will also be equal multiples of the second and the fourth, respectively.</em> Proposition 2 from Book 5 of Euclid’s Elements</p>
</blockquote>

<p>Take some time to process it. Got it? This is <code class="language-plaintext highlighter-rouge">a(x + y) = ax + ay</code>. Once mathematicians introduced symbolic notation (you know, <code class="language-plaintext highlighter-rouge">+</code>, <code class="language-plaintext highlighter-rouge">-</code>, <code class="language-plaintext highlighter-rouge">=</code>…), they never looked back. The symbols are not just shorter – they are precise, unambiguous, and scannable.</p>

<p>Programming faces the exact same issue. I am back with my teaching experience, but this time on algorithms. There’s a classic question that comes when building an algorithm class: how do you write algorithms?</p>

<p>Usually, the reasoning goes:</p>
<ul>
  <li>algorithms don’t depend on implementation language, so you describe them with natural language;</li>
  <li>but then it becomes messy and unreadable, and even misleading;</li>
  <li>you add some structure to the text, then add more …</li>
  <li>you end up with something that is almost code, not exactly, but still.</li>
</ul>

<p>At Epita, while I was doing the programming class, I was also teaching assistant for the algorithmic class and when I started, we were using a form of pseudo-code in French. But this pseudo-code was so formalized that I’ve been able to write an interpreter without the need of any further clarifications. In lots of papers presenting algorithms, you will find pseudo-pascal (or similar) code blocks. Those are way more readable than attempts in natural language, precisely because they borrow the structure and precision of code.</p>

<p>Let’s see why. Here is an algorithm described in plain English:</p>

<blockquote>
  <p>We want to compute the lower integer part of a square root of an integer <code class="language-plaintext highlighter-rouge">n</code>. We define our candidate root <code class="language-plaintext highlighter-rouge">r</code> and initialize it with <code class="language-plaintext highlighter-rouge">n</code>. Then while <code class="language-plaintext highlighter-rouge">r</code> is greater than <code class="language-plaintext highlighter-rouge">n</code> divided by <code class="language-plaintext highlighter-rouge">r</code>, we replace <code class="language-plaintext highlighter-rouge">r</code> with the mean of <code class="language-plaintext highlighter-rouge">r</code> and <code class="language-plaintext highlighter-rouge">n</code> divided by <code class="language-plaintext highlighter-rouge">r</code>. The final value of <code class="language-plaintext highlighter-rouge">r</code> is our result.</p>
</blockquote>

<p>Now, the same thing as code:</p>

<pre><code class="language-C">unsigned sqrt(unsigned n) {
	unsigned r = n;
	while (r &gt; n/r) {
		r = (r + n/r)/2;
	}
	return r;
}
// Yes, this code can divide by 0. This is an example.
</code></pre>

<p>I’m not saying that, given that code, you’ll immediately see that we’re computing a square root, but admit it (if you read code) reading the text was painful. And you know what, <strong>it was painful to write too</strong>.</p>

<p>Equations, algorithms or programs need precision and unambiguous descriptions. But we also want them to be concise, clear and straightforward. Natural languages are not good at this; symbolic languages and programming languages are designed precisely for this. And this matters for vibe coding: the more precisely you need to talk to the gnomes, the closer you get to writing code anyway.</p>

<h2 id="vibe-coding-or-not-vibe-coding">Vibe coding or not vibe coding?</h2>

<blockquote>
  <p><em>Let’s put an LLM in my compiler …</em></p>
</blockquote>

<p>So, vibe coding or not? Both. The question isn’t whether to put the gnomes to work, it’s how they fit into the way we build software.</p>

<p>If I were to imagine the future of software engineering, I would see a convergence between coding assistants and regular development tools, just like IDEs, compilers, linters and others already work together to help you on your tasks. This kind of convergence is asymptotic, it never ends – and that’s fine.</p>

<p>Where I think things are heading:</p>
<ul>
  <li>Chat-like interfaces are good for planning, launching tasks, asking questions and automating plumbing;</li>
  <li>Programming languages should continue to evolve towards less boilerplate, less verbosity;</li>
  <li>Coding assistants should integrate more structured configuration mechanisms (how many times did you ask claude to run the checks before committing code?)</li>
</ul>

<p>In short, the gnomes will get better when we stop treating them as magic oracles and start treating them as what they are: another layer in the toolchain.</p>

<h3 id="the-cost-of-entry">The cost of entry</h3>

<p>Now, I have some concerns. One in particular keeps me up at night: the price.</p>

<p>Running vibe coding tools has a cost, and it’s not cheap. When I was a student, with an old computer and a Linux distro (or FreeBSD, or OpenBSD …) you were able to write code and contribute to any open source project. It was even possible to do it without an internet connection as long as you could access it from time to time. The barrier to entry was essentially zero.</p>

<p>That is changing. If effective coding increasingly requires AI tools, and AI tools require paid subscriptions or expensive hardware, then we are building a paywall around software development itself. There are attempts to provide models that run on your own hardware, but let’s be realistic, you need an expensive setup to do so – it’s not working on your average laptop. This could quietly reshape who gets to participate in open source, and that worries me.</p>

<h3 id="teaching-programming-in-the-age-of-ai">Teaching programming in the age of AI</h3>

<p>The other concern is education. How do we teach programming in this world? What’s the risk of having new engineers that are not able to write code by themselves? If students learn to prompt before they learn to think in code, do they ever build the deep understanding needed to debug, architect, or reason about systems? I don’t have an answer yet, but it’s a question worth taking seriously.</p>

<h2 id="final-words-">Final words …</h2>

<blockquote>
  <p><em>I wrote this one shot, which hasn’t happened in years. I will save it twice (to keep the original) and run some AI assistant on it to fix my poor English and improve my prose!</em></p>
</blockquote>

<p>This is a glimpse of where my thinking stands today. There are far more things to explore – we’re just at the beginning of the journey. If you haven’t tried putting the gnomes to work, do it, it’s still fun. And if the geek in you resists, remember: even compilers were controversial once. The engineer will come around. The geek might even enjoy it – after all, gnomes are kind of cool.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Quarantine post 04 - Parameters pack</title><link href="https://slashvar.github.io/2020/03/26/Quarantine04-Parameters-Pack.html" rel="alternate" type="text/html" title="Quarantine post 04 - Parameters pack" /><published>2020-03-26T00:00:00+00:00</published><updated>2020-03-26T00:00:00+00:00</updated><id>https://slashvar.github.io/2020/03/26/Quarantine04-Parameters-Pack</id><content type="html" xml:base="https://slashvar.github.io/2020/03/26/Quarantine04-Parameters-Pack.html"><![CDATA[<p>Today in quarantine post I will talk about parameters pack. So, it’s again a template subject, but I’ll do it softly.</p>

<h2 id="variadic-templates">Variadic templates</h2>

<p>Parameters pack are the way to make template variadic, that is defining template with an open number of arguments. The syntax is sometimes a bit disturbing at first, but once you understand it, it could really useful.</p>

<p>So let’s start with a naive and basic example, just to see the syntax in action:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="o">...</span> <span class="nc">Args</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">example</span><span class="p">(</span><span class="n">Args</span> <span class="p">...</span> <span class="n">args</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="k">sizeof</span><span class="p">...(</span><span class="n">args</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>So, it applies to templates as I said, we start by defining a variadic list of type parameters <code class="language-plaintext highlighter-rouge">Args</code>. We can now define a list of parameters to our example function, <code class="language-plaintext highlighter-rouge">args</code>. We can do a lot of things with it, but just for the example we will use <code class="language-plaintext highlighter-rouge">sizeof...()</code> the version of the operator <code class="language-plaintext highlighter-rouge">sizeof()</code> to get the size of the parameter pack.</p>

<p>What we can do with <code class="language-plaintext highlighter-rouge">args</code> ? Almost anything we want, but we need to either have a uniform operation to perform or we should play with recursivity to decompose the parameters pack.</p>

<p>Let see an example using fold expressions, fold expressions are one way to use parameter packs. They basically let you apply uniformely an operation a bit in the same spirit of reduce or fold in functional language.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Example from cppreference</span>
<span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="o">...</span><span class="nc">Args</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">printer</span><span class="p">(</span><span class="n">Args</span><span class="o">&amp;&amp;</span><span class="p">...</span> <span class="n">args</span><span class="p">)</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="p">...</span> <span class="o">&lt;&lt;</span> <span class="n">args</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This function will print all its arguments and close the output with a new line. The syntax <code class="language-plaintext highlighter-rouge">(std::cout &lt;&lt; ... &lt;&lt; args)</code> (parentheses are part of it) expresses the unfolding of <code class="language-plaintext highlighter-rouge">args</code>, the expression is repeated with the content of the pack in place of the <code class="language-plaintext highlighter-rouge">...</code> by repeating the operator between each elements.</p>

<p>But let’s have a look at the recursive approach.</p>

<h2 id="recursive-decomposition">Recursive decomposition</h2>

<p>Templates are in essence functional, and thus we must adopt functional idioms. We can play with parameter packs like we would with list in functional languages. We will decompose cases with at least one for the empty pack and one for the recursion.</p>

<p>As a matter of example, let’s build <code class="language-plaintext highlighter-rouge">print</code> function similar to pyhton’s <code class="language-plaintext highlighter-rouge">print</code> (a very simplified version). This function will takes arguments and print them separated by space with a new line at the end. A bit like the previous example, but in a more subtle way.</p>

<p>First, we need a case for the empty pack:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">print</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">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Next, as we don’t want a useless space before the new line, we need a case for a lonely parameter:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">print</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">val</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">val</span><span class="p">;</span>
    <span class="n">print</span><span class="p">();</span> <span class="c1">// we could have just print a new line here</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And finally the recursive case:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">,</span> <span class="k">typename</span><span class="o">...</span> <span class="nc">Args</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="nf">print</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">val</span><span class="p">,</span> <span class="n">Args</span><span class="o">&amp;&amp;</span><span class="p">...</span> <span class="n">args</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">val</span> <span class="o">&lt;&lt;</span> <span class="s">" "</span><span class="p">;</span>
    <span class="n">print</span><span class="p">(</span><span class="n">args</span><span class="p">...);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Simple, isn’t it ? We just split the pack into a head element and a rest, for the rest of the pack.</p>

<p>Let’s put all that in a file and test it.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;random&gt;</span><span class="cp">
</span>
<span class="kt">void</span> <span class="nf">print</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">std</span><span class="o">::</span><span class="n">endl</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="nc">T</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="n">print</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">val</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">val</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</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="nc">T</span><span class="p">,</span> <span class="k">typename</span><span class="o">...</span> <span class="nc">Args</span><span class="p">&gt;</span>
<span class="kt">void</span> <span class="n">print</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">val</span><span class="p">,</span> <span class="n">Args</span><span class="o">&amp;&amp;</span><span class="p">...</span> <span class="n">args</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">val</span> <span class="o">&lt;&lt;</span> <span class="s">" "</span><span class="p">;</span>
    <span class="n">print</span><span class="p">(</span><span class="n">args</span><span class="p">...);</span>
<span class="p">}</span>

<span class="kt">unsigned</span> <span class="n">int_sqrt</span><span class="p">(</span><span class="kt">unsigned</span> <span class="n">n</span><span class="p">)</span>
<span class="p">{</span>
    <span class="kt">unsigned</span> <span class="n">r</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
    <span class="k">while</span> <span class="p">(</span><span class="n">n</span> <span class="o">/</span> <span class="n">r</span> <span class="o">&lt;</span> <span class="n">r</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">r</span> <span class="o">=</span> <span class="p">(</span><span class="n">r</span> <span class="o">+</span> <span class="n">n</span> <span class="o">/</span> <span class="n">r</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">r</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">str</span><span class="p">(</span><span class="s">"World"</span><span class="p">);</span>
    <span class="n">print</span><span class="p">(</span><span class="s">"Hello,"</span><span class="p">,</span> <span class="n">str</span><span class="p">,</span> <span class="s">"!"</span><span class="p">);</span>

    <span class="n">std</span><span class="o">::</span><span class="n">random_device</span>              <span class="n">rd</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">mt19937</span>                    <span class="n">gen</span><span class="p">(</span><span class="n">rd</span><span class="p">());</span>
    <span class="n">std</span><span class="o">::</span><span class="n">uniform_int_distribution</span><span class="o">&lt;&gt;</span> <span class="n">dis</span><span class="p">(</span><span class="mi">27972</span><span class="p">,</span> <span class="mi">755244</span><span class="p">);</span>

    <span class="kt">unsigned</span> <span class="n">x</span> <span class="o">=</span> <span class="n">dis</span><span class="p">(</span><span class="n">gen</span><span class="p">);</span>

    <span class="n">print</span><span class="p">(</span><span class="s">"int_sqrt("</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="s">") ="</span><span class="p">,</span> <span class="n">int_sqrt</span><span class="p">(</span><span class="n">x</span><span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>

<p>That’s a pretty simple example, but I hope I gave you the taste of digging it further.</p>

<h2 id="thats-all-folks">That’s all folks</h2>

<p>OK, this is it for today’s post (again, I’ve tried to stick to 30min, not counting the cat interruptions). Since the quarantine will probably continue for some weeks, I will probably have time to wrote more examples using parameter packs.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Today in quarantine post I will talk about parameters pack. So, it’s again a template subject, but I’ll do it softly.]]></summary></entry><entry><title type="html">Quarantine C++ - RAII</title><link href="https://slashvar.github.io/2020/03/25/Quarantine003-RAII.html" rel="alternate" type="text/html" title="Quarantine C++ - RAII" /><published>2020-03-25T00:00:00+00:00</published><updated>2020-03-25T00:00:00+00:00</updated><id>https://slashvar.github.io/2020/03/25/Quarantine003-RAII</id><content type="html" xml:base="https://slashvar.github.io/2020/03/25/Quarantine003-RAII.html"><![CDATA[<p>For today’s post, I’m back to C++ basic with the famous Resources Acquisition Is Initialisation (RAII). Like the two previous, it was written in less than 30 min.</p>

<h2 id="destructor">Destructor</h2>

<p>In C++, any entity that goes out of scope get destroyed properly. For immediate values (integers, floats, pointers …) or POD (plain old data) this has basically no special consequences. But objects may provide a destructor.</p>

<p>Let start with a tiny demo to understand what we are talking about:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="k">struct</span> <span class="nc">Demo</span>
<span class="p">{</span>
    <span class="c1">// The constructor</span>
    <span class="n">Demo</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">"calling ctor</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="c1">// The destructor</span>
    <span class="o">~</span><span class="n">Demo</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">"calling dtor</span><span class="se">\n</span><span class="s">"</span><span class="p">;</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">Demo</span> <span class="n">d</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>When running we get:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>shell&gt; clang++ -Wall -Wextra -std=c++17 -O3 -o dtor dtor.cc
shell&gt; ./dtor
calling ctor
calling dtor
</code></pre></div></div>

<p>You can track all the cases of destruction, but most of them are obvious. Those that are easily forgotten are: destruction of unamed objects and destruction of copy generated when calling function.</p>

<h1 id="the-power-of-the-destructor">The power of the destructor</h1>

<p>The purpose of RAII idiom is to take advantage of the pair constructor/destructor to handle resources properly. The pattern is pretty straightforward, you acquire the resource in the constructor and let the destructor takes care of properly releasing it.</p>

<p>One of the main advantage of this idiom is that, unless the program just dies, you are certain that the destructor will be called and thus you resources properly released. Even, if an exception is raised, the destructor will be called. This is exactly what you want for resource handling and completely transparent.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="k">struct</span> <span class="nc">Demo</span>
<span class="p">{</span>
    <span class="n">Demo</span><span class="p">()</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>
    <span class="o">~</span><span class="n">Demo</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">"dtor called</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="nc">Exn</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="k">try</span> <span class="p">{</span>
        <span class="n">Demo</span> <span class="n">demo</span><span class="p">;</span>
        <span class="k">throw</span> <span class="n">Exn</span> <span class="p">{};</span>
    <span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">Exn</span><span class="o">&amp;</span> <span class="n">e</span><span class="p">)</span> <span class="p">{}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The STL is using this idiom in a lot of places, you can see it in action in the <code class="language-plaintext highlighter-rouge">&lt;fstream&gt;</code> header. Another good example is <code class="language-plaintext highlighter-rouge">std::scoped_lock</code>, when creating it, it locks the real lock provided at construction and then unlock it when leaving.</p>

<h2 id="building-a-very-simple-smart-pointer">Building a very simple smart pointer</h2>

<p>Among the most useful things we can build with RAII are smart pointers. We will try to build a very simple and naive variation of <code class="language-plaintext highlighter-rouge">std::unique_ptr</code>. Let’s set up the scene with the easy part:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="k">class</span> <span class="nc">my_pointer</span>
<span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">my_pointer</span><span class="p">()</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>
    <span class="c1">// Construct by copy of the original value</span>
    <span class="n">my_pointer</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">val</span><span class="p">)</span> <span class="o">:</span> <span class="n">data_</span><span class="p">(</span><span class="k">new</span> <span class="n">T</span><span class="p">(</span><span class="n">val</span><span class="p">))</span> <span class="p">{}</span>
    <span class="o">~</span><span class="n">my_pointer</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">data_</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">delete</span> <span class="n">data_</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="n">T</span><span class="o">&amp;</span> <span class="k">operator</span><span class="o">*</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="o">*</span><span class="n">data_</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="k">operator</span><span class="o">*</span><span class="p">()</span> <span class="k">const</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="o">*</span><span class="n">data_</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">T</span><span class="o">*</span> <span class="k">operator</span><span class="o">-&gt;</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">data_</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">const</span> <span class="n">T</span><span class="o">*</span> <span class="k">operator</span><span class="o">-&gt;</span><span class="p">()</span> <span class="k">const</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">data_</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kt">void</span> <span class="n">reset</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">data_</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">delete</span> <span class="n">data_</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">data_</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
    <span class="p">}</span>

<span class="nl">private:</span>
    <span class="n">T</span><span class="o">*</span> <span class="n">data_</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>I won’t go into the overload part (<code class="language-plaintext highlighter-rouge">operator*</code> and <code class="language-plaintext highlighter-rouge">operator-&gt;</code>), read a fine documentation.</p>

<p>The RAII idiom seems pretty obvious from the constructor (the one that take a value and perform a call to <code class="language-plaintext highlighter-rouge">new</code>) and the destructor.</p>

<p>But we have a problem: what happen if we do a copy construction of our smart pointer, what about move ? This code fails to one of the most important rule of C++. This rules can be summerized in: define all constructors and destructors, or defines none.</p>

<p>What is the problem here ? If you keep the default copy constructor, once copied, you have two object with the same pointer and after one of them is destroyed, the other one has a broken pointer. You have the same problem with the default move constructor. Since we are implementing a unique smarter pointer, we don’t want copy constructor (nor copy assignement). But we still need the move counterpart.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">my_pointer</span><span class="p">(</span><span class="k">const</span> <span class="n">my_pointer</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">my_pointer</span><span class="o">&amp;</span> <span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="k">const</span> <span class="n">my_pointer</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">my_pointer</span><span class="p">(</span><span class="n">my_pointer</span><span class="o">&amp;&amp;</span> <span class="n">other</span><span class="p">)</span> <span class="o">:</span> <span class="n">data_</span><span class="p">(</span><span class="n">other</span><span class="p">.</span><span class="n">data_</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="c1">// other must not keep the pointer, otherwise we may face use after free</span>
        <span class="n">other</span><span class="p">.</span><span class="n">data_</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">my_pointer</span><span class="o">&amp;</span> <span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="n">my_pointer</span><span class="o">&amp;&amp;</span> <span class="n">other</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">data_</span><span class="p">)</span> <span class="p">{</span>
            <span class="c1">// don't forget to delete existing data</span>
            <span class="k">delete</span> <span class="n">data_</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">data_</span>       <span class="o">=</span> <span class="n">other</span><span class="p">.</span><span class="n">data_</span><span class="p">;</span>
        <span class="n">other</span><span class="p">.</span><span class="n">data_</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
        <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
    <span class="p">}</span>
</code></pre></div></div>

<p>Handling copy and move operations is mandatory for RAII objects. You can see it as a way to define the life cycle of your resource: you define how to create it, how to release it and how to share it.</p>

<p>The <code class="language-plaintext highlighter-rouge">std::vector</code> class is showing another interesting application of RAII. The vector (and its content) are destroyed and the allocated memory release when the object get destroyed. But unlike our smart pointer, the copy will perform a deep copy of the underlying array. On the other hand, the move operations are transmitting ownership of the array to the new vector while resetting the source.</p>

<h2 id="good-bye">Good bye</h2>

<p>This is it, it’s time to end this third quarantine post.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[For today’s post, I’m back to C++ basic with the famous Resources Acquisition Is Initialisation (RAII). Like the two previous, it was written in less than 30 min.]]></summary></entry><entry><title type="html">Quarantine Post 02 - Quick SFINAE</title><link href="https://slashvar.github.io/2020/03/24/QuarantineC++-SFINAE.html" rel="alternate" type="text/html" title="Quarantine Post 02 - Quick SFINAE" /><published>2020-03-24T00:00:00+00:00</published><updated>2020-03-24T00:00:00+00:00</updated><id>https://slashvar.github.io/2020/03/24/QuarantineC++:SFINAE</id><content type="html" xml:base="https://slashvar.github.io/2020/03/24/QuarantineC++-SFINAE.html"><![CDATA[<p>Today, I’m jumping into more a advanced topic: Substitution Failure Is Not An Error (SFINAE). So, we’re gonna talk about templates, type traits and a bit of static programming.</p>

<h2 id="sfinae-whats-that-">SFINAE: What’s that ?</h2>

<p>The first keyword is <em>Substitution</em>, so it’s all about template. Substitution occurs when we instantiate a template and a variable of the template is replaced by it’s actual <em>value</em>. The point is that unlike most of what may happen at compile time, if substitution fails for a template (or a part of it), it does not generate an error at compile.</p>

<p>SFINAE is a trick that became a standard. We can use the SFINAE to select a specific implementation of a template without relying on explicit specialization.</p>

<p>Let’s start with an example. We want to implement a function that tells if a number is not negative, if we want it to work on all kind of numbers, without SFINAE we need to write a specialization for all types or write a blind template that accept any types. Let’s go directly in jungle:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;type_traits&gt;</span><span class="cp">
</span>
<span class="c1">// unsigned are never negative</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="n">std</span><span class="o">::</span><span class="n">enable_if_t</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">is_unsigned_v</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">,</span> <span class="kt">bool</span><span class="o">&gt;</span>  <span class="n">not_negative</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">val</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// if comparison against 0 works, it's ok</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="k">auto</span> <span class="n">not_negative</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">val</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">decltype</span><span class="p">(</span><span class="n">val</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">val</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This is not yet functional, but first let’s explore the code. The first version uses <code class="language-plaintext highlighter-rouge">std::enable_if_t&lt;cond,type&gt;</code> an SFINAE tools that is replaced by <code class="language-plaintext highlighter-rouge">type</code> if <code class="language-plaintext highlighter-rouge">cond</code> is true and not defined otherwise. So, if <code class="language-plaintext highlighter-rouge">std::is_unsigned_v&lt;T&gt;</code> is true (another SFINAE tool) this function is defined and always return true.</p>

<p>The second instance uses <code class="language-plaintext highlighter-rouge">decltype</code>, a static operator that evaluate the type of an expression, so here if <code class="language-plaintext highlighter-rouge">val &gt;= 0</code> is well typed, the function will have the same return type, so this function will be defined for any type <code class="language-plaintext highlighter-rouge">T</code> that can be used in comparison.</p>

<p>As I say, this is almost working. The problem is that if I try to instantiate that template with a type like <code class="language-plaintext highlighter-rouge">unsigned int</code>, both versions will be defined, we need something else. We can do something similar as the first one to exclude unsigned types, or we can use overloading priority to select the right function. Let’s see how to do that:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Define a detail namespace to indicate that the following code are implementation details</span>
<span class="k">namespace</span> <span class="n">detail</span>
<span class="p">{</span>
<span class="c1">// unsigned are never negative</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="n">std</span><span class="o">::</span><span class="n">enable_if_t</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">is_unsigned_v</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">,</span> <span class="kt">bool</span><span class="o">&gt;</span>  <span class="n">not_negative_implem</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">val</span><span class="p">,</span> <span class="kt">int</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// if comparison against 0 works, it's ok</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="k">auto</span> <span class="n">not_negative_implem</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">val</span><span class="p">,</span> <span class="kt">float</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">decltype</span><span class="p">(</span><span class="n">val</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">val</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>

<span class="c1">// Now the generic function</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">bool</span> <span class="n">not_negative</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">val</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">detail</span><span class="o">::</span><span class="n">not_negative_implem</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Here we are using the fact that when selecting an overloaded verison, the compiler will select a version without type conversion first. So, if <code class="language-plaintext highlighter-rouge">T</code> is an unsigned type, since <code class="language-plaintext highlighter-rouge">0</code> is by default an <code class="language-plaintext highlighter-rouge">int</code>, the first overload will be selected, otherwise this version won’t be defined and it will try to instantiate the second.</p>

<p>The following code will demonstrate that code in action. I have added some print statement to see which version is used:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;type_traits&gt;</span><span class="cp">
</span>
<span class="c1">// Define a detail namespace to indicate that the following code are implementation details</span>
<span class="k">namespace</span> <span class="n">detail</span>
<span class="p">{</span>
<span class="c1">// unsigned are never negative</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="n">std</span><span class="o">::</span><span class="n">enable_if_t</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">is_unsigned_v</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">,</span> <span class="kt">bool</span><span class="o">&gt;</span>  <span class="n">not_negative_implem</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span><span class="p">,</span> <span class="kt">int</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">"unsigned version</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// if comparison against 0 works, it's ok</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="k">auto</span> <span class="n">not_negative_implem</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">val</span><span class="p">,</span> <span class="kt">float</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">decltype</span><span class="p">(</span><span class="n">val</span> <span class="o">&gt;=</span> <span class="mi">0</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">"signed version</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">val</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>

<span class="c1">// Now the generic function</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="kt">bool</span> <span class="n">not_negative</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">val</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">detail</span><span class="o">::</span><span class="n">not_negative_implem</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="mi">0</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="kt">unsigned</span> <span class="kt">short</span> <span class="n">un</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="kt">long</span> <span class="n">sig</span> <span class="o">=</span> <span class="o">-</span><span class="mi">12</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">not_negative</span><span class="p">(</span><span class="n">un</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">"not_negative is true</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">not_negative</span><span class="p">(</span><span class="n">sig</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">"not_negative is true</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Compile and run:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>shell&gt; clang++ -Wall -Wextra -std=c++17 -o sfinae01 sfinae01.cc
shell&gt; ./sfinae01
unsigned version
not_negative is true
signed version
</code></pre></div></div>

<p>We can do lot more with this, I have already wrote a post on SFINAE: https://slashvar.github.io/2019/08/17/Detecting-Functions-existence-with-SFINAE.html</p>

<h2 id="defining-type-traits">Defining type traits</h2>

<p>The standard provide a lot of type traits, but we can define our own using SFINAE too. Here is a quick example, a type traits that evaluate to true if instances of a type provide a function member <code class="language-plaintext highlighter-rouge">size()</code>. And as a bonus, it can give you the return type of this function.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Does T provide a size member ?</span>

<span class="c1">// Fallback if T::size() is not defined</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">,</span> <span class="k">typename</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">void_t</span><span class="o">&lt;</span><span class="p">&gt;</span><span class="o">&gt;</span>
<span class="k">struct</span> <span class="nc">has_size</span>
<span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="kt">bool</span> <span class="n">value</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">};</span>

<span class="c1">// Specialization when T::size() is defined</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="k">struct</span> <span class="nc">has_size</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">void_t</span><span class="o">&lt;</span><span class="k">decltype</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">declval</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">().</span><span class="n">size</span><span class="p">())</span><span class="o">&gt;&gt;</span>
<span class="p">{</span>
    <span class="k">static</span> <span class="k">constexpr</span> <span class="kt">bool</span> <span class="n">value</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
    <span class="k">using</span> <span class="n">type</span>                  <span class="o">=</span> <span class="k">decltype</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">declval</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">().</span><span class="n">size</span><span class="p">());</span>
<span class="p">};</span>
</code></pre></div></div>

<p>As I have reach the time limit for this post, I will let you explore that code by yourself !</p>

<h2 id="thats-all-for-today">That’s all for today</h2>

<p>This is the end of this quarantine post, if you didn’t know this topic before, you probably have something new to explore.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Today, I’m jumping into more a advanced topic: Substitution Failure Is Not An Error (SFINAE). So, we’re gonna talk about templates, type traits and a bit of static programming.]]></summary></entry><entry><title type="html">Quarantine Quick C++ Tutorial</title><link href="https://slashvar.github.io/2020/03/23/Quarantine-C++-quick-tuto.html" rel="alternate" type="text/html" title="Quarantine Quick C++ Tutorial" /><published>2020-03-23T00:00:00+00:00</published><updated>2020-03-23T00:00:00+00:00</updated><id>https://slashvar.github.io/2020/03/23/Quarantine:C++-quick-tuto</id><content type="html" xml:base="https://slashvar.github.io/2020/03/23/Quarantine-C++-quick-tuto.html"><![CDATA[<p>Being stuck at home, we all have some extra time to work on various subjects we never found time for. I’ve decided to write small C++ tutorials, I can’t guarantee to write a new one everyday, but I’ll try. The purpose is to quickly explore a subject in less than 30min.</p>

<p>For the first one, I’ll pick my favorite beginner topic: C++ is not (that) hard. This quick tuto will try to demonstrate that you can write C++ without spending too much time on complex topic such as memory management.</p>

<h2 id="tiny-sort">Tiny sort</h2>

<p>For this tuto, we will implement a simplified version of the unix command <code class="language-plaintext highlighter-rouge">sort</code>. This command read lines from the standard input (or a file, but let’s start with the standard input), sort them and write them sorted on the standard output. The command has more options but we don’t want to write an option parser.</p>

<p>We can implement a quick version in python, just to see where we are going.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="n">stdin</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
    <span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">stdin</span><span class="p">:</span>
        <span class="n">lines</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">.</span><span class="n">strip</span><span class="p">(</span><span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">))</span>
    <span class="n">lines</span><span class="p">.</span><span class="n">sort</span><span class="p">()</span>
    <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
</code></pre></div></div>

<p>The code is really simple, of course, the C++ version will be longer, but not that much.</p>

<h2 id="setting-up-the-scene">Setting up the scene</h2>

<p>First, we need to prepare our program and include the needed components of the standard library.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Algorithms (for sort)</span>
<span class="cp">#include</span> <span class="cpf">&lt;algorithm&gt;</span><span class="cp">
</span><span class="c1">// Stream input and output</span>
<span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span><span class="c1">// Vector containers</span>
<span class="cp">#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
</span>
<span class="c1">// The program entry point</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>

<span class="p">}</span>
</code></pre></div></div>

<p>If you want to know more about these includes, I strongly encourage you to use http://cppreference.com and explore this fine documentation.</p>

<p>We don’t have code yet, but it could be a good idea to start compiling your program. Being an old fashioned dev, I prefer compiling from a terminal. Since we are working with a single file, we don’t need a build manager. I’m using <code class="language-plaintext highlighter-rouge">clang++</code> as my compiler but <code class="language-plaintext highlighter-rouge">g++</code> will work exactly the same here. Let’s assume the code is in a file called <code class="language-plaintext highlighter-rouge">my_sort.cc</code> and we want to produce a binary called <code class="language-plaintext highlighter-rouge">my_sort</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt; clang++ -Wall -Wextra -std=c++17 -O3 -o my_sort my_sort.cc
</code></pre></div></div>

<p>This command should produce a program called <code class="language-plaintext highlighter-rouge">my_sort</code>. We build with the most common warning flags (<code class="language-plaintext highlighter-rouge">-Wall</code> and <code class="language-plaintext highlighter-rouge">-Wextra</code>), we use optimizations at level 3 (not for the perf, but for the extra warnings it brings) and we assume C++17 standard (but C++11 or C++14 should work too).</p>

<h2 id="reading-the-standard-input">Reading the standard input</h2>

<p>C++ has several tools to do I/Os, but the easiest to use are the streams library. Since we are just reading lines, the best tool at hand is <code class="language-plaintext highlighter-rouge">std::getline</code>. As a first demonstration, we will read and reouput the line from the standard input:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">line</span><span class="p">;</span> <span class="n">std</span><span class="o">::</span><span class="n">getline</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">cin</span><span class="p">,</span> <span class="n">line</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">line</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">std::cin</code> is the standard input and <code class="language-plaintext highlighter-rouge">std::cout</code> the standard ouput. The loop is pretty similar to what we’ve done in python, while <code class="language-plaintext highlighter-rouge">std::getline</code> don’t return false (it’s not exactly what it returns, but that will be enough for today) we read a line and assign it to <code class="language-plaintext highlighter-rouge">line</code>.</p>

<p>Note the usage of the operator <code class="language-plaintext highlighter-rouge">&lt;&lt;</code> to output what we have read.</p>

<p>We can try that piece of code:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>shell&gt; ls
my_sort.cc my_sort.py
shell&gt; echo "line 1" &gt; foo
shell&gt; echo "line 2" &gt;&gt; foo
shell&gt; clang++ -Wall -Wextra -std=c++17 -O3 -o my_sort my_sort.cc
shell&gt; cat foo | ./my_sort
line 1
line 2
</code></pre></div></div>

<h2 id="storing-the-lines">Storing the lines</h2>

<p>Since we need to sort the lines, we need to sort store them. We need the simpliest form of container, a vector.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
    <span class="c1">// A vector of strings</span>
    <span class="n">std</span><span class="o">::</span><span class="n">vector</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">lines</span><span class="p">;</span>

    <span class="c1">// Read and store the lines</span>
    <span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">line</span><span class="p">;</span> <span class="n">std</span><span class="o">::</span><span class="n">getline</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">cin</span><span class="p">,</span> <span class="n">line</span><span class="p">);)</span> <span class="p">{</span>
        <span class="c1">// the line is copied in the vector</span>
        <span class="n">lines</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">line</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="c1">// Print the lines</span>
    <span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="k">auto</span><span class="o">&amp;</span> <span class="n">line</span> <span class="o">:</span> <span class="n">lines</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">line</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The storing part is pretty straightforward, we push at the back the line we have just read.</p>

<p>For the output, we use a form of <em>for each</em> loop. The variable is declared as <code class="language-plaintext highlighter-rouge">const auto&amp;</code> meaning that we don’t need to modify it (<code class="language-plaintext highlighter-rouge">const</code>) and we don’t want a copy but just a reference (the <code class="language-plaintext highlighter-rouge">&amp;</code>) and since we are lazy we don’t want to write <code class="language-plaintext highlighter-rouge">std::string</code> again and use <code class="language-plaintext highlighter-rouge">auto</code> instead.</p>

<p>This code should have the same output as the previous example.</p>

<h2 id="sort-">Sort ?</h2>

<p>The STL (Standard Template Library) provides a lot of interesting tools and algorithms. We can find a sort function (<code class="language-plaintext highlighter-rouge">std::sort</code>, what a surprise).</p>

<p>But you can’t write <code class="language-plaintext highlighter-rouge">std::sort(lines)</code>, it doesn’t work that way. Algorithms takes iterators, a begin and an end. In our case, we want to sort the whole vector, for that we will use the two functions that provide the begin and end of the vector. So all we have to do is to add the following line:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    std::sort(lines.begin(), lines.end());
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">std::sort</code> can be used to sort only a part of a container or can take a comparison function, read the doc if you want to know more about it.</p>

<h2 id="putting-everything-together">Putting everything together</h2>

<p>Now we can see or full <code class="language-plaintext highlighter-rouge">my_sort</code> command:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Algorithms (for sort)</span>
<span class="cp">#include</span> <span class="cpf">&lt;algorithm&gt;</span><span class="cp">
</span><span class="c1">// Stream input and output</span>
<span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span><span class="c1">// Vector containers</span>
<span class="cp">#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
</span>
<span class="c1">// The program entry point</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
    <span class="c1">// A vector of strings</span>
    <span class="n">std</span><span class="o">::</span><span class="n">vector</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">lines</span><span class="p">;</span>

    <span class="c1">// Read and store the lines</span>
    <span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">line</span><span class="p">;</span> <span class="n">std</span><span class="o">::</span><span class="n">getline</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">cin</span><span class="p">,</span> <span class="n">line</span><span class="p">);)</span> <span class="p">{</span>
        <span class="c1">// the line is copied in the vector</span>
        <span class="n">lines</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">line</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="c1">// Sort the lines</span>
    <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">lines</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">lines</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>
    <span class="c1">// Print the lines</span>
    <span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="k">auto</span><span class="o">&amp;</span> <span class="n">line</span> <span class="o">:</span> <span class="n">lines</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">line</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>We can compile and try our code:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>shell&gt; seq 10 | sort -R &gt; random-lines
shell&gt; cat random-lines
6
9
8
3
5
1
4
10
7
2
shell&gt; clang++ -Wall -Wextra -std=c++17 -O3 -o my_sort my_sort.cc
shell&gt; cat random-lines | ./my_sort
1
10
2
3
4
5
6
7
8
9
</code></pre></div></div>

<p>Note that we are sorting string, hence <code class="language-plaintext highlighter-rouge">10</code> is before <code class="language-plaintext highlighter-rouge">2</code>, just try with <code class="language-plaintext highlighter-rouge">cat random-lines | sort</code> and you will get the same output.</p>

<h2 id="ive-learned-that-in-c-you-must-manage-memory-are-we-safe-here-">“I’ve learned that in C++ you must manage memory, are we safe here ?”</h2>

<p>Short version: Yes !</p>

<p>In C++, objects that go out of scope are implicitly destroyed. For objects containing resources (like a vector or a string), if they are properly implemented (hopefully this is the case for those provided by the STL) they will release their resources when destroyed.</p>

<p>Can we be sure ? Yes, we can try to run our code with tools to check for memory leak. The simplest way is to use the address sanitizer provided by <code class="language-plaintext highlighter-rouge">clang</code> and <code class="language-plaintext highlighter-rouge">gcc</code>. If we have memory leak at the end, we will see some errors:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>shell&gt; clang++ -Wall -Wextra -std=c++17 -fsanitize=address -O3 -o my_sort my_sort.cc
shell&gt; cat random-lines | ./my_sort
1
10
2
3
4
5
6
7
8
9
</code></pre></div></div>

<h2 id="going-further-">Going further ?</h2>

<p>You can push this code a little bit further and take a file name as argument, and read from it rather than from the standard input. Or you can try to see how to build a numeric sort.</p>

<h2 id="goodbye">Goodbye</h2>

<p>That’s all for today, that was an easy one, I will try to write something a bit more advanced tomorrow, maybe something with template or RAII.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Being stuck at home, we all have some extra time to work on various subjects we never found time for. I’ve decided to write small C++ tutorials, I can’t guarantee to write a new one everyday, but I’ll try. The purpose is to quickly explore a subject in less than 30min.]]></summary></entry><entry><title type="html">Detecting Functions Existence With Sfinae</title><link href="https://slashvar.github.io/2019/08/17/Detecting-Functions-existence-with-SFINAE.html" rel="alternate" type="text/html" title="Detecting Functions Existence With Sfinae" /><published>2019-08-17T00:00:00+00:00</published><updated>2019-08-17T00:00:00+00:00</updated><id>https://slashvar.github.io/2019/08/17/Detecting-Functions-existence-with-SFINAE</id><content type="html" xml:base="https://slashvar.github.io/2019/08/17/Detecting-Functions-existence-with-SFINAE.html"><![CDATA[<p>Have you ever heard of SFINAE ? If not, you’re missing one interesting feature of C++. As for many other meta-programming aspect, it seems to rely on a specific behavior of template to perform very interesting compile operations.</p>

<p>Of course, there’s a lot of presentation about SFINAE and the STL provides some useful tools based on it. I don’t want to write another basic introduction to it, so I decided to peak a topic for which I didn’t found any example easily.</p>

<p>That’s lead us to the beginning of the title of this post: <em>Detecting functions existence</em>. We often have to provide replacement for library functions that are not available everywhere, depending of the OS or a library version. I’ll use as an example <code class="language-plaintext highlighter-rouge">quick_exit(3)</code> which is supposed to be part of the ISO standard but is not available on MacOS, we had the issue recently and while we’re not running our software on Mac, a lot of members of my teams are using Mac laptop as dev machine, so we need to be able to at least compile our code on it, but we don’t need a full-blown replacement and using <code class="language-plaintext highlighter-rouge">_exit</code> or <code class="language-plaintext highlighter-rouge">_Exit</code> will be enough in that case.</p>

<p>Of course, I wanted something that was not based on macros and I wanted it relying on the presence of the function. Hence the SFINAE approach.</p>

<p>But first, let see what we’re talking about.</p>

<h2 id="substitution-failure-is-not-an-error">Substitution Failure Is Not An Error</h2>

<p>SFINAE stands for <strong>Substitution Failure Is Not An Error</strong>. Does it helps ?</p>

<p>In short, the compiler will not produce errors in some substitution cases and just ignore the faulty code. It can be surprising that such a behavior makes any sense in the first place, but it’s in fact a very powerful feature. If you think of it, sometimes you instantiate a template but not all operations provided by it make sense with the provided parameters. As long as you don’t use them, you’re fine. This silent failure is very convenient in a lot of cases. The basic usage of this is to forbid generic operations on type for which it doesn’t make sense. Let’s take a simple example:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="k">auto</span> <span class="nf">sum</span><span class="p">(</span><span class="n">T</span><span class="o">&amp;&amp;</span> <span class="n">x</span><span class="p">,</span> <span class="n">T</span><span class="o">&amp;&amp;</span> <span class="n">y</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">decltype</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">y</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>In this example, the return type of the function is the type of <code class="language-plaintext highlighter-rouge">x + y</code>, if <code class="language-plaintext highlighter-rouge">T</code> does not support operator <code class="language-plaintext highlighter-rouge">+</code>, the expression <code class="language-plaintext highlighter-rouge">x + y</code> is ill formed, and the templated function won’t be defined for it. It’s as simple as that.</p>

<p>But we can also use it to provide specialized version based on similar property.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="n">details</span> <span class="p">{</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="k">auto</span> <span class="n">print_sum_implem</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">y</span><span class="p">,</span> <span class="kt">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">decltype</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">y</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">auto</span> <span class="n">res</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</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">"Sum of "</span> <span class="o">&lt;&lt;</span> <span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="s">" and "</span> <span class="o">&lt;&lt;</span> <span class="n">y</span> <span class="o">&lt;&lt;</span> <span class="s">" = "</span> <span class="o">&lt;&lt;</span> <span class="n">res</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">res</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="nc">T</span><span class="p">&gt;</span>
<span class="kt">int</span> <span class="n">print_sum_implem</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span><span class="p">,</span> <span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span><span class="p">,</span> <span class="kt">double</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">"Sum is not possible !</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</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="nc">T</span><span class="p">&gt;</span>
<span class="k">auto</span> <span class="n">print_sum</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">y</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">details</span><span class="o">::</span><span class="n">print_sum_implem</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>It’s a bit out-of-the-box and not really meaningful, but it shows you what can be done. Note the usage of an extra parameter (<code class="language-plaintext highlighter-rouge">int</code> or <code class="language-plaintext highlighter-rouge">double</code>), it’s here to guide the overloading choice since both version are valid when <code class="language-plaintext highlighter-rouge">T</code> support <code class="language-plaintext highlighter-rouge">+</code>, we instruct the compiler to prefer the first version since <code class="language-plaintext highlighter-rouge">int</code> is a better match for <code class="language-plaintext highlighter-rouge">0</code> than <code class="language-plaintext highlighter-rouge">double</code>.</p>

<p>The header <code class="language-plaintext highlighter-rouge">&lt;type_traits&gt;</code> contains several useful tools to leverage SFINAE more easily like <code class="language-plaintext highlighter-rouge">std::enable_if</code> and various tests on types.</p>

<h2 id="detecting-functions">Detecting functions</h2>

<p>OK, so what I want now is to be able write a wrapper for <code class="language-plaintext highlighter-rouge">quick_exit(3)</code> using <code class="language-plaintext highlighter-rouge">_exit</code> if it’s not available. And guess what, it appears to be pretty straightforward ! Just check if the function exists using <code class="language-plaintext highlighter-rouge">decltype</code> and you’re good.</p>

<p>We will be using the same <code class="language-plaintext highlighter-rouge">int</code> vs <code class="language-plaintext highlighter-rouge">float</code> tricks to prioritize the version using <code class="language-plaintext highlighter-rouge">quick_exit</code>, add the required attributes (<code class="language-plaintext highlighter-rouge">[[noreturn]]</code>) and lock detail implementation in its own namespace.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="n">details</span> <span class="p">{</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="p">[[</span><span class="n">noreturn</span><span class="p">]]</span> <span class="k">auto</span> <span class="n">quick_exit_impl</span><span class="p">(</span><span class="n">T</span> <span class="n">status</span><span class="p">,</span> <span class="kt">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="k">decltype</span><span class="p">(</span><span class="n">quick_exit</span><span class="p">(</span><span class="n">status</span><span class="p">))</span>
<span class="p">{</span>
    <span class="n">quick_exit</span><span class="p">(</span><span class="n">status</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="nc">T</span><span class="p">&gt;</span>
<span class="p">[[</span><span class="n">noreturn</span><span class="p">]]</span> <span class="k">auto</span> <span class="n">quick_exit_impl</span><span class="p">(</span><span class="n">T</span> <span class="n">status</span><span class="p">,</span> <span class="kt">double</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kt">void</span>
<span class="p">{</span>
    <span class="n">_exit</span><span class="p">(</span><span class="n">status</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>

<span class="p">[[</span><span class="n">noreturn</span><span class="p">]]</span> <span class="k">static</span> <span class="kt">void</span> <span class="n">my_quick_exit</span><span class="p">(</span><span class="kt">int</span> <span class="n">status</span><span class="p">)</span> <span class="k">noexcept</span>
<span class="p">{</span>
    <span class="n">details</span><span class="o">::</span><span class="n">quick_exit_impl</span><span class="p">(</span><span class="n">status</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The name of your wrapper have to be non ambiguous, you can easily end with infinite recursion otherwise.</p>

<p>Of course, having a <code class="language-plaintext highlighter-rouge">#if __My_OS__</code> test looks simpler, but now you only rely on the existence of the function, not the possible versions you’re aware of.</p>

<p>This can be very useful, people using OpenSSL may have suffer from their API breaks between various versions, you can have a proper wrapper hiding it this way.</p>

<h2 id="going-further">Going further</h2>

<p>There’s a lot of possibilities when playing around with SFINAE and type traits in general. For example, we are using a wrapper template that injects if needed bound checking when passing unsigned sizes with proper types to function taking <code class="language-plaintext highlighter-rouge">int</code> as size (think of OpenSSL broken API).</p>

<p>As an example, let’s build a <code class="language-plaintext highlighter-rouge">less</code> function that compare two integer of different types properly.  The promotion of integers type can go pretty wrong when comparing a signed integer with an unsigned one, just as a matter of example, try the following example:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
    <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
    <span class="kt">unsigned</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="n">y</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">"Good</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="p">}</span> <span class="k">else</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">"Bad</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Guess what ? It displays <code class="language-plaintext highlighter-rouge">Bad</code> (and you got a warning at compile time). The reason ? when comparing two different types, the compiler is forced to inject conversions, in this case, the rules state it must convert the <code class="language-plaintext highlighter-rouge">int</code> (which has a lower rank than <code class="language-plaintext highlighter-rouge">unsigned</code>) into <code class="language-plaintext highlighter-rouge">unsigned</code>. Despite the fact that as of today, nothing force the compiler to use two’s complement, the conversion rules from signed to unsigned generate the same results, and <code class="language-plaintext highlighter-rouge">-1</code> becomes the maximum value for <code class="language-plaintext highlighter-rouge">unsigned</code>.</p>

<p>So, what we want is a generic function that returns the comparison safely. The comparison of <code class="language-plaintext highlighter-rouge">x &lt; y</code> depends on signedness of <code class="language-plaintext highlighter-rouge">x</code> and <code class="language-plaintext highlighter-rouge">y</code>, assuming that <code class="language-plaintext highlighter-rouge">x</code> is signed but <code class="language-plaintext highlighter-rouge">y</code> is not, the comparison should be:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="o">||</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">unsigned</span><span class="o">&gt;</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">y</span><span class="p">;</span>
</code></pre></div></div>

<p>In the opposite case (<code class="language-plaintext highlighter-rouge">y</code> signed) we can build a similar test.</p>

<p>So, what do we need ?</p>

<ul>
  <li>A version that return the comparison directly if the two parameter have the same signedness and the comparison is defined for their type.</li>
  <li>A version when the first argument is signed but not the second</li>
  <li>A version when the second is signed</li>
</ul>

<p>As a side effect, non numeric types have the same signedness (provided that we test it correctly) and thus the first version will be defined as long as we can compare the two types.</p>

<p>Here is the implementation</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">U</span><span class="p">&gt;</span>
<span class="k">struct</span> <span class="nc">is_same_signedness</span>
<span class="p">{</span>
    <span class="k">constexpr</span> <span class="k">static</span> <span class="k">const</span> <span class="kt">bool</span> <span class="n">value</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">is_signed</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;::</span><span class="n">value</span> <span class="o">==</span> <span class="n">std</span><span class="o">::</span><span class="n">is_signed</span><span class="o">&lt;</span><span class="n">U</span><span class="o">&gt;::</span><span class="n">value</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="nc">T</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">U</span><span class="p">&gt;</span>
<span class="k">auto</span> <span class="n">my_less</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="n">U</span><span class="o">&amp;</span> <span class="n">y</span><span class="p">)</span>
    <span class="o">-&gt;</span> <span class="n">std</span><span class="o">::</span><span class="n">enable_if_t</span><span class="o">&lt;</span><span class="n">is_same_signedness</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">U</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span> <span class="k">decltype</span><span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="n">y</span><span class="p">)</span><span class="o">&gt;</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">y</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="nc">T</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">U</span><span class="p">&gt;</span>
<span class="k">auto</span> <span class="n">my_less</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="n">U</span><span class="o">&amp;</span> <span class="n">y</span><span class="p">)</span>
    <span class="o">-&gt;</span> <span class="n">std</span><span class="o">::</span><span class="n">enable_if_t</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">is_signed</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;::</span><span class="n">value</span> <span class="o">&amp;&amp;</span> <span class="n">std</span><span class="o">::</span><span class="n">is_unsigned</span><span class="o">&lt;</span><span class="n">U</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span> <span class="kt">bool</span><span class="o">&gt;</span>
<span class="p">{</span>
    <span class="k">using</span> <span class="n">uT</span>       <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">make_unsigned_t</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">using</span> <span class="n">target_t</span> <span class="o">=</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">conditional</span><span class="o">&lt;</span><span class="k">sizeof</span><span class="p">(</span><span class="n">uT</span><span class="p">)</span> <span class="o">&lt;</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">U</span><span class="p">),</span> <span class="n">U</span><span class="p">,</span> <span class="n">uT</span><span class="o">&gt;::</span><span class="n">type</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="n">target_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">&lt;</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="n">target_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">y</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="nc">T</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">U</span><span class="p">&gt;</span>
<span class="k">auto</span> <span class="n">my_less</span><span class="p">(</span><span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="n">U</span><span class="o">&amp;</span> <span class="n">y</span><span class="p">)</span>
    <span class="o">-&gt;</span> <span class="n">std</span><span class="o">::</span><span class="n">enable_if_t</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">is_unsigned</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;::</span><span class="n">value</span> <span class="o">&amp;&amp;</span> <span class="n">std</span><span class="o">::</span><span class="n">is_signed</span><span class="o">&lt;</span><span class="n">U</span><span class="o">&gt;::</span><span class="n">value</span><span class="p">,</span> <span class="kt">bool</span><span class="o">&gt;</span>
<span class="p">{</span>
    <span class="k">using</span> <span class="n">uU</span>       <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">make_unsigned_t</span><span class="o">&lt;</span><span class="n">U</span><span class="o">&gt;</span><span class="p">;</span>
    <span class="k">using</span> <span class="n">target_t</span> <span class="o">=</span> <span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">conditional</span><span class="o">&lt;</span><span class="k">sizeof</span><span class="p">(</span><span class="n">T</span><span class="p">)</span> <span class="o">&lt;</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">uU</span><span class="p">),</span> <span class="n">uU</span><span class="p">,</span> <span class="n">T</span><span class="o">&gt;::</span><span class="n">type</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">y</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="n">target_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">&lt;</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="n">target_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">y</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>We first define a type traits to test for same signedness (we could avoid it, but the code looks better that way) and we use it to construct the version that work for types with same signedness and defined comparison.</p>

<p>Then we have the two version depending on signedness of parameters. We use SFINAE to select the correct version and use other construction provided in <code class="language-plaintext highlighter-rouge">&lt;type_traits&gt;</code> to properly promote both side to the bigger unsigned type.</p>

<p>The test for same signedness is mandatory since (unfortunately) <code class="language-plaintext highlighter-rouge">x &lt; y</code> is not ill-formed when <code class="language-plaintext highlighter-rouge">x</code> and <code class="language-plaintext highlighter-rouge">y</code> are numeric types even if they have different signedness, thus we need to ensure that this version is not defined in this case.</p>

<p>We could have used <code class="language-plaintext highlighter-rouge">if constexpr</code> and merge in a single specialization the second and third one, but I find this presentation more explicit. In the first specialization, we could also avoid the <code class="language-plaintext highlighter-rouge">decltype</code> in the return type and use a <code class="language-plaintext highlighter-rouge">static_assert</code> providing a more explicit error message.</p>

<p>While you may find this definition a bit complex, if you need safe comparison between signed and unsigned types, this kind of construction provides a reusable code and helps avoid repeating the testing pattern. And since it supports all comparable types, you can use it in templates and all form of generic code safely. Bonus, once instantiated, the code is sufficiently simple to be elected for inlining and you can expect it to be as efficient as writing the test directly.</p>

<h2 id="conclusion">Conclusion</h2>

<p>In this post, I’ve just scratched the surface of what can be done with SFINAE. I think this illustrate one of the most interesting aspect of C++ and modern C++: providing smart tools aimed at increasing abstraction with almost no impact at run-time, also called zero-cost abstraction.</p>

<p>The growing availability of <code class="language-plaintext highlighter-rouge">constexpr</code> constructions (evaluation at compile time of standard expression of the language) and the increasing accessibility of SFINAE open new horizons and the hope for a better language without boilerplate code, dangerous usage of preprocessor or the need of code generators.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Have you ever heard of SFINAE ? If not, you’re missing one interesting feature of C++. As for many other meta-programming aspect, it seems to rely on a specific behavior of template to perform very interesting compile operations.]]></summary></entry><entry><title type="html">Lets Play With C++</title><link href="https://slashvar.github.io/2019/08/02/lets-play-with-C++.html" rel="alternate" type="text/html" title="Lets Play With C++" /><published>2019-08-02T00:00:00+00:00</published><updated>2019-08-02T00:00:00+00:00</updated><id>https://slashvar.github.io/2019/08/02/lets-play-with-C++</id><content type="html" xml:base="https://slashvar.github.io/2019/08/02/lets-play-with-C++.html"><![CDATA[<p>C++ is full of exciting aspects. When it comes to meta-programming, one can truly enjoy the trip. I was (re)reading the excellent book <em>Modern C++ Design: Generic Programming and Design Patterns Applied</em> by Andrei Alexandrescu, and it triggered many ideas.</p>

<p>I’ll focus on a tiny piece of code I wrote to verify a concept. After reading the chapter on singletons, I thought of a missing approach to the KDL (Keyboard, Display, Log) issue. This book exposes a classic issue: we have two singletons handling resources (<code class="language-plaintext highlighter-rouge">K</code> and <code class="language-plaintext highlighter-rouge">D</code>) and a singleton handling logs (<code class="language-plaintext highlighter-rouge">Log</code>). We want to avoid constructing the <code class="language-plaintext highlighter-rouge">Log</code> singleton when we don’t use it, but we want it to be available at any moment, and for it to be properly destroyed when we leave.</p>

<p>The book offers various solutions, such as the Phoenix Singleton (we rebuild the object when needed), or longevity management (an excellent idea for sure). However, what if we could partially construct the <code class="language-plaintext highlighter-rouge">Log</code> instance early on, only handling the cheap part, and keep the expensive job only when needed? We can perform an early construction by using a value instance rather than a pointer, which is safe as long as no other singleton of the same kind (value instance) refers to it.</p>

<p>Of course, this should be generic. What I want is a generic object that can postpone the creation of another object and provide a kind of proxy to it. Let’s call this object <code class="language-plaintext highlighter-rouge">Defer_constructor</code>.</p>

<p><strong>Disclaimer:</strong> this is purely experimental. I didn’t explore all the possible implications and risks of such a construction. <strong>Don’t use my code in production.</strong></p>

<h2 id="defer_constructor-is-a-kind-of-smart-pointer"><code class="language-plaintext highlighter-rouge">Defer_constructor</code> is a kind of smart pointer!</h2>

<p>Deferring execution sounds like command/functor, but the important part is the proxy idea. Outside of the object, the fact that we construct the inner object on-demand is hidden (and somehow irrelevant).</p>

<p>We’re only building a POC, so I chose a simple model for my smart pointer, no reference counting or thread-safety. I’m sticking to a straightforward concept that only supports move semantics and provides object creation.</p>

<p>The starting point of my class looks like this:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">DeferedType</span><span class="p">&gt;</span>
<span class="k">class</span> <span class="nc">Defer_constructor</span>
<span class="p">{</span>
<span class="nl">public:</span>
    <span class="k">using</span> <span class="n">type</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">add_pointer_t</span><span class="o">&lt;</span><span class="n">DeferedType</span><span class="o">&gt;</span><span class="p">;</span>

    <span class="n">Defer_constructor</span><span class="p">()</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>

    <span class="n">Defer_constructor</span><span class="p">(</span><span class="k">const</span> <span class="n">Defer_constructor</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">Defer_constructor</span><span class="o">&amp;</span> <span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="k">const</span> <span class="n">Defer_constructor</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">Defer_constructor</span><span class="p">(</span><span class="n">Defer_constructor</span><span class="o">&amp;&amp;</span><span class="p">)</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>
    <span class="n">Defer_constructor</span><span class="o">&amp;</span> <span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="n">Defer_constructor</span><span class="o">&amp;&amp;</span><span class="p">)</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>

    <span class="o">~</span><span class="n">Defer_constructor</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">instance_</span> <span class="o">!=</span> <span class="nb">nullptr</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">delete</span> <span class="n">instance_</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="n">type</span> <span class="k">operator</span><span class="o">*</span><span class="p">();</span>

    <span class="n">type</span> <span class="k">operator</span><span class="o">-&gt;</span><span class="p">();</span>

<span class="nl">private:</span>
    <span class="n">type</span> <span class="n">instance_</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>We’re supporting default move semantics (constructible and assignable), we explicitly forbid copy, and we store an instance pointer. Even if we didn’t provide implementations yet, we have the
expected overloading of <code class="language-plaintext highlighter-rouge">*</code> and <code class="language-plaintext highlighter-rouge">-&gt;</code>.</p>

<p>Note the use of <code class="language-plaintext highlighter-rouge">std::add_pointer_t&lt;DeferedType&gt;</code>. We could have written <code class="language-plaintext highlighter-rouge">DeferedType*</code>, but we have a type trait handling this. It may solve some obscure corner cases.</p>

<h2 id="constructing-the-instance">Constructing the instance</h2>

<p>We now need to provide a way of constructing the instance and be prepared to support any form of constructors. That’s when I realized how significant the changes that happened during the last decade are. In
Alexandrescu’s book (back from 2001), there were no parameters pack, thus no variadic templates, no tuples, no lambdas. We have all this now.</p>

<p>We need:</p>

<ul>
  <li>a way of accepting any parameters for the instance’s constructor,</li>
  <li>a way to store them and pass them later on.</li>
</ul>

<p>Fortunately, we don’t need to support multiple ways of constructing the instance, since we accept these parameters at creation time. We, therefore, know their types statically.</p>

<p>Here is the updated skeleton to support all parameters for our instance. The choice we’re making here may not be optimal (we’ll see why later on), but it works:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">DeferedType</span><span class="p">,</span> <span class="k">typename</span><span class="o">...</span> <span class="nc">Args</span><span class="p">&gt;</span>
<span class="k">class</span> <span class="nc">Defer_constructor</span>
<span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">Defer_constructor</span><span class="p">(</span><span class="n">Args</span><span class="o">&amp;&amp;</span><span class="p">...</span> <span class="n">args</span><span class="p">);</span>
<span class="p">};</span>
</code></pre></div></div>

<p>We want to be able to accept an unknown number of arguments. For this, we can use parameters pack (and <code class="language-plaintext highlighter-rouge">&amp;&amp;</code> for perfect forwarding). Nothing fancy. Yet, how do we store that? We can’t have an attribute holding <code class="language-plaintext highlighter-rouge">Args... args</code>, do we?</p>

<p>Another recent C++ addition can save us: tuples! We can store the parameters in a tuple, and later find a way to pass it to the constructor.</p>

<p>You may be thinking, <em>“why not use <code class="language-plaintext highlighter-rouge">std::bind</code> ?”</em>. That was my first idea, but you can’t bind a constructor. While searching for a solution, I ended up finding some template related to tuples and thought it could be
helpful. However, we could definitely have stored a bind to a function that creates an instance for us. You can give it a try!</p>

<p>Back to the tuple, here is the first version that stores data:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">DeferedType</span><span class="p">,</span> <span class="k">typename</span><span class="o">...</span> <span class="nc">Args</span><span class="p">&gt;</span>
<span class="k">class</span> <span class="nc">Defer_constructor</span>
<span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">Defer_constructor</span><span class="p">(</span><span class="n">Args</span><span class="o">&amp;&amp;</span><span class="p">...</span> <span class="n">args</span><span class="p">)</span> <span class="o">:</span> <span class="n">_args</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">forward</span><span class="o">&lt;</span><span class="n">Args</span><span class="o">&gt;</span><span class="p">(</span><span class="n">args</span><span class="p">)...)</span> <span class="p">{}</span>
<span class="nl">private:</span>
    <span class="n">std</span><span class="o">::</span><span class="n">tuple</span><span class="o">&lt;</span><span class="n">Args</span><span class="p">...</span><span class="o">&gt;</span> <span class="n">_args</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Looking good? Yes, we’re probably missing something. What happens if one of the parameters is a reference? Even worse, what happens if we get a reference to an object with a shorter lifetime? Bingo, a dangling reference!</p>

<p>Here, like with any other form of closure, we need to store copies of parameters. That’s a choice; we could also accept dangling references as a risk. However, the necessary code change to store copies is
rather small, so let’s go for it.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">DeferedType</span><span class="p">,</span> <span class="k">typename</span><span class="o">...</span> <span class="nc">Args</span><span class="p">&gt;</span>
<span class="k">class</span> <span class="nc">Defer_constructor</span>
<span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">Defer_constructor</span><span class="p">(</span><span class="n">Args</span><span class="o">&amp;&amp;</span><span class="p">...</span> <span class="n">args</span><span class="p">)</span> <span class="o">:</span> <span class="n">_args</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">forward</span><span class="o">&lt;</span><span class="n">Args</span><span class="o">&gt;</span><span class="p">(</span><span class="n">args</span><span class="p">)...)</span> <span class="p">{}</span>
<span class="nl">private:</span>
    <span class="n">std</span><span class="o">::</span><span class="n">tuple</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">decay</span><span class="o">&lt;</span><span class="n">Args</span><span class="o">&gt;::</span><span class="n">type</span><span class="p">...</span><span class="o">&gt;</span> <span class="n">_args</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<h2 id="when-we-finally-construct-the-instance">When we finally construct the instance</h2>

<p>The previous section title was misleading: we only store parameters, but we didn’t provide a way to construct the instance.</p>

<p>How can we do this? We need a way to go back to an expression of the form.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">new</span> <span class="n">DeferedType</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">forward</span><span class="o">&lt;</span><span class="n">Args</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</span><span class="p">)...)</span>
</code></pre></div></div>

<p>Where <code class="language-plaintext highlighter-rouge">a</code> is a parameters pack.</p>

<p>Remember when I said I’ve ended up using a tuple thanks to some templates I found useful? Here we are: we have something called <code class="language-plaintext highlighter-rouge">std::apply</code> that’s made for this. It takes a callable object and tuple,
and calls the object with elements of the tuple as parameters.</p>

<p>I’ve decided to wrap the <code class="language-plaintext highlighter-rouge">new</code> in a lambda, but we can probably pass the <code class="language-plaintext highlighter-rouge">new</code> operator of the class directly.</p>

<p>Another detail: we want to create the instance only it’s used. It’s used only through <code class="language-plaintext highlighter-rouge">operator*</code> and <code class="language-plaintext highlighter-rouge">operator-&gt;</code>, and the way they work is so similar that it makes sense to abstract the code in a private member (let’s call it <code class="language-plaintext highlighter-rouge">acces_</code>).</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">DeferedType</span><span class="p">,</span> <span class="k">typename</span><span class="o">...</span> <span class="nc">Args</span><span class="p">&gt;</span>
<span class="k">class</span> <span class="nc">Defer_constructor</span>
<span class="p">{</span>
<span class="nl">public:</span>

    <span class="n">type</span> <span class="k">operator</span><span class="o">*</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">acces_</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="n">type</span> <span class="k">operator</span><span class="o">-&gt;</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">acces_</span><span class="p">();</span>
    <span class="p">}</span>

<span class="nl">private:</span>

    <span class="n">type</span> <span class="n">acces_</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">instance_</span> <span class="o">==</span> <span class="nb">nullptr</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">instance_</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">apply</span><span class="p">(</span>
                <span class="p">[](</span><span class="n">Args</span><span class="p">...</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="k">new</span> <span class="n">DeferedType</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">forward</span><span class="o">&lt;</span><span class="n">Args</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</span><span class="p">)...);</span> <span class="p">},</span> <span class="n">_args</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">instance_</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>

<p>This is a classic singleton pattern with lazy instantiation: if the instance doesn’t yet exist, we create it. Otherwise, we only return the pointer.</p>

<h2 id="putting-everything-together-and-testing">Putting everything together and testing</h2>

<p>Here is a full example with the complete <code class="language-plaintext highlighter-rouge">Defer_constructor</code> class, two toy classes for the demo, and a main.</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;tuple&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;type_traits&gt;</span><span class="cp">
</span>
<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">DeferedType</span><span class="p">,</span> <span class="k">typename</span><span class="o">...</span> <span class="nc">Args</span><span class="p">&gt;</span>
<span class="k">class</span> <span class="nc">Defer_constructor</span>
<span class="p">{</span>
<span class="nl">public:</span>
    <span class="k">using</span> <span class="n">type</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">add_pointer_t</span><span class="o">&lt;</span><span class="n">DeferedType</span><span class="o">&gt;</span><span class="p">;</span>

    <span class="n">Defer_constructor</span><span class="p">()</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>

    <span class="n">Defer_constructor</span><span class="p">(</span><span class="k">const</span> <span class="n">Defer_constructor</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">Defer_constructor</span><span class="o">&amp;</span> <span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="k">const</span> <span class="n">Defer_constructor</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">Defer_constructor</span><span class="p">(</span><span class="n">Defer_constructor</span><span class="o">&amp;&amp;</span><span class="p">)</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>
    <span class="n">Defer_constructor</span><span class="o">&amp;</span> <span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="n">Defer_constructor</span><span class="o">&amp;&amp;</span><span class="p">)</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>

    <span class="o">~</span><span class="n">Defer_constructor</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">instance_</span> <span class="o">!=</span> <span class="nb">nullptr</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">delete</span> <span class="n">instance_</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="n">Defer_constructor</span><span class="p">(</span><span class="n">Args</span><span class="o">&amp;&amp;</span><span class="p">...</span> <span class="n">args</span><span class="p">)</span> <span class="o">:</span> <span class="n">_args</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">forward</span><span class="o">&lt;</span><span class="n">Args</span><span class="o">&gt;</span><span class="p">(</span><span class="n">args</span><span class="p">)...)</span> <span class="p">{}</span>

    <span class="n">type</span> <span class="k">operator</span><span class="o">*</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">acces_</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="n">type</span> <span class="k">operator</span><span class="o">-&gt;</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">acces_</span><span class="p">();</span>
    <span class="p">}</span>

<span class="nl">private:</span>
    <span class="n">type</span>                                           <span class="n">instance_</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">tuple</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">std</span><span class="o">::</span><span class="n">decay</span><span class="o">&lt;</span><span class="n">Args</span><span class="o">&gt;::</span><span class="n">type</span><span class="p">...</span><span class="o">&gt;</span> <span class="n">_args</span><span class="p">;</span>

    <span class="n">type</span> <span class="n">acces_</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">instance_</span> <span class="o">==</span> <span class="nb">nullptr</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">instance_</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">apply</span><span class="p">(</span>
                <span class="p">[](</span><span class="n">Args</span><span class="p">...</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="k">new</span> <span class="n">DeferedType</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">forward</span><span class="o">&lt;</span><span class="n">Args</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</span><span class="p">)...);</span> <span class="p">},</span> <span class="n">_args</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">instance_</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="nc">Foo</span>
<span class="p">{</span>
    <span class="n">Foo</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="o">:</span> <span class="n">x_</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="n">y_</span><span class="p">(</span><span class="n">y</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">"Foo("</span> <span class="o">&lt;&lt;</span> <span class="n">x_</span> <span class="o">&lt;&lt;</span> <span class="s">", "</span> <span class="o">&lt;&lt;</span> <span class="n">y_</span> <span class="o">&lt;&lt;</span> <span class="s">")</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kt">int</span> <span class="n">x_</span><span class="p">,</span> <span class="n">y_</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="nc">Bar</span>
<span class="p">{</span>
    <span class="n">Bar</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">str</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">str</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="kt">void</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">"f</span><span class="se">\n</span><span class="s">"</span><span class="p">;</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="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">"Before creation of f2</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
        <span class="n">Defer_constructor</span><span class="o">&lt;</span><span class="n">Foo</span><span class="p">,</span> <span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">f2</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</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">"After creation of f2</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
        <span class="kt">int</span><span class="o">&amp;</span> <span class="n">x2</span> <span class="o">=</span> <span class="n">f2</span><span class="o">-&gt;</span><span class="n">x_</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">"After use of f2 internal instance</span><span class="se">\n</span><span class="s">"</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">x2</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</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">"Now with the risk of dangling ref</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="n">Defer_constructor</span><span class="o">&lt;</span><span class="n">Bar</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;&gt;*</span> <span class="n">later</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">str</span><span class="p">(</span><span class="s">"Hello bar"</span><span class="p">);</span>
        <span class="n">later</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Defer_constructor</span><span class="o">&lt;</span><span class="n">Bar</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;&gt;</span><span class="p">(</span><span class="n">str</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="p">(</span><span class="o">*</span><span class="n">later</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">f</span><span class="p">();</span>
    <span class="k">delete</span> <span class="n">later</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Let’s try it now! I’m confident, so I’ll use <code class="language-plaintext highlighter-rouge">clang</code> with <code class="language-plaintext highlighter-rouge">-fsanitize=address</code> and <code class="language-plaintext highlighter-rouge">-Weverything</code>!</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">&gt;</span> clang++ <span class="nt">-fsanitize</span><span class="o">=</span>address <span class="nt">-Weverything</span> <span class="nt">-Wno-c</span>++98-compat <span class="nt">-std</span><span class="o">=</span>c++17 <span class="nt">-O3</span> <span class="nt">-o</span> defer defer.cc
<span class="o">&gt;</span> ./defer
Before creation of f2
After creation of f2
Foo<span class="o">(</span>2, 2<span class="o">)</span>
After use of f2 internal instance
2
Now with the risk of dangling ref
Hello bar
f
<span class="o">&gt;</span>
</code></pre></div></div>

<p>Note that we need <code class="language-plaintext highlighter-rouge">-Wno-c++98-compat</code> since <code class="language-plaintext highlighter-rouge">-Weverything</code> really contains everything.</p>

<p>Do you remember when I said that the way we get the parameters types as template parameters was not perfect? Here we’re forced to write <code class="language-plaintext highlighter-rouge">Defer_constructor&lt;Foo, int, int&gt;</code> because <code class="language-plaintext highlighter-rouge">Foo</code> can’t be inferred from the call. Therefore, we must provide all parameters.</p>

<p>I kept it for future improvement.</p>

<h2 id="conclusion">Conclusion</h2>

<p>First, it wasn’t that hard. Once we have the key ideas (tuple and <code class="language-plaintext highlighter-rouge">std::apply</code>), everything else follows smoothly.</p>

<p>Of course, there’s room for improvement. I am not at all confident about this code. I didn’t checked the generated assembly code, but I guess we can expect much inlining.</p>

<h2 id="bonus">Bonus</h2>

<p>I have one more little C++ stuff. It’s completely different, but since I am rather slow at pushing new posts, and this <em>pattern</em> is small, I wanted to share.</p>

<p>You may have noted the arrival of the <code class="language-plaintext highlighter-rouge">[[nodiscard]]</code> attribute in C++17. This is an advantageous one (in fact, most compilers offered a similar one before) when you have functions returning values that shouldn’t be discarded (e.g., a boolean that indicates an error).</p>

<p>Neat, but, as usual, we sometimes need to skip those return values for good. The problem isn’t to find a way of discarding it, but to do it in a way that’s explicit enough so that you can check it when reading the code, or even <em>grep</em> it.</p>

<p>Here is my solution:</p>

<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">T</span><span class="p">&gt;</span>
<span class="k">constexpr</span> <span class="kt">void</span> <span class="nf">ignore_value</span><span class="p">(</span><span class="n">T</span><span class="o">&amp;&amp;</span><span class="p">)</span>
<span class="p">{}</span>
</code></pre></div></div>

<p>I did not create it. For instance, in OCaml, the standard library provides a similar <code class="language-plaintext highlighter-rouge">ignore</code> function. I found it quite handy in this particular context, and since it’s explicit and easy to use, you no longer have to decipher <code class="language-plaintext highlighter-rouge">void</code> casts or empty <code class="language-plaintext highlighter-rouge">if</code> statement during code reviews.</p>

<p>Oh, and it also works when you need to ignore variables or parameters.</p>

<p>Another way to do this is to assign the result to <code class="language-plaintext highlighter-rouge">std::ignore</code>, but I find it less explicit.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[C++ is full of exciting aspects. When it comes to meta-programming, one can truly enjoy the trip. I was (re)reading the excellent book Modern C++ Design: Generic Programming and Design Patterns Applied by Andrei Alexandrescu, and it triggered many ideas.]]></summary></entry><entry><title type="html">Tail Recursive Functions</title><link href="https://slashvar.github.io/2019/04/05/tail-recursive-functions.html" rel="alternate" type="text/html" title="Tail Recursive Functions" /><published>2019-04-05T00:00:00+00:00</published><updated>2019-04-05T00:00:00+00:00</updated><id>https://slashvar.github.io/2019/04/05/tail-recursive-functions</id><content type="html" xml:base="https://slashvar.github.io/2019/04/05/tail-recursive-functions.html"><![CDATA[<p>This is a back to basic post motivated by some comments I’ve recently read
on-line about recursive functions and the tail recursion optimization. Tail
recursion is a special case of recursive functions, for which efficient
optimizations exist, but optimizations are no magic and you need to know when a
function is tail recursive and how you can write one.</p>

<p>But, before explaining this form of optimization, let’s see what is a tail
recursive function.</p>

<h2 id="there-and-back-again">There and Back Again</h2>

<p>Let’s use a toy useless function as example. Say, you want to compute addition of
integers, but you’re language only know how to compute <code class="language-plaintext highlighter-rouge">+1</code> and <code class="language-plaintext highlighter-rouge">-1</code>, and of course, we
want to do it recursively. Here is a quick implementation in python:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">y</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">x</span>
    <span class="k">return</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">add</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</code></pre></div></div>

<p>Forget about negative numbers, or cases where <code class="language-plaintext highlighter-rouge">x == 0</code>, we can solve them separetly.</p>

<p>If we run my function with <code class="language-plaintext highlighter-rouge">3</code> and <code class="language-plaintext highlighter-rouge">2</code>, here are the execution steps:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>add(3, 2) -&gt; 1 + add(3, 1)
    add(3, 1) -&gt; 1 + add(3, 0)
        add(3, 0) -&gt; 3
              -&gt; 1 + 3
          -&gt; 1 + 4
-&gt; 5
</code></pre></div></div>

<p>You can see that once you get the result of a recursive call, you can compute the <code class="language-plaintext highlighter-rouge">+1</code> and
then return your current result. We’re going <em>there</em> until we reach the stop case, and then
<em>back</em> to compute the result.</p>

<p>Now, let’s use magical math tricks, and write a similar function:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">y</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">x</span>
    <span class="k">return</span> <span class="n">add</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</code></pre></div></div>

<p>It looks pretty similar, it has the same complexity (linear on <code class="language-plaintext highlighter-rouge">y</code>), is it different ?</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>add(3, 2) -&gt; add(4, 1)
    add(4, 1) -&gt; add(5, 0)
        add(5, 0) -&gt; 5
              -&gt; 5
          -&gt; 5
-&gt; 5
</code></pre></div></div>

<p>Yes ! Once we reach <code class="language-plaintext highlighter-rouge">y == 0</code>, we have the final result, the rest of the steps are just a
cascade of returns without any computations. This version is a <strong>tail recursive function</strong>
!</p>

<blockquote>
  <p>A tail recursive function, is a function that returns a value without recursive
call or returns the result of a recursive call directly, and nothing happen
after the recursive calls.</p>
</blockquote>

<h2 id="optimizing-tail-recursive-functions">Optimizing tail recursive functions</h2>

<p>The optimization is pretty obvious, once we reach a direct return, we want to skip
every frames of recursion and directly return from the original call.</p>

<p><strong>How do we do that ?</strong></p>

<p>Of course, it really depends on the way you run your language, but let’s assume that we’re
in rather classic context, with a stack used for saving caller context and return address.
Our context is of course composed of local variables (including parameters), the address
of the beginning of the frame for the current function (the top of stack when arrived in
        the function, the frame pointer) and our own return address. Saving context on the
stack means that we push the frame pointer and the return address and we then we can push
parameters and jump to the callee. When we return from a function, we restore the frame
pointer and jump back on the return address. The details are not that important, it may
even be partially done by processors instruction, we don’t care.</p>

<p>So how do we perform the tail recursion optimization ? After the initial call, we just
don’t save the context ! That way, when we return, we return as if we were in the original
call. It works because we are sure that nothing happens after the return and thus we don’t
need our context anymore. If you want more details, open a compilation book, this is one
of the classical optimization and it’s pretty easy to implement.</p>

<p>It has two main impacts: we do only half of the jump (only there and no back) and we use a
constant space on the stack.</p>

<p>OK, this is highly theoretical, isn’t it ? Can we see this optimization in different way
without relying on the compilation strategy ? Let’s try.</p>

<p>First, let’s take a more accurate example, binary search, in C this time:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">binary_search</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">begin</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">end</span><span class="p">,</span> <span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">begin</span> <span class="o">&gt;=</span> <span class="n">end</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// x is not in [begin, end[</span>
    <span class="p">}</span>
    <span class="kt">int</span> <span class="o">*</span><span class="n">mid</span> <span class="o">=</span> <span class="n">begin</span> <span class="o">+</span> <span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">begin</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="o">*</span><span class="n">mid</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// we found it !</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="o">*</span><span class="n">mid</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">binary_search</span><span class="p">(</span><span class="n">begin</span><span class="p">,</span> <span class="n">mid</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span> <span class="c1">// search in the first half</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">binary_search</span><span class="p">(</span><span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span> <span class="c1">// second half</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>OK, the idea is to rather than call the recursive function, replace <code class="language-plaintext highlighter-rouge">begin</code> or <code class="language-plaintext highlighter-rouge">end</code>, and
then jump at the beginning of the function. Let’s use <code class="language-plaintext highlighter-rouge">goto</code> for that (yes, I’ve heard
        your screams):</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">binary_search</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">begin</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">end</span><span class="p">,</span> <span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
  <span class="nl">_start:</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">begin</span> <span class="o">&gt;=</span> <span class="n">end</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// x is not in [begin, end[</span>
    <span class="p">}</span>
    <span class="kt">int</span> <span class="o">*</span><span class="n">mid</span> <span class="o">=</span> <span class="n">begin</span> <span class="o">+</span> <span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">begin</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="o">*</span><span class="n">mid</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// we found it !</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="o">*</span><span class="n">mid</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">end</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
        <span class="k">goto</span> <span class="n">_start</span><span class="p">;</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="n">begin</span> <span class="o">=</span> <span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
        <span class="k">goto</span> <span class="n">_start</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Let’s refactor the first <code class="language-plaintext highlighter-rouge">if</code> a bit:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">binary_search</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">begin</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">end</span><span class="p">,</span> <span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
  <span class="nl">_start:</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">begin</span> <span class="o">&lt;</span> <span class="n">end</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="o">*</span><span class="n">mid</span> <span class="o">=</span> <span class="n">begin</span> <span class="o">+</span> <span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">begin</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="o">*</span><span class="n">mid</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// we found it !</span>
        <span class="p">}</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="o">*</span><span class="n">mid</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">end</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
            <span class="k">goto</span> <span class="n">_start</span><span class="p">;</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="n">begin</span> <span class="o">=</span> <span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
            <span class="k">goto</span> <span class="n">_start</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// x is not in [begin, end[</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Hey, it’s looks like a <code class="language-plaintext highlighter-rouge">while</code> loop ! Yes, this is exactly what this optimization is
about, transforming tail recursive functions into a loop !</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">binary_search</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">begin</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">end</span><span class="p">,</span> <span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">while</span> <span class="p">(</span><span class="n">begin</span> <span class="o">&lt;</span> <span class="n">end</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="o">*</span><span class="n">mid</span> <span class="o">=</span> <span class="n">begin</span> <span class="o">+</span> <span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">begin</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="o">*</span><span class="n">mid</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// we found it !</span>
        <span class="p">}</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="o">*</span><span class="n">mid</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">end</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="n">begin</span> <span class="o">=</span> <span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="cool-we-no-longer-need-to-bother-do-we-">Cool, we no longer need to bother, do we ?</h2>

<p>Remember the first function ? You can’t directly optimize it, you need to first transform
it into at taill recursive one, and that’s not always obvious. The good news is that, it’s
theoretically always possible, the bad news is that it’s not always that simple. For
simple, single call functions, it’s a matter of adding some parameters in order to carry
more information. But even in thoses cases, you need to be sure that you can reorder the
operations. Let’s see a classic trap:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">list_of_int</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">return</span> <span class="p">[]</span>
    <span class="n">r</span> <span class="o">=</span> <span class="n">list_of_int</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">r</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">r</span>
</code></pre></div></div>

<p>We can pass the result list as a parameter and transform that into a tail rec version:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">list_of_int2</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">r</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">r</span>
    <span class="n">r</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">list_of_int2</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
</code></pre></div></div>

<p>Now, we run both:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="n">list_of_int</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="n">list_of_int2</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="p">[]))</span>
</code></pre></div></div>

<p>We get:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
</code></pre></div></div>

<p>I let you correct it …</p>

<h2 id="more-calls-more-problems">More calls, more problems</h2>

<p>First, start with an easy one, Fibonacci. For that one, we need to add parameters and
inverse the order of computation:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">fibo</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
        <span class="k">return</span> <span class="mi">1</span>
    <span class="k">return</span> <span class="n">fibo</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fibo</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span>

<span class="c1"># Becomes
</span>
<span class="k">def</span> <span class="nf">_fib</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">f_i</span><span class="p">,</span> <span class="n">f_i1</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="n">n</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">f_i</span>
    <span class="k">return</span> <span class="n">_fib</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">f_i</span> <span class="o">+</span> <span class="n">f_i1</span><span class="p">,</span> <span class="n">f_i</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">fibo</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="mi">1</span>
    <span class="k">return</span> <span class="n">_fib</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</code></pre></div></div>

<p>Note that while the function computes the same values, it is not a transformation of the first one but a different algorithm, a kind of recursive version of the loop based one.</p>

<p>Now, say I have a binary tree and I want to compute its size:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Tree</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">left</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">right</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">key</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">left</span> <span class="o">=</span> <span class="n">left</span>
        <span class="bp">self</span><span class="p">.</span><span class="n">right</span> <span class="o">=</span> <span class="n">right</span>

<span class="k">def</span> <span class="nf">size</span><span class="p">(</span><span class="n">t</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">t</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">return</span> <span class="mi">0</span>
    <span class="k">return</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">size</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="n">left</span><span class="p">)</span> <span class="o">+</span> <span class="n">size</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="n">right</span><span class="p">)</span>
</code></pre></div></div>

<p>It becomes a bit more tricky no ? Unlike Fibonacci, we can’t avoid the call on each node
of the tree, we need to find a way to do them. For that, we can use a <strong>stack</strong> !</p>

<p>I’ll give you directly the loop version, it makes more sense:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">size</span><span class="p">(</span><span class="n">t</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">t</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">return</span> <span class="mi">0</span>
    <span class="n">sz</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">stack</span> <span class="o">=</span> <span class="p">[</span><span class="n">t</span><span class="p">]</span>
    <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">stack</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">n</span> <span class="o">=</span> <span class="n">stack</span><span class="p">.</span><span class="n">pop</span><span class="p">()</span>
        <span class="n">sz</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="k">if</span> <span class="n">n</span><span class="p">.</span><span class="n">right</span><span class="p">:</span>
            <span class="n">stack</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">n</span><span class="p">.</span><span class="n">right</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">n</span><span class="p">.</span><span class="n">left</span><span class="p">:</span>
            <span class="n">stack</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">n</span><span class="p">.</span><span class="n">left</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">sz</span>
</code></pre></div></div>

<p>Note the order of the push, to be sure that we traverse the tree in the same order.</p>

<p>OK, but now, what if I want to print my tree in order (the root in the middle):</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">in_order</span><span class="p">(</span><span class="n">t</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">t</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">return</span>
    <span class="n">in_order</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="n">left</span><span class="p">)</span>
    <span class="k">print</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="n">key</span><span class="p">)</span>
    <span class="n">in_order</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="n">right</span><span class="p">)</span>
</code></pre></div></div>

<p>The trick of stack is not enough, we need to simulate the there and back again, so we
really need to see each node at least twice !</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">in_order</span><span class="p">(</span><span class="n">t</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">t</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">return</span>
    <span class="n">stack</span> <span class="o">=</span> <span class="p">[(</span><span class="n">t</span><span class="p">,</span> <span class="bp">True</span><span class="p">)]</span>
    <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">stack</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">n</span><span class="p">,</span> <span class="n">cont</span> <span class="o">=</span> <span class="n">stack</span><span class="p">.</span><span class="n">pop</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">cont</span><span class="p">:</span>
            <span class="n">stack</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">n</span><span class="p">,</span> <span class="bp">False</span><span class="p">))</span>
            <span class="n">stack</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">n</span><span class="p">.</span><span class="n">left</span><span class="p">,</span> <span class="bp">True</span><span class="p">))</span> <span class="k">if</span> <span class="n">n</span><span class="p">.</span><span class="n">left</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">print</span><span class="p">(</span><span class="n">t</span><span class="p">.</span><span class="n">key</span><span class="p">)</span>
            <span class="n">stack</span><span class="p">.</span><span class="n">append</span><span class="p">((</span><span class="n">n</span><span class="p">.</span><span class="n">right</span><span class="p">,</span> <span class="bp">True</span><span class="p">))</span> <span class="k">if</span> <span class="n">n</span><span class="p">.</span><span class="n">right</span>
</code></pre></div></div>

<p>And if you need to do something in-order and post-order (so between the children and after
        the children), you will need to push each node three times in the stack. Of
course, with general trees, or graph, this becomes even more complex.</p>

<h2 id="does-it-really-matters-">Does it really matters ?</h2>

<p>So, yes, it matters. Of course, with binary trees, maximum size of the stack is linear in
the depth of the tree which is most of the time not that big even for big trees. But what
about graph ?</p>

<p>Here is a classic algorithm that finds the cut-points of a connected undirected graph:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">_cut_points</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">pre</span><span class="p">,</span> <span class="n">cuts</span><span class="p">):</span>
    <span class="n">c</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+=</span> <span class="mi">1</span>
    <span class="n">pre</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
    <span class="n">high</span> <span class="o">=</span> <span class="n">c</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
    <span class="n">children</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">for</span> <span class="n">succ</span> <span class="ow">in</span> <span class="n">g</span><span class="p">[</span><span class="n">v</span><span class="p">]:</span>
        <span class="k">if</span> <span class="n">pre</span><span class="p">[</span><span class="n">succ</span><span class="p">]</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">children</span> <span class="o">+=</span> <span class="mi">1</span>
            <span class="n">r</span> <span class="o">=</span> <span class="n">_cut_points</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">succ</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">pre</span><span class="p">,</span> <span class="n">cuts</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">parent</span> <span class="o">!=</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">r</span> <span class="o">&gt;=</span> <span class="n">pre</span><span class="p">[</span><span class="n">v</span><span class="p">]:</span>
                <span class="n">cuts</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
            <span class="n">high</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">high</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
        <span class="k">elif</span> <span class="n">succ</span> <span class="o">!=</span> <span class="n">parent</span><span class="p">:</span>
            <span class="n">high</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">high</span><span class="p">,</span> <span class="n">pre</span><span class="p">[</span><span class="n">succ</span><span class="p">])</span>
    <span class="k">if</span> <span class="n">parent</span> <span class="o">==</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">children</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
        <span class="n">cuts</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">high</span>

<span class="k">def</span> <span class="nf">cut_point</span><span class="p">(</span><span class="n">g</span><span class="p">):</span>
    <span class="n">cuts</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
    <span class="n">c</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span>
    <span class="n">pre</span> <span class="o">=</span> <span class="p">[</span><span class="bp">None</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
    <span class="n">_cut_points</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">pre</span><span class="p">,</span> <span class="n">cuts</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">cuts</span>
</code></pre></div></div>

<p>OK, it’s a DFS (depth first traversal) of an undirected graph, with pre-order counting
(the array <code class="language-plaintext highlighter-rouge">pre</code> using <code class="language-plaintext highlighter-rouge">c</code> to store the counter and simulate a reference). It works with a
similar idea as Tarjan’s algorithm for finding strongly connected components, but
translated to undirected graphs.</p>

<p>The graph is represented as adjacency list: it’s an array of lists, vertices are numbered
from <code class="language-plaintext highlighter-rouge">0</code> to the order of the graph and <code class="language-plaintext highlighter-rouge">g[v]</code> is the list of successors of <code class="language-plaintext highlighter-rouge">v</code>.</p>

<p>You can extend it to compute cut-edges and build 2-connected components. Open a good
algorithms text book if you want to know more about it.</p>

<p>What we see here is that we have multiple recursive calls (in a loop) and we perform
operation in pre-order, after each call and in post-order. So we need to meet each vertex
a first time, then do something after each of it’s successors and then a last time. It’s
easy to see that removing recursion won’t be easy …</p>

<p>Why this example ? Some years ago, for some experiments with huge graphs, I needed the
cut-points and I implemented the very same algorithm (in C++). On huge graphs, highly
connected, the recursion depth was pretty high and I ended up with a lot of stackoverflow.
The only way to get it to work, was to derecursify it. It’s doable, it’s finally not that
ugly (a big thanks to C++ iterators) and it saved my experiments !</p>

<p>Let’s see our python version:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">cut_points_iter</span><span class="p">(</span><span class="n">g</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="mi">0</span><span class="p">):</span>
    <span class="n">cuts</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
    <span class="n">high</span> <span class="o">=</span> <span class="p">[</span><span class="bp">None</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
    <span class="n">parent_it</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
    <span class="n">pre</span> <span class="o">=</span> <span class="p">[</span><span class="bp">None</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
    <span class="n">parents</span> <span class="o">=</span> <span class="p">[</span><span class="bp">None</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
    <span class="n">root_children</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="n">c</span> <span class="o">=</span> <span class="mi">1</span>
    <span class="n">pre</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span>
    <span class="n">parents</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
    <span class="n">high</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span>
    <span class="n">stack</span> <span class="o">=</span> <span class="p">[</span> <span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="p">]</span>
    <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">stack</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">v</span><span class="p">,</span> <span class="n">ret</span><span class="p">,</span> <span class="n">it</span> <span class="o">=</span> <span class="n">stack</span><span class="p">.</span><span class="n">pop</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">ret</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">parents</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">==</span> <span class="n">v</span><span class="p">:</span>
                <span class="n">root_children</span> <span class="o">+=</span> <span class="mi">1</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">ret</span> <span class="o">&gt;=</span> <span class="n">pre</span><span class="p">[</span><span class="n">v</span><span class="p">]:</span>
                    <span class="n">cuts</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
                <span class="n">high</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">high</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">ret</span><span class="p">)</span>
            <span class="n">it</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="k">while</span> <span class="n">it</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="ow">and</span> <span class="n">pre</span><span class="p">[</span><span class="n">g</span><span class="p">[</span><span class="n">v</span><span class="p">][</span><span class="n">it</span><span class="p">]]</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">g</span><span class="p">[</span><span class="n">v</span><span class="p">][</span><span class="n">it</span><span class="p">]</span> <span class="o">!=</span> <span class="n">parents</span><span class="p">[</span><span class="n">v</span><span class="p">]:</span>
                <span class="n">high</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">high</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">pre</span><span class="p">[</span><span class="n">g</span><span class="p">[</span><span class="n">v</span><span class="p">][</span><span class="n">it</span><span class="p">]])</span>
            <span class="n">it</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="k">if</span> <span class="n">it</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">v</span><span class="p">]):</span>
            <span class="k">if</span> <span class="n">it</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">g</span><span class="p">[</span><span class="n">v</span><span class="p">]):</span>
                <span class="n">stack</span><span class="p">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">it</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="p">)</span>
            <span class="n">succ</span> <span class="o">=</span> <span class="n">g</span><span class="p">[</span><span class="n">v</span><span class="p">][</span><span class="n">it</span><span class="p">]</span>
            <span class="n">stack</span><span class="p">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="n">succ</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="p">)</span>
            <span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
            <span class="n">pre</span><span class="p">[</span><span class="n">succ</span><span class="p">]</span> <span class="o">=</span> <span class="n">c</span>
            <span class="n">high</span><span class="p">[</span><span class="n">succ</span><span class="p">]</span> <span class="o">=</span> <span class="n">pre</span><span class="p">[</span><span class="n">succ</span><span class="p">]</span>
            <span class="n">parents</span><span class="p">[</span><span class="n">succ</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
            <span class="n">parent_it</span><span class="p">[</span><span class="n">succ</span><span class="p">]</span> <span class="o">=</span> <span class="n">it</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">parents</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">==</span> <span class="n">v</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">root_children</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
                    <span class="n">cuts</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
                <span class="k">return</span> <span class="n">cuts</span>
            <span class="n">stack</span><span class="p">.</span><span class="n">append</span><span class="p">(</span> <span class="p">(</span><span class="n">parents</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">high</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">parent_it</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="p">)</span>
    <span class="k">return</span> <span class="n">cuts</span>
</code></pre></div></div>

<p>Looks a little bit more complex, isn’t it ?</p>

<p>How it works ? In the original version, for each vertex, we have several steps:</p>
<ul>
  <li>we need to iterate on each successor:
    <ul>
      <li>if the successor has not been seen yet, we continue the traversal on it</li>
      <li>when returning from a recursive call, we have some checks to do with the result</li>
      <li>if the the successor is marked (already seen) we have another check</li>
    </ul>
  </li>
  <li>we have a special last step for the root</li>
  <li>we have a result to return</li>
</ul>

<p>So, the idea is to schedule as much context as possible, first vertices are
clearly identified by an id, we can thus store some contextual information in arrays
(<code class="language-plaintext highlighter-rouge">high</code>, <code class="language-plaintext highlighter-rouge">parent_it</code>, <code class="language-plaintext highlighter-rouge">parents</code>), we can then build the information we want to schedule
for the next iteration: the idea is to schedule the <em>parent</em> and the position in of the
target vertex in the its parent successors list, thus <code class="language-plaintext highlighter-rouge">v</code> is the parent and <code class="language-plaintext highlighter-rouge">g[v][it]</code>
represents the current vertex. And last element, since we need to handle the return, we
also had the return value to the context (<code class="language-plaintext highlighter-rouge">ret</code>).</p>

<p>With that in mind, you should be able to reconnect the different steps of the recursive
version. Note that the first vertex (the root) has some special treatement that are more
explicit in the iterative version (which can be misleading). It’s not an easy task if you
don’t understand the original algorithm, so spend some time on it first.</p>

<h2 id="conclusion">Conclusion</h2>

<p>To connect with my introduction, the first thing to remember is, yes, compilers are able
to optimize tail recursive functions, yes it makes some algorithms more tractable (a bit
        faster but mostly it avoids stackoverflows) but, no, it’s not magical, you need to
do the hardest part, make your Function tail recursive in the first place !</p>]]></content><author><name></name></author><summary type="html"><![CDATA[This is a back to basic post motivated by some comments I’ve recently read on-line about recursive functions and the tail recursion optimization. Tail recursion is a special case of recursive functions, for which efficient optimizations exist, but optimizations are no magic and you need to know when a function is tail recursive and how you can write one.]]></summary></entry><entry><title type="html">Pointers</title><link href="https://slashvar.github.io/2018/07/23/pointers.html" rel="alternate" type="text/html" title="Pointers" /><published>2018-07-23T00:00:00+00:00</published><updated>2018-07-23T00:00:00+00:00</updated><id>https://slashvar.github.io/2018/07/23/pointers</id><content type="html" xml:base="https://slashvar.github.io/2018/07/23/pointers.html"><![CDATA[<p>Let’s talk about pointers and memory. it is one of my favorite subjects and in my
opinion one of the most important notions in programming.</p>

<p>Of course, talking about pointers implies talking about C or C++, they are the
two languages where you need them most, and while you can avoid them, pointers are
everywhere in programming, it is just that sometimes they’re hidden by the
language.</p>

<p>This post requires at least some basic knowledge of C, mostly its syntax and the
most obvious part of its semantics. If you’re not a C programmer (but you’re 
familiar with languages that use C syntax like Java) don’t be afraid, you will
probably be able to understand most of the text and, I hope, you will learn something
useful.</p>

<h2 id="a-bit-of-theory">A bit of theory</h2>

<p>For the sake of clarity, the rest of the text will assume a simple memory model
which more or less maps to what you could find on modern PCs running Linux. That
is, a model where memory addresses are just unsigned integers indexing bytes.</p>

<p>The semantics of the C programming language, in order to support (almost) any
kind of architecture, is more complex. This model explains some particular
undefined behaviors.</p>

<p>In short, what is defined is that you got addresses and you don’t know their
nature. The language only guarantees the expected behavior of arrays and of
pointers used as arrays. The whole definition of pointers is a bit obscure and it
defines mostly when pointers are supposed to be equivalent to one another and/or 
defined.</p>

<p>That is to say, you can live with it as long as you don’t try to rely too much on
the numerical nature of pointers outside of arrays. But keep in mind that
anything that is not explicitly defined (or defined as implementation
dependent) may be compiled differently than what you expect.</p>

<p>So far for the theory.</p>

<h2 id="there-is-no-arrow">there is no arrow</h2>

<p>The most common illustration of pointers involves boxes and arrows. After
several years of teaching C, it appears to me that this is the worst way of
presenting pointers.</p>

<p>A pointer is a value (often numerical) like any other. In order to manipulate
it, you need to store it (in a variable, a field of a structure, an array 
cell…) and you can copy it to another storage. It can be valid or
uninitialized, it can become invalid…</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>	<span class="c1">// we need an address to init our pointer</span>
<span class="kt">int</span> <span class="o">*</span><span class="n">p</span><span class="p">;</span>		<span class="c1">// p is a variable that can contain a pointer to an int</span>
<span class="n">p</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>	<span class="c1">// p contains the null address, an existing but unusable pointer</span>
<span class="n">p</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">x</span><span class="p">;</span>		<span class="c1">// p now contains the address of x</span>
<span class="kt">int</span> <span class="o">*</span><span class="n">q</span> <span class="o">=</span> <span class="n">p</span><span class="p">;</span>	<span class="c1">// q is a variable containing the same address as p</span>
<span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>	<span class="c1">// another variable in order to have an address</span>
<span class="n">p</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">y</span><span class="p">;</span>		<span class="c1">// p contains the address of y, q still contains the one of x</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"%d %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="o">*</span><span class="n">p</span><span class="p">,</span> <span class="o">*</span><span class="n">q</span><span class="p">);</span>
</code></pre></div></div>

<p>When declaring a pointer as in <code class="language-plaintext highlighter-rouge">int *p</code>, you define a storage (a variable) where
you can put an address ; but until you initialize it with a proper address, it is
unusable, just like any other variable.</p>

<p>Just like an address in real life, if you write it in your contact book, it
doesn’t mean that it will be updated when the people living here move or if the
house is destroyed. And if you have a line for the address of a contact but don’t
put anything inside (or put something that is not an address) you won’t be able to
send any letter to that address as it is not valid !</p>

<p>Once you have this in mind, you will be able to understand most errors related to
pointers. It doesn’t mean that you won’t make errors, or that you will find them
easily, but at least you know what you’re playing with.</p>

<p>Let’s now move to the basics.</p>

<h2 id="basic-usage-of-pointers">Basic usage of pointers</h2>

<p>The following piece of code illustrates classical usage of pointers. Read it and
read the comments !</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span>
<span class="cm">/*
 * reset(a) puts 0 at the address a
 */</span>
<span class="kt">void</span> <span class="nf">reset</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">a</span><span class="p">)</span>
<span class="p">{</span>
  <span class="o">*</span><span class="n">a</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="cm">/*
 * swap(a, b) swaps the integers stored at address a and b
 */</span>
<span class="kt">void</span> <span class="nf">swap</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">b</span><span class="p">)</span>
<span class="p">{</span>
  <span class="kt">int</span> <span class="n">c</span> <span class="o">=</span> <span class="o">*</span><span class="n">a</span><span class="p">;</span> <span class="c1">// copy in C the value stored at address a</span>
  <span class="o">*</span><span class="n">a</span> <span class="o">=</span> <span class="o">*</span><span class="n">b</span><span class="p">;</span>    <span class="c1">// copy at the address in a the value at b</span>
  <span class="o">*</span><span class="n">b</span> <span class="o">=</span> <span class="n">c</span><span class="p">;</span>     <span class="c1">// copy the value from c at the address in b</span>
<span class="p">}</span>

<span class="cm">/*
 * divide(a, b, m) returns a/b (as int) an stores at m the rest
 * if b is null, returns 0 and don't touch what m points to
 */</span>
<span class="kt">int</span> <span class="nf">divide</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">m</span><span class="p">)</span>
<span class="p">{</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">b</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="o">*</span><span class="n">m</span> <span class="o">=</span> <span class="n">a</span> <span class="o">%</span> <span class="n">b</span><span class="p">;</span>
  <span class="k">return</span> <span class="n">a</span> <span class="o">/</span> <span class="n">b</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
  <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">27</span><span class="p">;</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"x = %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
  <span class="n">reset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">x</span><span class="p">);</span> <span class="c1">// send to reset the address of x</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"x = %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>

  <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"a = %d</span><span class="se">\n</span><span class="s">b = %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
  <span class="n">swap</span><span class="p">(</span><span class="o">&amp;</span><span class="n">a</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">b</span><span class="p">);</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"a = %d</span><span class="se">\n</span><span class="s">b = %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>

  <span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"a/b = %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">divide</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">m</span><span class="p">));</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"m = %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">m</span><span class="p">);</span>

  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>You can compile that code and run it:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt; make basic
cc basic -o basic.c
&gt; ./basic
x = 27
x = 0
a = 2
b = 42
a = 42
b = 2
a/b = 21
m = 0
</code></pre></div></div>

<p>Just to resume what we have seen: <code class="language-plaintext highlighter-rouge">reset(a)</code> is a function that uses a pointer to
store a value outside of its scope; <code class="language-plaintext highlighter-rouge">swap(a, b)</code> exchanges the content of 2
addresses and <code class="language-plaintext highlighter-rouge">divide(a, b, m)</code> computes integer division and stores the rest at
an address provided. These three functions illustrate a common (basic) use case of
pointers: being able to modify variables (or any storage) outside of the current
function.</p>

<p>Even if it is not the official vocabulary, you can see this as a reference call
semantics, you pass a reference to a local variable in order to modify it.</p>

<p>The traditional call semantics of almost every language is a call by value:
a function’s parameters’ values are copied into the parameter storage. If you want
to modify variables local to the caller, you must pass the address of those
variables. The callee always assumes that you pass valid addresses (it can’t
verify them anyway…).</p>

<p><strong>Note:</strong> in many higher level programming languages (dynamic or not like Python,
Java, OCaml…), complex values are always manipulated through pointers
This means that when you pass them to a function, you pass them by reference.
This is often called <em>pass by object reference</em>. In my experience for beginners never
exposed to pointers before, the induced behavior is often disturbing: you are
able to do some operations that modify the parameters in the caller scope, but
some modifications are still local. Explained through pointers, this is far more
simple: you have this address on an object, you can modify what the address
point at but any operations modifying the address itself acts only at the local
scope.</p>

<p>To illustrate this last point (still in C), let’s write a function that swaps two
pointers. Not the content pointed to but really the addresses:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">swap_pointer</span><span class="p">(</span><span class="kt">int</span> <span class="o">**</span><span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="o">**</span><span class="n">b</span><span class="p">)</span>
<span class="p">{</span>
  <span class="kt">int</span> <span class="o">*</span><span class="n">c</span> <span class="o">=</span> <span class="o">*</span><span class="n">a</span><span class="p">;</span>
  <span class="o">*</span><span class="n">a</span> <span class="o">=</span> <span class="o">*</span><span class="n">b</span><span class="p">;</span>
  <span class="o">*</span><span class="n">b</span> <span class="o">=</span> <span class="n">c</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>We just add a level of stars, this way we can change the address since we have a
pointer to a location containing an address. The only differences are on type,
	the rest of the swap is similar.</p>

<h2 id="common-mistakes">Common mistakes</h2>

<p>there is an infinte number of ways to misuse pointers. Let’s see some classical
errors.</p>

<h3 id="returning-pointers">Returning pointers</h3>

<p>A pointer is a value and like any other value. You can return a pointer in a
function.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Global variable for the sake of the example</span>
<span class="kt">int</span> <span class="n">my_global</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>


<span class="cm">/*
 * a useless function
 */</span>
<span class="kt">int</span><span class="o">*</span> <span class="nf">address_of_my_global</span><span class="p">()</span>
<span class="p">{</span>
  <span class="k">return</span> <span class="o">&amp;</span><span class="n">my_global</span><span class="p">;</span>
<span class="p">}</span>

</code></pre></div></div>

<p>when an address is returned by a function, you can expect that callers of this
function will use it. This means that: it must be valid (eventually <code class="language-plaintext highlighter-rouge">NULL</code>). To
be valid and dereferencable, it must point to a storage that has a sufficiently
long life time, like the example above (<code class="language-plaintext highlighter-rouge">my_global</code> will stay as long as the 
program runs). 
Returning the address of a local variable (or of a parameter)
will inevitably leads to bugs, in fact this an obvious case of <strong>undefined
behavior</strong>. As usual in C, it will seem to work in certain cases: local
variables are stored on the stack which is a kind of draft for functions, right
after the call, the content of the local variable may probably still be
available, but as soon as another part of the program uses the stack it will be
overriden.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/*
 * writing this code in real programs deserves being ashamed for life
 */</span>
<span class="kt">int</span><span class="o">*</span> <span class="nf">dont_do_that</span><span class="p">()</span>
<span class="p">{</span>
  <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
  <span class="k">return</span> <span class="o">&amp;</span><span class="n">x</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>In obvious cases like this one, the compiler will be able to warn you:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>shell&gt; cc -Wall -Wextra -std=c11 -c dont_do_that.c
dont_do_that.c: In function ‘dont_do_that’:
dont_do_that.c:7:10: warning: function returns address of local variable [-Wreturn-local-addr]
   return &amp;x;
          ^~
</code></pre></div></div>

<p><strong>Note:</strong> I have used the the flags <code class="language-plaintext highlighter-rouge">-Wall -Wextra</code>. They activate the <em>standard</em>
warnings (depending on your compiler, you can activate more warnings, <code class="language-plaintext highlighter-rouge">clang</code> for 
example provides a flag <code class="language-plaintext highlighter-rouge">-Weverything</code> that activates all possible warnings).
You should always do that. Warnings are <em>always</em> the sign of something wrong. 
Sometimes you have a good reason, but it is more likely that the code will
break at a later time.</p>

<h3 id="invalid-and-null-pointers">Invalid and null pointers</h3>

<p>Pointers (strictly speaking, variables of type pointer) can be in three states:</p>

<ul>
  <li><em>initialized and valid</em>: the address stored in the variable points to a living
object in memory</li>
  <li><em>null</em>: the pointer contained the so called null pointer, usually the address
<code class="language-plaintext highlighter-rouge">0</code>, represented by the macro <code class="language-plaintext highlighter-rouge">NULL</code>, in this case the pointer is valid but
you can’t dereference it (access the value it is pointing to).</li>
  <li><em>invalid</em>: the pointer has not been initialized, it contains garbage or the
object at the referenced address no longer exits.</li>
</ul>

<p>Dereferencing an invalid or null pointer is a case of undefined behavior and may
lead to an error at execution (always for the null pointer, but for an invalid 
address you may have accidentaly gotten the address of another existing object).</p>

<p>Using an invalid pointer in an other kind of operation (like pointer arithmetic 
or even passing it to a function) is a case of undefined behavior. Note that
you can use a null pointer in any operation not involving dereferencing. In the
same vein, the address right after the one of an object (or the last object of an 
array) can be used in non-dereferencing operations.</p>

<p>This is the perfect time to talk about arrays and pointers arithmetic.</p>

<h2 id="arrays-and-pointers-arithmetic">Arrays and pointers arithmetic</h2>

<p>In most programming languages, an array is a contiguous area containing a
collection of objects of the same type. They are of a fixed size (at some point 
at least, but you may be able to update their size).</p>

<p>In C, the implementation of arrays is related to pointers, but to the contrary
of what a lot of people think, arrays and pointers are not exactly the same. But
I will show you that later.</p>

<p>If my addresses are numerical, accessing an element of an array is as simple as
taking the address of the first element and adding the amount of bytes corresponding to
the number of elements to skip. For example, if I have 4 bytes integers and I
want to access the third element, I will shift the address of the first by 4*2=8 bytes 
to skip the first two). Knowing the size of the elements is annoying, the compiler
knows their type and thus their size. This is where pointer arithmetic shows up !</p>

<p>Adding an integer <code class="language-plaintext highlighter-rouge">n</code> to a pointer moves the address by <code class="language-plaintext highlighter-rouge">n</code> objects, provided
that this pointer points to an array of at least <code class="language-plaintext highlighter-rouge">n</code> objects (the language 
guarantees the existence of the address of the last object plus one). So,
you can navigate in arrays using additions!</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/*
 * sums up the content of an array using the classical [] notation
 */</span>
<span class="kt">int</span> <span class="nf">index_sum</span><span class="p">(</span><span class="kt">int</span> <span class="n">array</span><span class="p">[],</span> <span class="kt">unsigned</span> <span class="n">size</span><span class="p">)</span>
<span class="p">{</span>
  <span class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">res</span> <span class="o">+=</span> <span class="n">array</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
<span class="p">}</span>

<span class="cm">/*
 * sums up the content using only pointers
 */</span>
<span class="kt">int</span> <span class="nf">pointer_sum</span><span class="p">(</span><span class="kt">int</span> <span class="n">array</span><span class="p">[],</span> <span class="kt">unsigned</span> <span class="n">size</span><span class="p">)</span>
<span class="p">{</span>
  <span class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">it</span> <span class="o">=</span> <span class="n">array</span><span class="p">;</span> <span class="n">it</span> <span class="o">!=</span> <span class="n">array</span> <span class="o">+</span> <span class="n">size</span><span class="p">;</span> <span class="o">++</span><span class="n">it</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">res</span> <span class="o">+=</span> <span class="o">*</span><span class="n">it</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>These two functions are completely equivalent, and your compiler will probably
generate a similar machine code for both.</p>

<p>In fact, the expression <code class="language-plaintext highlighter-rouge">array[i]</code> is completely equivalent to <code class="language-plaintext highlighter-rouge">*(array + i)</code> or, 
for pedantic C programmers, <code class="language-plaintext highlighter-rouge">*(&amp;array[0] + i)</code>.</p>

<p><strong>Fun fact:</strong> we all know that addition is commutative, that is <code class="language-plaintext highlighter-rouge">a + b</code> is
equivalent to <code class="language-plaintext highlighter-rouge">b + a</code>, in most algebra. This is true for pointers as well. It
turns out that <code class="language-plaintext highlighter-rouge">*(array + i)</code> is equivalent to <code class="language-plaintext highlighter-rouge">*(i + array)</code> which means that
you can write (but that’s naughty) <code class="language-plaintext highlighter-rouge">i[array]</code> !</p>

<p>A lot of code is using pointers directly rather than arrays, for a lot of
reasons and this leads also to the concept of iterators in C++. If I rewrote my
sum function this way:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">iterator_sum</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">begin</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">end</span><span class="p">)</span>
<span class="p">{</span>
  <span class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">for</span> <span class="p">(;</span> <span class="n">begin</span> <span class="o">!=</span> <span class="n">end</span><span class="p">;</span> <span class="o">++</span><span class="n">begin</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">res</span> <span class="o">+=</span> <span class="o">*</span><span class="n">begin</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>It may look familliar to C++ programmers !</p>

<p>Using pointers arithmetic is useful in a lot of cases. This is a classical
recursive implementation of a binary search (a lower bound in fact) using only pointers:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/*
 * find(begin, end, x) finds x in the sorted range between begin and end
 * returns the address of the first element not smaller than x if it is not
 * present
 */</span>
<span class="kt">int</span> <span class="o">*</span><span class="nf">find</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">begin</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">end</span><span class="p">,</span> <span class="kt">int</span> <span class="n">x</span><span class="p">)</span>
<span class="p">{</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">begin</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">begin</span><span class="p">;</span>
  <span class="kt">int</span> <span class="o">*</span><span class="n">mid</span> <span class="o">=</span> <span class="n">begin</span> <span class="o">+</span> <span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">begin</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="o">*</span><span class="n">mid</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">mid</span><span class="p">;</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="o">*</span><span class="n">mid</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">find</span><span class="p">(</span><span class="n">begin</span><span class="p">,</span> <span class="n">mid</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
  <span class="k">return</span> <span class="n">find</span><span class="p">(</span><span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
<span class="p">}</span>

<span class="cm">/*
 * iterative version
 */</span>
<span class="kt">int</span> <span class="o">*</span><span class="nf">find_iter</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">begin</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">end</span><span class="p">,</span> <span class="kt">int</span> <span class="n">x</span><span class="p">)</span>
<span class="p">{</span>
  <span class="k">while</span> <span class="p">(</span><span class="n">begin</span> <span class="o">&lt;</span> <span class="n">end</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="o">*</span><span class="n">mid</span> <span class="o">=</span> <span class="n">begin</span> <span class="o">+</span> <span class="p">(</span><span class="n">end</span> <span class="o">-</span> <span class="n">begin</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="o">*</span><span class="n">mid</span><span class="p">)</span>
      <span class="k">return</span> <span class="n">mid</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="o">*</span><span class="n">mid</span><span class="p">)</span>
      <span class="n">end</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
    <span class="k">else</span>
      <span class="n">begin</span> <span class="o">=</span> <span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="n">begin</span><span class="p">;</span>
<span class="p">}</span>

</code></pre></div></div>

<p>In the previous functions, we have seen several interesting constructions:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">end - begin</code>: pointers substraction yields the distance (in number of objects) between them</li>
  <li><code class="language-plaintext highlighter-rouge">find(begin, mid, x)</code>: a way to call with a smaller array</li>
  <li><code class="language-plaintext highlighter-rouge">find(mid + 1, end, x)</code>: a way to call a function in the middle of an array</li>
  <li><code class="language-plaintext highlighter-rouge">begin + (end - begin) / 2</code>: computes the mid point. Note that we use half of
the distance rather than the classical arithmetic mean (<code class="language-plaintext highlighter-rouge">(begin + end) / 2</code>)
to avoid possible overflows (which, when manipulating pointers, <em>will</em> occur).</li>
</ul>

<p>In all of the previous examples, I have used pointers to designate a range of objects,
using the implicit convention that <code class="language-plaintext highlighter-rouge">begin</code> is the first element and <code class="language-plaintext highlighter-rouge">end</code> the
first element outside of the range (half-open/exclusive range). This is a classical choice
in programming. Not doing things that way, you will have to play a bit more at
the risk of doing out-of-bounds access or forgetting elements.</p>

<p><strong>Always use half-open ranges, with left bound included and right bound excluded.</strong></p>

<h3 id="whats-the-difference-between-arrays-and-pointers-">What’s the difference between arrays and pointers ?</h3>

<p>In most cases, there is almost no difference between arrays and
pointers, in the sense that a pointer to a memory area containing several objects
of the same type can be used as an array.</p>

<p>But, arrays (or static arrays) in C have a different nature. If you declare a
variable that way (at local or global scope, it doesn’t matter):</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">array</span><span class="p">[</span><span class="mi">8</span><span class="p">];</span>
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">array</code> is not a pointer, in fact what you have just created is a block of 8
integers. <strong>But</strong> in most cases, if you use the variable <code class="language-plaintext highlighter-rouge">array</code> it will be
replaced by the address of the first element, that is <code class="language-plaintext highlighter-rouge">&amp;array[0]</code>. Thus, you can
pass it to a function expecting a pointer to an int and you can assign a pointer with
it, but, and this is important, it is not a left-value so it can’t be reassigned.</p>

<p>Array variables are not replaced by the address of the first element in cases
where they are used for their types. Like when passing them to the operator
<code class="language-plaintext highlighter-rouge">sizeof</code> (which will then return the size of the array itself in bytes rather
than that of its elements), or when taking
their address. Here are some examples illustrating the difference:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
  <span class="c1">// an int</span>
  <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="c1">// a pointer in order to have an address</span>
  <span class="kt">int</span> <span class="o">*</span><span class="n">p</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">a</span><span class="p">;</span>
  <span class="c1">// a traditional array</span>
  <span class="kt">int</span> <span class="n">array</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">};</span>

  <span class="c1">// Let's print some sizes</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"sizeof (p) = %zu</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">p</span><span class="p">));</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"sizeof (array) = %zu</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span> <span class="p">(</span><span class="n">array</span><span class="p">));</span>

  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Compile and run:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>shell&gt; cc -Wall -Wextra -std=c11 -o array array.c
shell&gt; ./array 
sizeof (p) = 8
sizeof (array) = 16
</code></pre></div></div>

<p>OK, you can see that the size of <code class="language-plaintext highlighter-rouge">array</code> is as expected 16 (4 * 4) and <code class="language-plaintext highlighter-rouge">p</code>
being a pointer it is 8 (when executed on a 64-bit machine).</p>

<p>C99 introduces the notion of VLA (Variable Length Arrays). They are not strictly
speaking dynamic arrays, but arrays whose size will be known at run-time. But
once declared, they behave exactly as other arrays.</p>

<h3 id="dynamic-">Dynamic ?</h3>

<p>Arrays is a good topic to introduce dynamic memory allocation.
Since the beginning, I have only used addresses of variables (or context 
where you didn’t know where the pointer came from). 
We have also seen arrays, but only static ones.</p>

<p>Sometimes, we need entities that have a longer lifespan than that of a function 
scope, a size that is not compatible with the size of the stack (where our local 
variables go) or simply a size that will only be known after some computations. 
For that, we are able to ask for memory using the function <code class="language-plaintext highlighter-rouge">malloc(3)</code> from the 
standard library (the 3 in the parenthesis refers to the section in the Unix man 
pages, not to a parameter. i.e. documentation is available via <code class="language-plaintext highlighter-rouge">man 3 malloc</code>).</p>

<p>This function takes a number of bytes and returns a pointer to an area of this
size that you can use as you want. Where it is exactly depends on your system
and your standard library. We often say that it is on <em>the heap</em> by opposition to
<em>the stack</em> (what is the heap exactly? Where <code class="language-plaintext highlighter-rouge">malloc</code> allocates memory of course…)</p>

<p><code class="language-plaintext highlighter-rouge">malloc(3)</code> doesn’t know what usage you will make of this pointer, which is why it
returns the <em>generic type</em> of pointers, namely <code class="language-plaintext highlighter-rouge">void*</code>. Which can be seen as
pointer to nothing or to anything… You can safely assign a generic pointer to
any pointer variables and you can assign any pointer to a variable of type
<code class="language-plaintext highlighter-rouge">void*</code>. But, you can’t dereference a generic pointer, nor can you do arithmetic
with it.</p>

<p><code class="language-plaintext highlighter-rouge">malloc(3)</code> guarantees that the memory area pointed to by its return value will
be exclusively yours until you free it with <code class="language-plaintext highlighter-rouge">free(3)</code>, you reallocate it with 
<code class="language-plaintext highlighter-rouge">realloc(3)</code> or the end of the program.</p>

<p>The most common usage of dynamically allocated memory is arrays, strings (which 
are in fact arrays of characters) and structures. You can allocate memory for a 
single basic object like an integer, but it is probably a waste of space…</p>

<p>Let’s illustrate it with an example:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">sum</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">begin</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">end</span><span class="p">)</span>
<span class="p">{</span>
  <span class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">for</span> <span class="p">(;</span> <span class="n">begin</span> <span class="o">!=</span> <span class="n">end</span><span class="p">;</span> <span class="o">++</span><span class="n">begin</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">res</span> <span class="o">+=</span> <span class="o">*</span><span class="n">begin</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
  <span class="c1">// a dynamic array of 8 integers</span>
  <span class="kt">int</span> <span class="o">*</span><span class="n">a</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="mi">8</span> <span class="o">*</span> <span class="k">sizeof</span> <span class="p">(</span><span class="kt">int</span><span class="p">));</span>
  <span class="c1">// malloc(3) can fail</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">"malloc(3) has failed !</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="c1">// Fill the array with 1,2,3,4,5,6,7,8</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">8</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="c1">// Compute and print the sum</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"sum of a: %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">sum</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">a</span> <span class="o">+</span> <span class="mi">8</span><span class="p">));</span>
  <span class="c1">// Free your memory !</span>
  <span class="n">free</span><span class="p">(</span><span class="n">a</span><span class="p">);</span>
  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And we get:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>shell&gt; cc -Wall -Wextra -std=c11 -o dyn_arrays dyn_arrays.c 
shell&gt; ./dyn_arrays 
sum of a: 36
</code></pre></div></div>

<p>Note the test on the return value, <code class="language-plaintext highlighter-rouge">malloc(3)</code> can fail, mostly because you
don’t have enough memory (or you hit the limit granted to your program by the OS). 
For various reason, on most modern systems, <code class="language-plaintext highlighter-rouge">malloc(3)</code> succeeds in most cases even
if not enough memory is available, this is because modern system only binds memory 
to your program when you concretly access it. But anyway, <strong>always check the return 
value of <code class="language-plaintext highlighter-rouge">malloc(3)</code></strong>! <em>(at least in real-life programs)</em></p>

<p>Other functions related to <code class="language-plaintext highlighter-rouge">malloc(3)</code> are <code class="language-plaintext highlighter-rouge">calloc(3)</code> and <code class="language-plaintext highlighter-rouge">realloc(3)</code>:</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">calloc(3)</code> is a different interface. It takes a size and a number of objects,
and, the most important thing, it ensures that the memory allocated is filled 
with zeroes beforehand. (it may also check that the product between the size 
and the number of objects doesn’t overflow or isn’t greater than a possible 
upper bound).</li>
  <li><code class="language-plaintext highlighter-rouge">realloc(3)</code> is a little bit interesting, it resizes the memory area allocated. 
In fact, it is not exactly a resize but really is a new allocation. In the general 
case, it searches for an area of at least the new requested size, copie the 
content of the old area into it and frees the old area. In some cases it may be 
able to resize in place. Or fails, like <code class="language-plaintext highlighter-rouge">malloc(3)</code>.</li>
</ul>

<p>Examples are often better than words:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span>
<span class="k">struct</span> <span class="n">vector</span>
<span class="p">{</span>
  <span class="kt">size_t</span> <span class="n">size</span><span class="p">,</span> <span class="n">capacity</span><span class="p">;</span>
  <span class="kt">int</span> <span class="o">*</span><span class="n">data</span><span class="p">;</span>
<span class="p">};</span>

<span class="cm">/*
 * init an already allocated vector
 * with initial size and capacity set to 0
 */</span>
<span class="kt">void</span> <span class="nf">init_vector</span><span class="p">(</span><span class="k">struct</span> <span class="n">vector</span> <span class="o">*</span><span class="n">this</span><span class="p">)</span>
<span class="p">{</span>
  <span class="n">this</span><span class="o">-&gt;</span><span class="n">size</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="n">this</span><span class="o">-&gt;</span><span class="n">capacity</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="c1">// capacity 0, then no array so far</span>
  <span class="n">this</span><span class="o">-&gt;</span><span class="n">data</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
<span class="p">}</span>

<span class="cm">/*
 * adds an element at the end of the vector
 * resizes it if necessary
 * we choose to double the size each time
 * returns false if something wrong happen
 */</span>
<span class="kt">int</span> <span class="nf">vector_push_back</span><span class="p">(</span><span class="k">struct</span> <span class="n">vector</span> <span class="o">*</span><span class="n">this</span><span class="p">,</span> <span class="kt">int</span> <span class="n">x</span><span class="p">)</span>
<span class="p">{</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">this</span><span class="o">-&gt;</span><span class="n">size</span> <span class="o">==</span> <span class="n">this</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="o">*</span><span class="n">newdata</span> <span class="o">=</span> <span class="n">realloc</span><span class="p">(</span><span class="n">this</span><span class="o">-&gt;</span><span class="n">data</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">this</span><span class="o">-&gt;</span><span class="n">capacity</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="k">sizeof</span> <span class="p">(</span><span class="kt">int</span><span class="p">));</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">newdata</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
      <span class="c1">// realloc is fair enough to not invalidate data in that case</span>
      <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">this</span><span class="o">-&gt;</span><span class="n">data</span> <span class="o">=</span> <span class="n">newdata</span><span class="p">;</span>
    <span class="n">this</span><span class="o">-&gt;</span><span class="n">capacity</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">this</span><span class="o">-&gt;</span><span class="n">capacity</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="n">this</span><span class="o">-&gt;</span><span class="n">data</span><span class="p">[</span><span class="n">this</span><span class="o">-&gt;</span><span class="n">size</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="p">;</span>
  <span class="n">this</span><span class="o">-&gt;</span><span class="n">size</span> <span class="o">+=</span> <span class="mi">1</span><span class="p">;</span>
  <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>

<span class="cm">/*
 * resets the vector
 * size and capacity go back to 0
 * data is free, thus the vector can be destroyed transparently
 * ... or reuse ...
 */</span>
<span class="kt">void</span> <span class="nf">vector_reset</span><span class="p">(</span><span class="k">struct</span> <span class="n">vector</span> <span class="o">*</span><span class="n">this</span><span class="p">)</span>
<span class="p">{</span>
  <span class="n">free</span><span class="p">(</span><span class="n">this</span><span class="o">-&gt;</span><span class="n">data</span><span class="p">);</span>
  <span class="c1">// Important: otherwise we may try to reuse the invalid address</span>
  <span class="n">this</span><span class="o">-&gt;</span><span class="n">data</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
  <span class="n">this</span><span class="o">-&gt;</span><span class="n">capacity</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="n">this</span><span class="o">-&gt;</span><span class="n">size</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// Demo</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
  <span class="c1">// no need to allocate dynamic memory for the struct, we use it in place</span>
  <span class="k">struct</span> <span class="n">vector</span> <span class="n">vec</span><span class="p">;</span>
  <span class="n">init_vector</span><span class="p">(</span><span class="o">&amp;</span><span class="n">vec</span><span class="p">);</span> <span class="c1">// now we can use it</span>
  <span class="c1">// Add some element</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">10</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">vector_push_back</span><span class="p">(</span><span class="o">&amp;</span><span class="n">vec</span><span class="p">,</span> <span class="n">i</span><span class="p">))</span> <span class="p">{</span>
      <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">"something goes wrond !</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
      <span class="n">vector_reset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">vec</span><span class="p">);</span> <span class="c1">// free the memory for us</span>
      <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="c1">// Print the content</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">vec</span><span class="p">.</span><span class="n">size</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"%d "</span><span class="p">,</span> <span class="n">vec</span><span class="p">.</span><span class="n">data</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
  <span class="p">}</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
  <span class="n">vector_reset</span><span class="p">(</span><span class="o">&amp;</span><span class="n">vec</span><span class="p">);</span>
  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>I let you read, understand and run the code, but here are some important details:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">struct</code>s in C are basiccally heterogenous <em>box</em>es, it is just a way to pack together
some values ;</li>
  <li><code class="language-plaintext highlighter-rouge">realloc(3)</code> and <code class="language-plaintext highlighter-rouge">free(3)</code> accept null pointers;</li>
  <li><code class="language-plaintext highlighter-rouge">realloc(3)</code> when it fails returns <code class="language-plaintext highlighter-rouge">NULL</code> like <code class="language-plaintext highlighter-rouge">malloc(3)</code>. You need to catch
the result before replacing your pointer, otherwise you will loose it.</li>
</ul>

<p>I opted for a very C++ style here (I know, C++ comes from C, so this is arguably 
C style too). In particular, the init function doesn’t allocate the structure of 
the vector, only the data (and in fact, not even the data since we chose to start 
with an empty vector). 
This way, we can have a temporary vector on the stack without allocating dynamic 
memory for it. We only have to care about freeing the inner pointer once we’re done.</p>

<h2 id="one-more">One more</h2>

<p>There are so many other topics to explore and this post is becoming lengthy.
I will play with a last example (the choice was hard…) to illustrate pointer
manipulations.</p>

<p>Let’s first start with the notion of linked list. A linked list is a collection
of values, a little bit like an array, but with dynamic behaviors. The idea is 
that rather than storing all the values in a contiguous area, you store them in 
little boxes (that can be non-contiguous), which are connected by pointers from 
one to another. 
This way you can easily add new elements, remove old ones, insert new ones 
anywhere, etc. all without having to move everything like with arrays to preserve
contiguity…</p>

<p>I won’t describe the whole set of list operations, but rather show you a little funny
piece of code.</p>

<p>First the definition of list:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// note: this is not the list, but the cell of the list</span>
<span class="k">struct</span> <span class="n">list</span>
<span class="p">{</span>
  <span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span> <span class="c1">// the next element</span>
  <span class="kt">int</span> <span class="n">value</span><span class="p">;</span>         <span class="c1">// the data</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Let’s add some context for my example: you have a list already built, and the
pointer to one of the cells. Our task is to detach the cell from the list.</p>

<p>The issue is that in order to do that, we need to find the cell that comes before ours,
in order to make its <code class="language-plaintext highlighter-rouge">next</code> value point to the target one’s <code class="language-plaintext highlighter-rouge">next</code>.</p>

<p>Second problem, if the cell is the first one of the list, we need
to update the variable that contains the entry point of the list, otherwise we will
end up in an inconsistent state (and probably loose access to the list).</p>

<p>Here is a first naive version:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">detach</span><span class="p">(</span><span class="k">struct</span> <span class="n">list</span> <span class="o">**</span><span class="n">entry</span><span class="p">,</span> <span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">cell</span><span class="p">)</span>
<span class="p">{</span>
  <span class="c1">// save the previous element</span>
  <span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">prev</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
  <span class="k">for</span> <span class="p">(</span><span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">it</span> <span class="o">=</span> <span class="o">*</span><span class="n">entry</span><span class="p">;</span> <span class="n">it</span> <span class="o">!=</span> <span class="n">cell</span><span class="p">;</span> <span class="n">it</span> <span class="o">=</span> <span class="n">it</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">prev</span> <span class="o">=</span> <span class="n">it</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="c1">// cell is assumed to be in the list</span>
  <span class="c1">// so now, prev should point to the element that is just before cell</span>
  <span class="c1">// or NULL if cell was the first one</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">prev</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
    <span class="o">*</span><span class="n">entry</span> <span class="o">=</span> <span class="n">cell</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
    <span class="n">prev</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">cell</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>OK, even after removing the comments, this function doesn’t look good. Why?
Mostly because there is a <code class="language-plaintext highlighter-rouge">if</code>. And worst, the code in both branches is very
similar. And there is this story of keeping a pointer to the previous element
that is not defined in all cases. Even if it is a rather small function, it
contains some traps.</p>

<p>How can we solve that ? Thinking more with pointers! When looking at the final
<code class="language-plaintext highlighter-rouge">if</code>, we are updating a place containing a pointer, it can be the location
containing the entry point or the <code class="language-plaintext highlighter-rouge">next</code> field of the previous cell. If we have
a pointer to this location, it can contain the address we want ! Here is the
code, I let you read it as exercise:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">detach</span><span class="p">(</span><span class="k">struct</span> <span class="n">list</span> <span class="o">**</span><span class="n">entry</span><span class="p">,</span> <span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">cell</span><span class="p">)</span>
<span class="p">{</span>
  <span class="k">for</span> <span class="p">(;</span> <span class="o">*</span><span class="n">entry</span> <span class="o">!=</span> <span class="n">cell</span><span class="p">;</span> <span class="n">entry</span> <span class="o">=</span> <span class="o">&amp;</span><span class="p">((</span><span class="o">*</span><span class="n">entry</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">))</span>
    <span class="k">continue</span><span class="p">;</span>
  <span class="o">*</span><span class="n">entry</span> <span class="o">=</span> <span class="n">cell</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Just a little hint: <code class="language-plaintext highlighter-rouge">&amp;((*entry)-&gt;next)</code> gives you the address of the field
<code class="language-plaintext highlighter-rouge">next</code> of the list cell pointed to by the address in <code class="language-plaintext highlighter-rouge">entry</code>.</p>

<p>While I really find this version interesting, there is a better trick in some
cases. This is pretty good illustration of the principle that states that it is
always better to have smart data structures and simpler code.</p>

<p>The idea is that we can have a fake element at the begining of our list, we call
that a sentinel. The sentinel never moves, it doesn’t contain a value (or we
don’t care about it). This way the empty list is no longer a null pointer
but a single element. This also means that when we have to detach the head of the
list we always have a previous element! The new code:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">detach</span><span class="p">(</span><span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">sentinel</span><span class="p">,</span> <span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">cell</span><span class="p">)</span>
<span class="p">{</span>
  <span class="k">for</span> <span class="p">(;</span> <span class="n">sentinel</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">!=</span> <span class="n">cell</span><span class="p">;</span> <span class="n">sentinel</span> <span class="o">=</span> <span class="n">sentinel</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
    <span class="k">continue</span><span class="p">;</span>
  <span class="n">sentinel</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">cell</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Elegant, isn’t it ? In fact, the sentinel plays the same role as our double
pointer in the previous version.</p>

<h2 id="goodbye">Goodbye</h2>

<p>There is a lot more to tell, but I think that I have covered the important parts of
the subject, or at least an important part of the foundations of the subject. I could
have spoken about how an allocator works, or how to implement reference counters, or
intrusive data structures (I have already done that in my old blog)…</p>

<p>But now it is up to you to practice.</p>

<p>If you’re not a C programmer but survived until here, I hope that you have learned something 
that could be useful for you and maybe you will try C ?</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Let’s talk about pointers and memory. it is one of my favorite subjects and in my opinion one of the most important notions in programming.]]></summary></entry><entry><title type="html">Reflexions on the Teaching of Programming</title><link href="https://slashvar.github.io/2018/04/07/reflexions-on-teaching-programming.html" rel="alternate" type="text/html" title="Reflexions on the Teaching of Programming" /><published>2018-04-07T00:00:00+00:00</published><updated>2018-04-07T00:00:00+00:00</updated><id>https://slashvar.github.io/2018/04/07/reflexions-on-teaching-programming</id><content type="html" xml:base="https://slashvar.github.io/2018/04/07/reflexions-on-teaching-programming.html"><![CDATA[<p>I’ve been teaching programming and computer science for almost two decades now.
But it’s about to change and before starting a new life, I want to lay down some
reflexions on this topic. This post has been written completely out-of-order,
thus you may find it a little incoherent, but I wanted to put down ideas before
I forget them.</p>

<h2 id="where-are-we-going-">Where are we going ?</h2>

<p>The first question you must consider when building a programming lecture is
about your target audience: what do they know, why do they want to learn
programming ? I will focus on the classical beginner CS students where a
programming lecture will form the fundation of futur software engineers.</p>

<p>At that point, comes the usual discussion about abstraction. Do you need
abstraction, do you hide the dirty reality behind high level programming
tools ?</p>

<p>That’s not an easy question. More abstraction and higher level tools usualy
provide quicker results: your students are able to write code that do
<em>interesting things</em> more easily, they may even get shiny little programs they
can be proud of. While quick result is often a good source of motivation for
students, the easy path is not always the best one.</p>

<p>On the other hand, ‘‘the hard way’’ can be frustrating, most students are not
excited by writing programs that print boring numbers on a black and white
terminal. But, on the long run, it simplifies the introduction of complex
concepts.</p>

<p>But, let’s start now !</p>

<h2 id="the-beginning">The beginning</h2>

<p>One of the most difficult task for me, as a teacher, has always be to teach true
beginners. It’s very frustrating for a teacher, we always expect that simple
concept be simple to teach, but in my own experience, teaching the basis of
programming is the most difficult task I’ve ever have.</p>

<p>One of the thing is that programming is not natural for most human, at least,
there’s a state of mind that our standard education process does not provide. I
have observed on students, that there’s a point where you start looking at the
problem in a completely different way and after that point most of the
difficulties you had before simply disappear.</p>

<p>The problem for a teacher is that it’s difficult to project yourself on the
other side of that point, you’ve cross it a long time ago and now, you can’t
imagine that people don’t think in the same way. That’s not specific to
programming, we face that kind of issue everyday.</p>

<p>When teaching to beginners, the most important point is push your students as
fast as possible on the other side. They’ll only start to learn something once
they cross that point.</p>

<h2 id="false-simplicity-hidding-memory">False simplicity: hidding memory</h2>

<p>Functions are one of the most fundamental concepts in programming, the concept
is pretty easy to begin with but some complexity can arise as long as you leave
the comfortable world of pure functions.</p>

<p>One of the usual issues of students is related to arguments passsing. Let’s
illustrate that with a tiny example, a function that fill an array, first in C:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">fill</span><span class="p">(</span><span class="kt">int</span> <span class="n">t</span><span class="p">[],</span> <span class="kt">size_t</span> <span class="n">len</span><span class="p">,</span> <span class="kt">int</span> <span class="n">val</span><span class="p">)</span>
<span class="p">{</span>
  <span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">len</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
    <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>We can do the same in python:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">fill</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="nb">len</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">):</span>
                <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
</code></pre></div></div>

<p>Pretty clear, isn’t it. Now, let’s forget C for a while and all you know about
pointers, and look at the python code. It seems that we’re able to modify
arguments, does it work in any case ? We can test it with a tiny script:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
        <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">a</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="n">update</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</code></pre></div></div>

<p>This code will only print 0 (twice), the variable is not modify … OK, it’s
an integer variable, maybe with a list like in the previous example ? The
next example will try to figure it out.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">update2</span><span class="p">(</span><span class="n">l</span><span class="p">):</span>
        <span class="n">l</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
<span class="n">t</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">print</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
<span class="n">update2</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">t</span><span class="p">)</span>
</code></pre></div></div>

<p>Oups, again update2 has no effect … If you’re a C programmer, you’ve probably
already guessed what’s happening here.</p>

<p>In order to explain this concept to people that have never manipulate memory,
pointers or adresses, you’ll need a complex notion of object-reference passing
(or whatever you call it). In my experience, students get lost at that point and
have a lot of difficulties to handle correctly in which cases arguments can be
modified or not.</p>

<p>Now, if your students have been exposed to pointers and memory, you just need to
tell them that composed values are manipulated through a pointer, thus when you
pass a list, and modify its content you use that pointer but if you replace the
list itself, you replace the pointer which is passed by value.</p>

<p>It’s also easier to explain why the following expression doesn’t create the
expected matrix:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">m</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">cols</span><span class="p">]</span> <span class="o">*</span> <span class="n">lines</span>
</code></pre></div></div>

<p>If you don’t know (or don’t see) the problem here: the inner list construction
build a list value (thus a pointer) and then the outer construction repeat this
value. We then just get a list of lines time the exact same list.</p>

<p>This is an example of the false simplicity behind abstraction, the hard way may
seem difficult for the beginner, but it pays more in the long run.</p>

<h2 id="keep-it-simple-stupid-">Keep it simple, stupid !</h2>

<p>Among mistakes I’ve seen during my teaching years, one of the most difficult to
eliminate is what I called ‘‘corner case programming’‘.one of the most difficult
to eliminate is what I called ‘‘corner case programming’’.</p>

<p>In short, corner case programming describes the tendency that some students (and
even programmers) have to add a lot of tests for useless corner cases. Studying
algorithm can help, but it’s an every day fight.</p>

<p>Let’s have a look at some common examples.</p>

<p>Let’s begin with the traditional useless subcases tests. Let’s consider the
classic recursive implementation of factoriel with some useless tests:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">fact</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
                <span class="k">return</span> <span class="mi">1</span>
        <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
                <span class="k">return</span> <span class="mi">1</span>
        <span class="k">return</span> <span class="n">n</span> <span class="o">*</span> <span class="n">fact</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</code></pre></div></div>

<p>This is a pretty stupid version, we can catch both cases with one single test,
but it’s not just about gaining few lines, the correct version does less tests
at each call, can resist to negative numbers …</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">fact</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
                <span class="k">return</span> <span class="mi">1</span>
        <span class="k">return</span> <span class="n">n</span> <span class="o">*</span> <span class="n">fact</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</code></pre></div></div>

<p>Let’s see a similar naive example with an iterative version:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">fact</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
                <span class="k">return</span> <span class="mi">1</span>
        <span class="n">r</span> <span class="o">=</span> <span class="mi">1</span>
        <span class="k">while</span> <span class="n">n</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
                <span class="n">r</span> <span class="o">*=</span> <span class="n">n</span>
                <span class="n">n</span> <span class="o">-=</span> <span class="mi">1</span>
        <span class="k">return</span> <span class="n">r</span>
</code></pre></div></div>

<p>For this version, again, the tests are useless, there’s also a useless loop run
(for n == 1), a better version:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">fact</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
        <span class="n">r</span> <span class="o">=</span> <span class="mi">1</span>
        <span class="k">while</span> <span class="n">n</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
            <span class="n">r</span> <span class="o">*=</span> <span class="n">n</span>
            <span class="n">n</span> <span class="o">-=</span> <span class="mi">1</span>
        <span class="k">return</span> <span class="n">r</span>
</code></pre></div></div>

<p>Of course, these are pretty simple examples, but as I said, we want to eliminate
all bad ideas …</p>

<p>Let’s have a look at a more complex example. We consider a classic B-tree
implementation (in C) a function that just check if the keys are correctly
ordered. For the sake of simplicity, we suppose basic integer keys.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#define RANK ...
</span><span class="k">struct</span> <span class="n">btree</span>
<span class="p">{</span>
  <span class="kt">unsigned</span> <span class="n">nbkeys</span><span class="p">;</span>
  <span class="kt">int</span> <span class="n">keys</span><span class="p">[</span><span class="n">RANK</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">-</span> <span class="mi">1</span><span class="p">];</span>
  <span class="k">struct</span> <span class="n">btree</span> <span class="o">*</span><span class="n">children</span><span class="p">[</span><span class="n">RANK</span> <span class="o">*</span> <span class="mi">2</span><span class="p">];</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">btree_check</span><span class="p">(</span><span class="k">struct</span> <span class="n">btree</span> <span class="o">*</span><span class="n">t</span><span class="p">,</span> <span class="kt">int</span> <span class="n">low</span><span class="p">,</span> <span class="kt">int</span> <span class="n">high</span><span class="p">)</span>
<span class="p">{</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">t</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">nbkeys</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">low</span> <span class="o">&gt;</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">||</span> <span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="nb">NULL</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">btree_check</span><span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">low</span><span class="p">,</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">i</span><span class="p">])))</span>
            <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">continue</span><span class="p">;</span>
      <span class="p">}</span>
      <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">t</span><span class="p">.</span><span class="n">nbkeys</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">||</span> <span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="nb">NULL</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">btree_check</span><span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">i</span><span class="p">])))</span>
          <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">continue</span><span class="p">;</span>
      <span class="p">}</span>
      <span class="k">if</span> <span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">high</span> <span class="o">||</span> <span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">!=</span> <span class="nb">NULL</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">btree_check</span><span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">high</span><span class="p">)))</span>
        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="mi">1</span><span class="p">;</span><span class="c1">// An empty B-tree is well ordered</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This code is inspired from students codes, and in fact, I’ve already simplified
part of it …</p>

<p>What are the issues here ? The most obvious problem is the tests on the index
inside the loop, this is a classic clue that’s something is going wrong. The
second problem is little more subtle: are you shure that code works, does what
we expect ? Even if you know the algorithm, it’s difficult to check. And if go a
little bit deeper, there’s performance issues also …</p>

<p>Here is a better version:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">btree_check</span><span class="p">(</span><span class="k">struct</span> <span class="n">btree</span> <span class="o">*</span><span class="n">t</span><span class="p">,</span> <span class="kt">int</span> <span class="n">low</span><span class="p">,</span> <span class="kt">int</span> <span class="n">high</span><span class="p">)</span>
<span class="p">{</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">t</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">low</span> <span class="o">||</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">nbkeys</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">high</span><span class="p">)</span>
      <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">nbkeys</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">if</span> <span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span>
        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">children</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="p">{</span>
      <span class="k">for</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">nbkeys</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">btree_check</span><span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">children</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">low</span><span class="p">,</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span>
          <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
        <span class="n">low</span> <span class="o">=</span> <span class="n">t</span><span class="o">-&gt;</span><span class="n">keys</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
      <span class="p">}</span>
      <span class="k">return</span> <span class="n">btree_check</span><span class="p">(</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">children</span><span class="p">[</span><span class="n">t</span><span class="o">-&gt;</span><span class="n">nbkeys</span><span class="p">],</span> <span class="n">low</span><span class="p">,</span> <span class="n">high</span><span class="p">);</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>OK, this looks better, we can still improve some details, but this one is far
more acceptable.</p>

<p>What are the important aspect ? We’ve pulled out loop invariants that the
compiler can’t detect (in a B-tree, a node as 0 or exactly <code class="language-plaintext highlighter-rouge">t-&gt;nbkeys+1</code>
    children). We’ve split the loop in two, keys and children don’t need the
same number of iterations, thus it simpler to have them in separate loops. This
is also a performance improvement, since if the keys are not well ordered, we
don’t continue in the rest of the tree. There’s still a lot of “if”, but the
code is more understandable that way.</p>

<p>One last example, let’s have a look at linked lists. I really like that one,
it’s the simplest demonstration that we should prefer smarter data and simpler
code. We begin, with a classic implementation of lists of integers with external
allocation (list cells are not allocated by the list operations) and we provide
two classic operations: a push front and an ordered insert.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="n">list</span>
<span class="p">{</span>
  <span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
  <span class="kt">int</span> <span class="n">data</span><span class="p">;</span>
<span class="p">};</span>

<span class="kt">void</span> <span class="nf">push_front</span><span class="p">(</span><span class="k">struct</span> <span class="n">list</span> <span class="o">**</span><span class="n">list</span><span class="p">,</span> <span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">elm</span><span class="p">)</span>
<span class="p">{</span>
  <span class="n">elm</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="o">*</span><span class="n">list</span><span class="p">;</span>
  <span class="o">*</span><span class="n">list</span> <span class="o">=</span> <span class="n">elm</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">insert</span><span class="p">(</span><span class="k">struct</span> <span class="n">list</span> <span class="o">**</span><span class="n">list</span><span class="p">,</span> <span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">elm</span><span class="p">)</span>
<span class="p">{</span>
  <span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">cur</span> <span class="o">=</span> <span class="o">*</span><span class="n">list</span><span class="p">,</span> <span class="o">*</span><span class="n">prev</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
  <span class="k">for</span> <span class="p">(;</span> <span class="n">cur</span> <span class="o">&amp;&amp;</span> <span class="n">cur</span><span class="o">-&gt;</span><span class="n">data</span> <span class="o">&lt;</span> <span class="n">elm</span><span class="o">-&gt;</span><span class="n">data</span><span class="p">;</span> <span class="n">cur</span> <span class="o">=</span> <span class="n">cur</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
    <span class="n">prev</span> <span class="o">=</span> <span class="n">cur</span><span class="p">;</span>
  <span class="n">elm</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">cur</span><span class="p">;</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">prev</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">prev</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">elm</span><span class="p">;</span>
  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
    <span class="o">*</span><span class="n">list</span> <span class="o">=</span> <span class="n">elm</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now, if we just add a sentinel (you know, that fake cell at the beginning of
the lists), we obtain something a little bit simpler:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">push_front</span><span class="p">(</span><span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">list</span><span class="p">,</span> <span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">elm</span><span class="p">)</span>
<span class="p">{</span>
  <span class="n">elm</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">list</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
  <span class="n">list</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">elm</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">insert</span><span class="p">(</span><span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">list</span><span class="p">,</span> <span class="k">struct</span> <span class="n">list</span> <span class="o">*</span><span class="n">elm</span><span class="p">)</span>
<span class="p">{</span>
  <span class="k">for</span> <span class="p">(;</span> <span class="n">list</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">&amp;&amp;</span> <span class="n">list</span><span class="o">-&gt;</span><span class="n">next</span><span class="o">-&gt;</span><span class="n">data</span> <span class="o">&lt;</span> <span class="n">elm</span><span class="o">-&gt;</span><span class="n">data</span><span class="p">;</span> <span class="n">list</span> <span class="o">=</span> <span class="n">list</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
    <span class="k">continue</span><span class="p">;</span>
  <span class="n">push_front</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="n">elm</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Of course, my first version can be simplified to a similar point (using
    iteration through double pointer).</p>

<p>One of the idea that I’ve tried to pass to my student, is that when you write
some code or design an algorithm, you should always begin with the general
case, and then see if some subcases requires some specific code. This is a
variation of the classical <strong>keep it simple, stupid</strong>.</p>

<p>We have various reasons to follow this strategy:</p>

<ul>
  <li>in most cases, the general case already cover correctly corner cases, adding
extra tests is useless and will probably waste computing time;</li>
  <li>since the general case already covers those subcases, the corresponding code
is redundant;</li>
  <li>tests for corner cases are often more complex than what it looks like at the
beginning, if the corresponding code is specific and works only under the
assumptions of that corner case, these tests can introduce subtle bugs;</li>
  <li>redundant code and useless tests make the maintainance of the code more
difficult;</li>
  <li>and finally, admit it, we’re lazy and prefer shorter code.</li>
</ul>

<p>As a teacher, I must admit that I’ve never found the right way to explain this
concept. I mean, when I try, they seem to get the point, but fail to apply it in
practice. The most effective strategy I found was to show them how their code
can be simplified using some form of code review.</p>

<h2 id="reverse-pedagogy">Reverse pedagogy</h2>

<p>On a less technical side, teachers face another difficulties: students not
seeing the interesting aspect of what you’re talking about. This is frustrating,
you’ve spent a lot of time building a lecture, finding a way to explain complex
notions, and students just don’t care. And worst, later (during project defense
for example), they admit that it could have been useful to pay a little more
attention …</p>

<p>With other fellow teachers, we’ve discusted that issue a lot of time. One of the
idea that finally came out: reverse pedagogy. The idea is to let them try and
probably fail first, and then explain them how they should have done it.</p>

<p>I must admit that I haven’t found a correct process, probably because doing it
correctly requires an important reconfiguration of the cursus. Anyway, there’s
some ideas that can be apply to a programming cursus.</p>

<p>What is also important, is the nature of notions that may benefit from reverse
pedagogy. From my own experience, notions related to code organisation,
modelisation, project management … Those notions are somehow indirect, you can’t
build some simple exercise to demonstrate them.</p>

<h2 id="the-after-life">The after-life</h2>

<p>I wrote most of the previous lines when I was about to leave teaching and now it’s
done. I think it’s interesting to add a new point of view on the subject.</p>

<p>What was missing in my lectures ? Probably a lot.</p>

<p>First of all, I now see why <em>system programming</em> is probably the most important
topic for students. I’ve been teaching it for years, but mostly because I love
that. I liked the complexity of interraction with that complex beast, I liked
the concept, I liked interracting with low level stuff, I liked digging in the
complier behavior …</p>

<p>But what I’ve learnt, with just two months as a real software engineer, is that
all those concepts and problems are the most important part of programming.
Choosing and implementing an algorithm is most of the time easy, finding the
correct datastructure also, but build a complete stuff and make it interracts with
the rest of the world are the real difficulties.</p>

<p>Dealing with existing code base, is also a very important experience. Somehow it
provides the arguments that I was missing when trying to express some ideas to
students. For example, why making code simpler and cleaner is almost as
important as making it works. The project I’m on, evolves quickly in rapid
envirronment and then have been maintained under the pressure of production. The
team I’m working with has a very good software engineering approach based on the
concept of <strong>done is better than perfect</strong>, they push for short term releases
which is probably the best strategy, at least for SaaS. The only issue is that
it’s difficult to come back to early code, unless it’s broken or we need to
modify it in order to include a new feature.</p>

<p>Thus, anything that get release will stay there for a long time, you can’t
expect to have anytime to rewrite it. While refactoring is indeed a need, it has
the least priority.</p>

<p>In fact, it’s easier to re-engineer your project and modify some design choices
than to clean, refactor or rewrite existing code. Which emphasises the
importance of writing simple and clean code from the beginning. It also
invalidate most software design approach, like complex object oriented beast
using inheritance and classes, these designs freeze your code more than anything
else.</p>

<p>On the other hand, if you try to build some piece of code that performs simple
tasks, one by one, it’s easier to replace them, to combine them or to modify
them to meet new goals and provide new features. That’s the essence of the KISS
principle and that should be the essence of programming.</p>

<h2 id="ending-words">Ending words</h2>

<p>I must close this article and publish it, even if I could put a lot more
material in it. But, it’s better done than perfect. I may come back later on
pedgagical subjects, I have a lot more ideas in my mind.</p>

<p>To conclude, spending 15 years teaching programming, algorithms and computer
science stuff have been important for me, it was my job, but more than that,
it makes me a better programmer, and now I see a future where I can transformed
what I’ve learnt into real stuff.</p>

<p><strong>Let’s code !</strong></p>]]></content><author><name></name></author><summary type="html"><![CDATA[I’ve been teaching programming and computer science for almost two decades now. But it’s about to change and before starting a new life, I want to lay down some reflexions on this topic. This post has been written completely out-of-order, thus you may find it a little incoherent, but I wanted to put down ideas before I forget them.]]></summary></entry></feed>