Line data Source code
1 : #pragma once 2 : 3 : #include <Settings/NamespaceSettings.hpp> 4 : 5 : #include <AH/STL/type_traits> 6 : #include <AH/STL/utility> 7 : 8 : BEGIN_CS_NAMESPACE 9 : 10 : template <class...> 11 : using void_t = void; 12 : 13 : template <class, class = void> 14 : struct has_method_begin : std::false_type {}; 15 : 16 : template <class T> 17 : struct has_method_begin<T, void_t<decltype(std::declval<T>().begin())>> 18 : : std::true_type {}; 19 : 20 : /// Calls the `begin()` method of `t` if that method exists. 21 : template <class T> 22 : typename std::enable_if<has_method_begin<T>::value>::type 23 : begin_if_possible(T &t) { 24 : t.begin(); 25 : } 26 : 27 : template <class T> 28 : typename std::enable_if<!has_method_begin<T>::value>::type 29 0 : begin_if_possible(T &) {} 30 : 31 : END_CS_NAMESPACE