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