<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>to static or not to static?</title>
		<link>http://www.allegro.cc/forums/view/609140</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 04 Jan 2012 06:37:07 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is in reference to the <span class="source-code"><span class="k1">static</span></span> keyword.</p><p>I get a lot of &quot;defined but not used&quot; warnings like:</p><pre class="terminal">warning: &#39;void invert(ALLEGRO_BITMAP*)&#39; defined but not used</pre><p>

Each of these are <span class="source-code"><span class="k1">static</span> <span class="k1">inline</span></span> functions that are in a universal header file, with the intention that whenever I may need to use the function it will be included, statically, inside that resulting object file.  These functions are somewhat of a particular breed, akin to everyday functions like min/max, and don&#39;t necessarily fit into a specific category.  I initially thought to go the static route because they&#39;re used so frequently <i>I guess</i> it would be better to get them &quot;closer to the metal.&quot;</p><p>I don&#39;t know if my thinking is correct in this regard (looking for advice in that area.)</p><p>In order to alleviate the warnings, I&#39;m trying to decide if I should:
</p><ol><li><p>just jump the shark and make them regular functions that exist in a single object file, or
</p></li><li><p>silence the warnings with some preprocessor type code (if that can be done?)  I don&#39;t want to silence anything via the compiler, at all.
</p></li><li><p>something else.</p></li></ol><p>What should I do?</p><p>=-=-=-=-</p><p>There are other <span class="source-code"><span class="k1">static</span> <span class="k1">inline</span></span> functions elsewhere, but this is the file with the majority of offenders:
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="p">#ifndef __USEFUL_HEADER</span>
<span class="number">   2</span><span class="p">#define __USEFUL_HEADER</span>
<span class="number">   3</span>
<span class="number">   4</span>
<span class="number">   5</span>
<span class="number">   6</span>
<span class="number">   7</span><span class="p">#include &lt;sstream&gt;</span>
<span class="number">   8</span><span class="p">#include &lt;string&gt;</span>
<span class="number">   9</span>
<span class="number">  10</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  11</span><span class="p">#include &lt;allegro5/allegro_color.h&gt;</span>
<span class="number">  12</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">  13</span>
<span class="number">  14</span><span class="p">#include &lt;af/vec2d.h&gt;</span>
<span class="number">  15</span>
<span class="number">  16</span><span class="p">#include &lt;math.h&gt;</span>
<span class="number">  17</span>
<span class="number">  18</span>
<span class="number">  19</span>
<span class="number">  20</span>
<span class="number">  21</span>
<span class="number">  22</span><span class="k1">static</span> <span class="k1">const</span> <span class="k1">float</span> FULL_ROTATION <span class="k3">=</span> <span class="n">6</span>.<span class="n">28318531</span><span class="k2">;</span>
<span class="number">  23</span>
<span class="number">  24</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">float</span> degrees_to_radians<span class="k2">(</span><span class="k1">float</span> deg<span class="k2">)</span> <span class="k2">{</span> <span class="k1">return</span> <a href="http://www.allegro.cc/manual/ALLEGRO_PI"><span class="a">ALLEGRO_PI</span></a> <span class="k3">*</span> deg <span class="k3">/</span> <span class="n">180</span>.<span class="n">0f</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number">  25</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">float</span> radians_to_degrees<span class="k2">(</span><span class="k1">float</span> rad<span class="k2">)</span> <span class="k2">{</span> <span class="k1">return</span> <span class="n">180</span>.<span class="n">0f</span> <span class="k3">/</span> <a href="http://www.allegro.cc/manual/ALLEGRO_PI"><span class="a">ALLEGRO_PI</span></a> <span class="k3">*</span> rad<span class="k2">;</span> <span class="k2">}</span>
<span class="number">  26</span>
<span class="number">  27</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">void</span> draw_crosshair<span class="k2">(</span><span class="k1">float</span> x, <span class="k1">float</span> y, <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> color<span class="k3">=</span><a href="http://www.allegro.cc/manual/al_color_name"><span class="a">al_color_name</span></a><span class="k2">(</span><span class="s">"white"</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  28</span><span class="k2">{</span>
<span class="number">  29</span>  <span class="k1">float</span> half_size <span class="k3">=</span> <span class="n">12</span><span class="k2">;</span>
<span class="number">  30</span>  <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span>x, y-half_size, x, y<span class="k3">+</span>half_size, color, <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  31</span>  <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span>x-half_size, y, x<span class="k3">+</span>half_size, y, color, <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  32</span><span class="k2">}</span>
<span class="number">  33</span>
<span class="number">  34</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">void</span> draw_crosshair<span class="k2">(</span>vec2d <span class="k3">&amp;</span>point, <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> color<span class="k3">=</span><a href="http://www.allegro.cc/manual/al_color_name"><span class="a">al_color_name</span></a><span class="k2">(</span><span class="s">"white"</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  35</span><span class="k2">{</span>
<span class="number">  36</span>  <span class="k1">float</span> half_size <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span>
<span class="number">  37</span>  <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span>point.x, point.y-half_size, point.x, point.y<span class="k3">+</span>half_size, color, <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  38</span>  <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span>point.x-half_size, point.y, point.x<span class="k3">+</span>half_size, point.y, color, <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  39</span><span class="k2">}</span>
<span class="number">  40</span>
<span class="number">  41</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">float</span> distance<span class="k2">(</span><span class="k1">float</span> x1, <span class="k1">float</span> y1, <span class="k1">float</span> x2, <span class="k1">float</span> y2<span class="k2">)</span>
<span class="number">  42</span><span class="k2">{</span>
<span class="number">  43</span>      <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span> <span class="k2">(</span><span class="k2">(</span>x1 <span class="k3">-</span> x2<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>x1 <span class="k3">-</span> x2<span class="k2">)</span><span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span><span class="k2">(</span>y1 <span class="k3">-</span> y2<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>y1 <span class="k3">-</span> y2<span class="k2">)</span><span class="k2">)</span> <span class="k2">)</span> <span class="k2">;</span>
<span class="number">  44</span><span class="k2">}</span>
<span class="number">  45</span>
<span class="number">  46</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">float</span> distance<span class="k2">(</span><span class="k1">const</span> vec2d <span class="k3">&amp;</span>point1, <span class="k1">const</span> vec2d <span class="k3">&amp;</span>point2<span class="k2">)</span>
<span class="number">  47</span><span class="k2">{</span>
<span class="number">  48</span>      <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span> <span class="k2">(</span><span class="k2">(</span>point1.x <span class="k3">-</span> point2.x<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>point1.x <span class="k3">-</span> point2.x<span class="k2">)</span><span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span><span class="k2">(</span>point1.y <span class="k3">-</span> point2.y<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>point1.y <span class="k3">-</span> point2.y<span class="k2">)</span><span class="k2">)</span> <span class="k2">)</span> <span class="k2">;</span>
<span class="number">  49</span><span class="k2">}</span>
<span class="number">  50</span>
<span class="number">  51</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">float</span> distance<span class="k2">(</span><span class="k1">const</span> vec2d <span class="k3">*</span>point1, <span class="k1">const</span> vec2d <span class="k3">*</span>point2<span class="k2">)</span>
<span class="number">  52</span><span class="k2">{</span>
<span class="number">  53</span>      <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span> <span class="k2">(</span><span class="k2">(</span>point1-&gt;x <span class="k3">-</span> point2-&gt;x<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>point1-&gt;x <span class="k3">-</span> point2-&gt;x<span class="k2">)</span><span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span><span class="k2">(</span>point1-&gt;y <span class="k3">-</span> point2-&gt;y<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>point1-&gt;y <span class="k3">-</span> point2-&gt;y<span class="k2">)</span><span class="k2">)</span> <span class="k2">)</span> <span class="k2">;</span>
<span class="number">  54</span><span class="k2">}</span>
<span class="number">  55</span>
<span class="number">  56</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">float</span> manhattan_distance<span class="k2">(</span><span class="k1">const</span> vec2d <span class="k3">*</span>point1, <span class="k1">const</span> vec2d <span class="k3">*</span>point2<span class="k2">)</span>
<span class="number">  57</span><span class="k2">{</span>
<span class="number">  58</span>    <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a><span class="k2">(</span>point2-&gt;x <span class="k3">+</span> point2-&gt;y <span class="k3">+</span> point1-&gt;x <span class="k3">+</span> point1-&gt;y<span class="k2">)</span><span class="k2">;</span>
<span class="number">  59</span><span class="k2">}</span>
<span class="number">  60</span>
<span class="number">  61</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">float</span> manhattan_distance<span class="k2">(</span><span class="k1">float</span> x1, <span class="k1">float</span> y1, <span class="k1">float</span> x2, <span class="k1">float</span> y2<span class="k2">)</span>
<span class="number">  62</span><span class="k2">{</span>
<span class="number">  63</span>    <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a><span class="k2">(</span>x1 <span class="k3">+</span> y1 <span class="k3">+</span> x2 <span class="k3">+</span> y2<span class="k2">)</span><span class="k2">;</span>
<span class="number">  64</span><span class="k2">}</span>
<span class="number">  65</span>
<span class="number">  66</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">float</span> distance_squared<span class="k2">(</span><span class="k1">const</span> vec2d <span class="k3">&amp;</span>point1, <span class="k1">const</span> vec2d <span class="k3">&amp;</span>point2<span class="k2">)</span>
<span class="number">  67</span><span class="k2">{</span>
<span class="number">  68</span>  <span class="k1">return</span> <span class="k2">(</span><span class="k2">(</span>point1.x <span class="k3">-</span> point2.x<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>point1.x <span class="k3">-</span> point2.x<span class="k2">)</span><span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span><span class="k2">(</span>point1.y <span class="k3">-</span> point2.y<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>point1.y <span class="k3">-</span> point2.y<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  69</span><span class="k2">}</span>
<span class="number">  70</span>
<span class="number">  71</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">float</span> random_float<span class="k2">(</span><span class="k1">float</span> min, <span class="k1">float</span> max<span class="k2">)</span>
<span class="number">  72</span><span class="k2">{</span>
<span class="number">  73</span>    <span class="k1">return</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span><span class="k3">/</span>RAND_MAX<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>max-min<span class="k2">)</span> <span class="k3">+</span> min<span class="k2">;</span>
<span class="number">  74</span><span class="k2">}</span>
<span class="number">  75</span>
<span class="number">  76</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">double</span> random_double<span class="k2">(</span><span class="k1">double</span> min, <span class="k1">double</span> max<span class="k2">)</span>
<span class="number">  77</span><span class="k2">{</span>
<span class="number">  78</span>    <span class="k1">return</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">double</span><span class="k2">)</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span><span class="k3">/</span>RAND_MAX<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>max-min<span class="k2">)</span> <span class="k3">+</span> min<span class="k2">;</span>
<span class="number">  79</span><span class="k2">}</span>
<span class="number">  80</span>
<span class="number">  81</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">int</span> random_int<span class="k2">(</span><span class="k1">int</span> min, <span class="k1">int</span> max<span class="k2">)</span>
<span class="number">  82</span><span class="k2">{</span>
<span class="number">  83</span>    <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="k2">(</span>max-min<span class="k3">+</span><span class="n">1</span><span class="k2">)</span> <span class="k3">+</span> min<span class="k2">;</span>
<span class="number">  84</span><span class="k2">}</span>
<span class="number">  85</span>
<span class="number">  86</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">bool</span> random_bool<span class="k2">(</span><span class="k2">)</span>
<span class="number">  87</span><span class="k2">{</span>
<span class="number">  88</span>    <span class="k1">return</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">2</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span><span class="k2">}</span>
<span class="number">  90</span>
<span class="number">  91</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">int</span> random_sign<span class="k2">(</span><span class="k2">)</span>
<span class="number">  92</span><span class="k2">{</span>
<span class="number">  93</span>    <span class="k1">if</span> <span class="k2">(</span>random_bool<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  94</span>  <span class="k1">else</span> <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  95</span><span class="k2">}</span>
<span class="number">  96</span>
<span class="number">  97</span><span class="c">// this random_char() function has not been tested or verified</span>
<span class="number">  98</span><span class="c">/*</span>
<span class="number">  99</span><span class="c"></span>
<span class="number"> 100</span><span class="c">static inline char random_char(char min=0, char max=255)</span>
<span class="number"> 101</span><span class="c">{</span>
<span class="number"> 102</span><span class="c">  return (char)(rand()%(max-min+1) + min);</span>
<span class="number"> 103</span><span class="c">}</span>
<span class="number"> 104</span><span class="c"></span>
<span class="number"> 105</span><span class="c">*/</span>
<span class="number"> 106</span>
<span class="number"> 107</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">unsigned</span> <span class="k1">char</span> random_letter<span class="k2">(</span><span class="k1">bool</span> lower<span class="k2">)</span>
<span class="number"> 108</span><span class="k2">{</span>
<span class="number"> 109</span>  <span class="k1">if</span> <span class="k2">(</span>lower<span class="k2">)</span> <span class="k1">return</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">char</span><span class="k2">)</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">26</span> <span class="k3">+</span> <span class="s">'a'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 110</span>  <span class="k1">return</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">char</span><span class="k2">)</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_637.html" target="_blank">rand</a><span class="k2">(</span><span class="k2">)</span>%<span class="n">26</span> <span class="k3">+</span> <span class="s">'A'</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 111</span><span class="k2">}</span>
<span class="number"> 112</span>
<span class="number"> 113</span>
<span class="number"> 114</span><span class="c">// returns a point projected onto an axis</span>
<span class="number"> 115</span><span class="k1">static</span> <span class="k1">inline</span> vec2d project<span class="k2">(</span>vec2d <span class="k3">&amp;</span>point, vec2d <span class="k3">&amp;</span>axis<span class="k2">)</span>
<span class="number"> 116</span><span class="k2">{</span>
<span class="number"> 117</span>  <span class="k1">float</span> somethun <span class="k3">=</span> <span class="k2">(</span>point.x <span class="k3">*</span> axis.x <span class="k3">+</span> point.y <span class="k3">*</span> axis.y<span class="k2">)</span>
<span class="number"> 118</span>                 <span class="k3">/</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_618.html" target="_blank">pow</a><span class="k2">(</span>axis.x, <span class="n">2</span><span class="k2">)</span> <span class="k3">+</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_618.html" target="_blank">pow</a><span class="k2">(</span>axis.y, <span class="n">2</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 119</span>  <span class="k1">return</span> vec2d<span class="k2">(</span>somethun <span class="k3">*</span> axis.x, somethun <span class="k3">*</span> axis.y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 120</span><span class="k2">}</span>
<span class="number"> 121</span>
<span class="number"> 122</span><span class="c">// reflect a point along an axis</span>
<span class="number"> 123</span><span class="k1">inline</span> <span class="k1">static</span> vec2d reflect<span class="k2">(</span>vec2d <span class="k3">&amp;</span>point, <span class="k1">const</span> vec2d <span class="k3">&amp;</span>axis<span class="k2">)</span>
<span class="number"> 124</span><span class="k2">{</span>
<span class="number"> 125</span>    <span class="k1">float</span> d <span class="k3">=</span> point <span class="k3">*</span> axis<span class="k2">;</span>
<span class="number"> 126</span>  <span class="k1">return</span> point <span class="k3">-</span> <span class="n">2</span> <span class="k3">*</span> d <span class="k3">*</span> axis<span class="k2">;</span>
<span class="number"> 127</span><span class="k2">}</span>
<span class="number"> 128</span>
<span class="number"> 129</span><span class="k1">template</span><span class="k3">&lt;</span><span class="k1">class</span> T&gt;
<span class="number"> 130</span><span class="k1">inline</span> <span class="k1">static</span> T limit<span class="k2">(</span><span class="k1">const</span> T <span class="k3">&amp;</span>range1, <span class="k1">const</span> T <span class="k3">&amp;</span>range2, <span class="k1">const</span> T <span class="k3">&amp;</span>val<span class="k2">)</span>
<span class="number"> 131</span><span class="k2">{</span>
<span class="number"> 132</span>  <span class="k1">float</span> min <span class="k3">=</span> <span class="k2">(</span>range1 <span class="k3">&lt;</span> range2<span class="k2">)</span> ? range1 <span class="k2">:</span> range2<span class="k2">;</span>
<span class="number"> 133</span>  <span class="k1">float</span> max <span class="k3">=</span> <span class="k2">(</span>range1 <span class="k3">&gt;</span> range2<span class="k2">)</span> ? range1 <span class="k2">:</span> range2<span class="k2">;</span>
<span class="number"> 134</span>  <span class="k1">if</span> <span class="k2">(</span>val <span class="k3">&lt;</span> min<span class="k2">)</span> <span class="k1">return</span> min<span class="k2">;</span>
<span class="number"> 135</span>  <span class="k1">if</span> <span class="k2">(</span>val <span class="k3">&gt;</span> max<span class="k2">)</span> <span class="k1">return</span> max<span class="k2">;</span>
<span class="number"> 136</span>  <span class="k1">return</span> val<span class="k2">;</span>
<span class="number"> 137</span><span class="k2">}</span>
<span class="number"> 138</span>
<span class="number"> 139</span><span class="k1">template</span><span class="k3">&lt;</span><span class="k1">class</span> T&gt;
<span class="number"> 140</span><span class="k1">inline</span> <span class="k1">static</span> <span class="k1">bool</span> in_range<span class="k2">(</span><span class="k1">const</span> T <span class="k3">&amp;</span>min, <span class="k1">const</span> T <span class="k3">&amp;</span>max, <span class="k1">const</span> T <span class="k3">&amp;</span>val<span class="k2">)</span>
<span class="number"> 141</span><span class="k2">{</span>
<span class="number"> 142</span>  <span class="k1">if</span> <span class="k2">(</span>val <span class="k3">&lt;</span> min<span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 143</span>  <span class="k1">if</span> <span class="k2">(</span>val <span class="k3">&gt;</span> max<span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 144</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 145</span><span class="k2">}</span>
<span class="number"> 146</span>
<span class="number"> 147</span><span class="k1">static</span> <span class="k1">inline</span> <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> color<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>color_name, <span class="k1">float</span> alpha<span class="k3">=</span><span class="n">1</span>.<span class="n">0</span><span class="k2">)</span>
<span class="number"> 148</span><span class="k2">{</span>
<span class="number"> 149</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> col <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_color_name"><span class="a">al_color_name</span></a><span class="k2">(</span>color_name<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 150</span>  col.a <span class="k3">=</span> alpha<span class="k2">;</span>
<span class="number"> 151</span>  col.r <span class="k3">*</span><span class="k3">=</span> alpha<span class="k2">;</span>
<span class="number"> 152</span>  col.g <span class="k3">*</span><span class="k3">=</span> alpha<span class="k2">;</span>
<span class="number"> 153</span>  col.b <span class="k3">*</span><span class="k3">=</span> alpha<span class="k2">;</span>
<span class="number"> 154</span>  <span class="k1">return</span> col<span class="k2">;</span>
<span class="number"> 155</span><span class="k2">}</span>
<span class="number"> 156</span>
<span class="number"> 157</span>
<span class="number"> 158</span><span class="k1">static</span> <span class="k1">inline</span> <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> color_hex<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>hex, <span class="k1">float</span> a<span class="k3">=</span><span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span>
<span class="number"> 159</span><span class="k2">{</span>
<span class="number"> 160</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> color <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_color_html"><span class="a">al_color_html</span></a><span class="k2">(</span>hex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 161</span>  color.a <span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 162</span>  color.r <span class="k3">*</span><span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 163</span>  color.g <span class="k3">*</span><span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 164</span>  color.b <span class="k3">*</span><span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 165</span>  <span class="k1">return</span> color<span class="k2">;</span>
<span class="number"> 166</span><span class="k2">}</span>
<span class="number"> 167</span>
<span class="number"> 168</span>
<span class="number"> 169</span><span class="k1">static</span> <span class="k1">inline</span> <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> color_name<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>name, <span class="k1">float</span> a<span class="k3">=</span><span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span>
<span class="number"> 170</span><span class="k2">{</span>
<span class="number"> 171</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> color <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_color_name"><span class="a">al_color_name</span></a><span class="k2">(</span>name<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 172</span>  color.a <span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 173</span>  color.r <span class="k3">*</span><span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 174</span>  color.g <span class="k3">*</span><span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 175</span>  color.b <span class="k3">*</span><span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 176</span>  <span class="k1">return</span> color<span class="k2">;</span>
<span class="number"> 177</span><span class="k2">}</span>
<span class="number"> 178</span>
<span class="number"> 179</span>
<span class="number"> 180</span><span class="k1">static</span> <span class="k1">inline</span> <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> color<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> color, <span class="k1">float</span> a<span class="k3">=</span><span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span>
<span class="number"> 181</span><span class="k2">{</span>
<span class="number"> 182</span>  color.a <span class="k3">*</span><span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 183</span>  color.r <span class="k3">*</span><span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 184</span>  color.g <span class="k3">*</span><span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 185</span>  color.b <span class="k3">*</span><span class="k3">=</span> a<span class="k2">;</span>
<span class="number"> 186</span>  <span class="k1">return</span> color<span class="k2">;</span>
<span class="number"> 187</span><span class="k2">}</span>
<span class="number"> 188</span>
<span class="number"> 189</span>
<span class="number"> 190</span><span class="k1">static</span> <span class="k1">inline</span> <span class="k1">bool</span> <span class="k1">operator</span> <span class="k3">=</span><span class="k3">=</span><span class="k2">(</span><span class="k1">const</span> <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> <span class="k3">&amp;</span>lhs, <span class="k1">const</span> <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> <span class="k3">&amp;</span>rhs<span class="k2">)</span>
<span class="number"> 191</span><span class="k2">{</span>
<span class="number"> 192</span>  <span class="k1">if</span> <span class="k2">(</span>lhs.r <span class="k3">!</span><span class="k3">=</span> rhs.r<span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 193</span>  <span class="k1">if</span> <span class="k2">(</span>lhs.g <span class="k3">!</span><span class="k3">=</span> rhs.g<span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 194</span>  <span class="k1">if</span> <span class="k2">(</span>lhs.b <span class="k3">!</span><span class="k3">=</span> rhs.b<span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 195</span>  <span class="k1">if</span> <span class="k2">(</span>lhs.a <span class="k3">!</span><span class="k3">=</span> rhs.a<span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 196</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 197</span><span class="k2">}</span>
<span class="number"> 198</span>
<span class="number"> 199</span>
<span class="number"> 200</span><span class="k1">template</span><span class="k3">&lt;</span><span class="k1">class</span> T&gt;
<span class="number"> 201</span><span class="k1">static</span> <span class="k1">inline</span> std::string tostring<span class="k2">(</span>T val<span class="k2">)</span>
<span class="number"> 202</span><span class="k2">{</span>
<span class="number"> 203</span>  std::ostringstream s<span class="k2">;</span>
<span class="number"> 204</span>  s <span class="k3">&lt;</span><span class="k3">&lt;</span> val<span class="k2">;</span>
<span class="number"> 205</span>  <span class="k1">return</span> s.str<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 206</span><span class="k2">}</span>
<span class="number"> 207</span>
<span class="number"> 208</span>
<span class="number"> 209</span><span class="p">#include &lt;vector&gt;</span>
<span class="number"> 210</span><span class="k1">static</span> <span class="k1">inline</span> std::vector<span class="k3">&lt;</span>std::string&gt; str_explode<span class="k2">(</span><span class="k1">const</span> std::string <span class="k3">&amp;</span>delimiter, <span class="k1">const</span> std::string <span class="k3">&amp;</span>str<span class="k2">)</span>
<span class="number"> 211</span><span class="k2">{</span>
<span class="number"> 212</span>    std::vector<span class="k3">&lt;</span>std::string&gt; arr<span class="k2">;</span>
<span class="number"> 213</span>
<span class="number"> 214</span>    <span class="k1">int</span> strleng <span class="k3">=</span> str.length<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 215</span>    <span class="k1">int</span> delleng <span class="k3">=</span> delimiter.length<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 216</span>    <span class="k1">if</span> <span class="k2">(</span>delleng<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span>
<span class="number"> 217</span>        <span class="k1">return</span> arr<span class="k2">;</span><span class="c">//no change</span>
<span class="number"> 218</span>
<span class="number"> 219</span>    <span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 220</span>    <span class="k1">int</span> k<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 221</span>    <span class="k1">while</span><span class="k2">(</span>i<span class="k3">&lt;</span>strleng<span class="k2">)</span>
<span class="number"> 222</span>    <span class="k2">{</span>
<span class="number"> 223</span>        <span class="k1">int</span> j<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>
<span class="number"> 224</span>        <span class="k1">while</span> <span class="k2">(</span>i<span class="k3">+</span>j<span class="k3">&lt;</span>strleng <span class="k3">&amp;</span><span class="k3">&amp;</span> j<span class="k3">&lt;</span>delleng <span class="k3">&amp;</span><span class="k3">&amp;</span> str<span class="k2">[</span>i<span class="k3">+</span>j<span class="k2">]</span><span class="k3">=</span><span class="k3">=</span>delimiter<span class="k2">[</span>j<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 225</span>            j<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 226</span>        <span class="k1">if</span> <span class="k2">(</span>j<span class="k3">=</span><span class="k3">=</span>delleng<span class="k2">)</span><span class="c">//found delimiter</span>
<span class="number"> 227</span>        <span class="k2">{</span>
<span class="number"> 228</span>            arr.push_back<span class="k2">(</span>str.substr<span class="k2">(</span>k, i-k<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 229</span>            i<span class="k3">+</span><span class="k3">=</span>delleng<span class="k2">;</span>
<span class="number"> 230</span>            k<span class="k3">=</span>i<span class="k2">;</span>
<span class="number"> 231</span>        <span class="k2">}</span>
<span class="number"> 232</span>        <span class="k1">else</span>
<span class="number"> 233</span>        <span class="k2">{</span>
<span class="number"> 234</span>            i<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 235</span>        <span class="k2">}</span>
<span class="number"> 236</span>    <span class="k2">}</span>
<span class="number"> 237</span>    arr.push_back<span class="k2">(</span>str.substr<span class="k2">(</span>k, i-k<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 238</span>    <span class="k1">return</span> arr<span class="k2">;</span>
<span class="number"> 239</span><span class="k2">}</span>
<span class="number"> 240</span>
<span class="number"> 241</span>
<span class="number"> 242</span>
<span class="number"> 243</span><span class="c">// Tested, but not thoroughly</span>
<span class="number"> 244</span><span class="p">#include &lt;string&gt;</span>
<span class="number"> 245</span><span class="k1">static</span> <span class="k1">inline</span> std::string str_replace<span class="k2">(</span><span class="k1">const</span> std::string <span class="k3">&amp;</span>search, <span class="k1">const</span> std::string <span class="k3">&amp;</span>replace, std::string <span class="k3">&amp;</span>subject<span class="k2">)</span>
<span class="number"> 246</span><span class="k2">{</span>
<span class="number"> 247</span>    std::string buffer<span class="k2">;</span>
<span class="number"> 248</span>
<span class="number"> 249</span>    <span class="k1">int</span> sealeng <span class="k3">=</span> search.length<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 250</span>    <span class="k1">int</span> strleng <span class="k3">=</span> subject.length<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 251</span>
<span class="number"> 252</span>    <span class="k1">if</span> <span class="k2">(</span>sealeng<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span>
<span class="number"> 253</span>        <span class="k1">return</span> subject<span class="k2">;</span><span class="c">//no change</span>
<span class="number"> 254</span>
<span class="number"> 255</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span>, j<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span>strleng<span class="k2">;</span> j<span class="k3">=</span><span class="n">0</span> <span class="k2">)</span>
<span class="number"> 256</span>    <span class="k2">{</span>
<span class="number"> 257</span>        <span class="k1">while</span> <span class="k2">(</span>i<span class="k3">+</span>j<span class="k3">&lt;</span>strleng <span class="k3">&amp;</span><span class="k3">&amp;</span> j<span class="k3">&lt;</span>sealeng <span class="k3">&amp;</span><span class="k3">&amp;</span> subject<span class="k2">[</span>i<span class="k3">+</span>j<span class="k2">]</span><span class="k3">=</span><span class="k3">=</span>search<span class="k2">[</span>j<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 258</span>            j<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 259</span>        <span class="k1">if</span> <span class="k2">(</span>j<span class="k3">=</span><span class="k3">=</span>sealeng<span class="k2">)</span><span class="c">//found 'search'</span>
<span class="number"> 260</span>        <span class="k2">{</span>
<span class="number"> 261</span>            buffer.append<span class="k2">(</span>replace<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 262</span>            i<span class="k3">+</span><span class="k3">=</span>sealeng<span class="k2">;</span>
<span class="number"> 263</span>        <span class="k2">}</span>
<span class="number"> 264</span>        <span class="k1">else</span>
<span class="number"> 265</span>        <span class="k2">{</span>
<span class="number"> 266</span>            buffer.append<span class="k2">(</span> <span class="k3">&amp;</span>subject<span class="k2">[</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">]</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 267</span>        <span class="k2">}</span>
<span class="number"> 268</span>    <span class="k2">}</span>
<span class="number"> 269</span>    subject <span class="k3">=</span> buffer<span class="k2">;</span>
<span class="number"> 270</span>    <span class="k1">return</span> subject<span class="k2">;</span>
<span class="number"> 271</span><span class="k2">}</span>
<span class="number"> 272</span>
<span class="number"> 273</span>
<span class="number"> 274</span>
<span class="number"> 275</span><span class="p">#include &lt;vector&gt;</span>
<span class="number"> 276</span><span class="k1">static</span> std::vector<span class="k3">&lt;</span>int&gt; to_int<span class="k2">(</span><span class="k1">const</span> std::vector<span class="k3">&lt;</span>std::string&gt; <span class="k3">&amp;</span>arr<span class="k2">)</span>
<span class="number"> 277</span><span class="k2">{</span>
<span class="number"> 278</span>  std::vector<span class="k3">&lt;</span>int&gt; result<span class="k2">;</span>
<span class="number"> 279</span>  <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>arr.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 280</span>    result.push_back<span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_54.html" target="_blank">atoi</a><span class="k2">(</span>arr<span class="k2">[</span>i<span class="k2">]</span>.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 281</span>  <span class="k1">return</span> result<span class="k2">;</span>
<span class="number"> 282</span><span class="k2">}</span>
<span class="number"> 283</span>
<span class="number"> 284</span>
<span class="number"> 285</span>
<span class="number"> 286</span>
<span class="number"> 287</span><span class="p">#include &lt;fstream&gt;</span>
<span class="number"> 288</span><span class="p">#include &lt;string&gt;</span>
<span class="number"> 289</span><span class="k1">static</span> <span class="k1">bool</span> <a href="http://www.allegro.cc/manual/file_exists"><span class="a">file_exists</span></a><span class="k2">(</span>std::string filename<span class="k2">)</span>
<span class="number"> 290</span><span class="k2">{</span>
<span class="number"> 291</span>  std::fstream file<span class="k2">(</span>filename.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 292</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>file<span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 293</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 294</span><span class="k2">}</span>
<span class="number"> 295</span>
<span class="number"> 296</span>
<span class="number"> 297</span>
<span class="number"> 298</span>
<span class="number"> 299</span><span class="p">#include &lt;fstream&gt;</span>
<span class="number"> 300</span><span class="p">#include &lt;string&gt;</span>
<span class="number"> 301</span><span class="k1">static</span> std::string file_get_contents<span class="k2">(</span>std::string filename<span class="k2">)</span>
<span class="number"> 302</span><span class="k2">{</span>
<span class="number"> 303</span>  std::ifstream file<span class="k2">(</span>filename.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 304</span>  std::string input <span class="k3">=</span> <span class="s">""</span><span class="k2">;</span>
<span class="number"> 305</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>file<span class="k2">)</span> <span class="k1">return</span> <span class="s">""</span><span class="k2">;</span>
<span class="number"> 306</span>  <span class="k1">char</span> ch<span class="k2">;</span>
<span class="number"> 307</span>  <span class="k1">while</span> <span class="k2">(</span>file.get<span class="k2">(</span>ch<span class="k2">)</span><span class="k2">)</span> input.append<span class="k2">(</span><span class="n">1</span>, ch<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 308</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>file.eof<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k1">return</span> <span class="s">""</span><span class="k2">;</span> <span class="c">// strange error</span>
<span class="number"> 309</span>  file.close<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 310</span>  <span class="k1">return</span> input<span class="k2">;</span>
<span class="number"> 311</span><span class="k2">}</span>
<span class="number"> 312</span>
<span class="number"> 313</span>
<span class="number"> 314</span>
<span class="number"> 315</span>
<span class="number"> 316</span><span class="p">#include &lt;fstream&gt;</span>
<span class="number"> 317</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number"> 318</span><span class="p">#include &lt;string&gt;</span>
<span class="number"> 319</span><span class="k1">static</span> <span class="k1">bool</span> file_put_contents<span class="k2">(</span>std::string filename, std::string contents<span class="k2">)</span>
<span class="number"> 320</span><span class="k2">{</span>
<span class="number"> 321</span>  std::ofstream file<span class="k2">;</span>
<span class="number"> 322</span>  file.open<span class="k2">(</span>filename.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 323</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>file.is_open<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 324</span>  file <span class="k3">&lt;</span><span class="k3">&lt;</span> contents.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 325</span>  file.close<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 326</span>  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 327</span><span class="k2">}</span>
<span class="number"> 328</span>
<span class="number"> 329</span>
<span class="number"> 330</span>
<span class="number"> 331</span>
<span class="number"> 332</span><span class="k1">static</span> std::string strtoupper<span class="k2">(</span>std::string input<span class="k2">)</span>
<span class="number"> 333</span><span class="k2">{</span>
<span class="number"> 334</span>  <span class="k1">for</span> <span class="k2">(</span><span class="k1">unsigned</span> i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span>input.size<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 335</span>    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>input.at<span class="k2">(</span>i<span class="k2">)</span> <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">122</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>input.at<span class="k2">(</span>i<span class="k2">)</span> <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">97</span><span class="k2">)</span><span class="k2">)</span> input<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">=</span> input<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">-</span> <span class="n">32</span><span class="k2">;</span>
<span class="number"> 336</span>  <span class="k1">return</span> input<span class="k2">;</span>
<span class="number"> 337</span><span class="k2">}</span>
<span class="number"> 338</span>
<span class="number"> 339</span>
<span class="number"> 340</span>
<span class="number"> 341</span>
<span class="number"> 342</span><span class="k1">static</span> <span class="k1">void</span> invert<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>img<span class="k2">)</span>
<span class="number"> 343</span><span class="k2">{</span>
<span class="number"> 344</span>  <span class="c">//if (!img) return;</span>
<span class="number"> 345</span>  <span class="k1">int</span> w <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_bitmap_width"><span class="a">al_get_bitmap_width</span></a><span class="k2">(</span>img<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 346</span>  <span class="k1">int</span> h <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_bitmap_height"><span class="a">al_get_bitmap_height</span></a><span class="k2">(</span>img<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 347</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_STATE"><span class="a">ALLEGRO_STATE</span></a> state<span class="k2">;</span>
<span class="number"> 348</span>  <a href="http://www.allegro.cc/manual/al_store_state"><span class="a">al_store_state</span></a><span class="k2">(</span><span class="k3">&amp;</span>state, ALLEGRO_STATE_TARGET_BITMAP<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 349</span>  <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>img<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 350</span>  <a href="http://www.allegro.cc/manual/al_lock_bitmap"><span class="a">al_lock_bitmap</span></a><span class="k2">(</span>img, NULL, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 351</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> pix<span class="k2">;</span>
<span class="number"> 352</span>  <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> x<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> x<span class="k3">&lt;</span>w<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 353</span>    <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> y<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> y<span class="k3">&lt;</span>h<span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 354</span>    <span class="k2">{</span>
<span class="number"> 355</span>      pix <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_pixel"><span class="a">al_get_pixel</span></a><span class="k2">(</span>img, x, y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 356</span>      <a href="http://www.allegro.cc/manual/al_put_pixel"><span class="a">al_put_pixel</span></a><span class="k2">(</span>x, y, <a href="http://www.allegro.cc/manual/al_map_rgba_f"><span class="a">al_map_rgba_f</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span><span class="k3">-</span>pix.r, <span class="n">1</span>.<span class="n">0</span><span class="k3">-</span>pix.g, <span class="n">1</span>.<span class="n">0</span><span class="k3">-</span>pix.b, pix.a<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 357</span>    <span class="k2">}</span>
<span class="number"> 358</span>  <a href="http://www.allegro.cc/manual/al_unlock_bitmap"><span class="a">al_unlock_bitmap</span></a><span class="k2">(</span>img<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 359</span>  <a href="http://www.allegro.cc/manual/al_restore_state"><span class="a">al_restore_state</span></a><span class="k2">(</span><span class="k3">&amp;</span>state<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 360</span><span class="k2">}</span>
<span class="number"> 361</span>
<span class="number"> 362</span>
<span class="number"> 363</span>
<span class="number"> 364</span>
<span class="number"> 365</span><span class="p">#endif</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Tue, 27 Dec 2011 09:17:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, you defined it, but didn&#39;t use it! <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>The reason why that warning hasn&#39;t appeared until you used the static keyword is because the function may have been referenced by another file, but the static keyword explicitly makes that impossible.  I suppose they warn you about &quot;unused&quot; in case you absentmindedly forgot.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Tue, 27 Dec 2011 09:20:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Is there really any substantial (speed? maybe?) benefit to having the function static inside each object?</p><p>Is <span class="source-code"><span class="k1">static</span></span> only so you can privately use the function inside the object without worrying about external conflicts?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Tue, 27 Dec 2011 09:30:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The compiler can optimize a static function according to whatever is required of it by the caller, without worrying about every possible side effect.  It may inline it without being asked, as well, without having a callable procedure in memory at the same time. Some compilers can optimize globally by looking at all files at once, so to speak, which reduces the effectiveness of static for optimization.  Another benefit is avoiding name space pollution.  That&#39;s all I know.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Tue, 27 Dec 2011 09:35:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Something like:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#define INLINE static inline __attribute__ ((used)) </span>

INLINE <span class="k1">void</span> foo<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span>
</pre></div></div><p>

Edit: actually you probably just want the &quot;unused&quot; attribute, since it only affects the warning.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Tue, 27 Dec 2011 09:37:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Am I correct in feeling the urge to make these functions <span class="source-code"><span class="k1">static</span> <span class="k1">inline</span></span> in the first place?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Tue, 27 Dec 2011 09:53:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Smaller code (i.e., not inline) can be faster if it plays nicer with the cache. </p><p>Benchmark it with and without inline functions to see.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Tue, 27 Dec 2011 10:20:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That really depends though. Optimization is a bit of a dark art. It is possible that your code will get smaller if stuff gets inlined, and optimized into the surrounding code and sharing all kinds of data and statements. And a function call really doesn&#39;t help much with speed, I really doubt it&#39;ll help not inlining code when that code is being called in a tight loop. And I KNOW it won&#39;t do jack if its not being called in a tight loop. If its large code, its going to kill the cache regardless if its inlined or not.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 27 Dec 2011 10:25:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I may be missing something obvious, but... why did you make them static inline, instead of just inline ?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Tue, 27 Dec 2011 16:53:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/609140/941715#target">Audric</a> said:</div><div class="quote"><p> why did you make them static inline, instead of just inline ?</p></div></div><p>Because when it&#39;s just inline, the compiler has to make a callable routine in case some other source file calls it even if it uses inline code in that particular source file.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Tue, 27 Dec 2011 18:41:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Arthur said:</div><div class="quote"><p>the compiler has to make a callable routine in case some other source file calls it</p></div></div><p>
Ah, I can understand that it&#39;s a problem if the linker can&#39;t detect that all those callable routines (There will be one in each .o, ie. one for each .cpp that #includ-ed &quot;useful_header.hpp&quot;) are actually the same, no ambiguity.</p><p>If the linker indeed complains (multiple definitions of...), one way to solve it is to make all callers except one use an &quot;extern inline&quot; definition, and a single one use a &quot;(non-static) inline&quot;.<br />I&#39;d do this using a bit of preprocessor magic, for example:</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#ifdef NON_EXTERN</span>
  <span class="p">#define INLINE_PREFIX inline</span>
<span class="p">#else</span>
  <span class="p">#define INLINE_PREFIX extern inline</span>
<span class="p">#endif</span>
...
INLINE_PREFIX <span class="k1">float</span> degrees_to_radians<span class="k2">(</span><span class="k1">float</span> deg<span class="k2">)</span> <span class="k2">{</span> <span class="k1">return</span> <a href="http://www.allegro.cc/manual/ALLEGRO_PI"><span class="a">ALLEGRO_PI</span></a> <span class="k3">*</span> deg <span class="k3">/</span> <span class="n">180</span>.<span class="n">0f</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Tue, 27 Dec 2011 19:11:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I find it really useful to inline methods of small classes to avoid the mess of making a source file for&#39;em <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (type568)</author>
		<pubDate>Wed, 04 Jan 2012 06:37:07 +0000</pubDate>
	</item>
</rss>
