source: NonGTP/Boost/boost/range/begin.hpp @ 857

Revision 857, 5.0 KB checked in by igarcia, 18 years ago (diff)
Line 
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
11#ifndef BOOST_RANGE_BEGIN_HPP
12#define BOOST_RANGE_BEGIN_HPP
13
14#if defined(_MSC_VER) && (_MSC_VER >= 1200)
15# pragma once
16#endif
17
18#include <boost/type_traits/remove_const.hpp>
19#include <boost/range/config.hpp>
20
21#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
22#include <boost/range/detail/begin.hpp>
23#else
24
25#include <boost/range/iterator.hpp>
26#include <boost/range/const_iterator.hpp>
27
28namespace boost
29{
30
31#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
32    !BOOST_WORKAROUND(__GNUC__, < 3) \
33    /**/
34namespace range_detail
35{
36#endif
37
38    //////////////////////////////////////////////////////////////////////
39    // primary template
40    //////////////////////////////////////////////////////////////////////
41
42    template< typename C >
43    inline BOOST_DEDUCED_TYPENAME range_const_iterator<C>::type
44    boost_range_begin( const C& c )
45    {
46        return c.begin();
47    }
48
49    template< typename C >
50    inline BOOST_DEDUCED_TYPENAME range_iterator<
51                                                                        typename remove_const<C>::type >::type
52    boost_range_begin( C& c )
53    {
54        return c.begin();
55    }
56
57    //////////////////////////////////////////////////////////////////////
58    // pair
59    //////////////////////////////////////////////////////////////////////
60
61    template< typename Iterator >
62    inline Iterator boost_range_begin( const std::pair<Iterator,Iterator>& p )
63    {
64        return p.first;
65    }
66
67    template< typename Iterator >
68    inline Iterator boost_range_begin( std::pair<Iterator,Iterator>& p )
69    {
70        return p.first;
71    }
72
73    //////////////////////////////////////////////////////////////////////
74    // array
75    //////////////////////////////////////////////////////////////////////
76
77    template< typename T, std::size_t sz >
78    inline const T* boost_range_begin( const T (&array)[sz] )
79    {
80        return array;
81    }
82
83    template< typename T, std::size_t sz >
84    inline T* boost_range_begin( T (&array)[sz] )
85    {
86        return array;
87    }
88
89
90    //////////////////////////////////////////////////////////////////////
91    // string
92    //////////////////////////////////////////////////////////////////////
93
94#if 1 || BOOST_WORKAROUND(__MWERKS__, <= 0x3204 ) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
95// CW up to 9.3 and borland have troubles with function ordering
96    inline const char* boost_range_begin( const char* s )
97    {
98        return s;
99    }
100
101    inline char* boost_range_begin( char* s )
102    {
103        return s;
104    }
105
106    inline const wchar_t* boost_range_begin( const wchar_t* s )
107    {
108        return s;
109    }
110
111    inline wchar_t* boost_range_begin( wchar_t* s )
112    {
113        return s;
114    }
115#else
116    inline const char* boost_range_begin( const char*& s )
117    {
118        return s;
119    }
120
121    inline char* boost_range_begin( char*& s )
122    {
123        return s;
124    }
125
126    inline const wchar_t* boost_range_begin( const wchar_t*& s )
127    {
128        return s;
129    }
130
131    inline wchar_t* boost_range_begin( wchar_t*& s )
132    {
133        return s;
134    }
135#endif
136
137#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
138    !BOOST_WORKAROUND(__GNUC__, < 3) \
139    /**/
140} // namespace 'range_detail'
141#endif
142
143
144template< class T >
145inline BOOST_DEDUCED_TYPENAME range_iterator<
146                        typename remove_const<T>::type >::type begin( T& r )
147{
148#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
149    !BOOST_WORKAROUND(__GNUC__, < 3) \
150    /**/
151    using namespace range_detail;
152#endif
153    return boost_range_begin( r );
154}
155
156template< class T >
157inline BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type begin( const T& r )
158{
159#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) && \
160    !BOOST_WORKAROUND(__GNUC__, < 3) \
161    /**/
162    using namespace range_detail;
163#endif
164    return boost_range_begin( r );
165}
166
167#if BOOST_WORKAROUND(__MWERKS__, <= 0x3003 ) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
168// BCB and CW are not able to overload pointer when class overloads are also available.
169template<>
170inline range_const_iterator<const char*>::type begin<const char*>( const char*& r )
171{
172    return r;
173}
174
175template<>
176inline range_const_iterator<const wchar_t*>::type begin<const wchar_t*>( const wchar_t*& r )
177{
178    return r;
179}
180
181#endif
182
183} // namespace boost
184
185#endif // BOOST_NO_FUNCTION_TEMPLATE_ORDERING
186
187namespace boost
188{
189    template< class T >
190    inline BOOST_DEDUCED_TYPENAME range_const_iterator<T>::type
191    const_begin( const T& r )
192    {
193        return begin( r );
194    }
195}
196
197#endif
Note: See TracBrowser for help on using the repository browser.