epoc32/include/stdapis/boost/array.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@4
     1
/* The following code declares class array,
williamr@4
     2
 * an STL container (as wrapper) for arrays of constant size.
williamr@4
     3
 *
williamr@4
     4
 * See
williamr@4
     5
 *      http://www.boost.org/libs/array/
williamr@4
     6
 * for documentation.
williamr@4
     7
 *
williamr@4
     8
 * The original author site is at: http://www.josuttis.com/
williamr@4
     9
 *
williamr@4
    10
 * (C) Copyright Nicolai M. Josuttis 2001.
williamr@4
    11
 *
williamr@4
    12
 * Distributed under the Boost Software License, Version 1.0. (See
williamr@4
    13
 * accompanying file LICENSE_1_0.txt or copy at
williamr@4
    14
 * http://www.boost.org/LICENSE_1_0.txt)
williamr@4
    15
 *
williamr@4
    16
 * 29 Jan 2004 - c_array() added, BOOST_NO_PRIVATE_IN_AGGREGATE removed (Nico Josuttis)
williamr@4
    17
 * 23 Aug 2002 - fix for Non-MSVC compilers combined with MSVC libraries.
williamr@4
    18
 * 05 Aug 2001 - minor update (Nico Josuttis)
williamr@4
    19
 * 20 Jan 2001 - STLport fix (Beman Dawes)
williamr@4
    20
 * 29 Sep 2000 - Initial Revision (Nico Josuttis)
williamr@4
    21
 *
williamr@4
    22
 * Jan 29, 2004
williamr@4
    23
 */
williamr@4
    24
#ifndef BOOST_ARRAY_HPP
williamr@4
    25
#define BOOST_ARRAY_HPP
williamr@4
    26
williamr@4
    27
#include <cstddef>
williamr@4
    28
#include <stdexcept>
williamr@4
    29
#include <boost/assert.hpp>
williamr@4
    30
williamr@4
    31
// Handles broken standard libraries better than <iterator>
williamr@4
    32
#include <boost/detail/iterator.hpp>
williamr@4
    33
#include <boost/throw_exception.hpp>
williamr@4
    34
#include <algorithm>
williamr@4
    35
williamr@4
    36
// FIXES for broken compilers
williamr@4
    37
#include <boost/config.hpp>
williamr@4
    38
williamr@4
    39
williamr@4
    40
namespace boost {
williamr@4
    41
williamr@4
    42
    template<class T, std::size_t N>
williamr@4
    43
    class array {
williamr@4
    44
      public:
williamr@4
    45
        T elems[N];    // fixed-size array of elements of type T
williamr@4
    46
williamr@4
    47
      public:
williamr@4
    48
        // type definitions
williamr@4
    49
        typedef T              value_type;
williamr@4
    50
        typedef T*             iterator;
williamr@4
    51
        typedef const T*       const_iterator;
williamr@4
    52
        typedef T&             reference;
williamr@4
    53
        typedef const T&       const_reference;
williamr@4
    54
        typedef std::size_t    size_type;
williamr@4
    55
        typedef std::ptrdiff_t difference_type;
williamr@4
    56
williamr@4
    57
        // iterator support
williamr@4
    58
        iterator begin() { return elems; }
williamr@4
    59
        const_iterator begin() const { return elems; }
williamr@4
    60
        iterator end() { return elems+N; }
williamr@4
    61
        const_iterator end() const { return elems+N; }
williamr@4
    62
williamr@4
    63
        // reverse iterator support
williamr@4
    64
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS)
williamr@4
    65
        typedef std::reverse_iterator<iterator> reverse_iterator;
williamr@4
    66
        typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
williamr@4
    67
#elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310)
williamr@4
    68
        // workaround for broken reverse_iterator in VC7
williamr@4
    69
        typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, iterator,
williamr@4
    70
                                      reference, iterator, reference> > reverse_iterator;
williamr@4
    71
        typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, const_iterator,
williamr@4
    72
                                      const_reference, iterator, reference> > const_reverse_iterator;
williamr@4
    73
#else
williamr@4
    74
        // workaround for broken reverse_iterator implementations
williamr@4
    75
        typedef std::reverse_iterator<iterator,T> reverse_iterator;
williamr@4
    76
        typedef std::reverse_iterator<const_iterator,T> const_reverse_iterator;
williamr@4
    77
#endif
williamr@4
    78
williamr@4
    79
        reverse_iterator rbegin() { return reverse_iterator(end()); }
williamr@4
    80
        const_reverse_iterator rbegin() const {
williamr@4
    81
            return const_reverse_iterator(end());
williamr@4
    82
        }
williamr@4
    83
        reverse_iterator rend() { return reverse_iterator(begin()); }
williamr@4
    84
        const_reverse_iterator rend() const {
williamr@4
    85
            return const_reverse_iterator(begin());
williamr@4
    86
        }
williamr@4
    87
williamr@4
    88
        // operator[]
williamr@4
    89
        reference operator[](size_type i) 
williamr@4
    90
        { 
williamr@4
    91
            BOOST_ASSERT( i < N && "out of range" ); 
williamr@4
    92
            return elems[i];
williamr@4
    93
        }
williamr@4
    94
        
williamr@4
    95
        const_reference operator[](size_type i) const 
williamr@4
    96
        {     
williamr@4
    97
            BOOST_ASSERT( i < N && "out of range" ); 
williamr@4
    98
            return elems[i]; 
williamr@4
    99
        }
williamr@4
   100
williamr@4
   101
        // at() with range check
williamr@4
   102
        reference at(size_type i) { rangecheck(i); return elems[i]; }
williamr@4
   103
        const_reference at(size_type i) const { rangecheck(i); return elems[i]; }
williamr@4
   104
    
williamr@4
   105
        // front() and back()
williamr@4
   106
        reference front() 
williamr@4
   107
        { 
williamr@4
   108
            return elems[0]; 
williamr@4
   109
        }
williamr@4
   110
        
williamr@4
   111
        const_reference front() const 
williamr@4
   112
        {
williamr@4
   113
            return elems[0];
williamr@4
   114
        }
williamr@4
   115
        
williamr@4
   116
        reference back() 
williamr@4
   117
        { 
williamr@4
   118
            return elems[N-1]; 
williamr@4
   119
        }
williamr@4
   120
        
williamr@4
   121
        const_reference back() const 
williamr@4
   122
        { 
williamr@4
   123
            return elems[N-1]; 
williamr@4
   124
        }
williamr@4
   125
williamr@4
   126
        // size is constant
williamr@4
   127
        static size_type size() { return N; }
williamr@4
   128
        static bool empty() { return false; }
williamr@4
   129
        static size_type max_size() { return N; }
williamr@4
   130
        enum { static_size = N };
williamr@4
   131
williamr@4
   132
        // swap (note: linear complexity)
williamr@4
   133
        void swap (array<T,N>& y) {
williamr@4
   134
            std::swap_ranges(begin(),end(),y.begin());
williamr@4
   135
        }
williamr@4
   136
williamr@4
   137
        // direct access to data (read-only)
williamr@4
   138
        const T* data() const { return elems; }
williamr@4
   139
        T* data() { return elems; }
williamr@4
   140
williamr@4
   141
        // use array as C array (direct read/write access to data)
williamr@4
   142
        T* c_array() { return elems; }
williamr@4
   143
williamr@4
   144
        // assignment with type conversion
williamr@4
   145
        template <typename T2>
williamr@4
   146
        array<T,N>& operator= (const array<T2,N>& rhs) {
williamr@4
   147
            std::copy(rhs.begin(),rhs.end(), begin());
williamr@4
   148
            return *this;
williamr@4
   149
        }
williamr@4
   150
williamr@4
   151
        // assign one value to all elements
williamr@4
   152
        void assign (const T& value)
williamr@4
   153
        {
williamr@4
   154
            std::fill_n(begin(),size(),value);
williamr@4
   155
        }
williamr@4
   156
williamr@4
   157
        // check range (may be private because it is static)
williamr@4
   158
        static void rangecheck (size_type i) {
williamr@4
   159
            if (i >= size()) {
williamr@4
   160
                throw std::range_error("array<>: index out of range");
williamr@4
   161
            }
williamr@4
   162
        }
williamr@4
   163
williamr@4
   164
    };
williamr@4
   165
williamr@4
   166
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
williamr@4
   167
    template< class T >
williamr@4
   168
    class array< T, 0 > {
williamr@4
   169
williamr@4
   170
      public:
williamr@4
   171
        // type definitions
williamr@4
   172
        typedef T              value_type;
williamr@4
   173
        typedef T*             iterator;
williamr@4
   174
        typedef const T*       const_iterator;
williamr@4
   175
        typedef T&             reference;
williamr@4
   176
        typedef const T&       const_reference;
williamr@4
   177
        typedef std::size_t    size_type;
williamr@4
   178
        typedef std::ptrdiff_t difference_type;
williamr@4
   179
williamr@4
   180
        // iterator support
williamr@4
   181
        iterator begin() { return iterator( reinterpret_cast< T * >( this ) ); }
williamr@4
   182
        const_iterator begin() const { return const_iterator(  reinterpret_cast< const T * >( this ) ); }
williamr@4
   183
        iterator end() { return begin(); }
williamr@4
   184
        const_iterator end() const { return begin(); }
williamr@4
   185
williamr@4
   186
        // reverse iterator support
williamr@4
   187
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS)
williamr@4
   188
        typedef std::reverse_iterator<iterator> reverse_iterator;
williamr@4
   189
        typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
williamr@4
   190
#elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310)
williamr@4
   191
        // workaround for broken reverse_iterator in VC7
williamr@4
   192
        typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, iterator,
williamr@4
   193
                                      reference, iterator, reference> > reverse_iterator;
williamr@4
   194
        typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, const_iterator,
williamr@4
   195
                                      const_reference, iterator, reference> > const_reverse_iterator;
williamr@4
   196
#else
williamr@4
   197
        // workaround for broken reverse_iterator implementations
williamr@4
   198
        typedef std::reverse_iterator<iterator,T> reverse_iterator;
williamr@4
   199
        typedef std::reverse_iterator<const_iterator,T> const_reverse_iterator;
williamr@4
   200
#endif
williamr@4
   201
williamr@4
   202
        reverse_iterator rbegin() { return reverse_iterator(end()); }
williamr@4
   203
        const_reverse_iterator rbegin() const {
williamr@4
   204
            return const_reverse_iterator(end());
williamr@4
   205
        }
williamr@4
   206
        reverse_iterator rend() { return reverse_iterator(begin()); }
williamr@4
   207
        const_reverse_iterator rend() const {
williamr@4
   208
            return const_reverse_iterator(begin());
williamr@4
   209
        }
williamr@4
   210
williamr@4
   211
        // operator[]
williamr@4
   212
        reference operator[](size_type i)
williamr@4
   213
        {
williamr@4
   214
            return failed_rangecheck();
williamr@4
   215
        }
williamr@4
   216
williamr@4
   217
        const_reference operator[](size_type i) const
williamr@4
   218
        {
williamr@4
   219
            return failed_rangecheck();
williamr@4
   220
        }
williamr@4
   221
williamr@4
   222
        // at() with range check
williamr@4
   223
        reference at(size_type i)               {   return failed_rangecheck(); }
williamr@4
   224
        const_reference at(size_type i) const   {   return failed_rangecheck(); }
williamr@4
   225
williamr@4
   226
        // front() and back()
williamr@4
   227
        reference front()
williamr@4
   228
        {
williamr@4
   229
            return failed_rangecheck();
williamr@4
   230
        }
williamr@4
   231
williamr@4
   232
        const_reference front() const
williamr@4
   233
        {
williamr@4
   234
            return failed_rangecheck();
williamr@4
   235
        }
williamr@4
   236
williamr@4
   237
        reference back()
williamr@4
   238
        {
williamr@4
   239
            return failed_rangecheck();
williamr@4
   240
        }
williamr@4
   241
williamr@4
   242
        const_reference back() const
williamr@4
   243
        {
williamr@4
   244
            return failed_rangecheck();
williamr@4
   245
        }
williamr@4
   246
williamr@4
   247
        // size is constant
williamr@4
   248
        static size_type size() { return 0; }
williamr@4
   249
        static bool empty() { return true; }
williamr@4
   250
        static size_type max_size() { return 0; }
williamr@4
   251
        enum { static_size = 0 };
williamr@4
   252
williamr@4
   253
        void swap (array<T,0>& y) {
williamr@4
   254
        }
williamr@4
   255
williamr@4
   256
        // direct access to data (read-only)
williamr@4
   257
        const T* data() const { return 0; }
williamr@4
   258
        T* data() { return 0; }
williamr@4
   259
williamr@4
   260
        // use array as C array (direct read/write access to data)
williamr@4
   261
        T* c_array() { return 0; }
williamr@4
   262
williamr@4
   263
        // assignment with type conversion
williamr@4
   264
        template <typename T2>
williamr@4
   265
        array<T,0>& operator= (const array<T2,0>& ) {
williamr@4
   266
            return *this;
williamr@4
   267
        }
williamr@4
   268
williamr@4
   269
        // assign one value to all elements
williamr@4
   270
        void assign (const T& ) {   }
williamr@4
   271
williamr@4
   272
        // check range (may be private because it is static)
williamr@4
   273
        static reference failed_rangecheck () {
williamr@4
   274
                std::range_error e("attempt to access element of an empty array");
williamr@4
   275
                boost::throw_exception(e);
williamr@4
   276
                //
williamr@4
   277
                // We need to return something here to keep
williamr@4
   278
                // some compilers happy: however we will never
williamr@4
   279
                // actually get here....
williamr@4
   280
                //
williamr@4
   281
                static T placeholder;
williamr@4
   282
                return placeholder;
williamr@4
   283
            }
williamr@4
   284
    };
williamr@4
   285
#endif
williamr@4
   286
williamr@4
   287
    // comparisons
williamr@4
   288
    template<class T, std::size_t N>
williamr@4
   289
    bool operator== (const array<T,N>& x, const array<T,N>& y) {
williamr@4
   290
        return std::equal(x.begin(), x.end(), y.begin());
williamr@4
   291
    }
williamr@4
   292
    template<class T, std::size_t N>
williamr@4
   293
    bool operator< (const array<T,N>& x, const array<T,N>& y) {
williamr@4
   294
        return std::lexicographical_compare(x.begin(),x.end(),y.begin(),y.end());
williamr@4
   295
    }
williamr@4
   296
    template<class T, std::size_t N>
williamr@4
   297
    bool operator!= (const array<T,N>& x, const array<T,N>& y) {
williamr@4
   298
        return !(x==y);
williamr@4
   299
    }
williamr@4
   300
    template<class T, std::size_t N>
williamr@4
   301
    bool operator> (const array<T,N>& x, const array<T,N>& y) {
williamr@4
   302
        return y<x;
williamr@4
   303
    }
williamr@4
   304
    template<class T, std::size_t N>
williamr@4
   305
    bool operator<= (const array<T,N>& x, const array<T,N>& y) {
williamr@4
   306
        return !(y<x);
williamr@4
   307
    }
williamr@4
   308
    template<class T, std::size_t N>
williamr@4
   309
    bool operator>= (const array<T,N>& x, const array<T,N>& y) {
williamr@4
   310
        return !(x<y);
williamr@4
   311
    }
williamr@4
   312
williamr@4
   313
    // global swap()
williamr@4
   314
    template<class T, std::size_t N>
williamr@4
   315
    inline void swap (array<T,N>& x, array<T,N>& y) {
williamr@4
   316
        x.swap(y);
williamr@4
   317
    }
williamr@4
   318
williamr@4
   319
} /* namespace boost */
williamr@4
   320
williamr@4
   321
#endif /*BOOST_ARRAY_HPP*/