OW_ReferenceBase.hpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002  * Copyright (C) 2003-2004 Vintela, Inc. All rights reserved.
00003  *
00004  * Redistribution and use in source and binary forms, with or without
00005  * modification, are permitted provided that the following conditions are met:
00006  *
00007  *  - Redistributions of source code must retain the above copyright notice,
00008  *    this list of conditions and the following disclaimer.
00009  *
00010  *  - Redistributions in binary form must reproduce the above copyright notice,
00011  *    this list of conditions and the following disclaimer in the documentation
00012  *    and/or other materials provided with the distribution.
00013  *
00014  *  - Neither the name of Vintela, Inc. nor the names of its
00015  *    contributors may be used to endorse or promote products derived from this
00016  *    software without specific prior written permission.
00017  *
00018  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
00019  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021  * ARE DISCLAIMED. IN NO EVENT SHALL Vintela, Inc. OR THE CONTRIBUTORS
00022  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00023  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00024  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00025  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00026  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00027  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00028  * POSSIBILITY OF SUCH DAMAGE.
00029  *******************************************************************************/
00030 
00035 #ifndef OW_REFERENCE_BASE_HPP_INCLUDE_GUARD_
00036 #define OW_REFERENCE_BASE_HPP_INCLUDE_GUARD_
00037 #include "OW_config.h"
00038 #include "OW_RefCount.hpp"
00039 
00040 // The classes and functions defined in this file are not meant for general
00041 // use, they are internal implementation details.  They may change at any time.
00042 
00043 namespace OW_NAMESPACE
00044 {
00045 
00047 template<class T>
00048 inline void RefSwap(T& x, T&y)
00049 {
00050    T t = x;
00051    x = y;
00052    y = t;
00053 }
00055 // This class contains the non-templated code for Reference, to help 
00056 // minimize code bloat.
00057 class OW_COMMON_API ReferenceBase
00058 {
00059 #if !defined(__GNUC__) || __GNUC__ > 2 // because of a gcc 2.95 ICE
00060 protected:
00061 #else
00062 public:
00063 #endif
00064    ReferenceBase()
00065       : m_pRefCount(new RefCount) {}
00066    ReferenceBase(const ReferenceBase& arg)
00067       : m_pRefCount(0)
00068    {
00069       m_pRefCount = arg.m_pRefCount;
00070       m_pRefCount->inc();
00071    }
00072    void incRef()
00073    {
00074       m_pRefCount->inc();
00075    }
00076    
00077    bool decRef()
00078    {
00079       if (m_pRefCount->decAndTest())
00080       {
00081          delete m_pRefCount;
00082          return true;
00083       }
00084       return false;
00085    }
00086    void swap(ReferenceBase& arg)
00087    {
00088       RefSwap(m_pRefCount, arg.m_pRefCount);
00089    }
00090    void useRefCountOf(const ReferenceBase& arg)
00091    {
00092       decRef();
00093       m_pRefCount = arg.m_pRefCount;
00094       incRef();
00095    }
00096    
00097 #ifdef OW_CHECK_NULL_REFERENCES
00098    static void throwNULLException();
00099    static void checkNull(const void *p)
00100    {
00101       if (p == 0)
00102       {
00103          throwNULLException();
00104       }
00105    }
00106 #endif
00107 
00108 #if !defined(__GNUC__) || __GNUC__ > 2 // because of a gcc 2.95 ICE
00109 protected:
00110 #else
00111 public:
00112 #endif
00113    RefCount* volatile m_pRefCount;
00114 };
00115 
00116 } // end namespace OW_NAMESPACE
00117 
00118 #endif
00119 

Generated on Thu Feb 9 08:48:10 2006 for openwbem by  doxygen 1.4.6