VirtualBox

source: vbox/trunk/include/iprt/autores.h@ 20975

Last change on this file since 20975 was 13718, checked in by vboxsync, 16 years ago

includes: made them 'build' again.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 6.0 KB
Line 
1/** @file
2 * IPRT - C++ Extensions: resource lifetime management
3 */
4
5/*
6 * Copyright (C) 2008 Sun Microsystems, Inc.
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 *
25 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
26 * Clara, CA 95054 USA or visit http://www.sun.com if you need
27 * additional information or have any questions.
28 */
29
30#ifndef ___iprt_autores_h
31#define ___iprt_autores_h
32
33#include <iprt/types.h>
34#include <iprt/assert.h>
35
36
37/**
38 * A simple class used to prevent copying and assignment.
39 *
40 * Inherit from this class in order to prevent automatic generation
41 * of the copy constructor and assignment operator in your class.
42 */
43class RTCNonCopyable
44{
45protected:
46 RTCNonCopyable() {}
47 ~RTCNonCopyable() {}
48private:
49 RTCNonCopyable(RTCNonCopyable const &);
50 RTCNonCopyable const &operator=(RTCNonCopyable const &);
51};
52
53
54/**
55 * A callable class template which returns the correct value against which an
56 * IPRT type must be compared to see if it is invalid.
57 *
58 * @warning This template *must* be specialised for the types it is to work with.
59 */
60template <class T>
61inline T RTAutoResNil(void)
62{
63 AssertFatalMsgFailed(("Unspecialized template!\n"));
64 return (T)0;
65}
66
67/** Specialisation of RTAutoResNil for RTFILE */
68template <>
69inline RTFILE RTAutoResNil(void)
70{
71 return NIL_RTFILE;
72}
73
74/**
75 * A function template which calls the correct destructor for an IPRT type.
76 *
77 * @warning This template *must* be specialised for the types it is to work with.
78 */
79template <class T>
80inline void RTAutoResDestruct(T aHandle)
81{
82 AssertFatalMsgFailed(("Unspecialized template!\n"));
83 NOREF(aHandle);
84}
85
86/**
87 * An auto pointer-type class for resources which take a C-style destructor
88 * (RTMemFree() or equivalent).
89 *
90 * The idea of this class is to manage resources which the current code is
91 * responsible for freeing. By wrapping the resource in an RTAutoRes, you
92 * ensure that the resource will be freed when you leave the scope in which
93 * the RTAutoRes is defined, unless you explicitly release the resource.
94 *
95 * A typical use case is when a function is allocating a number of resources.
96 * If any single allocation fails then all other resources must be freed. If
97 * all allocations succeed, then the resources should be returned to the
98 * caller. By placing all allocated resources in RTAutoRes containers, you
99 * ensure that they will be freed on failure, and only have to take care of
100 * releasing them when you return them.
101 *
102 * @param T The type of the resource.
103 * @param Destruct The function to be used to free the resource.
104 * This parameter must be supplied if there is no
105 * specialisation of RTAutoDestruct available for @a T.
106 * @param NilRes The function returning the NIL value for T. Required.
107 * This parameter must be supplied if there is no
108 * specialisation of RTAutoResNil available for @a T.
109 *
110 * @note The class can not be initialised directly using assignment, due
111 * to the lack of a copy constructor. This is intentional.
112 */
113template <class T, void Destruct(T) = RTAutoResDestruct<T>, T NilRes(void) = RTAutoResNil<T> >
114class RTAutoRes
115 : public RTCNonCopyable
116{
117protected:
118 /** The resource handle. */
119 T m_hRes;
120
121public:
122 /**
123 * Constructor
124 *
125 * @param a_hRes The handle to resource to manage. Defaults to NIL.
126 */
127 RTAutoRes(T a_hRes = NilRes())
128 : m_hRes(a_hRes)
129 {
130 }
131
132 /**
133 * Destructor.
134 *
135 * This destroys any resource currently managed by the object.
136 */
137 ~RTAutoRes()
138 {
139 if (m_hRes != NilRes())
140 Destruct(m_hRes);
141 }
142
143 /**
144 * Assignment from a value.
145 *
146 * This destroys any resource currently managed by the object
147 * before taking on the new one.
148 *
149 * @param a_hRes The handle to the new resource.
150 */
151 RTAutoRes &operator=(T a_hRes)
152 {
153 if (m_hRes != NilRes())
154 Destruct(m_hRes);
155 m_hRes = a_hRes;
156 return *this;
157 }
158
159 /**
160 * Checks if the resource handle is NIL or not.
161 */
162 bool operator!()
163 {
164 return m_hRes == NilRes();
165 }
166
167 /**
168 * Give up ownership the current resource, handing it to the caller.
169 *
170 * @returns The current resource handle.
171 *
172 * @note Nothing happens to the resource when the object goes out of scope.
173 */
174 T release(void)
175 {
176 T Tmp = m_hRes;
177 m_hRes = NilRes();
178 return Tmp;
179 }
180
181 /**
182 * Deletes the current resources.
183 *
184 * @param a_hRes Handle to a new resource to manage. Defaults to NIL.
185 */
186 void reset(T a_hRes = NilRes())
187 {
188 if (a_hRes != m_hRes)
189 {
190 if (m_hRes != NilRes())
191 Destruct(m_hRes);
192 m_hRes = a_hRes;
193 }
194 }
195
196 /**
197 * Get the raw resource handle.
198 *
199 * Typically used passing the handle to some IPRT function while
200 * the object remains in scope.
201 *
202 * @returns The raw resource handle.
203 */
204 T get(void)
205 {
206 return m_hRes;
207 }
208};
209
210
211/* include after template definition */
212#include <iprt/mem.h>
213
214#endif
215
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette