forked from boostorg/container
Closes #58 ("Comparing strings does not compile in gcc 7+ in C++17 mode")
This commit is contained in:
@ -1220,6 +1220,7 @@ use [*Boost.Container]? There are several reasons for that:
|
||||
|
||||
* Fixed bugs:
|
||||
* [@https://github.com/boostorg/container/pull/54 GitHub #54: ['"no sbrk() in VxWorks, configure dlmalloc to use only mmap"]].
|
||||
* [@https://github.com/boostorg/container/issues/58 GitHub #58: ['"Comparing strings does not compile in gcc 7+ in C++17 mode"]].
|
||||
|
||||
[endsect]
|
||||
|
||||
|
@ -2953,6 +2953,20 @@ typedef basic_string
|
||||
,new_allocator<wchar_t> >
|
||||
wstring;
|
||||
|
||||
#else
|
||||
|
||||
template<class S>
|
||||
struct is_string
|
||||
{
|
||||
static const bool value = false;
|
||||
};
|
||||
|
||||
template<class C, class T, class A>
|
||||
struct is_string< basic_string<C, T, A> >
|
||||
{
|
||||
static const bool value = true;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
// ------------------------------------------------------------
|
||||
@ -3060,16 +3074,22 @@ operator==(const basic_string<CharT,Traits,Allocator>& x, const CharT* s)
|
||||
}
|
||||
|
||||
template <class CharT, class Traits, class Allocator, template <class, class> class BasicStringView>
|
||||
inline bool
|
||||
operator==( BasicStringView<CharT,Traits> x, const basic_string<CharT,Traits,Allocator>& y)
|
||||
inline
|
||||
BOOST_CONTAINER_DOC1ST( bool,
|
||||
typename container_detail::disable_if
|
||||
<is_string< BasicStringView<CharT BOOST_MOVE_I Traits> > BOOST_MOVE_I bool >::type)
|
||||
operator==( BasicStringView<CharT,Traits> x, const basic_string<CharT,Traits,Allocator>& y)
|
||||
{
|
||||
return x.size() == y.size() &&
|
||||
Traits::compare(x.data(), y.data(), x.size()) == 0;
|
||||
}
|
||||
|
||||
template <class CharT, class Traits, class Allocator, template <class, class> class BasicStringView>
|
||||
inline bool
|
||||
operator==( const basic_string<CharT,Traits,Allocator>& x, BasicStringView<CharT,Traits> y)
|
||||
inline
|
||||
BOOST_CONTAINER_DOC1ST( bool,
|
||||
typename container_detail::disable_if
|
||||
<is_string< BasicStringView<CharT BOOST_MOVE_I Traits> > BOOST_MOVE_I bool >::type)
|
||||
operator==( const basic_string<CharT,Traits,Allocator>& x, BasicStringView<CharT,Traits> y)
|
||||
{
|
||||
return x.size() == y.size() &&
|
||||
Traits::compare(x.data(), y.data(), x.size()) == 0;
|
||||
@ -3092,12 +3112,18 @@ operator!=(const basic_string<CharT,Traits,Allocator>& x, const CharT* s)
|
||||
|
||||
|
||||
template <class CharT, class Traits, class Allocator, template <class, class> class BasicStringView>
|
||||
inline bool
|
||||
inline
|
||||
BOOST_CONTAINER_DOC1ST( bool,
|
||||
typename container_detail::disable_if
|
||||
<is_string< BasicStringView<CharT BOOST_MOVE_I Traits> > BOOST_MOVE_I bool >::type)
|
||||
operator!=( BasicStringView<CharT,Traits> x, const basic_string<CharT,Traits,Allocator>& y)
|
||||
{ return !(x == y); }
|
||||
|
||||
template <class CharT, class Traits, class Allocator, template <class, class> class BasicStringView>
|
||||
inline bool
|
||||
inline
|
||||
BOOST_CONTAINER_DOC1ST( bool,
|
||||
typename container_detail::disable_if
|
||||
<is_string< BasicStringView<CharT BOOST_MOVE_I Traits> > BOOST_MOVE_I bool >::type)
|
||||
operator!=( const basic_string<CharT,Traits,Allocator>& x, BasicStringView<CharT,Traits> y)
|
||||
{ return !(x == y); }
|
||||
|
||||
@ -3124,12 +3150,18 @@ operator<(const basic_string<CharT,Traits,Allocator>& x, const CharT* s)
|
||||
}
|
||||
|
||||
template <class CharT, class Traits, class Allocator, template <class, class> class BasicStringView>
|
||||
inline bool
|
||||
inline
|
||||
BOOST_CONTAINER_DOC1ST( bool,
|
||||
typename container_detail::disable_if
|
||||
<is_string< BasicStringView<CharT BOOST_MOVE_I Traits> > BOOST_MOVE_I bool >::type)
|
||||
operator<( BasicStringView<CharT,Traits> x, const basic_string<CharT,Traits,Allocator>& y)
|
||||
{ return y.compare(x) > 0; }
|
||||
|
||||
template <class CharT, class Traits, class Allocator, template <class, class> class BasicStringView>
|
||||
inline bool
|
||||
inline
|
||||
BOOST_CONTAINER_DOC1ST( bool,
|
||||
typename container_detail::disable_if
|
||||
<is_string< BasicStringView<CharT BOOST_MOVE_I Traits> > BOOST_MOVE_I bool >::type)
|
||||
operator<( const basic_string<CharT,Traits,Allocator>& x, BasicStringView<CharT,Traits> y)
|
||||
{ return x.compare(y) < 0; }
|
||||
|
||||
@ -3153,12 +3185,18 @@ operator>(const basic_string<CharT,Traits,Allocator>& x, const CharT* s)
|
||||
}
|
||||
|
||||
template <class CharT, class Traits, class Allocator, template <class, class> class BasicStringView>
|
||||
inline bool
|
||||
inline
|
||||
BOOST_CONTAINER_DOC1ST( bool,
|
||||
typename container_detail::disable_if
|
||||
<is_string< BasicStringView<CharT BOOST_MOVE_I Traits> > BOOST_MOVE_I bool >::type)
|
||||
operator>( BasicStringView<CharT,Traits> x, const basic_string<CharT,Traits,Allocator>& y)
|
||||
{ return y < x; }
|
||||
|
||||
template <class CharT, class Traits, class Allocator, template <class, class> class BasicStringView>
|
||||
inline bool
|
||||
inline
|
||||
BOOST_CONTAINER_DOC1ST( bool,
|
||||
typename container_detail::disable_if
|
||||
<is_string< BasicStringView<CharT BOOST_MOVE_I Traits> > BOOST_MOVE_I bool >::type)
|
||||
operator>( const basic_string<CharT,Traits,Allocator>& x, BasicStringView<CharT,Traits> y)
|
||||
{ return y < x; }
|
||||
|
||||
@ -3181,12 +3219,18 @@ operator<=(const basic_string<CharT,Traits,Allocator>& x, const CharT* s)
|
||||
|
||||
|
||||
template <class CharT, class Traits, class Allocator, template <class, class> class BasicStringView>
|
||||
inline bool
|
||||
inline
|
||||
BOOST_CONTAINER_DOC1ST( bool,
|
||||
typename container_detail::disable_if
|
||||
<is_string< BasicStringView<CharT BOOST_MOVE_I Traits> > BOOST_MOVE_I bool >::type)
|
||||
operator<=( BasicStringView<CharT,Traits> x, const basic_string<CharT,Traits,Allocator>& y)
|
||||
{ return !(y < x); }
|
||||
|
||||
template <class CharT, class Traits, class Allocator, template <class, class> class BasicStringView>
|
||||
inline bool
|
||||
inline
|
||||
BOOST_CONTAINER_DOC1ST( bool,
|
||||
typename container_detail::disable_if
|
||||
<is_string< BasicStringView<CharT BOOST_MOVE_I Traits> > BOOST_MOVE_I bool >::type)
|
||||
operator<=( const basic_string<CharT,Traits,Allocator>& x, BasicStringView<CharT,Traits> y)
|
||||
{ return !(y < x); }
|
||||
|
||||
@ -3207,12 +3251,18 @@ operator>=(const basic_string<CharT,Traits,Allocator>& x, const CharT* s)
|
||||
{ return !(x < s); }
|
||||
|
||||
template <class CharT, class Traits, class Allocator, template <class, class> class BasicStringView>
|
||||
inline bool
|
||||
inline
|
||||
BOOST_CONTAINER_DOC1ST( bool,
|
||||
typename container_detail::disable_if
|
||||
<is_string< BasicStringView<CharT BOOST_MOVE_I Traits> > BOOST_MOVE_I bool >::type)
|
||||
operator>=( BasicStringView<CharT,Traits> x, const basic_string<CharT,Traits,Allocator>& y)
|
||||
{ return !(x < y); }
|
||||
|
||||
template <class CharT, class Traits, class Allocator, template <class, class> class BasicStringView>
|
||||
inline bool
|
||||
inline
|
||||
BOOST_CONTAINER_DOC1ST( bool,
|
||||
typename container_detail::disable_if
|
||||
<is_string< BasicStringView<CharT BOOST_MOVE_I Traits> > BOOST_MOVE_I bool >::type)
|
||||
operator>=( const basic_string<CharT,Traits,Allocator>& x, BasicStringView<CharT,Traits> y)
|
||||
{ return !(x < y); }
|
||||
|
||||
|
58
test/comparison_test.hpp
Normal file
58
test/comparison_test.hpp
Normal file
@ -0,0 +1,58 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// (C) Copyright Ion Gaztanaga 2017-2017. Distributed under the Boost
|
||||
// Software License, Version 1.0. (See accompanying file
|
||||
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
// See http://www.boost.org/libs/container for documentation.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef BOOST_CONTAINER_TEST_COMPARISON_TEST_HPP
|
||||
#define BOOST_CONTAINER_TEST_COMPARISON_TEST_HPP
|
||||
|
||||
#include <deque>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace container {
|
||||
namespace test {
|
||||
|
||||
|
||||
template<class Cont>
|
||||
bool test_container_comparisons()
|
||||
{
|
||||
typedef typename Cont::value_type value_type;
|
||||
|
||||
Cont cont;
|
||||
cont.push_back(value_type(1));
|
||||
cont.push_back(value_type(2));
|
||||
cont.push_back(value_type(3));
|
||||
|
||||
Cont cont_equal(cont);
|
||||
|
||||
Cont cont_less;
|
||||
cont_less.push_back(value_type(1));
|
||||
cont_less.push_back(value_type(2));
|
||||
cont_less.push_back(value_type(2));
|
||||
|
||||
BOOST_TEST(cont == cont_equal);
|
||||
BOOST_TEST(!(cont != cont_equal));
|
||||
BOOST_TEST(cont != cont_less);
|
||||
BOOST_TEST(cont_less < cont);
|
||||
BOOST_TEST(cont_less <= cont);
|
||||
BOOST_TEST(!(cont_less > cont));
|
||||
BOOST_TEST(!(cont_less >= cont));
|
||||
BOOST_TEST(!(cont < cont_less));
|
||||
BOOST_TEST(!(cont <= cont_less));
|
||||
BOOST_TEST(cont > cont_less);
|
||||
BOOST_TEST(cont >= cont_less);
|
||||
|
||||
return ::boost::report_errors() == 0;
|
||||
}
|
||||
|
||||
} //namespace test {
|
||||
} //namespace container {
|
||||
} //namespace boost {
|
||||
|
||||
#endif //#ifndef BOOST_CONTAINER_TEST_COMPARISON_TEST_HPP
|
@ -24,8 +24,10 @@
|
||||
#include "expand_bwd_test_template.hpp"
|
||||
#include "propagate_allocator_test.hpp"
|
||||
#include "default_init_test.hpp"
|
||||
#include "comparison_test.hpp"
|
||||
#include "../../intrusive/test/iterator_test.hpp"
|
||||
#include <boost/utility/string_view.hpp>
|
||||
#include <boost/core/lightweight_test.hpp>
|
||||
|
||||
using namespace boost::container;
|
||||
|
||||
@ -507,8 +509,10 @@ struct alloc_propagate_base<boost_container_string>
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
}}} //namespace boost::container::test
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
if(string_test<char>()){
|
||||
@ -558,6 +562,16 @@ int main()
|
||||
boost::intrusive::test::test_iterator_random< cont_int >(a);
|
||||
}
|
||||
|
||||
////////////////////////////////////
|
||||
// Comparison testing
|
||||
////////////////////////////////////
|
||||
{
|
||||
if(!boost::container::test::test_container_comparisons<string>())
|
||||
return 1;
|
||||
if(!boost::container::test::test_container_comparisons<wstring>())
|
||||
return 1;
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user