1#ifndef SimTK_SimTKCOMMON_CLONE_ON_WRITE_PTR_H_
2#define SimTK_SimTKCOMMON_CLONE_ON_WRITE_PTR_H_
82 {
if (x) {p=x; count=
new long(1);} }
109 { shareWith<U>(src); }
115 { moveFrom(std::move(src)); }
121 { moveFrom<U>(std::move(src)); }
135 {
reset(); shareWith(src); }
143 if (
static_cast<T*
>(src.p) != p)
144 {
reset(); shareWith<U>(src); }
156 {
reset(); moveFrom(std::move(src)); }
165 reset(); moveFrom<U>(std::move(src));
175 {
reset(cloneOrNull(&x));
return *
this; }
182 {
reset(x);
return *
this; }
200 const T*
get() const noexcept {
return p;}
215 "An attempt was made to dereference a null pointer.");
224 "An attempt was made to dereference a null pointer.");
262 if (decr()==0) {
delete p;
delete count;}
274 if (x) {p=x; count=
new long(1);}
283 std::swap(p, other.p);
284 std::swap(count, other.count);
291 long use_count() const noexcept {
return count ? *count : 0;}
301 bool empty() const noexcept {
return !p;}
305 explicit operator bool() const noexcept {
return !
empty();}
316 T* save = p;
delete count; init();
331 { decr(); p=p->clone(); count=
new long(1); }
339 static T* cloneOrNull(
const T* src) {
340 return src ? src->clone() :
nullptr;
347 if (!src.empty()) {p=src.p; count=src.count; incr();}
352 template <
class U>
void moveFrom(CloneOnWritePtr<U>&& src)
noexcept {
354 p=src.p; count=src.count; src.init();
358 long incr() const noexcept {assert(count && *count>=0);
return ++(*count);}
359 long decr() const noexcept {assert(count && *count>=1);
return --(*count);}
361 void init() noexcept {p=
nullptr; count=
nullptr;}
380template <
class T>
inline void
388template <
class charT,
class traits,
class T>
389inline std::basic_ostream<charT,traits>&
390operator<<(std::basic_ostream<charT,traits>& os,
392{ os << p.
get();
return os; }
399template <
class T,
class U>
402{
return lhs.
get() == rhs.
get(); }
408{
return lhs.
empty(); }
414{
return rhs.
empty(); }
422template <
class T,
class U>
425{
return lhs.
get() < rhs.
get(); }
441{
return !rhs.
empty(); }
448template <
class T,
class U>
451{
return !(lhs==rhs); }
456{
return !(lhs==
nullptr); }
461{
return !(
nullptr==rhs); }
465template <
class T,
class U>
473{
return nullptr < lhs; }
479{
return rhs <
nullptr; }
484template <
class T,
class U>
487{
return !(lhs < rhs); }
492{
return !(lhs <
nullptr); }
498{
return !(
nullptr < rhs); }
504template <
class T,
class U>
507{
return !(rhs < lhs); }
513{
return !(
nullptr < lhs); }
519{
return !(rhs <
nullptr); }
#define SimTK_ERRCHK(cond, whereChecked, msg)
Definition ExceptionMacros.h:324
Mandatory first inclusion for any Simbody source or header file.
Smart pointer with deep copy semantics but with the copying delayed until an attempt is made to write...
Definition CloneOnWritePtr.h:59
CloneOnWritePtr & operator=(CloneOnWritePtr< U > &&src) noexcept
Move assignment from a compatible CloneOnWritePtr.
Definition CloneOnWritePtr.h:163
CloneOnWritePtr & operator=(const T &x)
This form of assignment replaces the currently-held object by a heap-allocated copy of the source obj...
Definition CloneOnWritePtr.h:174
bool operator<=(const CloneOnWritePtr< T > &lhs, std::nullptr_t)
nullptr less-or-equal test defined as !(nullptr < lhs) (note reversed arguments).
Definition CloneOnWritePtr.h:512
T & updRef()
Clone if necessary to ensure the contained object is not shared, then return a writable reference to ...
Definition CloneOnWritePtr.h:222
CloneOnWritePtr & operator=(const CloneOnWritePtr< U > &src) noexcept
Copy assignment from a compatible CloneOnWritePtr.
Definition CloneOnWritePtr.h:142
T * upd()
Clone if necessary to ensure the contained object is not shared, then return a writable pointer to th...
Definition CloneOnWritePtr.h:208
CloneOnWritePtr(const T *x)
Given a pointer to a read-only object, create a new heap-allocated copy of that object via its clone(...
Definition CloneOnWritePtr.h:89
bool operator!=(const CloneOnWritePtr< T > &lhs, std::nullptr_t)
nullptr inequality test defined as !(lhs==nullptr).
Definition CloneOnWritePtr.h:455
CloneOnWritePtr(T *x)
Given a pointer to a writable heap-allocated object, take over ownership of that object.
Definition CloneOnWritePtr.h:81
bool operator>=(const CloneOnWritePtr< T > &lhs, std::nullptr_t)
nullptr greater-or-equal test defined as !(lhs < nullptr).
Definition CloneOnWritePtr.h:491
bool operator>=(const CloneOnWritePtr< T > &lhs, const CloneOnWritePtr< U > &rhs)
Pointer greater-or-equal test defined as !(lhs < rhs).
Definition CloneOnWritePtr.h:485
T * release()
(Advanced) Remove the contained object from management by this container and transfer ownership to th...
Definition CloneOnWritePtr.h:314
bool operator>(std::nullptr_t, const CloneOnWritePtr< T > &rhs)
nullptr greater-than test defined as rhs < nullptr.
Definition CloneOnWritePtr.h:478
CloneOnWritePtr(CloneOnWritePtr &&src) noexcept
Move constructor is very fast and leaves the source empty.
Definition CloneOnWritePtr.h:114
CloneOnWritePtr(const CloneOnWritePtr< U > &src) noexcept
Copy construction from a compatible CloneOnWritePtr.
Definition CloneOnWritePtr.h:108
CloneOnWritePtr() noexcept
Default constructor stores a nullptr and sets use count to zero.
Definition CloneOnWritePtr.h:71
bool empty() const noexcept
Return true if this container is empty, which is the state the container is in immediately after defa...
Definition CloneOnWritePtr.h:301
bool operator>=(std::nullptr_t, const CloneOnWritePtr< T > &rhs)
nullptr greater-or-equal test defined as !(nullptr < rhs).
Definition CloneOnWritePtr.h:497
CloneOnWritePtr & operator=(const CloneOnWritePtr &src) noexcept
Copy assignment replaces the currently-held object by a deferred copy of the object held in the sourc...
Definition CloneOnWritePtr.h:133
const T & getRef() const
Return a const reference to the contained object.
Definition CloneOnWritePtr.h:213
bool operator==(std::nullptr_t, const CloneOnWritePtr< T > &rhs)
Comparison against nullptr; same as rhs.empty().
Definition CloneOnWritePtr.h:413
const T & operator*() const
This "dereference" operator returns a const reference to the contained object.
Definition CloneOnWritePtr.h:246
CloneOnWritePtr(const CloneOnWritePtr &src) noexcept
Copy constructor is deep but deferred so very fast here; the new CloneOnWritePtr object initially sha...
Definition CloneOnWritePtr.h:102
bool operator<=(std::nullptr_t, const CloneOnWritePtr< T > &rhs)
nullptr less-or-equal test defined as !(rhs < nullptr) (note reversed arguments).
Definition CloneOnWritePtr.h:518
CloneOnWritePtr & operator=(CloneOnWritePtr &&src) noexcept
Move assignment replaces the currently-held object by the source object, leaving the source empty.
Definition CloneOnWritePtr.h:154
bool operator==(const CloneOnWritePtr< T > &lhs, std::nullptr_t)
Comparison against nullptr; same as lhs.empty().
Definition CloneOnWritePtr.h:407
CloneOnWritePtr(CloneOnWritePtr< U > &&src) noexcept
Move construction from a compatible CloneOnWritePtr.
Definition CloneOnWritePtr.h:120
~CloneOnWritePtr() noexcept
Destructor decrements the reference count and deletes the object if the count goes to zero.
Definition CloneOnWritePtr.h:189
void swap(CloneOnWritePtr &other) noexcept
Swap the contents of this CloneOnWritePtr with another one, with ownership changing hands but no copy...
Definition CloneOnWritePtr.h:282
bool operator<=(const CloneOnWritePtr< T > &lhs, const CloneOnWritePtr< U > &rhs)
Pointer less-or-equal test defined as !(rhs < lhs) (note reversed arguments).
Definition CloneOnWritePtr.h:505
void reset() noexcept
Make this container empty, decrementing the use count of the contained object (if any),...
Definition CloneOnWritePtr.h:260
T & reference
Type of a reference to the contained object.
Definition CloneOnWritePtr.h:63
CloneOnWritePtr(std::nullptr_t) noexcept
Constructor from nullptr is the same as the default constructor.
Definition CloneOnWritePtr.h:76
long use_count() const noexcept
Return count of how many CloneOnWritePtr objects are currently sharing the referenced object.
Definition CloneOnWritePtr.h:291
void detach()
(Advanced) Force the contained object to be unique, that is, not shared with any other container.
Definition CloneOnWritePtr.h:329
bool operator<(const CloneOnWritePtr< T > &lhs, std::nullptr_t)
Less-than comparison against a nullptr.
Definition CloneOnWritePtr.h:432
bool operator!=(std::nullptr_t, const CloneOnWritePtr< T > &rhs)
nullptr inequality test defined as !(nullptr==rhs).
Definition CloneOnWritePtr.h:460
bool operator<(const CloneOnWritePtr< T > &lhs, const CloneOnWritePtr< U > &rhs)
Less-than operator for two compatible CloneOnWritePtr containers, comparing the pointers,...
Definition CloneOnWritePtr.h:423
bool operator<(std::nullptr_t, const CloneOnWritePtr< T > &rhs)
Less-than comparison of a nullptr against this container.
Definition CloneOnWritePtr.h:440
const T * get() const noexcept
Return a const pointer to the contained object if any, or nullptr.
Definition CloneOnWritePtr.h:200
CloneOnWritePtr(const T &x)
Given a read-only reference to an object, create a new heap-allocated copy of that object via its clo...
Definition CloneOnWritePtr.h:95
bool operator==(const CloneOnWritePtr< T > &lhs, const CloneOnWritePtr< U > &rhs)
Compare for equality the managed pointers contained in two compatible CloneOnWritePtr containers.
Definition CloneOnWritePtr.h:400
bool operator!=(const CloneOnWritePtr< T > &lhs, const CloneOnWritePtr< U > &rhs)
Pointer inequality test defined as !(lhs==rhs).
Definition CloneOnWritePtr.h:449
T & operator*()
Clone if necessary, then return a writable reference to the contained object.
Definition CloneOnWritePtr.h:250
bool unique() const noexcept
Is this the only user of the referenced object? Note that this means there is exactly one; if the man...
Definition CloneOnWritePtr.h:296
const T * operator->() const
Dereference a const pointer to the contained object.
Definition CloneOnWritePtr.h:234
T * pointer
Type of a pointer to the contained object.
Definition CloneOnWritePtr.h:62
T * operator->()
Clone if necessary, then dereference a writable pointer to the contained object.
Definition CloneOnWritePtr.h:238
void reset(T *x)
Replace the contents of this container with the supplied heap-allocated object, taking over ownership...
Definition CloneOnWritePtr.h:271
T element_type
Type of the contained object.
Definition CloneOnWritePtr.h:61
bool operator>(const CloneOnWritePtr< T > &lhs, const CloneOnWritePtr< U > &rhs)
Pointer greater-than test defined as rhs < lhs.
Definition CloneOnWritePtr.h:466
CloneOnWritePtr & operator=(T *x) noexcept
This form of assignment replaces the currently-held object by the given source object and takes over ...
Definition CloneOnWritePtr.h:181
bool operator>(const CloneOnWritePtr< T > &lhs, std::nullptr_t)
nullptr greater-than test defined as nullptr < lhs.
Definition CloneOnWritePtr.h:472
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with o...
Definition Assembler.h:37
std::ostream & operator<<(std::ostream &o, const ContactForce &f)
Definition CompliantContactSubsystem.h:387