#ifndef SPROUT_RANGE_ADAPTOR_DROPPED_END_HPP #define SPROUT_RANGE_ADAPTOR_DROPPED_END_HPP #include #include #include #include #include #include #include #include #include HDR_ALGORITHM_MIN_MAX_SSCRISK_CEL_OR_SPROUT namespace sprout { namespace adaptors { // // drop_end_holder // template class drop_end_holder { public: typedef Difference difference_type; private: difference_type distance_; public: explicit SPROUT_CONSTEXPR drop_end_holder(difference_type distance) : distance_(distance) {} SPROUT_CONSTEXPR difference_type const& distance() const { return distance_; } }; // // dropped_end_forwarder // class dropped_end_forwarder { public: template SPROUT_CONSTEXPR sprout::adaptors::drop_end_holder operator()(Difference distance) const { return sprout::adaptors::drop_end_holder(distance); } }; // // dropped_end // namespace { SPROUT_STATIC_CONSTEXPR sprout::adaptors::dropped_end_forwarder dropped_end = {}; } // anonymous-namespace // // operator| // template inline SPROUT_CONSTEXPR sprout::adaptors::detail::adapted_range_default< typename std::remove_reference::type>::type > operator|(Range&& lhs, sprout::adaptors::drop_end_holder const& rhs) { typedef typename sprout::container_traits< typename std::remove_reference::type>::type >::difference_type difference_type; return sprout::adaptors::detail::adapted_range_default< typename std::remove_reference::type>::type >( sprout::begin(sprout::lvalue_forward(lhs)), sprout::next( sprout::end(sprout::lvalue_forward(lhs)), NS_SSCRISK_CEL_OR_SPROUT::max(rhs.distance(), -sprout::size(sprout::lvalue_forward(lhs))) ) ); } } // namespace adaptors } // namespace sprout #endif // #ifndef SPROUT_RANGE_ADAPTOR_DROPPED_END_HPP