/*============================================================================= Copyright (c) 2011-2014 Bolero MURAKAMI https://github.com/bolero-MURAKAMI/Sprout Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #ifndef SPROUT_ITERATOR_CONST_ITERATOR_CAST_HPP #define SPROUT_ITERATOR_CONST_ITERATOR_CAST_HPP #include #include #include #include #include #include namespace sprout { // // is_const_iterator_cast_convertible // template struct is_const_iterator_cast_convertible : public sprout::false_type {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public sprout::is_const_iterator_cast_convertible {}; template struct is_const_iterator_cast_convertible : public std::is_same::type, typename std::remove_const::type> {}; // // // // pointer_add_const // // // template // struct pointer_add_const // : public std::add_const // {}; // template // struct pointer_add_const // : public sprout::identity::type*> // {}; } // namespace sprout namespace sprout_adl { template sprout::not_found_via_adl const_iterator_conversion(...); } // namespace sprout_adl namespace sprout { namespace iterator_detail { template< typename T, typename U, typename sprout::enabler_if::value>::type = sprout::enabler > inline SPROUT_CONSTEXPR T const_iterator_conversion(U* it) { return const_cast(it); } } // namespace iterator_detail } // namespace sprout namespace sprout_iterator_detail { template inline SPROUT_CONSTEXPR To const_iterator_cast(From const& it) { using sprout::iterator_detail::const_iterator_conversion; using sprout_adl::const_iterator_conversion; return const_iterator_conversion(it); } } // namespace sprout_iterator_detail namespace sprout { // // const_iterator_cast // template inline SPROUT_CONSTEXPR To const_iterator_cast(From const& it) { return sprout_iterator_detail::const_iterator_cast(it); } } // namespace sprout #endif // #ifndef SPROUT_ITERATOR_CONST_ITERATOR_CAST_HPP