142 lines
4.1 KiB
C++
142 lines
4.1 KiB
C++
// Copyright (C) 2003 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#undef DLIB_REFERENCE_COUNTER_KERNEl_ABSTRACT_
|
|
#ifdef DLIB_REFERENCE_COUNTER_KERNEl_ABSTRACT_
|
|
|
|
#include "../algs.h"
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
template <
|
|
typename T,
|
|
typename copy = copy_functor<T>
|
|
>
|
|
class reference_counter
|
|
{
|
|
|
|
/*!
|
|
REQUIREMENTS ON T
|
|
T must have a default constructor
|
|
|
|
REQUIREMENTS ON copy
|
|
it should be a function object that copies an object of type T. and
|
|
it must have a default constructor and
|
|
operator() should be overloaded as
|
|
void operator()(const T& source, T& destination);
|
|
copy may throw any exception
|
|
|
|
POINTERS AND REFERENCES TO INTERNAL DATA
|
|
swap() and access() functions do not invalidate pointers or
|
|
references to internal data.
|
|
All other functions have no such guarantee
|
|
|
|
|
|
INITIAL VALUE
|
|
reference_counter contains one object of type T and
|
|
this object of type T has its initial value
|
|
|
|
WHAT THIS OBJECT REPRESENTS
|
|
This object represents a container for an object of type T and
|
|
provides reference counting capabilities for the object it contains
|
|
|
|
Also note that unless specified otherwise, no member functions
|
|
of this object throw exceptions.
|
|
|
|
!*/
|
|
|
|
public:
|
|
|
|
typedef T type;
|
|
|
|
reference_counter (
|
|
);
|
|
/*!
|
|
ensures
|
|
- #*this is properly initialized
|
|
throws
|
|
- std::bad_alloc or any exception thrown by T's constructor
|
|
!*/
|
|
|
|
reference_counter (
|
|
const reference_counter& item
|
|
);
|
|
/*!
|
|
ensures
|
|
- #access() == item.access()
|
|
!*/
|
|
|
|
virtual ~reference_counter (
|
|
);
|
|
/*!
|
|
ensures
|
|
- all memory associated with *this has been released
|
|
!*/
|
|
|
|
void clear (
|
|
);
|
|
/*!
|
|
ensures
|
|
- #*this has its initial value
|
|
throws
|
|
- std::bad_alloc or any exception thrown by T's constructor
|
|
if this exception is thrown then *this is unusable
|
|
until clear() is called and succeeds
|
|
!*/
|
|
|
|
T& modify (
|
|
);
|
|
/*!
|
|
ensures
|
|
- returns a non-const reference to the item contained in *this
|
|
- the item is ok to modify. i.e. there are no other references to it
|
|
throws
|
|
- std::bad_alloc or any exception thrown by T's constructor
|
|
modify() may throw this exception if there are other references
|
|
to the item and there is not enough memory to copy it. If modify()
|
|
throws then it has no effect.
|
|
!*/
|
|
|
|
const T& access (
|
|
) const;
|
|
/*!
|
|
ensures
|
|
- returns a const reference to the item contained in *this
|
|
- there may be other references to to the item
|
|
!*/
|
|
|
|
reference_counter& operator= (
|
|
const reference_counter& rhs
|
|
);
|
|
/*!
|
|
ensures
|
|
- #access() == rhs.access()
|
|
!*/
|
|
|
|
void swap (
|
|
reference_counter& item
|
|
);
|
|
/*!
|
|
ensures
|
|
- swaps *this and item
|
|
!*/
|
|
|
|
};
|
|
|
|
template <
|
|
typename T,
|
|
typename copy
|
|
>
|
|
inline void swap (
|
|
reference_counter<T,copy>& a,
|
|
reference_counter<T,copy>& b
|
|
) { a.swap(b); }
|
|
/*!
|
|
provides a global swap function
|
|
!*/
|
|
|
|
}
|
|
|
|
#endif // DLIB_REFERENCE_COUNTER_KERNEl_ABSTRACT_
|
|
|