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