PageSourceSearch

https://preshing.com/

html preshing.com collected 2026-09-24 17:19:09 UTC 24,664 bytes, 717 lines download raw bytes

1
2<!DOCTYPE html>
3<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
4<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
5<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
6<head>
7  <meta charset="utf-8" />
8  <title>Preshing on Programming</title>
9  <meta name="author" content="Jeff Preshing" />
10
11  
12  
13  <meta name="description" content="C is a simple language. You&rsquo;re only allowed to have one function with each name. C++, on the other hand, gives you much more flexibility: You can have multiple functions &hellip;" />
14  
15  
16
17  <!-- http://t.co/dKP3o1e -->
18  <meta name="HandheldFriendly" content="True" />
19  <meta name="MobileOptimized" content="320" />
20  <meta name="viewport" content="width=device-width, initial-scale=1" />
21
22  <link rel="canonical" href="https://preshing.com" />
23  <link href="/favicon.png" rel="icon" />
24  <link href="/stylesheets/screen.css?v2" media="screen, projection" rel="stylesheet" type="text/css" />
25  <link href="/feed" rel="alternate" title="Preshing on Programming" type="application/atom+xml" />
26  
26<script src="/javascripts/modernizr-2.0.js"></script>
26
27  
27<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
27
28  
28<script>!window.jQuery && document.write(unescape('%3Cscript src="./javascripts/lib/jquery.min.js"%3E%3C/script%3E'))</script>
28
29  
29<script src="/javascripts/octopress.js" type="text/javascript"></script>
29
30  
31  
31<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
31
32
33  
34  
34<script type="text/javascript">
35    var _gaq = _gaq || [];
36    _gaq.push(['_setAccount', 'UA-44017752-1']);
37    _gaq.push(['_trackPageview']);
38
39    (function() {
40      var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
41      ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
42      var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
43    })();
44  </script>
44
45
46
47</head>
48
49<body   >
50  <header role="banner"><hgroup>
51  <h1><a href="/"><img src="/images/header.png" alt="Preshing on Programming"/>Preshing on Programming</a></h1>
52  
53</hgroup>
54
55</header>
56  <nav role="navigation"><ul class="subscription" data-subscription="rss">
57  <li><a href="https://twitter.com/preshing" rel="follow-twitter" title="Follow on Twitter">Twitter</a></li>
58  <li><a href="/feed" rel="subscribe-rss" title="Subscribe via RSS">RSS</a></li>
59  
60</ul>
61  
62<ul class="main-navigation">
63  <li><a href="/">Blog</a></li>
64  <li><a href="/archives">Archives</a></li>
65  <li><a href="/about">About</a></li>
66  <li><a href="/contact">Contact</a></li>
67</ul>
68
69</nav>
70  <div id="main">
71    <div id="content">
72      <div class="blog-index">
73  
74  
75  
76    <article>
77      
78  <header>
79    
80      <p class="meta">
81        
82
83
84
85
86
87
88
89
90  
91
92
93<time datetime="2021-03-15T08:10:00-04:00" pubdate data-updated="true">Mar 15, 2021</time>
94        
95      </p>
96    
97    
98      <h1 class="entry-title"><a href="/20210315/how-cpp-resolves-a-function-call">How C++ Resolves a Function Call</a></h1>
99    
100  </header>
101
102
103  <div class="entry-content"><p>C is a simple language. You&rsquo;re only allowed to have one function with each name. C++, on the other hand, gives you much more flexibility:</p>
104
105<ul>
106  <li>You can have multiple functions with the same name (<a href="https://docs.microsoft.com/en-us/cpp/cpp/function-overloading">overloading</a>).</li>
107  <li>You can overload <a href="https://isocpp.org/wiki/faq/operator-overloading">built-in operators</a> like <code>+</code> and <code>==</code>.</li>
108  <li>You can write <a href="https://isocpp.org/wiki/faq/templates#fn-templates">function templates</a>.</li>
109  <li><a href="https://docs.microsoft.com/en-us/cpp/cpp/namespaces-cpp">Namespaces</a> help you avoid naming conflicts.</li>
110</ul>
111
112<p>I like these C++ features. With these features, you can make <code>str1 + str2</code> return the concatenation of two strings. You can have a pair of 2D points, and another pair of 3D points, and overload <code>dot(a, b)</code> to work with either type. You can have a bunch of array-like classes and write a single <code>sort</code> function template that works with all of them.</p>
113
114</div>
115  
116  
117    <footer>
118      <a rel="full-article" href="/20210315/how-cpp-resolves-a-function-call">Read on &rarr;</a>
119    </footer>
120  
121
122
123    </article>
124  
125  
126    <article>
127      
128  <header>
129    
130      <p class="meta">
131        
132
133
134
135
136
137
138
139
140  
141
142
143<time datetime="2020-12-10T15:23:00-05:00" pubdate data-updated="true">Dec 10, 2020</time>
144        
145      </p>
146    
147    
148      <h1 class="entry-title"><a href="/20201210/flap-hero-code-review">Flap Hero Code Review</a></h1>
149    
150  </header>
151
152
153  <div class="entry-content"><p>Flap Hero is a small game written entirely in C++ without using an existing game engine. All of its source code is available <a href="https://github.com/arc80/FlapHero">on GitHub</a>. I think it can serve as an interesting resource for novice and intermediate game developers to study.</p>
154
155<p><a href="https://github.com/arc80/FlapHero"><img class="center" src="/images/flaphero-github-button.svg" /></a></p>
156
157<p>In this post, I&rsquo;ll explain how Flap Hero&rsquo;s code is organized, how it differs from larger game projects, why it was written that way, and what could have been done better.</p>
158
159<p>Very little information in this post is specific to C++. Most of it would still be relevant if Flap Hero was written in another language like C#, Rust or plain C. That said, if you browse (or build) the source code, you will need some fluency in C++. <a href="https://learncpp.com">Learn C++</a> and <a href="https://learnopengl.com">Learn OpenGL</a> are two great resources for beginners. For the most part, Flap Hero&rsquo;s source code sticks to a fairly straightforward subset of C++, but the deeper you go into its low-level modules (like <a href="https://github.com/arc80/plywood/tree/main/repos/plywood/src/runtime/ply-runtime"><code>runtime</code></a>), the more you&rsquo;ll encounter advanced C++ features like templates and SFINAE.</p>
160
161</div>
162  
163  
164    <footer>
165      <a rel="full-article" href="/20201210/flap-hero-code-review">Read on &rarr;</a>
166    </footer>
167  
168
169
170    </article>
171  
172  
173    <article>
174      
175  <header>
176    
177      <p class="meta">
178        
179
180
181
182
183
184
185
186
187  
188
189
190<time datetime="2020-11-26T07:52:00-05:00" pubdate data-updated="true">Nov 26, 2020</time>
191        
192      </p>
193    
194    
195      <h1 class="entry-title"><a href="/20201126/a-small-open-source-game-in-cpp">A Small Open Source Game In C++</a></h1>
196    
197  </header>
198
199
200  <div class="entry-content"><p>I just released a mobile game called <strong>Flap Hero</strong>. It&rsquo;s a <a href="https://en.wikipedia.org/wiki/Flappy_Bird">Flappy Bird</a> clone with cartoony graphics and a couple of twists: You can go in the pipes (wow!) and it takes <em>two</em> collisions to end the game. Flap Hero is free, quick to download (between 3 - 5 MB) and opens instantly. Give it a try!</p>
201
202<div style="text-align:center;margin-bottom:1.3em">
203<a href="https://apps.apple.com/gb/app/flap-hero/id1538082494"><img src="/images/Download_on_the_App_Store_Badge_US-UK_RGB_blk_092917.svg" width="161" height="54" style="margin:0 20px" /></a>
204<a href="https://play.google.com/store/apps/details?id=com.arc80.flaphero"><img src="/images/google-play-badge.png" width="181" height="54" style="margin:0 20px" /></a>
205</div>
206
207<video width="300" height="400" autoplay="" loop="" controls="" muted="">
208  <source src="/images/[email protected]" type="video/mp4" />
209</video>
210
211<p>Flap Hero is <strong>open source</strong>, too. Its source code is released under the MIT license and its assets (3D models, sounds, music) are dedicated to the public domain. Do whatever you want with them! Everything&r
211squo;s available <a href="https://github.com/arc80/FlapHero">on GitHub</a>.</p>
212
213</div>
214  
215  
216    <footer>
217      <a rel="full-article" href="/20201126/a-small-open-source-game-in-cpp">Read on &rarr;</a>
218    </footer>
219  
220
221
222    </article>
223  
224  
225    <article>
226      
227  <header>
228    
229      <p class="meta">
230        
231
232
233
234
235
236
237
238
239  
240
241
242<time datetime="2020-07-27T16:10:00-04:00" pubdate data-updated="true">Jul 27, 2020</time>
243        
244      </p>
245    
246    
247      <h1 class="entry-title"><a href="/20200727/automatically-detecting-text-encodings-in-cpp">Automatically Detecting Text Encodings in C++</a></h1>
248    
249  </header>
250
251
252  <div class="entry-content"><p>Consider the lowly text file.</p>
253
254<p><img class="center" src="/images/untitled_txt.png" /></p>
255
256<p>This text file can take on a surprising number of different formats. The text could be encoded as <a href="https://en.wikipedia.org/wiki/ASCII">ASCII</a>, <a href="https://en.wikipedia.org/wiki/UTF-8">UTF-8</a>, <a href="https://en.wikipedia.org/wiki/UTF-16">UTF-16</a> (little or big-endian), <a href="https://en.wikipedia.org/wiki/Windows-1252">Windows-1252</a>, <a href="https://en.wikipedia.org/wiki/Shift_JIS">Shift JIS</a>, or any of dozens of other encodings. The file may or may not begin with a <a href="https://en.wikipedia.org/wiki/Byte_order_mark">byte order mark (BOM)</a>. Lines of text could be terminated with a linefeed character <code>\n</code> (typical on UNIX), a CRLF sequence <code>\r\n</code> (typical on Windows) or, if the file was created on an older system, <a href="https://en.wikipedia.org/wiki/Newline#Representation">some other character sequence</a>.</p>
257
258<p>Sometimes it&rsquo;s impossible to determine the encoding used by a particular text file. For example, suppose a file contains the following bytes:</p>
259
260</div>
261  
262  
263    <footer>
264      <a rel="full-article" href="/20200727/automatically-detecting-text-encodings-in-cpp">Read on &rarr;</a>
265    </footer>
266  
267
268
269    </article>
270  
271  
272    <article>
273      
274  <header>
275    
276      <p class="meta">
277        
278
279
280
281
282
283
284
285
286  
287
288
289<time datetime="2020-07-08T08:15:00-04:00" pubdate data-updated="true">Jul 08, 2020</time>
290        
291      </p>
292    
293    
294      <h1 class="entry-title"><a href="/20200708/io-in-plywood">I/O in Plywood</a></h1>
295    
296  </header>
297
298
299  <div class="entry-content"><p><a href="https://plywood.arc80.com/">Plywood</a> is an open-source C++ framework I released a few weeks ago. It includes, among other things, a <a href="https://github.com/arc80/plywood/tree/main/repos/plywood/src/runtime">runtime module</a> that exposes a cross-platform API for I/O, memory, threads, process management and more.</p>
300
301<p>This post is about the <strong>I/O</strong> part. For those who don&rsquo;t know, I/O stands for <a href="https://en.wikipedia.org/wiki/Input/output">input/output</a>, and refers to the part of a computer system that either <strong>writes serialized data to</strong> or <strong>reads serialized data from</strong> an external interface. The external interface could be a storage device, pipe, network connection or any other type of communication channel.</p>
302
303<p><img class="center" src="/images/c1571-drive.jpg" /></p>
304
305<p>Typically, it&rsquo;s the operating system&rsquo;s responsibility to provide low-level I/O services to an application. But there&rsquo;s still plenty of work that needs to happen at the application level, such as buffering, data conversion, performance tuning and exposing an interface that makes life easier on application programmers. That&rsquo;s where Plywood&rsquo;s I/O system comes in.</p>
306
307</div>
308  
309  
310    <footer>
311      <a rel="full-article" href="/20200708/io-in-plywood">Read on &rarr;</a>
312    </footer>
313  
314
315
316    </article>
317  
318  
319    <article>
320      
321  <header>
322    
323      <p class="meta">
324        
325
326
327
328
329
330
331
332
333  
334
335
336<time datetime="2020-05-26T07:50:00-04:00" pubdate data-updated="true">May 26, 2020</time>
337        
338      </p>
339    
340    
341      <h1 class="entry-title"><a href="/20200526/a-new-cross-platform-open-source-cpp-framework">A New Cross-Platform Open Source C++ Framework</a></h1>
342    
343  </header>
344
345
346  <div class="entry-content"><p>For the past little while &ndash; OK, long while &ndash; I&rsquo;ve been working on a <a href="https://preshing.com/20171218/how-to-write-your-own-cpp-game-engine">custom game engine in C++</a>. Today, I&rsquo;m releasing part of that game engine as an open source framework. It&rsquo;s called the <strong>Plywood</strong> framework.</p>
347
348<div class="linkPanelSet">
349<div>
350<a href="https://plywood.arc80.com/"><img src="/images/plywood-logo.svg" /><br />
351View the documentation</a>
352</div>
353<div>
354<a href="https://github.com/arc80/plywood"><img src="/images/plywood-github.svg" /><br />
355View on GitHub</a>
356</div>
357</div>
358
359<p>Please note that Plywood, by itself, is <em>not</em> a game engine! It&rsquo;s a framework for building all kinds of software using C++.</p>
360
361<p>For example, Plywood&rsquo;s <a href="https://plywood.arc80.com/">documentation</a>
361 is generated with the help of a C++ parser, formatted by a Markdown parser, and runs on a custom webserver all written using Plywood.</p>
362
363</div>
364  
365  
366    <footer>
367      <a rel="full-article" href="/20200526/a-new-cross-platform-open-source-cpp-framework">Read on &rarr;</a>
368    </footer>
369  
370
371
372    </article>
373  
374  
375    <article>
376      
377  <header>
378    
379      <p class="meta">
380        
381
382
383
384
385
386
387
388
389  
390
391
392<time datetime="2018-01-24T08:07:00-05:00" pubdate data-updated="true">Jan 24, 2018</time>
393        
394      </p>
395    
396    
397      <h1 class="entry-title"><a href="/20180124/a-flexible-reflection-system-in-cpp-part-2">A Flexible Reflection System in C++: Part 2</a></h1>
398    
399  </header>
400
401
402  <div class="entry-content"><p>In <a href="http://preshing.com/20180116/a-primitive-reflection-system-in-cpp-part-1">the previous post</a>, I presented a basic system for <strong>runtime reflection</strong> in C++11. The post included a sample project that created a <strong>type descriptor</strong> using a block of macros:</p>
403
404<div><div class="CodeRay">
405  <div class="code"><pre><span class="comment">// Define Node's type descriptor</span>
406REFLECT_STRUCT_BEGIN(Node)
407REFLECT_STRUCT_MEMBER(key)
408REFLECT_STRUCT_MEMBER(value)
409REFLECT_STRUCT_MEMBER(children)
410REFLECT_STRUCT_END()
411</pre></div>
412</div>
413</div>
414
415<p>At runtime, the type descriptor was found by calling <code>reflect::TypeResolver&lt;Node&gt;::get()</code>.</p>
416
417<p>This reflection system is small but very flexible. In this post, I&rsquo;
417ll extend it to support additional built-in types. You can clone the project <a href="https://github.com/preshing/FlexibleReflection/tree/part1">from GitHub</a> to follow along. At the end, I&rsquo;ll discuss other ways to extend the system.</p>
418
419<p><a href="https://github.com/preshing/FlexibleReflection/tree/part1"><img srcset="/images/github-flexible-reflection.png 1x,/images/[email protected] 2x" class="center" src="/images/github-flexible-reflection.png" /></a></p>
420
421</div>
422  
423  
424    <footer>
425      <a rel="full-article" href="/20180124/a-flexible-reflection-system-in-cpp-part-2">Read on &rarr;</a>
426    </footer>
427  
428
429
430    </article>
431  
432  
433    <article>
434      
435  <header>
436    
437      <p class="meta">
438        
439
440
441
442
443
444
445
446
447  
448
449
450<time datetime="2018-01-16T09:21:00-05:00" pubdate data-updated="true">Jan 16, 2018</time>
451        
452      </p>
453    
454    
455      <h1 class="entry-title"><a href="/20180116/a-primitive-reflection-system-in-cpp-part-1">A Flexible Reflection System in C++: Part 1</a></h1>
456    
457  </header>
458
459
460  <div class="entry-content"><p>In this post, I&rsquo;ll present a small, flexible system for <strong>runtime reflection</strong> using C++11 language features. This is a system to generate <a href="https://en.wikipedia.org/wiki/Metadata">metadata</a> for C++ types. The metadata takes the form of <code>TypeDescriptor</code> objects, created at runtime, that describe the structure of other runtime objects.</p>
461
462<p><img srcset="/images/type-descriptors.png 1x,/images/[email protected] 2x" class="center" src="/images/type-descriptors.png" /></p>
463
464<p>I&rsquo;ll call these objects <strong>type descriptors</strong>. My initial motivation for writing a reflection system was to support <strong>serialization</strong> in my <a href="http://preshing.com/20171218/how-to-write-your-own-cpp-game-engine">custom C++ game engine</a>, since I have very specific needs. Once that worked, I began to use runtime reflection for other engine features, too:</p>
465
466</div>
467  
468  
469    <footer>
470      <a rel="full-article" href="/20180116/a-primitive-reflection-system-in-cpp-part-1">Read on &rarr;</a>
471    </footer>
472  
473
474
475    </article>
476  
477  
478    <article>
479      
480  <header>
481    
482      <p class="meta">
483        
484
485
486
487
488
489
490
491
492  
493
494
495<time datetime="2017-12-18T07:54:00-05:00" pubdate data-updated="true">Dec 18, 2017</time>
496        
497      </p>
498    
499    
500      <h1 class="entry-title"><a href="/20171218/how-to-write-your-own-cpp-game-engine">How to Write Your Own C++ Game Engine</a></h1>
501    
502  </header>
503
504
505  <div class="entry-content"><p>Lately I&rsquo;ve been writing a game engine in C++. I&rsquo;m using it to make a little mobile game called <strong>Hop Out</strong>. Here&rsquo;s a clip captured from my iPhone 6. (Unmute for sound!)</p>
506
507<video width="504" height="284" autoplay="" loop="" controls="" muted="">
508  <source src="/images/hopoutclip.mp4" type="video/mp4" />
509  <source src="/images/hopoutclip.webm" type="video/webm" />
510  <source src="/images/hopoutclip.ogv" type="video/ogg" />
511<img class="center" src="/images/hopout-snap.jpg" />
512</video>
513
514<p>Hop Out is the kind of game I want to play: Retro arcade gameplay with a 3D cartoon look. The goal is to change the color of every pad, like in Q*Bert.</p>
515
516<p>Hop Out is still in development, but the engine powering it is starting to become quite mature, so I thought I&rsquo;d share a few tips about engine development here.</p>
517
518</div>
519  
520  
521    <footer>
522      <a rel="full-article" href="/20171218/how-to-write-your-own-cpp-game-engine">Read on &rarr;</a>
523    </footer>
524  
525
526
527    </article>
528  
529  
530    <article>
531      
532  <header>
533    
534      <p class="meta">
535        
536
537
538
539
540
541
542
543
544  
545
546
547<time datetime="2017-06-12T07:34:00-04:00" pubdate data-updated="true">Jun 12, 2017</time>
548        
549      </p>
550    
551    
552      <h1 class="entry-title"><a href="/20170612/can-reordering-of-release-acquire-operations-introduce-deadlock">Can Reordering of Release/Acquire Operations Introduce Deadlock?</a></h1>
553    
554  </header>
555
556
557  <div class="entry-content"><p>I wasn&rsquo;t planning to write about lock-free programming again, but a commenter named Mike recently asked an interesting question on my <a href="http://preshing.com/20120913/acquire-and-release-semantics">Acquire and Release Semantics</a> post from 2012. It&rsquo;s a question I wondered about years ago, but could never really reconcile until (possibly) now.</p>
558
559<p>A quick recap: A <strong>read-acquire</strong> operation cannot be reordered, either by the compiler or the CPU, with any read or write operation that <em>follows</em> it in program order. A <strong>write-release</strong> operation cannot be reordered with any read or write operation that <em>precedes</em> it in program order.</p>
560
561<p>Those rules <em>don&rsquo;t</em> prevent the reordering of a write-release followed by a read-acquire. For example, in C++, if <code>A</code> and <code>B</code> are <code>std::atomic&lt;int&gt;</code>, and we write:</p>
562
563<div><div class="CodeRay">
564  <div class="code"><pre>A.store(<span class="integer">1</span>, std::memory_order_release);
565<span class="predefined-type">int</span> b = B.load(std::memory_order_acquire);
566</pre></div>
567</div>
568</div>
569
570<p>&hellip;the compiler is free to reorder those statements, as if we had written:</p>
571
572<div><div class="CodeRay">
573  <div class="code"><pre><span class="predefined-type">int</span> b = B.load(std::memory_order_acquire);
574A.store(<span class="integer">1</span>, std::memory_order_release);
575</pre></div>
576</div>
577</div>
578
579<p>And that&rsquo;s fair. Why the heck not? On many architectures, including x86, the CPU could perform this reordering anyway.</p>
580
581</div>
582  
583  
584    <footer>
585      <a rel="full-article" href="/20170612/can-reordering-of-release-acquire-operations-introduce-deadlock">Read on &rarr;</a>
586    </footer>
587  
588
589
590    </article>
591  
592  <div class="pagination">
593    
594      <a class="prev" href="/blog/page/2/">&larr; Older</a>
595    
596    <a href="/archives">Blog Archives</a>
597    
598  </div>
599</div>
600<aside class="sidebar">
601  
602    <section>
603  <a href="https://plywood.arc80.com/"><p style="margin-bottom:0.8em;">Check out <strong>Plywood</strong>, a cross-platform, open source C++ framework:</p>
604  <img srcset="/images/plywood-button.png 1x,/images/[email protected] 2x" src="/images/plywood-button.png" width="165"></a>
605</section>
606<section>
607  <h1>Recent Posts</h1>
608  <ul id="recent_posts">
609    
610      <li class="post">
611        <a href="/20210315/how-cpp-resolves-a-function-call">How C++ Resolves a Function Call</a>
612      </li>
613    
614      <li class="post">
615        <a href="/20201210/flap-hero-code-review">Flap Hero Code Review</a>
616      </li>
617    
618      <li class="post">
619        <a href="/20201126/a-small-open-source-game-in-cpp">A Small Open Source Game In C++</a>
620      </li>
621    
622      <li class="post">
623        <a href="/20200727/automatically-detecting-text-encodings-in-cpp">Automatically Detecting Text Encodings in C++</a>
624      </li>
625    
626      <li class="post">
627        <a href="/20200708/io-in-plywood">I/O in Plywood</a>
628      </li>
629    
630      <li class="post">
631        <a href="/20200526/a-new-cross-platform-open-source-cpp-framework">A New Cross-Platform Open Source C++ Framework</a>
632      </li>
633    
634      <li class="post">
635        <a href="/20180124/a-flexible-reflection-system-in-cpp-part-2">A Flexible Reflection System in C++: Part 2</a>
636      </li>
637    
638      <li class="post">
639        <a href="/20180116/a-primitive-reflection-system-in-cpp-part-1">A Flexible Reflection System in C++: Part 1</a>
640      </li>
641    
642      <li class="post">
643        <a href="/20171218/how-to-write-your-own-cpp-game-engine">How to Write Your Own C++ Game Engine</a>
644      </li>
645    
646      <li class="post">
647        <a href="/20170612/can-reordering-of-release-acquire-operations-introduce-deadlock">Can Reordering of Release/Acquire Operations Introduce Deadlock?</a>
648      </li>
649    
650      <li class="post">
651        <a href="/20170529/heres-a-standalone-cairo-dll-for-windows">Here&#8217;s a Standalone Cairo DLL for Windows</a>
652      </li>
653    
654      <li class="post">
655        <a href="/20170522/learn-cmakes-scripting-language-in-15-minutes">Learn CMake&#8217;s Scripting Language in 15 Minutes</a>
656      </li>
657    
658      <li class="post">
659        <a href="/20170511/how-to-build-a-cmake-based-project">How to Build a CMake-Based Project</a>
660      </li>
661    
662      <li class="post">
663        <a href="/20160726/using-quiescent-states-to-reclaim-memory">Using Quiescent States to Reclaim Memory</a>
664      </li>
665    
666      <li class="post">
667        <a href="/20160314/leapfrog-probing">Leapfrog Probing</a>
668      </li>
669    
670      <li class="post">
671        <a href="/20160222/a-resizable-concurrent-map">A Resizable Concurrent Map</a>
672      </li>
673    
674      <li class="post">
675        <a href="/20160201/new-concurrent-hash-maps-for-cpp">New Concurrent Hash Maps for C++</a>
676      </li>
677    
678      <li class="post">
679        <a href="/20150402/you-can-do-any-kind-of-atomic-read-modify-write-operation">You Can Do Any Kind of Atomic Read-Modify-Write Operation</a>
680      </li>
681    
682      <li class="post">
683        <a href="/20150324/safe-bitfields-in-cpp">Safe Bitfields in C++</a>
684      </li>
685    
686      <li class="post">
687        <a href="/20150316/semaphores-are-surprisingly-versatile">Semaphores are Surprisingly Versatile</a>
688      </li>
689    
690  </ul>
691</section>
692
693  
694</aside>
695
696    </div>
697  </div>
698  <footer role="contentinfo"><p>
699  Copyright &copy; 2021 Jeff Preshing -
700  <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
701</p>
702
703</footer>
704  
705
706
707
708
709
710
711
712
713
714
715
716</body>
717</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.