xutility (1486B)
1 // -*- c++ -*- 2 #pragma once 3 4 #include <climits> 5 #include <cstdlib> 6 #include <utility> 7 8 #pragma push_macro("inline") 9 #define inline constexpr inline 10 #pragma push_macro("inline") 11 #define inline inline _Pragma("pop_macro(\"inline\")") 12 #pragma push_macro("inline") 13 #define inline inline _Pragma("pop_macro(\"inline\")") 14 15 #define iterator_traits dummy_iterator_traits 16 #include_next<xutility> 17 #undef iterator_traits 18 #pragma pop_macro("inline") 19 20 namespace std 21 { 22 // create sfinae friendly iterator traits 23 namespace Detail 24 { 25 template <typename T, typename = void> struct iterator_traits0 {}; 26 template <typename T> 27 struct iterator_traits0<T, std::void_t< 28 typename T::difference_type, typename T::value_type, typename T::pointer, 29 typename T::reference, typename T::iterator_category>> 30 { 31 using difference_type = typename T::difference_type; 32 using value_type = typename T::value_type; 33 using pointer = typename T::pointer; 34 using reference = typename T::reference; 35 using iterator_category = typename T::iterator_category; 36 }; 37 } 38 39 template <typename T> 40 struct iterator_traits : Detail::iterator_traits0<T> {}; 41 42 template <typename T> 43 struct iterator_traits<T*> 44 { 45 using difference_type = std::ptrdiff_t; 46 using value_type = std::remove_cv_t<T>; 47 using pointer = T*; 48 using reference = T&; 49 using iterator_category = std::random_access_iterator_tag; 50 }; 51 }