11 #ifndef ZYPP_TYPETRAITS_H 12 #define ZYPP_TYPETRAITS_H 14 #include <type_traits> 26 template<
typename C>
static std::true_type
test(
typename C::const_iterator * );
27 template<
typename C>
static std::false_type
test(...);
29 static constexpr
bool value = decltype(test<Tp>(
nullptr))::value;
32 template <
typename Tp>
37 using Signature =
typename C::const_iterator(C::*)()
const;
39 template<
typename C>
static std::true_type testBeg(
typename std::enable_if<std::is_same<decltype(
static_cast<Signature<C>>(&C::begin)),
Signature<C>>::value,
void>::type* );
40 template<
typename C>
static std::false_type testBeg(...);
42 template<
typename C>
static std::true_type testEnd(
typename std::enable_if<std::is_same<decltype(
static_cast<Signature<C>>(&C::end)),
Signature<C>>::value,
void>::type* );
43 template<
typename C>
static std::false_type testEnd(...);
46 static constexpr
bool beg_value = decltype(testBeg<Tp>(
nullptr))::value;
47 static constexpr
bool end_value = decltype(testEnd<Tp>(
nullptr))::value;
48 static constexpr
bool value = beg_value && end_value;
56 :
public std::integral_constant<bool, _detail::has_type_const_iterator<Tp>::value>
62 :
public std::integral_constant<bool, _detail::_has_container_begin_end<Tp>::value>
68 :
public std::integral_constant<bool, !std::is_same<Tp, std::string>::value && has_container_begin_end<Tp>::value>
74 #endif // ZYPP_TYPETRAITS_H Whether Tp is a container (begin/end iterabel, but not plain std::string)
static std::true_type test(typename C::const_iterator *)
static constexpr bool value
Whether Tp defines type Tp::const_iterator.
Whether Tp defines methods Tp::const_iterator begin/end() const
typename C::const_iterator(C::*)() const Signature
Easy-to use interface to the ZYPP dependency resolver.