williamr@2: // Boost.Range library williamr@2: // williamr@2: // Copyright Thorsten Ottosen 2003-2004. Use, modification and williamr@2: // distribution is subject to the Boost Software License, Version williamr@2: // 1.0. (See accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@2: // For more information, see http://www.boost.org/libs/range/ williamr@2: // williamr@2: williamr@2: #ifndef BOOST_RANGE_CONST_ITERATOR_HPP williamr@2: #define BOOST_RANGE_CONST_ITERATOR_HPP williamr@2: williamr@2: #if defined(_MSC_VER) && (_MSC_VER >= 1200) williamr@2: # pragma once williamr@2: #endif williamr@2: williamr@2: #include williamr@2: williamr@2: #ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION williamr@2: #include williamr@2: #else williamr@2: williamr@2: #include williamr@2: #include williamr@2: williamr@2: namespace boost williamr@2: { williamr@2: ////////////////////////////////////////////////////////////////////////// williamr@2: // default williamr@2: ////////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: template< typename C > williamr@2: struct range_const_iterator williamr@2: { williamr@2: typedef BOOST_DEDUCED_TYPENAME C::const_iterator type; williamr@2: }; williamr@2: williamr@2: ////////////////////////////////////////////////////////////////////////// williamr@2: // pair williamr@2: ////////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: template< typename Iterator > williamr@2: struct range_const_iterator< std::pair > williamr@2: { williamr@2: typedef Iterator type; williamr@2: }; williamr@2: williamr@2: template< typename Iterator > williamr@2: struct range_const_iterator< const std::pair > williamr@2: { williamr@2: typedef Iterator type; williamr@2: }; williamr@2: williamr@2: ////////////////////////////////////////////////////////////////////////// williamr@2: // array williamr@2: ////////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: template< typename T, std::size_t sz > williamr@2: struct range_const_iterator< T[sz] > williamr@2: { williamr@2: typedef const T* type; williamr@2: }; williamr@2: williamr@2: template< typename T, std::size_t sz > williamr@2: struct range_const_iterator< const T[sz] > williamr@2: { williamr@2: typedef const T* type; williamr@2: }; williamr@2: williamr@2: ////////////////////////////////////////////////////////////////////////// williamr@2: // string williamr@2: ////////////////////////////////////////////////////////////////////////// williamr@2: williamr@2: template<> williamr@2: struct range_const_iterator< char* > williamr@2: { williamr@2: typedef const char* type; williamr@2: }; williamr@2: williamr@2: template<> williamr@2: struct range_const_iterator< wchar_t* > williamr@2: { williamr@2: typedef const wchar_t* type; williamr@2: }; williamr@2: williamr@2: template<> williamr@2: struct range_const_iterator< const char* > williamr@2: { williamr@2: typedef const char* type; williamr@2: }; williamr@2: williamr@2: template<> williamr@2: struct range_const_iterator< const wchar_t* > williamr@2: { williamr@2: typedef const wchar_t* type; williamr@2: }; williamr@2: williamr@2: template<> williamr@2: struct range_const_iterator< char* const > williamr@2: { williamr@2: typedef const char* type; williamr@2: }; williamr@2: williamr@2: template<> williamr@2: struct range_const_iterator< wchar_t* const > williamr@2: { williamr@2: typedef const wchar_t* type; williamr@2: }; williamr@2: williamr@2: template<> williamr@2: struct range_const_iterator< const char* const > williamr@2: { williamr@2: typedef const char* type; williamr@2: }; williamr@2: williamr@2: template<> williamr@2: struct range_const_iterator< const wchar_t* const > williamr@2: { williamr@2: typedef const wchar_t* type; williamr@2: }; williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION williamr@2: williamr@2: #endif