VirtualBox

source: vbox/trunk/include/iprt/cpp/autores.h@ 30254

Last change on this file since 30254 was 28800, checked in by vboxsync, 15 years ago

Automated rebranding to Oracle copyright/license strings via filemuncher

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 5.8 KB
Line 
1/** @file
2 * IPRT - C++ Extensions: resource lifetime management
3 */
4
5/*
6 * Copyright (C) 2008 Oracle Corporation
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
26#ifndef ___iprt_autores_h
27#define ___iprt_autores_h
28
29#include <iprt/types.h>
30#include <iprt/assert.h>
31
32
33/**
34 * A simple class used to prevent copying and assignment.
35 *
36 * Inherit from this class in order to prevent automatic generation
37 * of the copy constructor and assignment operator in your class.
38 */
39class RTCNonCopyable
40{
41protected:
42 RTCNonCopyable() {}
43 ~RTCNonCopyable() {}
44private:
45 RTCNonCopyable(RTCNonCopyable const &);
46 RTCNonCopyable const &operator=(RTCNonCopyable const &);
47};
48
49
50/**
51 * A callable class template which returns the correct value against which an
52 * IPRT type must be compared to see if it is invalid.
53 *
54 * @warning This template *must* be specialised for the types it is to work with.
55 */
56template <class T>
57inline T RTAutoResNil(void)
58{
59 AssertFatalMsgFailed(("Unspecialized template!\n"));
60 return (T)0;
61}
62
63/** Specialisation of RTAutoResNil for RTFILE */
64template <>
65inline RTFILE RTAutoResNil(void)
66{
67 return NIL_RTFILE;
68}
69
70/**
71 * A function template which calls the correct destructor for an IPRT type.
72 *
73 * @warning This template *must* be specialised for the types it is to work with.
74 */
75template <class T>
76inline void RTAutoResDestruct(T aHandle)
77{
78 AssertFatalMsgFailed(("Unspecialized template!\n"));
79 NOREF(aHandle);
80}
81
82/**
83 * An auto pointer-type class for resources which take a C-style destructor
84 * (RTMemFree() or equivalent).
85 *
86 * The idea of this class is to manage resources which the current code is
87 * responsible for freeing. By wrapping the resource in an RTAutoRes, you
88 * ensure that the resource will be freed when you leave the scope in which
89 * the RTAutoRes is defined, unless you explicitly release the resource.
90 *
91 * A typical use case is when a function is allocating a number of resources.
92 * If any single allocation fails then all other resources must be freed. If
93 * all allocations succeed, then the resources should be returned to the
94 * caller. By placing all allocated resources in RTAutoRes containers, you
95 * ensure that they will be freed on failure, and only have to take care of
96 * releasing them when you return them.
97 *
98 * @param T The type of the resource.
99 * @param Destruct The function to be used to free the resource.
100 * This parameter must be supplied if there is no
101 * specialisation of RTAutoDestruct available for @a T.
102 * @param NilRes The function returning the NIL value for T. Required.
103 * This parameter must be supplied if there is no
104 * specialisation of RTAutoResNil available for @a T.
105 *
106 * @note The class can not be initialised directly using assignment, due
107 * to the lack of a copy constructor. This is intentional.
108 */
109template <class T, void Destruct(T) = RTAutoResDestruct<T>, T NilRes(void) = RTAutoResNil<T> >
110class RTAutoRes
111 : public RTCNonCopyable
112{
113protected:
114 /** The resource handle. */
115 T m_hRes;
116
117public:
118 /**
119 * Constructor
120 *
121 * @param a_hRes The handle to resource to manage. Defaults to NIL.
122 */
123 RTAutoRes(T a_hRes = NilRes())
124 : m_hRes(a_hRes)
125 {
126 }
127
128 /**
129 * Destructor.
130 *
131 * This destroys any resource currently managed by the object.
132 */
133 ~RTAutoRes()
134 {
135 if (m_hRes != NilRes())
136 Destruct(m_hRes);
137 }
138
139 /**
140 * Assignment from a value.
141 *
142 * This destroys any resource currently managed by the object
143 * before taking on the new one.
144 *
145 * @param a_hRes The handle to the new resource.
146 */
147 RTAutoRes &operator=(T a_hRes)
148 {
149 if (m_hRes != NilRes())
150 Destruct(m_hRes);
151 m_hRes = a_hRes;
152 return *this;
153 }
154
155 /**
156 * Checks if the resource handle is NIL or not.
157 */
158 bool operator!()
159 {
160 return m_hRes == NilRes();
161 }
162
163 /**
164 * Give up ownership the current resource, handing it to the caller.
165 *
166 * @returns The current resource handle.
167 *
168 * @note Nothing happens to the resource when the object goes out of scope.
169 */
170 T release(void)
171 {
172 T Tmp = m_hRes;
173 m_hRes = NilRes();
174 return Tmp;
175 }
176
177 /**
178 * Deletes the current resources.
179 *
180 * @param a_hRes Handle to a new resource to manage. Defaults to NIL.
181 */
182 void reset(T a_hRes = NilRes())
183 {
184 if (a_hRes != m_hRes)
185 {
186 if (m_hRes != NilRes())
187 Destruct(m_hRes);
188 m_hRes = a_hRes;
189 }
190 }
191
192 /**
193 * Get the raw resource handle.
194 *
195 * Typically used passing the handle to some IPRT function while
196 * the object remains in scope.
197 *
198 * @returns The raw resource handle.
199 */
200 T get(void)
201 {
202 return m_hRes;
203 }
204};
205
206
207/* include after template definition */
208#include <iprt/mem.h>
209
210#endif
211
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