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