<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>A Few Coding Standards</title></head>
<body bgcolor=white>

<table width="100%" bgcolor="#330077" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp; <font size=+5 color="#EEEEFF" face="Georgia,Palatino,Times,Roman"><b>A Few Coding Standards</b></font></td>
</tr></table>

<ol>
  <li><a href="#introduction">Introduction</a>
  <li><a href="#mechanicalissues">Mechanical Source Issues</a>
    <ol>
      <li><a href="#sourceformating">Source Code Formatting</a>
	<ol>
          <li><a href="#scf_commenting">Commenting</a>
          <li><a href="#scf_commentformat">Comment Formatting</a>
          <li><a href="#scf_includes">#include Style</a>
          <li><a href="#scf_codewidth">Source Code Width</a>
          <li><a href="#scf_spacestabs">Use Spaces Instead of Tabs</a>
          <li><a href="#scf_indentation">Indent Code Consistently</a>
        </ol>
      <li><a href="#compilerissues">Compiler Issues</a>
        <ol>
          <li><a href="#ci_warningerrors">Treat Compiler Warnings Like Errors</a>
          <li><a href="#ci_cpp_features">Which C++ features can I use?</a>
          <li><a href="#ci_portable_code">Write Portable Code</a>
        </ol>
    </ol>
  <li><a href="#styleissues">Style Issues</a>
    <ol>
      <li><a href="#macro">The High Level Issues</a>
        <ol>
          <li><a href="#hl_module">A Public Header File <b>is</b> a Module</a>
          <li><a href="#hl_dontinclude">#include as Little as Possible</a>
          <li><a href="#hl_privateheaders">Keep "internal" Headers Private</a>
        </ol>
      <li><a href="#micro">The Low Level Issues</a>
        <ol>
          <li><a href="#hl_assert">Assert Liberally</a>
          <li><a href="#hl_preincrement">Prefer Preincrement</a>
          <li><a href="#hl_avoidendl">Avoid endl</a>
          <li><a href="#hl_exploitcpp">Exploit C++ to its Fullest</a>
        </ol>
      <li><a href="#iterators">Writing Iterators</a>
    </ol>
  <li><a href="#seealso">See Also</a>
</ol><p>


<!-- *********************************************************************** -->
</ul><table width="100%" bgcolor="#330077" border=0 cellpadding=4 cellspacing=0><tr><td align=center><font color="#EEEEFF" size=+2 face="Georgia,Palatino"><b>
<a name="introduction">Introduction
</b></font></td></tr></table><ul>
<!-- *********************************************************************** -->

This document attempts to describe a few coding standards that are being used in
the LLVM source tree.  Although no coding standards should be regarded as
absolute requirements to be followed in all instances, coding standards can be
useful.<p>

This document intentionally does not prescribe fixed standards for religious
issues such as brace placement and space usage.  For issues like this, follow
the golden rule:

<a name="goldenrule">
<blockquote><b>If you are adding a significant body of source to a project, feel
free to use whatever style you are most comfortable with.  If you are extending,
enhancing, or bug fixing already implemented code, use the style that is already
being used so that the source is uniform and easy to follow.</b></blockquote>

The ultimate goal of these guidelines is the increase readability and
maintainability of our common source base. If you have suggestions for topics to
be included, please mail them to <a href="mailto:sabre@nondot.org">Chris</a>.<p>


<!-- *********************************************************************** -->
</ul><table width="100%" bgcolor="#330077" border=0 cellpadding=4 cellspacing=0><tr><td align=center><font color="#EEEEFF" size=+2 face="Georgia,Palatino"><b>
<a name="mechanicalissues">Mechanical Source Issues
</b></font></td></tr></table><ul>
<!-- *********************************************************************** -->

<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0><tr><td>&nbsp;</td><td width="100%">&nbsp; <font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="sourceformating">Source Code Formatting
</b></font></td></tr></table><ul>


<!-- _______________________________________________________________________ -->
</ul><a name="scf_commenting"><h4><hr size=0>Commenting</h4><ul>

Comments are one critical part of readability and maintainability.  Everyone
knows they should comment, so should you.  :)  Although we all should probably
comment our code more than we do, there are a few very critical places that
documentation is very useful:<p>

<ol>
<h4><li>File Headers</h4>
Every source file should have a header on it that describes the basic purpose of
the file.  If a file does not have a header, it should not be checked into CVS.
Most source trees will probably have a standard file header format.  The
standard format for the LLVM source tree looks like this:<p>

<pre>
//===-- llvm/Instruction.h - Instruction class definition -------*- C++ -*-===//
//
// This file contains the declaration of the Instruction class, which is the
// base class for all of the VM instructions.
//
//===----------------------------------------------------------------------===//
</pre>

A few things to note about this particular format.  The "<tt>-*- C++ -*-</tt>"
string on the first line is there to tell Emacs that the source file is a C++
file, not a C file (Emacs assumes .h files are C files by default [Note that tag
this is not necessary in .cpp files]).  The name of the file is also on the
first line, along with a very short description of the purpose of the file.
This is important when printing out code and flipping though lots of pages.<p>

The main body of the description does not have to be very long in most cases.
Here it's only two lines.  If an algorithm is being implemented or something
tricky is going on, a reference to the paper where it is published should be
included, as well as any notes or "gotchas" in the code to watch out for.<p>


<h4><li>Class overviews</h4>

Classes are one fundemental part of a good object oriented design.  As such, a
class definition should have a comment block that explains what the class is
used for... if it's not obvious.  If it's so completely obvious your grandma
could figure it out, it's probably safe to leave it out.  Naming classes
something sane goes a long ways towards avoiding writing documentation.  :)<p>


<h4><li>Method information</h4>

Methods defined in a class (as well as any global functions) should also be
documented properly.  A quick note about what it does any a description of the
borderline behaviour is all that is necessary here (unless something
particularly tricky or insideous is going on).  The hope is that people can
figure out how to use your interfaces without reading the code itself... that is
the goal metric.<p>

Good things to talk about here are what happens when something unexpected
happens: does the method return null?  Abort?  Format your hard disk?<p>
</ol>


<!-- _______________________________________________________________________ -->
</ul><a name="scf_commentformat"><h4><hr size=0>Comment Formatting</h4><ul>

In general, prefer C++ style (<tt>//</tt>) comments.  They take less space,
require less typing, don't have nesting problems, etc.  There are a few cases
when it is useful to use C style (<tt>/* */</tt>) comments however:<p>

<ol>
<li>When writing a C code: Obviously if you are writing C code, use C style
comments.  :)
<li>When writing a header file that may be #included by a C source file.
<li>When writing a source file that is used by a tool that only accepts C style
comments.
</ol><p>

To comment out a large block of code, use <tt>#if 0</tt> and <tt>#endif</tt>.
These nest properly and are better behaved in general than C style comments.<p>

<!-- _______________________________________________________________________ -->
</ul><a name="scf_includes"><h4><hr size=0>#include Style</h4><ul>

Immediately after the <a href="#scf_commenting">header file comment</a> (and
include guards if working on a header file), the <a
href="hl_dontinclude">minimal</a> list of #includes required by the file should
be listed.  We prefer these #includes to be listed in this order:<p>

<ol>
<li><a href="#mmheader">Main Module header</a>
<li><a href="#hl_privateheaders">Local/Private Headers</a>
<li>llvm/*
<li>llvm/Analysis/*
<li>llvm/Assembly/*
<li>llvm/Bytecode/*
<li>llvm/CodeGen/*
<li>...
<li>Support/*
<li>Config/*
<li>System #includes
</ol>

... and each catagory should be sorted by name.<p>

<a name="mmheader">The "Main Module Header" file applies to .cpp file which
implement an interface defined by a .h file.  This #include should always be
included <b>first</b> regardless of where it lives on the file system.  By
including a header file first in the .cpp files that implement the interfaces,
we ensure that the header does not have any hidden dependencies which are not
explicitly #included in the header, but should be.  It is also a form of
documentation in the .cpp file to indicate where the interfaces it implements
are defined.<p>


<!-- _______________________________________________________________________ -->
</ul><a name="scf_codewidth"><h4><hr size=0>Source Code Width</h4><ul>

Write your code to fit within 80 columns of text.  This helps those of us who like to print out code and look at your code in an xterm without resizing it.  


<!-- _______________________________________________________________________ -->
</ul><a name="scf_spacestabs"><h4><hr size=0>Use Spaces Instead of Tabs</h4><ul>

In all cases, prefer spaces to tabs in source files.  People have different
prefered indentation levels, and different styles of indentation that they
like... this is fine.  What isn't is that different editors/viewers expand tabs
out to different tab stops.  This can cause your code to look completely
unreadable, and it is not worth dealing with.<p>

As always, follow the <a href="#goldenrule">Golden Rule</a> above: follow the
style of existing code if your are modifying and extending it.  If you like four
spaces of indentation, <b>DO NOT</b> do that in the middle of a chunk of code
with two spaces of indentation.  Also, do not reindent a whole source file: it
makes for incredible diffs that are absolutely worthless.<p>


<!-- _______________________________________________________________________ -->
</ul><a name="scf_indentation"><h4><hr size=0>Indent Code Consistently</h4><ul>

Okay, your first year of programming you were told that indentation is
important.  If you didn't believe and internalize this then, now is the time.
Just do it.<p>




<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0><tr><td>&nbsp;</td><td width="100%">&nbsp; <font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="compilerissues">Compiler Issues
</b></font></td></tr></table><ul>


<!-- _______________________________________________________________________ -->
</ul><a name="ci_warningerrors"><h4><hr size=0>Treat Compiler Warnings Like Errors</h4><ul>

If your code has compiler warnings in it, something is wrong: you aren't casting
values correctly, your have "questionable" constructs in your code, or you are
doing something legitimately wrong.  Compiler warnings can cover up legitimate
errors in output and make dealing with a translation unit difficult.<p>

It is not possible to prevent all warnings from all compilers, nor is it
desirable.  Instead, pick a standard compiler (like <tt>gcc</tt>) that provides
a good thorough set of warnings, and stick to them.  At least in the case of
<tt>gcc</tt>, it is possible to work around any spurious errors by changing the
syntax of the code slightly.  For example, an warning that annoys me occurs when
I write code like this:<p>

<pre>
  if (V = getValue()) {
    ..
  }
</pre><p>

<tt>gcc</tt> will warn me that I probably want to use the <tt>==</tt> operator,
and that I probably mistyped it.  In most cases, I haven't, and I really don't
want the spurious errors.  To fix this particular problem, I rewrite the code
like this:<p>

<pre>
  if ((V = getValue())) {
    ..
  }
</pre><p>

...which shuts <tt>gcc</tt> up.  Any <tt>gcc</tt> warning that annoys you can be
fixed by massaging the code appropriately.<p>

These are the <tt>gcc</tt> warnings that I prefer to enable: <tt>-Wall -Winline
-W -Wwrite-strings -Wno-unused</tt><p>


<!-- _______________________________________________________________________ -->
</ul><a name="ci_cpp_features"><h4><hr size=0>Which C++ features can I use?</h4><ul>

Compilers are finally catching up to the C++ standard.  Most compilers implement
most features, so you can use just about any features that you would like.  In
the LLVM source tree, I have chosen to not use these features:<p>

<ol>
<li>Exceptions: Exceptions are very useful for error reporting and handling
exceptional conditions.  I do not use them in LLVM because they do have an
associated performance impact (by restricting restructuring of code), and parts
of LLVM are designed for performance critical purposes.<p>

Just like most of the rules in this document, this isn't a hard and fast
requirement.  Exceptions are used in the Parser, because it simplifies error
reporting <b>significantly</b>, and the LLVM parser is not at all in the
critical path.<p>

<li>RTTI: RTTI has a large cost in terms of executable size, and compilers are
not yet very good at stomping out "dead" class information blocks.  Because of
this, typeinfo and dynamic cast are not used.
</ol><p>

Other features, such as templates (without partial specialization) can be used
freely.  The general goal is to have clear, consise, performant code... if a
technique assists with that then use it.<p>


<!-- _______________________________________________________________________ -->
</ul><a name="ci_portable_code"><h4><hr size=0>Write Portable Code</h4><ul>

In almost all cases, it is possible and within reason to write completely
portable code.  If there are cases where it isn't possible to write portable
code, isolate it behind a well defined (and well documented) interface.<p>

In practice, this means that you shouldn't assume much about the host compiler,
including its support for "high tech" features like partial specialization of
templates.  In fact, Visual C++ 6 could be an important target for our work in
the future, and we don't want to have to rewrite all of our code to support
it.<p>



<!-- *********************************************************************** -->
</ul><table width="100%" bgcolor="#330077" border=0 cellpadding=4 cellspacing=0><tr><td align=center><font color="#EEEEFF" size=+2 face="Georgia,Palatino"><b>
<a name="styleissues">Style Issues
</b></font></td></tr></table><ul>
<!-- *********************************************************************** -->


<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0><tr><td>&nbsp;</td><td width="100%">&nbsp; <font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="macro">The High Level Issues
</b></font></td></tr></table><ul>


<!-- _______________________________________________________________________ -->
</ul><a name="hl_module"><h4><hr size=0>A Public Header File <b>is</b> a Module</h4><ul>

C++ doesn't do too well in the modularity department.  There is no real
encapsulation or data hiding (unless you use expensive protocol classes), but it
is what we have to work with.  When you write a public header file (in the LLVM
source tree, they live in the top level "include" directory), you are defining a
module of functionality.<p>

Ideally, modules should be completely independent of each other, and their
header files should only include the absolute minimum number of headers
possible. A module is not just a class, a function, or a namespace: <a
href="http://www.cuj.com/articles/2000/0002/0002c/0002c.htm">it's a collection
of these</a> that defines an interface.  This interface may be several
functions, classes or data structures, but the important issue is how they work
together.<p>

In general, a module should be implemented with one or more <tt>.cpp</tt> files.
Each of these <tt>.cpp</tt> files should include the header that defines their
interface first.  This ensure that all of the dependences of the module header
have been properly added to the module header itself, and are not implicit.
System headers should be included after user headers for a translation unit.<p>


<!-- _______________________________________________________________________ -->
</ul><a name="hl_dontinclude"><h4><hr size=0>#include as Little as Possible</h4><ul>

<tt>#include</tt> hurts compile time performance.  Don't do it unless you have
to, especially in header files.<p>

But wait, sometimes you need to have the definition of a class to use it, or to
inherit from it.  In these cases go ahead and #include that header file.  Be
aware however that there are many cases where you don't need to have the full
definition of a class.  If you are using a pointer or reference to a class, you
don't need the header file.  If you are simply returning a class instance from a
prototyped function or method, you don't need it.  In fact, for most cases, you
simply don't need the definition of a class... and not <tt>#include</tt>'ing
speeds up compilation.<p>

It is easy to try to go too overboard on this recommendation, however.  You
<b>must</b> include all of the header files that you are using, either directly
or indirectly (through another header file).  To make sure that you don't
accidently forget to include a header file in your module header, make sure to
include your module header <b>first</b> in the implementation file (as mentioned
above).  This way there won't be any hidden dependencies that you'll find out
about later...<p>


<!-- _______________________________________________________________________ -->
</ul><a name="hl_privateheaders"><h4><hr size=0>Keep "internal" Headers Private</h4><ul>

Many modules have a complex implementation that causes them to use more than one
implementation (<tt>.cpp</tt>) file.  It is often tempting to put the internal
communication interface (helper classes, extra functions, etc) in the public
module header file.  Don't do this.  :)<p>

If you really need to do something like this, put a private header file in the
same directory as the source files, and include it locally.  This ensures that
your private interface remains private and undisturbed by outsiders.<p>

Note however, that it's okay to put extra implementation methods a public class
itself... just make them private (or protected), and all is well.<p>


<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0><tr><td>&nbsp;</td><td width="100%">&nbsp; <font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="micro">The Low Level Issues
</b></font></td></tr></table><ul>


<!-- _______________________________________________________________________ -->
</ul><a name="hl_assert"><h4><hr size=0>Assert Liberally</h4><ul>

Use the "<tt>assert</tt>" function to its fullest.  Check all of your
preconditions and assumptions, you never know when a bug (not neccesarily even
yours) might be caught early by an assertion, which reduces debugging time
dramatically.  The "<tt>&lt;cassert&gt;</tt>" header file is probably already
included by the header files you are using, so it doesn't cost anything to use
it.<p>

To further assist with debugging, make sure to put some kind of error message in
the assertion statement (which is printed if the assertion is tripped). This
helps the poor debugging make sense of why an assertion is being made and
enforced, and hopefully what to do about it.  Here is one complete example:<p>

<pre>
  inline Value *getOperand(unsigned i) { 
    assert(i &lt; Operands.size() && "getOperand() out of range!");
    return Operands[i]; 
  }
</pre>

Here are some examples:

<pre>
  assert(Ty-&gt;isPointerType() && "Can't allocate a non pointer type!");

  assert((Opcode == Shl || Opcode == Shr) && "ShiftInst Opcode invalid!");

  assert(idx &lt; getNumSuccessors() && "Successor # out of range!");

  assert(V1.getType() == V2.getType() && "Constant types must be identical!");

  assert(isa&lt;PHINode&gt;(Succ-&gt;front()) && "Only works on PHId BBs!");
</pre><p>

You get the idea...<p>


<!-- _______________________________________________________________________ -->
</ul><a name="hl_preincrement"><h4><hr size=0>Prefer Preincrement</h4><ul>

Hard fast rule: Preincrement (++X) may be no slower than postincrement (X++) and
could very well be a lot faster than it.  Use preincrementation whenever
possible.<p>

The semantics of postincrement include making a copy of the value being
incremented, returning it, and then preincrementing the "work value".  For
primitive types, this isn't a big deal... but for iterators, it can be a huge
issue (for example, some iterators contains stack and set objects in them...
copying an iterator could invoke the copy ctor's of these as well).  In general,
get in the habit of always using preincrement, and you won't have a problem.<p>


<!-- _______________________________________________________________________ -->
</ul><a name="hl_avoidendl"><h4><hr size=0>Avoid endl</h4><ul>

The <tt>endl</tt> modifier, when used with iostreams outputs a newline to the
output stream specified.  In addition to doing this, however, it also flushes
the output stream.  In other words, these are equivalent:<p>

<pre>
  cout << endl;
  cout << "\n" << flush;
</pre>

Most of the time, you probably have no reason to flush the output stream, so it's better to use a literal <tt>"\n"</tt>.<p>


<!-- _______________________________________________________________________ -->
</ul><a name="hl_exploitcpp"><h4><hr size=0>Exploit C++ to its Fullest</h4><ul>

C++ is a powerful language.  With a firm grasp on its capabilities, you can make
write effective, consise, readable and maintainable code all at the same time.
By staying consistent, you reduce the amount of special cases that need to be
remembered.  Reducing the total number of lines of code you write is a good way
to avoid documentation, and avoid giving bugs a place to hide.<p>

For these reasons, come to know and love the contents of your local
&lt;algorithm&gt; header file.  Know about &lt;functional&gt; and what it can do
for you.  C++ is just a tool that wants you to master it. :)<p>



<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0><tr><td>&nbsp;</td><td width="100%">&nbsp; <font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="iterators">Writing Iterators
</b></font></td></tr></table><ul>

Here's a pretty good summary of how to write your own data structure iterators
in a way that is compatible with the STL, and with a lot of other code out there
(slightly edited by Chris):<p>

<pre>
From: Ross Smith <ross.s@ihug.co.nz>
Newsgroups: comp.lang.c++.moderated
Subject: Writing iterators (was: Re: Non-template functions that take iterators)
Date: 28 Jun 2001 12:07:10 -0400

Andre Majorel wrote:
> Any pointers handy on "writing STL-compatible iterators for
> dummies ?"

I'll give it a try...

The usual situation requiring user-defined iterators is that you have
a type that bears some resemblance to an STL container, and you want
to provide iterators so it can be used with STL algorithms. You need
to ask three questions:

First, is this simply a wrapper for an underlying collection of
objects that's held somewhere as a real STL container, or is it a
"virtual container" for which iteration is (under the hood) more
complicated than simply incrementing some underlying iterator (or
pointer or index or whatever)? In the former case you can frequently
get away with making your container's iterators simply typedefs for
those of the underlying container; your begin() function would call
member_container.begin(), and so on.

Second, do you only need read-only iterators, or do you need separate
read-only (const) and read-write (non-const) iterators?

Third, which kind of iterator (input, output, forward, bidirectional,
or random access) is appropriate? If you're familiar with the
properties of the iterator types (if not, visit
<a href="http://www.sgi.com/tech/stl/">http://www.sgi.com/tech/stl/</a>), the appropriate choice should be
obvious from the semantics of the container.

I'll start with forward iterators, as the simplest case that's likely
to come up in normal code. Input and output iterators have some odd
properties and rarely need to be implemented in user code; I'll leave
them out of discussion. Bidirectional and random access iterators are
covered below.

The exact behaviour of a forward iterator is spelled out in the
Standard in terms of a set of expressions with specified behaviour,
rather than a set of member functions, which leaves some leeway in how
you actually implement it. Typically it looks something like this
(I'll start with the const-iterator-only situation):

  #include &lt;iterator&gt;

  class container {
    public:
      typedef something_or_other value_type;
      class const_iterator:
        public std::iterator&lt;std::forward_iterator_tag, value_type&gt; {
          friend class container;
          public:
            const value_type&amp; operator*() const;
            const value_type* operator->() const;
            const_iterator&amp; operator++();
            const_iterator operator++(int);
            friend bool operator==(const_iterator lhs,
                                   const_iterator rhs);
            friend bool operator!=(const_iterator lhs,
                                   const_iterator rhs);
          private:
            //...
        };
      //...
  };

An iterator should always be derived from an instantiation of the
std::iterator template. The iterator's life cycle functions
(constructors, destructor, and assignment operator) aren't declared
here; in most cases the compiler-generated ones are sufficient. The
container needs to be a friend of the iterator so that the container's
begin() and end() functions can fill in the iterator's private members
with the appropriate values.

<i>[Chris's Note: I prefer to not make my iterators friends.  Instead, two
ctor's are provided for the iterator class: one to start at the end of the
container, and one at the beginning.  Typically this is done by providing
two constructors with different signatures.]</i>

There are normally only three member functions that need nontrivial
implementations; the rest are just boilerplate.

  const container::value_type&amp;
    container::const_iterator::operator*() const {
      // find the element and return a reference to it
    }

  const container::value_type*
    container::const_iterator::operator->() const {
      return &amp;**this;
    }

If there's an underlying real container, operator*() can just return a
reference to the appropriate element. If there's no actual container
and the elements need to be generated on the fly -- what I think of as
a "virtual container" -- things get a bit more complicated; you'll
probably need to give the iterator a value_type member object, and
fill it in when you need to. This might be done as part of the
increment operator (below), or if the operation is nontrivial, you
might choose the "lazy" approach and only generate the actual value
when one of the dereferencing operators is called.

The operator->() function is just boilerplate around a call to
operator*().

  container::const_iterator&amp;
    container::const_iterator::operator++() {
      // the incrementing logic goes here
      return *this;
    }

  container::const_iterator
    container::const_iterator::operator++(int) {
      const_iterator old(*this);
      ++*this;
      return old;
    }

Again, the incrementing logic will usually be trivial if there's a
real container involved, more complicated if you're working with a
virtual container. In particular, watch out for what happens when you
increment past the last valid item -- this needs to produce an
iterator that will compare equal to container.end(), and making this
work is often nontrivial for virtual containers.

The post-increment function is just boilerplate again (and
incidentally makes it obvious why all the experts recommend using
pre-increment wherever possible).

  bool operator==(container::const_iterator lhs,
                  container::const_iterator rhs) {
    // equality comparison goes here
  }

  bool operator!=(container::const_iterator lhs,
                  container::const_iterator rhs) {
    return !(lhs == rhs);
  }

For a real container, the equality comparison will usually just
compare the underlying iterators (or pointers or indices or whatever).
The semantics of comparisons for virtual container iterators are often
tricky. Remember that iterator comparison only needs to be defined for
iterators into the same container, so you can often simplify things by
taking for granted that lhs and rhs both point into the same container
object. Again, the second function is just boilerplate.

It's a matter of taste whether iterator arguments are passed by value
or reference; I've shown tham passed by value to reduce clutter, but
if the iterator contains several data members, passing by reference
may be better.

That convers the const-iterator-only situation. When we need separate
const and mutable iterators, one small complication is added beyond
the simple addition of a second class.

  class container {
    public:
      typedef something_or_other value_type;
      class const_iterator;
      class iterator:
        public std::iterator&lt;std::forward_iterator_tag, value_type&gt; {
          friend class container;
          friend class container::const_iterator;
          public:
            value_type&amp; operator*() const;
            value_type* operator->() const;
            iterator&amp; operator++();
            iterator operator++(int);
            friend bool operator==(iterator lhs, iterator rhs);
            friend bool operator!=(iterator lhs, iterator rhs);
          private:
            //...
        };
      class const_iterator:
        public std::iterator&lt;std::forward_iterator_tag, value_type&gt; {
          friend class container;
          public:
            const_iterator();
            const_iterator(const iterator&amp; i);
            const value_type&amp; operator*() const;
            const value_type* operator->() const;
            const_iterator&amp; operator++();
            const_iterator operator++(int);
            friend bool operator==(const_iterator lhs,
                                   const_iterator rhs);
            friend bool operator!=(const_iterator lhs,
                                   const_iterator rhs);
          private:
            //...
        };
      //...
  };

There needs to be a conversion from iterator to const_iterator (so
that mixed-type operations, such as comparison between an iterator and
a const_iterator, will work). This is done here by giving
const_iterator a conversion constructor from iterator (equivalently,
we could have given iterator an operator const_iterator()), which
requires const_iterator to be a friend of iterator, so it can copy its
data members. (It also requires the addition of an explicit default
constructor to const_iterator, since the existence of another
user-defined constructor inhibits the compiler-defined one.)

Bidirectional iterators add just two member functions to forward
iterators:

  class iterator:
    public std::iterator&lt;std::bidirectional_iterator_tag, value_type&gt; {
      public:
        //...
        iterator&amp; operator--();
        iterator operator--(int);
        //...
    };

I won't detail the implementations, they're obvious variations on
operator++().

Random access iterators add several more member and friend functions:

  class iterator:
    public std::iterator&lt;std::random_access_iterator_tag, value_type&gt; {
      public:
        //...
        iterator&amp; operator+=(difference_type rhs);
        iterator&amp; operator-=(difference_type rhs);
        friend iterator operator+(iterator lhs, difference_type rhs);
        friend iterator operator+(difference_type lhs, iterator rhs);
        friend iterator operator-(iterator lhs, difference_type rhs);
        friend difference_type operator-(iterator lhs, iterator rhs);
        friend bool operator&lt;(iterator lhs, iterator rhs);
        friend bool operator&gt;(iterator lhs, iterator rhs);
        friend bool operator&lt;=(iterator lhs, iterator rhs);
        friend bool operator&gt;=(iterator lhs, iterator rhs);
        //...
    };

  container::iterator&amp;
    container::iterator::operator+=(container::difference_type rhs) {
      // add rhs to iterator position
      return *this;
    }

  container::iterator&amp;
    container::iterator::operator-=(container::difference_type rhs) {
      // subtract rhs from iterator position
      return *this;
    }

  container::iterator operator+(container::iterator lhs,
                                container::difference_type rhs) {
    return iterator(lhs) += rhs;
  }

  container::iterator operator+(container::difference_type lhs,
                                container::iterator rhs) {
    return iterator(rhs) += lhs;
  }

  container::iterator operator-(container::iterator lhs,
                                container::difference_type rhs) {
    return iterator(lhs) -= rhs;
  }

  container::difference_type operator-(container::iterator lhs,
                                       container::iterator rhs) {
    // calculate distance between iterators
  }

  bool operator&lt;(container::iterator lhs, container::iterator rhs) {
    // perform less-than comparison
  }

  bool operator&gt;(container::iterator lhs, container::iterator rhs) {
    return rhs &lt; lhs;
  }

  bool operator&lt;=(container::iterator lhs, container::iterator rhs) {
    return !(rhs &lt; lhs);
  }

  bool operator&gt;=(container::iterator lhs, container::iterator rhs) {
    return !(lhs &lt; rhs);
  }

Four of the functions (operator+=(), operator-=(), the second
operator-(), and operator&lt;()) are nontrivial; the rest are
boilerplate.

One feature of the above code that some experts may disapprove of is
the declaration of all the free functions as friends, when in fact
only a few of them need direct access to the iterator's private data.
I originally got into the habit of doing this simply to keep the
declarations together; declaring some functions inside the class and
some outside seemed awkward. Since then, though, I've been told that
there's a subtle difference in the way name lookup works for functions
declared inside a class (as friends) and outside, so keeping them
together in the class is probably a good idea for practical as well as
aesthetic reasons.

I hope all this is some help to anyone who needs to write their own
STL-like containers and iterators.

-- 
Ross Smith &lt;ross.s@ihug.co.nz&gt; The Internet Group, Auckland, New Zealand
</pre>


<!-- *********************************************************************** -->
</ul><table width="100%" bgcolor="#330077" border=0 cellpadding=4 cellspacing=0><tr><td align=center><font color="#EEEEFF" size=+2 face="Georgia,Palatino"><b>
<a name="seealso">See Also
</b></font></td></tr></table><ul>
<!-- *********************************************************************** -->

A lot of these comments and recommendations have been culled for other sources.
Two particularly important books for our work are:<p>

<ol>
<li><a href="http://www.aw.com/product/0,2627,0201924889,00.html">Effective C++</a> by Scott Meyers.  There is an online version of the book (only some chapters though) <a href="http://www.awlonline.com/cseng/meyerscddemo/">available as well</a>.
<li><a href="http://cseng.aw.com/book/0,3828,0201633620,00.html">Large-Scale C++ Software Design</a> by John Lakos
</ol><p>

If you get some free time, and you haven't read them: do so, you might learn
something. :)


<!-- *********************************************************************** -->
</ul>
<!-- *********************************************************************** -->

<hr>
<font size=-1>
<address><a href="mailto:sabre@nondot.org">Chris Lattner</a></address>
<a href="http://llvm.cs.uiuc.edu">The LLVM Compiler Infrastructure</a>
<br>
<!-- Created: Tue Jan 23 15:19:28 CST 2001 -->
<!-- hhmts start -->
Last modified: Sun Oct 12 22:12:43 CDT 2003
<!-- hhmts end -->
</font>
</body></html>
