<?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>Coder-Studio &#187; RAII</title>
	<atom:link href="http://www.coder-studio.com/blog/tag/raii/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.coder-studio.com/blog</link>
	<description></description>
	<lastBuildDate>Wed, 31 Mar 2010 00:00:53 +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>Introduction des RAII en OpenGL</title>
		<link>http://www.coder-studio.com/blog/introduction-des-raii-en-opengl/</link>
		<comments>http://www.coder-studio.com/blog/introduction-des-raii-en-opengl/#comments</comments>
		<pubDate>Sun, 03 Oct 2004 17:07:45 +0000</pubDate>
		<dc:creator>twxs</dc:creator>
				<category><![CDATA[C & C++]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[RAII]]></category>

		<guid isPermaLink="false">http://r19649.ovh.net/cs/blog/?p=137</guid>
		<description><![CDATA[Ce tutoriel introduit l&#8217;utilisation des RAII (Ressource Aquisition Is Initialisation) en OpenGL. Un point clef en opengl est de conserver la &#171;&#160;machine à états&#160;&#187; propre. L&#8217;utilisation de RAII va permettre de faciliter cette gestion et également de clarifier le code.
Prenons un exemple:

?View Code CglEnable&#40;flag&#41;;
....
glDisable&#40;flag&#41;;

C&#8217;est ici l&#8217;utilisation normale d&#8217;opengl. Rien de compliqué mais c&#8217;est exactement ce [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ce tutoriel introduit l&#8217;utilisation des RAII (Ressource Aquisition Is Initialisation) en OpenGL. Un point clef en opengl est de conserver la &laquo;&nbsp;machine à états&nbsp;&raquo; propre. L&#8217;utilisation de RAII va permettre de faciliter cette gestion et également de clarifier le code.</p>
<p><span id="more-137"></span>Prenons un exemple:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code12'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13712"><td class="code" id="p137code12"><pre class="c" style="font-family:monospace;">glEnable<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
....
<span style="color: #202020;">glDisable</span><span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">C&#8217;est ici l&#8217;utilisation normale d&#8217;opengl. Rien de compliqué mais c&#8217;est exactement ce qu&#8217;on veut éviter pour ne pas alourdir le code&#8230;</p>
<h2>Un premier pas vers le RAII</h2>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code13'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13713"><td class="code" id="p137code13"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> Enable<span style="color: #009900;">&#123;</span>
   Enable<span style="color: #009900;">&#40;</span>GLenum flag<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      glEnable<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   ~Enable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      glDisable<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Puis on l&#8217;utilise dans un bloc, comme suit :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code14'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13714"><td class="code" id="p137code14"><pre class="c" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
   Enable active<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   ...
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Comme on peut le voir ici, Le principe est très simple : Lors de la création de l&#8217;instance de la structure Enable, on execute via le constructeur la commande opengl glEnable(). Lorsque l&#8217;on sort de la zone de portée de cette instance (ici, le bloc {}), elle est détruite. Il y a donc appel du destructeur dans lequel on a placé la commande glDisable().</p>
<h2>Conservation et propreté</h2>
<p style="text-align: justify;">Cette première version fonctionne, mais imaginons qu&#8217;avant le bloc le flag soit deja activé : à la sortie il sera desactivé. Pour s&#8217;assurer de la récuperation d&#8217;un contexte identique, nous devons modifier notre classe pour mémoriser l&#8217;etat courant avant sa modification.</p>
<p>On procède de cette manière :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code15'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13715"><td class="code" id="p137code15"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> Enable <span style="color: #009900;">&#123;</span>
&nbsp;
   GLboolean state<span style="color: #339933;">;</span>
   Enable<span style="color: #009900;">&#40;</span>GLenum flag<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      state <span style="color: #339933;">=</span> glIsEnable<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #666666; font-style: italic;">// State contient l'état actuel du flag</span>
      <span style="color: #666666; font-style: italic;">// Si le flag est deja activé il n'est pas necessaire de le réactiver</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>state<span style="color: #009900;">&#41;</span>
         glEnable<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   ~Enable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #666666; font-style: italic;">// Si le flag était désactivé à la création de la classe on le désactive à nouveau</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>state<span style="color: #009900;">&#41;</span>
         glDisable<span style="color: #009900;">&#40;</span>flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Ici nous sommes : L&#8217;utilisation de l&#8217;objet conserve le contexte opengl.</p>
<h2>Cas d&#8217;usage : factorisation du code à l&#8217;aide des templates</h2>
<p>Prenons le cas suivant :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code16'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13716"><td class="code" id="p137code16"><pre class="c" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
   Enable lighting<span style="color: #009900;">&#40;</span>GL_LIGHTING<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   Enable light0<span style="color: #009900;">&#40;</span>GL_LIGHT0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   Enable depth<span style="color: #009900;">&#40;</span>GL_DEPTH_TEST<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #666666; font-style: italic;">// ...code</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Supposons que ces trois appels reviennnent régulierement : l&#8217;héritage multiple devrait nous permettre de factoriser ce code en regroupant le tout en une seule et même classe. Mais le probleme ici, c&#8217;est que nous avons une unique classe pour tous les états. Comme nous ne pouvons pas heriter plusiseurs fois de la même classe, il va falloir trouver une autre solution.</p>
<p style="text-align: justify;">Et celle qui s&#8217;y prête le mieux reste l&#8217;utilisation de templates :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code17'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13717"><td class="code" id="p137code17"><pre class="c" style="font-family:monospace;">template <span style="color: #993333;">struct</span> Enable <span style="color: #009900;">&#123;</span>
   GLboolean state<span style="color: #339933;">;</span>
   Enable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//plus de paramètre au constructeur</span>
      state <span style="color: #339933;">=</span> glIsEnable<span style="color: #009900;">&#40;</span>Flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #666666; font-style: italic;">// state contiend l'etat actuel du flag</span>
      <span style="color: #666666; font-style: italic;">// si le flag est deja active il 'est pas necessaire de le reactiver</span>
&nbsp;
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>state<span style="color: #009900;">&#41;</span>
          glEnable<span style="color: #009900;">&#40;</span>Flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
&nbsp;
   ~Enable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>state<span style="color: #009900;">&#41;</span>
      glDisable<span style="color: #009900;">&#40;</span>Flag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">En &laquo;&nbsp;templetant&nbsp;&raquo; la classe Enable, nous obtenons une classe différente pour chaque paramètre du template, et donc pour chaque flag.</p>
<p style="text-align: justify;">Au niveau de l&#8217;utilisation,</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code18'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13718"><td class="code" id="p137code18"><pre class="c" style="font-family:monospace;">Enable depth<span style="color: #009900;">&#40;</span>GL_DEPTH_TEST<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>deviendra :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code19'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13719"><td class="code" id="p137code19"><pre class="c" style="font-family:monospace;">Enable depth<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Mais surtout, ceci va nous permettre de factoriser des états.<br />
Reprenons les trois appels redondant de notre programme :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code20'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13720"><td class="code" id="p137code20"><pre class="c" style="font-family:monospace;">Enable lighting<span style="color: #339933;">;</span>
Enable light0<span style="color: #339933;">;</span>
Enable depth<span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>En templatant, on peut créer une structure héritant de chaque classe :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code21'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13721"><td class="code" id="p137code21"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> MonContext <span style="color: #339933;">:</span>
   Enable <span style="color: #339933;">,</span>
   Enable <span style="color: #339933;">,</span>
   Enable
<span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Nous obtenons une structure ayant les propriétés de 3 classes parents. Et surtout, à la creation de l&#8217;objet les 3 constructeurs des parents seront appelés, et réciproquement à la destruction.<br />
On peut donc se contenter de ceci :</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p137code22'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13722"><td class="code" id="p137code22"><pre class="c" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
   MonContext ctx_light<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h2>Conclusion</h2>
<p>Voilà pour l&#8217;utilisation des RAII : Rien de très complexe dans la théorie ou dans la pratique. C&#8217;est par contre un puissant outil qui devrait rapidement devenir indispensable à la clarté de tout programme conséquent.<br />
<strong>Un grand merci à Twxs pour ce tuto !</strong></p>
<blockquote><p>Cet article provient du tutorial publié par Twxs le 03/10/2004 sur l&#8217;ancien site de Coder-Studio.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.coder-studio.com/blog/introduction-des-raii-en-opengl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
