Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
_array.h
Go to the documentation of this file.
1
32#ifndef _RWSTD_RW_ARRAY_H_INCLUDED
33#define _RWSTD_RW_ARRAY_H_INCLUDED
34
35#ifndef _RWSTD_RW_SPECIALIZED_H_INCLUDED
36# include <rw/_specialized.h>
37#endif // _RWSTD_RW_SPECIALIZED_H_INCLUDED
38
39
41
42
43template <class _TypeT>
44class __rw_array
45{
46public:
47
48 typedef _RWSTD_SIZE_T size_type;
49 typedef _TypeT value_type;
50 typedef value_type* pointer;
51 typedef value_type& reference;
52 typedef const value_type* const_pointer;
53 typedef const value_type& const_reference;
54
55 __rw_array ()
56 : _C_size (0),
57 _C_data (0) { }
58
59 // allocate but do not initialize
60 __rw_array (size_type);
61
62 // allocate and initialize from value
63 __rw_array (const_reference, size_type);
64
65 // allocate and initialize from an array
66 __rw_array (const_pointer, size_type);
67
68 __rw_array (const __rw_array&);
69
70 ~__rw_array ();
71
72 __rw_array& operator= (const __rw_array&);
73
74 size_type size () const {
75 return _C_size;
76 }
77
78 const_reference operator[] (size_type __inx) const {
79 _RWSTD_ASSERT (__inx < size ());
80 return _C_data [__inx];
81 }
82
83 reference operator[] (size_type __inx) {
84 _RWSTD_ASSERT (__inx < size ());
85 return _C_data [__inx];
86 }
87
88 void swap (__rw_array&);
89
90 pointer begin () {
91 return _C_data;
92 }
93
94 const_pointer begin () const {
95 return _C_data;
96 }
97
98 pointer end () {
99 return _C_data + _C_size;
100 }
101
102 const_pointer end () const {
103 return _C_data + _C_size;
104 }
105
106 void resize (size_type, const_reference = value_type ());
107
108private:
109 size_type _C_size; // number of elements
110 pointer _C_data; // array of elements
111};
112
113
114template <class _TypeT>
115inline __rw_array<_TypeT>::__rw_array (size_type __n)
116{
117 if (__n)
118 _C_data = _RWSTD_STATIC_CAST (pointer,
119 ::operator new (__n * sizeof *_C_data));
120 else
121 _C_data = 0;
122
123 _C_size = __n;
124}
125
126
127template <class _TypeT>
128inline __rw_array<_TypeT>::__rw_array (const_reference __val, size_type __n)
129{
130 if (__n) {
131 _C_data = _RWSTD_STATIC_CAST (pointer,
132 ::operator new (__n * sizeof *_C_data));
133 _STD::uninitialized_fill_n (_C_data, __n, __val);
134 }
135 else
136 _C_data = 0;
137
138 _C_size = __n;
139}
140
141
142template <class _TypeT>
143inline __rw_array<_TypeT>::__rw_array (const_pointer __data, size_type __n)
144{
145 if (__n) {
146 _C_data = _RWSTD_STATIC_CAST (pointer,
147 ::operator new (__n * sizeof *_C_data));
148 _STD::uninitialized_copy (__data, __data + __n, _C_data);
149 }
150 else
151 _C_data = 0;
152
153 _C_size = __n;
154}
155
156
157template <class _TypeT>
158inline __rw_array<_TypeT>::__rw_array (const __rw_array<_TypeT> &__rhs)
159 : _C_size (__rhs.size ())
160{
161 if (__rhs.size ()) {
162 _C_data = _RWSTD_STATIC_CAST (pointer,
163 ::operator new (_C_size * sizeof *_C_data));
164 _STD::uninitialized_copy (__rhs.begin (), __rhs.end (), begin ());
165 }
166 else
167 _C_data = 0;
168}
169
170
171template <class _TypeT>
172inline __rw_array<_TypeT>&
173__rw_array<_TypeT>::operator= (const __rw_array<_TypeT> &__rhs)
174{
175 if (__rhs.size () == size ())
176 // do not allocate, just copy for efficiency
177 _STD::copy (__rhs.begin (), __rhs.end (), begin ());
178 else
179 // allocate and copy into a temporary, then swap
180 __rw_array <_TypeT> (__rhs).swap (*this);
181
182 return *this;
183}
184
185
186template <class _TypeT>
187inline
188__rw_array<_TypeT>::
189~__rw_array ()
190{
191 __rw_destroy (_C_data, _C_data + _C_size);
192 ::operator delete (_C_data);
193}
194
195
196template <class _TypeT>
197inline void __rw_array<_TypeT>::swap (__rw_array<_TypeT> &__rhs)
198{
199 pointer __tmp_data = begin ();
200 size_type __tmp_size = size ();
201
202 _C_data = __rhs.begin ();
203 _C_size = __rhs.size ();
204 __rhs._C_data = __tmp_data;
205 __rhs._C_size = __tmp_size;
206}
207
208
209template <class _TypeT>
210inline void __rw_array<_TypeT>::
211resize (size_type __size, const_reference __val /* = value_type () */)
212{
213 if (_C_data) {
214 __rw_destroy (_C_data, _C_data + _C_size);
215 ::operator delete (_C_data);
216 _C_data = 0;
217 }
218
219 if ((_C_size = __size)) {
220 _C_data = _RWSTD_STATIC_CAST (pointer,
221 ::operator new (_C_size * sizeof *_C_data));
222 _STD::uninitialized_fill_n (_C_data, _C_size, __val);
223 }
224}
225
226
227} // namespace __rw
228
229
230#endif // _RWSTD_RW_ARRAY_H_INCLUDED
const int end
#define _RWSTD_STATIC_CAST(T, x)
Definition _defs.h:534
#define _RWSTD_NAMESPACE(name)
Definition _defs.h:567
#define _RWSTD_ASSERT(ignore)
Definition _defs.h:1108