annotate liboctave/util/oct-locbuf.h @ 19731:4197fc428c7d

maint: Update copyright notices for 2015.
author John W. Eaton <jwe@octave.org>
date Wed, 11 Feb 2015 14:19:08 -0500
parents ebb3ef964372
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
1 /*
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
2
19731
4197fc428c7d maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents: 17822
diff changeset
3 Copyright (C) 2008-2015 Jaroslav Hajek
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
4
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
5 This file is part of Octave.
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
6
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
7 Octave is free software; you can redistribute it and/or modify it
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
9 Free Software Foundation; either version 3 of the License, or (at your
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
10 option) any later version.
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
11
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
12 Octave is distributed in the hope that it will be useful, but WITHOUT
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
15 for more details.
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
16
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
18 along with Octave; see the file COPYING. If not, see
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
19 <http://www.gnu.org/licenses/>.
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
20
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
21 */
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
22
17822
ebb3ef964372 maint: Use common #define syntax "octave_filename_h" in h_files.
Rik <rik@octave.org>
parents: 17769
diff changeset
23 #if !defined (octave_oct_locbuf_h)
ebb3ef964372 maint: Use common #define syntax "octave_filename_h" in h_files.
Rik <rik@octave.org>
parents: 17769
diff changeset
24 #define octave_oct_locbuf_h 1
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
25
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
26 #include <cstddef>
8400
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
27 #include "oct-cmplx.h"
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
28
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
29 // The default local buffer simply encapsulates an *array* pointer
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
30 // that gets deleted automatically. For common POD types, we provide
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
31 // specializations.
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
32
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
33 template <class T>
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
34 class octave_local_buffer
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
35 {
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
36 public:
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
37 octave_local_buffer (size_t size)
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
38 : data (0)
17769
49a5a4be04a1 maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents: 17744
diff changeset
39 {
49a5a4be04a1 maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents: 17744
diff changeset
40 if (size)
49a5a4be04a1 maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents: 17744
diff changeset
41 data = new T [size];
49a5a4be04a1 maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents: 17744
diff changeset
42 }
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
43 ~octave_local_buffer (void) { delete [] data; }
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
44 operator T *() const { return data; }
11506
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
45
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
46 private:
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
47 T *data;
11506
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
48
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
49 // No copying!
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
50 octave_local_buffer (const octave_local_buffer&);
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
51 octave_local_buffer& operator = (const octave_local_buffer&);
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
52 };
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
53
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
54 // For buffers of POD types, we'll be smarter. There is one thing
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
55 // that differentiates a local buffer from a dynamic array - the local
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
56 // buffers, if not manipulated improperly, have a FIFO semantics,
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
57 // meaning that if buffer B is allocated after buffer A, B *must* be
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
58 // deallocated before A. This is *guaranteed* if you use local buffer
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
59 // exclusively through the OCTAVE_LOCAL_BUFFER macro, because the C++
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
60 // standard requires that explicit local objects be destroyed in
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
61 // reverse order of declaration. Therefore, we can avoid memory
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
62 // fragmentation by allocating fairly large chunks of memory and
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
63 // serving local buffers from them in a stack-like manner. The first
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
64 // returning buffer in previous chunk will be responsible for
8400
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
65 // deallocating the chunk.
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
66
8400
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
67 class octave_chunk_buffer
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
68 {
11506
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
69 public:
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
70
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
71 OCTAVE_API octave_chunk_buffer (size_t size);
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
72
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
73 OCTAVE_API virtual ~octave_chunk_buffer (void);
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
74
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
75 char *data (void) const { return dat; }
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
76
13989
b4d399c975de Export new added functions/classes (Woe32)
Michael Goffioul <michael.goffioul@gmail.com>
parents: 13981
diff changeset
77 static OCTAVE_API void clear (void);
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
78
11506
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
79 private:
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
80
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
81 // The number of bytes we allocate for each large chunk of memory we
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
82 // manage.
8400
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
83 static const size_t chunk_size;
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
84
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
85 // Pointer to the end end of the last allocation.
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
86 static char *top;
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
87
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
88 // Pointer to the current active chunk.
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
89 static char *chunk;
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
90
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
91 // The number of bytes remaining in the active chunk.
8400
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
92 static size_t left;
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
93
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
94 // The number of active allocations.
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
95 static size_t active;
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
96
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
97 // Pointer to the current chunk.
8400
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
98 char *cnk;
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
99
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
100 // Pointer to the beginning of the most recent allocation.
8400
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
101 char *dat;
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
102
11506
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
103 // No copying!
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
104 octave_chunk_buffer (const octave_chunk_buffer&);
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
105 octave_chunk_buffer& operator = (const octave_chunk_buffer&);
8400
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
106 };
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
107
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
108 // This specializes octave_local_buffer to use the chunked buffer
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
109 // mechanism for POD types.
8400
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
110 #define SPECIALIZE_POD_BUFFER(TYPE) \
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
111 template <> \
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
112 class octave_local_buffer<TYPE> : private octave_chunk_buffer \
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
113 { \
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
114 public: \
11506
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
115 octave_local_buffer (size_t size) \
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
116 : octave_chunk_buffer (size * sizeof (TYPE)) { } \
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
117 \
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
118 operator TYPE *() const \
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
119 { \
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
120 return reinterpret_cast<TYPE *> (this->data ()); \
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
121 } \
8400
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
122 }
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
123
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
124 SPECIALIZE_POD_BUFFER (bool);
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
125 SPECIALIZE_POD_BUFFER (char);
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
126 SPECIALIZE_POD_BUFFER (unsigned short);
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
127 SPECIALIZE_POD_BUFFER (short);
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
128 SPECIALIZE_POD_BUFFER (int);
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
129 SPECIALIZE_POD_BUFFER (unsigned int);
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
130 SPECIALIZE_POD_BUFFER (long);
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
131 SPECIALIZE_POD_BUFFER (unsigned long);
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
132 SPECIALIZE_POD_BUFFER (float);
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
133 SPECIALIZE_POD_BUFFER (double);
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
134 // FIXME: Are these guaranteed to be POD and satisfy alignment?
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
135 SPECIALIZE_POD_BUFFER (Complex);
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
136 SPECIALIZE_POD_BUFFER (FloatComplex);
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
137 // MORE ?
7b6e1fc1cb90 implement obstack-like optimization of local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8379
diff changeset
138
8660
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
139 // All pointers and const pointers are also POD types.
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
140 template <class T>
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
141 class octave_local_buffer<T *> : private octave_chunk_buffer
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
142 {
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
143 public:
11506
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
144 octave_local_buffer (size_t size)
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
145 : octave_chunk_buffer (size * sizeof (T *))
17769
49a5a4be04a1 maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents: 17744
diff changeset
146 { }
11506
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
147
8660
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
148 operator T **() const { return reinterpret_cast<T **> (this->data ()); }
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
149 };
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
150
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
151 template <class T>
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
152 class octave_local_buffer<const T *> : private octave_chunk_buffer
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
153 {
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
154 public:
11506
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
155 octave_local_buffer (size_t size)
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
156 : octave_chunk_buffer (size * sizeof (const T *))
17769
49a5a4be04a1 maint: Use GNU style coding conventions for code in liboctave/
Rik <rik@octave.org>
parents: 17744
diff changeset
157 { }
11506
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
158
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
159 operator const T **() const
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
160 {
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
161 return reinterpret_cast<const T **> (this->data ());
964b7fd379f1 more constructor/destructor fixes
John W. Eaton <jwe@octave.org>
parents: 9237
diff changeset
162 }
8660
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
163 };
f274fbc29747 chunked buffer allocation for pointers
Jaroslav Hajek <highegg@gmail.com>
parents: 8400
diff changeset
164
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
165 // If the compiler supports dynamic stack arrays, we can use the
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
166 // attached hack to place small buffer arrays on the stack. It may be
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
167 // even faster than our obstack-like optimization, but is dangerous
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
168 // because stack is a very limited resource, so we disable it.
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
169
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
170 #if 0 // defined (HAVE_DYNAMIC_AUTO_ARRAYS)
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
171
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
172 // Maximum buffer size (in bytes) to be placed on the stack.
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
173
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
174 #define OCTAVE_LOCAL_BUFFER_MAX_STACK_SIZE 8192
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
175
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
176 // If we have automatic arrays, we use an automatic array if the size
15466
d174210ce1ec use ' instead of ` in error messages, warnings and most comments
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
177 // is small enough. To avoid possibly evaluating 'size' multiple
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
178 // times, we first cache it. Note that we always construct both the
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
179 // stack array and the octave_local_buffer object, but only one of
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
180 // them will be nonempty.
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
181
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
182 #define OCTAVE_LOCAL_BUFFER(T, buf, size) \
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
183 const size_t _bufsize_ ## buf = size; \
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
184 const bool _lbufaut_ ## buf = _bufsize_ ## buf * sizeof (T) \
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
185 <= OCTAVE_LOCAL_BUFFER_MAX_STACK_SIZE; \
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
186 T _bufaut_ ## buf [_lbufaut_ ## buf ? _bufsize_ ## buf : 0]; \
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
187 octave_local_buffer<T> _bufheap_ ## buf \
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
188 (!_lbufaut_ ## buf ? _bufsize_ ## buf : 0); \
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
189 T *buf = _lbufaut_ ## buf \
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
190 ? _bufaut_ ## buf : static_cast<T *> (_bufheap_ ## buf)
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
191
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
192 #else
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
193
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
194 // If we don't have automatic arrays, we simply always use
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
195 // octave_local_buffer.
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
196
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
197 #define OCTAVE_LOCAL_BUFFER(T, buf, size) \
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
198 octave_local_buffer<T> _buffer_ ## buf (size); \
8379
ad8ed668e0a4 allow initialized local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8377
diff changeset
199 T *buf = _buffer_ ## buf
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
200
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11523
diff changeset
201 #endif
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
202
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
203 // Note: we use weird variables in the for loop to avoid warnings
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
204 // about shadowed parameters.
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
205
8379
ad8ed668e0a4 allow initialized local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8377
diff changeset
206 #define OCTAVE_LOCAL_BUFFER_INIT(T, buf, size, value) \
15022
e47b4e8c2714 maint: Use space after OCTAVE_LOCAL_BUFFER invocation in liboctave source code.
Rik <rik@octave.org>
parents: 15020
diff changeset
207 OCTAVE_LOCAL_BUFFER (T, buf, size); \
8379
ad8ed668e0a4 allow initialized local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8377
diff changeset
208 for (size_t _buf_iter = 0, _buf_size = size; \
13981
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
209 _buf_iter < _buf_size; _buf_iter++) \
5f8bc2f145f5 clean up octave_chunk_buffer storage before exit
John W. Eaton <jwe@octave.org>
parents: 11586
diff changeset
210 buf[_buf_iter] = value
8379
ad8ed668e0a4 allow initialized local buffers
Jaroslav Hajek <highegg@gmail.com>
parents: 8377
diff changeset
211
8377
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
212 #endif
25bc2d31e1bf improve OCTAVE_LOCAL_BUFFER
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
213