// @author: Andrei Alexandrescu
-#ifndef FOLLY_BASE_TRAITS_H_
-#define FOLLY_BASE_TRAITS_H_
+#pragma once
#include <memory>
#include <limits>
#endif
#include <boost/type_traits.hpp>
-#include <boost/mpl/and.hpp>
#include <boost/mpl/has_xxx.hpp>
-#include <boost/mpl/not.hpp>
namespace folly {
traits_detail::has_true_IsZeroInitializable<T>::value
> {};
+template <typename...>
+struct Conjunction : std::true_type {};
+template <typename T>
+struct Conjunction<T> : T {};
+template <typename T, typename... TList>
+struct Conjunction<T, TList...>
+ : std::conditional<T::value, Conjunction<TList...>, T>::type {};
+
+template <typename...>
+struct Disjunction : std::false_type {};
+template <typename T>
+struct Disjunction<T> : T {};
+template <typename T, typename... TList>
+struct Disjunction<T, TList...>
+ : std::conditional<T::value, T, Disjunction<TList...>>::type {};
+
+template <typename T>
+struct Negation : std::integral_constant<bool, !T::value> {};
+
} // namespace folly
/**
template <class T, class U>
struct has_nothrow_constructor< std::pair<T, U> >
- : ::boost::mpl::and_< has_nothrow_constructor<T>,
- has_nothrow_constructor<U> > {};
+ : std::integral_constant<bool,
+ has_nothrow_constructor<T>::value &&
+ has_nothrow_constructor<U>::value> {};
} // namespace boost
// STL commonly-used types
template <class T, class U>
-struct IsRelocatable< std::pair<T, U> >
- : ::boost::mpl::and_< IsRelocatable<T>, IsRelocatable<U> > {};
+struct IsRelocatable< std::pair<T, U> >
+ : std::integral_constant<bool,
+ IsRelocatable<T>::value &&
+ IsRelocatable<U>::value> {};
// Is T one of T1, T2, ..., Tn?
template <class T, class... Ts>
// folly::to integral specializations can end up generating code
// inside what are really static ifs (not executed because of the templated
-// types) that violate -Wsign-compare so suppress them in order to not prevent
-// all calling code from using it.
+// types) that violate -Wsign-compare and/or -Wbool-compare so suppress them
+// in order to not prevent all calling code from using it.
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wsign-compare"
+#if __GNUC_PREREQ(5, 0)
+#pragma GCC diagnostic ignored "-Wbool-compare"
+#endif
template <typename RHS, RHS rhs, typename LHS>
bool less_than_impl(LHS const lhs) {
lhs < rhs;
}
-#pragma GCC diagnostic pop
-
template <typename RHS, RHS rhs, typename LHS>
bool greater_than_impl(LHS const lhs) {
return
lhs > rhs;
}
+#pragma GCC diagnostic pop
+
} // namespace detail {
// same as `x < 0`
} // namespace folly
+// gcc-5.0 changed string's implementation in libgcc to be non-relocatable
+#if __GNUC__ < 5
FOLLY_ASSUME_FBVECTOR_COMPATIBLE_3(std::basic_string);
+#endif
FOLLY_ASSUME_FBVECTOR_COMPATIBLE_2(std::vector);
FOLLY_ASSUME_FBVECTOR_COMPATIBLE_2(std::list);
FOLLY_ASSUME_FBVECTOR_COMPATIBLE_2(std::deque);
classname, func_name, /* nolint */ volatile); \
FOLLY_CREATE_HAS_MEMBER_FN_TRAITS_IMPL( \
classname, func_name, /* nolint */ volatile const)
-
-#endif //FOLLY_BASE_TRAITS_H_