Hugin Coding Style Guide
Consistent application of a style makes life easier for everybody. You'll find other people's code more readable, and they will find your code more readable. While nobody will tap on your fingers for not following these conventions to the letter, it is highly recommended that you familiarize with them and follow them.
History and Status of this Document
This document started from a discussion on coding style and consistency. It is currently just a collection of the wisdom and opinion of Hugin contributors and we won't do hard enforcement / policing, but it would be nice if we could all stick to the same convention and make the code more readable and manageable for everyobdy.
Naming Conventions
- Names should be clear and descriptive. No contractions, with a few listed below.
- In general, we prefer CamelCase over underscore_insertions.
- LeadingCaps (capitalized first letter of a name) should be used only for classes, structs, and typedefs.
- Variables and functions should not have an initial capital. (although Ryan was suggesting that public function be LeadingCaps and private ones not).
- Private variables should be prefixed with m_. Many (but not all) private variables are currently prefixed.
- Constants are ALL_CAPS with underscore insertions.
- Where there are contractions, they should be used consistently across the code base. Make yourself familiar with the list. There are some hisotrical exceptions, e.g. Pano instead of Panorama. Any more exceptions?
Contraction Lists
- Pano: for panorama
- FOV: for Field of View
- ROI: for Region of Interest
The list is incomplete.
Metadata
Documentation
Document your code (or the code you are reading and understanding) with doxygen. Doxygen is a useful tool and can also be used to create other documentation that just class interface descriptions. It works by prefixing the function prototypes with a special comment. Pablo usually puts the documentation in the header files.
The basic usage is very javadoc like:
/** One sentence class description * * more detailed description * * @todo pet the cat more often * @bug might scratch if annoyed */ class Cat { public: /** hunt food * * @param prey type of animals that we should hunt * @return true if the cat is sated */ bool HuntFood(Prey prey); }
Identify Work in Progress
- Maintain the @todo and @bug sections of doxygen. They are summarized and listed in the automatically generated documentation's todo and bugs lists.
- For small things inside the code, put // FIXME or // TODO comments - they will be automatically highlighted by gedit and other editors, and will be easily searchable with grep.
Comments
Comments and inline-documentation are always welcome, please give them lines of their own and don't append them to existing code:
exit(); do_stuff(); //Don't do this
File Names
Try to keep one class per file, and give the file a meaningful name in CamelCase.
Code Layout
Spacing and indentation contirbute a lot to the readability of the code. Use them liberally.
Bracing
There are many different indentation styles. Allman style is the preferred one. However it is more important to keep consistency within a file, so if you are editing a file with a different convention, adopt it (or read the clean up section of this style guide).
if (1 == 0) { printf("never"); } else { printf("ever"); }
Tabulation
Use spaces instead of tabulators (to maintain consistency across editors). The preferred indentation is four spaces for one tab, but most important is to keep consistency within a single file.
Spacing
I would not go into that much detail. or maybe we should adopt/adapt a strict coding guide like Blender?
Line Ends
Set your editor to Unix-style line ending (LF) - not Windows' LF+CR. Or if you are on Windows, use the Mercurial EOL extension.
To prevent accidentally committing a file with Windows line endings, you can add the following snippet to your global .hgrc or mercurial.ini file:
[hooks] pretxncommit.crlf = python:hgext.win32text.forbidcrlf
Character Set
Ideally we are striving to use UTF-8, but because Windows has issue dealing with it, the wxWidgets XRC ressources are ISO-8859-1.
Multiple Statements on one Line
Avoid multiple statements on one line, it makes the code harder to read.
Line Width
Try to keep line width below 80 characters.
Repository
Commits
It is tempting to clean up old code while fixing bugs or adding new code. Please don't - it makes the committ (diff!) much more difficult to read / understand. Keep style clean up committs separated and mention them as such in the log message.
It is important that nobody goes around changing existing code to suit without thinking about it first - We have several branches waiting to be merged, changing the amount of whitespace makes that difficult, and splitting or joining lines of code makes it enormously more so.
Work in Progress
If something needs work, mark it with a // FIXME or // TODO comment so that a grep will reveal places that needs attention. Gedit automatically highlights TODO and FIXME.
For minor changes, feel free to commit directly into the default codeline. For everything else, branch out. Branches are cheap.
Strings for Translation
Release branches are string-frozen. Strings for translation are updated prior to branching and in principle no new string shall be added to a release branch. An exception may be requested if the underlying motive is important enough. The request must receive the support of a significant majority of developers (coders, builders, translators) to be granted. Silence is interpreted as supportive of the request.
API stability
Release branches are frozen regarding classes/function/namespace names and functions parameters. An exception may be requested if the underlying motive is important enough. The request must receive the support of a significant majority of developers (coders and scripters) to be granted. Silence is interpreted as supportive of the request.
License
- Make sure all new files added to the repository come with a license.
- Hugin is historically licensed GPL 2 or later.
- Best is to choose the same license, or a compatible one.
- If you want to license under the GPL 2 or later, just copy and the text below into a comment at the beginning of each of your new files.
/* ** <one line to give the program's name and a brief idea of what it does.> ** Copyright (C) <year> <name of author> ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see <http://www.gnu.org/licenses/>. */
Goto / Case Labels
Try to write code that is linear to read and does not jump all over the place too much.
Compilation Warnings and Diagnostic Output
Try to prevent compiler warnings.
Encapsulate diagnostic output in a condition and commit it so that by default there is no diagnostic output. Consider that some CMake output must be clicked away on Windows while it is just an extra line of display in Linux.
Return to main page.