<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>
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>
functions, classes or data structures, but the important issue is how they work
together.<p>
-<!--One example of this is the <tt>llvm/include/llvm/CFG.h</tt> file. It
-defines a collection of global functions, template classes, and member functions
-that are syntactically unrelated to each other. Semantically, however, they all
-provide useful functionality for operating on a CFG, and so they are bound
-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
you actually implement it. Typically it looks something like this
(I'll start with the const-iterator-only situation):
- #include <iterator>
+ #include <iterator>
class container {
public:
typedef something_or_other value_type;
class const_iterator:
- public std::iterator<std::forward_iterator_tag, value_type> {
+ public std::iterator<std::forward_iterator_tag, value_type> {
friend class container;
public:
const value_type& operator*() const;
typedef something_or_other value_type;
class const_iterator;
class iterator:
- public std::iterator<std::forward_iterator_tag, value_type> {
+ public std::iterator<std::forward_iterator_tag, value_type> {
friend class container;
friend class container::const_iterator;
public:
//...
};
class const_iterator:
- public std::iterator<std::forward_iterator_tag, value_type> {
+ public std::iterator<std::forward_iterator_tag, value_type> {
friend class container;
public:
const_iterator();
iterators:
class iterator:
- public std::iterator<std::bidirectional_iterator_tag, value_type> {
+ public std::iterator<std::bidirectional_iterator_tag, value_type> {
public:
//...
iterator& operator--();
Random access iterators add several more member and friend functions:
class iterator:
- public std::iterator<std::random_access_iterator_tag, value_type> {
+ public std::iterator<std::random_access_iterator_tag, value_type> {
public:
//...
iterator& operator+=(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<(iterator lhs, iterator rhs);
- friend bool operator>(iterator lhs, iterator rhs);
- friend bool operator<=(iterator lhs, iterator rhs);
- friend bool operator>=(iterator lhs, iterator rhs);
+ friend bool operator<(iterator lhs, iterator rhs);
+ friend bool operator>(iterator lhs, iterator rhs);
+ friend bool operator<=(iterator lhs, iterator rhs);
+ friend bool operator>=(iterator lhs, iterator rhs);
//...
};
// calculate distance between iterators
}
- bool operator<(container::iterator lhs, container::iterator rhs) {
+ bool operator<(container::iterator lhs, container::iterator rhs) {
// perform less-than comparison
}
- bool operator>(container::iterator lhs, container::iterator rhs) {
- return rhs < lhs;
+ bool operator>(container::iterator lhs, container::iterator rhs) {
+ return rhs < lhs;
}
- bool operator<=(container::iterator lhs, container::iterator rhs) {
- return !(rhs < lhs);
+ bool operator<=(container::iterator lhs, container::iterator rhs) {
+ return !(rhs < lhs);
}
- bool operator>=(container::iterator lhs, container::iterator rhs) {
- return !(lhs < rhs);
+ bool operator>=(container::iterator lhs, container::iterator rhs) {
+ return !(lhs < rhs);
}
Four of the functions (operator+=(), operator-=(), the second
-operator-(), and operator<()) are nontrivial; the rest are
+operator-(), and operator<()) are nontrivial; the rest are
boilerplate.
One feature of the above code that some experts may disapprove of is
STL-like containers and iterators.
--
-Ross Smith <ross.s@ihug.co.nz> The Internet Group, Auckland, New Zealand
+Ross Smith <ross.s@ihug.co.nz> The Internet Group, Auckland, New Zealand
</pre>
<address><a href="mailto:sabre@nondot.org">Chris Lattner</a></address>
<!-- Created: Tue Jan 23 15:19:28 CST 2001 -->
<!-- hhmts start -->
-Last modified: Fri Jul 25 12:29:52 CDT 2003
+Last modified: Thu Aug 7 16:44:33 CDT 2003
<!-- hhmts end -->
</font>
</body></html>