00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00051 #ifndef STLSOFT_INCL_STLSOFT_CONTAINERS_HPP_STATIC_ARRAY
00052 #define STLSOFT_INCL_STLSOFT_CONTAINERS_HPP_STATIC_ARRAY
00053
00054 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00055 # define STLSOFT_VER_STLSOFT_CONTAINERS_HPP_STATIC_ARRAY_MAJOR 4
00056 # define STLSOFT_VER_STLSOFT_CONTAINERS_HPP_STATIC_ARRAY_MINOR 4
00057 # define STLSOFT_VER_STLSOFT_CONTAINERS_HPP_STATIC_ARRAY_REVISION 2
00058 # define STLSOFT_VER_STLSOFT_CONTAINERS_HPP_STATIC_ARRAY_EDIT 188
00059 #endif
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 #ifndef STLSOFT_INCL_STLSOFT_H_STLSOFT
00080 # include <stlsoft/stlsoft.h>
00081 #endif
00082
00083 #if defined(STLSOFT_COMPILER_IS_BORLAND) && \
00084 __BORLANDC__ < 0x0560
00085 # error stlsoft/containers/static_array.hpp is not compatible with Borland C/C++ prior to 5.6
00086 #elif defined(STLSOFT_COMPILER_IS_DMC) && \
00087 __DMC__ < 0x0844
00088 # error stlsoft/containers/static_array.hpp is not compatible with Digital Mars C/C++ 8.43 or earlier
00089 #elif defined(STLSOFT_COMPILER_IS_GCC) && \
00090 __GNUC__ < 3
00091 # error stlsoft/containers/static_array.hpp is not compatible with GNU C/C++ prior to 3.0
00092 #elif defined(STLSOFT_COMPILER_IS_MSVC) && \
00093 _MSC_VER < 1200
00094 # error stlsoft/containers/static_array.hpp is not compatible with Visual C++ 5.0 or earlier
00095 #endif
00096
00097 #ifndef STLSOFT_INCL_STLSOFT_MEMORY_HPP_NULL_ALLOCATOR
00098 # include <stlsoft/memory/null_allocator.hpp>
00099 #endif
00100 #ifndef STLSOFT_INCL_STLSOFT_UTIL_STD_HPP_ITERATOR_HELPER
00101 # include <stlsoft/util/std/iterator_helper.hpp>
00102 #endif
00103 #ifndef STLSOFT_INCL_STLSOFT_CONTAINERS_UTIL_HPP_ARRAY_POLICIES
00104 # include <stlsoft/containers/util/array_policies.hpp>
00105 #endif
00106 #ifndef STLSOFT_INCL_STLSOFT_META_HPP_IS_POINTER_TYPE
00107 # include <stlsoft/meta/is_pointer_type.hpp>
00108 #endif
00109 #ifndef STLSOFT_INCL_STLSOFT_COLLECTIONS_UTIL_HPP_COLLECTIONS
00110 # include <stlsoft/collections/util/collections.hpp>
00111 #endif
00112
00113 #if defined(STLSOFT_COMPILER_IS_MSVC) && \
00114 defined(STLSOFT_CF_STD_LIBRARY_IS_STLPORT)
00115 # include <string>
00116 #endif
00117 #ifndef STLSOFT_INCL_STDEXCEPT
00118 # define STLSOFT_INCL_STDEXCEPT
00119 # include <stdexcept>
00120 #endif
00121
00122 #ifdef STLSOFT_UNITTEST
00123 # include <algorithm>
00124 # include <numeric>
00125 #endif
00126
00127
00128
00129
00130
00131 #ifndef _STLSOFT_NO_NAMESPACE
00132 namespace stlsoft
00133 {
00134 #endif
00135
00136
00137
00138
00139
00140 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00141
00142 template< ss_typename_param_k T
00143 , ss_size_t N0
00144 , ss_typename_param_k P
00145 , ss_typename_param_k M
00146 >
00147 class static_array_1d;
00148
00149 template< ss_typename_param_k T
00150 , ss_size_t N0
00151 , ss_size_t N1
00152 , ss_typename_param_k P
00153 , ss_typename_param_k M
00154 >
00155 class static_array_2d;
00156
00157 template< ss_typename_param_k T
00158 , ss_size_t N0
00159 , ss_size_t N1
00160 , ss_size_t N2
00161 , ss_typename_param_k P
00162 , ss_typename_param_k M
00163 >
00164 class static_array_3d;
00165
00166 template< ss_typename_param_k T
00167 , ss_size_t N0
00168 , ss_size_t N1
00169 , ss_size_t N2
00170 , ss_size_t N3
00171 , ss_typename_param_k P
00172 , ss_typename_param_k M
00173 >
00174 class static_array_4d;
00175
00176 template< ss_typename_param_k T
00177 , ss_size_t N0
00178 , ss_size_t N1
00179 , ss_size_t N2
00180 , ss_size_t N3
00181 , ss_size_t N4
00182 , ss_typename_param_k P
00183 , ss_typename_param_k M
00184 >
00185 class static_array_5d;
00186
00187 #endif
00188
00190
00191
00192
00201 template< ss_typename_param_k T
00202 , ss_size_t N0
00203 #ifdef STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT
00204 , ss_typename_param_k P = do_construction<T>
00205 , ss_typename_param_k M = T[N0]
00206 #else
00207 , ss_typename_param_k P
00208 , ss_typename_param_k M
00209 #endif
00210 >
00211 class static_array_1d
00212 : public null_allocator<T>
00213 , public stl_collection_tag
00214 {
00215 public:
00216 typedef static_array_1d<T, N0, P, M> class_type;
00217 typedef T dimension_type;
00218 typedef null_allocator<T> allocator_type;
00219 typedef P policy_type;
00220
00221 typedef T value_type;
00222 typedef value_type& reference;
00223 typedef value_type const& const_reference;
00224 typedef value_type* pointer;
00225 typedef value_type const* const_pointer;
00226 typedef ss_size_t size_type;
00227 typedef ss_size_t index_type;
00228 typedef ss_ptrdiff_t difference_type;
00229
00230 typedef
00231 #if !defined(STLSOFT_COMPILER_IS_BORLAND)
00232 ss_typename_type_k
00233 #endif
00234 pointer_iterator < value_type
00235 , pointer
00236 , reference
00237 >::type iterator;
00238 typedef
00239 #if !defined(STLSOFT_COMPILER_IS_BORLAND)
00240 ss_typename_type_k
00241 #endif
00242 pointer_iterator < value_type const
00243 , const_pointer
00244 , const_reference
00245 >::type const_iterator;
00246
00247 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00248 typedef reverse_iterator_base < iterator
00249 , value_type
00250 , reference
00251 , pointer
00252 , difference_type
00253 > reverse_iterator;
00254
00255 typedef const_reverse_iterator_base < const_iterator
00256 , value_type const
00257 , const_reference
00258 , const_pointer
00259 , difference_type
00260 > const_reverse_iterator;
00261 #endif
00262
00263
00264
00265 static_array_1d(T *data);
00266 public:
00267 static_array_1d();
00268 static_array_1d(value_type const& t);
00269 static_array_1d(class_type const& rhs);
00270 ~static_array_1d() stlsoft_throw_0();
00271
00272
00273 public:
00274 reference at(index_type i0);
00275 const_reference at(index_type i0) const;
00276
00277 reference at_unchecked(index_type i0);
00278 const_reference at_unchecked(index_type i0) const;
00279
00280 reference operator [](index_type i0);
00281 const_reference operator [](index_type i0) const;
00282
00283 reference front();
00284 reference back();
00285 const_reference front() const;
00286 const_reference back() const;
00287
00288
00289 public:
00290 static index_type dimension0();
00291 static index_type size();
00292 static ss_bool_t empty();
00293 static size_type max_size();
00294
00295
00296 public:
00297 iterator begin();
00298 iterator end();
00299 const_iterator begin() const;
00300 const_iterator end() const;
00301
00302 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00303 reverse_iterator rbegin();
00304 reverse_iterator rend();
00305 const_reverse_iterator rbegin() const;
00306 const_reverse_iterator rend() const;
00307 #endif
00308
00309
00310 public:
00311 value_type const *data() const;
00312
00313
00314 protected:
00315 pointer data_();
00316 index_type calc_index_(index_type i0) const;
00317 void range_check_(index_type i0) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) );
00318
00319
00320 private:
00321 M m_data;
00322
00323
00324 private:
00325 class_type const& operator =(class_type const& rhs);
00326 };
00327
00328
00338 template< ss_typename_param_k T
00339 , ss_size_t N0
00340 , ss_size_t N1
00341 #ifdef STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT
00342 , ss_typename_param_k P = do_construction<T>
00343 , ss_typename_param_k M = T[N0 * N1]
00344 #else
00345 , ss_typename_param_k P
00346 , ss_typename_param_k M
00347 #endif
00348 >
00349 class static_array_2d
00350 : public null_allocator<T>
00351 , public stl_collection_tag
00352 {
00353 public:
00354 typedef static_array_2d<T, N0, N1, P, M> class_type;
00355 typedef static_array_1d<T, N1, P, T*> dimension_type;
00356 typedef null_allocator<T> allocator_type;
00357 typedef P policy_type;
00358
00359 typedef T value_type;
00360 typedef value_type& reference;
00361 typedef value_type const& const_reference;
00362 typedef value_type* pointer;
00363 typedef value_type const* const_pointer;
00364 typedef ss_size_t size_type;
00365 typedef ss_size_t index_type;
00366 typedef ss_ptrdiff_t difference_type;
00367
00368 typedef
00369 #if !defined(STLSOFT_COMPILER_IS_BORLAND)
00370 ss_typename_type_k
00371 #endif
00372 pointer_iterator < value_type
00373 , pointer
00374 , reference
00375 >::type iterator;
00376 typedef
00377 #if !defined(STLSOFT_COMPILER_IS_BORLAND)
00378 ss_typename_type_k
00379 #endif
00380 pointer_iterator < value_type const
00381 , const_pointer
00382 , const_reference
00383 >::type const_iterator;
00384
00385 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00386 typedef reverse_iterator_base < iterator
00387 , value_type
00388 , reference
00389 , pointer
00390 , difference_type
00391 > reverse_iterator;
00392
00393 typedef const_reverse_iterator_base < const_iterator
00394 , value_type const
00395 , const_reference
00396 , const_pointer
00397 , difference_type
00398 > const_reverse_iterator;
00399 #endif
00400
00401
00402
00403
00404 static_array_2d(T *data);
00405 public:
00406 static_array_2d();
00407 static_array_2d(value_type const& t);
00408 static_array_2d(class_type const& rhs);
00409 ~static_array_2d() stlsoft_throw_0();
00410
00411
00412 public:
00413 reference at(index_type i0, index_type i1);
00414 const_reference at(index_type i0, index_type i1) const;
00415
00416 reference at_unchecked(index_type i0, index_type i1);
00417 const_reference at_unchecked(index_type i0, index_type i1) const;
00418
00419 dimension_type at(index_type i0);
00420 const dimension_type at(index_type i0) const;
00421
00422 dimension_type at_unchecked(index_type i0);
00423 const dimension_type at_unchecked(index_type i0) const;
00424
00425 dimension_type operator [](index_type i0);
00426 const dimension_type operator [](index_type i0) const;
00427
00428 reference front();
00429 reference back();
00430 const_reference front() const;
00431 const_reference back() const;
00432
00433
00434 public:
00435 static index_type dimension0();
00436 static index_type dimension1();
00437 static index_type size();
00438 static ss_bool_t empty();
00439 static size_type max_size();
00440
00441
00442 public:
00443 iterator begin();
00444 iterator end();
00445 const_iterator begin() const;
00446 const_iterator end() const;
00447
00448 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00449 reverse_iterator rbegin();
00450 reverse_iterator rend();
00451 const_reverse_iterator rbegin() const;
00452 const_reverse_iterator rend() const;
00453 #endif
00454
00455
00456 public:
00457 value_type const *data() const;
00458
00459
00460 protected:
00461 pointer data_();
00462 index_type calc_index_(index_type i0, index_type i1) const;
00463 void range_check_(index_type i0, index_type i1) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) );
00464 void range_check_(index_type i0) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) );
00465
00466
00467 private:
00468 M m_data;
00469
00470
00471 private:
00472 class_type const& operator =(class_type const& rhs);
00473 };
00474
00475
00486 template< ss_typename_param_k T
00487 , ss_size_t N0
00488 , ss_size_t N1
00489 , ss_size_t N2
00490 #ifdef STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT
00491 , ss_typename_param_k P = do_construction<T>
00492 , ss_typename_param_k M = T[N0 * N1 * N2]
00493 #else
00494 , ss_typename_param_k P
00495 , ss_typename_param_k M
00496 #endif
00497 >
00498 class static_array_3d
00499 : public null_allocator<T>
00500 , public stl_collection_tag
00501 {
00502 public:
00503 typedef static_array_3d<T, N0, N1, N2, P, M> class_type;
00504 typedef static_array_2d<T, N1, N2, P, T*> dimension_type;
00505 typedef null_allocator<T> allocator_type;
00506 typedef P policy_type;
00507
00508 typedef T value_type;
00509 typedef value_type& reference;
00510 typedef value_type const& const_reference;
00511 typedef value_type* pointer;
00512 typedef value_type const* const_pointer;
00513 typedef ss_size_t size_type;
00514 typedef ss_size_t index_type;
00515 typedef ss_ptrdiff_t difference_type;
00516
00517 typedef
00518 #if !defined(STLSOFT_COMPILER_IS_BORLAND)
00519 ss_typename_type_k
00520 #endif
00521 pointer_iterator < value_type
00522 , pointer
00523 , reference
00524 >::type iterator;
00525 typedef
00526 #if !defined(STLSOFT_COMPILER_IS_BORLAND)
00527 ss_typename_type_k
00528 #endif
00529 pointer_iterator < value_type const
00530 , const_pointer
00531 , const_reference
00532 >::type const_iterator;
00533
00534 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00535 typedef reverse_iterator_base < iterator
00536 , value_type
00537 , reference
00538 , pointer
00539 , difference_type
00540 > reverse_iterator;
00541
00542 typedef const_reverse_iterator_base < const_iterator
00543 , value_type const
00544 , const_reference
00545 , const_pointer
00546 , difference_type
00547 > const_reverse_iterator;
00548 #endif
00549
00550
00551
00552
00553 static_array_3d(T *data);
00554 public:
00555 static_array_3d();
00556 static_array_3d(value_type const& t);
00557 static_array_3d(class_type const& rhs);
00558 ~static_array_3d() stlsoft_throw_0();
00559
00560
00561 public:
00562 reference at(index_type i0, index_type i1, index_type i2);
00563 const_reference at(index_type i0, index_type i1, index_type i2) const;
00564
00565 reference at_unchecked(index_type i0, index_type i1, index_type i2);
00566 const_reference at_unchecked(index_type i0, index_type i1, index_type i2) const;
00567
00568 dimension_type at(index_type i0);
00569 const dimension_type at(index_type i0) const;
00570
00571 dimension_type at_unchecked(index_type i0);
00572 const dimension_type at_unchecked(index_type i0) const;
00573
00574 dimension_type operator [](index_type i0);
00575 const dimension_type operator [](index_type i0) const;
00576
00577 reference front();
00578 reference back();
00579 const_reference front() const;
00580 const_reference back() const;
00581
00582
00583 public:
00584 static index_type dimension0();
00585 static index_type dimension1();
00586 static index_type dimension2();
00587 static index_type size();
00588 static ss_bool_t empty();
00589 static size_type max_size();
00590
00591
00592 public:
00593 iterator begin();
00594 iterator end();
00595 const_iterator begin() const;
00596 const_iterator end() const;
00597
00598 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00599 reverse_iterator rbegin();
00600 reverse_iterator rend();
00601 const_reverse_iterator rbegin() const;
00602 const_reverse_iterator rend() const;
00603 #endif
00604
00605
00606 public:
00607 value_type const *data() const;
00608
00609
00610 protected:
00611 pointer data_();
00612 index_type calc_index_(index_type i0, index_type i1, index_type i2) const;
00613 void range_check_(index_type i0, index_type i1, index_type i2) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) );
00614 void range_check_(index_type i0) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) );
00615
00616
00617 private:
00618 M m_data;
00619
00620
00621 private:
00622 class_type const& operator =(class_type const& rhs);
00623 };
00624
00625
00626
00637 template< ss_typename_param_k T
00638 , ss_size_t N0
00639 , ss_size_t N1
00640 , ss_size_t N2
00641 , ss_size_t N3
00642 #ifdef STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT
00643 , ss_typename_param_k P = do_construction<T>
00644 , ss_typename_param_k M = T[N0 * N1 * N2 * N3]
00645 #else
00646 , ss_typename_param_k P
00647 , ss_typename_param_k M
00648 #endif
00649 >
00650 class static_array_4d
00651 : public null_allocator<T>
00652 , public stl_collection_tag
00653 {
00654 public:
00655 typedef static_array_4d<T, N0, N1, N2, N3, P, M> class_type;
00656 typedef static_array_3d<T, N1, N2, N3, P, T*> dimension_type;
00657 typedef null_allocator<T> allocator_type;
00658 typedef P policy_type;
00659
00660 typedef T value_type;
00661 typedef value_type& reference;
00662 typedef value_type const& const_reference;
00663 typedef value_type* pointer;
00664 typedef value_type const* const_pointer;
00665 typedef ss_size_t size_type;
00666 typedef ss_size_t index_type;
00667 typedef ss_ptrdiff_t difference_type;
00668
00669 typedef
00670 #if !defined(STLSOFT_COMPILER_IS_BORLAND)
00671 ss_typename_type_k
00672 #endif
00673 pointer_iterator < value_type
00674 , pointer
00675 , reference
00676 >::type iterator;
00677 typedef
00678 #if !defined(STLSOFT_COMPILER_IS_BORLAND)
00679 ss_typename_type_k
00680 #endif
00681 pointer_iterator < value_type const
00682 , const_pointer
00683 , const_reference
00684 >::type const_iterator;
00685
00686 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00687 typedef reverse_iterator_base < iterator
00688 , value_type
00689 , reference
00690 , pointer
00691 , difference_type
00692 > reverse_iterator;
00693
00694 typedef const_reverse_iterator_base < const_iterator
00695 , value_type const
00696 , const_reference
00697 , const_pointer
00698 , difference_type
00699 > const_reverse_iterator;
00700 #endif
00701
00702
00703
00704
00705 static_array_4d(T *data);
00706 public:
00707 static_array_4d();
00708 static_array_4d(value_type const& t);
00709 static_array_4d(class_type const& rhs);
00710 ~static_array_4d() stlsoft_throw_0();
00711
00712
00713 public:
00714 reference at(index_type i0, index_type i1, index_type i2, index_type i3);
00715 const_reference at(index_type i0, index_type i1, index_type i2, index_type i3) const;
00716
00717 reference at_unchecked(index_type i0, index_type i1, index_type i2, index_type i3);
00718 const_reference at_unchecked(index_type i0, index_type i1, index_type i2, index_type i3) const;
00719
00720 dimension_type at(index_type i0);
00721 const dimension_type at(index_type i0) const;
00722
00723 dimension_type at_unchecked(index_type i0);
00724 const dimension_type at_unchecked(index_type i0) const;
00725
00726 dimension_type operator [](index_type i0);
00727 const dimension_type operator [](index_type i0) const;
00728
00729 reference front();
00730 reference back();
00731 const_reference front() const;
00732 const_reference back() const;
00733
00734
00735 public:
00736 static index_type dimension0();
00737 static index_type dimension1();
00738 static index_type dimension2();
00739 static index_type dimension3();
00740 static index_type size();
00741 static ss_bool_t empty();
00742 static size_type max_size();
00743
00744
00745 public:
00746 iterator begin();
00747 iterator end();
00748 const_iterator begin() const;
00749 const_iterator end() const;
00750
00751 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00752 reverse_iterator rbegin();
00753 reverse_iterator rend();
00754 const_reverse_iterator rbegin() const;
00755 const_reverse_iterator rend() const;
00756 #endif
00757
00758
00759 public:
00760 value_type const *data() const;
00761
00762
00763 protected:
00764 pointer data_();
00765 index_type calc_index_(index_type i0, index_type i1, index_type i2, index_type i3) const;
00766 void range_check_(index_type i0, index_type i1, index_type i2, index_type i3) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) );
00767 void range_check_(index_type i0, index_type i1, index_type i2) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) );
00768 void range_check_(index_type i0) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) );
00769
00770
00771 private:
00772 M m_data;
00773
00774
00775 private:
00776 class_type const& operator =(class_type const& rhs);
00777 };
00778
00779
00780
00781
00782
00783 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00784
00785
00786
00787 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00788 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::pointer static_array_1d<T, N0, P, M>::data_()
00789 {
00790 return &m_data[0];
00791 }
00792
00793 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00794 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::index_type static_array_1d<T, N0, P, M>::calc_index_(ss_typename_type_k static_array_1d<T, N0, P, M>::index_type i0) const
00795 {
00796 return i0;
00797 }
00798
00799 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00800 inline void static_array_1d<T, N0, P, M>::range_check_(ss_typename_type_k static_array_1d<T, N0, P, M>::index_type i0) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) )
00801 {
00802 STLSOFT_SUPPRESS_UNUSED(i0);
00803
00804 #ifdef STLSOFT_CF_EXCEPTION_SUPPORT
00805 if(!(i0 < N0))
00806 {
00807 STLSOFT_THROW_X(stlsoft_ns_qual_std(out_of_range)("static array index out of range"));
00808 }
00809 #else
00810 STLSOFT_MESSAGE_ASSERT("static array index out of range", i0 < N0);
00811 #endif
00812 }
00813
00814 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00815 inline static_array_1d<T, N0, P, M>::static_array_1d(T *data)
00816 : m_data(data)
00817 {}
00818
00819 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00820 inline static_array_1d<T, N0, P, M>::static_array_1d()
00821 {
00822 array_range_initialiser<T, allocator_type, P>::construct(*this, data_(), size());
00823 }
00824
00825 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00826 inline static_array_1d<T, N0, P, M>::static_array_1d(value_type const& t)
00827 {
00828 array_range_initialiser<T, allocator_type, P>::construct(*this, data_(), size(), t);
00829 }
00830
00831 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00832 inline static_array_1d<T, N0, P, M>::static_array_1d(static_array_1d<T, N0, P, M> const& rhs)
00833 {
00834 array_range_initialiser<T, allocator_type, P>::copy_construct(*this, data_(), rhs.data(), size());
00835 }
00836
00837 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00838 inline static_array_1d<T, N0, P, M>::~static_array_1d() stlsoft_throw_0()
00839 {
00840 if(!is_pointer_type<M>::value)
00841 {
00842 array_range_initialiser<T, allocator_type, P>::destroy(*this, data_(), size());
00843 }
00844 }
00845
00846 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00847 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::value_type &static_array_1d<T, N0, P, M>::at(ss_typename_type_k static_array_1d<T, N0, P, M>::index_type i0)
00848 {
00849 range_check_(i0);
00850
00851 return m_data[i0];
00852 }
00853
00854 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00855 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::value_type const& static_array_1d<T, N0, P, M>::at(ss_typename_type_k static_array_1d<T, N0, P, M>::index_type i0) const
00856 {
00857 range_check_(i0);
00858
00859 return m_data[i0];
00860 }
00861
00862 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00863 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::value_type &static_array_1d<T, N0, P, M>::at_unchecked(ss_typename_type_k static_array_1d<T, N0, P, M>::index_type i0)
00864 {
00865 STLSOFT_MESSAGE_ASSERT("static array index out of range", i0 < N0);
00866
00867 return m_data[i0];
00868 }
00869
00870 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00871 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::value_type const& static_array_1d<T, N0, P, M>::at_unchecked(ss_typename_type_k static_array_1d<T, N0, P, M>::index_type i0) const
00872 {
00873 STLSOFT_MESSAGE_ASSERT("static array index out of range", i0 < N0);
00874
00875 return m_data[i0];
00876 }
00877
00878 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00879 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::value_type &static_array_1d<T, N0, P, M>::operator [](ss_typename_type_k static_array_1d<T, N0, P, M>::index_type i0)
00880 {
00881 STLSOFT_MESSAGE_ASSERT("static array index out of range", i0 < N0);
00882
00883 return m_data[i0];
00884 }
00885
00886 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00887 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::value_type const& static_array_1d<T, N0, P, M>::operator [](ss_typename_type_k static_array_1d<T, N0, P, M>::index_type i0) const
00888 {
00889 STLSOFT_MESSAGE_ASSERT("static array index out of range", i0 < N0);
00890
00891 return m_data[i0];
00892 }
00893
00894 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00895 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::reference static_array_1d<T, N0, P, M>::front()
00896 {
00897 return at(0);
00898 }
00899
00900 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00901 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::reference static_array_1d<T, N0, P, M>::back()
00902 {
00903 return at(N0 - 1);
00904 }
00905
00906 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00907 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::const_reference static_array_1d<T, N0, P, M>::front() const
00908 {
00909 return at(0);
00910 }
00911
00912 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00913 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::const_reference static_array_1d<T, N0, P, M>::back() const
00914 {
00915 return at(N0 - 1);
00916 }
00917
00918 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00919 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::index_type static_array_1d<T, N0, P, M>::dimension0()
00920 {
00921 return N0;
00922 }
00923
00924 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00925 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::index_type static_array_1d<T, N0, P, M>::size()
00926 {
00927 return N0;
00928 }
00929
00930 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00931 inline ss_bool_t static_array_1d<T, N0, P, M>::empty()
00932 {
00933 return false;
00934 }
00935
00936 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00937 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::index_type static_array_1d<T, N0, P, M>::max_size()
00938 {
00939 return size();
00940 }
00941
00942 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00943 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::iterator static_array_1d<T, N0, P, M>::begin()
00944 {
00945 return m_data;
00946 }
00947
00948 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00949 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::iterator static_array_1d<T, N0, P, M>::end()
00950 {
00951 return m_data + size();
00952 }
00953
00954 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00955 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::const_iterator static_array_1d<T, N0, P, M>::begin() const
00956 {
00957 return m_data;
00958 }
00959
00960 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00961 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::const_iterator static_array_1d<T, N0, P, M>::end() const
00962 {
00963 return m_data + size();
00964 }
00965
00966 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
00967 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00968 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::reverse_iterator static_array_1d<T, N0, P, M>::rbegin()
00969 {
00970 return reverse_iterator(end());
00971 }
00972
00973 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00974 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::reverse_iterator static_array_1d<T, N0, P, M>::rend()
00975 {
00976 return reverse_iterator(begin());
00977 }
00978
00979 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00980 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::const_reverse_iterator static_array_1d<T, N0, P, M>::rbegin() const
00981 {
00982 return const_reverse_iterator(end());
00983 }
00984
00985 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00986 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::const_reverse_iterator static_array_1d<T, N0, P, M>::rend() const
00987 {
00988 return const_reverse_iterator(begin());
00989 }
00990 #endif
00991
00992 template <ss_typename_param_k T, ss_size_t N0, ss_typename_param_k P, ss_typename_param_k M>
00993 inline ss_typename_type_ret_k static_array_1d<T, N0, P, M>::value_type const* static_array_1d<T, N0, P, M>::data() const
00994 {
00995 return m_data;
00996 }
00997
00998
00999
01000
01001 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01002 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::pointer static_array_2d<T, N0, N1, P, M>::data_()
01003 {
01004 return &m_data[0];
01005 }
01006
01007 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01008 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::index_type static_array_2d<T, N0, N1, P, M>::calc_index_(ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0, ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i1) const
01009 {
01010 return (i0 * N1) + i1;
01011 }
01012
01013 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01014 inline void static_array_2d<T, N0, N1, P, M>::range_check_(ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0, ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i1) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) )
01015 {
01016 STLSOFT_SUPPRESS_UNUSED(i0); STLSOFT_SUPPRESS_UNUSED(i1);
01017
01018 #ifdef STLSOFT_CF_EXCEPTION_SUPPORT
01019 if( !(i0 < N0) ||
01020 !(i1 < N1))
01021 {
01022 STLSOFT_THROW_X(stlsoft_ns_qual_std(out_of_range)("static array index out of range"));
01023 }
01024 #else
01025 STLSOFT_MESSAGE_ASSERT("static array index out of range", (i0 < N0 && i1 < N1));
01026 #endif
01027 }
01028
01029 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01030 inline void static_array_2d<T, N0, N1, P, M>::range_check_(ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) )
01031 {
01032 STLSOFT_SUPPRESS_UNUSED(i0);
01033
01034 #ifdef STLSOFT_CF_EXCEPTION_SUPPORT
01035 if(!(i0 < N0))
01036 {
01037 STLSOFT_THROW_X(stlsoft_ns_qual_std(out_of_range)("static array index out of range"));
01038 }
01039 #else
01040 STLSOFT_MESSAGE_ASSERT("static array index out of range", i0 < N0);
01041 #endif
01042 }
01043
01044 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01045 inline static_array_2d<T, N0, N1, P, M>::static_array_2d(T *data)
01046 : m_data(data)
01047 {}
01048
01049 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01050 inline static_array_2d<T, N0, N1, P, M>::static_array_2d()
01051 {
01052 array_range_initialiser<T, allocator_type, P>::construct(*this, data_(), size());
01053 }
01054
01055 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01056 inline static_array_2d<T, N0, N1, P, M>::static_array_2d(value_type const& t)
01057 {
01058 array_range_initialiser<T, allocator_type, P>::construct(*this, data_(), size(), t);
01059 }
01060
01061 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01062 inline static_array_2d<T, N0, N1, P, M>::static_array_2d(static_array_2d<T, N0, N1, P, M> const& rhs)
01063 {
01064 array_range_initialiser<T, allocator_type, P>::copy_construct(*this, data_(), rhs.data(), size());
01065 }
01066
01067 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01068 inline static_array_2d<T, N0, N1, P, M>::~static_array_2d() stlsoft_throw_0()
01069 {
01070 if(!is_pointer_type<M>::value)
01071 {
01072 array_range_initialiser<T, allocator_type, P>::destroy(*this, data_(), size());
01073 }
01074 }
01075
01076 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01077 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::reference static_array_2d<T, N0, N1, P, M>::at(ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0, ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i1)
01078 {
01079 range_check_(i0, i1);
01080
01081 return *(m_data + calc_index_(i0, i1));
01082 }
01083
01084 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01085 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::const_reference static_array_2d<T, N0, N1, P, M>::at(ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0, ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i1) const
01086 {
01087 range_check_(i0, i1);
01088
01089 return *(m_data + calc_index_(i0, i1));
01090 }
01091
01092 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01093 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::reference static_array_2d<T, N0, N1, P, M>::at_unchecked(ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0, ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i1)
01094 {
01095 STLSOFT_MESSAGE_ASSERT("static array index out of range", (i0 < N0 && i1 < N1));
01096
01097 return *(m_data + calc_index_(i0, i1));
01098 }
01099
01100 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01101 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::const_reference static_array_2d<T, N0, N1, P, M>::at_unchecked(ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0, ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i1) const
01102 {
01103 STLSOFT_MESSAGE_ASSERT("static array index out of range", (i0 < N0 && i1 < N1));
01104
01105 return *(m_data + calc_index_(i0, i1));
01106 }
01107
01108 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01109 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::dimension_type static_array_2d<T, N0, N1, P, M>::at(ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0)
01110 {
01111 range_check_(i0);
01112
01113 return dimension_type(m_data + i0 * N1);
01114 }
01115
01116 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01117 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::dimension_type const static_array_2d<T, N0, N1, P, M>::at(ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0) const
01118 {
01119 range_check_(i0);
01120
01121 return dimension_type(m_data + i0 * N1);
01122 }
01123
01124 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01125 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::dimension_type static_array_2d<T, N0, N1, P, M>::at_unchecked(ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0)
01126 {
01127 return dimension_type(m_data + i0 * N1);
01128 }
01129
01130 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01131 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::dimension_type const static_array_2d<T, N0, N1, P, M>::at_unchecked(ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0) const
01132 {
01133 return dimension_type(m_data + i0 * N1);
01134 }
01135
01136 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01137 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::dimension_type static_array_2d<T, N0, N1, P, M>::operator [](ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0)
01138 {
01139 return dimension_type(m_data + i0 * N1);
01140 }
01141
01142 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01143 inline const ss_typename_type_k static_array_2d<T, N0, N1, P, M>::dimension_type static_array_2d<T, N0, N1, P, M>::operator [](ss_typename_type_k static_array_2d<T, N0, N1, P, M>::index_type i0) const
01144 {
01145 return dimension_type(m_data + i0 * N1);
01146 }
01147
01148 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01149 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::reference static_array_2d<T, N0, N1, P, M>::front()
01150 {
01151 return at(0, 0);
01152 }
01153
01154 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01155 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::reference static_array_2d<T, N0, N1, P, M>::back()
01156 {
01157 return at(N0 - 1, N1 - 1);
01158 }
01159
01160 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01161 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::const_reference static_array_2d<T, N0, N1, P, M>::front() const
01162 {
01163 return at(0, 0);
01164 }
01165
01166 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01167 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::const_reference static_array_2d<T, N0, N1, P, M>::back() const
01168 {
01169 return at(N0 - 1, N1 - 1);
01170 }
01171
01172 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01173 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::index_type static_array_2d<T, N0, N1, P, M>::dimension0()
01174 {
01175 return N0;
01176 }
01177
01178 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01179 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::index_type static_array_2d<T, N0, N1, P, M>::dimension1()
01180 {
01181 return N1;
01182 }
01183
01184 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01185 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::index_type static_array_2d<T, N0, N1, P, M>::size()
01186 {
01187 return N0 * N1;
01188 }
01189
01190 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01191 inline ss_bool_t static_array_2d<T, N0, N1, P, M>::empty()
01192 {
01193 return false;
01194 }
01195
01196 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01197 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::index_type static_array_2d<T, N0, N1, P, M>::max_size()
01198 {
01199 return size();
01200 }
01201
01202 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01203 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::iterator static_array_2d<T, N0, N1, P, M>::begin()
01204 {
01205 return m_data;
01206 }
01207
01208 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01209 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::iterator static_array_2d<T, N0, N1, P, M>::end()
01210 {
01211 return m_data + size();
01212 }
01213
01214 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01215 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::const_iterator static_array_2d<T, N0, N1, P, M>::begin() const
01216 {
01217 return m_data;
01218 }
01219
01220 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01221 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::const_iterator static_array_2d<T, N0, N1, P, M>::end() const
01222 {
01223 return m_data + size();
01224 }
01225
01226 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
01227 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01228 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::reverse_iterator static_array_2d<T, N0, N1, P, M>::rbegin()
01229 {
01230 return reverse_iterator(end());
01231 }
01232
01233 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01234 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::reverse_iterator static_array_2d<T, N0, N1, P, M>::rend()
01235 {
01236 return reverse_iterator(begin());
01237 }
01238
01239 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01240 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::const_reverse_iterator static_array_2d<T, N0, N1, P, M>::rbegin() const
01241 {
01242 return const_reverse_iterator(end());
01243 }
01244
01245 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01246 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::const_reverse_iterator static_array_2d<T, N0, N1, P, M>::rend() const
01247 {
01248 return const_reverse_iterator(begin());
01249 }
01250 #endif
01251
01252 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_typename_param_k P, ss_typename_param_k M>
01253 inline ss_typename_type_ret_k static_array_2d<T, N0, N1, P, M>::value_type const* static_array_2d<T, N0, N1, P, M>::data() const
01254 {
01255 return m_data;
01256 }
01257
01258
01259
01260 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01261 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::pointer static_array_3d<T, N0, N1, N2, P, M>::data_()
01262 {
01263 return &m_data[0];
01264 }
01265
01266 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01267 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::index_type static_array_3d<T, N0, N1, N2, P, M>::calc_index_(ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0, ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i1, ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i2) const
01268 {
01269 return ((i0 * N1) + i1) * N2 + i2;
01270 }
01271
01272 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01273 inline void static_array_3d<T, N0, N1, N2, P, M>::range_check_(ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0, ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i1, ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i2) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) )
01274 {
01275 STLSOFT_SUPPRESS_UNUSED(i0); STLSOFT_SUPPRESS_UNUSED(i1); STLSOFT_SUPPRESS_UNUSED(i2);
01276
01277 #ifdef STLSOFT_CF_EXCEPTION_SUPPORT
01278 if( !(i0 < N0) ||
01279 !(i1 < N1) ||
01280 !(i2 < N2))
01281 {
01282 STLSOFT_THROW_X(stlsoft_ns_qual_std(out_of_range)("static array index out of range"));
01283 }
01284 #else
01285 STLSOFT_MESSAGE_ASSERT("static array index out of range", (i0 < N0 && i1 < N1 && i2 < N2));
01286 #endif
01287 }
01288
01289 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01290 inline void static_array_3d<T, N0, N1, N2, P, M>::range_check_(ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) )
01291 {
01292 STLSOFT_SUPPRESS_UNUSED(i0);
01293
01294 #ifdef STLSOFT_CF_EXCEPTION_SUPPORT
01295 if(!(i0 < N0))
01296 {
01297 STLSOFT_THROW_X(stlsoft_ns_qual_std(out_of_range)("static array index out of range"));
01298 }
01299 #else
01300 STLSOFT_MESSAGE_ASSERT("static array index out of range", i0 < N0);
01301 #endif
01302 }
01303
01304 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01305 inline static_array_3d<T, N0, N1, N2, P, M>::static_array_3d(T *data)
01306 : m_data(data)
01307 {}
01308
01309 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01310 inline static_array_3d<T, N0, N1, N2, P, M>::static_array_3d()
01311 {
01312 array_range_initialiser<T, allocator_type, P>::construct(*this, data_(), size());
01313 }
01314
01315 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01316 inline static_array_3d<T, N0, N1, N2, P, M>::static_array_3d(value_type const& t)
01317 {
01318 array_range_initialiser<T, allocator_type, P>::construct(*this, data_(), size(), t);
01319 }
01320
01321 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01322 inline static_array_3d<T, N0, N1, N2, P, M>::static_array_3d(static_array_3d<T, N0, N1, N2, P, M> const& rhs)
01323 {
01324 array_range_initialiser<T, allocator_type, P>::copy_construct(*this, data_(), rhs.data(), size());
01325 }
01326
01327 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01328 inline static_array_3d<T, N0, N1, N2, P, M>::~static_array_3d() stlsoft_throw_0()
01329 {
01330 if(!is_pointer_type<M>::value)
01331 {
01332 array_range_initialiser<T, allocator_type, P>::destroy(*this, data_(), size());
01333 }
01334 }
01335
01336 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01337 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::value_type &static_array_3d<T, N0, N1, N2, P, M>::at(ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0, ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i1, ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i2)
01338 {
01339 range_check_(i0, i1, i2);
01340
01341 return *(m_data + calc_index_(i0, i1, i2));
01342 }
01343
01344 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01345 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::value_type const& static_array_3d<T, N0, N1, N2, P, M>::at(ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0, ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i1, ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i2) const
01346 {
01347 range_check_(i0, i1, i2);
01348
01349 return *(m_data + calc_index_(i0, i1, i2));
01350 }
01351
01352 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01353 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::value_type &static_array_3d<T, N0, N1, N2, P, M>::at_unchecked(ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0, ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i1, ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i2)
01354 {
01355 STLSOFT_MESSAGE_ASSERT("static array index out of range", (i0 < N0 && i1 < N1 && i2 < N2));
01356
01357 return *(m_data + calc_index_(i0, i1, i2));
01358 }
01359
01360 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01361 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::value_type const& static_array_3d<T, N0, N1, N2, P, M>::at_unchecked(ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0, ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i1, ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i2) const
01362 {
01363 STLSOFT_MESSAGE_ASSERT("static array index out of range", (i0 < N0 && i1 < N1 && i2 < N2));
01364
01365 return *(m_data + calc_index_(i0, i1, i2));
01366 }
01367
01368 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01369 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::dimension_type static_array_3d<T, N0, N1, N2, P, M>::at(ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0)
01370 {
01371 range_check_(i0);
01372
01373 return dimension_type(m_data + i0 * N1 * N2);
01374 }
01375
01376 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01377 inline const ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::dimension_type static_array_3d<T, N0, N1, N2, P, M>::at(ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0) const
01378 {
01379 range_check_(i0);
01380
01381 return dimension_type(m_data + i0 * N1 * N2);
01382 }
01383
01384 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01385 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::dimension_type static_array_3d<T, N0, N1, N2, P, M>::at_unchecked(ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0)
01386 {
01387 return dimension_type(m_data + i0 * N1 * N2);
01388 }
01389
01390 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01391 inline const ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::dimension_type static_array_3d<T, N0, N1, N2, P, M>::at_unchecked(ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0) const
01392 {
01393 return dimension_type(m_data + i0 * N1 * N2);
01394 }
01395
01396 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01397 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::dimension_type static_array_3d<T, N0, N1, N2, P, M>::operator [](ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0)
01398 {
01399 return dimension_type(m_data + i0 * N1 * N2);
01400 }
01401
01402 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01403 inline const ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::dimension_type static_array_3d<T, N0, N1, N2, P, M>::operator [](ss_typename_type_k static_array_3d<T, N0, N1, N2, P, M>::index_type i0) const
01404 {
01405 return dimension_type(m_data + i0 * N1 * N2);
01406 }
01407
01408 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01409 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::reference static_array_3d<T, N0, N1, N2, P, M>::front()
01410 {
01411 return at(0, 0, 0);
01412 }
01413
01414 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01415 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::reference static_array_3d<T, N0, N1, N2, P, M>::back()
01416 {
01417 return at(N0 - 1, N1 - 1, N2 - 1);
01418 }
01419
01420 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01421 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::const_reference static_array_3d<T, N0, N1, N2, P, M>::front() const
01422 {
01423 return at(0, 0, 0);
01424 }
01425
01426 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01427 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::const_reference static_array_3d<T, N0, N1, N2, P, M>::back() const
01428 {
01429 return at(N0 - 1, N1 - 1, N2 - 1);
01430 }
01431
01432 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01433 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::index_type static_array_3d<T, N0, N1, N2, P, M>::dimension0()
01434 {
01435 return N0;
01436 }
01437
01438 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01439 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::index_type static_array_3d<T, N0, N1, N2, P, M>::dimension1()
01440 {
01441 return N1;
01442 }
01443
01444 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01445 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::index_type static_array_3d<T, N0, N1, N2, P, M>::dimension2()
01446 {
01447 return N2;
01448 }
01449
01450 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01451 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::index_type static_array_3d<T, N0, N1, N2, P, M>::size()
01452 {
01453 return N0 * N1 * N2;
01454 }
01455
01456 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01457 inline ss_bool_t static_array_3d<T, N0, N1, N2, P, M>::empty()
01458 {
01459 return false;
01460 }
01461
01462 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01463 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::index_type static_array_3d<T, N0, N1, N2, P, M>::max_size()
01464 {
01465 return size();
01466 }
01467
01468 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01469 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::iterator static_array_3d<T, N0, N1, N2, P, M>::begin()
01470 {
01471 return m_data;
01472 }
01473
01474 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01475 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::iterator static_array_3d<T, N0, N1, N2, P, M>::end()
01476 {
01477 return m_data + size();
01478 }
01479
01480 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01481 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::const_iterator static_array_3d<T, N0, N1, N2, P, M>::begin() const
01482 {
01483 return m_data;
01484 }
01485
01486 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01487 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::const_iterator static_array_3d<T, N0, N1, N2, P, M>::end() const
01488 {
01489 return m_data + size();
01490 }
01491
01492 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
01493 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01494 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::reverse_iterator static_array_3d<T, N0, N1, N2, P, M>::rbegin()
01495 {
01496 return reverse_iterator(end());
01497 }
01498
01499 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01500 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::reverse_iterator static_array_3d<T, N0, N1, N2, P, M>::rend()
01501 {
01502 return reverse_iterator(begin());
01503 }
01504
01505 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01506 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::const_reverse_iterator static_array_3d<T, N0, N1, N2, P, M>::rbegin() const
01507 {
01508 return const_reverse_iterator(end());
01509 }
01510
01511 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01512 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::const_reverse_iterator static_array_3d<T, N0, N1, N2, P, M>::rend() const
01513 {
01514 return const_reverse_iterator(begin());
01515 }
01516 #endif
01517
01518 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_typename_param_k P, ss_typename_param_k M>
01519 inline ss_typename_type_ret_k static_array_3d<T, N0, N1, N2, P, M>::value_type const* static_array_3d<T, N0, N1, N2, P, M>::data() const
01520 {
01521 return m_data;
01522 }
01523
01524
01525
01526 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01527 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::pointer static_array_4d<T, N0, N1, N2, N3, P, M>::data_()
01528 {
01529 return &m_data[0];
01530 }
01531
01532 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01533 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type static_array_4d<T, N0, N1, N2, N3, P, M>::calc_index_(ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i1, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i2, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i3) const
01534 {
01535 return (((i0 * N1) + i1) * N2 + i2) * N3 + i3;
01536 }
01537
01538 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01539 inline void static_array_4d<T, N0, N1, N2, N3, P, M>::range_check_(ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i1, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i2, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i3) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) )
01540 {
01541 STLSOFT_SUPPRESS_UNUSED(i0); STLSOFT_SUPPRESS_UNUSED(i1); STLSOFT_SUPPRESS_UNUSED(i2); STLSOFT_SUPPRESS_UNUSED(i3);
01542
01543 #ifdef STLSOFT_CF_EXCEPTION_SUPPORT
01544 if( !(i0 < N0) ||
01545 !(i1 < N1) ||
01546 !(i2 < N2) ||
01547 !(i3 < N3))
01548 {
01549 STLSOFT_THROW_X(stlsoft_ns_qual_std(out_of_range)("static array index out of range"));
01550 }
01551 #else
01552 STLSOFT_MESSAGE_ASSERT("static array index out of range", (i0 < N0 && i1 < N1 && i2 < N2 && i3 < N3));
01553 #endif
01554 }
01555
01556 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01557 inline void static_array_4d<T, N0, N1, N2, N3, P, M>::range_check_(ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0) const stlsoft_throw_1(stlsoft_ns_qual_std(out_of_range) )
01558 {
01559 STLSOFT_SUPPRESS_UNUSED(i0);
01560
01561 #ifdef STLSOFT_CF_EXCEPTION_SUPPORT
01562 if(!(i0 < N0))
01563 {
01564 STLSOFT_THROW_X(stlsoft_ns_qual_std(out_of_range)("static array index out of range"));
01565 }
01566 #else
01567 STLSOFT_MESSAGE_ASSERT("static array index out of range", i0 < N0);
01568 #endif
01569 }
01570
01571 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01572 inline static_array_4d<T, N0, N1, N2, N3, P, M>::static_array_4d()
01573 {
01574 array_range_initialiser<T, allocator_type, P>::construct(*this, data_(), size());
01575 }
01576
01577 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01578 inline static_array_4d<T, N0, N1, N2, N3, P, M>::static_array_4d(value_type const& t)
01579 {
01580 array_range_initialiser<T, allocator_type, P>::construct(*this, data_(), size(), t);
01581 }
01582
01583 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01584 inline static_array_4d<T, N0, N1, N2, N3, P, M>::static_array_4d(static_array_4d<T, N0, N1, N2, N3, P, M> const& rhs)
01585 {
01586 array_range_initialiser<T, allocator_type, P>::copy_construct(*this, data_(), rhs.data(), size());
01587 }
01588
01589 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01590 inline static_array_4d<T, N0, N1, N2, N3, P, M>::~static_array_4d() stlsoft_throw_0()
01591 {
01592 if(!is_pointer_type<M>::value)
01593 {
01594 array_range_initialiser<T, allocator_type, P>::destroy(*this, data_(), size());
01595 }
01596 }
01597
01598 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01599 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::value_type &static_array_4d<T, N0, N1, N2, N3, P, M>::at(ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i1, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i2, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i3)
01600 {
01601 range_check_(i0, i1, i2, i3);
01602
01603 return *(m_data + calc_index_(i0, i1, i2, i3));
01604 }
01605
01606 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01607 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::value_type const& static_array_4d<T, N0, N1, N2, N3, P, M>::at(ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i1, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i2, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i3) const
01608 {
01609 range_check_(i0, i1, i2, i3);
01610
01611 return *(m_data + calc_index_(i0, i1, i2, i3));
01612 }
01613
01614 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01615 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::value_type &static_array_4d<T, N0, N1, N2, N3, P, M>::at_unchecked(ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i1, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i2, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i3)
01616 {
01617 STLSOFT_MESSAGE_ASSERT("static array index out of range", (i0 < N0 && i1 < N1 && i2 < N2 && i3 < N3));
01618
01619 return *(m_data + calc_index_(i0, i1, i2, i3));
01620 }
01621
01622 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01623 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::value_type const& static_array_4d<T, N0, N1, N2, N3, P, M>::at_unchecked(ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i1, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i2, ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i3) const
01624 {
01625 STLSOFT_MESSAGE_ASSERT("static array index out of range", (i0 < N0 && i1 < N1 && i2 < N2 && i3 < N3));
01626
01627 return *(m_data + calc_index_(i0, i1, i2, i3));
01628 }
01629
01630 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01631 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::dimension_type static_array_4d<T, N0, N1, N2, N3, P, M>::at(ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0)
01632 {
01633 range_check_(i0);
01634
01635 return dimension_type(m_data + i0 * N1 * N2 * N3);
01636 }
01637
01638 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01639 inline const ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::dimension_type static_array_4d<T, N0, N1, N2, N3, P, M>::at(ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0) const
01640 {
01641 range_check_(i0);
01642
01643 return dimension_type(m_data + i0 * N1 * N2 * N3);
01644 }
01645
01646 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01647 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::dimension_type static_array_4d<T, N0, N1, N2, N3, P, M>::at_unchecked(ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0)
01648 {
01649 STLSOFT_MESSAGE_ASSERT("static array index out of range", i0 < N0);
01650
01651 return dimension_type(m_data + i0 * N1 * N2 * N3);
01652 }
01653
01654 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01655 inline const ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::dimension_type static_array_4d<T, N0, N1, N2, N3, P, M>::at_unchecked(ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0) const
01656 {
01657 STLSOFT_MESSAGE_ASSERT("static array index out of range", i0 < N0);
01658
01659 return dimension_type(m_data + i0 * N1 * N2 * N3);
01660 }
01661
01662 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01663 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::dimension_type static_array_4d<T, N0, N1, N2, N3, P, M>::operator [](ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0)
01664 {
01665 STLSOFT_MESSAGE_ASSERT("static array index out of range", i0 < N0);
01666
01667 return dimension_type(m_data + i0 * N1 * N2 * N3);
01668 }
01669
01670 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01671 inline const ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::dimension_type static_array_4d<T, N0, N1, N2, N3, P, M>::operator [](ss_typename_type_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type i0) const
01672 {
01673 STLSOFT_MESSAGE_ASSERT("static array index out of range", i0 < N0);
01674
01675 return dimension_type(m_data + i0 * N1 * N2 * N3);
01676 }
01677
01678 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01679 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::reference static_array_4d<T, N0, N1, N2, N3, P, M>::front()
01680 {
01681 return at(0, 0, 0, 0);
01682 }
01683
01684 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01685 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::reference static_array_4d<T, N0, N1, N2, N3, P, M>::back()
01686 {
01687 return at(N0 - 1, N1 - 1, N2 - 1, N3 - 1);
01688 }
01689
01690 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01691 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::const_reference static_array_4d<T, N0, N1, N2, N3, P, M>::front() const
01692 {
01693 return at(0, 0, 0, 0);
01694 }
01695
01696 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01697 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::const_reference static_array_4d<T, N0, N1, N2, N3, P, M>::back() const
01698 {
01699 return at(N0 - 1, N1 - 1, N2 - 1, N3 - 1);
01700 }
01701
01702 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01703 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type static_array_4d<T, N0, N1, N2, N3, P, M>::dimension0()
01704 {
01705 return N0;
01706 }
01707
01708 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01709 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type static_array_4d<T, N0, N1, N2, N3, P, M>::dimension1()
01710 {
01711 return N1;
01712 }
01713
01714 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01715 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type static_array_4d<T, N0, N1, N2, N3, P, M>::dimension2()
01716 {
01717 return N2;
01718 }
01719
01720 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01721 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type static_array_4d<T, N0, N1, N2, N3, P, M>::dimension3()
01722 {
01723 return N3;
01724 }
01725
01726 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01727 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type static_array_4d<T, N0, N1, N2, N3, P, M>::size()
01728 {
01729 return N0 * N1 * N2 * N3;
01730 }
01731
01732 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01733 inline ss_bool_t static_array_4d<T, N0, N1, N2, N3, P, M>::empty()
01734 {
01735 return false;
01736 }
01737
01738 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01739 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::index_type static_array_4d<T, N0, N1, N2, N3, P, M>::max_size()
01740 {
01741 return size();
01742 }
01743
01744 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01745 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::iterator static_array_4d<T, N0, N1, N2, N3, P, M>::begin()
01746 {
01747 return m_data;
01748 }
01749
01750 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01751 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::iterator static_array_4d<T, N0, N1, N2, N3, P, M>::end()
01752 {
01753 return m_data + size();
01754 }
01755
01756 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01757 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::const_iterator static_array_4d<T, N0, N1, N2, N3, P, M>::begin() const
01758 {
01759 return m_data;
01760 }
01761
01762 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01763 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::const_iterator static_array_4d<T, N0, N1, N2, N3, P, M>::end() const
01764 {
01765 return m_data + size();
01766 }
01767
01768 #ifdef STLSOFT_LF_BIDIRECTIONAL_ITERATOR_SUPPORT
01769 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01770 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::reverse_iterator static_array_4d<T, N0, N1, N2, N3, P, M>::rbegin()
01771 {
01772 return reverse_iterator(end());
01773 }
01774
01775 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01776 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::reverse_iterator static_array_4d<T, N0, N1, N2, N3, P, M>::rend()
01777 {
01778 return reverse_iterator(begin());
01779 }
01780
01781 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01782 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::const_reverse_iterator static_array_4d<T, N0, N1, N2, N3, P, M>::rbegin() const
01783 {
01784 return const_reverse_iterator(end());
01785 }
01786
01787 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01788 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::const_reverse_iterator static_array_4d<T, N0, N1, N2, N3, P, M>::rend() const
01789 {
01790 return const_reverse_iterator(begin());
01791 }
01792 #endif
01793
01794 template <ss_typename_param_k T, ss_size_t N0, ss_size_t N1, ss_size_t N2, ss_size_t N3, ss_typename_param_k P, ss_typename_param_k M>
01795 inline ss_typename_type_ret_k static_array_4d<T, N0, N1, N2, N3, P, M>::value_type const* static_array_4d<T, N0, N1, N2, N3, P, M>::data() const
01796 {
01797 return m_data;
01798 }
01799
01800 #endif
01801
01802
01803
01804
01805
01806 # if !defined(STLSOFT_COMPILER_IS_MSVC) || \
01807 _MSC_VER >= 1200
01808
01809 template< ss_typename_param_k T
01810 , ss_size_t N0
01811 , ss_typename_param_k P
01812 , ss_typename_param_k M
01813 >
01814 inline ss_size_t array_size(static_array_1d<T, N0, P, M> const& ar)
01815 {
01816 STLSOFT_SUPPRESS_UNUSED(ar);
01817
01818 return ar.size();
01819 }
01820
01821 template< ss_typename_param_k T
01822 , ss_size_t N0
01823 , ss_size_t N1
01824 , ss_typename_param_k P
01825 , ss_typename_param_k M
01826 >
01827 inline ss_size_t array_size(static_array_2d<T, N0, N1, P, M> const& ar)
01828 {
01829 STLSOFT_SUPPRESS_UNUSED(ar);
01830
01831 return ar.size();
01832 }
01833
01834 template< ss_typename_param_k T
01835 , ss_size_t N0
01836 , ss_size_t N1
01837 , ss_size_t N2
01838 , ss_typename_param_k P
01839 , ss_typename_param_k M
01840 >
01841 inline ss_size_t array_size(static_array_3d<T, N0, N1, N2, P, M> const& ar)
01842 {
01843 STLSOFT_SUPPRESS_UNUSED(ar);
01844
01845 return ar.size();
01846 }
01847
01848 template< ss_typename_param_k T
01849 , ss_size_t N0
01850 , ss_size_t N1
01851 , ss_size_t N2
01852 , ss_size_t N3
01853 , ss_typename_param_k P
01854 , ss_typename_param_k M
01855 >
01856 inline ss_size_t array_size(static_array_4d<T, N0, N1, N2, N3, P, M> const& ar)
01857 {
01858 STLSOFT_SUPPRESS_UNUSED(ar);
01859
01860 return ar.size();
01861 }
01862
01863 #if 0
01864 template< ss_typename_param_k T
01865 , ss_size_t N0
01866 , ss_size_t N1
01867 , ss_size_t N2
01868 , ss_size_t N3
01869 , ss_size_t N4
01870 , ss_typename_param_k P
01871 , ss_typename_param_k M
01872 >
01873 inline ss_size_t array_size(static_array_5d<T, N0, N1, N2, N3, N4, P, M> const& ar)
01874 {
01875 STLSOFT_SUPPRESS_UNUSED(ar);
01876
01877 return ar.size();
01878 }
01879 #endif
01880
01881 #endif
01882
01884
01885
01886 #ifdef STLSOFT_UNITTEST
01887 # include "./unittest/static_array_unittest_.h"
01888 #endif
01889
01890
01891
01892 #ifndef _STLSOFT_NO_NAMESPACE
01893 }
01894 #endif
01895
01896
01897
01898 #endif
01899
01900