mirror of https://github.com/CGAL/cgal
416 lines
20 KiB
TeX
416 lines
20 KiB
TeX
% =============================================================================
|
|
% The CGAL Developers' Manual
|
|
% Chapter: Coding Conventions
|
|
% -----------------------------------------------------------------------------
|
|
% file : coding.tex
|
|
% authors: Sven Schoenherr <sven@inf.ethz.ch>
|
|
% -----------------------------------------------------------------------------
|
|
% $Id$
|
|
% $Date$
|
|
% =============================================================================
|
|
|
|
|
|
\chapter{Coding Conventions\label{chap:code_format}}
|
|
|
|
\ccChapterRelease{Chapter Version: 1.1}
|
|
\ccChapterAuthor{Sven Sch{\"o}nherr ({\tt sven@inf.ethz.ch})}
|
|
|
|
We do not want to impose very strict coding rules on the developers.
|
|
What is most important is to follow the \cgal\ naming scheme
|
|
described in the next section. However, there are some programming conventions
|
|
(Section~\ref{sec:programming_conventions}) that should be adhered to,
|
|
rules for the code format
|
|
(Section~\ref{sec:code_format}), and a mandatory heading for each
|
|
source file (Section~\ref{sec:file_header})
|
|
|
|
|
|
% -----------------------------------------------------------------------------
|
|
\section{Naming scheme\label{sec:naming_scheme}}
|
|
\ccIndexMainItemBegin{naming scheme}
|
|
|
|
The \cgal\ naming scheme is intended to help the user
|
|
use the library and the developer develop the
|
|
library. The rules are simple and easy to remember. Where appropriate,
|
|
they aim for similarity with the names used in the \stl. Deviations from the
|
|
given rules should be avoided; however, exceptions are possible if
|
|
there are \emph{convincing} reasons.
|
|
|
|
\subsection*{General rules}
|
|
|
|
\begin{itemize}
|
|
\item Words in the names of everything except concepts should be separated by
|
|
underscores. For example, one would use \ccc{function_name} and
|
|
\ccc{Class_name} instead of \ccc{functionName} or \ccc{Classname}.
|
|
\ccIndexSubitem{naming scheme}{word separators}
|
|
\ccIndexSubitem{naming scheme}{underscores}
|
|
\item Words in the names of concepts (\textit{e.g.}, template parameters)
|
|
\ccIndexSubitem{naming scheme}{concepts}
|
|
\ccIndexSubitem{naming scheme}{capitalization}
|
|
should be separated using capital letters. The only use of underscores
|
|
in concept names is before the dimension suffix. For example, one
|
|
should use a name such as ConvexHullTraits\_2 for the concept
|
|
in contrast to \ccc{Convex_hull_traits_2} for the name of the class that
|
|
is a model of this concept. This different naming scheme for concepts
|
|
and classes was adopted mainly for two reasons (a) it is consistent with
|
|
the \stl\ (cf. InputIterator) and (b) it avoids name clashes between
|
|
concepts and classes that would require one or the other to have a
|
|
rather contrived name.
|
|
\item Abbreviations of words are to be avoided%
|
|
\ccIndexSubitem{naming scheme}{abbreviations}
|
|
({\em e.g.}, use
|
|
\ccc{Triangulation} instead of \ccc{Tri}). The only exceptions
|
|
might be standard geometric abbreviations (such as ``CH'' for ``convex
|
|
hull'') and standard data structure abbreviations (such as ``DS'' for
|
|
``data structure''). Unfortunately, the long names that result from
|
|
the absence of abbreviations are known to cause problems with some
|
|
compilers.\ccIndexMainItem{long-name problem}
|
|
% See Section~\ref{sec:long_name_problem}
|
|
% for further information about the so-called ``long-name problem.''
|
|
\ccIndexSubitemBegin{naming scheme}{capitalization}
|
|
\item Names of constants are uppercase ({\em e.g.}, \ccc{ORIGIN}).
|
|
\ccModifierCrossRefOff
|
|
\ccIndexSubitem{constants, global}{naming}
|
|
\ccModifierCrossRefOn
|
|
\item The first word of a class or enumeration name should be capitalized
|
|
({\em e.g.}, \ccc{Quotient}, \ccc{Orientation}).
|
|
\ccIndexSubitem{classes}{naming}
|
|
\ccIndexSubitem{enumerations}{naming}
|
|
\item Function names are in lowercase
|
|
({\em e.g.}, \ccc{is_zero}).
|
|
\ccIndexSubitem{functions}{naming}
|
|
\ccIndexSubitemEnd{naming scheme}{capitalization}
|
|
\item Boolean function names should begin with a verb. For example, use
|
|
\ccc{is_empty} instead of simply \ccc{empty} and
|
|
\ccc{has_on_bounded_side} instead of \ccc{on_bounded_side}.%
|
|
\ccIndexSubitem{functions}{naming}%
|
|
\ccIndexSubitem{naming scheme}{boolean functions}%
|
|
\ccIndexSubitem{naming scheme}{predicates}
|
|
\item Names of macros should begin with the prefix \ccc{CGAL_}.
|
|
\ccIndexSubitem{macros}{naming}
|
|
\end{itemize}
|
|
|
|
\subsection*{Geometric objects}
|
|
\ccIndexSubitemBegin{naming scheme}{geometric objects}
|
|
\ccIndexSubitemBegin{naming scheme}{dimension number}
|
|
\ccIndexSubitemBegin{geometric objects}{naming}
|
|
|
|
\begin{itemize}
|
|
\item All geometric objects have the dimension as a suffix (\eg, \ccc{Vector_2}
|
|
and \ccc{Plane_3}).
|
|
\textbf{Exception:} For $d$-dimensional objects there may be a dynamic
|
|
and a static version. The former has the suffix \ccc{_d}
|
|
(\eg, \ccc{Point_d}), while the latter has the dimension as the first
|
|
template parameter (\eg, \ccc{Point<d>}).
|
|
\end{itemize}
|
|
\ccIndexSubitemEnd{geometric objects}{naming}
|
|
\ccIndexSubitemEnd{naming scheme}{dimension number}
|
|
\ccIndexSubitemEnd{naming scheme}{geometric objects}
|
|
|
|
\subsection*{Geometric data structures and algorithms}
|
|
\ccIndexSubitemBegin{naming scheme}{data structures}
|
|
\ccIndexSubitemBegin{naming scheme}{algorithms}
|
|
\ccIndexSubitemBegin{data structures}{naming}
|
|
\begin{itemize}
|
|
\item Names for geometric data structures and algorithms should follow
|
|
the ``spirit'' of the rules given so far, \eg~a data structure for
|
|
triangulations in the plane is named \ccc{Triangulation_2}, and a
|
|
convex hull algorithm in 3-space is named \ccc{convex_hull_3}.
|
|
\item Member functions realizing predicates should start with \ccc{is_} or
|
|
\ccc{has_}, \eg~the data structure \ccc{Min_ellipse_2} has member
|
|
functions \ccc{is_empty} and \ccc{has_on_bounded_side}.
|
|
\ccIndexSubitem{naming scheme}{predicates}
|
|
\item Access to data structures is given via iterators and
|
|
circulators (Chapter~\ref{chap:iterators_and_circulators}).
|
|
For iterators and functions
|
|
returning them we extend
|
|
the \stl\ names with a prefix describing the items to be accessed.
|
|
For example, the functions \ccc{vertices_begin} and \ccc{vertices_end}
|
|
return a \ccc{Vertex_iterator}. (Note that we use the name of the items
|
|
in singular for the iterator type name and in plural for the functions
|
|
returning the iterator.) Names related to circulators are handled
|
|
similarly, using the suffix \ccc{_circulator}. For example, the
|
|
function \ccc{edges_circulator} returns an \ccc{Edge_circulator}.
|
|
\ccIndexSubitem{naming scheme}{iterators}
|
|
\ccIndexSubitem{naming scheme}{circulators}
|
|
\ccIndexSubitem{naming scheme}{access functions}
|
|
\ccIndexSubitem{iterators}{naming}
|
|
\ccIndexSubitem{circulators}{naming}
|
|
\ccIndexSubitem{access functions}{naming}
|
|
\end{itemize}
|
|
\ccIndexSubitemEnd{data structures}{naming}
|
|
\ccIndexSubitemEnd{naming scheme}{algorithms}
|
|
\ccIndexSubitemEnd{naming scheme}{data structures}
|
|
|
|
|
|
\subsection*{Kernel traits}
|
|
\ccIndexSubitemBegin{naming scheme}{kernel traits}
|
|
\ccIndexSubitemBegin{kernel traits}{naming scheme}
|
|
\ccIndexMainItemBegin{functors}
|
|
|
|
All types in the kernel concept are functor types. We distinguish the
|
|
following four categories:
|
|
\begin{enumerate}
|
|
\item\textbf{generalized predicates}, that is, standard predicates
|
|
returning a Boolean value as well as functions such as
|
|
\ccc{orientation()} that return an enumeration type (values from a
|
|
finite discrete set).
|
|
\item\textbf{construction objects}, which replace constructors in the
|
|
kernel,
|
|
\item\textbf{constructive procedures} and
|
|
\item\textbf{functors replacing operators}.
|
|
\end{enumerate}
|
|
|
|
\ccIndexSubitemBegin{functors}{naming} As detailed below, the names of
|
|
these functors reflect the actions performed by calls to
|
|
\ccc{operator()}. This naming scheme was chosen instead of one in
|
|
which the computed object determines the name because this latter
|
|
naming scheme is more natural for functions that compute values where
|
|
the function call can be seen as a name for the object returned
|
|
instead of functors that simply maintain data associated with the
|
|
computation. It was also noted that the naming of functions and
|
|
functors is not consistent, either in \cgal\ or in the \stl\ (In some
|
|
cases the action performed by a function determines its name (\eg,
|
|
\ccc{multiply()}) while in others the result of the action determines
|
|
the name (\eg, \ccc{product()}).), so achieving complete consistency
|
|
with an existing naming scheme is not possible.
|
|
|
|
Here are the naming rules:
|
|
\begin{itemize}
|
|
\item All names in the kernel traits have the dimension as a suffix.
|
|
This is necessary because in some cases (\eg, the \ccc{Orientation_2}
|
|
object) the absence of the suffix would cause a name conflict with
|
|
an existing type or class (\eg, the enumeration type \ccc{Orientation}).
|
|
\item The names of generalized predicates are determined by their
|
|
results. Furthermore, names are as much as possible consistent
|
|
with the current kernel and the \stl. So, for example, we have
|
|
objects like \ccc{Has_on_bounded_side_2}, \ccc{Is_degenerate_2},
|
|
and \ccc{Is_horizontal_2}. According to the current kernel we
|
|
also have \ccc{Left_turn_2}. For reasons of consistency with
|
|
\stl, all ``less-than''-objects start with \ccc{Less_},
|
|
\eg,~\ccc{Less_xy_2}. Further examples are
|
|
\ccc{Less_distance_to_point_2} and
|
|
\ccc{Less_distance_to_line_2}. However, we have \ccc{Equal_2},
|
|
whereas the corresponding \stl\ functor is called
|
|
\ccc{equal_to}. Here, we give our dimension rule higher
|
|
priority.
|
|
\item The names of construction objects (category 2 above) follow
|
|
the pattern \ccc{Construct_type_d}, where \texttt{type\_d}
|
|
is the type constructed, \eg,~\ccc{Construct_point_2} and
|
|
\ccc{Construct_line_2}. The \ccc{operator()} of these functor
|
|
classes is overloaded. This reduces the number of names to
|
|
remember drastically, while replacing one of the constructions
|
|
gets more complicated, but is still possible.
|
|
\item Functors in category 3 above can be further subdivided into
|
|
two classes:
|
|
\begin{itemize}
|
|
\item constructive procedures that construct objects whose types are
|
|
known {\em a priori}
|
|
\item procedures that construct objects whose types are not known
|
|
{\em a priori}
|
|
\end{itemize}
|
|
|
|
The names of functors in the first class also start with
|
|
\ccc{Construct_} whenever a geometric object is constructed,
|
|
otherwise they start with \ccc{Compute_}. Here, real numbers
|
|
are not considered to be 1-dimensional geometric objects. For
|
|
example, on the one hand we have
|
|
\ccc{Construct_perpendicular_vector_2},
|
|
\ccc{Construct_midpoint_3}, \ccc{Construct_circumcenter_d},
|
|
\ccc{Construct_bisector_2}, and \ccc{Construct_point_on_3},
|
|
while on the other hand there are \ccc{Compute_area_2} and
|
|
\ccc{Compute_squared_length_3}.
|
|
|
|
For the second class, the names of the objects describe the (generic)
|
|
action, \eg~\ccc{Intersect_2}.
|
|
\item The equality operator (\ccc{operator==()}) is replaced by function
|
|
objects with names of the form \ccc{Equal_k}, where {\tt k} is
|
|
the dimension number (\ie, 2, 3, or \ccc{d}).
|
|
For replacing arithmetic operators, we might also provide \ccc{Add_2},
|
|
\ccc{Subtract_2}, \ccc{Multiply_2}, and \ccc{Divide_2}. (As mentioned
|
|
above, the action determines the name, not the result.) We think
|
|
that these objects are not really needed. They are likely to be
|
|
part of primitive operations that have a corresponding function
|
|
object in the traits.
|
|
\end{itemize}
|
|
\ccIndexSubitemEnd{kernel traits}{naming scheme}
|
|
\ccIndexSubitemEnd{functors}{naming}
|
|
\ccIndexMainItemEnd{functors}
|
|
|
|
In addition, for each functor the kernel traits class has a member
|
|
function that returns an instance of this functor. The name of this
|
|
function should be the (uncapitalized) name of the
|
|
functor followed by the suffix \ccc{_object}.%
|
|
%\index{object functions@{\ccFont \_object} functions}
|
|
For example, the function that retuns an instance of the
|
|
\ccc{Less_xy_2} functor is called \ccc{less_xy_2_object}.
|
|
\ccIndexSubitemEnd{naming scheme}{kernel traits}
|
|
|
|
\subsection*{File names}
|
|
\ccIndexSubitemBegin{naming scheme}{source files}
|
|
\ccIndexSubitemBegin{source files}{naming scheme}
|
|
|
|
\begin{itemize}
|
|
\item File names should be chosen in the ``spirit'' of the naming rules given
|
|
above.
|
|
\item If a single geometric object, data structure, or algorithm is provided
|
|
in a single file, its name (and its capitalization) should be used for
|
|
the file name. For
|
|
example, the file \ccc{Triangulation_2.h} contains the data structure
|
|
\ccc{Triangulation\_2}.
|
|
\item If a file does not contain a single class, its name should not begin
|
|
with a capital letter.
|
|
\item No two files should have the same names even when capitalization is
|
|
ignored. This is to prevent overwriting of files on operating systems
|
|
where file names are not case sensitive. A package that contains
|
|
file names that are the same as files already in the release will be
|
|
rejected by the submission script.
|
|
|
|
\item The names of files should not contain any characters not allowed by
|
|
all the platforms the library supports. In particular, it should not
|
|
contain the characters `:', `*', or `\ '.
|
|
\end{itemize}
|
|
\ccIndexSubitemEnd{source files}{naming scheme}
|
|
\ccIndexSubitemEnd{naming scheme}{source files}
|
|
\ccIndexMainItemEnd{naming scheme}
|
|
|
|
|
|
% -----------------------------------------------------------------------------
|
|
\section{Programming conventions\label{sec:programming_conventions}}
|
|
\ccIndexMainItemBegin{programming conventions}
|
|
|
|
The first list of items are meant as rules, \ie,~you should follow them.
|
|
|
|
\begin{itemize}
|
|
\item Give typedefs for all template arguments of a class that may be
|
|
accessed later from outside the class.
|
|
|
|
The template parameter is a concept and should follow the concept naming
|
|
scheme outlines in the previous section. As a general rule, the typedef
|
|
should identify the template parameter with a type of the same name that
|
|
follows the naming convention of types. For example
|
|
\begin{verbatim}
|
|
template < class GeometricTraits_2 >
|
|
class Something {
|
|
public:
|
|
typedef GeometricTraits_2 Geometric_traits_2;
|
|
};
|
|
\end{verbatim}
|
|
For one-word template arguments, the template parameter name should be
|
|
followed by an underscore. (Note that using a preceding
|
|
underscore is not allowed according to the \CC\ standard; all such names
|
|
are reserved.)\index{C++ standard@\CC\ standard!underscores}%
|
|
\begin{verbatim}
|
|
template < class Arg_ >
|
|
class Something {
|
|
public:
|
|
typedef Arg_ Arg;
|
|
};
|
|
\end{verbatim}
|
|
\ccIndexSubitem{underscores}{in names}%
|
|
\ccIndexSubitem{naming scheme}{underscores}%
|
|
\ccIndexSubitem{naming scheme}{template parameters}%
|
|
\item Use \ccc{const} when a call by reference argument is not
|
|
modified, e.g.~\ccc{int f( const A& a)}%
|
|
\index{call by reference!const and@{\ccFont const} and}.
|
|
\item Use \ccc{const} to indicate that a member function does not
|
|
modify the object to which it is applied,
|
|
\eg,~\ccStyle{class A \{ int f( void) const; \};}. This should also be
|
|
done when it is only conceptually \ccc{const}%
|
|
\index{conceptual const-ness@conceptual {\ccFont const}-ness|textbf}.
|
|
This means that the member function \ccc{f()} is {\ccFont const} as seen from
|
|
the outside, but internally it may modify some data members
|
|
that are declared {\ccFont mutable}\ccIndexMainItem{\ccFont mutable}. An example
|
|
is the caching of results from expensive computations. For more
|
|
information about conceptually {\ccFont const} functions and mutable data
|
|
members see \cite{cgal:m-ec-97}.
|
|
\item Prefer \CC-style to C-style casts,%
|
|
\index{casts!C++-style vs. C-style@\CC- style vs. C-style}
|
|
\eg,~use \ccc{static_cast<double>( i)} instead of {\ccFont (double)i}.
|
|
\item Protect header files against multiple inclusion,
|
|
\ccIndexSubitem{header files}{multiple inclusion of}
|
|
\eg~the file {\tt This\_is\_an\_example.h} should begin/end with
|
|
\begin{verbatim}
|
|
#ifndef CGAL_THIS_IS_AN_EXAMPLE_H
|
|
#define CGAL_THIS_IS_AN_EXAMPLE_H
|
|
...
|
|
#endif // CGAL_THIS_IS_AN_EXAMPLE_H
|
|
\end{verbatim}
|
|
\end{itemize}
|
|
|
|
The following items can be seen as recommendations
|
|
in contrast to the rules of previous paragraph.
|
|
|
|
\begin{itemize}
|
|
\item Use \verb|#define| sparingly.
|
|
\item Do not rename the base types of \CC\ using {\ccFont typedef}.
|
|
\item When using an overloaded call, always give the exact match. Use
|
|
explicit casting if necessary.
|
|
\item Do not call global functions unqualified, that is, always
|
|
specify explicitly the namespace where the function is defined.
|
|
\end{itemize}
|
|
\ccIndexMainItemEnd{programming conventions}
|
|
|
|
|
|
% -----------------------------------------------------------------------------
|
|
\section{Code format\label{sec:code_format}}
|
|
\ccIndexMainItemBegin{code format}
|
|
|
|
\begin{itemize}
|
|
\item Lines should not exceed 80 characters (the SVN server warns about that
|
|
when committing)%
|
|
\ccIndexSubitem{code format}{line length}
|
|
\item Use indentation with at least two spaces extra per level.%
|
|
\ccIndexSubitem{code format}{indentation}
|
|
\item Write only one statement per line.
|
|
\item Use \CC-style comments, \eg,~{\ccFont // some comment}.%
|
|
\ccIndexSubitem{code format}{comments}
|
|
\end{itemize}
|
|
\ccIndexMainItemEnd{code format}
|
|
|
|
|
|
% -----------------------------------------------------------------------------
|
|
\section{File header\label{sec:file_header}}
|
|
\ccIndexSubitemBegin{source files}{headings for}
|
|
|
|
Each \cgal\ source file must start with a heading that allows for an easy
|
|
identification of the file. The file header contains:
|
|
\begin{itemize}
|
|
\item a copyright notice, specifying all the years during which the file has
|
|
been written or modified, as well as the owner(s) (typically the institutions
|
|
employing the authors) of this work,
|
|
\item the corresponding license (at the moment, only LGPL v2.1 and QPL v1.0
|
|
are allowed in \cgal), and a pointer to the file containing its text in the
|
|
\cgal\ distribution,
|
|
\item a disclaimer notice,
|
|
\item then, there are 2 keywords, which are automatically expanded by SVN
|
|
(there are options in SVN to suppress these expansions if you need):
|
|
\begin{itemize}
|
|
% Note : the {} are there to prevent the expansion of the keywords here.
|
|
\item \${}URL: \$ : the name of the source file in the repository, it also
|
|
helps figuring out which package the file comes from,
|
|
\item \${}Id: \$ : the SVN revision number of the file, the date of this revision,
|
|
and the author of the last commit.
|
|
\end{itemize}
|
|
\item Then the authors of (non-negligible parts of) this file are listed, with
|
|
optional affiliation or e-mail address.
|
|
\end{itemize}
|
|
|
|
\ccIndexSubitem{example programs}{headings for}
|
|
\ccIndexSubitem{demo programs}{headings for}
|
|
For example and demo programs, the inclusion of the copyright notice is not
|
|
necessary as this will get in the way if the program is included in the
|
|
documentation. However, these files should always contain the name of
|
|
the file realtive to the \texttt{CGAL\_HOME} directory
|
|
(\eg, \nonlinkedpath|examples/Convex_hull_3/convex_hull_3.cpp|)
|
|
so the file can be located when seen out of context (\eg, in the documentation
|
|
or from the demos web page).
|
|
|
|
For the test-suite and the documentation source, these are not distributed at
|
|
the moment, so there is no policy for now.
|
|
|
|
\InternalOnly{
|
|
\input{Developers_manual/code_format_internal}
|
|
}
|
|
|
|
% ===== EOF ===================================================================
|