const_iterator.hpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Boost.Range library
  2. //
  3. // Copyright Thorsten Ottosen 2003-2004. Use, modification and
  4. // distribution is subject to the Boost Software License, Version
  5. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. // For more information, see http://www.boost.org/libs/range/
  9. //
  10. #ifndef BOOST_RANGE_CONST_ITERATOR_HPP
  11. #define BOOST_RANGE_CONST_ITERATOR_HPP
  12. #if defined(_MSC_VER)
  13. # pragma once
  14. #endif
  15. #include <boost/range/config.hpp>
  16. #include <boost/range/range_fwd.hpp>
  17. #include <boost/range/detail/extract_optional_type.hpp>
  18. #include <boost/type_traits/remove_const.hpp>
  19. #include <boost/type_traits/remove_reference.hpp>
  20. #include <cstddef>
  21. #include <utility>
  22. namespace boost
  23. {
  24. //////////////////////////////////////////////////////////////////////////
  25. // default
  26. //////////////////////////////////////////////////////////////////////////
  27. namespace range_detail
  28. {
  29. BOOST_RANGE_EXTRACT_OPTIONAL_TYPE( const_iterator )
  30. template< typename C >
  31. struct range_const_iterator_helper
  32. : extract_const_iterator<C>
  33. {};
  34. //////////////////////////////////////////////////////////////////////////
  35. // pair
  36. //////////////////////////////////////////////////////////////////////////
  37. template< typename Iterator >
  38. struct range_const_iterator_helper<std::pair<Iterator,Iterator> >
  39. {
  40. typedef Iterator type;
  41. };
  42. //////////////////////////////////////////////////////////////////////////
  43. // array
  44. //////////////////////////////////////////////////////////////////////////
  45. template< typename T, std::size_t sz >
  46. struct range_const_iterator_helper< T[sz] >
  47. {
  48. typedef const T* type;
  49. };
  50. } // namespace range_detail
  51. template<typename C, typename Enabler=void>
  52. struct range_const_iterator
  53. : range_detail::range_const_iterator_helper<
  54. BOOST_DEDUCED_TYPENAME remove_reference<C>::type
  55. >
  56. {
  57. };
  58. } // namespace boost
  59. #endif