That required a refactoring the timestamper feature. And the
explanation why is quite long... Let's do it.
The CGAL triangulations use the `Rebind_TDS` feature. During the
instanciation of `Compact_container<T>` it is important that `T` is
allowed to be incomplete, otherwise the circular dependencies between
TDS and Vertex/Cell cannot be resolved by the compiler. In previous
implementation of the timestamper, to allow `T` to be an incomplete
type, the compact container only carried a *point* to the time
stamper, allocated on the heap. A moved-from compact container would
only be valid if one recreated a time stamper for it on the head in
the move-constructor. As I want move operations to be `noexcept`, I
needed to change that implementation. Now the triangulation always
carries a time stamp counter (`std::size`), independently of the type
`T`, and the time stamper is an empty class, with static methods. That
allows `T` to be incomplete during the declaration of
`Compact_container<T>`.
That macro allows to store the time stamp in the `CC_iterator` (the type
of handle for the triangulation vertices and cells), and check that
handle and pointee have the same time stamp.
When a `Vertex` or a `Cell` is recycled by the `Compact_container`,
re-use the existing time stamp instead of increment it. That will avoid
that the pointee of a handle has a changing timestamp.
Previously, each file was using its own implementation of the "compare
handle" function object. This commits adds a new class
`Compare_handles_with_or_without_timestamps` that checks the presence of
`Has_timestamp` in the pointed type, and provides a different
`operator()` depending on that.
Note that, by default, `Triangulation_3::remove` is not deterministic:
it iterates on a `std::map` (or a `boost::unordered_map`) where the key
type is a triple of vertex handles: the order of that iteration depends
on the comparison (or hashing) of pointers.