| 58 | |
| 59 | template<class T, std::size_t N> |
| 60 | class array { |
| 61 | public: |
| 62 | T elems[N]; // fixed-size array of elements of type T |
| 63 | |
| 64 | public: |
| 65 | // type definitions |
| 66 | typedef T value_type; |
| 67 | typedef T* iterator; |
| 68 | typedef const T* const_iterator; |
| 69 | typedef T& reference; |
| 70 | typedef const T& const_reference; |
| 71 | typedef std::size_t size_type; |
| 72 | typedef std::ptrdiff_t difference_type; |
| 73 | |
| 74 | // iterator support |
| 75 | iterator begin() { return elems; } |
| 76 | const_iterator begin() const { return elems; } |
| 77 | const_iterator cbegin() const { return elems; } |
| 78 | |
| 79 | iterator end() { return elems+N; } |
| 80 | const_iterator end() const { return elems+N; } |
| 81 | const_iterator cend() const { return elems+N; } |
| 82 | |
| 83 | // reverse iterator support |
| 84 | #if !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS) |
| 85 | typedef std::reverse_iterator<iterator> reverse_iterator; |
| 86 | typedef std::reverse_iterator<const_iterator> const_reverse_iterator; |
| 87 | #elif defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) |
| 88 | typedef std::reverse_iterator<iterator, std::random_access_iterator_tag, |
| 89 | value_type, reference, iterator, difference_type> reverse_iterator; |
| 90 | typedef std::reverse_iterator<const_iterator, std::random_access_iterator_tag, |
| 91 | value_type, const_reference, const_iterator, difference_type> const_reverse_iterator; |
| 92 | #else |
| 93 | // workaround for broken reverse_iterator implementations |
| 94 | typedef std::reverse_iterator<iterator,T> reverse_iterator; |
| 95 | typedef std::reverse_iterator<const_iterator,T> const_reverse_iterator; |
| 96 | #endif |
| 97 | |
| 98 | reverse_iterator rbegin() { return reverse_iterator(end()); } |
| 99 | const_reverse_iterator rbegin() const { |
| 100 | return const_reverse_iterator(end()); |
| 101 | } |
| 102 | const_reverse_iterator crbegin() const { |
| 103 | return const_reverse_iterator(end()); |
| 104 | } |
| 105 | |
| 106 | reverse_iterator rend() { return reverse_iterator(begin()); } |
| 107 | const_reverse_iterator rend() const { |
| 108 | return const_reverse_iterator(begin()); |
| 109 | } |
| 110 | const_reverse_iterator crend() const { |
| 111 | return const_reverse_iterator(begin()); |
| 112 | } |
| 113 | |
| 114 | // operator[] |
| 115 | reference operator[](size_type i) |
| 116 | { |
| 117 | return BOOST_ASSERT_MSG( i < N, "out of range" ), elems[i]; |