# array

Go to the documentation of this file.

    00001 // class template array -*- C++ -*-
    00002
    00003 // Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
    00004 //
    00005 // This file is part of the GNU ISO C++ Library.  This library is free
    00006 // software; you can redistribute it and/or modify it under the
    00007 // terms of the GNU General Public License as published by the
    00008 // Free Software Foundation; either version 2, or (at your option)
    00009 // any later version.
    00010
    00011 // This library is distributed in the hope that it will be useful,
    00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
    00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    00014 // GNU General Public License for more details.
    00015
    00016 // You should have received a copy of the GNU General Public License along
    00017 // with this library; see the file COPYING.  If not, write to the Free
    00018 // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
    00019 // USA.
    00020
    00021 // As a special exception, you may use this file as part of a free software
    00022 // library without restriction.  Specifically, if other files instantiate
    00023 // templates or use macros or inline functions from this file, or you compile
    00024 // this file and link it with other files to produce an executable, this
    00025 // file does not by itself cause the resulting executable to be covered by
    00026 // the GNU General Public License.  This exception does not however
    00027 // invalidate any other reasons why the executable file might be covered by
    00028 // the GNU General Public License.
    00029
    00030 /** @file tr1/array
    00031  *  This is a TR1 C++ Library header.
    00032  */
    00033
    00034 #ifndef _TR1_ARRAY
    00035 #define _TR1_ARRAY 1
    00036
    00037 #include <new>
    00038 #include <iterator>
    00039 #include <algorithm>
    00040 #include <cstddef>
    00041 #include <bits/functexcept.h>
    00042 #include <ext/type_traits.h>
    00043
    00044 //namespace std::tr1
    00045 namespace std
    00046 {
    00047 _GLIBCXX_BEGIN_NAMESPACE(tr1)
    00048
    00049   /// @brief  struct array [6.2.2].
    00050   /// NB: Requires complete type _Tp.
    00051   template<typename _Tp, std::size_t _Nm>
    00052     struct array
    00053     {
    00054       typedef _Tp                         value_type;
    00055       typedef value_type&                             reference;
    00056       typedef const value_type&                       const_reference;
    00057       typedef value_type*                     iterator;
    00058       typedef const value_type*               const_iterator;
    00059       typedef std::size_t                             size_type;
    00060       typedef std::ptrdiff_t                          difference_type;
    00061       typedef std::reverse_iterator<iterator>         reverse_iterator;
    00062       typedef std::reverse_iterator<const_iterator>   const_reverse_iterator;
    00063
    00064       // Support for zero-sized arrays mandatory.
    00065       value_type _M_instance[_Nm ? _Nm : 1] __attribute__((__aligned__));
    00066
    00067       // No explicit construct/copy/destroy for aggregate type.
    00068
    00069       void
    00070       assign(const value_type& __u)
    00071       { std::fill_n(begin(), size(), __u); }
    00072
    00073       void
    00074       swap(array& __other)
    00075       { std::swap_ranges(begin(), end(), __other.begin()); }
    00076
    00077       // Iterators.
    00078       iterator
    00079       begin()
    00080       { return iterator(&_M_instance[0]); }
    00081
    00082       const_iterator
    00083       begin() const
    00084       { return const_iterator(&_M_instance[0]); }
    00085
    00086       iterator
    00087       end()
    00088       { return iterator(&_M_instance[_Nm]); }
    00089
    00090       const_iterator
    00091       end() const
    00092       { return const_iterator(&_M_instance[_Nm]); }
    00093
    00094       reverse_iterator
    00095       rbegin()
    00096       { return reverse_iterator(end()); }
    00097
    00098       const_reverse_iterator
    00099       rbegin() const
    00100       { return const_reverse_iterator(end()); }
    00101
    00102       reverse_iterator
    00103       rend()
    00104       { return reverse_iterator(begin()); }
    00105
    00106       const_reverse_iterator
    00107       rend() const
    00108       { return const_reverse_iterator(begin()); }
    00109
    00110       // Capacity.
    00111       size_type
    00112       size() const { return _Nm; }
    00113
    00114       size_type
    00115       max_size() const { return _Nm; }
    00116
    00117       bool
    00118       empty() const { return size() == 0; }
    00119
    00120       // Element access.
    00121       reference
    00122       operator[](size_type __n)
    00123       { return _M_instance[__n]; }
    00124
    00125       const_reference
    00126       operator[](size_type __n) const
    00127       { return _M_instance[__n]; }
    00128
    00129       reference
    00130       at(size_type __n)
    00131       {
    00132     _M_check<_Nm>(__n);
    00133     return _M_instance[__n];
    00134       }
    00135
    00136       const_reference
    00137       at(size_type __n) const
    00138       {
    00139     _M_check<_Nm>(__n);
    00140     return _M_instance[__n];
    00141       }
    00142
    00143       reference
    00144       front()
    00145       { return *begin(); }
    00146
    00147       const_reference
    00148       front() const
    00149       { return *begin(); }
    00150
    00151       reference
    00152       back()
    00153       { return _Nm ? *(end() - 1) : *end(); }
    00154
    00155       const_reference
    00156       back() const
    00157       { return _Nm ? *(end() - 1) : *end(); }
    00158
    00159       _Tp*
    00160       data()
    00161       { return &_M_instance[0]; }
    00162
    00163       const _Tp*
    00164       data() const
    00165       { return &_M_instance[0]; }
    00166
    00167     private:
    00168       template<std::size_t _Mm>
    00169         typename __gnu_cxx::__enable_if<_Mm, void>::__type
    00170         _M_check(size_type __n) const
    00171         {
    00172       if (__builtin_expect(__n >= _Mm, false))
    00173         std::__throw_out_of_range(__N("array::_M_check"));
    00174     }
    00175
    00176       // Avoid "unsigned comparison with zero" warnings.
    00177       template<std::size_t _Mm>
    00178         typename __gnu_cxx::__enable_if<!_Mm, void>::__type
    00179         _M_check(size_type) const
    00180         { std::__throw_out_of_range(__N("array::_M_check")); }
    00181     };
    00182
    00183   // Array comparisons.
    00184   template<typename _Tp, std::size_t _Nm>
    00185     inline bool
    00186     operator==(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
    00187     { return std::equal(__one.begin(), __one.end(), __two.begin()); }
    00188
    00189   template<typename _Tp, std::size_t _Nm>
    00190     inline bool
    00191     operator!=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
    00192     { return !(__one == __two); }
    00193
    00194   template<typename _Tp, std::size_t _Nm>
    00195     inline bool
    00196     operator<(const array<_Tp, _Nm>& __a, const array<_Tp, _Nm>& __b)
    00197     {
    00198       return std::lexicographical_compare(__a.begin(), __a.end(),
    00199                       __b.begin(), __b.end());
    00200     }
    00201
    00202   template<typename _Tp, std::size_t _Nm>
    00203     inline bool
    00204     operator>(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
    00205     { return __two < __one; }
    00206
    00207   template<typename _Tp, std::size_t _Nm>
    00208     inline bool
    00209     operator<=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
    00210     { return !(__one > __two); }
    00211
    00212   template<typename _Tp, std::size_t _Nm>
    00213     inline bool
    00214     operator>=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two)
    00215     { return !(__one < __two); }
    00216
    00217   // Specialized algorithms [6.2.2.2].
    00218   template<typename _Tp, std::size_t _Nm>
    00219     inline void
    00220     swap(array<_Tp, _Nm>& __one, array<_Tp, _Nm>& __two)
    00221     { std::swap_ranges(__one.begin(), __one.end(), __two.begin()); }
    00222
    00223   // Tuple interface to class template array [6.2.2.5].
    00224   template<typename _Tp> class tuple_size;
    00225   template<int _Int, typename _Tp> class tuple_element;
    00226
    00227   template<typename _Tp, std::size_t _Nm>
    00228     struct tuple_size<array<_Tp, _Nm> >
    00229     { static const int value = _Nm; };
    00230
    00231   template<typename _Tp, std::size_t _Nm>
    00232     const int tuple_size<array<_Tp, _Nm> >::value;
    00233
    00234   template<int _Int, typename _Tp, std::size_t _Nm>
    00235     struct tuple_element<_Int, array<_Tp, _Nm> >
    00236     { typedef _Tp type; };
    00237
    00238   template<int _Int, typename _Tp, std::size_t _Nm>
    00239     inline _Tp&
    00240     get(array<_Tp, _Nm>& __arr)
    00241     { return __arr[_Int]; }
    00242
    00243   template<int _Int, typename _Tp, std::size_t _Nm>
    00244     inline const _Tp&
    00245     get(const array<_Tp, _Nm>& __arr)
    00246     { return __arr[_Int]; }
    00247
    00248 _GLIBCXX_END_NAMESPACE
    00249 }
    00250
    00251 #endif