#ifndef SPROUT_PIT_HPP #define SPROUT_PIT_HPP #include #include #include #include #include #include #include #include #include #include namespace sprout { // // pit // template class pit { public: typedef Container container_type; typedef typename sprout::container_traits::value_type value_type; typedef typename sprout::container_traits::reference reference; typedef typename sprout::container_traits::const_reference const_reference; typedef typename sprout::value_iterator iterator; typedef typename sprout::value_iterator const_iterator; typedef typename sprout::container_traits::size_type size_type; typedef typename sprout::container_traits::difference_type difference_type; typedef typename sprout::container_traits::pointer pointer; typedef typename sprout::container_traits::const_pointer const_pointer; typedef typename sprout::reverse_iterator reverse_iterator; typedef typename sprout::reverse_iterator const_reverse_iterator; public: SPROUT_STATIC_CONSTEXPR size_type static_size = sprout::container_traits::static_size; public: value_type elem; public: pit() = default; void swap(pit& other) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(std::swap(std::declval(), std::declval()))) { using std::swap; swap(elem, other.elem); } // iterators: iterator begin() { return iterator(elem, static_size); } SPROUT_CONSTEXPR const_iterator begin() const { return const_iterator(elem, static_size); } iterator end() SPROUT_NOEXCEPT { return iterator(); } SPROUT_CONSTEXPR const_iterator end() const SPROUT_NOEXCEPT { return const_iterator(); } reverse_iterator rbegin() SPROUT_NOEXCEPT { return reverse_iterator(end()); } SPROUT_CONSTEXPR const_reverse_iterator rbegin() const SPROUT_NOEXCEPT { return const_reverse_iterator(end()); } reverse_iterator rend() SPROUT_NOEXCEPT { return reverse_iterator(begin()); } SPROUT_CONSTEXPR const_reverse_iterator rend() const SPROUT_NOEXCEPT { return const_reverse_iterator(begin()); } SPROUT_CONSTEXPR const_iterator cbegin() const SPROUT_NOEXCEPT { return const_iterator(elem, static_size); } SPROUT_CONSTEXPR const_iterator cend() const SPROUT_NOEXCEPT { return const_iterator(); } SPROUT_CONSTEXPR const_reverse_iterator crbegin() const SPROUT_NOEXCEPT { return const_reverse_iterator(end()); } SPROUT_CONSTEXPR const_reverse_iterator crend() const SPROUT_NOEXCEPT { return const_reverse_iterator(begin()); } // capacity: SPROUT_CONSTEXPR size_type size() const SPROUT_NOEXCEPT { return static_size; } SPROUT_CONSTEXPR size_type max_size() const SPROUT_NOEXCEPT { return size(); } SPROUT_CONSTEXPR bool empty() const SPROUT_NOEXCEPT { return static_size == 0; } // element access: reference operator[](size_type i) { return elem; } SPROUT_CONSTEXPR const_reference operator[](size_type i) const { return elem; } reference at(size_type i) { return i < size() ? elem : (throw std::out_of_range("pit<>: index out of range"), elem) ; } SPROUT_CONSTEXPR const_reference at(size_type i) const { return i < size() ? elem : (throw std::out_of_range("pit<>: index out of range"), elem) ; } reference front() { return elem; } SPROUT_CONSTEXPR const_reference front() const { return elem; } reference back() { return elem; } SPROUT_CONSTEXPR const_reference back() const { return elem; } // others: void rangecheck(size_type i) const { if (i >= size()) { throw std::out_of_range("pit<>: index out of range"); } } }; template SPROUT_CONSTEXPR_OR_CONST typename sprout::pit::size_type sprout::pit::static_size; // // operator== // operator!= // operator< // operator> // operator<= // operator>= // template inline SPROUT_CONSTEXPR bool operator==(sprout::pit const& lhs, sprout::pit const& rhs) { return lhs.front() == rhs.front(); } template inline SPROUT_CONSTEXPR bool operator!=(sprout::pit const& lhs, sprout::pit const& rhs) { return !(lhs == rhs); } template inline SPROUT_CONSTEXPR bool operator<(sprout::pit const& lhs, sprout::pit const& rhs) { return lhs.front() < rhs.front(); } template inline SPROUT_CONSTEXPR bool operator>(sprout::pit const& lhs, sprout::pit const& rhs) { return rhs < lhs; } template inline SPROUT_CONSTEXPR bool operator<=(sprout::pit const& lhs, sprout::pit const& rhs) { return !(rhs < lhs); } template inline SPROUT_CONSTEXPR bool operator>=(sprout::pit const& lhs, sprout::pit const& rhs) { return !(lhs < rhs); } // // swap // template inline void swap(sprout::pit& lhs, sprout::pit& rhs) SPROUT_NOEXCEPT_EXPR(SPROUT_NOEXCEPT_EXPR(lhs.swap(rhs))) { lhs.swap(rhs); } // // container_construct_traits // template struct container_construct_traits > { public: typedef typename sprout::container_construct_traits::copied_type copied_type; public: template static SPROUT_CONSTEXPR copied_type deep_copy(Cont&& cont) { return copied_type(); } template static SPROUT_CONSTEXPR copied_type make(Args&&... args) { return sprout::make(sprout::forward(args)...); } template static SPROUT_CONSTEXPR copied_type remake( Cont&& cont, typename sprout::container_traits >::difference_type size, Args&&... args ) { return sprout::remake(sprout::forward(cont), size, sprout::forward(args)...); } }; // // container_transform_traits // template struct container_transform_traits > { public: template >::size_type Size> struct rebind_size { public: typedef sprout::pit< typename sprout::container_transform_traits::template rebind_size::type > type; }; }; // // blank // struct blank {}; // // blank_pit // template inline SPROUT_CONSTEXPR sprout::pit > blank_pit() { return sprout::pit >(); } } // namespace sprout namespace std { // // tuple_size // template struct tuple_size > : public std::tuple_size {}; // // tuple_element // template struct tuple_element > : public std::tuple_element {}; } // namespace std #include #endif // #ifndef SPROUT_PIT_HPP