dust3d/thirdparty/cgal/CGAL-5.1/include/CGAL/Handle_for_virtual.h

174 lines
3.5 KiB
C
Raw Normal View History

2020-10-13 12:44:25 +00:00
// Copyright (c) 1999
// Utrecht University (The Netherlands),
// ETH Zurich (Switzerland),
// INRIA Sophia-Antipolis (France),
// Max-Planck-Institute Saarbruecken (Germany),
2020-10-13 12:44:25 +00:00
// and Tel-Aviv University (Israel). All rights reserved.
//
2020-10-13 12:44:25 +00:00
// This file is part of CGAL (www.cgal.org)
//
2020-10-13 12:44:25 +00:00
// $URL: https://github.com/CGAL/cgal/blob/v5.1/STL_Extension/include/CGAL/Handle_for_virtual.h $
// $Id: Handle_for_virtual.h 0779373 2020-03-26T13:31:46+01:00 Sébastien Loriot
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
//
// Author(s) : Stefan Schirra
2020-10-13 12:44:25 +00:00
#ifndef CGAL_HANDLE_FOR_VIRTUAL_H
#define CGAL_HANDLE_FOR_VIRTUAL_H
#include <CGAL/config.h>
#include <typeinfo>
#include <cstddef>
namespace CGAL {
class Ref_counted_virtual
{
public:
Ref_counted_virtual() : count(1) {}
Ref_counted_virtual(const Ref_counted_virtual&) : count(1) {}
void add_reference() { ++count; }
void remove_reference() { --count; }
bool is_referenced() const { return (count != 0); }
bool is_shared() const { return (count > 1); }
virtual const std::type_info & type() const
{ return typeid(void); }
virtual const void * object_ptr() const
2020-10-13 12:44:25 +00:00
{ return nullptr; }
virtual ~Ref_counted_virtual() {}
protected:
unsigned int count;
};
template <class RefCounted>
// RefCounted must provide
// add_reference()
// remove_reference()
// bool is_referenced() const
// bool is_shared() const
// and initialize count to 1 in default and copy constructor
class Handle_for_virtual
{
public:
typedef std::ptrdiff_t Id_type ;
2020-10-13 12:44:25 +00:00
Handle_for_virtual(const RefCounted& rc)
{
ptr = new RefCounted(rc);
}
Handle_for_virtual()
{
2020-10-13 12:44:25 +00:00
ptr = nullptr;
}
Handle_for_virtual( const Handle_for_virtual& h)
{
ptr = h.ptr;
ptr->add_reference();
}
~Handle_for_virtual()
{
ptr->remove_reference();
if ( !ptr->is_referenced() )
2020-10-13 12:44:25 +00:00
delete ptr;
}
Handle_for_virtual&
operator=( const Handle_for_virtual& h)
{
h.ptr->add_reference();
ptr->remove_reference();
if ( !ptr->is_referenced() )
2020-10-13 12:44:25 +00:00
delete ptr;
ptr = h.ptr;
return *this;
}
Handle_for_virtual&
operator=( Handle_for_virtual && h)
{
swap(h);
return *this;
}
// protected:
typedef RefCounted element_type;
template <class T>
void
initialize_with( const T& rc)
{
2020-10-13 12:44:25 +00:00
ptr = new T(rc);
}
Id_type id() const { return Ptr() - static_cast<RefCounted const*>(0); }
2020-10-13 12:44:25 +00:00
bool identical( const Handle_for_virtual& h) const { return Ptr() == h.Ptr(); }
void
swap(Handle_for_virtual & h)
{ std::swap(h.ptr, ptr); }
const RefCounted *
Ptr() const
{ return ptr; }
const void * object_ptr() const
{
return ptr->object_ptr();
}
/*
T *
Ptr()
{
2020-10-13 12:44:25 +00:00
copy_on_write();
return ptr;
}
*/
/*
// private:
void
copy_on_write()
{
if ( ptr->is_shared() )
{
RefCounted* tmp_ptr = allocator.allocate(1);
allocator.construct( tmp_ptr, *ptr);
ptr->remove_reference();
ptr = tmp_ptr;
}
}
*/
protected:
/*
RefCounted * ptr() const
{
2020-10-13 12:44:25 +00:00
return ptr;
}
*/
RefCounted * ptr;
};
template <class RefCounted>
inline bool identical(const Handle_for_virtual<RefCounted> &h1, const Handle_for_virtual<RefCounted> &h2) { return h1.identical(h2); }
} //namespace CGAL
#endif // CGAL_HANDLE_FOR_VIRTUAL_H