| // -*- C++ -*- |
| /*************************************************************************** |
| * |
| * array - definition of class template array |
| * |
| * $Id$ |
| * |
| *************************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed |
| * with this work for additional information regarding copyright |
| * ownership. The ASF licenses this file to you under the Apache |
| * License, Version 2.0 (the "License"); you may not use this file |
| * except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| * implied. See the License for the specific language governing |
| * permissions and limitations under the License. |
| * |
| * Copyright 1994-2006 Rogue Wave Software. |
| * |
| **************************************************************************/ |
| |
| #ifndef _RWSTD_ARRAY_INCLUDED |
| #define _RWSTD_ARRAY_INCLUDED |
| |
| #include <rw/_defs.h> |
| |
| #ifdef _RWSTD_NO_EXT_CXX_0X |
| # error _RWSTD_NO_EXT_CXX_0X defined and C++0x header included |
| #endif // _RWSTD_NO_EXT_CXX_0X |
| |
| #include <rw/_algobase.h> |
| #include <rw/_error.h> |
| #include <rw/_iterator.h> |
| |
| |
| _RWSTD_NAMESPACE (std) { |
| |
| // [array] -- class template array |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| struct array |
| { |
| // types: |
| typedef _TypeT value_type; |
| typedef value_type& reference; |
| typedef const value_type& const_reference; |
| typedef value_type* pointer; |
| typedef const value_type* const_pointer; |
| typedef _RWSTD_SIZE_T size_type; |
| typedef _RWSTD_PTRDIFF_T difference_type; |
| |
| #ifndef _RWSTD_NO_DEBUG_ITER |
| |
| typedef _RW::__rw_debug_iter <array, pointer, pointer> iterator; |
| |
| typedef _RW::__rw_debug_iter <array, const_pointer, pointer> const_iterator; |
| |
| iterator _C_make_iter (pointer __ptr) { |
| return iterator (*this, __ptr); |
| } |
| |
| const_iterator _C_make_iter (const_pointer __ptr) const { |
| return const_iterator (*this, __ptr); |
| } |
| |
| #else // if defined (_RWSTD_NO_DEBUG_ITER) |
| |
| typedef pointer iterator; |
| typedef const_pointer const_iterator; |
| |
| iterator _C_make_iter (pointer __ptr) { |
| return __ptr; |
| } |
| |
| const_iterator _C_make_iter (const_pointer __ptr) const { |
| return __ptr; |
| } |
| |
| #endif // _RWSTD_NO_DEBUG_ITER |
| |
| typedef _RWSTD_REVERSE_ITERATOR (iterator, |
| reference, |
| pointer, |
| random_access_iterator_tag) |
| reverse_iterator; |
| |
| typedef _RWSTD_REVERSE_ITERATOR (const_iterator, |
| const_reference, |
| const_pointer, |
| random_access_iterator_tag) |
| const_reverse_iterator; |
| |
| // No explicit construct/copy/destroy for aggregate type |
| void assign (const_reference); |
| void swap (array&); |
| |
| // iterators: |
| iterator begin () { |
| return _C_make_iter (data ()); |
| } |
| |
| const_iterator begin () const { |
| return _C_make_iter (data ()); |
| } |
| |
| iterator end () { |
| return _C_make_iter (data () + size ()); |
| } |
| |
| const_iterator end () const { |
| return _C_make_iter (data () + size ()); |
| } |
| |
| reverse_iterator rbegin () { |
| return reverse_iterator (end ()); |
| } |
| |
| const_reverse_iterator rbegin () const { |
| return const_reverse_iterator (end ()); |
| } |
| |
| reverse_iterator rend () { |
| return reverse_iterator (begin ()); |
| } |
| |
| const_reverse_iterator rend () const { |
| return const_reverse_iterator (begin ()); |
| } |
| |
| // capacity: |
| size_type size () const { |
| return _Size; |
| } |
| |
| size_type max_size () const { |
| return _Size; |
| } |
| |
| bool empty () const { |
| return 0 == size (); |
| } |
| |
| // element access: |
| reference operator[] (size_type); |
| const_reference operator[] (size_type) const; |
| |
| const_reference at (size_type) const; |
| reference at (size_type); |
| |
| reference front () { |
| _RWSTD_ASSERT (!empty ()); |
| return *data (); |
| } |
| |
| const_reference front () const { |
| _RWSTD_ASSERT (!empty ()); |
| return *data (); |
| } |
| |
| reference back () { |
| _RWSTD_ASSERT (!empty ()); |
| return data () [size () - 1]; |
| } |
| |
| const_reference back () const { |
| _RWSTD_ASSERT (!empty ()); |
| return data () [size () - 1]; |
| } |
| |
| pointer data () { |
| return _C_elems; |
| } |
| |
| const_pointer data () const { |
| return _C_elems; |
| } |
| |
| // private: (no public/protected/private in aggregate types) |
| value_type _C_elems [_Size]; |
| }; |
| |
| |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| inline void |
| array<_TypeT, _Size>:: |
| assign (const_reference __val) |
| { |
| const pointer __end = data () + size (); |
| |
| for (pointer __ptr = data (); __ptr != __end; ++__ptr) |
| *__ptr = __val; |
| } |
| |
| |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| inline void |
| array<_TypeT, _Size>:: |
| swap (array<_TypeT, _Size> &__other) |
| { |
| _RWSTD_ASSERT (size () == __other.size ()); |
| |
| const array __tmp (*this); |
| *this = __other; |
| __other = __tmp; |
| } |
| |
| |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| inline typename array<_TypeT, _Size>::reference |
| array<_TypeT, _Size>:: |
| operator[] (size_type __inx) |
| { |
| #ifdef _RWSTD_BOUNDS_CHECKING |
| |
| _RWSTD_REQUIRES (__inx < size (), |
| (_RWSTD_ERROR_OUT_OF_RANGE, |
| _RWSTD_FUNC ("array::operator[](size_type)"), |
| __inx, size ())); |
| |
| #endif // _RWSTD_BOUNDS_CHECKING |
| |
| return data ()[__inx]; |
| } |
| |
| |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| inline typename array<_TypeT, _Size>::const_reference |
| array<_TypeT, _Size>:: |
| operator[] (size_type __inx) const |
| { |
| #ifdef _RWSTD_BOUNDS_CHECKING |
| |
| _RWSTD_REQUIRES (__inx < size (), |
| (_RWSTD_ERROR_OUT_OF_RANGE, |
| _RWSTD_FUNC ("array::operator[](size_type) const"), |
| __inx, size ())); |
| |
| #endif // _RWSTD_BOUNDS_CHECKING |
| |
| return data ()[__inx]; |
| } |
| |
| |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| inline typename array<_TypeT, _Size>::reference |
| array<_TypeT, _Size>:: |
| at (size_type __inx) |
| { |
| _RWSTD_REQUIRES (__inx < size (), |
| (_RWSTD_ERROR_OUT_OF_RANGE, |
| _RWSTD_FUNC ("array::at (size_type)"), |
| __inx, size ())); |
| |
| return data ()[__inx]; |
| } |
| |
| |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| inline typename array<_TypeT, _Size>::const_reference |
| array<_TypeT, _Size>:: |
| at (size_type __inx) const |
| { |
| _RWSTD_REQUIRES (__inx < size (), |
| (_RWSTD_ERROR_OUT_OF_RANGE, |
| _RWSTD_FUNC ("array::at(size_type) const"), |
| __inx, size ())); |
| return data ()[__inx]; |
| } |
| |
| |
| // array comparisons |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| inline bool |
| operator== (const array<_TypeT, _Size> &__lhs, |
| const array<_TypeT, _Size> &__rhs) |
| { |
| _RWSTD_ASSERT (__lhs.size () == __rhs.size ()); |
| |
| return _STD::equal (__lhs.begin (), __lhs.end (), __rhs.begin ()); |
| |
| } |
| |
| |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| inline bool |
| operator< (const array<_TypeT, _Size> &__lhs, |
| const array<_TypeT, _Size> &__rhs) |
| { |
| _RWSTD_ASSERT (__lhs.size () == __rhs.size ()); |
| |
| return _STD::lexicographical_compare (__lhs.begin (), __lhs.end (), |
| __rhs.begin (), __rhs.end ()); |
| } |
| |
| |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| inline bool |
| operator!= (const array<_TypeT, _Size> &__lhs, |
| const array<_TypeT, _Size> &__rhs) |
| { |
| return !(__lhs == __rhs); |
| } |
| |
| |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| inline bool |
| operator> (const array<_TypeT, _Size> &__lhs, |
| const array<_TypeT, _Size> &__rhs) |
| { |
| return __rhs < __lhs; |
| } |
| |
| |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| inline bool |
| operator>= (const array<_TypeT, _Size> &__lhs, |
| const array<_TypeT, _Size> &__rhs) |
| { |
| return !(__lhs < __rhs); |
| } |
| |
| |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| inline bool |
| operator<= (const array<_TypeT, _Size> &__lhs, |
| const array<_TypeT, _Size> &__rhs) |
| { |
| return !(__rhs < __lhs); |
| } |
| |
| |
| // [array.special] -- specialized algorithms |
| template <class _TypeT, _RWSTD_SIZE_T _Size > |
| inline void |
| swap (array<_TypeT, _Size> &__lhs, array<_TypeT, _Size> &__rhs) |
| { |
| __lhs.swap (__rhs); |
| } |
| |
| |
| // [array.tuple] -- tuple interface to class template array |
| template <class _TypeT> |
| class tuple_size; // defined in <tuple> |
| |
| template <int I, class _TypeT> |
| class tuple_element; // defined in <tuple> |
| |
| template <class _TypeT, _RWSTD_SIZE_T _Size> |
| struct tuple_size<array<_TypeT, _Size> >; |
| |
| template <int I, class _TypeT, _RWSTD_SIZE_T _Size> |
| struct tuple_element<I, array<_TypeT, _Size> >; |
| |
| template <int I, class _TypeT, _RWSTD_SIZE_T _Size> |
| _TypeT& get (array<_TypeT, _Size>&); |
| |
| template <int I, class _TypeT, _RWSTD_SIZE_T _Size> |
| const _TypeT& get (const array<_TypeT, _Size>&); |
| |
| } // namespace std |
| |
| #endif // _RWSTD_ARRAY_INCLUDED |
| |