<?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>Elliott C. Back &#187; C</title>
	<atom:link href="http://elliottback.com/wp/category/computers-technology/code/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://elliottback.com/wp</link>
	<description>Internet &#38; Technology</description>
	<lastBuildDate>Mon, 26 Dec 2011 06:16:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>C++ and the bad_alloc exception</title>
		<link>http://elliottback.com/wp/c-and-the-bad_alloc-exception/</link>
		<comments>http://elliottback.com/wp/c-and-the-bad_alloc-exception/#comments</comments>
		<pubDate>Fri, 08 Jul 2005 18:39:02 +0000</pubDate>
		<dc:creator>Elliott Back</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://elliottback.com/wp/?p=904</guid>
		<description><![CDATA[It&#8217;s interesting that although the C++ standard clearly states that a bad_alloc exception can be thrown by the new operator, there are also trickier ways to invoke that behavior.  From ISO 14822 18.4.1, new and delete:
Return a non-null pointer to suitably aligned storage (basic.stc.dynamic), or else throw a bad_alloc exception. This requirement is binding [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s interesting that although the C++ standard clearly states that a <em>bad_alloc</em> exception can be thrown by the <em>new</em> operator, there are also trickier ways to invoke that behavior.  From ISO 14822 18.4.1, new and delete:</p>
<blockquote><p>Return a non-null pointer to suitably aligned storage (basic.stc.dynamic), or else throw a bad_alloc exception. This requirement is binding on a replacement version of this function</p></blockquote>
<p>Now, take a look at this code:</p>
<pre class="brush:cpp">
vector &lt;string&gt; v;
v.push_b ack("Item One");

for(unsigned int i = 0; i &lt; 2; i++){
    string temp = v[i];
}
</pre>
<p>Although obviously wrong, it will throw a <em>bad_alloc</em> exception.  Calling [] on a vector apparently returns <em>*(begin() + offset)</em>, which when the offset is larger than the size points to invalid memory.  When passed by copy to the string constructor, it&#8217;s then obvious how a <em>bad_alloc</em> exception would get thrown.  However, when you&#8217;re writing c++ code and your program throws <em>bad_alloc</em>, it can be a little harder to work backwards.  CPP is a tiresome language.</p>
]]></content:encoded>
			<wfw:commentRss>http://elliottback.com/wp/c-and-the-bad_alloc-exception/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>When GCC &amp; C++ don&#8217;t play fair</title>
		<link>http://elliottback.com/wp/when-gcc-c-dont-play-fair/</link>
		<comments>http://elliottback.com/wp/when-gcc-c-dont-play-fair/#comments</comments>
		<pubDate>Thu, 30 Jun 2005 02:57:14 +0000</pubDate>
		<dc:creator>Elliott Back</dc:creator>
				<category><![CDATA[C]]></category>

		<guid isPermaLink="false">/?p=886</guid>
		<description><![CDATA[When GCC and C++ don&#8217;t play fair, you get error messages like this:
MyCoolProgram.cpp: In method`void MyCoolProgram::main_thing(const Parameter *)&#8217;:
MyCoolProgram.cpp:48: No match for`Logging&#60;one , Two, Three&#62;::make(const std::string&#038;, int)&#8217;
MyCoolProgram.cpp:50: switch quantity not an integer
MyCoolProgram.cpp:51: case label `&#8221;thing.test.&#8221;&#8216; does not reduce to an integer constant
MyCoolProgram.cpp:53: confused by earlier errors, bailing out
I really find that error message too humane for [...]]]></description>
			<content:encoded><![CDATA[<p>When GCC and C++ don&#8217;t play fair, you get error messages like this:</p>
<blockquote><p>MyCoolProgram.cpp: In method`void MyCoolProgram::main_thing(const Parameter *)&#8217;:<br />
MyCoolProgram.cpp:48: No match for`Logging&lt;one , Two, Three&gt;::make(const std::string&#038;, int)&#8217;<br />
MyCoolProgram.cpp:50: switch quantity not an integer<br />
MyCoolProgram.cpp:51: case label `&#8221;thing.test.&#8221;&#8216; does not reduce to an integer constant<br />
MyCoolProgram.cpp:53: <strong>confused by earlier errors, bailing out</strong></p></blockquote>
<p>I really find that error message too humane for a compiler.  Error messages should be terse, informative, and technical.  They should have razor-edge clarity, and not contain human babble that explains if they are &#8220;confused.&#8221;  Wouldn&#8217;t you rather see something like, &#8220;Error recovery failed:  no possible immediate 4-substitutions allow parsing?&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://elliottback.com/wp/when-gcc-c-dont-play-fair/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hashmap Implementation in C</title>
		<link>http://elliottback.com/wp/hashmap-implementation-in-c/</link>
		<comments>http://elliottback.com/wp/hashmap-implementation-in-c/#comments</comments>
		<pubDate>Thu, 07 Apr 2005 18:03:12 +0000</pubDate>
		<dc:creator>Elliott Back</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">/?p=635</guid>
		<description><![CDATA[Last semester I wrote a Hashmap in C from scratch, which was an interesting experience.  It&#8217;s the first datastructure I wrote in C, since most of the time I&#8217;m working with java, so I learned a lot about pointers and memory allocation (malloc/free).  Just uncommented the &#8220;free()&#8221; at the end I think there [...]]]></description>
			<content:encoded><![CDATA[<p>Last semester I wrote a Hashmap in C from scratch, which was an interesting experience.  It&#8217;s the first datastructure I wrote in C, since most of the time I&#8217;m working with java, so I learned a lot about pointers and memory allocation (malloc/free).  Just uncommented the &#8220;free()&#8221; at the end <del>I think there is one deallocation bug that I didn&#8217;t have a chance to fix</del>, and note that it has references to &#8220;semaphores&#8221; for thread safety, but you can remove those if you&#8217;re in a single threaded environment.  Anyway, the full source code is below, as well as in pdf versions:</p>
<ul>
<li><a href="http://elliottback.com/wp/wp-content/hashmap-code.pdf" title="">hashmap-code.pdf</a></li>
<li><a href="http://elliottback.com/wp/wp-content/hashmap-header.pdf" title="">hashmap-header.pdf</a></li>
</ul>
<p><span id="more-635"></span></p>
<p><strong>HashMap.h</strong>:</p>
<pre>
<font color="#444444">/*
 * Generic hashmap manipulation functions
 */</font>
<font color="0000ff"><strong>#ifndef __HASHMAP_H__</strong></font>
<font color="0000ff"><strong>#define __HASHMAP_H__</strong></font>

<font color="0000ff"><strong>#define MAP_MISSING -3 <font color="#444444"> /* No such element */</font></strong></font>
<font color="0000ff"><strong>#define MAP_FULL -2 <font color="#444444">	/* Hashmap is full */</font></strong></font>
<font color="0000ff"><strong>#define MAP_OMEM -1 <font color="#444444">	/* Out of Memory */</font></strong></font>
<font color="0000ff"><strong>#define MAP_OK 0 <font color="#444444">	/* OK */</font></strong></font>

<font color="#444444">/*
 * any_t is a pointer.  This allows you to put arbitrary structures in
 * the hashmap.
 */</font>
<strong>typedef</strong> <strong>void</strong> <font color="4444FF">*</font><font color="#2040a0">any_t</font><font color="4444FF">;</font>

<font color="#444444">/*
 * PFany is a pointer to a function that can take two any_t arguments
 * and return an integer. Returns status code..
 */</font>
<strong>typedef</strong> <strong>int</strong> <font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">PFany</font><font color="4444FF">)</font><font color="4444FF">(</font><font color="#2040a0">any_t</font>, <font color="#2040a0">any_t</font><font color="4444FF">)</font><font color="4444FF">;</font>

<font color="#444444">/*
 * map_t is a pointer to an internally maintained data structure.
 * Clients of this package do not need to know how hashmaps are
 * represented.  They see and manipulate only map_t's.
 */</font>
<strong>typedef</strong> <font color="#2040a0">any_t</font> <font color="#2040a0">map_t</font><font color="4444FF">;</font>

<font color="#444444">/*
 * Return an empty hashmap. Returns NULL if empty.
*/</font>
<strong>extern</strong> <font color="#2040a0">map_t</font> <font color="#2040a0">hashmap_new</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>

<font color="#444444">/*
 * Iteratively call f with argument (item, data) for
 * each element data in the hashmap. The function must
 * return a map status code. If it returns anything other
 * than MAP_OK the traversal is terminated. f must
 * not reenter any hashmap functions, or deadlock may arise.
 */</font>
<strong>extern</strong> <strong>int</strong> <font color="#2040a0">hashmap_iterate</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font>, <font color="#2040a0">PFany</font> <font color="#2040a0">f</font>, <font color="#2040a0">any_t</font> <font color="#2040a0">item</font><font color="4444FF">)</font><font color="4444FF">;</font>

<font color="#444444">/*
 * Add an element to the hashmap. Return MAP_OK or MAP_OMEM.
 */</font>
<strong>extern</strong> <strong>int</strong> <font color="#2040a0">hashmap_put</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font>, <strong>int</strong> <font color="#2040a0">key</font>, <font color="#2040a0">any_t</font> <font color="#2040a0">value</font><font color="4444FF">)</font><font color="4444FF">;</font>

<font color="#444444">/*
 * Get an element from the hashmap. Return MAP_OK or MAP_MISSING.
 */</font>
<strong>extern</strong> <strong>int</strong> <font color="#2040a0">hashmap_get</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font>, <strong>int</strong> <font color="#2040a0">key</font>, <font color="#2040a0">any_t</font> <font color="4444FF">*</font><font color="#2040a0">arg</font><font color="4444FF">)</font><font color="4444FF">;</font>

<font color="#444444">/*
 * Remove an element from the hashmap. Return MAP_OK or MAP_MISSING.
 */</font>
<strong>extern</strong> <strong>int</strong> <font color="#2040a0">hashmap_remove</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font>, <strong>int</strong> <font color="#2040a0">key</font><font color="4444FF">)</font><font color="4444FF">;</font>

<font color="#444444">/*
 * Get any element. Return MAP_OK or MAP_MISSING.
 * remove - should the element be removed from the hashmap
 */</font>
<strong>extern</strong> <strong>int</strong> <font color="#2040a0">hashmap_get_one</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font>, <font color="#2040a0">any_t</font> <font color="4444FF">*</font><font color="#2040a0">arg</font>, <strong>int</strong> <font color="#2040a0">remove</font><font color="4444FF">)</font><font color="4444FF">;</font>

<font color="#444444">/*
 * Free the hashmap
 */</font>
<strong>extern</strong> <strong>void</strong> <font color="#2040a0">hashmap_free</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font><font color="4444FF">)</font><font color="4444FF">;</font>

<font color="#444444">/*
 * Get the current size of a hashmap
 */</font>
<strong>extern</strong> <strong>int</strong> <font color="#2040a0">hashmap_length</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font><font color="4444FF">)</font><font color="4444FF">;</font>

<font color="0000ff"><strong>#endif __HASHMAP_H__</strong></font></pre>
<p><strong>HashMap.c</strong>:</p>
<pre>
<font color="#444444">/*
 * Generic map implementation. This class is thread-safe.
 * free() must be invoked when only one thread has access to the hashmap.
 */</font>
<font color="0000ff"><strong>#include <font color="#008000">&lt; stdlib.h &gt;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&lt; stdio.h &gt;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&lt; minithreads/hashmap.h &gt;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&lt; minithreads/synch.h &gt;</font></strong></font>

<font color="0000ff"><strong>#define INITIAL_SIZE 1024</strong></font>

// <font color="#2040a0">We</font> <font color="#2040a0">need</font> <font color="#2040a0">to</font> <font color="#2040a0">keep</font> <font color="#2040a0">keys</font> <font color="#2040a0">and</font> <font color="#2040a0">values</font>
<strong>typedef</strong> <strong>struct</strong> <font color="#2040a0">_hashmap_element</font><font color="4444FF"><strong>{</strong></font>
	<strong>int</strong> <font color="#2040a0">key</font><font color="4444FF">;</font>
	<strong>int</strong> <font color="#2040a0">in_use</font><font color="4444FF">;</font>
	<font color="#2040a0">any_t</font> <font color="#2040a0">data</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font> <font color="#2040a0">hashmap_element</font><font color="4444FF">;</font>

// <font color="#2040a0">A</font> <font color="#2040a0">hashmap</font> <font color="#2040a0">has</font> <font color="#2040a0">some</font> <font color="#2040a0">maximum</font> <font color="#2040a0">size</font> <font color="#2040a0">and</font> <font color="#2040a0">current</font> <font color="#2040a0">size</font>,
// <font color="#2040a0">as</font> <font color="#2040a0">well</font> <font color="#2040a0">as</font> <font color="#2040a0">the</font> <font color="#2040a0">data</font> <font color="#2040a0">to</font> <font color="#2040a0">hold</font>.
<strong>typedef</strong> <strong>struct</strong> <font color="#2040a0">_hashmap_map</font><font color="4444FF"><strong>{</strong></font>
	<strong>int</strong> <font color="#2040a0">table_size</font><font color="4444FF">;</font>
	<strong>int</strong> <font color="#2040a0">size</font><font color="4444FF">;</font>
	<font color="#2040a0">hashmap_element</font> <font color="4444FF">*</font><font color="#2040a0">data</font><font color="4444FF">;</font>
	<font color="#2040a0">semaphore_t</font> <font color="#2040a0">lock</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font> <font color="#2040a0">hashmap_map</font><font color="4444FF">;</font>

<font color="#444444">/*
 * Return an empty hashmap, or NULL on failure.
 */</font>
<font color="#2040a0">map_t</font> <font color="#2040a0">hashmap_new</font><font color="4444FF">(</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
	<font color="#2040a0">hashmap_map</font><font color="4444FF">*</font> <font color="#2040a0">m</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">hashmap_map</font><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">malloc</font><font color="4444FF">(</font><strong>sizeof</strong><font color="4444FF">(</font><font color="#2040a0">hashmap_map</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<strong>if</strong><font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">m</font><font color="4444FF">)</font> <strong>goto</strong> <font color="#2040a0">err</font><font color="4444FF">;</font>

	<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">hashmap_element</font><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">calloc</font><font color="4444FF">(</font><font color="#2040a0">INITIAL_SIZE</font>, <strong>sizeof</strong><font color="4444FF">(</font><font color="#2040a0">hashmap_element</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<strong>if</strong><font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">)</font> <strong>goto</strong> <font color="#2040a0">err</font><font color="4444FF">;</font>

	<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">semaphore_t</font><font color="4444FF">)</font> <font color="#2040a0">semaphore_create</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<strong>if</strong><font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font> <strong>goto</strong> <font color="#2040a0">err</font><font color="4444FF">;</font>
	<font color="#2040a0">semaphore_initialize</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font>, <font color="#FF0000">1</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font> <font color="4444FF">=</font> <font color="#2040a0">INITIAL_SIZE</font><font color="4444FF">;</font>
	<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>

	<strong>return</strong> <font color="#2040a0">m</font><font color="4444FF">;</font>
	<font color="#2040a0">err</font><font color="4444FF">:</font>
		<strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">)</font>
			<font color="#2040a0">hashmap_free</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">)</font><font color="4444FF">;</font>
		<strong>return</strong> <font color="#2040a0">NULL</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>

<font color="#444444">/*
 * Hashing function for an integer
 */</font>
<strong>unsigned</strong> <strong>int</strong> <font color="#2040a0">hashmap_hash_int</font><font color="4444FF">(</font><font color="#2040a0">hashmap_map</font> <font color="4444FF">*</font> <font color="#2040a0">m</font>, <strong>unsigned</strong> <strong>int</strong> <font color="#2040a0">key</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
	<font color="#444444">/* Robert Jenkins' 32 bit Mix Function */</font>
	<font color="#2040a0">key</font> <font color="4444FF">+</font><font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">key</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#FF0000">12</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="#2040a0">key</font> ^<font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">key</font> <font color="4444FF">&gt;</font><font color="4444FF">&gt;</font> <font color="#FF0000">22</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="#2040a0">key</font> <font color="4444FF">+</font><font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">key</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#FF0000">4</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="#2040a0">key</font> ^<font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">key</font> <font color="4444FF">&gt;</font><font color="4444FF">&gt;</font> <font color="#FF0000">9</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="#2040a0">key</font> <font color="4444FF">+</font><font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">key</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#FF0000">10</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="#2040a0">key</font> ^<font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">key</font> <font color="4444FF">&gt;</font><font color="4444FF">&gt;</font> <font color="#FF0000">2</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="#2040a0">key</font> <font color="4444FF">+</font><font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">key</font> <font color="4444FF">&lt;</font><font color="4444FF">&lt;</font> <font color="#FF0000">7</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="#2040a0">key</font> ^<font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">key</font> <font color="4444FF">&gt;</font><font color="4444FF">&gt;</font> <font color="#FF0000">12</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<font color="#444444">/* Knuth's Multiplicative Method */</font>
	<font color="#2040a0">key</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">key</font> <font color="4444FF">&gt;</font><font color="4444FF">&gt;</font> <font color="#FF0000">3</font><font color="4444FF">)</font> <font color="4444FF">*</font> <font color="#FF0000">2654435761</font><font color="4444FF">;</font>

	<strong>return</strong> <font color="#2040a0">key</font> <font color="4444FF">%</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>

<font color="#444444">/*
 * Return the integer of the location in data
 * to store the point to the item, or MAP_FULL.
 */</font>
<strong>int</strong> <font color="#2040a0">hashmap_hash</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font>, <strong>int</strong> <font color="#2040a0">key</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
	<strong>int</strong> <font color="#2040a0">curr</font><font color="4444FF">;</font>
	<strong>int</strong> <font color="#2040a0">i</font><font color="4444FF">;</font>

	<font color="#444444">/* Cast the hashmap */</font>
	<font color="#2040a0">hashmap_map</font><font color="4444FF">*</font> <font color="#2040a0">m</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">hashmap_map</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">in</font><font color="4444FF">;</font>

	<font color="#444444">/* If full, return immediately */</font>
	<strong>if</strong><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font><font color="4444FF">)</font> <strong>return</strong> <font color="#2040a0">MAP_FULL</font><font color="4444FF">;</font>

	<font color="#444444">/* Find the best index */</font>
	<font color="#2040a0">curr</font> <font color="4444FF">=</font> <font color="#2040a0">hashmap_hash_int</font><font color="4444FF">(</font><font color="#2040a0">m</font>, <font color="#2040a0">key</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<font color="#444444">/* Linear probling */</font>
	<strong>for</strong><font color="4444FF">(</font><font color="#2040a0">i</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
		<strong>if</strong><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">curr</font><font color="4444FF">]</font>.<font color="#2040a0">in_use</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font>
			<strong>return</strong> <font color="#2040a0">curr</font><font color="4444FF">;</font>

		<strong>if</strong><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">curr</font><font color="4444FF">]</font>.<font color="#2040a0">key</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">key</font> <font color="4444FF">&amp;</font><font color="4444FF">&amp;</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">curr</font><font color="4444FF">]</font>.<font color="#2040a0">in_use</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#FF0000">1</font><font color="4444FF">)</font>
			<strong>return</strong> <font color="#2040a0">curr</font><font color="4444FF">;</font>

		<font color="#2040a0">curr</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">curr</font> <font color="4444FF">+</font> <font color="#FF0000">1</font><font color="4444FF">)</font> <font color="4444FF">%</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font><font color="4444FF">;</font>
	<font color="4444FF"><strong>}</strong></font>

	<strong>return</strong> <font color="#2040a0">MAP_FULL</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>

<font color="#444444">/*
 * Doubles the size of the hashmap, and rehashes all the elements
 */</font>
<strong>int</strong> <font color="#2040a0">hashmap_rehash</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
	<strong>int</strong> <font color="#2040a0">i</font><font color="4444FF">;</font>
	<strong>int</strong> <font color="#2040a0">old_size</font><font color="4444FF">;</font>
	<font color="#2040a0">hashmap_element</font><font color="4444FF">*</font> <font color="#2040a0">curr</font><font color="4444FF">;</font>

	<font color="#444444">/* Setup the new elements */</font>
	<font color="#2040a0">hashmap_map</font> <font color="4444FF">*</font><font color="#2040a0">m</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">hashmap_map</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">in</font><font color="4444FF">;</font>
	<font color="#2040a0">hashmap_element</font><font color="4444FF">*</font> <font color="#2040a0">temp</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">hashmap_element</font> <font color="4444FF">*</font><font color="4444FF">)</font>
		<font color="#2040a0">calloc</font><font color="4444FF">(</font><font color="#FF0000">2</font> <font color="4444FF">*</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font>, <strong>sizeof</strong><font color="4444FF">(</font><font color="#2040a0">hashmap_element</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<strong>if</strong><font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">temp</font><font color="4444FF">)</font> <strong>return</strong> <font color="#2040a0">MAP_OMEM</font><font color="4444FF">;</font>

	<font color="#444444">/* Update the array */</font>
	<font color="#2040a0">curr</font> <font color="4444FF">=</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">;</font>
	<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font> <font color="4444FF">=</font> <font color="#2040a0">temp</font><font color="4444FF">;</font>

	<font color="#444444">/* Update the size */</font>
	<font color="#2040a0">old_size</font> <font color="4444FF">=</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font><font color="4444FF">;</font>
	<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font> <font color="4444FF">=</font> <font color="#FF0000">2</font> <font color="4444FF">*</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font><font color="4444FF">;</font>
	<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>

	<font color="#444444">/* Rehash the elements */</font>
	<strong>for</strong><font color="4444FF">(</font><font color="#2040a0">i</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font> <font color="4444FF">&lt;</font> <font color="#2040a0">old_size</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
		<strong>int</strong> <font color="#2040a0">status</font> <font color="4444FF">=</font> <font color="#2040a0">hashmap_put</font><font color="4444FF">(</font><font color="#2040a0">m</font>, <font color="#2040a0">curr</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font>.<font color="#2040a0">key</font>, <font color="#2040a0">curr</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font>.<font color="#2040a0">data</font><font color="4444FF">)</font><font color="4444FF">;</font>
		<strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">status</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#2040a0">MAP_OK</font><font color="4444FF">)</font>
			<strong>return</strong> <font color="#2040a0">status</font><font color="4444FF">;</font>
	<font color="4444FF"><strong>}</strong></font>

	<font color="#2040a0">free</font><font color="4444FF">(</font><font color="#2040a0">curr</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<strong>return</strong> <font color="#2040a0">MAP_OK</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>

<font color="#444444">/*
 * Add a pointer to the hashmap with some key
 */</font>
<strong>int</strong> <font color="#2040a0">hashmap_put</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font>, <strong>int</strong> <font color="#2040a0">key</font>, <font color="#2040a0">any_t</font> <font color="#2040a0">value</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
	<strong>int</strong> <font color="#2040a0">index</font><font color="4444FF">;</font>
	<font color="#2040a0">hashmap_map</font><font color="4444FF">*</font> <font color="#2040a0">m</font><font color="4444FF">;</font>

	<font color="#444444">/* Cast the hashmap */</font>
	<font color="#2040a0">m</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">hashmap_map</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">in</font><font color="4444FF">;</font>

	<font color="#444444">/* Lock for concurrency */</font>
	<font color="#2040a0">semaphore_P</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<font color="#444444">/* Find a place to put our value */</font>
	<font color="#2040a0">index</font> <font color="4444FF">=</font> <font color="#2040a0">hashmap_hash</font><font color="4444FF">(</font><font color="#2040a0">in</font>, <font color="#2040a0">key</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<strong>while</strong><font color="4444FF">(</font><font color="#2040a0">index</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">MAP_FULL</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
		<strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">hashmap_rehash</font><font color="4444FF">(</font><font color="#2040a0">in</font><font color="4444FF">)</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">MAP_OMEM</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
			<font color="#2040a0">semaphore_V</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>
			<strong>return</strong> <font color="#2040a0">MAP_OMEM</font><font color="4444FF">;</font>
		<font color="4444FF"><strong>}</strong></font>
		<font color="#2040a0">index</font> <font color="4444FF">=</font> <font color="#2040a0">hashmap_hash</font><font color="4444FF">(</font><font color="#2040a0">in</font>, <font color="#2040a0">key</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="4444FF"><strong>}</strong></font>

	<font color="#444444">/* Set the data */</font>
	<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">index</font><font color="4444FF">]</font>.<font color="#2040a0">data</font> <font color="4444FF">=</font> <font color="#2040a0">value</font><font color="4444FF">;</font>
	<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">index</font><font color="4444FF">]</font>.<font color="#2040a0">key</font> <font color="4444FF">=</font> <font color="#2040a0">key</font><font color="4444FF">;</font>
	<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">index</font><font color="4444FF">]</font>.<font color="#2040a0">in_use</font> <font color="4444FF">=</font> <font color="#FF0000">1</font><font color="4444FF">;</font>
	<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">;</font> 

	<font color="#444444">/* Unlock */</font>
	<font color="#2040a0">semaphore_V</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<strong>return</strong> <font color="#2040a0">MAP_OK</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>

<font color="#444444">/*
 * Get your pointer out of the hashmap with a key
 */</font>
<strong>int</strong> <font color="#2040a0">hashmap_get</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font>, <strong>int</strong> <font color="#2040a0">key</font>, <font color="#2040a0">any_t</font> <font color="4444FF">*</font><font color="#2040a0">arg</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
	<strong>int</strong> <font color="#2040a0">curr</font><font color="4444FF">;</font>
	<strong>int</strong> <font color="#2040a0">i</font><font color="4444FF">;</font>
	<font color="#2040a0">hashmap_map</font><font color="4444FF">*</font> <font color="#2040a0">m</font><font color="4444FF">;</font>

	<font color="#444444">/* Cast the hashmap */</font>
	<font color="#2040a0">m</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">hashmap_map</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">in</font><font color="4444FF">;</font>

	<font color="#444444">/* Lock for concurrency */</font>
	<font color="#2040a0">semaphore_P</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>		

	<font color="#444444">/* Find data location */</font>
	<font color="#2040a0">curr</font> <font color="4444FF">=</font> <font color="#2040a0">hashmap_hash_int</font><font color="4444FF">(</font><font color="#2040a0">m</font>, <font color="#2040a0">key</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<font color="#444444">/* Linear probing, if necessary */</font>
	<strong>for</strong><font color="4444FF">(</font><font color="#2040a0">i</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

		<strong>if</strong><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">curr</font><font color="4444FF">]</font>.<font color="#2040a0">key</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">key</font> <font color="4444FF">&amp;</font><font color="4444FF">&amp;</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">curr</font><font color="4444FF">]</font>.<font color="#2040a0">in_use</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#FF0000">1</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
			<font color="4444FF">*</font><font color="#2040a0">arg</font> <font color="4444FF">=</font> <font color="4444FF">(</font><strong>int</strong> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">curr</font><font color="4444FF">]</font>.<font color="#2040a0">data</font><font color="4444FF">)</font><font color="4444FF">;</font>
			<font color="#2040a0">semaphore_V</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>
			<strong>return</strong> <font color="#2040a0">MAP_OK</font><font color="4444FF">;</font>
		<font color="4444FF"><strong>}</strong></font>

		<font color="#2040a0">curr</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">curr</font> <font color="4444FF">+</font> <font color="#FF0000">1</font><font color="4444FF">)</font> <font color="4444FF">%</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font><font color="4444FF">;</font>
	<font color="4444FF"><strong>}</strong></font>

	<font color="4444FF">*</font><font color="#2040a0">arg</font> <font color="4444FF">=</font> <font color="#2040a0">NULL</font><font color="4444FF">;</font>

	<font color="#444444">/* Unlock */</font>
	<font color="#2040a0">semaphore_V</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<font color="#444444">/* Not found */</font>
	<strong>return</strong> <font color="#2040a0">MAP_MISSING</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>

<font color="#444444">/*
 * Get a random element from the hashmap
 */</font>
<strong>int</strong> <font color="#2040a0">hashmap_get_one</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font>, <font color="#2040a0">any_t</font> <font color="4444FF">*</font><font color="#2040a0">arg</font>, <strong>int</strong> <font color="#2040a0">remove</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
	<strong>int</strong> <font color="#2040a0">i</font><font color="4444FF">;</font>
	<font color="#2040a0">hashmap_map</font><font color="4444FF">*</font> <font color="#2040a0">m</font><font color="4444FF">;</font>

	<font color="#444444">/* Cast the hashmap */</font>
	<font color="#2040a0">m</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">hashmap_map</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">in</font><font color="4444FF">;</font>

	<font color="#444444">/* On empty hashmap return immediately */</font>
	<strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">hashmap_length</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">)</font> <font color="4444FF">&lt;</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font>
		<strong>return</strong> <font color="#2040a0">MAP_MISSING</font><font color="4444FF">;</font>

	<font color="#444444">/* Lock for concurrency */</font>
	<font color="#2040a0">semaphore_P</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<font color="#444444">/* Linear probing */</font>
	<strong>for</strong><font color="4444FF">(</font><font color="#2040a0">i</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font>
		<strong>if</strong><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font>.<font color="#2040a0">in_use</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
			<font color="4444FF">*</font><font color="#2040a0">arg</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">any_t</font><font color="4444FF">)</font> <font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font>.<font color="#2040a0">data</font><font color="4444FF">)</font><font color="4444FF">;</font>
			<strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">remove</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
				<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font>.<font color="#2040a0">in_use</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>
				<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font><font color="4444FF">-</font><font color="4444FF">-</font><font color="4444FF">;</font>
			<font color="4444FF"><strong>}</strong></font>
			<font color="#2040a0">semaphore_V</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>
			<strong>return</strong> <font color="#2040a0">MAP_OK</font><font color="4444FF">;</font>
		<font color="4444FF"><strong>}</strong></font>

	<font color="#444444">/* Unlock */</font>
	<font color="#2040a0">semaphore_V</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<strong>return</strong> <font color="#2040a0">MAP_OK</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>

<font color="#444444">/*
 * Iterate the function parameter over each element in the hashmap.  The
 * additional any_t argument is passed to the function as its first
 * argument and the hashmap element is the second.
 */</font>
<strong>int</strong> <font color="#2040a0">hashmap_iterate</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font>, <font color="#2040a0">PFany</font> <font color="#2040a0">f</font>, <font color="#2040a0">any_t</font> <font color="#2040a0">item</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
	<strong>int</strong> <font color="#2040a0">i</font><font color="4444FF">;</font>

	<font color="#444444">/* Cast the hashmap */</font>
	<font color="#2040a0">hashmap_map</font><font color="4444FF">*</font> <font color="#2040a0">m</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">hashmap_map</font><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">in</font><font color="4444FF">;</font>

	<font color="#444444">/* On empty hashmap, return immediately */</font>
	<strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">hashmap_length</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">)</font> <font color="4444FF">&lt;</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font>
		<strong>return</strong> <font color="#2040a0">MAP_MISSING</font><font color="4444FF">;</font>	

	<font color="#444444">/* Lock for concurrency */</font>
	<font color="#2040a0">semaphore_P</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<font color="#444444">/* Linear probing */</font>
	<strong>for</strong><font color="4444FF">(</font><font color="#2040a0">i</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font>
		<strong>if</strong><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font>.<font color="#2040a0">in_use</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
			<font color="#2040a0">any_t</font> <font color="#2040a0">data</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">any_t</font><font color="4444FF">)</font> <font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font>.<font color="#2040a0">data</font><font color="4444FF">)</font><font color="4444FF">;</font>
			<strong>int</strong> <font color="#2040a0">status</font> <font color="4444FF">=</font> <font color="#2040a0">f</font><font color="4444FF">(</font><font color="#2040a0">item</font>, <font color="#2040a0">data</font><font color="4444FF">)</font><font color="4444FF">;</font>
			<strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">status</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#2040a0">MAP_OK</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
				<font color="#2040a0">semaphore_V</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>
				<strong>return</strong> <font color="#2040a0">status</font><font color="4444FF">;</font>
			<font color="4444FF"><strong>}</strong></font>
		<font color="4444FF"><strong>}</strong></font>

	<font color="#444444">/* Unlock */</font>
	<font color="#2040a0">semaphore_V</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>return</strong> <font color="#2040a0">MAP_OK</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>

<font color="#444444">/*
 * Remove an element with that key from the map
 */</font>
<strong>int</strong> <font color="#2040a0">hashmap_remove</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font>, <strong>int</strong> <font color="#2040a0">key</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
	<strong>int</strong> <font color="#2040a0">i</font><font color="4444FF">;</font>
	<strong>int</strong> <font color="#2040a0">curr</font><font color="4444FF">;</font>
	<font color="#2040a0">hashmap_map</font><font color="4444FF">*</font> <font color="#2040a0">m</font><font color="4444FF">;</font>

	<font color="#444444">/* Cast the hashmap */</font>
	<font color="#2040a0">m</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">hashmap_map</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">in</font><font color="4444FF">;</font>

	<font color="#444444">/* Lock for concurrency */</font>
	<font color="#2040a0">semaphore_P</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<font color="#444444">/* Find key */</font>
	<font color="#2040a0">curr</font> <font color="4444FF">=</font> <font color="#2040a0">hashmap_hash_int</font><font color="4444FF">(</font><font color="#2040a0">m</font>, <font color="#2040a0">key</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<font color="#444444">/* Linear probing, if necessary */</font>
	<strong>for</strong><font color="4444FF">(</font><font color="#2040a0">i</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
		<strong>if</strong><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">curr</font><font color="4444FF">]</font>.<font color="#2040a0">key</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#2040a0">key</font> <font color="4444FF">&amp;</font><font color="4444FF">&amp;</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">curr</font><font color="4444FF">]</font>.<font color="#2040a0">in_use</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="#FF0000">1</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
			<font color="#444444">/* Blank out the fields */</font>
			<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">curr</font><font color="4444FF">]</font>.<font color="#2040a0">in_use</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>
			<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">curr</font><font color="4444FF">]</font>.<font color="#2040a0">data</font> <font color="4444FF">=</font> <font color="#2040a0">NULL</font><font color="4444FF">;</font>
			<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#2040a0">curr</font><font color="4444FF">]</font>.<font color="#2040a0">key</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>

			<font color="#444444">/* Reduce the size */</font>
			<font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font><font color="4444FF">-</font><font color="4444FF">-</font><font color="4444FF">;</font>
			<font color="#2040a0">semaphore_V</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>
			<strong>return</strong> <font color="#2040a0">MAP_OK</font><font color="4444FF">;</font>
		<font color="4444FF"><strong>}</strong></font>
		<font color="#2040a0">curr</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">curr</font> <font color="4444FF">+</font> <font color="#FF0000">1</font><font color="4444FF">)</font> <font color="4444FF">%</font> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">table_size</font><font color="4444FF">;</font>
	<font color="4444FF"><strong>}</strong></font>

	<font color="#444444">/* Unlock */</font>
	<font color="#2040a0">semaphore_V</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>

	<font color="#444444">/* Data not found */</font>
	<strong>return</strong> <font color="#2040a0">MAP_MISSING</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>

<font color="#444444">/* Deallocate the hashmap */</font>
<strong>void</strong> <font color="#2040a0">hashmap_free</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
	<font color="#2040a0">hashmap_map</font><font color="4444FF">*</font> <font color="#2040a0">m</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">hashmap_map</font><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">in</font><font color="4444FF">;</font>
	<font color="#2040a0">free</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">data</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="#2040a0">semaphore_destroy</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">lock</font><font color="4444FF">)</font><font color="4444FF">;</font>
	<font color="#2040a0">free</font><font color="4444FF">(</font><font color="#2040a0">m</font><font color="4444FF">)</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font>

<font color="#444444">/* Return the length of the hashmap */</font>
<strong>int</strong> <font color="#2040a0">hashmap_length</font><font color="4444FF">(</font><font color="#2040a0">map_t</font> <font color="#2040a0">in</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>
	<font color="#2040a0">hashmap_map</font><font color="4444FF">*</font> <font color="#2040a0">m</font> <font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">hashmap_map</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">in</font><font color="4444FF">;</font>
	<strong>if</strong><font color="4444FF">(</font><font color="#2040a0">m</font> <font color="4444FF">!</font><font color="4444FF">=</font> <font color="#2040a0">NULL</font><font color="4444FF">)</font> <strong>return</strong> <font color="#2040a0">m</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">size</font><font color="4444FF">;</font>
	<strong>else</strong> <strong>return</strong> <font color="#FF0000">0</font><font color="4444FF">;</font>
<font color="4444FF"><strong>}</strong></font></pre>
]]></content:encoded>
			<wfw:commentRss>http://elliottback.com/wp/hashmap-implementation-in-c/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.542 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-10 05:21:48 -->

