| 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_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !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(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310) |
| 88 | // workaround for broken reverse_iterator in VC7 |
| 89 | typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, iterator, |
| 90 | reference, iterator, reference> > reverse_iterator; |
| 91 | typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, const_iterator, |
| 92 | const_reference, iterator, reference> > const_reverse_iterator; |
| 93 | #elif defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) |
| 94 | typedef std::reverse_iterator<iterator, std::random_access_iterator_tag, |
| 95 | value_type, reference, iterator, difference_type> reverse_iterator; |
| 96 | typedef std::reverse_iterator<const_iterator, std::random_access_iterator_tag, |
| 97 | value_type, const_reference, const_iterator, difference_type> const_reverse_iterator; |
| 98 | #else |
| 99 | // workaround for broken reverse_iterator implementations |
| 100 | typedef std::reverse_iterator<iterator,T> reverse_iterator; |
| 101 | typedef std::reverse_iterator<const_iterator,T> const_reverse_iterator; |
| 102 | #endif |
| 103 | |
| 104 | reverse_iterator rbegin() { return reverse_iterator(end()); } |
| 105 | const_reverse_iterator rbegin() const { |
| 106 | return const_reverse_iterator(end()); |
| 107 | } |
| 108 | const_reverse_iterator crbegin() const { |
| 109 | return const_reverse_iterator(end()); |
| 110 | } |
| 111 | |
| 112 | reverse_iterator rend() { return reverse_iterator(begin()); } |
| 113 | const_reverse_iterator rend() const { |
| 114 | return const_reverse_iterator(begin()); |
| 115 | } |
| 116 | const_reverse_iterator crend() const { |
| 117 | return const_reverse_iterator(begin()); |