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