<?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, 02 Mar 2011 22:17:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<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'utilisation des RAII (Ressource Aquisition Is Initialisation) en OpenGL. Un point clef en opengl est de conserver la "machine à états" propre. L'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'est ici l'utilisation normale d'opengl. Rien de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ce tutoriel introduit l'utilisation des RAII (Ressource Aquisition Is Initialisation) en OpenGL. Un point clef en opengl est de conserver la "machine à états" propre. L'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'est ici l'utilisation normale d'opengl. Rien de compliqué mais c'est exactement ce qu'on veut éviter pour ne pas alourdir le code...</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'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'instance de la structure Enable, on execute via le constructeur la commande opengl glEnable(). Lorsque l'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'avant le bloc le flag soit deja activé : à la sortie il sera desactivé. Pour s'assurer de la récuperation d'un contexte identique, nous devons modifier notre classe pour mémoriser l'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'utilisation de l'objet conserve le contexte opengl.</p>
<h2>Cas d'usage : factorisation du code à l'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'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'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'y prête le mieux reste l'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 "templetant" 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'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'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'utilisation des RAII : Rien de très complexe dans la théorie ou dans la pratique. C'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'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>1116</slash:comments>
		</item>
	</channel>
</rss>

