Chris@16
|
1 // (C) Copyright Gennadiy Rozental 2004-2008.
|
Chris@16
|
2 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
3 // (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
4 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5
|
Chris@16
|
6 // See http://www.boost.org/libs/test for the library home page.
|
Chris@16
|
7 //
|
Chris@16
|
8 // File : $RCSfile$
|
Chris@16
|
9 //
|
Chris@101
|
10 // Version : $Revision$
|
Chris@16
|
11 //
|
Chris@16
|
12 // Description : class basic_cstring comparisons implementation
|
Chris@16
|
13 // ***************************************************************************
|
Chris@16
|
14
|
Chris@16
|
15 #ifndef BOOST_TEST_BASIC_CSTRING_COMPARE_HPP_071894GER
|
Chris@16
|
16 #define BOOST_TEST_BASIC_CSTRING_COMPARE_HPP_071894GER
|
Chris@16
|
17
|
Chris@16
|
18 // Boost.Test
|
Chris@16
|
19 #include <boost/test/utils/basic_cstring/basic_cstring.hpp>
|
Chris@16
|
20
|
Chris@16
|
21 // STL
|
Chris@16
|
22 #include <functional>
|
Chris@16
|
23 #include <cctype>
|
Chris@16
|
24
|
Chris@16
|
25 #include <boost/test/detail/suppress_warnings.hpp>
|
Chris@16
|
26
|
Chris@16
|
27 //____________________________________________________________________________//
|
Chris@16
|
28
|
Chris@16
|
29 # if defined(BOOST_NO_STDC_NAMESPACE) && !BOOST_WORKAROUND(__BORLANDC__, <= 0x570)
|
Chris@16
|
30 namespace std { using ::toupper; }
|
Chris@16
|
31 # endif
|
Chris@16
|
32
|
Chris@16
|
33 namespace boost {
|
Chris@16
|
34
|
Chris@16
|
35 namespace unit_test {
|
Chris@16
|
36
|
Chris@16
|
37 // ************************************************************************** //
|
Chris@16
|
38 // ************** case_ins_compare ************** //
|
Chris@16
|
39 // ************************************************************************** //
|
Chris@16
|
40
|
Chris@16
|
41 namespace ut_detail {
|
Chris@16
|
42
|
Chris@16
|
43 template<class CharT>
|
Chris@16
|
44 struct case_ins
|
Chris@16
|
45 {
|
Chris@16
|
46 static bool eq( CharT c1, CharT c2 ) { return (std::toupper)( c1 ) == (std::toupper)( c2 ); }
|
Chris@16
|
47 static bool lt( CharT c1, CharT c2 ) { return (std::toupper)( c1 ) < (std::toupper)( c2 ); }
|
Chris@16
|
48
|
Chris@16
|
49 static int compare( CharT const* s1, CharT const* s2, std::size_t n )
|
Chris@16
|
50 {
|
Chris@16
|
51 for( std::size_t i = 0; i < n; ++i ) {
|
Chris@16
|
52 if( !eq( s1[i], s2[i] ) )
|
Chris@16
|
53 return lt( s1[i], s2[i] ) ? -1 : 1;
|
Chris@16
|
54 }
|
Chris@16
|
55 return 0;
|
Chris@16
|
56 }
|
Chris@16
|
57 };
|
Chris@16
|
58
|
Chris@16
|
59 } // namespace ut_detail
|
Chris@16
|
60
|
Chris@16
|
61 // ************************************************************************** //
|
Chris@16
|
62 // ************** case_ins_eq ************** //
|
Chris@16
|
63 // ************************************************************************** //
|
Chris@16
|
64
|
Chris@16
|
65 template<class CharT>
|
Chris@16
|
66 inline bool
|
Chris@16
|
67 case_ins_eq( basic_cstring<CharT> x, basic_cstring<CharT> y )
|
Chris@16
|
68 {
|
Chris@16
|
69 return x.size() == y.size() && ut_detail::case_ins<CharT>::compare( x.begin(), y.begin(), x.size() ) == 0;
|
Chris@16
|
70 }
|
Chris@16
|
71
|
Chris@16
|
72 //____________________________________________________________________________//
|
Chris@16
|
73
|
Chris@16
|
74 // ************************************************************************** //
|
Chris@16
|
75 // ************** case_ins_less ************** //
|
Chris@16
|
76 // ************************************************************************** //
|
Chris@16
|
77
|
Chris@16
|
78 template<class CharT>
|
Chris@16
|
79 class case_ins_less : public std::binary_function<basic_cstring<CharT>,basic_cstring<CharT>,bool>
|
Chris@16
|
80 {
|
Chris@16
|
81 public:
|
Chris@16
|
82 bool operator()( basic_cstring<CharT> x, basic_cstring<CharT> y ) const
|
Chris@16
|
83 {
|
Chris@16
|
84 return x.size() != y.size()
|
Chris@16
|
85 ? x.size() < y.size()
|
Chris@16
|
86 : ut_detail::case_ins<CharT>::compare( x.begin(), y.begin(), x.size() ) < 0;
|
Chris@16
|
87 }
|
Chris@16
|
88 };
|
Chris@16
|
89
|
Chris@16
|
90 //____________________________________________________________________________//
|
Chris@16
|
91
|
Chris@16
|
92 // ************************************************************************** //
|
Chris@16
|
93 // ************** operator < ************** //
|
Chris@16
|
94 // ************************************************************************** //
|
Chris@16
|
95
|
Chris@16
|
96 template<class CharT>
|
Chris@16
|
97 inline bool
|
Chris@16
|
98 operator <( boost::unit_test::basic_cstring<CharT> const& x,
|
Chris@16
|
99 boost::unit_test::basic_cstring<CharT> const& y )
|
Chris@16
|
100 {
|
Chris@16
|
101 typedef typename boost::unit_test::basic_cstring<CharT>::traits_type traits_type;
|
Chris@16
|
102 return x.size() != y.size()
|
Chris@16
|
103 ? x.size() < y.size()
|
Chris@16
|
104 : traits_type::compare( x.begin(), y.begin(), x.size() ) < 0;
|
Chris@16
|
105 }
|
Chris@16
|
106
|
Chris@16
|
107 } // namespace unit_test
|
Chris@16
|
108
|
Chris@16
|
109 } // namespace boost
|
Chris@16
|
110
|
Chris@16
|
111 //____________________________________________________________________________//
|
Chris@16
|
112
|
Chris@16
|
113 #include <boost/test/detail/enable_warnings.hpp>
|
Chris@16
|
114
|
Chris@16
|
115 #endif // BOOST_TEST_BASIC_CSTRING_COMPARE_HPP_071894GER
|