--- /dev/null
+/*---------------------------------------------------------------------\
+| ____ _ __ __ ___ |
+| |__ / \ / / . \ . \ |
+| / / \ V /| _/ _/ |
+| / /__ | | | | | | |
+| /_____||_| |_| |_| |
+| |
+\---------------------------------------------------------------------*/
+/** \file zypp/base/ProvideNumericId.h
+ *
+*/
+#ifndef ZYPP_BASE_PROVIDENUMERICID_H
+#define ZYPP_BASE_PROVIDENUMERICID_H
+
+///////////////////////////////////////////////////////////////////
+namespace zypp
+{ /////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////
+ namespace base
+ { /////////////////////////////////////////////////////////////////
+
+ ///////////////////////////////////////////////////////////////////
+ //
+ // CLASS NAME : ProvideNumericId
+ //
+ /** Base class for objects providing a numeric Id.
+ * The ctor creates a NumericId from some static counter.
+ *
+ * \code
+ * struct Foo : public base::ProvideNumericId<Foo>
+ * {};
+ * Foo foo;
+ * foo.numericId(); // returns foo's NumericId.
+ * \endcode
+ */
+ template<class _Derived>
+ struct ProvideNumericId
+ {
+ public:
+ typedef unsigned long NumericId;
+
+ /** \return The objects numeric Id. */
+ NumericId numericId() const
+ { return _numericId; }
+
+ protected:
+ /** Default ctor */
+ ProvideNumericId()
+ : _numericId( nextId() )
+ {}
+ /** Copy ctor */
+ ProvideNumericId( const ProvideNumericId & /*rhs*/ )
+ : _numericId( nextId() )
+ {}
+ /** Assign */
+ ProvideNumericId & operator=( const ProvideNumericId & /*rhs*/ )
+ { return *this; }
+ /** Dtor */
+ ~ProvideNumericId()
+ {}
+ private:
+ /** */
+ static NumericId nextId()
+ {
+ static NumericId _staticCounter = 0;
+ return ++_staticCounter;
+ }
+ /** */
+ const NumericId _numericId;
+ };
+ ///////////////////////////////////////////////////////////////////
+
+ /////////////////////////////////////////////////////////////////
+ } // namespace base
+ ///////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////
+} // namespace zypp
+///////////////////////////////////////////////////////////////////
+#endif // ZYPP_BASE_PROVIDENUMERICID_H
{
typedef shared_ptr<_D> _Ptr;
typedef shared_ptr<const _D> _constPtr;
- /** Check whether pointer is shared. */
- bool isShared( const _constPtr & ptr_r )
- { return ptr_r.use_count() > 1; }
+ /** Check whether pointer is not shared. */
+ bool unique( const _constPtr & ptr_r )
+ { return ptr_r.unique(); }
+ /** Return number of references. */
+ long use_count( const _constPtr & ptr_r ) const
+ { return ptr_r.use_count(); }
};
template<class _D>
{
typedef intrusive_ptr<_D> _Ptr;
typedef intrusive_ptr<const _D> _constPtr;
- /** Check whether pointer is shared. */
- bool isShared( const _constPtr & ptr_r )
- { return ptr_r && (ptr_r->refCount() > 1); }
+ /** Check whether pointer is not shared. */
+ bool unique( const _constPtr & ptr_r )
+ { return !ptr_r || (ptr_r->refCount() <= 1); }
+ /** Return number of references. */
+ long use_count( const _constPtr & ptr_r ) const
+ { return ptr_r ? ptr_r->refCount() : 0; }
};
}
///////////////////////////////////////////////////////////////////
{ return _dptr.get(); }
public:
- bool unique() const
- { return _dptr.unique(); }
+ bool unique() const
+ { return _Traits().unique( _dptr ); }
- long use_count() const
- { return _dptr.use_count(); }
+ long use_count() const
+ { return _Traits().use_count( _dptr ); }
_constPtr getPtr() const
{ return _dptr; }
{ assertUnshared(); return _dptr.get(); }
public:
+ bool unique() const
+ { return _Traits().unique( _dptr ); }
+
+ long use_count() const
+ { return _Traits().use_count( _dptr ); }
+
_constPtr getPtr() const
{ return _dptr; }
void assertUnshared()
{
- if ( _Traits().isShared( _dptr ) )
- {
- _dptr.reset( rwcowClone( _dptr.get() ) );
- }
+ if ( !unique() )
+ _dptr.reset( rwcowClone( _dptr.get() ) );
}
private: