00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #if !defined (octave_local_buffer_h)
00024 #define octave_local_buffer_h 1
00025
00026 #include <cstddef>
00027 #include "oct-cmplx.h"
00028
00029
00030
00031
00032 template <class T>
00033 class octave_local_buffer
00034 {
00035 public:
00036 octave_local_buffer (size_t size)
00037 : data (0)
00038 {
00039 if (size)
00040 data = new T[size];
00041 }
00042 ~octave_local_buffer (void) { delete [] data; }
00043 operator T *() const { return data; }
00044 private:
00045 T *data;
00046 };
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 class octave_chunk_buffer
00061 {
00062 static const size_t chunk_size;
00063
00064 static char *top, *chunk;
00065 static size_t left;
00066
00067 char *cnk;
00068 char *dat;
00069
00070 public:
00071
00072 OCTAVE_API octave_chunk_buffer (size_t size);
00073
00074 OCTAVE_API ~octave_chunk_buffer (void);
00075
00076 char *data (void) const { return dat; }
00077 };
00078
00079
00080
00081 #define SPECIALIZE_POD_BUFFER(TYPE) \
00082 template <> \
00083 class octave_local_buffer<TYPE> : private octave_chunk_buffer \
00084 { \
00085 public: \
00086 octave_local_buffer (size_t size) : octave_chunk_buffer (size * sizeof (TYPE)) { } \
00087 operator TYPE *() const { return reinterpret_cast<TYPE *> (this->data ()); } \
00088 }
00089
00090 SPECIALIZE_POD_BUFFER (bool);
00091 SPECIALIZE_POD_BUFFER (char);
00092 SPECIALIZE_POD_BUFFER (unsigned short);
00093 SPECIALIZE_POD_BUFFER (short);
00094 SPECIALIZE_POD_BUFFER (int);
00095 SPECIALIZE_POD_BUFFER (unsigned int);
00096 SPECIALIZE_POD_BUFFER (long);
00097 SPECIALIZE_POD_BUFFER (unsigned long);
00098 SPECIALIZE_POD_BUFFER (float);
00099 SPECIALIZE_POD_BUFFER (double);
00100
00101 SPECIALIZE_POD_BUFFER (Complex);
00102 SPECIALIZE_POD_BUFFER (FloatComplex);
00103
00104
00105
00106 template <class T>
00107 class octave_local_buffer<T *> : private octave_chunk_buffer
00108 {
00109 public:
00110 octave_local_buffer (size_t size) : octave_chunk_buffer (size * sizeof (T *)) { }
00111 operator T **() const { return reinterpret_cast<T **> (this->data ()); }
00112 };
00113
00114 template <class T>
00115 class octave_local_buffer<const T *> : private octave_chunk_buffer
00116 {
00117 public:
00118 octave_local_buffer (size_t size) : octave_chunk_buffer (size * sizeof (const T *)) { }
00119 operator const T **() const { return reinterpret_cast<const T **> (this->data ()); }
00120 };
00121
00122
00123
00124
00125
00126 #if 0 //defined (HAVE_DYNAMIC_AUTO_ARRAYS)
00127
00128
00129
00130 #define OCTAVE_LOCAL_BUFFER_MAX_STACK_SIZE 8192
00131
00132
00133
00134
00135
00136
00137 #define OCTAVE_LOCAL_BUFFER(T, buf, size) \
00138 const size_t _bufsize_ ## buf = size; \
00139 const bool _lbufaut_ ## buf = _bufsize_ ## buf * sizeof (T) \
00140 <= OCTAVE_LOCAL_BUFFER_MAX_STACK_SIZE; \
00141 T _bufaut_ ## buf [_lbufaut_ ## buf ? _bufsize_ ## buf : 0]; \
00142 octave_local_buffer<T> _bufheap_ ## buf (!_lbufaut_ ## buf ? _bufsize_ ## buf : 0); \
00143 T *buf = _lbufaut_ ## buf ? _bufaut_ ## buf : static_cast<T *> (_bufheap_ ## buf)
00144
00145 #else
00146
00147
00148
00149 #define OCTAVE_LOCAL_BUFFER(T, buf, size) \
00150 octave_local_buffer<T> _buffer_ ## buf (size); \
00151 T *buf = _buffer_ ## buf
00152
00153 #endif
00154
00155
00156
00157
00158 #define OCTAVE_LOCAL_BUFFER_INIT(T, buf, size, value) \
00159 OCTAVE_LOCAL_BUFFER(T, buf, size); \
00160 for (size_t _buf_iter = 0, _buf_size = size; \
00161 _buf_iter < _buf_size; _buf_iter++) buf[_buf_iter] = value
00162
00163 #endif
00164