Initial revision
[blender.git] / intern / img / intern / IMG_MemPtr.h
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30  */
31
32 /**
33
34  * @author      Maarten Gribnau
35  * @date        March 8, 2001
36  */
37
38 #ifndef _H_IMG_MemPtr
39 #define _H_IMG_MemPtr
40
41 #include <stddef.h>
42
43 /**
44  * A memory pointer for memory of any type.
45  * It can be used to avoid memory leaks when allocating memory in constructors.
46  * @author      Maarten Gribnau
47  * @date        March 8, 2001
48  */
49
50 template <class T> class IMG_MemPtr {
51 public:
52         /** Pointer to the memory */
53         T* m_p;
54         bool m_owned;
55
56         /**
57          * Size exception.
58          * A size exception is thrown when an invalid width and/or height is passed.
59          */
60         class Size {};
61         /**
62          * Memory exception.
63          * A size exception is thrown when a there is not enough memory to allocate the image.
64          */
65         class Memory {};
66
67         /**
68          * Constructs a memory pointer.
69          * @param       s       requested size of the pointer
70          * @throw <Size>        when an invalid width and/or height is passed.
71          * @throw <Memory>      when a there is not enough memory to allocate the image.
72          */
73         IMG_MemPtr(size_t s)
74                 : m_p(0), m_owned(false)
75         {
76                 if (s > 0) {
77                         m_p = new T[s];
78                         if (!m_p) {
79                                 throw Memory();
80                         }
81                         m_owned = true;
82                 }
83                 else {
84                         throw Size();
85                 }
86         }
87
88         /**
89          * Constructs a memory pointer from a pointer.
90          * @param       p       the pointer
91          * @param       s       requested size of the pointer
92          * @throw <Size>        when an invalid width and/or height is passed.
93          */
94         IMG_MemPtr(void* p, size_t s)
95                 : m_p(0), m_owned(false)
96         {
97                 if (p && (s > 0)) {
98                         m_p = (T*)p;
99                 }
100                 else {
101                         throw Size();
102                 }
103         }
104
105         /**
106          * Destructor.
107          */
108         ~IMG_MemPtr() { if (m_p && m_owned) { delete [] m_p; m_p = 0; } }
109
110         /**
111          * Access to the memory.
112          * @return      pointer to the memory
113          */
114         operator T*() { return m_p; }
115 };
116
117 #endif // _H_IMG_MemPtr