source: XIOS/dev/dev_olga/src/extern/boost/include/boost/range/algorithm/equal.hpp @ 1022

Last change on this file since 1022 was 1022, checked in by mhnguyen, 7 years ago
File size: 8.5 KB
Line 
1// Boost.Range library
2//
3//  Copyright Neil Groves 2009.
4//  Use, modification and distribution is subject to the Boost Software
5//  License, Version 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_ALGORITHM_EQUAL_HPP_INCLUDED
11#define BOOST_RANGE_ALGORITHM_EQUAL_HPP_INCLUDED
12
13#include <boost/config.hpp>
14#include <boost/range/concepts.hpp>
15#include <iterator>
16
17namespace boost
18{
19    namespace range_detail
20    {
21        // An implementation of equality comparison that is optimized for iterator
22        // traversal categories less than RandomAccessTraversal.
23        template< class SinglePassTraversalReadableIterator1,
24                  class SinglePassTraversalReadableIterator2,
25                  class IteratorCategoryTag1,
26                  class IteratorCategoryTag2 >
27        inline bool equal_impl( SinglePassTraversalReadableIterator1 first1,
28                                SinglePassTraversalReadableIterator1 last1,
29                                SinglePassTraversalReadableIterator2 first2,
30                                SinglePassTraversalReadableIterator2 last2,
31                                IteratorCategoryTag1,
32                                IteratorCategoryTag2 )
33        {
34            do
35            {
36                // If we have reached the end of the left range then this is
37                // the end of the loop. They are equal if and only if we have
38                // simultaneously reached the end of the right range.
39                if (first1 == last1)
40                    return first2 == last2;
41
42                // If we have reached the end of the right range at this line
43                // it indicates that the right range is shorter than the left
44                // and hence the result is false.
45                if (first2 == last2)
46                    return false;
47
48                // continue looping if and only if the values are equal
49            } while(*first1++ == *first2++);
50
51            // Reaching this line in the algorithm indicates that a value
52            // inequality has been detected.
53            return false;
54        }
55
56        template< class SinglePassTraversalReadableIterator1,
57                  class SinglePassTraversalReadableIterator2,
58                  class IteratorCategoryTag1,
59                  class IteratorCategoryTag2,
60                  class BinaryPredicate >
61        inline bool equal_impl( SinglePassTraversalReadableIterator1 first1,
62                                SinglePassTraversalReadableIterator1 last1,
63                                SinglePassTraversalReadableIterator2 first2,
64                                SinglePassTraversalReadableIterator2 last2,
65                                BinaryPredicate                      pred,
66                                IteratorCategoryTag1,
67                                IteratorCategoryTag2 )
68        {
69            do
70            {
71                // If we have reached the end of the left range then this is
72                // the end of the loop. They are equal if and only if we have
73                // simultaneously reached the end of the right range.
74                if (first1 == last1)
75                    return first2 == last2;
76
77                // If we have reached the end of the right range at this line
78                // it indicates that the right range is shorter than the left
79                // and hence the result is false.
80                if (first2 == last2)
81                    return false;
82
83                // continue looping if and only if the values are equal
84            } while(pred(*first1++, *first2++));
85
86            // Reaching this line in the algorithm indicates that a value
87            // inequality has been detected.
88            return false;
89        }
90
91        // An implementation of equality comparison that is optimized for
92        // random access iterators.
93        template< class RandomAccessTraversalReadableIterator1,
94                  class RandomAccessTraversalReadableIterator2 >
95        inline bool equal_impl( RandomAccessTraversalReadableIterator1 first1,
96                                RandomAccessTraversalReadableIterator1 last1,
97                                RandomAccessTraversalReadableIterator2 first2,
98                                RandomAccessTraversalReadableIterator2 last2,
99                                std::random_access_iterator_tag,
100                                std::random_access_iterator_tag )
101        {
102            return ((last1 - first1) == (last2 - first2))
103                && std::equal(first1, last1, first2);
104        }
105
106        template< class RandomAccessTraversalReadableIterator1,
107                  class RandomAccessTraversalReadableIterator2,
108                  class BinaryPredicate >
109        inline bool equal_impl( RandomAccessTraversalReadableIterator1 first1,
110                                RandomAccessTraversalReadableIterator1 last1,
111                                RandomAccessTraversalReadableIterator2 first2,
112                                RandomAccessTraversalReadableIterator2 last2,
113                                BinaryPredicate                        pred )
114        {
115            return ((last1 - first1) == (last2 - first2))
116                && std::equal(first1, last1, first2, pred);
117        }
118
119        template< class SinglePassTraversalReadableIterator1,
120                  class SinglePassTraversalReadableIterator2 >
121        inline bool equal( SinglePassTraversalReadableIterator1 first1,
122                           SinglePassTraversalReadableIterator1 last1,
123                           SinglePassTraversalReadableIterator2 first2,
124                           SinglePassTraversalReadableIterator2 last2 )
125        {
126            BOOST_DEDUCED_TYPENAME std::iterator_traits< SinglePassTraversalReadableIterator1 >::iterator_category tag1;
127            BOOST_DEDUCED_TYPENAME std::iterator_traits< SinglePassTraversalReadableIterator2 >::iterator_category tag2;
128
129            return equal_impl(first1, last1, first2, last2, tag1, tag2);
130        }
131
132        template< class SinglePassTraversalReadableIterator1,
133                  class SinglePassTraversalReadableIterator2,
134                  class BinaryPredicate >
135        inline bool equal( SinglePassTraversalReadableIterator1 first1,
136                           SinglePassTraversalReadableIterator1 last1,
137                           SinglePassTraversalReadableIterator2 first2,
138                           SinglePassTraversalReadableIterator2 last2,
139                           BinaryPredicate                      pred )
140        {
141            BOOST_DEDUCED_TYPENAME std::iterator_traits< SinglePassTraversalReadableIterator1 >::iterator_category tag1;
142            BOOST_DEDUCED_TYPENAME std::iterator_traits< SinglePassTraversalReadableIterator2 >::iterator_category tag2;
143
144            return equal_impl(first1, last1, first2, last2, pred, tag1, tag2);
145        }
146
147    } // namespace range_detail
148
149    namespace range
150    {
151
152        /// \brief template function equal
153        ///
154        /// range-based version of the equal std algorithm
155        ///
156        /// \pre SinglePassRange1 is a model of the SinglePassRangeConcept
157        /// \pre SinglePassRange2 is a model of the SinglePassRangeConcept
158        /// \pre BinaryPredicate is a model of the BinaryPredicateConcept
159        template< class SinglePassRange1, class SinglePassRange2 >
160        inline bool equal( const SinglePassRange1& rng1, const SinglePassRange2& rng2 )
161        {
162            BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<const SinglePassRange1> ));
163            BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<const SinglePassRange2> ));
164
165            return ::boost::range_detail::equal(
166                ::boost::begin(rng1), ::boost::end(rng1),
167                ::boost::begin(rng2), ::boost::end(rng2) );
168        }
169
170        /// \overload
171        template< class SinglePassRange1, class SinglePassRange2, class BinaryPredicate >
172        inline bool equal( const SinglePassRange1& rng1, const SinglePassRange2& rng2,
173                           BinaryPredicate pred )
174        {
175            BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<const SinglePassRange1> ));
176            BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<const SinglePassRange2> ));
177
178            return ::boost::range_detail::equal(
179                ::boost::begin(rng1), ::boost::end(rng1),
180                ::boost::begin(rng2), ::boost::end(rng2),
181                pred);
182        }
183
184    } // namespace range
185    using range::equal;
186} // namespace boost
187
188#endif // include guard
Note: See TracBrowser for help on using the repository browser.