86d86cdd0b1b0fc2883d6834bf3439c10be00085
[blender.git] / intern / bsp / intern / BSP_CSGUserData.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 #ifndef BSP_CSGUserData_h
33
34 #define BSP_CSGUserData_h
35
36 #include <vector>
37
38 /**
39  * This data represents a continuous block of 
40  * data of unknown type. This holds the user
41  * data during a BSP operation.
42  */
43
44 class BSP_CSGUserData 
45 {
46 public :
47
48         /**
49          * width defines the size in bytes of a
50          * single element (record) of user data
51          */
52
53         BSP_CSGUserData(
54                 const int width
55         );
56
57         /**
58          * Reserve some space in the array
59          */
60                 void
61         Reserve(
62                 int size
63         );
64
65         /**
66          * Add a new uninitialized record to the end of the 
67          * array
68          */
69
70                 void
71         IncSize(
72         );
73
74         /**
75          * duplicate a recod and insert it into the end of the array
76          * returns the index of the new record. Make sure that the
77          * record does not belong to this buffer as this can cause errors.
78          */
79
80                 int
81         Duplicate(
82                 void *
83         );
84
85                 void
86         Duplicate(
87                 int record_index
88         );
89
90         /**
91          * Copies the record at position pos in the array to the
92          * memory pointed to by output
93          */
94
95                 void
96         Copy(
97                 void *output,
98                 int pos
99         );      
100
101         /// Return the width of an individual record
102
103                 int
104         Width(
105         ) const;
106
107
108         /// return the current number of records stored in the array.
109                 int
110         Size(
111         ) const;
112
113
114         /// return a pointer to the start of the nth record in the array.
115
116                 void *
117         operator [] (
118                 const int pos
119         );
120
121 private :
122
123         /// Private - force use of public constructor only.
124
125         BSP_CSGUserData(
126         );
127
128
129         /// The block of data.
130         std::vector<char> m_data;
131         /// The width of a record in this array.
132         int m_width;
133 };
134
135
136 #endif