This chapter lists the licenses under which the Cgal datastructures and algorithms are distributed, and the third party libraries on which Cgal depends, or for which Cgal provides interfaces. The chapter further explains how to control inlining, thread safety, code deprecation, checking of pre- and postconditions, and how to alter the failure behavior.
Cgal is Open Source software, and consists of different parts covered by different licenses. In this section we explain the essence of the different licenses, as well as the rationale why we have chosen them.
The fact that Cgal is Open Source software does not mean that users are free to do whatever they want with the software. Using the software means to accept the license, which has the status of a contract between the user and the owner of the Cgal software. A more detailed description of the license terms is available in the Cgal software tarball.
The Qpl is an Open Source license that obliges you to distribute your software based on Qpled Cgal data structures. The rationale behind this is that we can claim access to your software. The license further obliges you to put your software under an Open Source license as well. The rationale behind is that we can distribute your software, even if this is not your intention. Finally, the Qpl requires that, if you modify Cgal, you distribute the modifications in the form of patches and you distribute the sources of your changes as well.
The exact license terms can be found at the Trolltech web site: http://doc.qt.nokia.com/4.3/qpl.html.
The Lgpl is an Open Source license that obliges you to distribute modifications you make on Cgal software accessible to the users. There is no obligation to make the source code of software you build on top of Lgpled Cgal data structures available.
Currently the linear kernel, the support library, the halfedge data structure, the kinetic data structures, and the mesh subdivision framework are distributed under the Lgpl. The rationale behind is that we want to promote them as de facto standards.
The exact license terms can be found at the Free Software Foundation web site: http://www.gnu.org/copyleft/lesser.html.
Users who cannot comply to the Open Source license terms can buy individual data structures under various commercial licenses from GeometryFactory: http://www.geometryfactory.com.
The General Public License (Gpl) has a viral effect which makes it incompatible with the Qpl. For more information, please refer to the paragraph about the Qpl on the licenses web page of the Free Software Foundation (Fsf): http://www.fsf.org/licensing/licenses/index_html. It is therefore not possible to build a program including Gpl code and some Qpl parts of Cgal. In this case, if you are the copyright owner of the Gpl code, you can amend the license by adding an exception allowing the use of Cgal with it (see again the Fsf web page).
In this section we list the software that is used by the various Cgal packages.
Cgal heavily uses the Stl, and in particular adopted many of its design ideas. The Stl comes with the compiler, but it is possible to use the compiler together with an alternative Stl implementation. You can find online documentation for the Stl at various web sites, e.g., http://www.sgi.com/tech/stl/, http://www.cplusplus.com/reference/stl/, or http://msdn.microsoft.com/en-us/library/1fe2x6kt(VS.71).aspx.
Boost is a collection of libraries. Cgal needs some of them, that is it is mandatory. If Boost is not already on your system, e.g., on Windows, you can download it from http://www.boost.org.
The blas (Basic Linear Algebra Subprograms) are routines that provide standard building blocks for performing basic vector and matrix operations. In Cgal, blas is required by the packages Estimation of Local Differential Properties and Approximation of Ridges and Umbilics only.
You can download the official release from http://www.netlib.org/blas/ or download optimized implementations from http://www.netlib.org/blas/faq.html#5. Alternatively, installing Taucs provides blas.
lapack provides routines for solving systems of simultaneous linear equations, least-squares solutions of linear systems of equations, eigenvalue problems, and singular value problems. In Cgal, lapack is required by the packages Estimation of Local Differential Properties and Approximation of Ridges and Umbilics only.
You can download the official release from http://www.netlib.org/lapack/. Alternatively, installing Taucs customized for Cgal provides lapack.
A library for multi precision integers and rational numbers. Cgal offers adapters for these number types. The usage of the Gmp library is optional. If it is not already on your system, e.g., on Windows, you can download it from http://gmplib.org/ or from the download section of http://www.cgal.org.
A library for multi precision floating point numbers. The usage of the Mpfr library is optional, and you must install it when you use Gmp. You can download Mpfr from http://www.mpfr.org or from the download section of http://www.cgal.org.
RS stands for Real Solutions and is devoted to the study of the real roots of polynomial systems with a finite number of complex roots (including univariate polynomials). RS is used only by one model of the Algebraic Kernel.
RS is freely distributable for non-commercial use. You can download it from http://www.loria.fr/equipes/vegas/rs/.
A library of efficient data structures and algorithms. Cgal offers adapters to the Leda number types. The usage is optional. It is available commercially from http://www.algorithmic-solutions.com, and there exists a binary ``free edition''.
Taucs is a library of sparse linear solvers. In Cgal, it is used to improve the computations within the Planar Parameterization of Triangulated Surface Meshes package only.
The Taucs web site is http://www.tau.ac.il/~stoledo/taucs/.
The latest official version is Taucs version 2.2, September 4, 2003.
Copyright (c) 2001, 2002, 2003 by Sivan Toledo, Tel-Aviv University,
stoledo@tau.ac.il. All Rights Reserved.
See http://www.tau.ac.il/~stoledo/taucs/ for the license and the availability note.
Used by permission of Sivan Toledo.
The Cgal project provides a modified version of Taucs in the download
section of http://www.cgal.org. This version fixes some bugs,
supports 64-bit platforms and allows a simplified installation process.
It also contains a complete lapack implementation.
CAUTION: Since version 3.3.1, Cgal is no longer compatible with the official
release of Taucs (currently 2.2). Make sure to use the modified
version provided in the download section.
OpenNL (Open Numerical Library) is a library to easily construct and solve sparse linear systems. It is the default solver of the Surface Mesh Parameterization package.
OpenNL's main page is http://www.loria.fr/~levy/software/.
Cgal includes a version of OpenNL in C++, made especially for Cgal by Bruno Lévy.
A data compression library. It is used in the examples of the Surface Mesh Generation package. If it is not already on your system, e.g., on Windows, you can download it from http://www.gzip.org/zlib.
Qt is a cross-platform application framework. The usage of Qt is optional, but note that it is used for many Cgal 2D as well as 3D demos.
As Qt is the layer underneath Kde, Qt is installed on many Linux systems. Otherwise you can download it from http://qt.nokia.com/.
A 3D widget based on Qt 4's QGLWidget. It can be downloaded from http://www.libqglviewer.com/.
An implementation of Open Inventor. It is used in the demo of the Kinetic Data Structures package. You can download it from http://www.coin3d.org/.
In this manual you will encounter sections marked as follows.
Some functionality is considered more advanced, for example because it is relatively low-level, or requires special care to be properly used.
Usually related to advanced features that for example may not guarantee class invariants, some functionality is provided that helps debugging, for example by performing invariants checks on demand.
Sometimes, the Cgal project decides that a feature is deprecated. This means that it still works in the current release, but it will be removed in the next, or a subsequent release. This can happen when we have found a better way to do something, and we would like to reduce the maintenance cost of Cgal at some point in the future. There is a trade-off between maintaining backward compatibility and implementing new features more easily.
In order to help users manage the changes to apply to their code, we attempt to make Cgal code emit warnings when deprecated code is used. This can be done using some compiler specific features. Those warnings can be disabled by defining the macro CGAL_NO_DEPRECATION_WARNINGS. On top of this, we also provide a macro, CGAL_NO_DEPRECATED_CODE, which, when defined, disables all deprecated features. This allows users to easily test if their code relies on deprecated features.
All names introduced by Cgal, especially those documented in these manuals, are in a namespace called CGAL, which is in global scope. A user can either qualify names from Cgal by adding CGAL::, e.g., CGAL::Point_2< CGAL::Exact_predicates_inexact_constructions_kernel >, make a single name from Cgal visible in a scope via a using statement, e.g., using CGAL::Point_2;, and then use this name unqualified in this scope, or even make all names from namespace CGAL visible in a scope with using namespace CGAL;. The latter, however, is likely to give raise to name conflicts and is therefore not recommended.
Not all compilers fully support standard header names. Cgal provides workarounds for these problems in CGAL/basic.h. Consequently, as a golden rule, you should always include CGAL/basic.h first in your programs (or CGAL/Cartesian.h, or CGAL/Homogeneous.h, since they include CGAL/basic.h first).
Cgal is progressively being made thread-safe. The guidelines which are followed are:
If the macro CGAL_HAS_THREADS is not defined, then Cgal assumes it can use any thread-unsafe code (such as static variables). By default, this macro is not defined, unless BOOST_HAS_THREADS or _OPENMP is defined. It is possible to force its definition on the command line, and it is possible to prevent its default definition by setting CGAL_HAS_NO_THREADS from the command line.
Cgal is based on the C++ standard released in 1998 (and later refined in 2003). A new major version of this standard is being prepared, and is refered to as C++0x. Some compilers and standard library implementations already provide some of the functionality of this new standard, as a preview. For example, g++ provides a command-line switch -std=c++0x which enables some of those features.
Cgal attempts to support this mode progressively, and already makes use of some of these features if they are available, although no extensive support has been implemented yet.
Much of the Cgal code contains checks. For example, all checks used in the kernel code are prefixed by CGAL_KERNEL. Other packages have their own prefixes, as documented in the corresponding chapters. Some are there to check if the kernel behaves correctly, others are there to check if the user calls kernel routines in an acceptable manner.
There are four types of checks. The first three are errors and lead to a halt of the program if they fail. The last only leads to a warning.
By default, all of these checks are performed.
It is however possible to turn them off through the use of compile time
switches.
For example, for the checks in the kernel code, these switches are the
following:
CGAL_KERNEL_NO_PRECONDITIONS,
CGAL_KERNEL_NO_POSTCONDITIONS,
CGAL_KERNEL_NO_ASSERTIONS and
CGAL_KERNEL_NO_WARNINGS.
So, in order to compile the file foo.cpp with the postcondition checks
off, you can do:
CC -DCGAL_KERNEL_NO_POSTCONDITIONS foo.cpp
This is also preferably done by modifying your makefile by adding -DCGAL_KERNEL_NO_POSTCONDITIONS to the CXXFLAGS variable.
The name KERNEL in the macro name can be replaced by a package specific name in order to control assertions done in a given package. This name is given in the documentation of the corresponding package, in case it exists.
Note that global macros can also be used to control the behavior over the whole Cgal library:
Setting the macro CGAL_NDEBUG disables all checks. Note that the standard flag NDEBUG sets CGAL_NDEBUG, but it also affects the standard assert macro. This way, adding -DCGAL_NDEBUG to your compilation flags removes absolutely all checks. This is the default recommended setup for performing timing benchmarks for example.
Not all checks are on by default. All four types of checks can be marked as expensive or exactness checks (or both). These checks need to be turned on explicitly by supplying one or both of the compile time switches CGAL_KERNEL_CHECK_EXPENSIVE and CGAL_KERNEL_CHECK_EXACTNESS.
Expensive checks are, as the word says, checks that take a considerable time to compute. Considerable is an imprecise phrase. Checks that add less than 10 percent to the execution time of the routine they are in are not expensive. Checks that can double the execution time are. Somewhere in between lies the border line. Checks that increase the asymptotic running time of an algorithm are always considered expensive. Exactness checks are checks that rely on exact arithmetic. For example, if the intersection of two lines is computed, the postcondition of this routine may state that the intersection point lies on both lines. However, if the computation is done with doubles as number type, this may not be the case, due to round off errors. So, exactness checks should only be turned on if the computation is done with some exact number type.
As stated above, if a postcondition, precondition or assertion is violated, an exception is thrown, and if nothing is done to catch it, the program will abort. This behavior can be changed by means of the following function.
#include <CGAL/assertions_behaviour.h>
|
|
The parameter should have one of the following values.
|
If the EXIT value is set, the program will stop and return a value indicating failure, but not dump the core. The CONTINUE value tells the checks to go on after diagnosing the error. Note that since Cgal 3.4, CONTINUE has the same effect as THROW_EXCEPTION for errors (but it keeps its meaning for warnings), it is not possible anymore to let assertion failures simply continue (except by totally disabling them).
The value that is returned by set_error_behaviour is the value that was in use before.
For warnings there is a separate routine, which works in the same way. The only difference is that for warnings the default value is CONTINUE.
|
|
The compile time flags as described up to now all operate on the whole library. Sometimes you may want to have a finer control. Cgal offers the possibility to turn checks on and off with a bit finer granularity, namely the module in which the routines are defined. The name of the module is to be appended directly after the Cgal prefix. So, the flag CGAL_KERNEL_NO_ASSERTIONS switches off assertions in the kernel only, the flag CGAL_CH_CHECK_EXPENSIVE turns on expensive checks in the convex hull module. The name of a particular module is documented with that module.
Normally, error messages are written to the standard error output. It is possible to do something different with them. To that end you can register your own handler. This function should be declared as follows.
|
|
Your failure function will be called with the following parameters. type is a string that contains one of the words precondition, postcondition, assertion or warning. The parameter expression contains the expression that was violated. file and line contain the place where the check was made. The explanation parameter contains an explanation of what was checked. It can be NULL, in which case the expression is thought to be descriptive enough.
There are several things that you can do with your own handler. You can display a diagnostic message in a different way, for instance in a pop up window or to a log file (or a combination). You can also implement a different policy on what to do after an error. For instance, you can throw an exception or ask the user in a dialog whether to abort or to continue. If you do this, it is best to set the error behavior to CONTINUE, so that it does not interfere with your policy.
You can register two handlers, one for warnings and one for errors. Of course, you can use the same function for both if you want. When you set a handler, the previous handler is returned, so you can restore it if you want.
#include <CGAL/assertions.h>
|
| |
|
|
#include <CGAL/assertions.h> void my_failure_handler( const char *type, const char *expr, const char* file, int line, const char* msg) { /* report the error in some way. */ } void foo() { CGAL::Failure_function prev; prev = CGAL::set_error_handler(my_failure_handler); /* call some routines. */ CGAL::set_error_handler(prev); }
#include <CGAL/version.h>
Every release of Cgal defines the following preprocessor macros:
More precisely, it is defined as 1MMmmbiiii, where MM is the major release number (e.g. 03), mm is the minor release number (e.g. 02), b is the bug-fix release number (e.g. 0), and iiii is the internal release number (e.g. 0001). For public releases, the latter is defined as 1000. Examples: for the public release 3.2.4 this number is 1030241000; for internal release 3.2-I-1, it is 1030200001. Note that this scheme was modified around 3.2-I-30.
Making functions inlined can, at times, improve the efficiency of your code. However this is not always the case and it can differ for a single function depending on the application in which it is used. Thus Cgal defines a set of compile-time macros that can be used to control whether certain functions are designated as inlined functions or not. The following table lists the macros and their default values, which are set in one of the Cgal include files.
macro name | default |
CGAL_KERNEL_INLINE | inline |
CGAL_KERNEL_MEDIUM_INLINE | |
CGAL_KERNEL_LARGE_INLINE | |
CGAL_MEDIUM_INLINE | inline |
CGAL_LARGE_INLINE | |
CGAL_HUGE_INLINE |
If you wish to change the value of one or more of these macros, you can simply give it a new value when compiling. For example, to make functions that use the macro CGAL_KERNEL_MEDIUM_INLINE inline functions, you should set the value of this macro to inline instead of the default blank.
Note that setting inline manually is very fragile, especially in a template context. It is usually better to let the compiler select by himself which functions should be inlined or not.