00001 /*
00002 * Copyright 1999-2004 The Apache Software Foundation.
00003 *
00004 * Licensed under the Apache License, Version 2.0 (the "License");
00005 * you may not use this file except in compliance with the License.
00006 * You may obtain a copy of the License at
00007 *
00008 * http://www.apache.org/licenses/LICENSE-2.0
00009 *
00010 * Unless required by applicable law or agreed to in writing, software
00011 * distributed under the License is distributed on an "AS IS" BASIS,
00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013 * See the License for the specific language governing permissions and
00014 * limitations under the License.
00015 */
00016
00017 /*
00018 * $Log: SynchronizedStringPool.hpp,v $
00019 * Revision 1.2 2004/09/08 13:56:23 peiyongz
00020 * Apache License Version 2.0
00021 *
00022 * Revision 1.1 2003/10/09 13:51:16 neilg
00023 * implementation of a StringPool implementation that permits thread-safe updates. This can now be used by a grammar pool that is locked so that scanners have somehwere to store information about newly-encountered URIs
00024 *
00025 */
00026
00027 #if !defined(SYNCHRONIZEDSTRINGPOOL_HPP)
00028 #define SYNCHRONIZEDSTRINGPOOL_HPP
00029
00030 #include <xercesc/framework/MemoryManager.hpp>
00031 #include <xercesc/util/StringPool.hpp>
00032 #include <xercesc/util/Mutexes.hpp>
00033
00034 XERCES_CPP_NAMESPACE_BEGIN
00035
00036 //
00037 // This class provides a synchronized string pool implementation.
00038 // This will necessarily be slower than the regular StringPool, so it
00039 // should only be used when updates need to be made in a thread-safe
00040 // way. Updates will be made on datastructures local to this object;
00041 // all queries that don't involve mutation will first be directed at
00042 // the StringPool implementation with which this object is
00043 // constructed.
00044 class XMLSynchronizedStringPool : public XMLStringPool
00045 {
00046 public :
00047 // -----------------------------------------------------------------------
00048 // Constructors and Destructor
00049 // -----------------------------------------------------------------------
00050 XMLSynchronizedStringPool
00051 (
00052 const XMLStringPool * constPool
00053 , const unsigned int modulus = 109
00054 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00055 );
00056 virtual ~XMLSynchronizedStringPool();
00057
00058
00059 // -----------------------------------------------------------------------
00060 // Pool management methods
00061 // -----------------------------------------------------------------------
00062 virtual unsigned int addOrFind(const XMLCh* const newString);
00063 virtual bool exists(const XMLCh* const newString) const;
00064 virtual bool exists(const unsigned int id) const;
00065 virtual void flushAll();
00066 virtual unsigned int getId(const XMLCh* const toFind) const;
00067 virtual const XMLCh* getValueForId(const unsigned int id) const;
00068 virtual unsigned int getStringCount() const;
00069
00070
00071 private :
00072 // -----------------------------------------------------------------------
00073 // Unimplemented constructors and operators
00074 // -----------------------------------------------------------------------
00075 XMLSynchronizedStringPool(const XMLSynchronizedStringPool&);
00076 XMLSynchronizedStringPool& operator=(const XMLSynchronizedStringPool&);
00077
00078
00079 // -----------------------------------------------------------------------
00080 // private data members
00081 // fConstPool
00082 // the pool whose immutability we're protecting
00083 // fMutex
00084 // mutex to permit synchronous updates of our StringPool
00085 const XMLStringPool* fConstPool;
00086 XMLMutex fMutex;
00087 };
00088
00089 XERCES_CPP_NAMESPACE_END
00090
00091 #endif