VirtualBox

root/trunk/include/iprt/autores.h

Revision 13718, 6.0 kB (checked in by vboxsync, 3 weeks ago)

includes: made them 'build' again.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
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  */
43 class RTCNonCopyable
44 {
45 protected:
46     RTCNonCopyable() {}
47     ~RTCNonCopyable() {}
48 private:
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  */
60 template <class T>
61 inline T RTAutoResNil(void)
62 {
63     AssertFatalMsgFailed(("Unspecialized template!\n"));
64     return (T)0;
65 }
66
67 /** Specialisation of RTAutoResNil for RTFILE */
68 template <>
69 inline 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  */
79 template <class T>
80 inline 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  */
113 template <class T, void Destruct(T) = RTAutoResDestruct<T>, T NilRes(void) = RTAutoResNil<T> >
114 class RTAutoRes
115     : public RTCNonCopyable
116 {
117 protected:
118     /** The resource handle. */
119     T m_hRes;
120
121 public:
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 browser.

© 2008 Sun Microsystems, Inc.
ContactPrivacy policy