OW_COWReferenceBase.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_COW_REFERENCE_BASE_HPP_INCLUDE_GUARD_
00036 #define OW_COW_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 COWRefSwap(T& x, T&y)
00049 {
00050    T t = x;
00051    x = y;
00052    y = t;
00053 }
00054 
00056 // This class contains the non-templated code for COWReference, to help 
00057 // minimize code bloat.
00058 class OW_COMMON_API COWReferenceBase
00059 {
00060 protected:
00061    COWReferenceBase()
00062       : m_pRefCount(new RefCount) {}
00063    COWReferenceBase(const COWReferenceBase& arg)
00064       : m_pRefCount(arg.m_pRefCount)
00065    {
00066       m_pRefCount->inc();
00067    }
00068    void incRef()
00069    {
00070       m_pRefCount->inc();
00071    }
00072    
00073    bool decRef()
00074    {
00075       if (m_pRefCount->decAndTest())
00076       {
00077          delete m_pRefCount;
00078          return true;
00079       }
00080       return false;
00081    }
00082 
00083    bool refCountGreaterThanOne() const
00084    {
00085       return m_pRefCount->get() > 1;
00086    }
00087    
00088    // returns true if we're the only copy.
00089    bool getWriteLock()
00090    {
00091       if (m_pRefCount->decAndTest())
00092       {
00093          // only copy--don't need to clone, also not a race condition
00094          incRef();
00095          return true;
00096       }
00097       else
00098       {
00099          // need to become unique
00100          m_pRefCount = new RefCount;
00101          return false;
00102       }
00103    }
00104    
00105    void swap(COWReferenceBase& arg)
00106    {
00107       COWRefSwap(m_pRefCount, arg.m_pRefCount);
00108    }
00109 
00110 #ifdef OW_CHECK_NULL_REFERENCES
00111    static void throwNULLException();
00112    static void checkNull(const void* p)
00113    {
00114       if (p == 0)
00115       {
00116          throwNULLException();
00117       }
00118    }
00119 #endif
00120 
00121     void useRefCountOf(const COWReferenceBase& arg)
00122     {
00123         decRef(); 
00124         m_pRefCount = arg.m_pRefCount; 
00125         incRef(); 
00126     }
00127 
00128 protected:
00129    RefCount* volatile m_pRefCount;
00130 };
00131 
00132 } // end namespace OW_NAMESPACE
00133 
00134 #endif
00135 
00136 

Generated on Thu Feb 9 08:47:57 2006 for openwbem by  doxygen 1.4.6