/* * ArrayForwarder.h * * Created on: Feb 8, 2019 * Author: Nicola Mori */ #ifndef ARRAYFORWARDER_H_ #define ARRAYFORWARDER_H_ // C/C++ headers #include template struct ArrayForwarder { typedef _Tp value_type; typedef value_type *pointer; typedef const value_type *const_pointer; typedef value_type &reference; typedef const value_type &const_reference; typedef value_type *iterator; typedef const value_type *const_iterator; typedef std::size_t size_type; typedef std::ptrdiff_t difference_type; typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; // Support for zero-sized arrays mandatory. typedef _GLIBCXX_STD_C::__array_traits<_Tp, _Nm> _AT_Type; typename _AT_Type::_Type _M_elems; // No explicit construct/copy/destroy for aggregate type. // DR 776. void fill(const value_type &__u) { _content.fill(__u); }; void swap(ArrayForwarder &__other) noexcept(_AT_Type::_Is_nothrow_swappable::value) { _content.swap(__other._content); } // Iterators. _GLIBCXX17_CONSTEXPR iterator begin() noexcept { return _content.begin(); } _GLIBCXX17_CONSTEXPR const_iterator begin() const noexcept { return _content.begin(); } _GLIBCXX17_CONSTEXPR iterator end() noexcept { return _content.end(); } _GLIBCXX17_CONSTEXPR const_iterator end() const noexcept { return _content.end(); } _GLIBCXX17_CONSTEXPR reverse_iterator rbegin() noexcept { return _content.rbegin(); } _GLIBCXX17_CONSTEXPR const_reverse_iterator rbegin() const noexcept { return _content.rbegin(); } _GLIBCXX17_CONSTEXPR reverse_iterator rend() noexcept { return _content.rend(); } _GLIBCXX17_CONSTEXPR const_reverse_iterator rend() const noexcept { return _content.rend(); } _GLIBCXX17_CONSTEXPR const_iterator cbegin() const noexcept { return _content.cbegin(); } _GLIBCXX17_CONSTEXPR const_iterator cend() const noexcept { return _content.cend(); } _GLIBCXX17_CONSTEXPR const_reverse_iterator crbegin() const noexcept { return _content.crbegin(); } _GLIBCXX17_CONSTEXPR const_reverse_iterator crend() const noexcept { return _content.crend(); } // Capacity. constexpr size_type size() const noexcept { return _content.size(); } constexpr size_type max_size() const noexcept { return _content.size(); } constexpr bool empty() const noexcept { return _content.empty(); } // Element access. _GLIBCXX17_CONSTEXPR reference operator[](size_type __n) noexcept { return _content.operator[](__n); } constexpr const_reference operator[](size_type __n) const noexcept { return _content.operator[](__n); } _GLIBCXX17_CONSTEXPR reference at(size_type __n) { return _content.at(__n); } constexpr const_reference at(size_type __n) const { return _content.at(__n); } _GLIBCXX17_CONSTEXPR reference front() noexcept { return _content.front(); } constexpr const_reference front() const noexcept { return _content.front(); } _GLIBCXX17_CONSTEXPR reference back() noexcept { return _content.back(); } constexpr const_reference back() const noexcept { return _content.back(); } _GLIBCXX17_CONSTEXPR pointer data() noexcept { return _content.data(); } _GLIBCXX17_CONSTEXPR const_pointer data() const noexcept { return _content.data(); } private: std::array<_Tp, _Nm> _content; }; #endif /* ARRAYFORWARDER_H_ */