Provided by: libppl-dev_1.1-1ubuntu1_amd64 bug

NAME

       libppl - the C++ interface of the Parma Polyhedra Library

SYNOPSIS

       #include <ppl.hh>

       c++ file.cc -lppl

DESCRIPTION

       This  is  a  short overview on how to use the Parma Polyhedra Library (PPL) in your C++ programs on Unix-
       like operating systems.  Note that the PPL has interfaces also for C, Java, OCaml and a number of  Prolog
       systems:  look  elsewhere  for  documentation  on  those.   Note  also that the present document does not
       describe the library functionality, its classes or its methods and functions:  see  The  Parma  Polyhedra
       Library User's Manual (version 1.0) for this kind of information.

INCLUDING THE HEADER FILE

       The  C++  interface  of the PPL has only one header file, named ppl.hh.  So your program should contain a
       directive of the form

       #include <ppl.hh>

       Of course, you must make sure you installed the PPL in a place where the compiler can find it, either  by
       itself  or with the help of a suitable -Idir command line option (see the file INSTALL for information on
       how to configure the library so that it is installed in the place of your choice).

INITIALIZING AND FINALIZING THE LIBRARY

       The mere inclusion of ppl.hh in at least one file of your project will cause the automatic initialization
       and  finalization  of  the  library.  However, there are situations in which automatic initialization and
       finalization is not desirable (e.g.,  if  the  application  fiddles  with  the  GMP's  memory  allocation
       functions).  In those cases, every inclusion of ppl.hh must take the form

       #define PPL_NO_AUTOMATIC_INITIALIZATION
       #include <ppl.hh>

       When automatic initialization and finalization is disabled you must absolutely call the function

       void Parma_Polyhedra_Library::initialize()

       before using the library.  It is also a good norm to call the function

       void Parma_Polyhedra_Library::finalize()

       when you are done with the library.

USING THE LIBRARY

       Keeping  in  mind that there is no substitute for a careful reading of The Parma Polyhedra Library User's
       Manual (version 1.0), you can find many examples of use in the directories tests (see the README file  in
       that directory) and demos/ppl_lcdd of the source distribution.

LINKING WITH THE LIBRARY

       Linking with the C++ interface of the Parma Polyhedra Library is best done using the C++ compiler itself:
       usually, specifying the -lppl command line option is enough.  In fact, if you use a shared version of the
       library,  this automatically records the dependency from the GMP library, something that the linker ought
       to deal with gracefully.  Otherwise you will have to add -lgmpxx -lgmp to the command line.   Things  are
       more complex if you installed the PPL into some nonstandard place.  In this case you will have to use the
       -Ldir option and, if you use a shared version of the  library,  possible  take  further  steps:  see  the
       documentation  of  your  system  for  more  information  on  this  subject  (the Program Library HOWTO is
       especially valuable for GNU/Linux users).

IMPLEMENTING MEMORY-GUARDED COMPUTATIONS

       One of the interesting features of the Parma Polyhedra Library is the possibility  to  implement  memory-
       guarded  computations.   The  idea  is  that  you can limit the amount of virtual memory available to the
       process, launch a PPL computation, and be ready to catch an std::bad_alloc exception.  Since the  library
       is  exception-safe, you can take the appropriate corrective measures (e.g., simplify the polyhedra and/or
       select less precise though less complex algorithms), and restart the computation.  In order to  do  that,
       you  should  define alternative memory allocation functions for GMP that throw std::bad_alloc upon memory
       exhaustion.  For instance:

       #include <new>
       #include <cstdlib>

       extern "C" void*
       cxx_malloc(size_t size) {
         void* p = malloc(size);
         if (p != 0 || size == 0)
           return p;

         throw std::bad_alloc();
       }

       extern "C" void*
       cxx_realloc(void* q, size_t, size_t new_size) {
         void* p = realloc(q, new_size);
         if (p != 0 || new_size == 0)
           return p;

         throw std::bad_alloc();
       }

       extern "C" void
       cxx_free(void* p, size_t) {
         free(p);
       }

       Then you must install these functions and this can be done in two different ways:

       (1)    If your C++ compiler supports __attribute__ ((weak)) and you do not have any other special  needs,
              then      you     can     simply     link     to     your     application     a     C     function
              ppl_set_GMP_memory_allocation_functions(void) such as

              extern "C" void
              ppl_set_GMP_memory_allocation_functions(void) {
                mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
              }

              This is all that you have to do, whether or not you use the automatic  initialization  feature  of
              the  library  (see  above):  in  any  case  the  initialization  procedure will automatically call
              ppl_set_GMP_memory_allocation_functions(void).

       (2)    If your C++ compiler does not support __attribute__ ((weak)) then you  cannot  use  the  automatic
              initialization feature of the library (see above) and should write a main program of the form

              int main() {
                // The ordering of the following function calls is important.
                mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
                Parma_Polyhedra_Library::initialize();
                ...

USING NATIVE FLOATING POINT NUMBERS

       At  initialization  time, the Parma Polyhedra Library sets the FPU rounding mode in a way that allows its
       floating-point-based computations to be  conservative  (i.e.,  possibly  approximated  but  correct)  and
       reasonably efficient.  In case your application itself uses native floating point numbers and relies on a
       particular rounding mode (if you are in doubt, assume that it does rely  on  round-to-nearest  to  be  in
       effect), you should use the function

       void Parma_Polyhedra_Library::restore_pre_PPL_rounding()

       after  the PPL initialization and before using native floating point numbers in the application.  If your
       application does not use any floating-point-based PPL abstraction, no further measure  should  be  taken.
       Otherwise, it is imperative to call the function

       void Parma_Polyhedra_Library::set_rounding_for_PPL()

       before invoking any PPL interface related to such abstractions.

SEE ALSO

       ppl-config(1)

       Roberto  Bagnara,  Patricia  M.  Hill,  and  Enea  Zaffanella.  The Parma Polyhedra Library User's Manual
       (version 1.0), available (in several formats) at http://bugseng.com/products/ppl/ .

       David    A.    Wheeler.     Program    Library    HOWTO,    available    (in    several    formats)    at
       http://www.dwheeler.com/program-library/ .

AVAILABILITY

       The  latest  version  of  the  Parma  Polyhedra  Library  and  all  the  documentation  is  available  at
       http://bugseng.com/products/ppl/ .

AUTHOR

       See the file CREDITS in the source distribution or use the command ppl-config --credits  for  a  list  of
       contributors.

REPORTING BUGS

       Report bugs to <ppl-devel@cs.unipr.it>.

COPYRIGHT AND NO WARRANTY

       Copyright  (C)  2001-2010  Roberto  Bagnara  <bagnara@cs.unipr.it>  Copyright  (C)  2010-2013 BUGSENG srl
       (http://bugseng.com)
       This is free software; see the file COPYING in the source distribution  or  use  the  command  ppl-config
       --copying  to  obtain  the  copying  conditions.   There  is NO warranty; not even for MERCHANTABILITY or
       FITNESS FOR A PARTICULAR PURPOSE.