Changes requested from code review.

This commit is contained in:
David Avedissian 2018-12-08 15:46:33 +00:00
parent f665a92330
commit 2c23f0a346
2 changed files with 39 additions and 35 deletions

View file

@ -3,16 +3,17 @@
#include <iterator> // random_access_iterator_tag #include <iterator> // random_access_iterator_tag
#include <nlohmann/detail/meta/void_t.hpp> #include <nlohmann/detail/meta/void_t.hpp>
#include <nlohmann/detail/meta/cpp_future.hpp>
namespace nlohmann namespace nlohmann
{ {
namespace detail namespace detail
{ {
template <class It, class = void> template <typename It, typename = void>
struct _iterator_types {}; struct iterator_types {};
template <class It> template <typename It>
struct _iterator_types< struct iterator_types<
It, It,
void_t<typename It::difference_type, typename It::value_type, typename It::pointer, void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
typename It::reference, typename It::iterator_category>> { typename It::reference, typename It::iterator_category>> {
@ -23,25 +24,26 @@ struct _iterator_types<
using iterator_category = typename It::iterator_category; using iterator_category = typename It::iterator_category;
}; };
template <class Iter> // This is required as some compilers implement std::iterator_traits in a way that
struct iterator_traits : _iterator_types<Iter> {}; // doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341.
template <typename T, typename = void>
struct iterator_traits
{
};
template <class T> template <typename T>
struct iterator_traits<T*> { struct iterator_traits<T, enable_if_t<!std::is_pointer<T>::value>>
: iterator_types<T>
{
};
template <typename T>
struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>> {
typedef std::random_access_iterator_tag iterator_category; typedef std::random_access_iterator_tag iterator_category;
typedef T value_type; typedef T value_type;
typedef ptrdiff_t difference_type; typedef ptrdiff_t difference_type;
typedef T* pointer; typedef T* pointer;
typedef T& reference; typedef T& reference;
}; };
template <class T>
struct iterator_traits<const T*> {
typedef std::random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef const T* pointer;
typedef const T& reference;
};
} }
} }

View file

@ -344,16 +344,18 @@ template <typename ...Ts> using void_t = typename make_void<Ts...>::type;
} // namespace detail } // namespace detail
} // namespace nlohmann } // namespace nlohmann
// #include <nlohmann/detail/meta/cpp_future.hpp>
namespace nlohmann namespace nlohmann
{ {
namespace detail namespace detail
{ {
template <class It, class = void> template <typename It, typename = void>
struct _iterator_types {}; struct iterator_types {};
template <class It> template <typename It>
struct _iterator_types < struct iterator_types <
It, It,
void_t<typename It::difference_type, typename It::value_type, typename It::pointer, void_t<typename It::difference_type, typename It::value_type, typename It::pointer,
typename It::reference, typename It::iterator_category >> typename It::reference, typename It::iterator_category >>
@ -365,11 +367,21 @@ struct _iterator_types <
using iterator_category = typename It::iterator_category; using iterator_category = typename It::iterator_category;
}; };
template <class Iter> // This is required due to https://github.com/nlohmann/json/issues/1341 - where some
struct iterator_traits : _iterator_types<Iter> {}; // compilers implement std::iterator_traits in a way that doesn't work with SFINAE.
template <typename T, typename = void>
struct iterator_traits
{
};
template <class T> template <typename T>
struct iterator_traits<T*> struct iterator_traits < T, enable_if_t < !std::is_pointer<T>::value >>
: iterator_types<T>
{
};
template <typename T>
struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
{ {
typedef std::random_access_iterator_tag iterator_category; typedef std::random_access_iterator_tag iterator_category;
typedef T value_type; typedef T value_type;
@ -377,16 +389,6 @@ struct iterator_traits<T*>
typedef T* pointer; typedef T* pointer;
typedef T& reference; typedef T& reference;
}; };
template <class T>
struct iterator_traits<const T*>
{
typedef std::random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef const T* pointer;
typedef const T& reference;
};
} }
} }
// #include <nlohmann/detail/meta/cpp_future.hpp> // #include <nlohmann/detail/meta/cpp_future.hpp>