// 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_