PGE API 0.4
PR00F's Game Engine full documentation
Loading...
Searching...
No Matches
blArray.hpp
Go to the documentation of this file.
1#ifndef BL_ARRAY_HPP
2#define BL_ARRAY_HPP
3
4
5//-------------------------------------------------------------------
6// FILE: blArray.hpp
7// CLASS: blArray
8// BASE CLASS: None
9//
10// PURPOSE: A simple static templated array
11// with some helper functions such
12// as begin, end, size that makes
13// it easy to work with iterators
14// defined in this library
15//
16// AUTHOR: Vincenzo Barbato
17// http://www.barbatolabs.com
18// navyenzo@gmail.com
19//
20// LISENSE: MIT-LICENCE
21// http://www.opensource.org/licenses/mit-license.php
22//
23// DEPENDENCIES:
24//
25// NOTES:
26//
27// DATE CREATED: Mar/17/2014
28//
29// DATE UPDATED:
30//-------------------------------------------------------------------
31
32
33//-------------------------------------------------------------------
34template<typename blDataType,size_t blArraySize>
35
37{
38public: // Public typedefs
39
42
45
46public: // Constructors and destructors
47
48 // Default constructor
49
50 blArray();
51
52 // Copy constructor
53
55
56 // Move constructor
57
59
60 // Initializer-list constructor
61
62 blArray(std::initializer_list<blDataType> theList);
63
64 // Copy constructor
65 // from a different
66 // size and/or different
67 // data type array
68
69 template<typename blDataType2,size_t blArraySize2>
71
72 // Constructor using
73 // a raw array
74
75 template<typename blDataType2,size_t blArraySize2>
76 blArray(const blDataType2 (&staticArray)[blArraySize2]);
77
78 // Constructor using
79 // iterators
80
81 template<typename blIteratorType>
82 blArray(blIteratorType sourceBegin,
83 blIteratorType sourceEnd);
84
85 // Destructor
86
88 {
89 }
90
91public: // Assignment operators
92
94
95 template<typename blDataType2,size_t blArraySize2>
97
98 blArray<blDataType,blArraySize>& operator=(std::initializer_list<blDataType> theList);
99
100 template<typename blDataType2,size_t blArraySize2>
101 blArray<blDataType,blArraySize>& operator=(const blDataType2 (&staticArray)[blArraySize2]);
102
103public: // Public functions
104
105 // Additional operator
106 // overloads
107
108 bool operator==(const blArray<blDataType,blArraySize>& array)const;
109 bool operator!=(const blArray<blDataType,blArraySize>& array)const;
110
111 // Element access
112 // functions
113
114 blDataType& operator[](const size_t elementIndex);
115 const blDataType& operator[](const size_t elementIndex)const;
116
117 // Functions used
118 // to return the
119 // array size
120
121 size_t length()const;
122 size_t size()const;
123 size_t max_size()const;
124 bool empty()const;
125
126 // Function used to
127 // swap values between
128 // two arrays of
129 // equal length
130
131 void swap(const blArray<blDataType,blArraySize>& Array);
132
133 // Function used to
134 // fill the array
135 // with a specified
136 // value
137
138 void fill(const blDataType& value);
139
140 // Function used to
141 // return a reference
142 // to the front and
143 // back elements
144
145 blDataType& front();
146 const blDataType& front()const;
147
148 blDataType& back();
149 const blDataType& back()const;
150
151 // Functions used to
152 // get a raw pointer
153 // to the first element
154
155 blDataType* data();
156 const blDataType* data()const;
157 const blDataType* c_str()const;
158
159 // Functions used to
160 // get iterators to
161 // this container
162
163 iterator begin();
164 iterator end();
165 const_iterator cbegin()const;
166 const_iterator cend()const;
167
172
173private: // Private data
174
175 // The raw array
176
177 blDataType m_container[blArraySize];
178
179 // The null end
180 // element useful
181 // when using this
182 // array as a constant
183 // character string
184
185 blDataType m_nullChar;
186};
187//-------------------------------------------------------------------
188
189
190//-------------------------------------------------------------------
191template<typename blDataType,size_t blArraySize>
193{
194}
195//-------------------------------------------------------------------
196
197
198//-------------------------------------------------------------------
199template<typename blDataType,size_t blArraySize>
200inline blArray<blDataType,blArraySize>::blArray(std::initializer_list<blDataType> theList) : m_nullChar(0)
201{
202 auto Iter1 = this->begin();
203 auto Iter2 = theList.begin();
204
205 for(;
206 Iter1 != this->end(),Iter2 != theList.end();
207 ++Iter1,++Iter2)
208 {
209 (*Iter1) = (*Iter2);
210 }
211}
212//-------------------------------------------------------------------
213
214
215//-------------------------------------------------------------------
216template<typename blDataType,size_t blArraySize>
217template<typename blDataType2,size_t blArraySize2>
219{
220 auto Iter1 = this->begin();
221 auto Iter2 = array.begin();
222
223 for(;
224 Iter1 != this->end(),Iter2 != array.end();
225 ++Iter1,++Iter2)
226 {
227 (*Iter1) = (*Iter2);
228 }
229}
230//-------------------------------------------------------------------
231
232
233//-------------------------------------------------------------------
234template<typename blDataType,size_t blArraySize>
235template<typename blDataType2,size_t blArraySize2>
236inline blArray<blDataType,blArraySize>::blArray(const blDataType2 (&staticArray)[blArraySize2]) : m_nullChar(0)
237{
238 auto Iter1 = this->begin();
239
240 for(size_t i = 0;
241 Iter1 != this->end(), i < blArraySize2;
242 ++Iter1,++i)
243 {
244 (*Iter1) = staticArray[i];
245 }
246}
247//-------------------------------------------------------------------
248
249
250//-------------------------------------------------------------------
251template<typename blDataType,size_t blArraySize>
252template<typename blIteratorType>
253inline blArray<blDataType,blArraySize>::blArray(blIteratorType sourceBegin,
254 blIteratorType sourceEnd) : m_nullChar(0)
255{
256 auto Iter1 = this->begin();
257
258 for(size_t i = 0;
259 Iter1 != this->end(),sourceBegin != sourceEnd;
260 ++Iter1,sourceBegin)
261 {
262 (*Iter1) = (*sourceBegin);
263 }
264}
265//-------------------------------------------------------------------
266
267
268//-------------------------------------------------------------------
269template<typename blDataType,size_t blArraySize>
270template<typename blDataType2,size_t blArraySize2>
272{
273 if(this != &array)
274 {
275 auto iter1 = this->begin();
276 auto iter2 = array.begin();
277
278 for(;
279 iter1 != this->end(),iter2 != array.end();
280 ++iter1,++iter2)
281 {
282 (*iter1) = (*iter2);
283 }
284 }
285
286 return (*this);
287}
288//-------------------------------------------------------------------
289
290
291//-------------------------------------------------------------------
292template<typename blDataType,size_t blArraySize>
293inline blArray<blDataType,blArraySize>& blArray<blDataType,blArraySize>::operator=(std::initializer_list<blDataType> theList)
294{
295 auto Iter1 = this->begin();
296 auto Iter2 = theList.begin();
297
298 for(;
299 Iter1 != this->end(),Iter2 != theList.end();
300 ++Iter1,++Iter2)
301 {
302 (*Iter1) = (*Iter2);
303 }
304
305 return (*this);
306}
307//-------------------------------------------------------------------
308
309
310//-------------------------------------------------------------------
311template<typename blDataType,size_t blArraySize>
313{
314 if(this == &array)
315 return true;
316
317 auto iter1 = cbegin();
318 auto iter2 = array.cbegin();
319
320 for(;
321 iter1 != cend();
322 ++iter1,++iter2)
323 {
324 if((*iter1) != (*iter2))
325 return false;
326 }
327
328 return true;
329}
330//-------------------------------------------------------------------
331
332
333//-------------------------------------------------------------------
334template<typename blDataType,size_t blArraySize>
336{
337 return !( (*this) == array );
338}
339//-------------------------------------------------------------------
340
341
342//-------------------------------------------------------------------
343template<typename blDataType,size_t blArraySize>
344inline blDataType& blArray<blDataType,blArraySize>::operator[](const size_t elementIndex)
345{
346 return m_container[elementIndex];
347}
348//-------------------------------------------------------------------
349
350
351//-------------------------------------------------------------------
352template<typename blDataType,size_t blArraySize>
353inline const blDataType& blArray<blDataType,blArraySize>::operator[](const size_t elementIndex)const
354{
355 return m_container[elementIndex];
356}
357//-------------------------------------------------------------------
358
359
360//-------------------------------------------------------------------
361template<typename blDataType,size_t blArraySize>
363{
364 return blArraySize;
365}
366//-------------------------------------------------------------------
367
368
369//-------------------------------------------------------------------
370template<typename blDataType,size_t blArraySize>
372{
373 return blArraySize;
374}
375//-------------------------------------------------------------------
376
377
378//-------------------------------------------------------------------
379template<typename blDataType,size_t blArraySize>
381{
382 return blArraySize;
383}
384//-------------------------------------------------------------------
385
386
387//-------------------------------------------------------------------
388template<typename blDataType,size_t blArraySize>
390{
391 return (blArraySize != 0);
392}
393//-------------------------------------------------------------------
394
395
396//-------------------------------------------------------------------
397template<typename blDataType,size_t blArraySize>
399{
400 blDataType TempValue;
401
402 for(size_t i = 0; i < blArraySize; ++i)
403 {
404 TempValue = m_container[i];
405 m_container[i] = Array[i];
406 Array[i] = TempValue;
407 }
408}
409//-------------------------------------------------------------------
410
411
412//-------------------------------------------------------------------
413template<typename blDataType,size_t blArraySize>
414inline void blArray<blDataType,blArraySize>::fill(const blDataType& value)
415{
416 for(size_t i = 0; i < blArraySize; ++i)
417 m_container[i] = value;
418}
419//-------------------------------------------------------------------
420
421
422//-------------------------------------------------------------------
423template<typename blDataType,size_t blArraySize>
425{
426 return m_container[0];
427}
428//-------------------------------------------------------------------
429
430
431//-------------------------------------------------------------------
432template<typename blDataType,size_t blArraySize>
433inline const blDataType& blArray<blDataType,blArraySize>::front()const
434{
435 return m_container[0];
436}
437//-------------------------------------------------------------------
438
439
440//-------------------------------------------------------------------
441template<typename blDataType,size_t blArraySize>
443{
444 return m_container[blArraySize - 1];
445}
446//-------------------------------------------------------------------
447
448
449//-------------------------------------------------------------------
450template<typename blDataType,size_t blArraySize>
451inline const blDataType& blArray<blDataType,blArraySize>::back()const
452{
453 return m_container[blArraySize - 1];
454}
455//-------------------------------------------------------------------
456
457
458//-------------------------------------------------------------------
459template<typename blDataType,size_t blArraySize>
461{
462 return &m_container[0];
463}
464//-------------------------------------------------------------------
465
466
467//-------------------------------------------------------------------
468template<typename blDataType,size_t blArraySize>
469inline const blDataType* blArray<blDataType,blArraySize>::data()const
470{
471 return &m_container[0];
472}
473//-------------------------------------------------------------------
474
475
476//-------------------------------------------------------------------
477template<typename blDataType,size_t blArraySize>
478inline const blDataType* blArray<blDataType,blArraySize>::c_str()const
479{
480 return &m_container[0];
481}
482//-------------------------------------------------------------------
483
484
485//-------------------------------------------------------------------
486// The iterators
487//-------------------------------------------------------------------
488template<typename blDataType,size_t blArraySize>
490{
491 return &(m_container[0]);
492}
493
494template<typename blDataType,size_t blArraySize>
496{
497 return &(m_container[blArraySize]);
498}
499template<typename blDataType,size_t blArraySize>
501{
502 return &(m_container[0]);
503}
504
505template<typename blDataType,size_t blArraySize>
507{
508 return &(m_container[blArraySize]);
509}
510template<typename blDataType,size_t blArraySize>
512{
513 return &(m_container[blArraySize - 1]);
514}
515
516template<typename blDataType,size_t blArraySize>
518{
519 return &(m_container[-1]);
520}
521template<typename blDataType,size_t blArraySize>
523{
524 return &(m_container[blArraySize - 1]);
525}
526
527template<typename blDataType,size_t blArraySize>
529{
530 return &(m_container[-1]);
531}
532//-------------------------------------------------------------------
533
534
535//-------------------------------------------------------------------
536// Function used to automatically deduct
537// the type and size of array from a raw
538// array
539//-------------------------------------------------------------------
540template<typename blDataType,size_t blArraySize>
541blArray<blDataType,blArraySize> getArray(const blDataType (&staticArray)[blArraySize])
542{
543 return blArray<blDataType,blArraySize>(staticArray);
544}
545//-------------------------------------------------------------------
546
547
548//-------------------------------------------------------------------
549// Function used to automatically deduct
550// the type and size of array from a NULL
551// terminated array
552//-------------------------------------------------------------------
553template<typename blDataType,size_t blArraySize>
554blArray<blDataType,blArraySize - 1> getArrayFromNullTerminated(const blDataType (&staticArray)[blArraySize])
555{
556 return blArray<blDataType,blArraySize - 1>(staticArray);
557}
558//-------------------------------------------------------------------
559
560
561#endif // BL_ARRAY_HPP
blArray< blDataType, blArraySize > getArray(const blDataType(&staticArray)[blArraySize])
Definition blArray.hpp:541
blArray< blDataType, blArraySize - 1 > getArrayFromNullTerminated(const blDataType(&staticArray)[blArraySize])
Definition blArray.hpp:554
blArray< blDataType, blArraySize > & operator=(const blArray< blDataType, blArraySize > &array)=default
const_reverse_iterator crbegin() const
Definition blArray.hpp:522
~blArray()
Definition blArray.hpp:87
blArray< blDataType, blArraySize > & operator=(const blDataType2(&staticArray)[blArraySize2])
void swap(const blArray< blDataType, blArraySize > &Array)
Definition blArray.hpp:398
blDataType m_container[blArraySize]
Definition blArray.hpp:177
size_t max_size() const
Definition blArray.hpp:380
blDataType * data()
Definition blArray.hpp:460
iterator end()
Definition blArray.hpp:495
void fill(const blDataType &value)
Definition blArray.hpp:414
const_iterator cbegin() const
Definition blArray.hpp:500
blRawReverseIterator< blDataType > reverse_iterator
Definition blArray.hpp:43
blRawIterator< blDataType > iterator
Definition blArray.hpp:40
blDataType m_nullChar
Definition blArray.hpp:185
bool operator==(const blArray< blDataType, blArraySize > &array) const
Definition blArray.hpp:312
const blDataType * c_str() const
Definition blArray.hpp:478
blRawReverseIterator< const blDataType > const_reverse_iterator
Definition blArray.hpp:44
bool empty() const
Definition blArray.hpp:389
blDataType & back()
Definition blArray.hpp:442
blDataType & front()
Definition blArray.hpp:424
bool operator!=(const blArray< blDataType, blArraySize > &array) const
Definition blArray.hpp:335
blArray(const blArray< blDataType, blArraySize > &array)=default
blDataType & operator[](const size_t elementIndex)
Definition blArray.hpp:344
size_t length() const
Definition blArray.hpp:362
reverse_iterator rend()
Definition blArray.hpp:517
blArray(blArray< blDataType, blArraySize > &&array)=default
size_t size() const
Definition blArray.hpp:371
iterator begin()
Definition blArray.hpp:489
const_reverse_iterator crend() const
Definition blArray.hpp:528
const_iterator cend() const
Definition blArray.hpp:506
reverse_iterator rbegin()
Definition blArray.hpp:511
blRawIterator< const blDataType > const_iterator
Definition blArray.hpp:41