1258191Sjmmv// Copyright (c) 2007 The NetBSD Foundation, Inc. 2258191Sjmmv// All rights reserved. 3258191Sjmmv// 4258191Sjmmv// Redistribution and use in source and binary forms, with or without 5258191Sjmmv// modification, are permitted provided that the following conditions 6258191Sjmmv// are met: 7258191Sjmmv// 1. Redistributions of source code must retain the above copyright 8258191Sjmmv// notice, this list of conditions and the following disclaimer. 9258191Sjmmv// 2. Redistributions in binary form must reproduce the above copyright 10258191Sjmmv// notice, this list of conditions and the following disclaimer in the 11258191Sjmmv// documentation and/or other materials provided with the distribution. 12258191Sjmmv// 13258191Sjmmv// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 14258191Sjmmv// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 15258191Sjmmv// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 16258191Sjmmv// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17258191Sjmmv// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 18258191Sjmmv// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19258191Sjmmv// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 20258191Sjmmv// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 21258191Sjmmv// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 22258191Sjmmv// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23258191Sjmmv// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 24258191Sjmmv// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25258191Sjmmv 26275988Sngie#if !defined(ATF_CXX_DETAIL_AUTO_ARRAY_HPP) 27275988Sngie#define ATF_CXX_DETAIL_AUTO_ARRAY_HPP 28258191Sjmmv 29258191Sjmmv#include <cstddef> 30258191Sjmmv 31258191Sjmmvnamespace atf { 32258191Sjmmv 33258191Sjmmv// ------------------------------------------------------------------------ 34258191Sjmmv// The "auto_array" class. 35258191Sjmmv// ------------------------------------------------------------------------ 36258191Sjmmv 37258191Sjmmvtemplate< class T > 38258191Sjmmvstruct auto_array_ref { 39258191Sjmmv T* m_ptr; 40258191Sjmmv 41258191Sjmmv explicit auto_array_ref(T*); 42258191Sjmmv}; 43258191Sjmmv 44258191Sjmmvtemplate< class T > 45258191Sjmmvauto_array_ref< T >::auto_array_ref(T* ptr) : 46258191Sjmmv m_ptr(ptr) 47258191Sjmmv{ 48258191Sjmmv} 49258191Sjmmv 50258191Sjmmvtemplate< class T > 51258191Sjmmvclass auto_array { 52258191Sjmmv T* m_ptr; 53258191Sjmmv 54258191Sjmmvpublic: 55258191Sjmmv auto_array(T* = NULL) throw(); 56258191Sjmmv auto_array(auto_array< T >&) throw(); 57258191Sjmmv auto_array(auto_array_ref< T >) throw(); 58258191Sjmmv ~auto_array(void) throw(); 59258191Sjmmv 60258191Sjmmv T* get(void) throw(); 61258191Sjmmv const T* get(void) const throw(); 62258191Sjmmv T* release(void) throw(); 63258191Sjmmv void reset(T* = NULL) throw(); 64258191Sjmmv 65258191Sjmmv auto_array< T >& operator=(auto_array< T >&) throw(); 66258191Sjmmv auto_array< T >& operator=(auto_array_ref< T >) throw(); 67258191Sjmmv 68258191Sjmmv T& operator[](int) throw(); 69258191Sjmmv operator auto_array_ref< T >(void) throw(); 70258191Sjmmv}; 71258191Sjmmv 72258191Sjmmvtemplate< class T > 73258191Sjmmvauto_array< T >::auto_array(T* ptr) 74258191Sjmmv throw() : 75258191Sjmmv m_ptr(ptr) 76258191Sjmmv{ 77258191Sjmmv} 78258191Sjmmv 79258191Sjmmvtemplate< class T > 80258191Sjmmvauto_array< T >::auto_array(auto_array< T >& ptr) 81258191Sjmmv throw() : 82258191Sjmmv m_ptr(ptr.release()) 83258191Sjmmv{ 84258191Sjmmv} 85258191Sjmmv 86258191Sjmmvtemplate< class T > 87258191Sjmmvauto_array< T >::auto_array(auto_array_ref< T > ref) 88258191Sjmmv throw() : 89258191Sjmmv m_ptr(ref.m_ptr) 90258191Sjmmv{ 91258191Sjmmv} 92258191Sjmmv 93258191Sjmmvtemplate< class T > 94258191Sjmmvauto_array< T >::~auto_array(void) 95258191Sjmmv throw() 96258191Sjmmv{ 97258191Sjmmv if (m_ptr != NULL) 98258191Sjmmv delete [] m_ptr; 99258191Sjmmv} 100258191Sjmmv 101258191Sjmmvtemplate< class T > 102258191SjmmvT* 103258191Sjmmvauto_array< T >::get(void) 104258191Sjmmv throw() 105258191Sjmmv{ 106258191Sjmmv return m_ptr; 107258191Sjmmv} 108258191Sjmmv 109258191Sjmmvtemplate< class T > 110258191Sjmmvconst T* 111258191Sjmmvauto_array< T >::get(void) 112258191Sjmmv const throw() 113258191Sjmmv{ 114258191Sjmmv return m_ptr; 115258191Sjmmv} 116258191Sjmmv 117258191Sjmmvtemplate< class T > 118258191SjmmvT* 119258191Sjmmvauto_array< T >::release(void) 120258191Sjmmv throw() 121258191Sjmmv{ 122258191Sjmmv T* ptr = m_ptr; 123258191Sjmmv m_ptr = NULL; 124258191Sjmmv return ptr; 125258191Sjmmv} 126258191Sjmmv 127258191Sjmmvtemplate< class T > 128258191Sjmmvvoid 129258191Sjmmvauto_array< T >::reset(T* ptr) 130258191Sjmmv throw() 131258191Sjmmv{ 132258191Sjmmv if (m_ptr != NULL) 133258191Sjmmv delete [] m_ptr; 134258191Sjmmv m_ptr = ptr; 135258191Sjmmv} 136258191Sjmmv 137258191Sjmmvtemplate< class T > 138258191Sjmmvauto_array< T >& 139258191Sjmmvauto_array< T >::operator=(auto_array< T >& ptr) 140258191Sjmmv throw() 141258191Sjmmv{ 142258191Sjmmv reset(ptr.release()); 143258191Sjmmv return *this; 144258191Sjmmv} 145258191Sjmmv 146258191Sjmmvtemplate< class T > 147258191Sjmmvauto_array< T >& 148258191Sjmmvauto_array< T >::operator=(auto_array_ref< T > ref) 149258191Sjmmv throw() 150258191Sjmmv{ 151258191Sjmmv if (m_ptr != ref.m_ptr) { 152258191Sjmmv delete [] m_ptr; 153258191Sjmmv m_ptr = ref.m_ptr; 154258191Sjmmv } 155258191Sjmmv return *this; 156258191Sjmmv} 157258191Sjmmv 158258191Sjmmvtemplate< class T > 159258191SjmmvT& 160258191Sjmmvauto_array< T >::operator[](int pos) 161258191Sjmmv throw() 162258191Sjmmv{ 163258191Sjmmv return m_ptr[pos]; 164258191Sjmmv} 165258191Sjmmv 166258191Sjmmvtemplate< class T > 167258191Sjmmvauto_array< T >::operator auto_array_ref< T >(void) 168258191Sjmmv throw() 169258191Sjmmv{ 170258191Sjmmv return auto_array_ref< T >(release()); 171258191Sjmmv} 172258191Sjmmv 173258191Sjmmv} // namespace atf 174258191Sjmmv 175275988Sngie#endif // !defined(ATF_CXX_DETAIL_AUTO_ARRAY_HPP) 176