diff options
Diffstat (limited to 'experimental/tqtinterface/qt4/src/tools/tqdeepcopy.cpp')
-rw-r--r-- | experimental/tqtinterface/qt4/src/tools/tqdeepcopy.cpp | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/experimental/tqtinterface/qt4/src/tools/tqdeepcopy.cpp b/experimental/tqtinterface/qt4/src/tools/tqdeepcopy.cpp new file mode 100644 index 000000000..4a5095e7f --- /dev/null +++ b/experimental/tqtinterface/qt4/src/tools/tqdeepcopy.cpp @@ -0,0 +1,168 @@ +/**************************************************************************** +** +** Implementation of TQDeepCopy class +** +** Created : 20020613 +** +** Copyright (C) 2010 Timothy Pearson and (C) 1992-2008 Trolltech ASA. +** +** This file is part of the kernel module of the TQt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing requirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.TQPL +** included in the packaging of this file. Licensees holding valid TQt +** Commercial licenses may use this file in accordance with the TQt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include "tqdeepcopy.h" + +/*! + \class TQDeepCopy tqdeepcopy.h + \brief The TQDeepCopy class is a template class which ensures that + implicitly shared and explicitly shared classes reference unique + data. + + \reentrant + + \ingroup tools + \ingroup shared + + Normally, shared copies reference the same data to optimize memory + use and for maximum speed. In the example below, \c s1, \c s2, \c + s3, \c s4 and \c s5 share data. + + \code + // all 5 strings share the same data + TQString s1 = "abcd"; + TQString s2 = s1; + TQString s3 = s2; + TQString s4 = s3; + TQString s5 = s2; + \endcode + + TQDeepCopy can be used several ways to ensure that an object + references unique, unshared data. In the example below, \c s1, \c + s2 and \c s5 share data, while neither \c s3 nor \c s4 share data. + \code + // s1, s2 and s5 share the same data, neither s3 nor s4 are shared + TQString s1 = "abcd"; + TQString s2 = s1; + TQDeepCopy<TQString> s3 = s2; // s3 is a deep copy of s2 + TQString s4 = s3; // s4 is a deep copy of s3 + TQString s5 = s2; + \endcode + + In the example below, \c s1, \c s2 and \c s5 share data, and \c s3 + and \c s4 share data. + \code + // s1, s2 and s5 share the same data, s3 and s4 share the same data + TQString s1 = "abcd"; + TQString s2 = s1; + TQString s3 = TQDeepCopy<TQString>( s2 ); // s3 is a deep copy of s2 + TQString s4 = s3; // s4 is a shallow copy of s3 + TQString s5 = s2; + \endcode + + TQDeepCopy can also provide safety in multithreaded applications + that use shared classes. In the example below, the variable \c + global_string is used safely since the data contained in \c + global_string is always a deep copy. This ensures that all threads + get a unique copy of the data, and that any assignments to \c + global_string will result in a deep copy. + + \code + TQDeepCopy<TQString> global_string; // global string data + TQMutex global_mutex; // mutex to protext global_string + + ... + + void setGlobalString( const TQString &str ) + { + global_mutex.lock(); + global_string = str; // global_string is a deep copy of str + global_mutex.unlock(); + } + + ... + + void MyThread::run() + { + global_mutex.lock(); + TQString str = global_string; // str is a deep copy of global_string + global_mutex.unlock(); + + // process the string data + ... + + // update global_string + setGlobalString( str ); + } + \endcode + + \warning It is the application developer's responsibility to + protect the object shared across multiple threads. + + The examples above use TQString, which is an implicitly shared + class. The behavior of TQDeepCopy is the same when using explicitly + shared classes like TQByteArray. + + Currently, TQDeepCopy works with the following classes: + \list + \i TQMemArray (including subclasses like TQByteArray and TQCString) + \i TQMap + \i TQString + \i TQValueList (including subclasses like TQStringList and TQValueStack) + \i TQValueVector + \endlist + + \sa \link threads.html Thread Support in TQt \endlink +*/ + +/*! + \fn TQDeepCopy::TQDeepCopy() + + Constructs an empty instance of type \e T. +*/ + +/*! + \fn TQDeepCopy::TQDeepCopy( const T &t ) + + Constructs a deep copy of \a t. +*/ + +/*! + \fn TQDeepCopy<T>& TQDeepCopy::operator=( const T &t ) + + Assigns a deep copy of \a t. +*/ + +/*! + \fn TQDeepCopy::operator T () + + Returns a deep copy of the encapsulated data. +*/ + |