<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Josh Bialkowski (Posts about C++ Discoveries and Notes)</title><link>https://www.joshbialkowski.com/</link><description></description><atom:link href="https://www.joshbialkowski.com/categories/c%2B%2B-discoveries-and-notes.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2018 &lt;a href="mailto:josh.bialkowski@gmail.com"&gt;Josh Bialkowski&lt;/a&gt; 
&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;
&lt;img alt="Creative Commons License" style="border-width:0"
 src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /&gt;
&lt;/a&gt;&lt;br /&gt;
This work is licensed under a
&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;
Creative Commons Attribution-ShareAlike 4.0 International License&lt;/a&gt;.
</copyright><lastBuildDate>Tue, 20 Mar 2018 01:47:57 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>python-like kwargs in C++</title><link>https://www.joshbialkowski.com/posts/2014/python-like-kwargs-in-c.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;When dealing with functions that have lots of optional parameters, or at least
for which resonable defaults are readily available, it's often a bit of a
frustration in C++. Generally defaults are specified during a function
declaration as in:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;double BinarySearch(std::function fn,
                    int max_depth = 16, double epsilon = 1e-9,
                    double lower_bound = 0, double upper_bound = 100);
&lt;/pre&gt;


&lt;p&gt;And then if we call &lt;code&gt;BinarySearch&lt;/code&gt; with only one parameter then the call will
use the default values for the rest. But what if I want to specify custom
bound, and use the defaults for the other parameters? Admittedly, this is a
somewhat contrived example since bounds are less likely to be optional then
the others, and we could reorder them better going from most-likely-to-be-
specified to least, but it's easy to see how something more flexible would be
desirable.&lt;/p&gt;
&lt;p&gt;Consider then the following two code snippets. Which is more readable?&lt;/p&gt;
&lt;p&gt;First snippet:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;double solution = BinarySearch(fn, 0, 100);
&lt;/pre&gt;


&lt;p&gt;Second snippet:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;double solution = BinarySearch(fn, lower_bound = 0, upper_bound = 100);
&lt;/pre&gt;


&lt;p&gt;I really like the way that optional arguments work in python with kwargs. I'd
love to have that same kind of functionality in C++.
&lt;a href="https://github.com/cheshirekow/kwargs/blob/master/include/kwargs.h"&gt;kwargs.h&lt;/a&gt;
implements one mechanism of achieving this.&lt;/p&gt;
&lt;h3&gt;How does it work&lt;/h3&gt;
&lt;p&gt;kwargs takes advantage of &lt;a href="http://en.cppreference.com/w/cpp/language/parameter_pack"&gt;variadic
templates&lt;/a&gt; in C++ to
build up a single data structure which contains all of the optional parameters
(I'll call this a "parameter pack"). Each optional parameter of type &lt;code&gt;T&lt;/code&gt; is
stored in a structure of type &lt;code&gt;Arg&amp;lt;tag,T&amp;gt;&lt;/code&gt; where &lt;code&gt;tag&lt;/code&gt; is a unique numeric
identifier associated with a particular optional argument key.&lt;/p&gt;
&lt;p&gt;The parameter pack data structure derives from &lt;code&gt;Arg&amp;lt;tag,T&amp;gt;&lt;/code&gt; for each &lt;code&gt;(tag,T)&lt;/code&gt;
pair that shows up in the list of optional arguments.&lt;/p&gt;
&lt;p&gt;Overloading of the assignment &lt;code&gt;(=)&lt;/code&gt; operator gives us an opportunity for
building the &lt;code&gt;(tag,T)&lt;/code&gt; pairs within the parameter list of the function call.&lt;/p&gt;
&lt;h3&gt;Get it&lt;/h3&gt;
&lt;p&gt;See the &lt;a href="https://github.com/cheshirekow/kwargs"&gt;source&lt;/a&gt; and
&lt;a href="http://cheshirekow.github.io/kwargs_doxygen/index.html"&gt;doxygen&lt;/a&gt; on github.&lt;/p&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;I'll conclude with an example usage:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; 
&lt;span class="cpf"&gt;#include "kwargs.h"&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;

&lt;span class="c1"&gt;// these are tags which will uniquely identify the arguments in a parameter&lt;/span&gt;
&lt;span class="c1"&gt;// pack&lt;/span&gt;
&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;Keys&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;c_tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;d_tag&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// global symbols used as keys in list of kwargs&lt;/span&gt;
&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;c_key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;d_key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// a function taking kwargs parameter pack&lt;/span&gt;
&lt;span class="n"&gt;template&lt;/span&gt; 
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Args&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// first, we construct the parameter pack from the parameter pack&lt;/span&gt;
  &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ParamPack&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"foo:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--------"&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;a: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;b: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
  &lt;span class="c1"&gt;// We can attempt to retrieve a key while providing a default fallback value.&lt;/span&gt;
  &lt;span class="c1"&gt;// If c_key is in kwargs then this will return the value associated with&lt;/span&gt;
  &lt;span class="c1"&gt;// that key, and will have the correct type. Note that the type of the default&lt;/span&gt;
  &lt;span class="c1"&gt;// parameter in this case is const char*.&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;c: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;c_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"null"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// We can also do stuff conditionally based on whether or not arg exists in&lt;/span&gt;
  &lt;span class="c1"&gt;// the param pack. We still need to provide a default value, since we need to&lt;/span&gt;
  &lt;span class="c1"&gt;// know the return type of the Get function when the key is not in kwargs.&lt;/span&gt;
  &lt;span class="c1"&gt;// In this case, the default value wont ever be used at runtime.&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ContainsTag&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;d: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;d_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><guid>https://www.joshbialkowski.com/posts/2014/python-like-kwargs-in-c.html</guid><pubDate>Mon, 16 Jun 2014 03:18:55 GMT</pubDate></item><item><title>Range Based for-loops in C++11</title><link>https://www.joshbialkowski.com/posts/2013/range-based-for-loops-in-c11.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;One of the new features of C++11 that is a complete win in my opinion is the
support for range-based for-loop syntax. Judicious use allows for
significantly more compact and readable code. However, one thing that is
lacking from this feature is the ability to iterate over a range of integers.
This isn't a problem, however, because it is very easy to implement.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;// This file compiles as a single unit, you can test it by saving it &lt;/span&gt;
&lt;span class="c1"&gt;// as range_for.cpp and compiling with &lt;/span&gt;
&lt;span class="c1"&gt;// g++ -std=c++11 -o range_for range_for.cpp&lt;/span&gt;
&lt;span class="c1"&gt;// Adjust the interface as you see fit&lt;/span&gt;

&lt;span class="c1"&gt;// Implementation (put this in a header)&lt;/span&gt;
&lt;span class="c1"&gt;// --------------------------------------------&lt;/span&gt;


&lt;span class="c1"&gt;/// encapsulates a range of integral numbers for use in a c++11 range-based for &lt;/span&gt;
&lt;span class="c1"&gt;/// loop&lt;/span&gt;
&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Range&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;/// the begin() and end() functions must return an iterator with a specific&lt;/span&gt;
    &lt;span class="c1"&gt;/// interface&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Iterator&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;///&amp;lt; storage for the actual value&lt;/span&gt;

        &lt;span class="c1"&gt;/// implicit construction from the value type&lt;/span&gt;
        &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;){}&lt;/span&gt;

        &lt;span class="c1"&gt;/// the range-based for loops attempt to dereference an iterator using&lt;/span&gt;
        &lt;span class="c1"&gt;/// this operator&lt;/span&gt;
        &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;/// the range-based for loops quit when the comparison of iter != end&lt;/span&gt;
        &lt;span class="c1"&gt;/// returns false&lt;/span&gt;
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;/// iterators in a range-based for loop must have the prefix increment&lt;/span&gt;
        &lt;span class="c1"&gt;/// operator&lt;/span&gt;
        &lt;span class="n"&gt;Iterator&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;/// we likely want to implicitly convert to the value type&lt;/span&gt;
        &lt;span class="k"&gt;operator&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;m_begin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;///&amp;lt; the first integral value&lt;/span&gt;
        &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;m_end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;///&amp;lt; one past the last integral value&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;/// construct a range [begin, end)&lt;/span&gt;
        &lt;span class="n"&gt;Range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;m_begin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;m_end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="c1"&gt;/// interface required by range-based for loop&lt;/span&gt;
        &lt;span class="n"&gt;Iterator&lt;/span&gt; &lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m_begin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;/// interface required by range-based for loop&lt;/span&gt;
        &lt;span class="n"&gt;Iterator&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m_end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;span class="c1"&gt;/// return an object which can be used in a range-based for loop&lt;/span&gt;
&lt;span class="k"&gt;template&lt;/span&gt; 
&lt;span class="n"&gt;Range&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;




&lt;span class="c1"&gt;// Usage &lt;/span&gt;
&lt;span class="c1"&gt;// ---------------------------------------------&lt;/span&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; 

&lt;span class="cpf"&gt;int main(int argc, char** argv)&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Static ranges&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;----------------&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;int:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nl"&gt;i&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"   i: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;unsigned int:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nl"&gt;i&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"   i: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;long:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="nl"&gt;i&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5L&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"   i: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Dynamic range (program args)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;----------------&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nl"&gt;i&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" : "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;The &lt;code&gt;range&amp;lt;T&amp;gt;( T begin, T end )&lt;/code&gt; function template returns a &lt;code&gt;Range&amp;amp;ltT&amp;gt;&lt;/code&gt;
object which supports the required interface for range-based loops. It has a
&lt;code&gt;begin&lt;/code&gt; and &lt;code&gt;end&lt;/code&gt; method, both of which return an iterator. The iterator has
the same storage says as the integral type used to instantiate the templates.
It is implicitly convertable to and from the integral type. Futhermore, it has
the prefix &lt;code&gt;++&lt;/code&gt; operator, and can be "dereferenced" to get the stored integral
value.&lt;/p&gt;
&lt;p&gt;The implementation is likely to yield compiled code equivalent to a normal for
loop.&lt;/p&gt;
&lt;p&gt;The output of the demo program above is:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;josh@Nadie:~/Desktop$ g++ -std=c++11 -o range_for range_for.cpp 
josh@Nadie:~/Desktop$ ./range_for arg1 arg2 arg3 arg4 arg5
Static ranges
-----------

int:
   i: 1
   i: 2
   i: 3
   i: 4

unsigned int:
   i: 1
   i: 2
   i: 3
   i: 4

long:
   i: 1
   i: 2
   i: 3
   i: 4

Dynamic range (program args)
-----------
0 : ./range_for
1 : arg1
2 : arg2
3 : arg3
4 : arg4
5 : arg5
josh@Nadie:~/Desktop$
&lt;/pre&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>Programming</category><guid>https://www.joshbialkowski.com/posts/2013/range-based-for-loops-in-c11.html</guid><pubDate>Fri, 02 Aug 2013 14:07:04 GMT</pubDate></item><item><title>C++ FreeFontStack</title><link>https://www.joshbialkowski.com/posts/2013/c-freefontstack.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;I've been doing a lot of research into free software font technologies and as
a consequence I've been playing around a lot with Freetype2 and Fontconfig
(actually the library interface libfontconfig). These are "straight up"
c-libraries and so I (personally) find the interface a bit "clunky" in C++
code. Don't get me wrong, I wouldn't presume to criticize their design as it
is clear the authors/maintainers are far more knowledgeable about this stuff
than I am… but from a users perspective I desire a bit more.&lt;/p&gt;
&lt;p&gt;So… I've written some C++ wrappers for freetype2 and fontconfig. The main
goals in these projects are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don't change the usage patterns of the library&lt;/li&gt;
&lt;li&gt;Provide a pointer-like type which automatically performs reference counting for reference counted objects&lt;/li&gt;
&lt;li&gt;Provide a pointer-like type which exposes member-functions where relevant&lt;/li&gt;
&lt;li&gt;Provide a pointer-like type which still allows access to the public data members of the underlying structures&lt;/li&gt;
&lt;li&gt;Allow access to the native c-pointer for use in parts of the library that I haven't finished wrapping&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So far… cppfontconfig wraps more or less all the functionality of
libfontconfig. I'd still like to add some interface for assignment by touples
in order to grab error codes when desired without the error being part of the
function signature. Perhaps in the future.&lt;/p&gt;
&lt;p&gt;cppfreetype isn't nearly as complete (freetype2 is a much larger library). I
still haven't decided the appropriate way to deal with structures which are
normally stack allocated. I do however have wrappers for FT_Face,
FT_GlyphSlot, and an iterface for iterating over contours and points in an
FT_Outline.&lt;/p&gt;
&lt;p&gt;These libraries are released as GPLv3. I have public git repositories and
publicly accessible doxygen documentation available in the links below. No bug
tracker though since I'm giving up on redmine.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cheshirekow/cpp-freetype"&gt;cppfreetype&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cheshirekow/cpp-fontconfig"&gt;cppfontconfig&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>openfontstack</category><guid>https://www.joshbialkowski.com/posts/2013/c-freefontstack.html</guid><pubDate>Wed, 06 Feb 2013 21:58:20 GMT</pubDate></item><item><title>cppfontconfig - Simple C++ interface into fontconfig</title><link>https://www.joshbialkowski.com/posts/2012/cppfontconfig-simple-c-interface-into-fontconfig.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;Lately I've been trying to learn how to use (and I mean &lt;em&gt;really&lt;/em&gt; use) &lt;em&gt;the&lt;/em&gt;
open source font stack. Since I tend to greatly prefer c++ over c, as part of
the process of learning these libraries I figured I'd workout API wrappers.
Since the font stack libraries are generally object oriented, I figured a C++
wrapper around these would be easy to accomplish.&lt;/p&gt;
&lt;p&gt;As a start, I wrote cppfontconfig, a C++ wrapper around font config.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/cheshirekow/cpp-fontconfig"&gt;github&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;I'm not sure if the design is good or if it's even useful, I guess we'll see.&lt;/p&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>Projects</category><guid>https://www.joshbialkowski.com/posts/2012/cppfontconfig-simple-c-interface-into-fontconfig.html</guid><pubDate>Sun, 29 Jul 2012 19:43:34 GMT</pubDate></item><item><title>Exception Streams in C++</title><link>https://www.joshbialkowski.com/posts/2012/exception-streams-in-c.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;Here's a short but handy C++ Snippet. I was looking for a way to quickly
generate runtime exceptions with useful information about the current program
state. My process was:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a string stream&lt;/li&gt;
&lt;li&gt;Build the message&lt;/li&gt;
&lt;li&gt;Throw the exception using the string from the stream&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I felt like this was particularly cumbersome and quite annoying, especially
for doing things like string parsing or SQL because there are a lot of places
in the code where error checking is required.&lt;/p&gt;
&lt;p&gt;In any case, I came up with this simple little class tempate which sits in a
single header file and is included in the cpp file where it is to be used.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;#ifndef _UTILITY_EXCEPTIONSTREAM_H_&lt;/span&gt;
&lt;span class="cp"&gt;#define _UTILITY_EXCEPTIONSTREAM_H_&lt;/span&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; 
&lt;span class="cpf"&gt;#include &lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;utility&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="c1"&gt;/// used to simplify the process of generating an exception message&lt;/span&gt;
&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; *  Derives from stringstream so provides an ostream interface, but throws&lt;/span&gt;
&lt;span class="cm"&gt; *  an exception with the contents of the string when the object is destroyed&lt;/span&gt;
&lt;span class="cm"&gt; *&lt;/span&gt;
&lt;span class="cm"&gt; *  \tparam Exception_t must be an exception type which accepts a&lt;/span&gt;
&lt;span class="cm"&gt; *                      const char* in it's constructor&lt;/span&gt;
&lt;span class="cm"&gt; *&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;span class="k"&gt;template&lt;/span&gt; 
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExceptionStream&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;stringstream&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;ExceptionStream&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;Exception_t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ostream&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;()()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


&lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;ExceptionStream&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="cm"&gt;/* namespace utility */&lt;/span&gt;
&lt;span class="cp"&gt;#endif &lt;/span&gt;&lt;span class="cm"&gt;/* EXCEPTIONSTREAM_H_ */&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Usage is like this:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt; &lt;span class="n"&gt;fExp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;fExp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;evalf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;m_expression&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"radius"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;subs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m_x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;iRadius&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;is_a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fExp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ex_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fExp&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;to_double&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;utility&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;()()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"GiNaC failed to parse radius expression: "&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;fExp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Here I'm using GiNaC to parse a string into a mathematical expression. If the
process fails I want to throw a runtime exception (typedef'ed as utility::ex).&lt;/p&gt;
&lt;p&gt;The class derives from string stream so it works just like a string stream…
building a string by catting together the RHS of all the string operators. The
magic is that the destructor for the class throws an exception. The message
for the exception is the string that was built.&lt;/p&gt;
&lt;p&gt;It's a very handy time saver… though I'm not sure if it's actually safe to
use. If the destructor throws an exception, is the object memory still freed?&lt;/p&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>Programming</category><guid>https://www.joshbialkowski.com/posts/2012/exception-streams-in-c.html</guid><pubDate>Sat, 02 Jun 2012 15:37:27 GMT</pubDate></item><item><title>My cmake Bootstrap Process</title><link>https://www.joshbialkowski.com/posts/2011/my-cmake-bootstrap-process.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;I've been using eclipse as an IDE for a long time. For Java, eclipse is
ridiculously beautiful. It almost writes your programs for you. Eclipse CDT is
lacking a some features I would really like to see, and it's impossible to
understand the code base and write plugins (and so… I have not implemented
anything myself) however, as a traditionalist, I like my IDE to work &lt;em&gt;on top&lt;/em&gt;
of the command line tools, not &lt;em&gt;in place&lt;/em&gt; of them. Also, I like that there are
PHP, Javascript, XML, Perl, and Latex plugins… which means that my life is
much easier given that I work on all my projects with the same familiar
interface.&lt;/p&gt;
&lt;p&gt;Lately, I've also started using CMake (instead of my ridiculously complicated
but super-stream-lined personal makefile system). The CMake project generator
for Eclipse is really awesome, and I'm completely sold on using cmake now.
However, creating a new project from within eclipse doesn't work as well as
I'd like. Also, I have a couple of other files that I generally include in
every project, so I've started bootstrapping my projects by using a template
directory, and a pair of scripts.&lt;/p&gt;
&lt;p&gt;Consequently I find myself repeating several tasks every time I start a new
project… just like when I was starting off with programming.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;copy an old project&lt;/li&gt;
&lt;li&gt;rip out all the unnecessary classes&lt;/li&gt;
&lt;li&gt;chop of the CMakeLists.txt files to get it down to a bare bones&lt;/li&gt;
&lt;li&gt;initialize a git repository&lt;/li&gt;
&lt;li&gt;make an initial commit&lt;/li&gt;
&lt;li&gt;create a build directory&lt;/li&gt;
&lt;li&gt;export my development root directory so cmake can find it&lt;/li&gt;
&lt;li&gt;call cmake (which, for eclipse projects, is a chore)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All this gets a little tedious. I'd really like to have an eclipse plugin that
does this… but I'm not that skilled in the advanced features of Eclipse, so I
started automating this with a script. Most of the things that I've been
working on lately have been Gtkmm programs. So I've created a barebones
project directory with stubs for all of the common parts I need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;all the gtkmm cmake find modules&lt;/li&gt;
&lt;li&gt;a stub &lt;code&gt;CMakeFile.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;a stub glade file&lt;/li&gt;
&lt;li&gt;a stub UI xml file&lt;/li&gt;
&lt;li&gt;a simple main.cpp&lt;/li&gt;
&lt;li&gt;one class called &lt;code&gt;Application&lt;/code&gt; to load the glade file and the UI&lt;/li&gt;
&lt;li&gt;some git helper scripts&lt;/li&gt;
&lt;li&gt;a .gitignore file&lt;/li&gt;
&lt;li&gt;a doxyfile&lt;/li&gt;
&lt;li&gt;a doxygen mainpage file&lt;/li&gt;
&lt;li&gt;a bootstrap script&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also wrote a script which does all of the redundant tasks mentioned above.
I'll go through all the files in the template directory and the new project
script describing what they're for. The template files can be downloaded as a
gzipped tarball &lt;a href="http://128.31.5.103/wordpress/wp-%0Acontent/uploads/2011/06/template.tar.gz"&gt;here&lt;/a&gt;. The new project script can be
retrieved &lt;a href="http://128.31.5.103/wordpress/wp-%0Acontent/uploads/2011/06/start_new_project.sh_.gz"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Scripts I Always Use&lt;/h3&gt;
&lt;h4&gt;countlines.pl&lt;/h4&gt;
&lt;p&gt;This is a simple script that I use to count the number of lines of code in a
project. It reports the total number of lines of code as a raw number,
exluding whitespace, and exluding comments.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@extensions&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"cpp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"h"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"hpp"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@directories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@filelist&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="nv"&gt;$directory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;@directories&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"searching $directoryn"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="nv"&gt;$extension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;@extensions&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"   for *.$extensionn"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="n"&gt;INLIST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" find $directory -name '*.$extension' |"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;chomp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nb"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;@filelist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nb"&gt;close&lt;/span&gt; &lt;span class="n"&gt;INLIST&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$totallines&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$written&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$noncomment&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$blockcomment&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$comment&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"parsing filesn"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;@filelist&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"   $filen"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="n"&gt;INFILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"./"&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="s"&gt;"failed to open"&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;chomp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="sr"&gt;s/s//g&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nv"&gt;$totallines&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nv"&gt;$comment&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt; /^(//)/&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$comment&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt; /(/&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$blockcomment&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt; /(*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$blockcomment&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$noncomment&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;   &lt;span class="k"&gt;unless&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$comment&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$blockcomment&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$written&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;      &lt;span class="k"&gt;unless&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nb"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nb"&gt;close&lt;/span&gt; &lt;span class="n"&gt;INFILE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"total:       "&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$totallines&lt;/span&gt;     &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"written:     "&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$written&lt;/span&gt;        &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;"noncomment:  "&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$noncomment&lt;/span&gt;     &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$dummy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;h4&gt;logChanges.sh&lt;/h4&gt;
&lt;p&gt;This is a helper script I use to format my git commits the way I like. I like
to have a list of all the files changed at each commit stored right in the
log. This script strips the comment hashes from the git status report.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Files Changed:"&lt;/span&gt;
git status &lt;span class="p"&gt;|&lt;/span&gt; sed -e &lt;span class="s2"&gt;"s/#t//"&lt;/span&gt; -e &lt;span class="s2"&gt;"/^#/d"&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;h4&gt;commitAll.sh&lt;/h4&gt;
&lt;p&gt;This is a script that I call to commit all changes to the git repository. It
calls logChanges.sh to generate a changelog changes.txt, and then opens nano
to add a nice comment to the log entry.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

git add -A
bash logChanges.sh &amp;gt; changes.txt
nano changes.txt
git commit -F changes.txt
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;h4&gt;bootstrap.sh&lt;/h4&gt;
&lt;p&gt;This is a script that calls cmake from the build directory. It prepends
&lt;code&gt;$HOME/Codes/devroot&lt;/code&gt; to the CMake prefix path so that it can find all of my
develepment libraries. It adds the corresponding &lt;code&gt;lib/pkgconfig&lt;/code&gt; directory to
the &lt;code&gt;PKG_CONFIG_PATH&lt;/code&gt; variable so that pkg-config looks for my development
library versions before checking the system versions. It also sets the prefix-
path directory to be the install prefix. Then it calls cmake to generate
Eclipse CDT4 project files, along with a source project and the option to
build with debug flags.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PREFIX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/Codes/devroot

&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;SCRIPT_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;dirname &lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;CMAKE_PREFIX_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;:CMAKE_PREFIX_PATH
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt;/lib/pkgconfig/:PKG_CONFIG_PATH
cmake -G &lt;span class="s2"&gt;"Eclipse CDT4 - Unix Makefiles"&lt;/span&gt; -DECLIPSE_CDT4_GENERATE_SOURCE_PROJECT&lt;span class="o"&gt;=&lt;/span&gt;TRUE -DCMAKE_BUILD_TYPE&lt;span class="o"&gt;=&lt;/span&gt;Debug -DCMAKE_INSTALL_PREFIX&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PREFIX&lt;/span&gt; &lt;span class="nv"&gt;$SCRIPT_DIR&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;h3&gt;Configuration Files&lt;/h3&gt;
&lt;h4&gt;doxy.config.in&lt;/h4&gt;
&lt;p&gt;Doxygen configuration file. The project, version, paths, and some other things
are set via cmake variables&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;#--------------------------------------------------
# Project related configuration options
#--------------------------------------------------
DOXYFILE_ENCODING      = UTF-8
PROJECT_NAME           = "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;"
PROJECT_NUMBER         = v&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;_VERSION_MAJOR}.&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;_VERSION_MINOR}.&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;_VERSION_BUGFIX}
OUTPUT_DIRECTORY       = ./doc
CREATE_SUBDIRS         = NO
OUTPUT_LANGUAGE        = English
BRIEF_MEMBER_DESC      = YES
REPEAT_BRIEF           = YES
ABBREVIATE_BRIEF       =
ALWAYS_DETAILED_SEC    = YES
INLINE_INHERITED_MEMB  = NO
FULL_PATH_NAMES        = YES
STRIP_FROM_PATH        = &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CURRENT_SOURCE_DIR&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/src
STRIP_FROM_INC_PATH    = {CMAKE_CURRENT_SOURCE_DIR}/src/
SHORT_NAMES            = NO
JAVADOC_AUTOBRIEF      = NO
QT_AUTOBRIEF           = NO
MULTILINE_CPP_IS_BRIEF = YES
INHERIT_DOCS           = YES
SEPARATE_MEMBER_PAGES  = NO
TAB_SIZE               = 4
ALIASES                =
OPTIMIZE_OUTPUT_FOR_C  = NO
OPTIMIZE_OUTPUT_JAVA   = NO
OPTIMIZE_FOR_FORTRAN   = NO
OPTIMIZE_OUTPUT_VHDL   = NO
EXTENSION_MAPPING      =
BUILTIN_STL_SUPPORT    = YES
CPP_CLI_SUPPORT        = NO
SIP_SUPPORT            = NO
IDL_PROPERTY_SUPPORT   = YES
DISTRIBUTE_GROUP_DOC   = NO
SUBGROUPING            = YES
TYPEDEF_HIDES_STRUCT   = NO
SYMBOL_CACHE_SIZE      = 0

#--------------------------------------------------
# Build related configuration options
#--------------------------------------------------
EXTRACT_ALL            = YES
EXTRACT_PRIVATE        = YES
EXTRACT_STATIC         = NO
EXTRACT_LOCAL_CLASSES  = YES
EXTRACT_LOCAL_METHODS  = NO
EXTRACT_ANON_NSPACES   = NO
HIDE_UNDOC_MEMBERS     = NO
HIDE_UNDOC_CLASSES     = NO
HIDE_FRIEND_COMPOUNDS  = NO
HIDE_IN_BODY_DOCS      = NO
INTERNAL_DOCS          = NO
CASE_SENSE_NAMES       = NO
HIDE_SCOPE_NAMES       = NO
SHOW_INCLUDE_FILES     = YES
FORCE_LOCAL_INCLUDES   = NO
INLINE_INFO            = YES
SORT_MEMBER_DOCS       = YES
SORT_BRIEF_DOCS        = YES
SORT_MEMBERS_CTORS_1ST = NO
SORT_GROUP_NAMES       = YES
SORT_BY_SCOPE_NAME     = YES
GENERATE_TODOLIST      = YES
GENERATE_TESTLIST      = YES
GENERATE_BUGLIST       = YES
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS       =
MAX_INITIALIZER_LINES  = 30
SHOW_USED_FILES        = YES
SHOW_DIRECTORIES       = YES
SHOW_FILES             = YES
SHOW_NAMESPACES        = YES
FILE_VERSION_FILTER    =
LAYOUT_FILE            =

#--------------------------------------------------
# configuration options related to warning and progress messages
#--------------------------------------------------
QUIET                  = NO
WARNINGS               = YES
WARN_IF_UNDOCUMENTED   = YES
WARN_IF_DOC_ERROR      = YES
WARN_NO_PARAMDOC       = NO
WARN_FORMAT            = "&lt;span class="nv"&gt;$file&lt;/span&gt;:&lt;span class="nv"&gt;$line&lt;/span&gt;: &lt;span class="nv"&gt;$text&lt;/span&gt;"
WARN_LOGFILE           =

#--------------------------------------------------
# configuration options related to the input files
#--------------------------------------------------
INPUT = &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CURRENT_SOURCE_DIR&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/src
        &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CURRENT_SOURCE_DIR&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/include
        &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CURRENT_SOURCE_DIR&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/docs/pages
        &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CURRENT_BINARY_DIR&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/src
        &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CURRENT_BINARY_DIR&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/include
        &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CURRENT_BINARY_DIR&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/docs/pages

INPUT_ENCODING         = UTF-8
FILE_PATTERNS          = *.cpp
                         *.h
                         *.hpp
RECURSIVE              = YES
EXCLUDE                =
EXCLUDE_SYMLINKS       = NO
EXCLUDE_PATTERNS       =
EXCLUDE_SYMBOLS        =
EXAMPLE_PATH           =
EXAMPLE_PATTERNS       =
EXAMPLE_RECURSIVE      = NO
IMAGE_PATH             =
INPUT_FILTER           =
FILTER_PATTERNS        =
FILTER_SOURCE_FILES    = NO

#--------------------------------------------------
# configuration options related to source browsing
#--------------------------------------------------
SOURCE_BROWSER         = YES
INLINE_SOURCES         = NO
STRIP_CODE_COMMENTS    = YES
REFERENCED_BY_RELATION = NO
REFERENCES_RELATION    = NO
REFERENCES_LINK_SOURCE = YES
USE_HTAGS              = NO
VERBATIM_HEADERS       = YES

#--------------------------------------------------
# configuration options related to the alphabetical class index
#--------------------------------------------------
ALPHABETICAL_INDEX     = NO
COLS_IN_ALPHA_INDEX    = 5
IGNORE_PREFIX          =

#--------------------------------------------------
# configuration options related to the HTML output
#--------------------------------------------------
GENERATE_HTML          = YES
HTML_OUTPUT            = html
HTML_FILE_EXTENSION    = .html
HTML_HEADER            =
HTML_FOOTER            =
HTML_STYLESHEET        =
HTML_TIMESTAMP         = YES
HTML_ALIGN_MEMBERS     = YES
HTML_DYNAMIC_SECTIONS  = NO
GENERATE_DOCSET        = NO
DOCSET_FEEDNAME        = "Doxygen generated docs"
DOCSET_BUNDLE_ID       = org.doxygen.Project
GENERATE_HTMLHELP      = NO
CHM_FILE               =
HHC_LOCATION           =
GENERATE_CHI           = NO
CHM_INDEX_ENCODING     =
BINARY_TOC             = NO
TOC_EXPAND             = NO
GENERATE_QHP           = NO
QCH_FILE               =
QHP_NAMESPACE          =
QHP_VIRTUAL_FOLDER     = doc
QHP_CUST_FILTER_NAME   =
QHP_CUST_FILTER_ATTRS  =
QHP_SECT_FILTER_ATTRS  =
QHG_LOCATION           =
GENERATE_ECLIPSEHELP   = NO
ECLIPSE_DOC_ID         = org.doxygen.Project
DISABLE_INDEX          = NO
ENUM_VALUES_PER_LINE   = 4
GENERATE_TREEVIEW      = YES
USE_INLINE_TREES       = NO
TREEVIEW_WIDTH         = 400
FORMULA_FONTSIZE       = 12
SEARCHENGINE           = NO
SERVER_BASED_SEARCH    = NO

#--------------------------------------------------
# configuration options related to the LaTeX output
#--------------------------------------------------
GENERATE_LATEX         = NO
LATEX_OUTPUT           = latex
LATEX_CMD_NAME         = latex
MAKEINDEX_CMD_NAME     = makeindex
COMPACT_LATEX          = YES
PAPER_TYPE             = letter
EXTRA_PACKAGES         = amsmath
                         amsfonts
                         hyperref
LATEX_HEADER           =
PDF_HYPERLINKS         = YES
USE_PDFLATEX           = YES
LATEX_BATCHMODE        = YES
LATEX_HIDE_INDICES     = NO
LATEX_SOURCE_CODE      = NO

#--------------------------------------------------
# configuration options related to the RTF output
#--------------------------------------------------
GENERATE_RTF           = NO
RTF_OUTPUT             = rtf
COMPACT_RTF            = NO
RTF_HYPERLINKS         = NO
RTF_STYLESHEET_FILE    =
RTF_EXTENSIONS_FILE    =

#--------------------------------------------------
# configuration options related to the man page output
#--------------------------------------------------
GENERATE_MAN           = NO
MAN_OUTPUT             = man
MAN_EXTENSION          = .3
MAN_LINKS              = NO

#--------------------------------------------------
# configuration options related to the XML output
#--------------------------------------------------
GENERATE_XML           = YES
XML_OUTPUT             = xml
XML_SCHEMA             =
XML_DTD                =
XML_PROGRAMLISTING     = NO

#--------------------------------------------------
# configuration options for the AutoGen Definitions output
#--------------------------------------------------
GENERATE_AUTOGEN_DEF   = NO

#--------------------------------------------------
# configuration options related to the Perl module output
#--------------------------------------------------
GENERATE_PERLMOD       = NO
PERLMOD_LATEX          = NO
PERLMOD_PRETTY         = YES
PERLMOD_MAKEVAR_PREFIX =

#--------------------------------------------------
# Configuration options related to the preprocessor
#--------------------------------------------------
ENABLE_PREPROCESSING   = YES
MACRO_EXPANSION        = NO
EXPAND_ONLY_PREDEF     = NO
SEARCH_INCLUDES        = YES
INCLUDE_PATH           =
INCLUDE_FILE_PATTERNS  =
PREDEFINED             =
EXPAND_AS_DEFINED      =
SKIP_FUNCTION_MACROS   = YES

#--------------------------------------------------
# Configuration::additions related to external references
#--------------------------------------------------
TAGFILES               =
GENERATE_TAGFILE       = &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;.tag
ALLEXTERNALS           = NO
EXTERNAL_GROUPS        = YES
PERL_PATH              = /usr/bin/perl

#--------------------------------------------------
# Configuration options related to the dot tool
#--------------------------------------------------
CLASS_DIAGRAMS         = YES
MSCGEN_PATH            = &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_MSCGEN_PATH&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;
HIDE_UNDOC_RELATIONS   = YES
HAVE_DOT               = NO
DOT_FONTNAME           = FreeSans
DOT_FONTSIZE           = 10
DOT_FONTPATH           =
CLASS_GRAPH            = YES
COLLABORATION_GRAPH    = YES
GROUP_GRAPHS           = YES
UML_LOOK               = NO
TEMPLATE_RELATIONS     = NO
INCLUDE_GRAPH          = YES
INCLUDED_BY_GRAPH      = YES
CALL_GRAPH             = NO
CALLER_GRAPH           = NO
GRAPHICAL_HIERARCHY    = YES
DIRECTORY_GRAPH        = YES
DOT_IMAGE_FORMAT       = png
DOT_PATH               = &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_DOT_PATH&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;
DOTFILE_DIRS           =
DOT_GRAPH_MAX_NODES    = 50
MAX_DOT_GRAPH_DEPTH    = 0
DOT_TRANSPARENT        = NO
DOT_MULTI_TARGETS      = NO
GENERATE_LEGEND        = YES
DOT_CLEANUP            = YES
&lt;/pre&gt;


&lt;h4&gt;CMakeLists.txt&lt;/h4&gt;
&lt;p&gt;The root &lt;code&gt;CMakeLists&lt;/code&gt; file. The project name is replaced by the new project
script&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;cmake_minimum_required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;VERSION&lt;/span&gt; &lt;span class="s"&gt;2.8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# defines the project name&lt;/span&gt;
&lt;span class="nb"&gt;project&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;projectName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CMAKE_PROJECT_NAME&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_VERSION_MAJOR&lt;/span&gt; &lt;span class="s"&gt;0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CMAKE_PROJECT_NAME&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_VERSION_MINOR&lt;/span&gt; &lt;span class="s"&gt;1&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="o"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CMAKE_PROJECT_NAME&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="s"&gt;_VERSION_BUGFIX&lt;/span&gt; &lt;span class="s"&gt;0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# adds the project-specific cmake module directory cmake/Modules to the cmake&lt;/span&gt;
&lt;span class="c"&gt;# search path&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;CMAKE_MODULE_PATH&lt;/span&gt; &lt;span class="o"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CMAKE_MODULE_PATH&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="s2"&gt;"${CMAKE_SOURCE_DIR}/cmake/Modules/"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# finds pkg-config&lt;/span&gt;
&lt;span class="nb"&gt;find_package&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;PkgConfig&lt;/span&gt; &lt;span class="s"&gt;REQUIRED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# add the src/ subdirectory to the list of directories cmake processes&lt;/span&gt;
&lt;span class="nb"&gt;add_subdirectory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;src&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;add_subdirectory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;include&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# configure the doxygen configuration&lt;/span&gt;
&lt;span class="nb"&gt;configure_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;"${PROJECT_SOURCE_DIR}/doxy.config.in"&lt;/span&gt;
    &lt;span class="s2"&gt;"${PROJECT_BINARY_DIR}/doxy.config"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# use Jan Woetzel's doxygen doc target&lt;/span&gt;
&lt;span class="nb"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${CMAKE_MODULE_PATH}/TargetDoc.cmake"&lt;/span&gt; &lt;span class="s"&gt;OPTIONAL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;


&lt;h4&gt;src/CMakeLists.txt&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;CMakeLists&lt;/code&gt; for the application.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;find_package(GTKmm REQUIRED)
#find_package(Boost COMPONENTS iostreams REQUIRED)

include_directories(
#   &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;Boost_INCLUDE_DIRS&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;
    &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;GTKmm_INCLUDE_DIRS&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;
    )

set(LIBS &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;LIBS&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;
#   &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;Boost_LIBRARIES&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;
    &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;GTKmm_LIBRARIES&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;
    )

add_executable( &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_PROJECT_NAME&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt; main.cpp Application.cpp)

target_link_libraries( &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_PROJECT_NAME&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt; &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;LIBS&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;)

configure_file(
    &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CURRENT_SOURCE_DIR&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/mainwindow.glade
    &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CURRENT_BINARY_DIR&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/mainwindow.glade COPYONLY )

configure_file(
    &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CURRENT_SOURCE_DIR&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/mainwindow.xml
    &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CMAKE_CURRENT_BINARY_DIR&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/mainwindow.xml COPYONLY )
&lt;/pre&gt;


&lt;h3&gt;New Project Script&lt;/h3&gt;
&lt;h4&gt;start_new_project.sh&lt;/h4&gt;
&lt;p&gt;This is the script I use to start a new project. It copies the template
directory to a new directory in &lt;code&gt;$HOME/Codes/cpp/&lt;/code&gt; named after the new
project. It also replaces the project name in the root &lt;code&gt;CMakeLists&lt;/code&gt; to the
project name. It initializes a git repository in the source and make an
initial commit with all the files. It then creates a build directory in
&lt;code&gt;$HOME/Codes/cpp/builds&lt;/code&gt;. It changes to that directory and then calls the
bootstrap script to generate the project files and makefiles.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nv"&gt;EXPECTED_ARGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$#&lt;/span&gt; -ne &lt;span class="nv"&gt;$EXPECTED_ARGS&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Usage: `basename &lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;` {arg}"&lt;/span&gt;
    &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="nv"&gt;PROJECT_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/Codes/cpp/&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;″&lt;/span&gt;
&lt;span class="s2"&gt;BUILD_DIR="&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/Codes/cpp/builds/&lt;span class="nv"&gt;$1&lt;/span&gt;″
&lt;span class="nv"&gt;TEMPLATE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/Codes/cpp/template"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -d &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/Codes/cpp/&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"The directory '&lt;/span&gt;&lt;span class="nv"&gt;$PROJECT_DIR&lt;/span&gt;&lt;span class="s2"&gt;' already exists"&lt;/span&gt;
    &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Making &lt;/span&gt;&lt;span class="nv"&gt;$PROJECT_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
mkdir &lt;span class="nv"&gt;$PROJECT_DIR&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Copying files from &lt;/span&gt;&lt;span class="nv"&gt;$TEMPLATE_DIR&lt;/span&gt;&lt;span class="s2"&gt; to &lt;/span&gt;&lt;span class="nv"&gt;$PROJECT_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
cp -rv &lt;span class="nv"&gt;$TEMPLATE_DIR&lt;/span&gt;/* &lt;span class="nv"&gt;$PROJECT_DIR&lt;/span&gt;/

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Setting project name in CMakeList.txt"&lt;/span&gt;
sed -i &lt;span class="s2"&gt;"s/projectName/&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt; &lt;span class="nv"&gt;$PROJECT_DIR&lt;/span&gt;/CMakeLists.txt

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Changing to project directory"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$PROJECT_DIR&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"   pwd: `pwd`"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Initializing the git repository"&lt;/span&gt;
git init
git add -A
git commit -m &lt;span class="s2"&gt;"Initial commit, template project"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Changing to the build directory"&lt;/span&gt;
mkdir &lt;span class="nv"&gt;$BUILD_DIR&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$BUILD_DIR&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"   pwd: `pwd`"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Bootstrapping cmake"&lt;/span&gt;
&lt;span class="nv"&gt;$PROJECT_DIR&lt;/span&gt;/bootstrap.sh
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;h3&gt;Program Source Files&lt;/h3&gt;
&lt;h4&gt;src/main.cpp&lt;/h4&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cm"&gt;/*&lt;/span&gt;
&lt;span class="cm"&gt; *  file   main.cpp&lt;/span&gt;
&lt;span class="cm"&gt; *  date   May 31, 2011&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; 
&lt;span class="cpf"&gt;#include "Application.h"&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Gtk&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Main&lt;/span&gt; &lt;span class="n"&gt;kit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Application&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;kit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getWindow&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;h4&gt;src/Application.h&lt;/h4&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cm"&gt;/*&lt;/span&gt;
&lt;span class="cm"&gt; *  file   Application.h&lt;/span&gt;
&lt;span class="cm"&gt; *  date   Mar 19, 2011&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;ifndef&lt;/span&gt; &lt;span class="nx"&gt;APPLICATION_H_&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;define&lt;/span&gt; &lt;span class="nx"&gt;APPLICATION_H_&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;include&lt;/span&gt;

&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Application&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kr"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nx"&gt;Glib&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;RefPtr&lt;/span&gt;      &lt;span class="nx"&gt;m_builder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;Glib&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;RefPtr&lt;/span&gt;    &lt;span class="nx"&gt;m_ui&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;Gtk&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;                    &lt;span class="nx"&gt;m_mainWindow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kr"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nx"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nx"&gt;virtual&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="nx"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="nx"&gt;Gtk&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nx"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;getWindow&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;endif&lt;/span&gt; &lt;span class="cm"&gt;/* Application_H_ */&lt;/span&gt;
&lt;/pre&gt;


&lt;h4&gt;src/Application.cpp&lt;/h4&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cm"&gt;/*&lt;/span&gt;
&lt;span class="cm"&gt; *  file   Application.cpp&lt;/span&gt;
&lt;span class="cm"&gt; *  date   Apr 29, 2011&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"Application.h"&lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;

&lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;m_mainWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;Glib&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;Gtk&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;m_builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;create_from_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mainwindow.glade"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;m_mainWindow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;m_builder&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;get_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"main_window"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;m_mainWindow&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;VBox&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;vbox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;m_builder&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;get_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"main_vbox"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vbox&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;m_ui&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UIManager&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;m_ui&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;add_ui_from_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mainwindow.xml"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Gtk&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;menubar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m_ui&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;get_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/mb_main"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Gtk&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;toolbar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m_ui&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;get_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/tb_main"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;vbox&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pack_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;menubar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kr"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kr"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;vbox&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;pack_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;toolbar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kr"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kr"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;vbox&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;reorder_child&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;menubar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;vbox&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;reorder_child&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;toolbar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;m_mainWindow&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;show_all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="o"&gt;::~&lt;/span&gt;&lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Gtk&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Window&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getWindow&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;m_mainWindow&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;h4&gt;src/mainwindow.glade&lt;/h4&gt;
&lt;p&gt;(failed import from wordpress) &lt;/p&gt;
&lt;h4&gt;src/mainwindow.xml&lt;/h4&gt;
&lt;p&gt;(failed import from wordpress)&lt;/p&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><guid>https://www.joshbialkowski.com/posts/2011/my-cmake-bootstrap-process.html</guid><pubDate>Mon, 06 Jun 2011 19:51:13 GMT</pubDate></item><item><title>Gtkmm 3.0 in Ubuntu 11.04</title><link>https://www.joshbialkowski.com/posts/2011/gtkmm-3-0-in-ubuntu-11-04.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;Lately I've been writing a lot of codes using gtkmm 3.0. The latest stable
branch is 2.4, but this is based on GTK+ 2… and I really want to use GTK+ 3.
Why? Because GTK+ 3 uses cairo for it's native drawing API, and cairo is
sweet. gtkmm uses cairomm, which is even sweeter. So here are my notes on
getting gtkmm-3 built and installed for Ubuntu 11.04. I've written a shell
script to do all the work, but I'll go through it section by section to
explain what's going on.&lt;/p&gt;
&lt;h4&gt;Setup&lt;/h4&gt;
&lt;p&gt;Traditionally &lt;code&gt;/usr/&lt;/code&gt; is used for normal system stuff &lt;code&gt;/usr/local&lt;/code&gt; is for
experimental stuff (it's essentially the same as &lt;code&gt;/usr&lt;/code&gt; but it makes it easy
to find and remove stuff after it breaks your system). However, since I
originally was developing with the unstable Gtkmm branch in Ubuntu 10.04,
which didn't even have a package for GTK+ 3 in the repositories, I started
installing things into my home directory… since it's just for testing anyway.
Therefore, I create a directory &lt;code&gt;$HOME/Codes/devroot&lt;/code&gt; (for development root
filesystem) where I install all the "unstable" packages I'm using, or where I
practice-install the programs/libraries I'm writing.&lt;/p&gt;
&lt;p&gt;I also make a directory &lt;code&gt;$HOME/Codes/cpp/gnome&lt;/code&gt; where I download all the
source tarballs and do the building.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;

&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/Codes/devroot
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;/bin:&lt;span class="nv"&gt;$PATH&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;/lib:&lt;span class="nv"&gt;$LD_LIBRARY_PATH&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PKG_CONFIG_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;/lib/pkgconfig:&lt;span class="nv"&gt;$PKG_CONFIG_PATH&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;XDG_DATA_DIRS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;/share:&lt;span class="nv"&gt;$XDG_DATA_DIRS&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ACLOCAL_FLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-I &lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;/share/aclocal &lt;/span&gt;&lt;span class="nv"&gt;$ACLOCAL_FLAGS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

mkdir -p &lt;span class="nv"&gt;$BASE&lt;/span&gt;
mkdir -p Codes/cpp/gnome
&lt;span class="nb"&gt;cd&lt;/span&gt; Codes/cpp/gnome
&lt;/pre&gt;


&lt;p&gt;Next I export some variables containing the versions of the unstable packages
I'm using. This is so that I can quickly update the script for future
installations and things.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;MM_COMMON_VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.9.5
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;GLIBMM_VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.28.1
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ATKMM_VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.22.5
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PANGOMM_VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.28.2
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;CAIROMM_VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.1.10
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;GTKMM_VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.0.1
&lt;/pre&gt;


&lt;p&gt;Then I download all the source tarballs&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;wget http://ftp.acc.umu.se/pub/GNOME/sources/mm-common/0.9/mm-common-&lt;span class="nv"&gt;$MM_COMMON_VER&lt;/span&gt;.tar.gz
wget http://ftp.acc.umu.se/pub/GNOME/sources/glibmm/2.28/glibmm-&lt;span class="nv"&gt;$GLIBMM_VER&lt;/span&gt;.tar.gz
wget http://ftp.acc.umu.se/pub/GNOME/sources/atkmm/2.22/atkmm-&lt;span class="nv"&gt;$ATKMM_VER&lt;/span&gt;.tar.gz
wget http://ftp.acc.umu.se/pub/GNOME/sources/pangomm/2.28/pangomm-&lt;span class="nv"&gt;$PANGOMM_VER&lt;/span&gt;.tar.gz
wget http://ftp.acc.umu.se/pub/GNOME/sources/gtkmm/3.0/gtkmm-&lt;span class="nv"&gt;$GTKMM_VER&lt;/span&gt;.tar.gz
wget http://cairographics.org/snapshots/cairomm-&lt;span class="nv"&gt;$CAIROMM_VER&lt;/span&gt;.tar.gz
&lt;/pre&gt;


&lt;p&gt;And extract them all into &lt;code&gt;$HOME/Codes/cpp/gnome&lt;/code&gt; (currently &lt;code&gt;PWD&lt;/code&gt;).&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;tar xvzf mm-common-&lt;span class="nv"&gt;$MM_COMMON_VER&lt;/span&gt;.tar.gz
tar xvzf glibmm-&lt;span class="nv"&gt;$GLIBMM_VER&lt;/span&gt;.tar.gz
tar xvzf atkmm-&lt;span class="nv"&gt;$ATKMM_VER&lt;/span&gt;.tar.gz
tar xvzf pangomm-&lt;span class="nv"&gt;$PANGOMM_VER&lt;/span&gt;.tar.gz
tar xvzf gtkmm-&lt;span class="nv"&gt;$GTKMM_VER&lt;/span&gt;.tar.gz
tar xvzf cairomm-&lt;span class="nv"&gt;$CAIROMM_VER&lt;/span&gt;.tar.gz
&lt;/pre&gt;


&lt;p&gt;Then we start installing the packages in the appropriate order. There are a
few ugly things that we have to do in the process though.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; mm-common-&lt;span class="nv"&gt;$MM_COMMON_VER&lt;/span&gt;
./configure -prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;
make -j6
make install
&lt;span class="nb"&gt;cd&lt;/span&gt; ..

&lt;span class="nb"&gt;cd&lt;/span&gt; glibmm-&lt;span class="nv"&gt;$GLIBMM_VER&lt;/span&gt;
./configure -prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;
make -j6
make install
&lt;/pre&gt;


&lt;p&gt;The first ugly thing is that the glibmm package doesn't install the doctool
perl script like it should… so we have to do that manually:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;mkdir -p &lt;span class="nv"&gt;$BASE&lt;/span&gt;/share/glibmm-2.4/doctool/
cp docs/doc-install.pl &lt;span class="nv"&gt;$BASE&lt;/span&gt;/share/glibmm-2.4/doctool/
&lt;/pre&gt;


&lt;p&gt;Then we continue installing the libraries&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..

&lt;span class="nb"&gt;cd&lt;/span&gt; atkmm-&lt;span class="nv"&gt;$ATKMM_VER&lt;/span&gt;
./configure -prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;
make -j6
make install
&lt;span class="nb"&gt;cd&lt;/span&gt; ..

&lt;span class="nb"&gt;cd&lt;/span&gt; pangomm-&lt;span class="nv"&gt;$PANGOMM_VER&lt;/span&gt;
./configure -prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;The second ugly thing we have to do is move &lt;code&gt;libfreetype.la&lt;/code&gt; to where libtool
can find it. I'm not sure why it can't find this specific library but for
whatever reason, even after setting &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; it always looks in
/usr/lib. So I just pretend like no ones watching and create a symlink.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;sudo ln -s /usr/lib/x86_64-linux-gnu/libfreetype.la /usr/lib/
&lt;/pre&gt;


&lt;p&gt;And everything after that goes pretty normally.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;make -j6
make install
&lt;span class="nb"&gt;cd&lt;/span&gt; ..

&lt;span class="nb"&gt;cd&lt;/span&gt; cairomm-&lt;span class="nv"&gt;$CAIROMM_VER&lt;/span&gt;
./configure -prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;
make -j6
make install
&lt;span class="nb"&gt;cd&lt;/span&gt; ..

&lt;span class="nb"&gt;cd&lt;/span&gt; gtkmm-&lt;span class="nv"&gt;$GTKMM_VER&lt;/span&gt;
./configure -prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;
make -j6
make install
&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;/pre&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>ubuntu</category><guid>https://www.joshbialkowski.com/posts/2011/gtkmm-3-0-in-ubuntu-11-04.html</guid><pubDate>Mon, 06 Jun 2011 17:01:29 GMT</pubDate></item><item><title>HTML Documentation with Equation Numbers (Referencing an External PDF Document with Doxygen's HTML Documentation)</title><link>https://www.joshbialkowski.com/posts/2010/html-documentation-with-equation-numbers-referencing-an-external-pdf-document-with-doxygens-html-documentation.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;So, anyone who uses Doxygen to document their code knows that it's pretty much
the most amazing thing ever. Seriously, it's awesome. One cool thing about it
is the ability to reference external documentation. For instance, if you use a
library in your code and you want to include the library's documentation with
your own. However, let's say that (hypothetically of course) you're an
academic… and the code you write implements some theoretical design or model.
In that case, you may actually want your documentation to reference a paper,
or a report that you've written. Perhaps, even many such papers or reports.&lt;/p&gt;
&lt;h4&gt;The Problem&lt;/h4&gt;
&lt;p&gt;In particular, let's say that you're a grad student, in the process of writing
a paper (and of course, you used LaTex… because, well, why wouldn't you?) and
you go and write some code to simulate or demonstrate some elements of that
paper. In that case, some of your functions may implement certain equations.
Some of your classes (if it's object oriented) may implement certain models.
For an example, lets say this is your paper:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://www.joshbialkowski.com/posts/2010/wp-content/manual/01/dummy.png"&gt;&lt;/p&gt;
&lt;p&gt;Let's also assume that you've been good, and have been documenting your code
with Doxygen. Let's say you had some c++ class that implemented your model and
it's definition looks something like this:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; *  file       CTheoreticalModel.h&lt;/span&gt;
&lt;span class="cm"&gt; *  author     Joe Author (jauthor@institute.edu)&lt;/span&gt;
&lt;span class="cm"&gt; *  date       Apr 17, 2010&lt;/span&gt;
&lt;span class="cm"&gt; *  brief      Definition file for CTheoreticalModel class&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;ifndef&lt;/span&gt; &lt;span class="nx"&gt;CTHEORETICALMODEL_H_&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;define&lt;/span&gt; &lt;span class="nx"&gt;CTHEORETICALMODEL_H_&lt;/span&gt;


&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; *  brief  Theoretical Model derived in section 2, on page 1&lt;/span&gt;
&lt;span class="cm"&gt; *&lt;/span&gt;
&lt;span class="cm"&gt; *  This is a detailed description of the model&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;CTheoreticalModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kr"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="kr"&gt;double&lt;/span&gt;    &lt;span class="nx"&gt;m_alpha&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;///&amp;lt; [parameter] defined in equation 2.1&lt;/span&gt;
        &lt;span class="kr"&gt;double&lt;/span&gt;    &lt;span class="nx"&gt;m_beta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;///&amp;lt; [parameter] defined in equation 2.2&lt;/span&gt;

    &lt;span class="kr"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      Construct a new model using the given parameters&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  alpha   [parameter] defined in equation 2.1&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  beta    [parameter] defined in equation 2.2&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="nx"&gt;CTheoreticalModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;beta&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      calculates [some property] by implementing algorithm 2.1&lt;/span&gt;
&lt;span class="cm"&gt;         *              on page 1&lt;/span&gt;
&lt;span class="cm"&gt;         *  return     [some property]&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;algorithmA&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      updates the model by [some parameter] according to the&lt;/span&gt;
&lt;span class="cm"&gt;         *              dynamics of equation 2.4&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  gamma   [parameter] defined in equation 2.3&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nx"&gt;equationB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;gamma&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      tests [some parameter] against the model; implements&lt;/span&gt;
&lt;span class="cm"&gt;         *              equation 2.6&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  theta   [some parameter] defined by equation 2.5&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nx"&gt;testC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;theta&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;endif&lt;/span&gt; &lt;span class="cm"&gt;/* CTHEORETICALMODEL_H_ */&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Then the html documentation that doxygen will generate will look like this:&lt;/p&gt;
&lt;p&gt;Now let's say that you talk to your advisor and he suggests that maybe section
2 should come after section 3. Moreover, you add a bunch of content to section
1 so now all of the code for this model is on page five. So then you end up
with this:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://www.joshbialkowski.com/posts/2010/wp-content/manual/01/dummy2.png"&gt;&lt;/p&gt;
&lt;p&gt;So now you have to go back and change all of the equation numbers and page
references in your code. But wait, when we wrote our document we "&lt;code&gt;label{}&lt;/code&gt;"ed
all of our equations, algorithms, and sections. Wouldn't it be cool if we
could just reference those in the comments? Doxygen exposes latex's math mode
for us to document inline equations. It uses latex to render the equations,
and then uses dvipng to turn those into png images. Moreover, latex has the
&lt;code&gt;xr&lt;/code&gt; package, which allows us to reference labels from other documents.
Lastly, the "&lt;code&gt;ref{}&lt;/code&gt;" command is valid inside math-mode. So we have all the
tools we need, but there is one slight problem. In order to use the &lt;code&gt;xr&lt;/code&gt; latex
package, we need to include the "&lt;code&gt;externaldocument&lt;/code&gt;" command in the header of
the document.&lt;/p&gt;
&lt;h4&gt;The solution&lt;/h4&gt;
&lt;p&gt;Now here's the fun part. When Doxygen renders all of the equations, it does so
by generating a single latex source file called "&lt;code&gt;_formulas.tex&lt;/code&gt;". We don't
have explicit access to modify the preamble of that source file, but we are
allowed to add optional packages to the list of what is included. We do that
by modifying the "&lt;code&gt;EXTRA_PACKAGES&lt;/code&gt;" line of the doxyfile. For instance, if we
edit the doxyfile like this:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;…
# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
# packages that should be included in the LaTeX output.

EXTRA_PACKAGES = amsmath xr amsfonts
…
&lt;/pre&gt;


&lt;p&gt;then when doxygen generates &lt;code&gt;_formulas.tex&lt;/code&gt; it will include in the preamble a
list of includes like this&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    usepackage{amsmath}
    usepackage{xr}
    usepackage{amsfonts}
&lt;/pre&gt;


&lt;p&gt;Note that Doxygen tokenizes the list of packages (parses it) at whitespace,
and then takes each token and wraps it with "usepackage{}", inserting it into
the header. We can hijack this method of input by making &lt;code&gt;EXTRA_PACKAGES&lt;/code&gt;
variable like this&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;…
EXTRA_PACKAGES = amsmath xr}externaldocument[paper-]{dummy}% amsfonts
…
&lt;/pre&gt;


&lt;p&gt;Then the preamble of &lt;code&gt;_formulas.tex&lt;/code&gt; will look like this&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    usepackage{amsmath}
    usepackage{amsfonts}
    usepackage{xr}externaldocument[paper-]{dummy}%}
    usepackage{hyperref}
&lt;/pre&gt;


&lt;p&gt;Note how we use a comment character (percent) to comment out the closing
bracket that doxygen put's around our 'package'. Now we have an extra command
in our preamble. If you haven't looked up the &lt;code&gt;xr&lt;/code&gt; documentation yet, this
command means to look for a file called "&lt;code&gt;dummy.aux&lt;/code&gt;" generated by latex. The
package extracts all the labels from that file and appends "&lt;code&gt;paper-&lt;/code&gt;" to the
front of the label names. Now we can change our code documentation to look
like this:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; *  file       CTheoreticalModel.h&lt;/span&gt;
&lt;span class="cm"&gt; *  author     Joe Author (jauthor@institute.edu)&lt;/span&gt;
&lt;span class="cm"&gt; *  date       Apr 17, 2010&lt;/span&gt;
&lt;span class="cm"&gt; *  brief      Definition file for CTheoreticalModel class&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;ifndef&lt;/span&gt; &lt;span class="nx"&gt;CTHEORETICALMODEL_H_&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;define&lt;/span&gt; &lt;span class="nx"&gt;CTHEORETICALMODEL_H_&lt;/span&gt;


&lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt; *  brief  Theoretical Model derived in section f$ref{paper-sec:Model}f$,&lt;/span&gt;
&lt;span class="cm"&gt; *          page f$pageref{paper-sec:Model}f$&lt;/span&gt;
&lt;span class="cm"&gt; *&lt;/span&gt;
&lt;span class="cm"&gt; *  This is a detailed description of the model&lt;/span&gt;
&lt;span class="cm"&gt; */&lt;/span&gt;
&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;CTheoreticalModel&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kr"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="kr"&gt;double&lt;/span&gt;    &lt;span class="nx"&gt;m_alpha&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;///&amp;lt; [parameter] defined in equation f$ref{paper-eqn:alphaDef}f$&lt;/span&gt;
        &lt;span class="kr"&gt;double&lt;/span&gt;    &lt;span class="nx"&gt;m_beta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;///&amp;lt; [parameter] defined in equation f$ref{paper-eqn:betaDef}f$&lt;/span&gt;

    &lt;span class="kr"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      Construct a new model using the given parameters&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  alpha   [parameter] defined in equation&lt;/span&gt;
&lt;span class="cm"&gt;         *                      f$ref{paper-eqn:alphaDef}f$&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  beta    [parameter] defined in equation&lt;/span&gt;
&lt;span class="cm"&gt;         *                      f$ref{paper-eqn:betaDef}f$&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="nx"&gt;CTheoreticalModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;beta&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      calculates [some property] by implementing algorithm&lt;/span&gt;
&lt;span class="cm"&gt;         *              f$ref{paper-alg:SomeAlgorithm}f$ on page&lt;/span&gt;
&lt;span class="cm"&gt;         *              f$pageref{paper-alg:SomeAlgorithm}f$&lt;/span&gt;
&lt;span class="cm"&gt;         *  return     [some property]&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;algorithmA&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      updates the model by [some parameter] according to the&lt;/span&gt;
&lt;span class="cm"&gt;         *              dynamics of equation f$ref{paper-eqn:SomeEquation}f$&lt;/span&gt;
&lt;span class="cm"&gt;         *              on page f$pageref{paper-eqn:SomeEquation}f$&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  gamma   [parameter] defined in equation&lt;/span&gt;
&lt;span class="cm"&gt;         *                      f$ref{paper-eqn:gammaDef}f$&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nx"&gt;equationB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;gamma&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


        &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;         *  brief      tests [some parameter] against the model; implements&lt;/span&gt;
&lt;span class="cm"&gt;         *              condition f$ref{paper-eqn:SomeCondition}f$&lt;/span&gt;
&lt;span class="cm"&gt;         *  param[in]  theta   [some parameter] defined by equation&lt;/span&gt;
&lt;span class="cm"&gt;         *                      f$ref{paper-eqn:thetaDef}f$&lt;/span&gt;
&lt;span class="cm"&gt;         */&lt;/span&gt;
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nx"&gt;testC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kr"&gt;double&lt;/span&gt; &lt;span class="nx"&gt;theta&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;endif&lt;/span&gt; &lt;span class="cm"&gt;/* CTHEORETICALMODEL_H_ */&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Now all we have to do is dump &lt;code&gt;dummy.aux&lt;/code&gt; (generated when we build the paper
using latex) into the &lt;code&gt;html&lt;/code&gt; directory where doxygen is going to build
&lt;code&gt;_formulas.tex&lt;/code&gt; and then when we make the documentation it looks like this:&lt;/p&gt;
&lt;p&gt;Sure, all the references are images… which isn't particularly great, but it's
a lot better than having to go in and change the labels every time we make a
change to the referenced document. Whenever writing a code and a referenced
document are done in parallel, this could be quite a handy trick. If you want
the html document to look a little more professional, add a package that will
set the font to the same as the font set by your doxygen &lt;code&gt;CSS&lt;/code&gt; stylesheet.&lt;/p&gt;
&lt;p&gt;If you want to play around with the files used in this post, pick them up
here: &lt;a href="https://www.joshbialkowski.com/posts/2010/wp-content/manual/01/dummy.7z"&gt;dummy.7z&lt;/a&gt;. Create the latex document
with the following command.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;latex dummy.tex
&lt;/pre&gt;


&lt;p&gt;Then copy &lt;code&gt;dummy.aux&lt;/code&gt; into the &lt;code&gt;html&lt;/code&gt; directory.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;cp dummy.aux html/
&lt;/pre&gt;


&lt;p&gt;Then run doxygen&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;doxygen doxyfile
&lt;/pre&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>Java Discoveries and Notes</category><category>Programming</category><guid>https://www.joshbialkowski.com/posts/2010/html-documentation-with-equation-numbers-referencing-an-external-pdf-document-with-doxygens-html-documentation.html</guid><pubDate>Sat, 17 Apr 2010 20:17:44 GMT</pubDate></item><item><title>Instanciate Objects of Unknown Type from Their Parent Interface</title><link>https://www.joshbialkowski.com/posts/2009/instanciate-objects-of-unknown-type-from-their-parent-interface.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;This is based on my previous two posts on 
&lt;a href="https://www.joshbialkowski.com/posts/2009/static-interfaces-in-c.html"&gt;Static Interfaces in C++&lt;/a&gt; and 
&lt;a href="https://www.joshbialkowski.com/posts/static-interfaces-in-c.html"&gt;Keep Track of and Enumerate All Sub-classes of a Particular Interface&lt;/a&gt;. 
The idea is that I want my code to be extensible in the feature without requiring
any re-writing of the current code base. The code base operates on generic
objects via their interfaces, so as long as newly-coded classes properly
extend those interfaces, the program should know how to handle them. The
problem is, how can we write the program in such a manner that a user
interface can enumerate available options for implementations of a particular
interface, and how can we instantiate those objects?&lt;/p&gt;
&lt;p&gt;In 
&lt;a href="https://www.joshbialkowski.com/posts/static-interfaces-in-c.html"&gt;Keep Track of and Enumerate All Sub-classes of a Particular Interface&lt;/a&gt; 
I showed how to maintain a
registry of classes deriving from a given interface, which handles the first
problem, but there is a limitation in that all of these classes must provide a
factory method that takes no parameters (void input). I decided that, for my
project, this was not acceptable and I needed a way to define the creation
parameters as part of the factory methods, whereas the creation parameters may
be different for particular interfaces.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://www.joshbialkowski.com/posts/2009/static-interfaces-in-c.html"&gt;Static Interfaces in C++&lt;/a&gt; 
I showed how we can enforce the
requirement of a static method in derived classes with a particular signature
using a template interface.&lt;/p&gt;
&lt;p&gt;In this post I will combine the two so that we can create a registry of
classes that inherit from a particular interface, and provide a static factory
method for creating objects of that interface, using a particular creation
method signature unique to that interface. The registry will pair class names
with function pointers that match the specific signature of the interface the
class is being registered for.&lt;/p&gt;
&lt;p&gt;Disclaimer: I do not claim this is the "best" way to handle this issue. This
is just what I came up with. It happens to be pretty involved and overly
indirect, which means it's probably bad design. It is, however, an extremely
interesting exercise in generic programming.&lt;/p&gt;
&lt;p&gt;Prequil: the code will require these later so there they are:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="cm"&gt;/**&lt;/span&gt;
&lt;span class="cm"&gt;     *  file          RegistryTest.cpp&lt;/span&gt;
&lt;span class="cm"&gt;     *  date:      Aug 14, 2009&lt;/span&gt;
&lt;span class="cm"&gt;     *  brief:&lt;/span&gt;
&lt;span class="cm"&gt;     *&lt;/span&gt;
&lt;span class="cm"&gt;     *  detail:&lt;/span&gt;
&lt;span class="cm"&gt;     */&lt;/span&gt;


    &lt;span class="cp"&gt;#include&lt;/span&gt; 
    &lt;span class="cpf"&gt;#include &lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;
    &lt;span class="cp"&gt;#include&lt;/span&gt; 
    &lt;span class="cpf"&gt;#include &lt;/span&gt;&lt;span class="cp"&gt;&lt;/span&gt;

    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Ok, so lets begin. First let's define a couple of interfaces that we're
interested in.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InterfaceA&lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InterfaceB&lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InterfaceC&lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Now we create a template class whose sole purpose is to create a per-interface
&lt;code&gt;typedef&lt;/code&gt; of the function signature that is necessary for instantiating and
object of that class. Is it really possible that all sub-objects can be
instantiated with the same parameters? If that's the case, shouldn't they all
be combined into a single class that just contains that information as private
members? Probably, but in my case these parameters are more like a "bare
minimum" for instantiation, and then many more parameters are set by the user.
It makes sense to me, I promise. If it doesn't to you, you don't have to use
this.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;InterfaceType&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Factory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;&lt;code&gt;Creator&lt;/code&gt; is now a &lt;code&gt;typedef&lt;/code&gt; that aliases a function pointer that takes no
parameters. Wait, isn't that what we had before? Yes, but now we make a couple
of template specializations to define the different signatures for our
specific interfaces. These specializations would normally be in the file that
contained the interface declaration.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="c1"&gt;/// specializations can define other creators, this one requires an int&lt;/span&gt;
    &lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Factory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;InterfaceB&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;/// specializations can define other creators, this one requires an int, a&lt;/span&gt;
    &lt;span class="c1"&gt;/// bool, and a char&lt;/span&gt;
    &lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Factory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="n"&gt;InterfaceC&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Cool. Now we create a static interface that enforces it's derivative classes
to contain a static method called &lt;code&gt;createNew&lt;/code&gt; which can be used to instantiate
a new object of that interface. We can use the typedef we just created to make
the function signature generic for this template (or specific to individual
instantiations of it).&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;template&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;IStaticFactory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;IStaticFactory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ClassType&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;createNew&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;Still following? Good. Now we define the registry class template, which maps
the class name of a derived class to a function pointer with an interface-
specific signature that serves as a static factory for objects of the derived
class, returning a pointer to that object of the type of the interface. See my
previous post for details on this class.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Registry&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


            &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="p"&gt;(){}&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;

            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


            &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                 &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="n"&gt;creator&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;


            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;  &lt;span class="n"&gt;getClassNames&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


            &lt;span class="k"&gt;typename&lt;/span&gt;
            &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt;
            &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;



    &lt;span class="c1"&gt;// A convient macro to compact the registration of a class&lt;/span&gt;
    &lt;span class="cp"&gt;#define RegisterWithInterface( CLASS, INTERFACE )                   &lt;/span&gt;
    &lt;span class="k"&gt;namespace&lt;/span&gt;                                                           
    &lt;span class="p"&gt;{&lt;/span&gt;                                                                   
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;dummy_&lt;/span&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="n"&gt;CLASS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;                                          
        &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;     
                &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="n"&gt;CLASS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CLASS&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;createNew&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;                               
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Registry&lt;/span&gt;    &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;registerClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                            &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="n"&gt;creator&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;creator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;  &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getClassNames&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;   &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;typename&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterfaceType&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;iterator&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;template&lt;/span&gt; 
    &lt;span class="k"&gt;typename&lt;/span&gt;
    &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt;
    &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m_creatorMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;className&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;The difference between this and the Registry in my previous post, is that this
time the registry uses the generic &lt;code&gt;Factory&amp;lt;InterfaceType&amp;gt;::Creator&lt;/code&gt; typedef
to define the function pointer. This way, that pointer is forced to have the
specific signature. Sweet!&lt;/p&gt;
&lt;p&gt;Now lets write some derived classes of those interfaces.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;class&lt;/span&gt;   &lt;span class="nc"&gt;DerivedA&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;InterfaceA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IStaticFactory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;InterfaceA&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;  &lt;span class="n"&gt;createNew&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;InterfaceA&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;


    &lt;span class="n"&gt;RegisterWithInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DerivedA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterfaceA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;



    &lt;span class="k"&gt;class&lt;/span&gt;   &lt;span class="nc"&gt;DerivedB&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;InterfaceB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IStaticFactory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;InterfaceB&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;  &lt;span class="n"&gt;createNew&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;InterfaceB&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;


    &lt;span class="n"&gt;RegisterWithInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DerivedB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterfaceB&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;



    &lt;span class="k"&gt;class&lt;/span&gt;   &lt;span class="nc"&gt;DerivedC&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;InterfaceC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IStaticFactory&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;InterfaceC&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;  &lt;span class="n"&gt;createNew&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;InterfaceC&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="n"&gt;RegisterWithInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DerivedC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterfaceC&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;These classes are basically dummies, but inheriting from &lt;code&gt;IStaticFactory…&lt;/code&gt; the
compiler will enforce that they contain the static method &lt;code&gt;createNew&lt;/code&gt; with the
proper signature. Notice that &lt;code&gt;InterfaceA&lt;/code&gt; uses the default template so the
static factory in &lt;code&gt;DerivedA&lt;/code&gt; takes no parameters, while &lt;code&gt;InterfaceB&lt;/code&gt; and
&lt;code&gt;InterfaceC&lt;/code&gt; have specializations so the static factories in &lt;code&gt;DerivedB&lt;/code&gt; and
&lt;code&gt;DerivedC&lt;/code&gt; have their respective parameters. Since this is just an example,
the methods don't actually create new objects they just return pointers, but
in reality this is where we would use &lt;code&gt;new DerivedA(…)&lt;/code&gt; and so on.&lt;/p&gt;
&lt;p&gt;Well that's it. Pretty cool huh? The compiler will enforce all this stuff for
us so we can actually say to ourselves when we write new implementations
months from now "If it compiles, it will be compatible."&lt;/p&gt;
&lt;p&gt;Lastly, here's a little test case to run&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;DerivedA&lt;/span&gt;    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;DerivedB&lt;/span&gt;    &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;DerivedC&lt;/span&gt;    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;InterfaceA&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;InterfaceB&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;InterfaceC&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="n"&gt;makesObjectOfA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;getCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DerivedA"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;pA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;makesObjectOfA&lt;/span&gt;&lt;span class="p"&gt;)();&lt;/span&gt;

        &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="n"&gt;makesObjectOfB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;getCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DerivedB"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;pB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;makesObjectOfB&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;Factory&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Creator&lt;/span&gt; &lt;span class="n"&gt;makesObjectOfC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;Registry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;getCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DerivedC"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;pC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;makesObjectOfC&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sc"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"pA: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;pA&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"pB: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;pB&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"pC: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;pC&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;&lt;img alt="Output of the Test Program" src="https://www.joshbialkowski.com/wordpress/wp-content/uploads/2009/08/registry2.jpg"&gt;&lt;/p&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>Programming</category><guid>https://www.joshbialkowski.com/posts/2009/instanciate-objects-of-unknown-type-from-their-parent-interface.html</guid><pubDate>Fri, 14 Aug 2009 19:13:36 GMT</pubDate></item><item><title>Static Interfaces in C++</title><link>https://www.joshbialkowski.com/posts/2009/static-interfaces-in-c.html</link><dc:creator>Josh Bialkowski</dc:creator><description>&lt;div&gt;&lt;p&gt;I remember looking around a few weeks ago for how to make a "static interface"
in c++. Basically, I wanted a way to use the compiler to enforce that a class
had certain static functions. Almost all of the internet resources I found
basically said "Why would you ever want to do that; you don't really want to
do that; you probably have bad design" and so on… continuously begging the
question. Of course, they were right: the design was bad and that wasn't
really what I wanted to do. Well, never the less, I still managed to think of
a way to create a sort of static interface using a template class.&lt;/p&gt;
&lt;p&gt;The strategy is to define a template class that uses the static methods of the
template parameter class. That way, as long as the template is instantiated,
the compiler will complain unless we have provided those static functions. We
can ensure that the template is instantiated and enforce the inheritance idea
by making the derived class extend from the template class we wrote to enforce
those static methods.&lt;/p&gt;
&lt;p&gt;Here is an example. We can create the static interface by declaring a class
template that uses the functions we want to enforce as part of the interface.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;template&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;typename&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StaticInterface&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;StaticInterface&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fooCheck&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;barCheck&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;By assigning &lt;code&gt;T::foo&lt;/code&gt; and &lt;code&gt;T::bar&lt;/code&gt; to function pointers, we are saying,
implicitly, that whatever class is provided as a parameter to this template
must have a static method called &lt;code&gt;foo&lt;/code&gt; and a static method called &lt;code&gt;bar&lt;/code&gt; and,
furthermore, that those static methods must have&lt;br&gt;
the same signature as the function pointers we stuff them into.&lt;/p&gt;
&lt;p&gt;By putting this code inside the constructor of the class, we know that this
method of the template will be instantiated, even if we don't explicitly use
it later in the code, as long as we derive from this class somewhere. So then,
the last question is, where can we derive from it?&lt;/p&gt;
&lt;p&gt;Well, in the class that we want to inherit the interface of course!&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DerivedClass&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;StaticInterface&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;  &lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;param&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;


&lt;p&gt;The &lt;code&gt;DerivedClass&lt;/code&gt; constructor implicitly calls the &lt;code&gt;StaticInterface&lt;/code&gt;
constructor, which assigns the function pointers &lt;code&gt;fooCheck&lt;/code&gt; and &lt;code&gt;barCheck&lt;/code&gt; to
the address of the functions &lt;code&gt;DerivedClass::foo&lt;/code&gt; and &lt;code&gt;DerivedClass::bar&lt;/code&gt;. As a
result, if we forget the &lt;code&gt;bar&lt;/code&gt; function in the &lt;code&gt;DerivedClass&lt;/code&gt; the compiler
will choke with an error. g++ says the following:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;src/poc/test/StaticInterfaceTest.cpp: In constructor
`StaticInterface::StaticInterface() [with T = DerivedClass]':  
src/poc/test/StaticInterfaceTest.cpp:41: instantiated from here  
src/poc/test/StaticInterfaceTest.cpp:20: error: `bar' is not a member of
`DerivedClass'
&lt;/pre&gt;


&lt;p&gt;Pretty cool huh?&lt;/p&gt;
&lt;p&gt;As a final note, please consider this "an interesting observation" and not
necessarily a "great design choice". As I said, I decided against actually
trying to utilize this idea in my project, and I urge you think carefully
before about yours before trying to use it yourself.&lt;/p&gt;&lt;/div&gt;</description><category>C++ Discoveries and Notes</category><category>Programming</category><guid>https://www.joshbialkowski.com/posts/2009/static-interfaces-in-c.html</guid><pubDate>Thu, 13 Aug 2009 15:09:12 GMT</pubDate></item></channel></rss>