<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<HTML>
<HEAD>
  <meta name="Classification" content="Software Development">
  <meta name="KeyWords" content="C++,Quality,Code Generation,Codign Standard">
<TITLE>Listing 1</TITLE>
</HEAD>
<BODY>

<table CELLSPACING=0 CELLPADDING=6 WIDTH="100%" BGCOLOR="#009000">
  <tr><td>
    <table COLS=2 WIDTH="100%">
      <tr>
        <td COLSPAN="2">
          <font color="#FFFFFF" size=+4>Sven Rosvall</font>
        </td>
      </tr>
      <tr>
        <td>
          <i><font color="#FFFFFF"></font></i>
        </td>
        <td ALIGN=RIGHT>
          <font color="#FFFFFF">
          <a href="index.html"><font color="#FFFFFF">Home</font></a>
          -
          <a href="/Contact.html"><font color="#FFFFFF">Contact Info</font></a>
          </font>
        </td>
      </tr>
    </table>
  </td></tr>
</table>
<TABLE CELLSPACING=0 CELLPADDING=10>
<TR><TD VALIGN=TOP BGCOLOR="#CCFFFF">
·&nbsp;<A HREF="../index.html">Start</A><BR>
·&nbsp;<A HREF="../Sven-E.html">Sven&nbsp;Rosvall</A><BR>
&nbsp;&nbsp;·&nbsp;<A HREF="../Sven_CV.html">CV</A><BR>
&nbsp;&nbsp;·&nbsp;<A HREF="../Sven_Proj.html">Projects</A><BR>
&nbsp;&nbsp;·&nbsp;<A HREF="Articles.html">Articles</A><BR>
&nbsp;&nbsp;&nbsp;&nbsp;·&nbsp;<A HREF="ArtStrings.html">Mixing&nbsp;Strings&nbsp;in&nbsp;C++</A><BR>
&nbsp;&nbsp;&nbsp;&nbsp;·&nbsp;<A HREF="ArtSafeC.html">C++&nbsp;as&nbsp;a&nbsp;Safer&nbsp;C</A><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·&nbsp;<B>Listing&nbsp;1</B><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·&nbsp;<A HREF="BoundedIntTraits.h">Listing&nbsp;2</A><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;·&nbsp;<A HREF="BoundedPointer.h">Listing&nbsp;3</A><BR>
&nbsp;&nbsp;&nbsp;&nbsp;·&nbsp;<A HREF="CppLookup.html">C++&nbsp;Lookup&nbsp;Mysteries</A><BR>
·&nbsp;<A HREF="../Kari.html">Kari&nbsp;Rosvall</A><BR>
·&nbsp;<A HREF="../Sven_Kari.html">The&nbsp;Rosvalls</A><BR>
</TD><TD VALIGN=TOP>
<H2>Listing 1</H2>
<PRE>
// BoundedInt.h
// Bounds checked integers.
//

#ifndef BoundedInt_h
#define BoundedInt_h

#include &lt;cassert&gt;

#include "BoundedIntTraits.h"

template &lt;int Lower, int Upper, 
          typename INT = typename BoundedIntTraits&lt;Lower, Upper&gt;::Type &gt;
class BoundedInt
{
public:
  // Default constructor
  BoundedInt()
#ifndef NDEBUG
    : m_initialised(false)
#endif
    {}
  // Conversion constructor
  BoundedInt(int i)
    : m_i(i)
#ifndef NDEBUG
    , m_initialised(true)
#endif
    {
      // Check input value
      assert((Lower&lt;=i) &amp;&amp; (i&lt;=Upper));
    }

  // Conversion back to a builtin type
  operator INT()
    {
      assert(m_initialised);
      return m_i;
    }

  // Assignment operators
  BoundedInt &amp; operator+=(int rhs)
    {
      assert(m_initialised);

      // Check for overflow
      assert(m_i/2 + rhs/2 + (m_i&amp;rhs&amp;1) &lt;= Upper/2);
      assert(Lower/2 &lt;= m_i/2 + rhs/2 - ((m_i^rhs)&amp;1));

      // Check result value
      assert((Lower&lt;=m_i+rhs) &amp;&amp; (m_i+rhs&lt;=Upper));

      // Perform operation
      m_i += rhs;
      return *this;
    }
  // ...

  // Increment and decrement operators.
  BoundedInt &amp; operator++()
    {
      assert(m_initialised);

      // Check for overflow
      assert(m_i &lt; Upper);

      // Perform operation
      ++m_i;
      return *this;
    }
  // ...

private:
  INT m_i;
#ifndef NDEBUG
  bool m_initialised;
#endif
};

// Binary arithmetic operators
template &lt;int Lower, int Upper, typename INT&gt; 
inline BoundedInt&lt;Lower, Upper, INT&gt; 
operator+(BoundedInt&lt;Lower, Upper, INT&gt; lhs,
          BoundedInt&lt;Lower, Upper, INT&gt; rhs)
{
  return lhs.operator+=(rhs);
}
template &lt;int Lower, int Upper, typename INT&gt; 
inline BoundedInt&lt;Lower, Upper, INT&gt; 
operator+(BoundedInt&lt;Lower, Upper, INT&gt; lhs,
          int rhs)
{
  return lhs.operator+=(rhs);
}
template &lt;int Lower, int Upper, typename INT&gt; 
inline BoundedInt&lt;Lower, Upper, INT&gt; 
operator+(int lhs,
          BoundedInt&lt;Lower, Upper, INT&gt; rhs)
{
  return rhs.operator+=(lhs);
}
// ...

#endif
</PRE>
<P><HR>
<FONT SIZE=-1> Copyright 2003-2010</FONT>
</TD></TR>
</TABLE>
</BODY></HTML>

