<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>NIX/WIN/WEB</title>
	<atom:link href="http://www.formboss.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.formboss.net/blog</link>
	<description>Modern Web Application Development</description>
	<lastBuildDate>Wed, 08 Sep 2010 02:53:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Linking libjpeg and Boost+GIL in Qt and X-Code</title>
		<link>http://www.formboss.net/blog/2010/09/using-libjpeg-and-boost-gil-in-qt-and-x-code/</link>
		<comments>http://www.formboss.net/blog/2010/09/using-libjpeg-and-boost-gil-in-qt-and-x-code/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 02:16:33 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Boost]]></category>
		<category><![CDATA[GIL]]></category>
		<category><![CDATA[libjpeg]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=600</guid>
		<description><![CDATA[In this post I&#8217;d like to share my experiences of linking an external library and code files to an X-Code and Qt project. This task, more than anything, requires a good deal of &#8220;glue&#8221; information, that is, knowing how and when to do this or that little task to get to the next stage. It&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>In this post I&#8217;d like to share my experiences of linking an external library and code files to an X-Code and Qt project. This task, more than anything, requires a good deal of &#8220;glue&#8221; information, that is, knowing how and when to do this or that little task to get to the next stage. It&#8217;s not too hard, but can be quite time consuming as you scour the net for hints. Hopefully this single write-up will help others.</p>
<p><span id="more-600"></span></p>
<p>The task at hand is to use the <a href="http://www.boost.org/">Boost</a> <a href="http://www.boost.org/doc/libs/1_44_0/libs/gil/">GIL</a> library to convert JPEG images to RGB if needed, as well as to resize them.</p>
<p>This resizing task is part of a larger set of tasks which is wrapped into a larger Qt project. It should be noted however, that at this point we&#8217;re only going to focus on the linking process, not the actual code.</p>
<p>This task, linking to a library, will be a very common task for most projects. It&#8217;s also interesting because we&#8217;ll be using something other than the Standard Library, which means we need to link and talk to other library and code files. This is the &#8216;glue&#8217; I mention above, in that making these connections isn&#8217;t always obvious.</p>
<p>I chose the GIL library over using <a href="http://doc.trolltech.com/4.1/qprocess.html">Qt&#8217;s QProcess</a> class  mainly for the purposes of learning more about linking. QProcess, for what it&#8217;s worth, could have made linking to something like <a href="http://www.imagemagick.org/script/index.php">ImageMagik</a> quite simple, but again, in this case it was my wanting to learn which prompted me to chose the &#8216;tough&#8217; path.</p>
<p>As it is, the first step for me was to research what would be needed to get this done. The first thing I found was that I would need the libjpeg library, as JPEG files are what i want to convert.</p>
<p>It&#8217;s a simple download, and can had from <a href="http://www.ijg.org/">here</a>.</p>
<p>To keep things clean, I uncompressed the folder into a directory called /libs in my /Documents directory. You may want to do the same, as we&#8217;ll also be putting the boost library there too.</p>
<p>This download contains a set of makefiles, source code, and instructions. As I&#8217;m on a Mac I didn&#8217;t have the luxury of using say, Ubuntu&#8217;s Software Center. If I was, getting this file and installing it is as simple as downloading its package. (the same goes for Boost)</p>
<p>No such luck though, so we need to build it. The good news is this package, at least on OSX 10.6, was very easy to use. All I needed to do was to open a command prompt and cd into the uncompressed folder in /libs/jpeg-8b, and then issue the standard set of build instructions:</p>
<pre>./configure
make
make test
sudo make install</pre>
<p>This does a few things. First, it runs the configure script to inspect our system and create a make file. We then issue make to compile the project. During this stage you&#8217;ll see all sorts of files being created in the jpeg directory.  <strong>make test</strong> does a quick test to make sure the created files work, and <strong>sudo make install</strong> moves the compiled files to our system directories.</p>
<p>It&#8217;s important to note that this final install step moves two sets of files around:</p>
<p>The first set is a group of small application files to <strong>/usr/local/bin</strong></p>
<p>We will actually ignore these, as for our project, they are not used.</p>
<p>The important part is the moving of the library files.</p>
<p>Here the install process will create and move two files and a symlink to <strong>/usr/local/lib/</strong>:</p>
<pre>libjpeg.8.dylib</pre>
<pre>libjpeg.a</pre>
<pre>libjpeg.dynlib (the symlink)</pre>
<p>These are the guys we care about, as this is what we link our application too. It&#8217;s important to point out though, that Qt and X-Code use two different methods to create this linkage. More on that in a bit.</p>
<p>For now we need to download and decompress the <a title="Boost Library" href="http://www.boost.org/users/download/" target="_blank">Boost library</a>. I put mine in the same place as my jpeg library files in /Users/{user-name}/Documents/libs/</p>
<p>The full path would thus be:</p>
<pre>/Users/{user-name}/Documents/libs/boost_1_44_0</pre>
<p>Within the boost_1_44_0 folder we will have several files and folders. The important bit is <strong>/boost</strong> directory. This is where the code we include into a project resides, and what we point our IDE/Linker towards to build the program.</p>
<p><a title="Boost Install Help" href="http://www.boost.org/doc/libs/1_44_0/more/getting_started/index.html" target="_blank">More on the Boost install Process.</a></p>
<p>We&#8217;re close now, but before we&#8217;re done we need to download and install <a title="Adobe GIL Downloads" href="http://opensource.adobe.com/wiki/display/gil/Downloads">one more file.</a></p>
<p>On that page we want to download a file called <strong>numeric.zip</strong>, the link should be near the bottom.</p>
<p>Extract the file and place it into:</p>
<pre>/Users/{user-name}/Documents/libs/boost_1_44_0/boost/gil/extension/</pre>
<p>Right, so now we have the needed files on our system, this means it&#8217;s time to get linking.</p>
<p>As mentioned above, this process differs for X-Code and Qt.</p>
<h2>Adding Boost and libjpeg</h2>
<p>The first thing we want to do is make sure Boost works. To do so we&#8217;ll grab a chunk of code from <a title="Boost Install Help" href="http://www.boost.org/doc/libs/1_44_0/more/getting_started/unix-variants.html" target="_blank">here</a>:</p>
<pre>#include &lt;boost/lambda/lambda.hpp&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;algorithm&gt;

int main()
{
    using namespace boost::lambda;
    typedef std::istream_iterator&lt;int&gt; in;

    std::for_each(
        in(std::cin), in(), std::cout &lt;&lt; (_1 * 3) &lt;&lt; " " );
}
</pre>
<h3>X-Code</h3>
<p>Create an <strong>X-Code Console C++</strong> project and paste the above code into <strong>main.cpp</strong>.</p>
<p>Try to compile it: it should fail. This is because we need to tell X-Code where the Boost library files are.</p>
<p>Click on the project window (the one that shows all files)</p>
<p>Right Click on the top icon (the one with the projects name)</p>
<p>Select <strong>Get Info</strong></p>
<p>This is a multi-tab window, click on the <strong>Build</strong> tab.</p>
<p>Scroll down until you find the <strong>Search Paths</strong> section, which is one of main headers in gray.</p>
<p>A sub area of this guy will be a setting called <strong>Header Search Paths</strong></p>
<p>Double click the white space next to the setting name and a sheet will appear, click the plus button and add the path to the root of the boost directory.</p>
<p>When done you should have:</p>
<p><a href="http://www.formboss.net/blog/wp-content/uploads/2010/09/x-code-path-1.png"><img class="alignnone size-full wp-image-601" title="x-code-path-1" src="http://www.formboss.net/blog/wp-content/uploads/2010/09/x-code-path-1.png" alt="" width="644" height="157" /></a></p>
<p>Notice how we didn&#8217;t use the full path to the code files, we stop at the boost root directory, that is:</p>
<pre>/Users/grdinic/Documents/libs/boost_1_44_0</pre>
<p>This is because when we:</p>
<pre>#include &lt;boost/lambda/lambda.hpp&gt;</pre>
<p>&#8230;we are saying: &#8220;go into the /boost directory starting from the <strong>Header Search Path</strong> base&#8221;.</p>
<p>In other words, we combine the <strong>Header Search Path</strong> and &lt;boost.. (the last / is implicit). to make:</p>
<pre>/Users/grdinic/Documents/libs/boost_1_44_0 &lt;boost/lambda/lambda.hpp&gt;</pre>
<p>While we&#8217;re here, let&#8217;s also quick add the jpeg-8b path to the <strong>Header Search Path</strong>:</p>
<pre>/Users/grdinic/Documents/libs/jpeg-8b</pre>
<p>We could do this later, but getting it out of the way now seems prudent, as we know we&#8217;ll need it soon anyway.</p>
<p>Now when we recompile we should get no errors, as the Boost code files are being found.</p>
<p>Of course we can test this by running the program. Thing is, this program expects input, so we need to make sure to open the <strong>GDB console</strong> to supply it.</p>
<p>If you have not used this before (the console in X-Code), you can find it&#8217;s button <strong>after you&#8217;ve started the program(!)</strong> as seen below,  right in the middle of the screen next to the word __kill:</p>
<p><a href="http://www.formboss.net/blog/wp-content/uploads/2010/09/gdb-console.png"><img class="alignnone size-full wp-image-602" title="gdb-console" src="http://www.formboss.net/blog/wp-content/uploads/2010/09/gdb-console.png" alt="" width="692" height="538" /></a></p>
<p>When the console window opens you can type in a number, and the program will multiply it by 3 and show the result. Boost Works!</p>
<h3>Qt</h3>
<p>To do the same in Qt we have a slightly easier task:</p>
<p>We define the include path to our code libraries by opening the<strong> .pro</strong> file for our project and adding:</p>
<p><!-- p, li { white-space: pre-wrap; } --></p>
<pre><!--StartFragment-->INCLUDEPATH += \</pre>
<pre>    /Users/grdinic/Documents/libs/boost_1_44_0 \</pre>
<pre>    /Users/grdinic/Documents/libs/jpeg-8b \<!--EndFragment--></pre>
<p>With this done we have included the Boost and libjpeg code files.</p>
<h2>Linking libjpeg</h2>
<p>The next step is to make sure Boost+GIL works. As we already have Boost working you&#8217;d think this would be a given, but now we need to add our libjpeg library into the mix, which complicates things a bit.</p>
<p>First, we start with the <a title="GIL Documents" href="http://www.boost.org/doc/libs/1_44_0/libs/gil/doc/index.html" target="_blank">docs page</a>, where we find this bit of code*:</p>
<pre>#include &lt;<a href="http://www.boost.org/doc/libs/1_44_0/boost/gil/image.hpp">boost/gil/image.hpp</a>&gt;
#include &lt;<a href="http://www.boost.org/doc/libs/1_44_0/boost/gil/typedefs.hpp">boost/gil/typedefs.hpp</a>&gt;
#include &lt;<a href="http://www.boost.org/doc/libs/1_44_0/boost/gil/extension/io/jpeg_io.hpp">boost/gil/extension/io/jpeg_io.hpp</a>&gt;
#include &lt;<a href="http://www.boost.org/doc/libs/1_44_0/boost/gil/extension/numeric/sampler.hpp">boost/gil/extension/numeric/sampler.hpp</a>&gt;
#include &lt;<a href="http://www.boost.org/doc/libs/1_44_0/boost/gil/extension/numeric/resample.hpp">boost/gil/extension/numeric/resample.hpp</a>&gt;

int main() {
    using namespace boost::gil;

    rgb8_image_t img;
    jpeg_read_image("test.jpg",img);

    // test resize_view
    // Scale the image to 100x100 pixels using bilinear resampling
    rgb8_image_t square100x100(100,100);
    resize_view(const_view(img), view(square100x100), bilinear_sampler());
    jpeg_write_view("out-resize.jpg",const_view(square100x100));

    return 0;
}
</pre>
<p><em>*Please note I have removed the header comments for the sake of clarity</em>.</p>
<p>If we try to compile this code now we&#8217;ll get errors. We get these errors because we need to link the <strong>libjpeg.a</strong> file to our project.</p>
<p>It&#8217;s important to note that the Boost and libjpeg pieces are really just code files (well, not all, but for us in this project they are), so the inclusion process is just telling the linker where they are.</p>
<p>However, library files are different animals altogether, so they need to be linked to our project in similarly different manner.</p>
<p>As you might expect, the process of creating this library link differs between the two editors.</p>
<h3>X-Code</h3>
<p>X-Code expects library files to be selectable in the GUI under the <strong>Targets</strong> &gt; <strong>Link</strong> <strong>Binary with Libraries</strong> &gt; <strong>Add</strong> area:</p>
<p><a href="http://www.formboss.net/blog/wp-content/uploads/2010/09/x-code-adding-library.png"><img class="alignnone size-full wp-image-604" title="x-code-adding-library" src="http://www.formboss.net/blog/wp-content/uploads/2010/09/x-code-adding-library.png" alt="" width="442" height="314" /></a></p>
<p>This is a problem however, because the path the lib files were installed too above:</p>
<pre>/usr/local/lib</pre>
<p>&#8230;is not accessible through the X-Code GUI.</p>
<p>The fix is to simply open a terminal and cp the files to our project directory:</p>
<pre>cp /usr/local/lib/libjpeg.a /Users/grdinic/Documents/X-Code/boost/
</pre>
<p>With that done, we can now use the GUI interface to select the library file, which should add the library to our project and makes it available for the linking step:</p>
<p><a href="http://www.formboss.net/blog/wp-content/uploads/2010/09/x-code-library-added.png"><img class="alignnone size-full wp-image-605" title="x-code-library-added" src="http://www.formboss.net/blog/wp-content/uploads/2010/09/x-code-library-added.png" alt="" width="544" height="228" /></a></p>
<p>Now when we build, the project should do so without error**.</p>
<h3>Qt</h3>
<p>Qt, thankfully, is a bit more simple. To add a proper link to the library file we simple add this to the .pro file:</p>
<p><!-- p, li { white-space: pre-wrap; } --></p>
<pre><!--StartFragment-->LIBS += -L/usr/local/lib -ljpeg<!--EndFragment--></pre>
<p>It is worth pointing out however, that their are some real subtleties going on here.</p>
<p>The LIBS+ part is all Qt, and should be strait forward. The trick is the -L switch, which is actually a <a title="GCC Manual" href="http://www.network-theory.co.uk/docs/gccintro/gccintro_21.html" target="_blank">GCC directive</a>. The other tricky bit is the -ljpeg.</p>
<p>To be honest, this is one of those things that drives you batty if you don&#8217;t know what to look for. It&#8217;s great when you know sure, but man, during&#8230;</p>
<p>The -l means library, and the jpeg seems strait forward enough&#8230;until you look at the library files on your system and only see a <em>libjpeg.a</em> Where in the heck does <em>jpeg</em> come from?</p>
<p>Ah you see, the trick is that during the linking process the <em>lib</em> is removed for you, as is the .a. Thus, -ljpeg really means get <em>libjpeg.a</em>.</p>
<p>Again, it&#8217;s nice when you think about it for the simplicity it offers, but it&#8217;s a real bear if you didn&#8217;t know that going on!</p>
<h2>**Other Issues</h2>
<p>At this point I wish could say &#8216;all done&#8217;, but cannot. My OSX machine compiles this code as expected, but the situation is not so rosy on Ubuntu 10.4.</p>
<p>When we try to compile I get an error:</p>
<pre>/home/matt/Qt Projects/boost/../../libs/boost_1_44_0/boost/gil/extension/numeric/sampler.hpp:104:
error: no matching function for call to ‘boost::gil::point2&lt;int&gt;::point2(boost::gil::point2&lt;long int&gt;)’</pre>
<p>A quick look at the <a title="SVN Trunk" href="https://svn.boost.org/trac/boost/browser/trunk/boost/gil" target="_blank">trunk</a> shows that newer versions of GCC and gil don&#8217;t always <a title="Bug Report" href="https://svn.boost.org/trac/boost/ticket/3041" target="_blank">play together so well</a>. The good news is so long as we used the plain download of <em>Boost 1_44_0</em> a simple change of:</p>
<pre>point2&lt;int&gt; p0(ifloor(p)); // the closest integer coordinate top left from p</pre>
<p>to:</p>
<pre>point2&lt;long&gt; p0(ifloor(p)); // the closest integer coordinate top left from p</pre>
<p>&#8230;should do the trick for this particular issue.</p>
<p>So as simple as that was, that&#8217;s the thing about library files. When something goes wrong, it can really, <em>really</em> go wrong. This is because the type of programming the GIL and Boost developers are using is called <a title="Template Metaprogramming" href="http://en.wikipedia.org/wiki/Template_metaprogramming" target="_blank">Template Metaprogramming</a>, and is for all practical purposes the most advanced form of programming I&#8217;ve ever come across.</p>
<p>Some of this complexity in implementation is somewhat alleviated by the use of <a title="C++ Concepts" href="http://www.devx.com/SpecialReports/Article/38864" target="_blank">C++ Template Concepts</a>, a feature that while not part of the C++ standard just yet, is implemented in spirit by the GIL developers. However, when things go wrong your error list could very well be undecipherable. It&#8217;s the price we pay for the power of templates.</p>
<p>The last interesting idea here is that if you want to actually run this program, you&#8217;ll need to specify the image file path to something real, else we&#8217;ll get a hard crash in our Qt app, or an error in the X-Code version.</p>
<h2>Final Words</h2>
<p>This post was all about linking two code libraries and one actual &#8216;library&#8217; file to a small project so that we save ourselves the time and effort of writing image processing code ourselves. In the world of C++ application development this is an absolutely necessary skill.</p>
<p>The big takeaways are that most of what we did was actually quite simple, but also, in many places and ways, subtle.</p>
<p>Of course their is more to learn: We have yet to deal with portability, in that one of the primary goals of creating Qt apps is the effortless cross-platform distribution. As soon as we start adding external libraries we need to be aware of the extra time and effort getting these guys to play nice with our systems will be.</p>
<p>We also left out the idea of the two types of linking, static and shared. For OS X developers, we left out the concept of <a title="OSX Frameworks" href="http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WhatAreFrameworks.html" target="_blank">frameworks</a>. In short, we&#8217;ll leave this as an exercise for you for now, though may revisit these topics and other at a later time.</p>
<p>My final point will be to play it safe. You can download a newer version of the gil library from <a title="Adobe gil Open Source" href="http://opensource.adobe.com/wiki/display/gil/Downloads" target="_blank">Adobe&#8217;s website</a> if you like, but my time with doing so was spent running down and fixing various template issues, and all to no avail. In short, stick with the version that comes in the official Boost package!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/09/using-libjpeg-and-boost-gil-in-qt-and-x-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt &#8211; 4 Methods Of Adding &amp; Integrating Designer Forms</title>
		<link>http://www.formboss.net/blog/2010/08/qt-4-methods-of-adding-integrating-designer-forms/</link>
		<comments>http://www.formboss.net/blog/2010/08/qt-4-methods-of-adding-integrating-designer-forms/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 20:49:17 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Aggregation as a pointer member]]></category>
		<category><![CDATA[qt adding forms]]></category>
		<category><![CDATA[qt creator]]></category>
		<category><![CDATA[qt designer forms]]></category>
		<category><![CDATA[Qt Framework]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=581</guid>
		<description><![CDATA[The Qt Designer tool allows us to create forms for our application in a visual manner, freeing us from the tedium of hand-coding. While this saves time, it&#8217;s important to understand the various ways Qt creates these forms and by extension, the methods at our disposal to integrate these forms into a larger application.
In this [...]]]></description>
			<content:encoded><![CDATA[<p>The <em>Qt Designer</em> tool allows us to create forms for our application in a visual manner, freeing us from the tedium of hand-coding. While this saves time, it&#8217;s important to understand the various ways Qt creates these forms and by extension, the methods at our disposal to integrate these forms into a larger application.</p>
<p>In this post we&#8217;ll look at the 3 main technical options <em>Qt Designer</em> employs to serve this function:</p>
<ul>
<li> Aggregation as a pointer member</li>
<li> Aggregation</li>
<li> Multiple Inheritance</li>
</ul>
<p>We&#8217;ll also see examples of each method in practice. By the end of this post we should have a good grasp on the various ways we can use <em>Qt Designer </em>to create and integrate designer forms into a larger application.</p>
<p><span id="more-581"></span></p>
<p>When considering which method to use it&#8217;s important to understand why multiple methods exist in the first place.</p>
<p>The first part of our answer is to understand that when we design an application, our user interface will at some point need to interact with our underlying program logic and/or data structures. Thus, while we can create a new form for our application using the visual editor, it&#8217;s up to us to make a <em>programmatic</em> connection so these elements actually do something meaning ful in the context if the larger application.</p>
<p>In short then, how do we get say, a dialog box to write values to a main window? That is, how does one window (designer form) talk to another?</p>
<p>The three methods mentioned above are an abstract answer to this question.</p>
<p>So let&#8217;s open <em>Qt Creator</em> and create a basic, empty <strong>Qt GUI Application</strong>. For our purposes we&#8217;ll leave the default names the same, which means we should have a few basic files in our project:</p>
<p>main.cpp</p>
<p>mainwindow.cpp</p>
<p>mainwindow.h</p>
<p>mainwindow.ui</p>
<p>formsdemo.pro</p>
<p>At least in <em>Qt Creator</em> 2.0, the first window that should be open when we leave the create project wizard is the integrated <em>Qt Designer </em>tool. We can close that for now, as our focus is the code files <em>Qt Creator</em> has created for us.</p>
<p>Specifically, <strong>mainwindow.cpp</strong> and its definition file, <strong>mainwindow.h</strong>.</p>
<p>The contents of these files will differ based on a setting you may not have seen before:</p>
<p><strong>Qt Preferences </strong>&gt; <strong>Designer</strong> &gt; <strong>Embedding of the UI Class</strong></p>
<p>Notice the three options:</p>
<ul>
<li> Aggregation as a pointer member</li>
<li> Aggregation</li>
<li> Multiple Inheritance</li>
</ul>
<p>The default on a fresh install should the first: <strong>Aggregation as a pointer member</strong>. If it&#8217;s not, then set it as such and recreate the project (delete the one you just created and start over).</p>
<p>The reason why is with this setting <em>Qt Creator</em> designates the <strong>mainwindow.cpp</strong> and <strong>mainwindow.h</strong> files to utilize a private pointer to our <strong>Ui::MainWindow</strong> object, which is in turn defined in <strong>mainwindow.h</strong>, which itself part of the <strong>Ui::</strong> namespace, of which <strong>Ui_MainWindow</strong> is a subclass of <strong>MainWindow</strong>, our main window widget.</p>
<p>It&#8217;s a mouthful, and may not the easiest to understand strait away. The end result is that in <strong>mainwindow.cpp</strong>, so long as we include:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;mainwindow.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;ui_mainwindow.h&quot;</span></div>
</li>
</ol>
</div>
<p>&#8230;our Ui objects defined in <strong>ui_mainwindow.h</strong> should all be accessible (exposed) via our private ui-&gt; pointer in <strong>mainwindow.cpp</strong>.</p>
<p>Sure enough, our <strong>MainWindow</strong> constructor contains a call to setupUi() using this pointer:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">MainWindow<span class="sy0">::</span><span class="me2">MainWindow</span><span class="br0">&#40;</span><span class="kw5">QWidget</span> <span class="sy0">*</span>parent<span class="br0">&#41;</span> <span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QMainWindow</span><span class="br0">&#40;</span>parent<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ui<span class="br0">&#40;</span><span class="kw3">new</span> Ui<span class="sy0">::</span><span class="me2">MainWindow</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ui<span class="sy0">-</span>&gt;setupUi<span class="br0">&#40;</span><span class="kw3">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Again, this is somewhat of a mouthful and is not always the easiest to understand. This technique gets at the heart of some of C++&#8217;s more advanced Object Oriented features, many of which could be completely foreign to you. Complexities aside, the end result is with this logic any time we need to access a Ui element in our <strong>MainWindow</strong> class, we simply use the ui-&gt; pointer.</p>
<p>This is an incredibly important point, as it sets us up for understanding how to add and integrate our <em>own</em> designer forms. In other words, when faced with the task of linking a Ui_ definition file (<strong>ui_mainwindow.h</strong>) to the <strong>mainwindow.h</strong> and .cpp files, this is what the designers of Qt have decided to do&#8230;it&#8217;s a pretty good idea to follow this lead!</p>
<h3>Creating A New Designer Form</h3>
<p>To see why, right click on your projects name in the <strong>Protect Panel</strong> (the listing with all the project files, left and side), and from the context menu, click <strong>Add New&#8230;</strong></p>
<p>Depending on your platform and version, you need to locate the <strong>Qt Designer From Class</strong> template.</p>
<p>Choose <strong>Dialog without Buttons</strong> and click continue.</p>
<p>Now set the <strong>Class name</strong> <em>MyDialog</em>.</p>
<p>This will update the other fields in the wizard such that your header and source files will be <strong>mydialog.cpp</strong> and <strong>mydialog.h</strong> respectively.</p>
<p>Again, the first window that will open is the <em>Qt Designer</em> editor. Go ahead and add a single <strong>lineEdit</strong> item to the dialog and save and close the <em>Qt Designer </em>editor.</p>
<p>Let&#8217;s assume this dialog box needs to communicate with the <strong>MainWindow</strong> form. How do we do that?</p>
<p>We have two main options: <em>Signals and Slots</em>, and <em>Direct Exposure</em>.</p>
<h3>Signals and Slots</h3>
<p>This is perhaps the most &#8216;pure&#8217; method, as is means we do not have to force direct connections between widgets. We simply set up a signal from <strong>MyDialog</strong> and create a slot in <strong>MainWindow</strong> to process any signals it receives. The only down-side to this method is it creates more coding work, and can be harder to maintain. The upshot is as we&#8217;re using signals and slots, we have a greater ability to compose multiple objects together and only listen to the elements we choose. In short, the dialog and caller remain disconnected for the most part.</p>
<h3>Direct Exposure</h3>
<p>Direct Exposure means we manipulate the <strong>mydialog.h</strong> file to gain direct access to its ui members from the calling class, in this case <strong>MainWindow</strong>. The manipulation is a bit of a force though, as our change is making the ui-&gt; member pointer public instead of the default private.</p>
<p>I addition to the privilege change, we must also include both <strong>mydialog.h</strong> and <strong>ui_mydialog.h</strong> in the <strong>mainwindow.cpp</strong> file.</p>
<p>The upshot to this manipulation and inclusion is our <strong>MyDialog </strong>ui members are now visible to <strong>MainWindow</strong>, and can be accessed in a manner similar to:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span>m1b.<span class="me1">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// we can now access method1 ui members like in Method2</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> value <span class="sy0">=</span> m1b.<span class="me1">ui</span><span class="sy0">-&amp;</span>gt;lineEdit<span class="sy0">-</span>&gt;text<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ui<span class="sy0">-</span>&gt;lineEdit1<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span>value<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Again, it&#8217;s important to note that in order to get to this point we needed to make a private member public, as well as include two header files in our <strong>mainwindow.cpp</strong> file. This could be considered a bit of heavy-handed coding, and may not always be what you want. That said, it&#8217;s a totally legitimate solution, and is certainly less code-heavy and maintenance prone than the <em>Signals and Slots</em> approach.</p>
<h3>What About The Others?</h3>
<p>Up until this point we&#8217;ve only looked at the first of <em>Qt Creators</em> three options for creating code, <em>Aggregation as a pointer member</em>. The other two are just as important, and in some ways, perhaps a bit more convenient.</p>
<h3>Aggregation</h3>
<p>First we have <em>aggregation</em>. This is very similar in usage terms to the first, in that we aggregate the ui object into our definition file. However, as it&#8217;s not a pointer the syntax is a bit cleaner, and in terms of includes, is a bit easier to keep track of as the ui_.h file (the one created by moc), is included in the .h file of the form implementation, meaning we do not need to include it in the <strong>mainwindow.cpp</strong> class. However, we still need to make the Ui:: member public instead of private, which means we need to edit the moc generated code.This is fine, but is something you should be aware of when faced with creating many widgets.</p>
<p>The end result however, is that we can now access the ui members from <strong>MainWindow</strong>:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// must make [ Ui::Method2 ui ] public in .h</span></div>
</li>
<li class="li1">
<div class="de1">Method2 m2;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span>m2.<span class="me1">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> value <span class="sy0">=</span> m2.<span class="me1">ui</span>.<span class="me1">lineEdit</span><span class="sy0">-</span>&gt;text<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ui<span class="sy0">-</span>&gt;lineEdit2<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span>value<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Notice that as our Ui member was created on the stack as opposed to the heap like the first method, we access the ui elements using the member operator (.)</p>
<h3>Multiple Inheritance</h3>
<p>This is an interesting approach, as from a pedagogical standpoint many of the Qt learning tools use this method in their examples. In other words, knowing about this method helps us learn Qt.</p>
<p>As the name suggests, in this method we subclass both the Base Class of our Widget as well as the namespaced class, which designates the Ui_ class as a subclass.</p>
<p>This dependency chain thus provides our base class with direct access to our forms Ui elements. As can be seen, this makes for the cleanest, most easy-to-understand code:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// must change generated .h code to be public::</span></div>
</li>
<li class="li1">
<div class="de1">Method3 m3;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span><span class="br0">&#40;</span>m3.<span class="me1">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> value <span class="sy0">=</span> m3.<span class="me1">lineEdit</span><span class="sy0">-</span>&gt;text<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ui<span class="sy0">-</span>&gt;lineEdit3<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span>value<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>However, it should be said this benefit comes with a price. Classes defined in this way or almost certainly less flexible for more complex projects, as now we&#8217;ve created a tight bond between ui definition and implementation.</p>
<p>Overall though it&#8217;s not a surprise why Qt chooses this method in many example code blocks, it&#8217;s the easiest to understand and totally sufficient, at least for smaller projects.</p>
<h2>Conclusion</h2>
<p>This post is rather heavy on theory, so to aid in its consumption I&#8217;ve created a test project which shows off each method. The project is purposely light on comments, as the goal here is to just open it up and stalk through the code, letting your own explorations decipher it.</p>
<p>Please keep in mind that their are no doubt other techniques and strategies/design patterns for adding and integrating Qt Designer forms.</p>
<h2>Code Download</h2>
<p>Contains a simple project showing the methods discussed in this post.</p>
<p><a href="http://www.formboss.net/blog/wp-content/uploads/2010/08/uimembers.zip">uimembers</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/08/qt-4-methods-of-adding-integrating-designer-forms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Threading In Qt 4</title>
		<link>http://www.formboss.net/blog/2010/07/threading-in-qt-4/</link>
		<comments>http://www.formboss.net/blog/2010/07/threading-in-qt-4/#comments</comments>
		<pubDate>Sun, 01 Aug 2010 01:30:38 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Qt Threading]]></category>
		<category><![CDATA[Threading]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=564</guid>
		<description><![CDATA[In this quick post we&#8217;ll take a look at Qt&#8217;s elegant and simple QFuture, QtConcurrentRun, and QFutureWatcher interfaces. Using these classes allows us to consume a QThreadPool thread for a specific function.
This is handy for many operations, and while simplistic in that we&#8217;re not synchronizing data, still has many uses, from processing large blocks of [...]]]></description>
			<content:encoded><![CDATA[<p>In this quick post we&#8217;ll take a look at Qt&#8217;s elegant and simple QFuture, QtConcurrentRun, and QFutureWatcher interfaces. Using these classes allows us to consume a QThreadPool thread for a specific function.</p>
<p>This is handy for many operations, and while simplistic in that we&#8217;re not synchronizing data, still has many uses, from processing large blocks of images to streaming chunks of data.</p>
<p>In this post we&#8217;ll check out some sample code for implementing QFuture. </p>
<p><span id="more-564"></span></p>
<p>Let&#8217;s start with the following code which implements QFuture in the most basic manner possible:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QtCore/QCoreApplication&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QDebug&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QFuture&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QtConcurrentRun&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QFutureWatcher&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> computation<span class="br0">&#40;</span><span class="kw4">int</span> x<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">long</span> a,b,c;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; a <span class="sy0">=</span> <span class="nu0">1</span>; b <span class="sy0">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span>; i &lt; x; i<span class="sy0">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; c <span class="sy0">=</span> b <span class="sy0">+</span> a;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; a <span class="sy0">=</span> b;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; b <span class="sy0">=</span> c;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> c;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QCoreApplication</span> a<span class="br0">&#40;</span>argc, argv<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> x <span class="sy0">=</span> <span class="nu0">5</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; QFuture&lt;int&gt; future <span class="sy0">=</span> QtConcurrent<span class="sy0">::</span><span class="me2">run</span><span class="br0">&#40;</span>computation, x<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// blocking&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; future.<span class="me1">waitForFinished</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> result <span class="sy0">=</span> future.<span class="me1">result</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; qDebug<span class="br0">&#40;</span><span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>result<span class="br0">&#41;</span>.<span class="me1">toStdString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> a.<span class="me1">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>This code will consume a thread for the computation method call, returning the result via future.result(). When compared to our <a href="http://www.formboss.net/blog/2010/05/202/">raw POSIX thread example</a> it becomes clear just how much more simple the Qt version is.</p>
<p>Simple enough, but this code has one potential problem: as the comment shows, waitForFinished() blocks, which means our GUI stalls. </p>
<p>To fix this we&#8217;ll implement a signal/slot solution to let the long-running process chug away in the background, leaving the GUI thread free for updates. Of course the only trick to this is we need signals and slots, which means we must break our application apart into traditional header and implementation files.</p>
<p>main.cpp</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QtGui/QApplication&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;mainwindow.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QApplication</span> a<span class="br0">&#40;</span>argc, argv<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; MainWindow w;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; w.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> a.<span class="me1">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>mainwindow.cpp</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;mainwindow.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;thread.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">MainWindow<span class="sy0">::</span><span class="me2">MainWindow</span><span class="br0">&#40;</span><span class="kw5">QWidget</span> <span class="sy0">*</span>parent<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">:</span> <span class="kw5">QMainWindow</span><span class="br0">&#40;</span>parent<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setWindowTitle<span class="br0">&#40;</span><span class="st0">&quot;Threads Demo&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; startButton <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QPushButton</span><span class="br0">&#40;</span><span class="st0">&quot;Start Thread&#8230;&quot;</span>, <span class="kw3">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">connect</span><span class="br0">&#40;</span>startButton, <span class="kw4">SIGNAL</span><span class="br0">&#40;</span>clicked<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw3">this</span>, SLOT<span class="br0">&#40;</span>startButtonPushed<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QGridLayout</span> <span class="sy0">*</span>mainLayout <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QGridLayout</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>startButton<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; thread <span class="sy0">=</span> <span class="kw3">new</span> Thread<span class="br0">&#40;</span><span class="kw3">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">connect</span><span class="br0">&#40;</span>thread, <span class="kw4">SIGNAL</span><span class="br0">&#40;</span>threadFinished<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw3">this</span>, SLOT<span class="br0">&#40;</span>threadDone<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">MainWindow<span class="sy0">::</span>~MainWindow<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> MainWindow<span class="sy0">::</span><span class="me2">startButtonPushed</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// we pass a pointer to the object, the address of the method, and the arg</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; future <span class="sy0">=</span> QtConcurrent<span class="sy0">::</span><span class="me2">run</span><span class="br0">&#40;</span>thread, <span class="sy0">&amp;</span>Thread<span class="sy0">::</span><span class="me2">compute</span>, <span class="nu0">10</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> MainWindow<span class="sy0">::</span><span class="me2">threadDone</span><span class="br0">&#40;</span><span class="kw4">int</span> x<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; qDebug<span class="br0">&#40;</span><span class="st0">&quot;threadDone&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; qDebug<span class="br0">&#40;</span><span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>x<span class="br0">&#41;</span>.<span class="me1">toStdString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>mainwindow.h</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#ifndef MAINWINDOW_H</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define MAINWINDOW_H</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QtGui/QMainWindow&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QPushButton&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QBoxLayout&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QDebug&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QFuture&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QtConcurrentRun&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QFutureWatcher&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;thread.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> MainWindow <span class="sy0">:</span> <span class="kw2">public</span> <span class="kw5">QMainWindow</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">Q_OBJECT</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; MainWindow<span class="br0">&#40;</span><span class="kw5">QWidget</span> <span class="sy0">*</span>parent <span class="sy0">=</span> <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ~MainWindow<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Thread <span class="sy0">*</span>thread;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; QFuture&lt;void&gt; future;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">slots</span> <span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> startButtonPushed<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> threadDone<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">signals</span> <span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QPushButton</span> <span class="sy0">*</span>startButton;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif // MAINWINDOW_H</span></div>
</li>
</ol>
</div>
<p>thread.cpp</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;thread.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Thread<span class="sy0">::</span><span class="me2">Thread</span><span class="br0">&#40;</span><span class="kw5">QObject</span> <span class="sy0">*</span>parent<span class="br0">&#41;</span> <span class="sy0">:</span> <span class="kw5">QObject</span><span class="br0">&#40;</span>parent<span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Thread<span class="sy0">::</span>~Thread<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> Thread<span class="sy0">::</span><span class="me2">compute</span><span class="br0">&#40;</span><span class="kw4">int</span> x<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">long</span> a,b,c;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; a <span class="sy0">=</span> <span class="nu0">1</span>; b <span class="sy0">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> <span class="nu0">0</span>; i &lt; x; i<span class="sy0">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; c <span class="sy0">=</span> b <span class="sy0">+</span> a;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; a <span class="sy0">=</span> b;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; b <span class="sy0">=</span> c;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; qlonglong h,j,u;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; j <span class="sy0">=</span> <span class="nu0">1</span>; u <span class="sy0">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> j <span class="sy0">=</span> <span class="nu0">0</span>; j &lt; <span class="nu0">100000000</span>; j<span class="sy0">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; h <span class="sy0">=</span> <span class="br0">&#40;</span>u <span class="sy0">*</span> j<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; u <span class="sy0">=</span> <span class="br0">&#40;</span>h <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="sy0">+</span> j;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> w <span class="sy0">=</span> <span class="nu0">0</span>; w &lt; <span class="nu0">40000000</span>; w<span class="sy0">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; u <span class="sy0">=</span> <span class="br0">&#40;</span>j <span class="sy0">+</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="sy0">*</span> <span class="nu0">3</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j <span class="sy0">=</span> <span class="br0">&#40;</span>u <span class="sy0">+</span> <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; h <span class="sy0">=</span> <span class="br0">&#40;</span>u <span class="sy0">*</span> <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; emit threadFinished<span class="br0">&#40;</span>a<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>thread.h</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#ifndef THREAD_H</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define THREAD_H</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QObject&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;QFutureWatcher&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Thread <span class="sy0">:</span> <span class="kw2">public</span> <span class="kw5">QObject</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">Q_OBJECT</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Thread<span class="br0">&#40;</span><span class="kw5">QObject</span> <span class="sy0">*</span>parent <span class="sy0">=</span> <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ~Thread<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> compute<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">slots</span> <span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">signals</span> <span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> threadFinished<span class="br0">&#40;</span><span class="kw4">int</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif // THREAD_H</span></div>
</li>
</ol>
</div>
<p>Between this and the official documentation it should be pretty clear what&#8217;s going on.</p>
<p>However. the one thing to point out is that time and again we&#8217;ll be confronted with the question of how do we &#8216;get&#8217; values back from a signal/slot architecture. Of course in this example we&#8217;re using threads, but this question applies equally well to non-threaded scenarios.</p>
<p>In many instances the answer to this question is we needn&#8217;t do anything. We&#8217;re processing a batch of images and only need to know <em>when</em> the batch operation is complete. This can be in the form of a dialog box, and is where QFutureWatcher comes in&#8211;we only care about being notified as to when we&#8217;re done processing.</p>
<p>But that&#8217;s not always good enough, and is for me at least, where much of the learning pains of signal/slots has come from.</p>
<p>In this example I wanted to return the value of our threaded computation to the main thread via qDebug(). The problem was that while QFuture returns a value via future.result(), we cannot get this value asynchronously without blocking the GUI, as was the case in the first example. Why? Because when we implement QFutureWatcher to notify us the result of a QFuture has finished, we now only have signals, and these signals do not contain the results of our method call.</p>
<p>So how do we get our results?</p>
<p>In the end my solution was simple: bypass QFutureWatcher and emit a signal directly from the threaded computation method. This has the exact same effect as emitting a signal when the thread is done, only now we get a value back as well.</p>
<p>In the end my original failure was because I was trying to force functionality where it didn&#8217;t belong. QFuture is a very simple wrapper (though powerful), which makes spawning threads a snap. But it is in the end just that, a simplified wrapper for a more complex process.</p>
<p>Of course the downside to this is I had to implement my own signal/slot connections to retrieve the value, and in doing so, made my function a touch less portable. No matter, it&#8217;s a small price to pay as I now get my values back to the main thread as desired.</p>
<p>The last thing I would like to point out is the syntax of the call:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">future <span class="sy0">=</span> QtConcurrent<span class="sy0">::</span><span class="me2">run</span><span class="br0">&#40;</span>thread, <span class="sy0">&amp;</span>Thread<span class="sy0">::</span><span class="me2">compute</span>, <span class="nu0">10</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Although this is covered in the official documentation I ended up stuck for a bit because I didn&#8217;t realize one very important subtlety:</p>
<p>When passing members functions the first parameter <em>must be a pointer to an instance of the class</em>. It says as much in the docs&#8211;the trick is that the second parameter must then be the <em>address of the member function being called</em>. </p>
<p>If you leave this part out you&#8217;ll get compiler errors, so make sure to double check what you&#8217;re passing.</p>
<p>Of course this is the most simplistic thread concept in Qt, but it&#8217;s a a darn powerful one. Study the code above, try it yourself, and get multi-threading!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/07/threading-in-qt-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ Performance &#8211; Counting Clocks</title>
		<link>http://www.formboss.net/blog/2010/07/c-performance-counting-clocks/</link>
		<comments>http://www.formboss.net/blog/2010/07/c-performance-counting-clocks/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 01:03:04 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[assembly code]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[optimizing code]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=503</guid>
		<description><![CDATA[Performance computing can be an interesting task to undertake, as it lets us get under the hood of a complex  abstraction (C++) and talk to the machine directly.
In the next two posts we&#8217;ll take a look at the Fibonacci algorithm used in a few other posts and see just how fast we can make [...]]]></description>
			<content:encoded><![CDATA[<p>Performance computing can be an interesting task to undertake, as it lets us get under the hood of a complex  abstraction (C++) and talk to the machine directly.</p>
<p>In the next two posts we&#8217;ll take a look at the Fibonacci algorithm used in a few other posts and see just how fast we can make it by looking at loop implementation, data type usage, and assembly code optimizations. In this first post we&#8217;ll take a look at some basic timing code, what gcc will do for us using the -O2 flag, then in the second post, see what we can do (if anything) to improve upon the generated code. </p>
<p><span id="more-503"></span></p>
<p>The Algorithm<br />
The traditional use of the Fibonacci sequence is to show off the use of recursive function calls. The only problem with this is for every recursive call we dump the result of the previous call back on the functions call stack. For a few recursions this isn&#8217;t that bad, but in the case of a Fibonacci sequence it can lead to millions of calls and loads of memory&#8211;the most common end result then is too many calls will simply stall or crash the application.</p>
<p>The solution then is to use an iterative approach to solving the sequence.</p>
<p>Recall that the fib sequence is simply the sum of the previous two numbers in the sequence:</p>
<p>1+1=2, 1+2=3, 2+3=5, 3+5=8, 5+8=13, 8+13=21 [...]</p>
<p>For the sake of my implementation, we need to tell the loop how many times to run, and to shift the variables values down by 1 for each loop.</p>
<p>So on the first turn we set x and y to be 1 and 1 respectively. We then add them together, placing the value into a third variable.</p>
<p>We then swap the values of x and y down &#8220;1&#8243;, with x getting y&#8217;s old value and y getting z.</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> iterations <span class="sy1">=</span> <span class="nu0">10</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> i;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">long</span> values<span class="br0">&#91;</span>iterations<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">long</span> x,y,z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; x <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; y <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// standard loop</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>i <span class="sy1">=</span> <span class="nu0">0</span>; i <span class="sy3">&amp;</span>lt; iterations; i<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; z <span class="sy1">=</span> x <span class="sy2">+</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy1">=</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; y <span class="sy1">=</span> z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; values<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy1">=</span> z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>So how can we make this run as fast as possible? The first step is to figure out how fast it currently is. With modern CPU&#8217;s being as fast as they are seconds and milliseconds simply won&#8217;t do. Thus, we need to look at the finest grain counter an x86 CPU offers: CPU clocks.</p>
<p>To count clocks we&#8217;ll implement a CPU clock counting benchmark routine valid on gcc and x86-64 hardware:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1"><span class="coMULTI">/* </span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* File: &nbsp; main.cpp</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Author: M. Grdinic</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;* Created on July 19, 2010, 3:30 PM</span></div>
</li>
<li class="li1">
<div class="de1"><span class="coMULTI">&nbsp;*/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;stdlib.h&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">using</span> <span class="kw2">namespace</span> std;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">typedef</span> <span class="kw4">long</span> <span class="kw4">long</span> __int64;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">inline</span> __int64 rdtsc<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __int64 hi, lo;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__ __volatile__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;xorl %%eax, %%eax;<span class="es0">\n</span><span class="es0">\t</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;push %%rbx;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;cpuid<span class="es0">\n</span><span class="es0">\t</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">::</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">:</span><span class="st0">&quot;%rax&quot;</span>, <span class="st0">&quot;%rbx&quot;</span>, <span class="st0">&quot;%rcx&quot;</span>, <span class="st0">&quot;%rdx&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__ __volatile__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;rdtsc;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">:</span> <span class="st0">&quot;=a&quot;</span> <span class="br0">&#40;</span>lo<span class="br0">&#41;</span>, &nbsp;<span class="st0">&quot;=d&quot;</span> <span class="br0">&#40;</span>hi<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">::</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__ __volatile__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;xorl %%eax, %%eax; cpuid;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;pop %%rbx;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">::</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy4">:</span><span class="st0">&quot;%rax&quot;</span>, <span class="st0">&quot;%rbx&quot;</span>, <span class="st0">&quot;%rcx&quot;</span>, <span class="st0">&quot;%rdx&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span>__int64<span class="br0">&#41;</span>hi <span class="sy1">&lt;&lt;</span> <span class="nu0">32</span> <span class="sy3">|</span> lo;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define COUNT 20</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> tester<span class="br0">&#40;</span>__int64 overhead<span class="br0">&#91;</span><span class="br0">&#93;</span>, __int64 clocks<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __int64 s, f, t1, t2;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> x_i; <span class="kw4">int</span> x_it <span class="sy1">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// set locals</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> iterations <span class="sy1">=</span> <span class="nu0">20</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> i;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">long</span> values<span class="br0">&#91;</span>iterations<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">long</span> x,y,z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; x <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; y <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// LOOP CONTROL CODE</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>x_it <span class="sy1">=</span> <span class="nu0">0</span>; x_it <span class="sy1">&lt;</span> COUNT; x_it<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>x_i <span class="sy1">=</span> <span class="nu0">0</span>; x_i <span class="sy1">&lt;</span> <span class="nu0">3</span>; x_i<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t1 <span class="sy1">=</span> rdtsc<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t2 <span class="sy1">=</span> rdtsc<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; overhead<span class="br0">&#91;</span>x_it<span class="br0">&#93;</span> <span class="sy1">=</span> t2 <span class="sy2">-</span> t1;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; s <span class="sy1">=</span> rdtsc<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// CODE START</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// standard loop</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; asm<span class="br0">&#40;</span><span class="st0">&quot;nop&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>i <span class="sy1">=</span> <span class="nu0">0</span>; i <span class="sy1">&lt;</span> iterations; i<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; z <span class="sy1">=</span> x <span class="sy2">+</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy1">=</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y <span class="sy1">=</span> z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; values<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy1">=</span> z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; asm<span class="br0">&#40;</span><span class="st0">&quot;nop&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// CODE END</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; f <span class="sy1">=</span> rdtsc<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// reset locals values</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; y <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; clocks<span class="br0">&#91;</span>x_it<span class="br0">&#93;</span> <span class="sy1">=</span> <span class="br0">&#40;</span>f <span class="sy2">-</span> s<span class="br0">&#41;</span> <span class="sy2">-</span> overhead<span class="br0">&#91;</span>x_it<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>i <span class="sy1">=</span> <span class="nu0">0</span>; i <span class="sy1">&lt;</span> iterations; i<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> values<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __int64 overhead<span class="br0">&#91;</span>COUNT<span class="br0">&#93;</span>, clocks<span class="br0">&#91;</span>COUNT<span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// run test</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; tester<span class="br0">&#40;</span>overhead, clocks<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// print results</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">0</span>; i <span class="sy1">&lt;</span> COUNT; i<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Overhead:&quot;</span> <span class="sy1">&lt;&lt;</span> overhead<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;<span class="es0">\t</span>Clocks: &quot;</span> <span class="sy1">&lt;&lt;</span> clocks<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy1">&lt;&lt;</span> endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="kw2">EXIT_SUCCESS</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The basic idea is we define a number for how many tests to perform, then loop over the code this many times. On each iteration we call our inline rdtsc() routine which is written in assembly. It&#8217;s important to note that with modern processors we need to serialize the instruction stream (via CPUID), as well as issue clobbers for the effected registers from the CPUID call. We&#8217;ll also measure the overhead of calling CPUID and subtract this from the final result. In the end this routine allow us to get a good feel for how many CPU clocks our code consumed.</p>
<p>Finally, as a general point of interest, context switches present in all modern operating systems can and will effect the clock count of very large functions. Thus, in our case we make sure to only benchmark small sections of code. </p>
<p>With our counting routine ready for action the first thing I wanted to look at was the base performance. Running through the first 8 iterations shows:</p>
<p>Overhead:440	Clocks: 363<br />
Overhead:440	Clocks: 286<br />
Overhead:440	Clocks: 407<br />
Overhead:440	Clocks: 308<br />
Overhead:440	Clocks: 286<br />
Overhead:440	Clocks: 286<br />
Overhead:440	Clocks: 286<br />
Overhead:440	Clocks: 286</p>
<p>In other words, after a cache warm up period we stabilize at 286 cycles. </p>
<p>We&#8217;ll then add the -O2 optimization flag to the compiler directives (in NetBeans, open your projects options page and select the C++ Compiler options &gt; Additional Options) and see what we get:</p>
<p>Overhead:429	Clocks: 121<br />
Overhead:429	Clocks: 99<br />
Overhead:429	Clocks: 66<br />
Overhead:429	Clocks: 55<br />
Overhead:429	Clocks: 66<br />
Overhead:429	Clocks: 55<br />
Overhead:429	Clocks: 66<br />
Overhead:429	Clocks: 66</p>
<p>To make sense of this we&#8217;ll check out the assembly for each:</p>
<p>First, the unoptimized version:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp;movl $<span class="nu0">0</span>, <span class="nu0">-40</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">jmp</span> .L7</div>
</li>
<li class="li1">
<div class="de1">.L8:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq <span class="nu0">-88</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq <span class="nu0">-80</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %rdx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;leaq <span class="br0">&#40;</span>%rdx,%rax<span class="br0">&#41;</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rax, <span class="nu0">-96</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq <span class="nu0">-88</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rax, <span class="nu0">-80</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq <span class="nu0">-96</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rax, <span class="nu0">-88</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movl <span class="nu0">-40</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %<span class="kw3">edx</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq <span class="nu0">-112</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movslq %<span class="kw3">edx</span>,%rdx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq <span class="nu0">-96</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %rcx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rcx, <span class="br0">&#40;</span>%rax,%rdx,<span class="nu0">8</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;addl $<span class="nu0">1</span>, <span class="nu0">-40</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">.L7:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movl <span class="nu0">-40</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;cmpl <span class="nu0">-36</span><span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>, %<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">setl</span> %<span class="kw3">al</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;testb %<span class="kw3">al</span>, %<span class="kw3">al</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">jne</span> .L8</div>
</li>
</ol>
</div>
<p>And the -O2 optimized version:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp;xorl %<span class="kw3">eax</span>, %<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movl $<span class="nu0">1</span>, %<span class="kw3">edx</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movl $<span class="nu0">1</span>, %<span class="kw3">ebx</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;.p2align <span class="nu0">4</span>,,<span class="nu0">10</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;.p2align <span class="nu0">3</span></div>
</li>
<li class="li1">
<div class="de1">.L6:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;leaq <span class="br0">&#40;</span>%rdx,%rbx<span class="br0">&#41;</span>, %rcx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rdx, %rbx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rcx, <span class="br0">&#40;</span>%r12,%rax<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;addq $<span class="nu0">8</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rcx, %rdx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;cmpq $<span class="nu0">80</span>, %rax</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">jne</span> .L6</div>
</li>
</ol>
</div>
<p>The first thing that jumps out is the loop counting&#8211;whereas in the unoptimized version we count using the 16-bit registers against main memory, the optimized version adds &#8216;logic&#8217; to the process, using cmpq to check an immediate value from a register (%rax).</p>
<p>This explains some of the speedup, but not all. The get to bottom of why the optimized code is so much smaller (faster) we can take a huge hint from the number of raw instructions, of which the optimized code of course has far fewer.</p>
<p>Part of this is a side-effect of the 64-bit architecture we&#8217;re compiling too, as %rdx and %rbx are leaq&#8217;d to %rcx to produce code which stores loop values in registers at all times, as opposed to the unoptimized code which continually pushes values to the call stack. This eliminates almost all of the movq&#8217;s which certainly helps, but far more importantly, we no longer access main memory.</p>
<p>All that said, it <em>still </em>doesn&#8217;t explain everything in terms of raw performance. </p>
<p>The big hint comes from recompiling the application to use only 4 Fibonacci loops. It&#8217;s a bit hard to see, so I&#8217;ve added an intermediate asm(&#8220;nop&#8221;) in the loop so it becomes clear: </p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">#NO_APP</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq $<span class="nu0">2</span>, <span class="br0">&#40;</span>%r12<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">#APP</div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">72</span> <span class="st0">&quot;main.cpp&quot;</span> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">nop</span></div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">0</span> <span class="st0">&quot;&quot;</span> <span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1">#NO_APP</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq $<span class="nu0">3</span>, <span class="nu0">8</span><span class="br0">&#40;</span>%r12<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">#APP</div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">72</span> <span class="st0">&quot;main.cpp&quot;</span> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">nop</span></div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">0</span> <span class="st0">&quot;&quot;</span> <span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1">#NO_APP</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq $<span class="nu0">5</span>, <span class="nu0">16</span><span class="br0">&#40;</span>%r12<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">#APP</div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">72</span> <span class="st0">&quot;main.cpp&quot;</span> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">nop</span></div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">0</span> <span class="st0">&quot;&quot;</span> <span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1">#NO_APP</div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq $<span class="nu0">8</span>, <span class="nu0">24</span><span class="br0">&#40;</span>%r12<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">#APP</div>
</li>
</ol>
</div>
<p>gcc has unrolled the loop for us. Of course we only have so many registers, so one more loop to make 5 means we lose the unroll, and we&#8217;re back to standard loop code.</p>
<p>This is related to another important rule -O2 brings to the mix, which is if we remove the call to save our values in <em>values[n]</em>, -O2 literally removes our code from the final assembly file:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">for</span><span class="br0">&#40;</span>i <span class="sy1">=</span> <span class="nu0">0</span>; i <span class="sy1">&lt;</span> iterations; i<span class="sy2">++</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; z <span class="sy1">=</span> x <span class="sy2">+</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x <span class="sy1">=</span> y;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y <span class="sy1">=</span> z;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//values[i] = z;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Generates:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1"># <span class="nu0">67</span> <span class="st0">&quot;main.cpp&quot;</span> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">nop</span></div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">0</span> <span class="st0">&quot;&quot;</span> <span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1"># <span class="nu0">74</span> <span class="st0">&quot;main.cpp&quot;</span> <span class="nu0">1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">nop</span></div>
</li>
</ol>
</div>
<p>If however, we add a: cout << y; call after our loop, we generate:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp;xorl %<span class="kw3">eax</span>, %<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;.p2align <span class="nu0">4</span>,,<span class="nu0">10</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;.p2align <span class="nu0">3</span></div>
</li>
<li class="li1">
<div class="de1">.L6:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;leaq <span class="br0">&#40;</span>%rsi,%rdi<span class="br0">&#41;</span>, %rdx</div>
</li>
<li class="li1">
<div class="de1">&nbsp;addl $<span class="nu0">1</span>, %<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rsi, %rdi</div>
</li>
<li class="li1">
<div class="de1">&nbsp;cmpl $<span class="nu0">10</span>, %<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;movq %rdx, %rsi</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">jne</span> .L6</div>
</li>
</ol>
</div>
<p>In other words, the secret to the speed-up is in -O2 mode gcc adds just enough code to get the correct result, but nothing more. We&#8217;ll see this time and again when using optimizations, gcc stripping away the fat and making intelligent decisions based on your actual code, as opposed to blindly creating assembly that fits the most general scenario.</p>
<p>That said, nothings stopping us from rewriting the code using hand-crafted assembly to match the -O2 version, though with -O2 being 3 characters away, one could ask why bother&#8230;though we will anyway in the next post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/07/c-performance-counting-clocks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ 64-bit Inline Assembly Primer – Part 2</title>
		<link>http://www.formboss.net/blog/2010/07/c-64-bit-inline-assembly-primer-%e2%80%93-part-2/</link>
		<comments>http://www.formboss.net/blog/2010/07/c-64-bit-inline-assembly-primer-%e2%80%93-part-2/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 04:25:43 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[64-bit assembly]]></category>
		<category><![CDATA[assembly]]></category>
		<category><![CDATA[c++]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=541</guid>
		<description><![CDATA[In this series we examine the relationship and implementations of C++ and raw assembly code. In this post we create our own add function in gcc extended assembly.
In the previous post we wrote a short C++ program that loaded two numbers. Despite its simplicity in C++, we saw how the assembly version was comprised of [...]]]></description>
			<content:encoded><![CDATA[<p>In this series we examine the relationship and implementations of C++ and raw assembly code. In this post we create our own add function in gcc extended assembly.</p>
<p>In the previous post we wrote a short C++ program that loaded two numbers. Despite its simplicity in C++, we saw how the assembly version was comprised of several dozen individual instructions in a rather cryptic format. Much of this complexity stems from the fact that in our sample program we called a function to perform our addition. Calling functions means dealing with a stack, base pointers, and the setup and maintenance of that stack. It means dealing with memory offsets, relative positions, and several other factors. The good news is that at this point we can safely ignore these details. In fact, we will do well to ignore them and focus on just the core competencies of function implementation code. In other words, we&#8217;ll let gcc create the function shells, calls, and stack management, we&#8217;ll focus on the core logic.</p>
<p><span id="more-541"></span></p>
<p>The general idea is that we want to write assembly that adds two numbers together. There is a direct assembly instruction for doing so, <strong>add</strong>, and in this post we&#8217;ll implement it.</p>
<p>One of the key things to remember about writing assembly is that we&#8217;re dealing with very few abstractions. In C++:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1"><span class="kw4">int</span> t <span class="sy1">=</span> <span class="nu0">10</span>;</div>
</li>
</ol>
</div>
<p>Has a very specific meaning, but its <em>true</em> meaning to the machine it runs on is hidden. It&#8217;s only after gcc compiles the code that int, t, and 10 mean anything to the processor. In assembly we free ourselves from these abstractions and deal with the very direct process of moving bits around.</p>
<p>Thus, our first step in writing assembly to add two numbers is to realize that the add instruction we&#8217;ll be using expects two parameters, neither of which can be memory locations. They can however, be registers. Thus, our first steps in code must be to load two registers with the values we want to add.</p>
<p>To load a value into a register we use the <strong>mov</strong> instruction, which for us in AT&#038;T syntax takes the form of:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">mov</span> $0&#215;2, %%rax<span class="co1">;</span></div>
</li>
</ol>
</div>
<p>This moves the immediate value (2) into the %rax register. Please keep in mind %rax is a 64-bit register, it would be %eax on 32-bit systems.</p>
<p>We then push our second number:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">mov</span> $0&#215;1, %%rcx<span class="co1">;</span></div>
</li>
</ol>
</div>
<p>And finally, call the add instruction, passing in our two registers:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">add</span> %%rcx, %%rax<span class="co1">;</span></div>
</li>
</ol>
</div>
<p>The whole function in extended assembly looks like:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;mov $0&#215;2, %%rax; &nbsp; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;mov $0&#215;1, %%rcx; &nbsp; &nbsp; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;add %%rcx, %%rax; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :<span class="st0">&quot;rax&quot;</span>, <span class="st0">&quot;rcx&quot;</span><span class="br0">&#41;</span><span class="co1">;</span></div>
</li>
</ol>
</div>
<p>Should we run this in our IDE, we would watch the rax and rcx register&#8217;s end up with 0&#215;1 and 0&#215;3, respectively. </p>
<p>Thing is, this is not a very useful construct, as immediate values means we&#8217;ve hard coded the return in by default. It&#8217;s much more realistic to accept parameters.</p>
<p>To do so, we take advantage of gcc extended syntax like so:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> rax = <span class="nu0">2</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> rcx = <span class="nu0">1</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cout &lt;&lt; <span class="st0">&quot;(rax) before: &quot;</span> &lt;&lt; rax &lt;&lt; endl<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;mov %1, %%rax; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;mov %2, %%rcx; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;add %%rcx, %0; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : <span class="st0">&quot;=m&quot;</span> <span class="br0">&#40;</span>rax<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : <span class="st0">&quot;m&quot;</span> <span class="br0">&#40;</span>rax<span class="br0">&#41;</span>, <span class="st0">&quot;m&quot;</span> <span class="br0">&#40;</span>rcx<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :<span class="st0">&quot;rax&quot;</span>, <span class="st0">&quot;rcx&quot;</span><span class="br0">&#41;</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cout &lt;&lt; <span class="st0">&quot;(rax) after: &quot;</span> &lt;&lt; rax &lt;&lt; endl<span class="co1">;</span></div>
</li>
</ol>
</div>
<p>Will output:</p>
<div class="geshi no ini">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>rax<span class="br0">&#41;</span> before: <span class="nu0">2</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>rax<span class="br0">&#41;</span> after: <span class="nu0">3</span></div>
</li>
<li class="li1">
<div class="de1">Press <span class="re0"><span class="br0">&#91;</span>Enter<span class="br0">&#93;</span></span> to close the terminal &#8230;</div>
</li>
</ol>
</div>
<p>While we now have plenty of control over implementation, it&#8217;s still a bit heavy on syntax. Thus, we can further optimize by letting gcc have full control over register assignment:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> rax = <span class="nu0">2</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> rcx = <span class="nu0">1</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cout &lt;&lt; <span class="st0">&quot;(rax) before: &quot;</span> &lt;&lt; rax &lt;&lt; endl<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;add %2, %0; &nbsp;\n\t&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : <span class="st0">&quot;=r&quot;</span> <span class="br0">&#40;</span>rax<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : <span class="st0">&quot;r&quot;</span> <span class="br0">&#40;</span>rax<span class="br0">&#41;</span>, <span class="st0">&quot;r&quot;</span> <span class="br0">&#40;</span>rcx<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :<span class="br0">&#41;</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cout &lt;&lt; <span class="st0">&quot;(rax) after: &quot;</span> &lt;&lt; rax &lt;&lt; endl<span class="co1">;</span></div>
</li>
</ol>
</div>
<p>Here we let gcc decide which registers to use, which leads to slightly faster code generation, but we may lose the exacting control we need.</p>
<p>At this point we now have a functioning addition routine. Of course we already know it&#8217;s not the most efficient, as we could/should be using lea. This is because while our actual hand-written assembly is shorter, we still need to place values in registers and use the two-step addition instruction.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/07/c-64-bit-inline-assembly-primer-%e2%80%93-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ 64-bit Inline Assembly Primer &#8211; Part 1</title>
		<link>http://www.formboss.net/blog/2010/06/c-64bit-inline-assembly-primer-part-1/</link>
		<comments>http://www.formboss.net/blog/2010/06/c-64bit-inline-assembly-primer-part-1/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 05:19:14 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[assembler c++]]></category>
		<category><![CDATA[assembly]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=517</guid>
		<description><![CDATA[We can talk directly to our machines in C++ by inserting assembly code via the asm() or extended assembly __asm__ commands.
Doing so allows us to exploit potential performance gains, learn more about our machines, and is in all cases, a fascinating exercise in the lowest level of computer programming.
In this post I want to share [...]]]></description>
			<content:encoded><![CDATA[<p>We can talk directly to our machines in C++ by inserting assembly code via the asm() or extended assembly __asm__ commands.</p>
<p>Doing so allows us to exploit potential performance gains, learn more about our machines, and is in all cases, a fascinating exercise in the lowest level of computer programming.</p>
<p>In this post I want to share a few tips and tricks I&#8217;ve learned when using AT&amp;T style syntax on Linux/gcc, and also explain how basic assembly coding works. We&#8217;ll start by creating a simple function and checking out the gcc created assembly code. We&#8217;ll then take this apart and step through the code to understand how it works.</p>
<p><span id="more-517"></span></p>
<p>To start then, the first thing to do is look at what a basic function call looks like to gcc in assembly. The function we&#8217;ll use is as simple as it gets:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">void <span class="kw1">add</span><span class="br0">&#40;</span><span class="kw1">int</span> a, <span class="kw1">int</span> b<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> z<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; z = a + b<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">add</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">2</span><span class="br0">&#41;</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; return <span class="nu0">0</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>In Netbeans or your favorite IDE, set a breakpoint @ add(1,2). Now run the code in debugging mode and open the : Window > Debugging > Disassembly mode.</p>
<p>We should see something similar too:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">! &nbsp; &nbsp;<span class="kw1">add</span><span class="br0">&#40;</span><span class="nu0">1</span>,<span class="nu0">2</span><span class="br0">&#41;</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">main<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">main<span class="nu0">+33</span>: <span class="kw1">mov</span> &nbsp; &nbsp;$0&#215;2,%<span class="kw3">esi</span></div>
</li>
<li class="li1">
<div class="de1">main<span class="nu0">+38</span>: <span class="kw1">mov</span> &nbsp; &nbsp;$0&#215;1,%<span class="kw3">edi</span></div>
</li>
<li class="li1">
<div class="de1">main<span class="nu0">+43</span>: callq &nbsp;0&#215;40076f &lt;_Z3addii&gt;</div>
</li>
</ol>
</div>
<p>+33 and +38 push our parameters to the esi and edi registers. +43 calls the callq function which will jump us to the function (and also preps the stack). When we single step a few places, the disassembly window will change to that functions code and show:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">!<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">_Z3addii<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">_Z3addii<span class="nu0">+0</span>: <span class="kw1">push</span> &nbsp; %rbp</div>
</li>
<li class="li1">
<div class="de1">_Z3addii<span class="nu0">+1</span>: <span class="kw1">mov</span> &nbsp; &nbsp;%rsp,%rbp</div>
</li>
<li class="li1">
<div class="de1">_Z3addii<span class="nu0">+4</span>: <span class="kw1">mov</span> &nbsp; &nbsp;%<span class="kw3">edi</span>,-0&#215;14<span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">_Z3addii<span class="nu0">+7</span>: <span class="kw1">mov</span> &nbsp; &nbsp;%<span class="kw3">esi</span>,-0&#215;18<span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">! &nbsp; &nbsp;<span class="kw1">int</span> z<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">! &nbsp; &nbsp;z = a + b<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">_Z3addii<span class="nu0">+10</span>: <span class="kw1">mov</span> &nbsp; &nbsp;-0&#215;18<span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>,%<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">_Z3addii<span class="nu0">+13</span>: <span class="kw1">mov</span> &nbsp; &nbsp;-0&#215;14<span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>,%<span class="kw3">edx</span></div>
</li>
<li class="li1">
<div class="de1">_Z3addii<span class="nu0">+16</span>: <span class="kw1">lea</span> &nbsp; &nbsp;<span class="br0">&#40;</span>%rdx,%rax,<span class="nu0">1</span><span class="br0">&#41;</span>,%<span class="kw3">eax</span></div>
</li>
<li class="li1">
<div class="de1">_Z3addii<span class="nu0">+19</span>: <span class="kw1">mov</span> &nbsp; &nbsp;%<span class="kw3">eax</span>,-0&#215;4<span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">!<span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The code reads as follows: we set up the base pointer and stack in +0 and +1. In +4 and +7 we take the two values placed into the esi and edi registers in the main() function and push them onto the stack relative to the base pointer (rbp). As these are ints, they are 4 bytes &#8216;apart&#8217;.</p>
<p>This is where things get a bit interesting. As we are dealing with x86-64 we have to remember that rax and eax are related, in that eax holds the lower 32 bits of rax&#8217;s full value (in x86-64 it&#8217;s helpful to note that any register with a Rxx is 64-bit, Exx denotes 32-bit). Thus, you&#8217;ll notice that in +16 we&#8217;re using two 64-bit registers to perform the addition via lea using rdx (the so-called &#8216;third&#8217; argument register), and rax.</p>
<p>How did values get into rax and rdx? This is a valid question, as in +10 and +13 we spend cycles pushing our variables into eax and edx (edx is a general purpose register), Why do this when we do not use them anyway?</p>
<p>To understand this, it helps to know that a) this is non-optimized code, and b) there is a very specific method to how parameters should be passed, and reading this <a href="http://www.x86-64.org/documentation/abi.pdf">helps explain  why things work the way they do!</a>  (see p. 17). We go into greater detail on this topic in the next post.</p>
<p>At this point we&#8217;re ready to perform our addition. However, we do so using lightly optimized assembly code via the lea instruction (Load Effective Address). The assembly we&#8217;ll write in the next post will be different, but it&#8217;s helpful to understand how this lea call works. </p>
<p>Just as in C++ we can use the address of operator to grab the address of a variable, we use the lea instruction to do the same in assembly. </p>
<p>This bit of code demonstrates:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">#include &lt;stdlib.h&gt;</div>
</li>
<li class="li1">
<div class="de1">#include &lt;iostream&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">using namespace <span class="kw1">std</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> m = <span class="nu0">5</span><span class="co1">; &nbsp; &nbsp;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> *g<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__ __volatile__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;lea %1, %0; &nbsp; &nbsp; &nbsp; \n&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :<span class="st0">&quot;=p&quot;</span> <span class="br0">&#40;</span>g<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :<span class="st0">&quot;m&quot;</span> <span class="br0">&#40;</span>m<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :<span class="st0">&quot;memory&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cout &lt;&lt; <span class="st0">&quot;Address of m: \t&quot;</span> &lt;&lt; &amp;m &lt;&lt; endl<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cout &lt;&lt; <span class="st0">&quot;Result of lea: \t&quot;</span> &lt;&lt; g &lt;&lt; endl<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; return <span class="nu0">0</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The output from this program is:</p>
<div class="geshi no ini">
<ol>
<li class="li1">
<div class="de1">Address of m: &nbsp;0&#215;7fff5c9f5344</div>
</li>
<li class="li1">
<div class="de1">Result of lea: &nbsp;0&#215;7fff5c9f5344</div>
</li>
<li class="li1">
<div class="de1">Press <span class="re0"><span class="br0">&#91;</span>Enter<span class="br0">&#93;</span></span> to close the terminal &#8230;</div>
</li>
</ol>
</div>
<p>In other words, lea loads the address of m and stores it in g. A quick check of &#038;m shows the values match, as we would expect.</p>
<p>So how does this relate to adding? The purpose of lea is to load memory addresses, and as part of that duty it can calculate offsets. Thus, we exploit this adding behavior by, instead of passing memory values, passing raw values (though still via registers). It will then sum these registers and place the result into a destination register. As this  completes in one instruction, we effectively get the addition and move in one cycle&#8211;a savings over the mov + add instruction combination. In short, it&#8217;s a simple and elegant optimization gcc performs for us.</p>
<p>The following code shows this technique deliberately used:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">int</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> m = <span class="nu0">5</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> mx = <span class="nu0">12</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">int</span> g<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; __asm__ __volatile__<span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;leal (%2, %1, 1), %0; &nbsp; &nbsp; &nbsp; \n&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :<span class="st0">&quot;=r&quot;</span> <span class="br0">&#40;</span>g<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :<span class="st0">&quot;r&quot;</span> <span class="br0">&#40;</span>m<span class="br0">&#41;</span>, <span class="st0">&quot;r&quot;</span> <span class="br0">&#40;</span>mx<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :<span class="st0">&quot;memory&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cout &lt;&lt; <span class="st0">&quot;Addition=&quot;</span> &lt;&lt; g &lt;&lt; endl<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; return <span class="nu0">0</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>We could have also exchanged the second parameter &#8220;r&#8221; with a direct value (2), instead of the mx constraint, which would add 5+2, for example.</p>
<p>Further, as you may suspect, the C++ <em>address of</em> operator (&#038;) makes direct use of lea. Consider:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> test <span class="sy1">=</span> <span class="nu0">10</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> <span class="sy2">*</span>p_test <span class="sy1">=</span> <span class="sy3">&amp;</span>test;</div>
</li>
</ol>
</div>
<p>Which in assembly appears as:</p>
<div class="geshi no asm">
<ol>
<li class="li1">
<div class="de1">! &nbsp; &nbsp;<span class="kw1">int</span> <span class="kw1">test</span> = <span class="nu0">10</span><span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">main<span class="nu0">+105</span>: movl &nbsp; $0xa,-0&#215;28<span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">! &nbsp; &nbsp;<span class="kw1">int</span> *p_test = &amp;test<span class="co1">;</span></div>
</li>
<li class="li1">
<div class="de1">main<span class="nu0">+112</span>: <span class="kw1">lea</span> &nbsp; &nbsp;-0&#215;28<span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span>,%rax</div>
</li>
<li class="li1">
<div class="de1">main<span class="nu0">+116</span>: <span class="kw1">mov</span> &nbsp; &nbsp;%rax,-0&#215;68<span class="br0">&#40;</span>%rbp<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Here we see lea in a more &#8216;natural&#8217; state, loading the effective address of our variable and stashing it into %rax. It&#8217;s important to note that in +112, the -0&#215;28 is an offset, and the parenthesis indicate a memory location.</p>
<p>**<em> It should be said at this point that while we instinctively know that C++ and raw assembly are intertwined, it&#8217;s fun and instructive to see how concepts we&#8217;ve learned in C++ manifest themselves in assembly. </em>**</p>
<p>With that done we assign the value of the addition to our variable in +19, then call leave and ret to clean up the stacks and return to the calling function (main).</p>
<p>That&#8217;s it for now. In the next post we&#8217;ll implement our own add function, and instead of throwing assembly code out rapid style, actually explain it in greater detail.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/06/c-64bit-inline-assembly-primer-part-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Five Times 2 &#8211; HTML 5 For Safari 5</title>
		<link>http://www.formboss.net/blog/2010/06/five-times-2-html-5-for-safari-5/</link>
		<comments>http://www.formboss.net/blog/2010/06/five-times-2-html-5-for-safari-5/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 02:21:20 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[HTML 5]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=458</guid>
		<description><![CDATA[Apple released Safari 5 on June 9th, the fastest and most advanced browser from Apple yet. It&#8217;s loaded with new features and enhancements, and from a cursory look, this is an intriguing release indeed.
Thing is though, if your a non-techie all this talk of HTML 5 probably makes you say &#8220;Wah?&#8221; &#8212; While  those of [...]]]></description>
			<content:encoded><![CDATA[<p>Apple released Safari 5 on June 9th, the fastest and most advanced browser from Apple yet. It&#8217;s loaded with new features and enhancements, and from a <a title="Safari 5 Features" href="http://www.apple.com/safari/whats-new.html" target="_blank">cursory look</a>, this is an intriguing release indeed.</p>
<p>Thing is though, if your a non-techie all this talk of HTML 5 probably makes you say &#8220;Wah?&#8221; &#8212; While  those of us in the development community are left wondering when we&#8217;ll get to implement this cool stuff as the giant elephant in the room <a title="IE" href="http://www.microsoft.com/windows/internet-explorer/default.aspx" target="_blank">sits docilely in the corner</a>.</p>
<p>It&#8217;s a confusing release really, filled with more promise and hope than tangible benefit&#8211;or is it?</p>
<p><span id="more-458"></span></p>
<p>As a guy who runs a web software company I thought I&#8217;d share my quick thoughts on Safari 5 and provide some links to learn more.</p>
<h2>HTML 5</h2>
<p><strong>HTML5 AJAX History</strong></p>
<p>This is an interesting one in that it&#8217;s a feature in need of a web infrastructure to support it&#8211;or at least if I understand the feature correctly. I assume this is a system for storing application state, but I haven&#8217;t had much luck finding out for sure. Regardless, it&#8217;s interesting to me as someone who wrote a <a title="Mariner" href="http://www.floridamariner.com" target="_blank">full AJAX based web site</a> that utilizes AJAX history state saving. It was done using a script called <a title="Real Simple History" href="http://code.google.com/p/reallysimplehistory/" target="_blank">Real Simple History</a>, and was as you would expect, a direct answer to the annoyances of losing your save state if the user hit the back, reload, or forward button. It works well enough, but just as with HTML Draggables, would be nice to have built in.</p>
<p><strong>HTML5 forms validation</strong></p>
<p>Sorry, not too informative, but I did find <a title="HTML 5 Form Validation" href="http://stackoverflow.com/questions/432933/will-html-5-validation-be-worth-the-candle" target="_blank">this link</a> which describes more on this topic.</p>
<p><strong>WebSocket</strong></p>
<p>I like to think of this as a extension of the HTTP Request object introduced in IE 5 way back in &#8216;99. The basic idea is that we can open a direct link to a server on what&#8217;s called a Full Duplex channel (e.g. your telephone), which allows simultaneous two-way communication.</p>
<p><a title="PHP Web Socket" href="http://code.google.com/p/phpwebsocket/" target="_blank">http://code.google.com/p/phpwebsocket/</a></p>
<p>What is this good for? Chat logs I suppose, but it may lead to more advanced types of form validation&#8230;</p>
<p><strong>Web workers</strong></p>
<p>I&#8217;ve actually covered these guys in <a title="Web Workers" href="../2010/05/multi-threaded-javascript-a-quick-look/" target="_blank">another post</a> on this blog, but the basic idea is  that web can run concurrent JavaScript code to speed up execution. Now  Safari 4 already supported Web Workers, though with a reduced  feature-set as compared to FireFox. So the real question is, have they  been enhanced in any appreciable way? I&#8217;ll have to test the feature set in a future post, but for now, here&#8217;s a quick look at performance between FireFox 3.6.3 and Safari 5:</p>
<p><em>Firefox 3.6.3:</em></p>
<p><span style="color: #808000;">Fibonacci Set 1 Time Taken: 1.16</span></p>
<p><em>Safari 5 (initial release)</em></p>
<p><span style="color: #808000;">Fibonacci Set 1 Time Taken: 0.2</span></p>
<p>Of course this is the horrible inefficient stack smashing way, the optimised iterative version favors FireFox slightly:</p>
<p><em>Firefox 3.6.3:</em></p>
<p><span style="color: #808000;">Fibonacci Set 1 Time Taken: 1.08</span></p>
<p><em>Safari 5:</em></p>
<p><span style="color: #808000;">Fibonacci Set 1 Time Taken: 1.52</span></p>
<p><strong>HTML5 draggable attribute</strong></p>
<p>This is an interesting one, if for no other reason than here we have another Microsoft originated API from IE 5!</p>
<p>http://html5doctor.com/native-drag-and-drop/</p>
<p>As far as it&#8217;s integration into web applications&#8211;I think the greatest benefit of a native API to handle drag and drop will be from a performance perspective. Right now in FormBoss, for example, dragging multiple items isn&#8217;t as precise as I would like it to be. This is not necessarily a performance problem, but a native method should mean we can sample more efficiently during the drag operation, which should help smooth things out and improve precision.</p>
<p>Their is more to it of course, to which I simply defer to: <a title="HTML 5 Doctor" href="http://html5doctor.com/" target="_blank">http://html5doctor.com</a></p>
<h2>Developer Tools and Closing Comments</h2>
<p>The last thing I want to look at is the all-important subject of Safari 5 as a developer friendly release.</p>
<p>FireBug simply rules them all&#8211;this has been, and most likely will continue to be, the clarion call for all serious web developers. Yet in the recent years it seems as if inline JavaScript debugging is becoming the norm, not the exception. IE8 has a debugger, Chrome, and of course Safari.</p>
<p>Problem is, they&#8217;ve always fallen <em>well </em>short of Firebug for one simple reason: FireBug is about more than just debugging, it&#8217;s about the DOM too. Without a good way of viewing the DOM a debugger is nearly useless for complex work. To be clear, by DOM I mean the <em>entire DOM</em><em> starting from the window </em>element, not just the visible page bits from the <em>HTML </em>element on down. FormBoss, like most web applications, makes extensive use of the root DOM object to store objects and arrays.</p>
<p>The strange thing is Safari will gladly show you the <em>window </em>element if you open the Console and type:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">eval</span> <span class="br0">&#40;</span>window<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>&#8230;but not from the comfort of the main debugger, or even from a separate DOM tab.</p>
<p>Unfortunately, while the developer tools in Safari 5 seem very slick, they do not address the DOM viewing issue, and they also seem to be a touch unstable. While viewing the property of a paused debugging session the entire browser crashed. I&#8217;ve had FireFox get twitchy, but not outright crash.</p>
<p>That said, the tools are slick, as I said. Syntax coloring is very nice to see, as is the clean and intuitive user interface. Now if they could only add a <em>proper </em>DOM inspector!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/06/five-times-2-html-5-for-safari-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porting to the Qt C++ Framework :: Part 4</title>
		<link>http://www.formboss.net/blog/2010/06/porting-to-the-qt-c-framework-part-4/</link>
		<comments>http://www.formboss.net/blog/2010/06/porting-to-the-qt-c-framework-part-4/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 01:45:48 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=329</guid>
		<description><![CDATA[Having created a shell of our app in step 2, porting the image cleaner code in step 3, we&#8217;re now at the stage where we can to port our command line XML cleaner code to Qt. At the end of this post we&#8217;ll have a fully functioning C++ Qt app.

The Original &#8216;Command Line&#8217; Code



&#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Having created a shell of our app in step 2, porting the image cleaner code in step 3, we&#8217;re now at the stage where we can to port our command line XML cleaner code to Qt. At the end of this post we&#8217;ll have a fully functioning C++ Qt app.</p>
<p><span id="more-329"></span></p>
<h2>The Original &#8216;Command Line&#8217; Code</h2>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// xml files</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; std<span class="sy4">::</span><span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Starting file clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; string fileData;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; d <span class="sy1">=</span> opendir<span class="br0">&#40;</span>storyPath.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>d<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// low memory, no parallelization</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy1">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy3">!</span><span class="sy1">=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name <span class="sy1">=</span> dir<span class="sy2">-</span><span class="sy1">&gt;</span>d_name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; location <span class="sy1">=</span> storyPath <span class="sy2">+</span> <span class="st0">&quot;/&quot;</span> <span class="sy2">+</span> name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>name <span class="sy3">!</span><span class="sy1">=</span> <span class="st0">&quot;.&quot;</span> <span class="sy3">&amp;&amp;</span> name <span class="sy3">!</span><span class="sy1">=</span> <span class="st0">&quot;..&quot;</span> <span class="sy3">&amp;&amp;</span> name <span class="sy3">!</span><span class="sy1">=</span> <span class="st0">&quot;.DS_Store&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// ==&gt; buffer</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// alternative version of buffer &#8211; we lose the</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// BOM issue, but have to create \r\n</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string fileData2;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; string buff;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifstream <span class="kw4">file</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">file</span>.<span class="me1">open</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>getline<span class="br0">&#40;</span><span class="kw4">file</span>, fileData2<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff <span class="sy2">+</span><span class="sy1">=</span> fileData2 <span class="sy2">+</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy1">=</span> buff;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// == remove extra headline data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> hl1Start <span class="sy1">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> hl1End <span class="sy1">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>hl1Start <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span> <span class="sy3">&amp;&amp;</span> hl1End <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy1">=</span> fileData.<span class="me1">substr</span><span class="br0">&#40;</span>hl1Start,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>hl1End <span class="sy2">-</span> hl1Start<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>br<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">5</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>br<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>nl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>nl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData.<span class="me1">replace</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy2">-</span> hl1Start<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// hl1 exists</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// == replace all instances with open p then find</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// the next \r\n and add a </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bodyStart <span class="sy1">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bodyEnd <span class="sy1">=</span> fileData.<span class="me1">find</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> innerp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>bodyStart <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span> <span class="sy3">&amp;&amp;</span> bodyEnd <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy1">=</span> fileData.<span class="me1">substr</span><span class="br0">&#40;</span>bodyStart,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>bodyEnd <span class="sy2">-</span> bodyStart<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>doublebr<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter <span class="sy1">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> matchingP <span class="sy1">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>p, doublebr.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, openp<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy1">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// next \r\n [Mac Uses nl, Windows rn]</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; innerp <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rn, p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>innerp <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>innerp, rn.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy1">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy1">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>doublebr, p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>matchingP <span class="sy1">==</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot;Hanging p&quot;</span> <span class="sy1">&lt;&lt;</span> endl;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">append</span><span class="br0">&#40;</span>closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter<span class="sy2">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData.<span class="me1">replace</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy2">-</span> bodyStart<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// bodyEnd exists</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// save file</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ofstream outfile<span class="br0">&#40;</span><span class="br0">&#40;</span>location <span class="sy2">+</span> <span class="st0">&quot;-debug.xml&quot;</span><span class="br0">&#41;</span>.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ofstream<span class="sy4">::</span><span class="me2">binary</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ofstream outfile<span class="br0">&#40;</span><span class="br0">&#40;</span>location<span class="br0">&#41;</span>.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, ofstream<span class="sy4">::</span><span class="me2">binary</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outfile.<span class="me1">write</span><span class="br0">&#40;</span>fileData.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, fileData.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// while()</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>We perform a couple of distinct steps in this code. First, we open our directory for iteration with:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy1">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy3">!</span><span class="sy1">=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">name <span class="sy1">=</span> dir<span class="sy2">-</span><span class="sy1">&gt;</span>d_name;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span></div>
</li>
</ol>
</div>
<p>And then write the contents of the file into a buffer with:</p>
<div class="geshi no cpp">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// BOM issue, but have to create \r\n</span></div>
</li>
<li class="li1">
<div class="de1">string fileData2;</div>
</li>
<li class="li1">
<div class="de1">string buff;</div>
</li>
<li class="li1">
<div class="de1">ifstream <span class="kw4">file</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">file</span>.<span class="me1">open</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span>getline<span class="br0">&#40;</span><span class="kw4">file</span>, fileData2<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">buff <span class="sy2">+</span><span class="sy1">=</span> fileData2 <span class="sy2">+</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">fileData <span class="sy1">=</span> buff;</div>
</li>
</ol>
</div>
<p>Not too complicated: We use getline() to only get the raw text of a line, to which we then add a \r\n. We do this because part of our task is to recreate proper tags, and it just so happens that so long as we know where our line breaks are, we can do so reliably. Adding our own line break tags means cross-platform differences will be eliminated, plus our p tag code will run exactly as intended.</p>
<p>The remainder of the code removes extra formatting from headline elements, as well as adds p tags in proper order and sequence. Most of this logic, as it turns out, was the same in Qt, though we did have some significant differences in key locations.</p>
<h2>The New Code</h2>
<p>The new code segment is the result of a fair bit of experimentation. The command line version was in fact easier to create, though only because of the higher availability of resources for performing file opening, string manipulation, and file writing in plain old C++.</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanXMLStoryFiles</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">=</span> <span class="st0">&quot;Starting XML File Clean&#8230;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// locals</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> replaceString;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> fileData;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// create buffer for semaphores</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; uint count <span class="sy0">=</span> <span class="kw5">QDir</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;xmlPath<span class="br0">&#41;</span>.<span class="me1">count</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> t <span class="sy0">=</span> <span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>count<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// loop and clean</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;xmlPath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// reset on every turn</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// open file data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> f<span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>f.<span class="me1">open</span><span class="br0">&#40;</span><span class="kw5">QIODevice</span><span class="sy0">::</span><span class="me2">ReadWrite</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QTextStream</span> in<span class="br0">&#40;</span><span class="sy0">&amp;</span>f<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy0">+=</span> in.<span class="me1">readLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span><span class="sy0">!</span>in.<span class="me1">atEnd</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// remove extra headline data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> hl1Start <span class="sy0">=</span> fileData.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> hl1End <span class="sy0">=</span> fileData.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>hl1Start <span class="sy0">!=</span> <span class="nu0">-1</span> <span class="sy0">&amp;&amp;</span> hl1End <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> fileData.<span class="me1">mid</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy0">-</span> hl1Start<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;br, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;rl, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;nl, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData.<span class="me1">replace</span><span class="br0">&#40;</span>hl1Start, <span class="br0">&#40;</span>hl1End <span class="sy0">-</span> hl1Start<span class="br0">&#41;</span>, replaceString<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// hl1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// remove p tags and extra spaces</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bodyStart <span class="sy0">=</span> fileData.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> bodyEnd <span class="sy0">=</span> fileData.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> innerp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> counter <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> p;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>bodyStart <span class="sy0">!=</span> <span class="nu0">-1</span> <span class="sy0">&amp;&amp;</span> bodyEnd <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString <span class="sy0">=</span> fileData.<span class="me1">mid</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy0">-</span> bodyStart<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">indexOf</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;doublebr<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>p, doublebr.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, this<span class="sy0">-</span>&gt;openp<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy0">=</span> <span class="nu0">1</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// next \r\n [Mac Uses nl, Windows rn]</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; innerp <span class="sy0">=</span> replaceString.<span class="me1">indexOf</span><span class="br0">&#40;</span>rn, p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>innerp <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>innerp, rn.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; matchingP <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">indexOf</span><span class="br0">&#40;</span>doublebr, p<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>matchingP <span class="sy0">==</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>Hanging P Found And Fixed<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; replaceString.<span class="me1">append</span><span class="br0">&#40;</span>closep<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// join data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData.<span class="me1">replace</span><span class="br0">&#40;</span>bodyStart, <span class="br0">&#40;</span>bodyEnd <span class="sy0">-</span> bodyStart<span class="br0">&#41;</span>, replaceString<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="co1">// innner p</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// write file</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;.&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&amp;&amp;</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;..&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sy0">&amp;&amp;</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;.DS_Store&quot;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> outPath <span class="sy0">=</span> it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;-new.xml&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> outPath <span class="sy0">=</span> it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> outData<span class="br0">&#40;</span>outPath<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outData.<span class="me1">open</span><span class="br0">&#40;</span><span class="kw5">QFile</span><span class="sy0">::</span><span class="me2">WriteOnly</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QTextStream</span> outFile<span class="br0">&#40;</span><span class="sy0">&amp;</span>outData<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outFile &lt;&lt; fileData;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>XML File Clean Complete.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> this<span class="sy0">-</span>&gt;statusMessage;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Some key points are as follows:</p>
<p>The method used to iterate through a directory:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;xmlPath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>&#8230;feels a bit strange to me, almost as if I&#8217;m missing something. Specifically, the while() statement checks for an empty string if no further files are found. This just seems&#8230;wrong to me, but I could be mistaken. For the record, examples given in Qt help documentation had a flaw of never returning the <em>last</em> element of a directory. For example, if we had four items, only three would be iterated through. The do { } while() was the only way I found to hit all files.</p>
<p>As similar as the core logic is, here&#8217;s where things take a pretty radical departure from the command line version.</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// reset on every turn</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// open file data</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> f<span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>f.<span class="me1">open</span><span class="br0">&#40;</span><span class="kw5">QIODevice</span><span class="sy0">::</span><span class="me2">ReadWrite</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QTextStream</span> in<span class="br0">&#40;</span><span class="sy0">&amp;</span>f<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fileData <span class="sy0">+=</span> in.<span class="me1">readLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">while</span><span class="br0">&#40;</span><span class="sy0">!</span>in.<span class="me1">atEnd</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>In this code we&#8217;re using the handy QTextStream on an address of a QFile object to read each line of text, to which we add the \r\n to, just like the command line version.</p>
<p>We also save a chunk of time here by using REGEX enabled replace method to remove unwanted tags from the headline text:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;br, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;rl, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">replaceString <span class="sy0">=</span> replaceString.<span class="me1">replace</span><span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;nl, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>As you may recall in the old code we used a more complex:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;replaceString.<span class="me1">erase</span><span class="br0">&#40;</span>p, <span class="nu0">2</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; p <span class="sy0">=</span> replaceString.<span class="me1">find</span><span class="br0">&#40;</span>rl<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The last part, the section where we add our properly closed p tags, is largely untouched, save for using <strong>indexOf() </strong>instead of <strong>find()</strong>, as well as using <strong>mid()</strong> to build our temporary string for editing.</p>
<p>The last step was to write the fixed file back to the file system. In the first version we used the rather succinct <strong>ofstream</strong> to do the job, The new version used a more complex series of command as:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#if DEBUG == true</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> outPath <span class="sy0">=</span> it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;-new.xml&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> outPath <span class="sy0">=</span> it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> outData<span class="br0">&#40;</span>outPath<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outData.<span class="me1">open</span><span class="br0">&#40;</span><span class="kw5">QFile</span><span class="sy0">::</span><span class="me2">WriteOnly</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QTextStream</span> outFile<span class="br0">&#40;</span><span class="sy0">&amp;</span>outData<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; outFile &lt;&lt; fileData;</div>
</li>
</ol>
</div>
<p>Of course we may have a more simplistic way of doing this, but I didn&#8217;t find one.</p>
<h2>Closing Thoughts</h2>
<p>The end result of our project is a slick little Qt desktop app that removed the burden of command line operation for its use. However, as nice as this may be for the end-user, as a developer what I was most curious to see was if Qt would stand up to the challenge of being user friendly, powerful, and at the same time, a joy to work with.</p>
<p>Simple answer: It was. Qt is simply brilliant&#8211;I&#8217;m sold, hooked, and thoroughly excited to learn and do more with this library. It&#8217;s all the power and functionality of C++, but wrapped into a cross platform, easy to use deployment platform with powerful tools and solid documentation.</p>
<p>Though of course this is somewhat relative when it comes to porting command line app to a GUI. Our command line app weighed in at 223 lines, Qt: 368. While it was very easy to find examples of file operation for vanilla C++ on the web, it was markedly more difficult for Qt. In fact, as hinted at in the text I&#8217;m still quite unsure of the &#8220;properness&#8221; of this code. It works well enough, but am I missing something?</p>
<p>Do I really need to used a  <strong>QTextStream</strong> to write data, or should I have used the more low-level write() function inherited from <strong>QIODevice</strong>? This question reminds me of the difference in PHP between using:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$content</span> <span class="sy0">=</span> <span class="st0">&quot;Sample&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$res</span> <span class="sy0">=</span> file_put_contents<span class="br0">&#40;</span><span class="re1">$content</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>verses using:</p>
<div class="geshi no php">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$content</span> <span class="sy0">=</span> <span class="st0">&quot;Sample&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$handle</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="st0">&quot;somefile.txt&quot;</span><span class="sy0">,</span> <span class="st0">&quot;wb&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="re1">$res</span> <span class="sy0">=</span> <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re1">$handle</span><span class="sy0">,</span> <span class="re1">$content</span><span class="sy0">,</span> <span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re1">$content</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>In short, one simple step vs. a few more obtuse ones. It&#8217;s by no means wrong, but I can&#8217;t help but wonder&#8230;</p>
<p>Of course it should also be said that this program could use more error and sanity checks if it was to ever be released an a commercial app, but in this case, it&#8217;s just for pedagogical purposes.</p>
<h2>Complete Application Source Download</h2>
<p>Being a Qt app you should be able to run this code (build) on any platform Qt supports.<br />
<a href="http://www.formboss.net/blog/wp-content/uploads/2010/06/cleaner.zip">Download cleaner.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/06/porting-to-the-qt-c-framework-part-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porting to the Qt C++ Framework :: Part 3</title>
		<link>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-3/</link>
		<comments>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-3/#comments</comments>
		<pubDate>Fri, 28 May 2010 05:27:41 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[Porting Code]]></category>
		<category><![CDATA[Qt Framework]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=242</guid>
		<description><![CDATA[In this part of our series we&#8217;ll dive in and start implementing our logic from the command line application to the GUI version.
The goal during this step is to make exclusive use of the Qt frameworks built-in functions and methods for handling these tasks, as the end result must be a cross-platform compatible app.
We&#8217;re already [...]]]></description>
			<content:encoded><![CDATA[<p>In this part of our series we&#8217;ll dive in and start implementing our logic from the command line application to the GUI version.</p>
<p>The goal during this step is to make exclusive use of the Qt frameworks built-in functions and methods for handling these tasks, as the end result must be a cross-platform compatible app.</p>
<p>We&#8217;re already getting a valid directory entry from part 2, so the first step in this part is to figure out how we iterate and query files from our base folder.</p>
<p><span id="more-242"></span></p>
<p>As setup for this task, in the first app (the command line one) we defined a few globals:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// path data</span></div>
</li>
<li class="li1">
<div class="de1">string basePath <span class="sy0">=</span> argv<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">string imagePath <span class="sy0">=</span> basePath <span class="sy0">+</span> <span class="st0">&quot;/images&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">string storyPath <span class="sy0">=</span> basePath <span class="sy0">+</span> <span class="st0">&quot;/stories&quot;</span>;</div>
</li>
</ol>
</div>
<p>We&#8217;ll keep that basic structure, but of course implement them as member private variables. It should be noted that in the new version the &#8216;base&#8217; directory value comes from our Worker constructor with:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">Worker <span class="sy0">*</span>wk <span class="sy0">=</span> <span class="kw3">new</span> Worker<span class="br0">&#40;</span>processPathQLineEdit<span class="sy0">-</span>&gt;text<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>In the worker constructor we then:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co1">// create path items</span></div>
</li>
<li class="li1">
<div class="de1">basePath <span class="sy0">=</span> path;</div>
</li>
<li class="li1">
<div class="de1">imagePath <span class="sy0">=</span> path <span class="sy0">+=</span> <span class="st0">&quot;/images&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">xmlPath <span class="sy0">+=</span> <span class="st0">&quot;/stories&quot;</span>;</div>
</li>
</ol>
</div>
<p>Same thing as the original version really, though one thing I had to check on is if using / will be a problem for Windows. <a title="QDir" href="http://doc.qt.nokia.com/4.6/qdir.html" target="_blank"><em>*Turns out the answer is no.*</em></a></p>
<p>With the setup tasks done notice that in the GUI we have two buttons: The first allows us to select the base folder, the second kicks off the Process Images task. Notice how we do this: in cleaner.enc__cppqt our clicked() SIGNAL of the <em>processButton </em>button is assigned to the processAction slot, which in turn, after creating our Worker instance object, calls cleanImages(). And so we&#8217;re getting an images directory via the GUI&#8211;so far so good!</p>
<p>This brings us to the next big question question: how do we open and iterate over directories?</p>
<h2>Iterator Over Directories</h2>
<p>As you may recall the first task of our program is to remove all files with a _bw_ in the name from the /images sub-folder. It looks like we have: <strong>QDirIterator</strong> and <strong>QDir</strong> to help us perform this duty, with the possibly of others as well. The former seems to be for general access, the latter for iterating&#8211;we want to iterate.</p>
<h3>Basic QDirIterator Implementation</h3>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;imagePath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QString</span> fl <span class="sy0">=</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>fl <span class="sy0">!=</span> <span class="st0">&quot;.&quot;</span> <span class="sy0">&amp;&amp;</span> fl <span class="sy0">!=</span> <span class="st0">&quot;..&quot;</span> <span class="sy0">&amp;&amp;</span> fl <span class="sy0">!=</span> <span class="st0">&quot;./&quot;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">+=</span> it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Pretty strait forward really. Iterator over the directory, making sure to skip the path items.</p>
<p>This takes care of the iteration, now we need to find and remove files that have the _bw_.</p>
<p>In the old code we used:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">while</span><span class="br0">&#40;</span><span class="br0">&#40;</span>dir <span class="sy0">=</span> readdir<span class="br0">&#40;</span>d<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">NULL</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;name <span class="sy0">=</span> dir<span class="sy0">-</span>&gt;d_name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;found <span class="sy0">=</span> name.<span class="me1">rfind</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>found <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;path <span class="sy0">=</span> imagePath;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;location <span class="sy0">=</span> imagePath <span class="sy0">+</span> <span class="st0">&quot;/&quot;</span> <span class="sy0">+</span> name;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw3">cout</span> &lt;&lt; location &lt;&lt; endl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> t <span class="sy0">=</span> <span class="kw3">remove</span><span class="br0">&#40;</span>location.<span class="me1">c_str</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>t <span class="sy0">!=</span> <span class="nu0">-1</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;counter<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>I should step back to mention the first step was to get the file name. In the first attempt we relied on a <strong>struct</strong> returned by <strong>dirent</strong> to store file info for checking, now we have a nice simple fileName() method to call. I&#8217;m not going to lie, the Qt way feels much cleaner than the command line version. <strong>dirent </strong>was tricky to work with at first without having a debugger, this is no longer an issue in Qt. With that out of the way, what of finding the text &#8220;_bw_&#8221;?</p>
<p>I suspected, and was proven right, that QString would have some type of find function. Sure enough:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1">fl.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Beautiful! I can&#8217;t help but show my gratitude over such an elegant and natural thing. Without any documentation look up I was able to basically guess and implement my search function in one line. Yes std::string had the same thing with .find(), but this was a nice treat regardless.</p>
<p>Right, so now how do we delete files?</p>
<p>In the first version we had to use a separate variable (location) and a member function .c_str() to pass to the delete(char*) call. This is fine, but a touch verbose. It would be nice to encapsulate this a bit more.</p>
<h3>Delete File Implementation</h3>
<p>It turns out that we can use the same remove() call, though it wants a char*, we&#8217;ve got a QString. As was the goal anyway, we want to use native solutions for cross-platform consistency. I did some digging and found QFile. QFile has a member function for removing files: <strong>.remove()</strong>. Even better though, QDirIterator has a member function <strong>filePath()</strong> to return the full path to the file (not just file name). Of course I may have missed similar functionality in the first go (such as using QDir), but now we save ourselves the hassle of rebuilding the file path from scratch. The final code is:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanImages</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; this<span class="sy0">-</span>&gt;statusMessage <span class="sy0">=</span> <span class="st0">&quot;Starting Image Clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> ct <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">bool</span> t <span class="sy0">=</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// loop through directory&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;imagePath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QString</span> fl <span class="sy0">=</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>fl.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// remove</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw5">QFile</span> f <span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t <span class="sy0">=</span> f.<span class="kw3">remove</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>t<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ct<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; statusMessage <span class="sy0">+=</span> fl <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> finalCount <span class="sy0">=</span> <span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>ct<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span> &nbsp;<span class="sy0">+</span> finalCount <span class="sy0">+</span> <span class="st0">&quot; Images Removed.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> statusMessage;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Sure it&#8217;s about the same length as the original command line code, if not a bit longer, but it feels more intuitive&#8211;almost like OO PHP coding. I do not however, like the idea of creating a new QFile for each item to remove, but I&#8217;m learning&#8211;I&#8217;m sure we&#8217;ll find a better way in the next few posts.</p>
<h3>Final Method Implementation</h3>
<p>For the sake of completeness, here&#8217;s the final cleanImages() function:</p>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanImages</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">=</span> <span class="st0">&quot;Starting Image Clean&#8230;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">int</span> ct <span class="sy0">=</span> <span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw4">bool</span> t <span class="sy0">=</span> <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// loop through directory&#8230;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QDirIterator</span> it<span class="br0">&#40;</span>this<span class="sy0">-</span>&gt;imagePath, <span class="kw5">QDirIterator</span><span class="sy0">::</span><span class="me2">Subdirectories</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">while</span><span class="br0">&#40;</span>it.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QString</span> fl <span class="sy0">=</span> it.<span class="me1">fileName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>fl.<span class="me1">contains</span><span class="br0">&#40;</span><span class="st0">&quot;_bw_&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">// remove</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QFile</span> f <span class="br0">&#40;</span>it.<span class="me1">filePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;t <span class="sy0">=</span> f.<span class="kw3">remove</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>t<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;ct<span class="sy0">++</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">+=</span> fl <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;it.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw5">QString</span> finalCount <span class="sy0">=</span> <span class="kw5">QString</span><span class="sy0">::</span><span class="me2">number</span><span class="br0">&#40;</span>ct<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;statusMessage <span class="sy0">+=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span> &nbsp;<span class="sy0">+</span> finalCount <span class="sy0">+</span> <span class="st0">&quot; Images Removed.&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">return</span> statusMessage;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Up next, <a href="porting-to-the-qt-c-framework-part-4">rewriting the cleanXMLStoryFiles() function</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porting to the Qt C++ Framework :: Part 2</title>
		<link>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-2/</link>
		<comments>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-2/#comments</comments>
		<pubDate>Fri, 28 May 2010 05:05:25 +0000</pubDate>
		<dc:creator>grdinic</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[learn c++]]></category>
		<category><![CDATA[Qt Framework]]></category>

		<guid isPermaLink="false">http://www.formboss.net/blog/?p=252</guid>
		<description><![CDATA[In this post I want to introduce the Qt code I&#8217;ve written so far. One of the strengths of the Qt framework is its well supported in NetBeans, but more importantly, by Nokia via the Qt Creator IDE. In fact, Nokia supplies a host of tools, from the IDE and language tools, an Interface Designer, [...]]]></description>
			<content:encoded><![CDATA[<p>In this post I want to introduce the Qt code I&#8217;ve written so far. One of the strengths of the Qt framework is its well supported in NetBeans, but more importantly, by Nokia via the <a title="QT Creator IDE" href="http://qt.nokia.com/products/developer-tools">Qt Creator IDE</a>. In fact, Nokia supplies a host of tools, from the IDE and language tools, an Interface Designer, and loads of examples.</p>
<p>At the end of this post we&#8217;ll have a shell ready for the actual porting process to being. In other words, a GUI that loads, reacts to button presses, and updates status text.</p>
<p><span id="more-252"></span></p>
<p>So here&#8217;s the code:</p>
<h2>main.enc__cppqt</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;cleaner.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span> <span class="sy0">*</span>argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QApplication</span> app<span class="br0">&#40;</span>argc, argv<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Cleaner cleaner;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; cleaner.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> app.<span class="me1">exec</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2>cleaner.enc__cppqt</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;cleaner.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;worker.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Cleaner<span class="sy0">::</span><span class="me2">Cleaner</span><span class="br0">&#40;</span><span class="kw5">QWidget</span> <span class="sy0">*</span>parent<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sy0">:</span> <span class="kw5">QWidget</span><span class="br0">&#40;</span>parent<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; statusLabel <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QLabel</span><span class="br0">&#40;</span><span class="st0">&quot;Conversion Status:&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPathLabel <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QLabel</span><span class="br0">&#40;</span><span class="st0">&quot;Folder To Process&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processStatusText <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QTextEdit</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processStatusText<span class="sy0">-</span>&gt;setDisabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPathQLineEdit <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QLineEdit</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPathQLineEdit<span class="sy0">-</span>&gt;setDisabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; loadButton <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QPushButton</span><span class="br0">&#40;</span><span class="st0">&quot;Select Folder&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; loadButton<span class="sy0">-</span>&gt;setToolTip<span class="br0">&#40;</span><span class="st0">&quot;Select a folder to load Prestige export data from&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processButton <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QPushButton</span><span class="br0">&#40;</span><span class="st0">&quot;Process Folder&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processButton<span class="sy0">-</span>&gt;setDisabled<span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QGridLayout</span> <span class="sy0">*</span>mainLayout <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QGridLayout</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>statusLabel, <span class="nu0">0</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>processStatusText, <span class="nu0">1</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>processPathLabel, <span class="nu0">2</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>processPathQLineEdit, <span class="nu0">3</span>, <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QVBoxLayout</span> <span class="sy0">*</span>buttonLayout1 <span class="sy0">=</span> <span class="kw3">new</span> <span class="kw5">QVBoxLayout</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; buttonLayout1<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>loadButton, Qt<span class="sy0">::</span><span class="me2">AlignTop</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; buttonLayout1<span class="sy0">-</span>&gt;addWidget<span class="br0">&#40;</span>processButton, Qt<span class="sy0">::</span><span class="me2">AlignTop</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; mainLayout<span class="sy0">-</span>&gt;addLayout<span class="br0">&#40;</span>buttonLayout1, <span class="nu0">1</span>, <span class="nu0">1</span>, Qt<span class="sy0">::</span><span class="me2">AlignTop</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setLayout<span class="br0">&#40;</span>mainLayout<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; setWindowTitle<span class="br0">&#40;</span><span class="st0">&quot;Prestige Export File Cleaner&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// signal and slots</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">connect</span><span class="br0">&#40;</span>loadButton, <span class="kw4">SIGNAL</span><span class="br0">&#40;</span>clicked<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw3">this</span>, SLOT<span class="br0">&#40;</span>loadAction<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">connect</span><span class="br0">&#40;</span>processButton, <span class="kw4">SIGNAL</span><span class="br0">&#40;</span>clicked<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw3">this</span>, SLOT<span class="br0">&#40;</span>processAction<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> Cleaner<span class="sy0">::</span><span class="me2">loadAction</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// main folder name to use</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPath <span class="sy0">=</span> <span class="kw5">QFileDialog</span><span class="sy0">::</span><span class="me2">getExistingDirectory</span><span class="br0">&#40;</span><span class="kw3">this</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&quot;Prestige Export Folder&quot;</span>, <span class="st0">&quot;&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw5">QFileDialog</span><span class="sy0">::</span><span class="me2">ShowDirsOnly</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processPathQLineEdit<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span>processPath<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processButton<span class="sy0">-</span>&gt;setDisabled<span class="br0">&#40;</span><span class="kw2">false</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> Cleaner<span class="sy0">::</span><span class="me2">processAction</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processStatusText<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span><span class="st0">&quot;Starting Process&#8230;&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Worker <span class="sy0">*</span>wk <span class="sy0">=</span> <span class="kw3">new</span> Worker<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; processStatusText<span class="sy0">-</span>&gt;setText<span class="br0">&#40;</span>wk<span class="sy0">-</span>&gt;cleanImages<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2>cleaner.h</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#ifndef CLEANER_H</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define CLEANER_H</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> <span class="kw5">QLabel</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> <span class="kw5">QLineEdit</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> <span class="kw5">QTextEdit</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> <span class="kw5">QPushButton</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Cleaner <span class="sy0">:</span> <span class="kw2">public</span> <span class="kw5">QWidget</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">Q_OBJECT</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Cleaner<span class="br0">&#40;</span><span class="kw5">QWidget</span> <span class="sy0">*</span>parent <span class="sy0">=</span> <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">slots</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> loadAction<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> processAction<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QLineEdit</span> <span class="sy0">*</span>processPathQLineEdit;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QLabel</span> <span class="sy0">*</span>statusLabel;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QLabel</span> <span class="sy0">*</span>processPathLabel;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QTextEdit</span> <span class="sy0">*</span>processStatusText;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QPushButton</span> <span class="sy0">*</span>loadButton;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QPushButton</span> <span class="sy0">*</span>processButton;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> processPath;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif // CLEANER_H</span></div>
</li>
</ol>
</div>
<h2>worker.enc__cppqt</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#include &quot;worker.h&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Worker<span class="sy0">::</span><span class="me2">Worker</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; br <span class="sy0">=</span> <span class="st0">&quot;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; rl <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\r</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; nl <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; rn <span class="sy0">=</span> <span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span>&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; openp <span class="sy0">=</span> <span class="st0">&quot;&lt;p&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; closep <span class="sy0">=</span> <span class="st0">&quot;&lt;/p&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; doublebr <span class="sy0">=</span> <span class="st0">&quot;&lt;br/&gt;&lt;br/&gt;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw5">QString</span> Worker<span class="sy0">::</span><span class="me2">cleanImages</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span><span class="st0">&quot;Done!&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw4">void</span> Worker<span class="sy0">::</span><span class="me2">cleanXMLStoryFiles</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<h2>worker.h</h2>
<div class="geshi no cppqt">
<ol>
<li class="li1">
<div class="de1"><span class="co2">#ifndef WORKER_H</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#define WORKER_H</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#include </span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">class</span> Worker</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Worker<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; Worker<span class="br0">&#40;</span><span class="kw5">QString</span> dir<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// functions</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> cleanImages<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw4">void</span> cleanXMLStoryFiles<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">// status</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> statusMessages;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> br;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> rl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> nl;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> rn;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> openp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> closep;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw5">QString</span> doublebr;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co2">#endif // WORKER_H</span></div>
</li>
</ol>
</div>
<p>The biggest thing to note about this code is that we&#8217;re not using the <em>Qt Designer</em> program to create the UI. It&#8217;s all hand coded, done for the sake of learning the core UI model. If you&#8217;re learning Qt I suggest you try this as well. Yes the Qt Designer tool is fantastic and <em>yes </em>I&#8217;ll use it for most tasks moving forward, but for this project we&#8217;ll keep it low-level.</p>
<h2>Core Implementation</h2>
<p>On the implementation level it&#8217;s important to note that we&#8217;re using a totally object oriented approach to the UI and logic. Speaking of UI and Logic, note how we&#8217;ve split the app in two logical components: cleaner.enc__cppqt which holds the presentation logic, worker.enc__cppqt for the &#8216;model&#8217;.</p>
<p>On a releated note, as the XML logic will almost certainly get parallelized we&#8217;ll take special note of how we add and handle additional classes and data structures. From what I can see Qt may want all parallel code in separate classes, so we&#8217;ll see. We may end up editing the core functionality of worker.enc__cppqt, or possibly add a workerXML.ccp to the mix.</p>
<p>Also note how our call to: <em>QFileDialog::getExistingDirectory()</em> via: <em>void Cleaner::loadAction()</em> in cleaner.enc__cppqt is how we get the file path to process. In short, we&#8217;ve already replaced the command line apps argument with a GUI based equivalent!</p>
<p>To that end notice that as of right now we still have implementation bugs. So for example we create pointer to an instance of Worker on the heap in processAction() but do not call delete() on it. Of course this is wrong, and we&#8217;ll fix that in time&#8211;for now though the main idea is this code creates the UI which reacts to member functions of the worker class.</p>
<h2>Next Steps</h2>
<p>That&#8217;s it for the core UI code, in part 2 we&#8217;ll start porting our base application.</p>
<p>Go To Part 3 &#8211;&gt;<br />
<a href="porting-to-the-qt-c-framework-part-3">Link</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formboss.net/blog/2010/05/porting-to-the-qt-c-framework-part-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
