diff --git a/docs/changes.txt b/docs/changes.txt index 7fc8529dd0..7f91d492bb 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -64,6 +64,14 @@ Changes in behaviour which may result in build errors wxGraphicsContext::CreatePen() continues to compile and work as before. +3.1.2: (released 2018-??-??) +---------------------------- + +All: + +- Make wxList iterators conform to input iterator requirements. + + 3.1.1: (released 2018-02-19) ---------------------------- diff --git a/include/wx/list.h b/include/wx/list.h index e370c2885b..7cd5205d90 100644 --- a/include/wx/list.h +++ b/include/wx/list.h @@ -599,6 +599,17 @@ private: // macros for definition of "template" list type // ----------------------------------------------------------------------------- +// Helper macro defining common iterator typedefs +#if wxUSE_STD_CONTAINERS_COMPATIBLY + #include + + #define WX_DECLARE_LIST_ITER_DIFF_AND_CATEGORY() \ + typedef std::ptrdiff_t difference_type; \ + typedef std::bidirectional_iterator_tag iterator_category; +#else + #define WX_DECLARE_LIST_ITER_DIFF_AND_CATEGORY() +#endif + // and now some heavy magic... // declare a list type named 'name' and containing elements of type 'T *' @@ -762,15 +773,19 @@ private: classexp iterator \ { \ public: \ + WX_DECLARE_LIST_ITER_DIFF_AND_CATEGORY() \ + typedef T* value_type; \ + typedef value_type* pointer; \ + typedef value_type& reference; \ + \ typedef nodetype Node; \ typedef iterator itor; \ - typedef T* value_type; \ typedef value_type* ptr_type; \ - typedef value_type& reference; \ \ Node* m_node; \ Node* m_init; \ public: \ + /* Compatibility typedefs, don't use */ \ typedef reference reference_type; \ typedef ptr_type pointer_type; \ \ @@ -811,8 +826,12 @@ private: classexp const_iterator \ { \ public: \ - typedef nodetype Node; \ + WX_DECLARE_LIST_ITER_DIFF_AND_CATEGORY() \ typedef T* value_type; \ + typedef const value_type* pointer; \ + typedef const value_type& reference; \ + \ + typedef nodetype Node; \ typedef const value_type& const_reference; \ typedef const_iterator itor; \ typedef value_type* ptr_type; \ @@ -863,11 +882,14 @@ private: classexp reverse_iterator \ { \ public: \ - typedef nodetype Node; \ + WX_DECLARE_LIST_ITER_DIFF_AND_CATEGORY() \ typedef T* value_type; \ + typedef value_type* pointer; \ + typedef value_type& reference; \ + \ + typedef nodetype Node; \ typedef reverse_iterator itor; \ typedef value_type* ptr_type; \ - typedef value_type& reference; \ \ Node* m_node; \ Node* m_init; \ @@ -901,8 +923,12 @@ private: classexp const_reverse_iterator \ { \ public: \ - typedef nodetype Node; \ + WX_DECLARE_LIST_ITER_DIFF_AND_CATEGORY() \ typedef T* value_type; \ + typedef const value_type* pointer; \ + typedef const value_type& reference; \ + \ + typedef nodetype Node; \ typedef const_reverse_iterator itor; \ typedef value_type* ptr_type; \ typedef const value_type& const_reference; \ diff --git a/tests/lists/lists.cpp b/tests/lists/lists.cpp index f4b1e3472d..d19376e7dd 100644 --- a/tests/lists/lists.cpp +++ b/tests/lists/lists.cpp @@ -210,3 +210,27 @@ void ListsTestCase::wxListCtorTest() CPPUNIT_ASSERT( Baz::GetNumber() == 0 ); } +#if wxUSE_STD_CONTAINERS_COMPATIBLY + +#include + +// Check that we convert wxList to std::list using the latter's ctor taking 2 +// iterators: this used to be broken in C++11 because wxList iterators didn't +// fully implement input iterator requirements. +TEST_CASE("wxList::iterator", "[list][std][iterator]") +{ + Baz baz1("one"), + baz2("two"); + + wxListBazs li; + li.push_back(&baz1); + li.push_back(&baz2); + + std::list stdli(li.begin(), li.end()); + CHECK( stdli.size() == 2 ); + + const wxListBazs cli; + CHECK( std::list(cli.begin(), cli.end()).empty() ); +} + +#endif // wxUSE_STD_CONTAINERS_COMPATIBLY