/* * Copyright (c) 2002 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * The contents of this file constitute Original Code as defined in and * are subject to the Apple Public Source License Version 1.1 (the * "License"). You may not use this file except in compliance with the * License. Please obtain a copy of the License at * http://www.apple.com/publicsource and read it before using this file. * * This Original Code and all software distributed under the License are * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the * License for the specific language governing rights and limitations * under the License. * * @APPLE_LICENSE_HEADER_END@ */ #ifndef CRYPTOPP_SMARTPTR_H #define CRYPTOPP_SMARTPTR_H #include "cryptopp_config.h" #include NAMESPACE_BEGIN(CryptoPP) template class member_ptr { public: explicit member_ptr(T *p = NULL) : m_p(p) {} ~member_ptr(); const T& operator*() const { return *m_p; } T& operator*() { return *m_p; } const T* operator->() const { return m_p; } T* operator->() { return m_p; } const T* get() const { return m_p; } T* get() { return m_p; } T* release() { T *old_p = m_p; m_p = 0; return old_p; } void reset(T *p = 0); protected: member_ptr(const member_ptr& rhs); // copy not allowed void operator=(const member_ptr& rhs); // assignment not allowed T *m_p; }; template member_ptr::~member_ptr() {delete m_p;} template void member_ptr::reset(T *p) {delete m_p; m_p = p;} // ******************************************************** template class value_ptr : public member_ptr { public: value_ptr(const T &obj) : member_ptr(new T(obj)) {} value_ptr(T *p = NULL) : member_ptr(p) {} value_ptr(const value_ptr& rhs) : member_ptr(rhs.m_p ? new T(*rhs.m_p) : NULL) {} value_ptr& operator=(const value_ptr& rhs); bool operator==(const value_ptr& rhs) { return (!m_p && !rhs.m_p) || (m_p && rhs.m_p && *m_p == *rhs.m_p); } }; template value_ptr& value_ptr::operator=(const value_ptr& rhs) { T *old_p = m_p; m_p = rhs.m_p ? new T(*rhs.m_p) : NULL; delete old_p; return *this; } // ******************************************************** template class clonable_ptr : public member_ptr { public: clonable_ptr(const T &obj) : member_ptr(obj.Clone()) {} clonable_ptr(T *p = NULL) : member_ptr(p) {} clonable_ptr(const clonable_ptr& rhs) : member_ptr(rhs.m_p ? rhs.m_p->Clone() : NULL) {} clonable_ptr& operator=(const clonable_ptr& rhs); }; template clonable_ptr& clonable_ptr::operator=(const clonable_ptr& rhs) { T *old_p = m_p; m_p = rhs.m_p ? rhs.m_p->Clone() : NULL; delete old_p; return *this; } // ******************************************************** template class counted_ptr { public: explicit counted_ptr(T *p = 0); counted_ptr(const counted_ptr& rhs); ~counted_ptr(); const T& operator*() const { return *m_p; } T& operator*() { return *m_p; } const T* operator->() const { return m_p; } T* operator->() { return m_p; } const T* get() const { return m_p; } T* get() { return m_p; } counted_ptr & operator=(const counted_ptr& rhs); private: T *m_p; }; template counted_ptr::counted_ptr(T *p) : m_p(p) { if (m_p) m_p->m_referenceCount = 1; } template counted_ptr::counted_ptr(const counted_ptr& rhs) : m_p(rhs.m_p) { if (m_p) m_p->m_referenceCount++; } template counted_ptr::~counted_ptr() { if (m_p && --m_p->m_referenceCount == 0) delete m_p; } template counted_ptr & counted_ptr::operator=(const counted_ptr& rhs) { if (m_p && --m_p->m_referenceCount == 0) delete m_p; m_p = rhs.m_p; if (m_p) m_p->m_referenceCount++; return *this; } // ******************************************************** template class vector_member_ptrs { public: vector_member_ptrs(unsigned int size=0) : _size(size) {ptr = new member_ptr[_size];} ~vector_member_ptrs() {delete [] ptr;} member_ptr& operator[](unsigned int index) {assert(index<_size); return ptr[index];} const member_ptr& operator[](unsigned int index) const {assert(index<_size); return ptr[index];} unsigned int size() const {return _size;} void resize(unsigned int newSize) { member_ptr *newPtr = new member_ptr[newSize]; for (unsigned int i=0; i &c); // copy not allowed void operator=(const vector_member_ptrs &x); // assignment not allowed unsigned int _size; member_ptr *ptr; }; // ******************************************************** // derive from this class for a temporary variable // that can be used during base/member initialization template class ConstructorTemp { protected: ConstructorTemp(const ConstructorTemp ©) : m_temp(NULL) {} ConstructorTemp(T *t = NULL) : m_temp(t) {} ConstructorTemp(const T &t) : m_temp(new T(t)) {} member_ptr m_temp; }; NAMESPACE_END #endif