/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if !defined(XALANAUTOPTR_HEADER_GUARD_1357924680) #define XALANAUTOPTR_HEADER_GUARD_1357924680 // Base include file. Must be first. #include #include namespace XALAN_CPP_NAMESPACE { // We're using our own auto_ptr-like class due to wide // variations amongst the varous platforms we have to // support template class XalanAutoPtr { public: XalanAutoPtr(Type* thePointer = 0) : m_pointer(thePointer) { } XalanAutoPtr(const XalanAutoPtr& theSource) : m_pointer(const_cast&>(theSource).release()) { } XalanAutoPtr& operator=(XalanAutoPtr& theRHS) { if (this != &theRHS) { // This test ought not to be necessary, but // MSVC 6.0 calls delete, which checks for 0. // The problem with that is the locking is // extremely expensive. if (m_pointer != 0) { delete m_pointer; } m_pointer = theRHS.release(); } return *this; } ~XalanAutoPtr() { // See note in operator=() about this... if (m_pointer != 0) { delete m_pointer; } } Type& operator*() const { return *m_pointer; } Type* operator->() const { return m_pointer; } Type* get() const { return m_pointer; } Type* release() { Type* const temp = m_pointer; m_pointer = 0; return temp; } void reset(Type* thePointer = 0) { // See note in operator=() about this... if (m_pointer != 0) { delete m_pointer; } m_pointer = thePointer; } private: Type* m_pointer; }; // A class similar to XalanAutoPtr, but for arrays. template class XalanArrayAutoPtr { public: XalanArrayAutoPtr(Type* thePointer = 0) : m_pointer(thePointer) { } XalanArrayAutoPtr(const XalanArrayAutoPtr& theSource) : m_pointer(((XalanArrayAutoPtr&)theSource).release()) { } XalanArrayAutoPtr& operator=(XalanArrayAutoPtr& theRHS) { if (this != &theRHS) { // This test ought not to be necessary, but // MSVC 6.0 calls delete, which checks for 0. // The problem with that is the locking is // extremely expensive. if (m_pointer != 0) { delete [] m_pointer; } m_pointer = theRHS.release(); } return *this; } ~XalanArrayAutoPtr() { // See note in operator=() about this... if (m_pointer != 0) { delete [] m_pointer; } } Type& operator*() const { return *m_pointer; } Type& operator[](std::size_t index) const { return m_pointer[index]; } Type* get() const { return m_pointer; } Type* release() { Type* const temp = m_pointer; m_pointer = 0; return temp; } void reset(Type* thePointer = 0) { // See note in operator=() about this... if (m_pointer != 0) { delete [] m_pointer; } m_pointer = thePointer; } private: Type* m_pointer; }; } #endif // if !defined(XALANAUTOPTR_HEADER_GUARD_1357924680)