source: XIOS/dev/dev_olga/src/extern/boost/include/boost/algorithm/string/compare.hpp @ 1022

Last change on this file since 1022 was 1022, checked in by mhnguyen, 7 years ago
File size: 6.2 KB
Line 
1//  Boost string_algo library compare.hpp header file  -------------------------//
2
3//  Copyright Pavol Droba 2002-2006.
4//
5// Distributed under the Boost Software License, Version 1.0.
6//    (See accompanying file LICENSE_1_0.txt or copy at
7//          http://www.boost.org/LICENSE_1_0.txt)
8
9//  See http://www.boost.org/ for updates, documentation, and revision history.
10
11#ifndef BOOST_STRING_COMPARE_HPP
12#define BOOST_STRING_COMPARE_HPP
13
14#include <boost/algorithm/string/config.hpp>
15#include <locale>
16
17/*! \file
18    Defines element comparison predicates. Many algorithms in this library can
19    take an additional argument with a predicate used to compare elements.
20    This makes it possible, for instance, to have case insensitive versions
21    of the algorithms.
22*/
23
24namespace boost {
25    namespace algorithm {
26
27        //  is_equal functor  -----------------------------------------------//
28
29        //! is_equal functor
30        /*!
31            Standard STL equal_to only handle comparison between arguments
32            of the same type. This is a less restrictive version which wraps operator ==.
33        */
34        struct is_equal
35        {
36            //! Function operator
37            /*!
38                Compare two operands for equality
39            */
40            template< typename T1, typename T2 >
41                bool operator()( const T1& Arg1, const T2& Arg2 ) const
42            {
43                return Arg1==Arg2;
44            }
45        };
46
47        //! case insensitive version of is_equal
48        /*!
49            Case insensitive comparison predicate. Comparison is done using
50            specified locales.
51        */
52        struct is_iequal
53        {
54            //! Constructor
55            /*!
56                \param Loc locales used for comparison
57            */
58            is_iequal( const std::locale& Loc=std::locale() ) :
59                m_Loc( Loc ) {}
60
61            //! Function operator
62            /*!
63                Compare two operands. Case is ignored.
64            */
65            template< typename T1, typename T2 >
66                bool operator()( const T1& Arg1, const T2& Arg2 ) const
67            {
68                #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL)
69                    return std::toupper(Arg1)==std::toupper(Arg2);
70                #else
71                    return std::toupper<T1>(Arg1,m_Loc)==std::toupper<T2>(Arg2,m_Loc);
72                #endif
73            }
74
75        private:
76            std::locale m_Loc;
77        };
78
79        //  is_less functor  -----------------------------------------------//
80
81        //! is_less functor
82        /*!
83            Convenient version of standard std::less. Operation is templated, therefore it is
84            not required to specify the exact types upon the construction
85         */
86        struct is_less
87        {
88            //! Functor operation
89            /*!
90                Compare two operands using > operator
91             */
92            template< typename T1, typename T2 >
93                bool operator()( const T1& Arg1, const T2& Arg2 ) const
94            {
95                return Arg1<Arg2;
96            }
97        };
98
99
100        //! case insensitive version of is_less
101        /*!
102            Case insensitive comparison predicate. Comparison is done using
103            specified locales.
104        */
105        struct is_iless
106        {
107            //! Constructor
108            /*!
109                \param Loc locales used for comparison
110            */
111            is_iless( const std::locale& Loc=std::locale() ) :
112                m_Loc( Loc ) {}
113
114            //! Function operator
115            /*!
116                Compare two operands. Case is ignored.
117            */
118            template< typename T1, typename T2 >
119                bool operator()( const T1& Arg1, const T2& Arg2 ) const
120            {
121                #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL)
122                    return std::toupper(Arg1)<std::toupper(Arg2);
123                #else
124                    return std::toupper<T1>(Arg1,m_Loc)<std::toupper<T2>(Arg2,m_Loc);
125                #endif
126            }
127
128        private:
129            std::locale m_Loc;
130        };
131
132        //  is_not_greater functor  -----------------------------------------------//
133
134        //! is_not_greater functor
135        /*!
136            Convenient version of standard std::not_greater_to. Operation is templated, therefore it is
137            not required to specify the exact types upon the construction
138         */
139        struct is_not_greater
140        {
141            //! Functor operation
142            /*!
143                Compare two operands using > operator
144             */
145            template< typename T1, typename T2 >
146                bool operator()( const T1& Arg1, const T2& Arg2 ) const
147            {
148                return Arg1<=Arg2;
149            }
150        };
151
152
153        //! case insensitive version of is_not_greater
154        /*!
155            Case insensitive comparison predicate. Comparison is done using
156            specified locales.
157        */
158        struct is_not_igreater
159        {
160            //! Constructor
161            /*!
162                \param Loc locales used for comparison
163            */
164            is_not_igreater( const std::locale& Loc=std::locale() ) :
165                m_Loc( Loc ) {}
166
167            //! Function operator
168            /*!
169                Compare two operands. Case is ignored.
170            */
171            template< typename T1, typename T2 >
172                bool operator()( const T1& Arg1, const T2& Arg2 ) const
173            {
174                #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL)
175                    return std::toupper(Arg1)<=std::toupper(Arg2);
176                #else
177                    return std::toupper<T1>(Arg1,m_Loc)<=std::toupper<T2>(Arg2,m_Loc);
178                #endif
179            }
180
181        private:
182            std::locale m_Loc;
183        };
184
185
186    } // namespace algorithm
187
188    // pull names to the boost namespace
189    using algorithm::is_equal;
190    using algorithm::is_iequal;
191    using algorithm::is_less;
192    using algorithm::is_iless;
193    using algorithm::is_not_greater;
194    using algorithm::is_not_igreater;
195
196} // namespace boost
197
198
199#endif  // BOOST_STRING_COMPARE_HPP
Note: See TracBrowser for help on using the repository browser.