X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FTraits.h;h=2b94df1360effe21828adedb51b864e7d2282116;hb=fd915b73606e09a5f46a1bca0a5d3643a1567014;hp=db8bd33a3229d9b5d0abd8141c45a0418894f8c1;hpb=005a6c1f172f4508a9e00b413175750061174724;p=folly.git diff --git a/folly/Traits.h b/folly/Traits.h index db8bd33a..2b94df13 100644 --- a/folly/Traits.h +++ b/folly/Traits.h @@ -1,5 +1,5 @@ /* - * Copyright 2013 Facebook, Inc. + * Copyright 2014 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,8 +22,20 @@ #include #include #include - +#include + +#include + +// libc++ doesn't provide this header, nor does msvc +#ifdef FOLLY_HAVE_BITS_CXXCONFIG_H +// This file appears in two locations: inside fbcode and in the +// libstdc++ source code (when embedding fbstring as std::string). +// To aid in this schizophrenic use, two macros are defined in +// c++config.h: +// _LIBSTDCXX_FBSTRING - Set inside libstdc++. This is useful to +// gate use inside fbcode v. libstdc++ #include +#endif #include #include @@ -223,7 +235,7 @@ template struct IsZeroInitializable * although that is not guaranteed by the standard. */ -namespace std { +FOLLY_NAMESPACE_STD_BEGIN template struct pair; @@ -247,7 +259,7 @@ template template class shared_ptr; -} +FOLLY_NAMESPACE_STD_END namespace boost { @@ -332,7 +344,7 @@ template bool less_than_impl( typename std::enable_if< (rhs <= std::numeric_limits::max() - && rhs >= std::numeric_limits::min()), + && rhs > std::numeric_limits::min()), LHS >::type const lhs ) { @@ -352,39 +364,39 @@ bool less_than_impl( template bool less_than_impl( typename std::enable_if< - (rhs < std::numeric_limits::min()), + (rhs <= std::numeric_limits::min()), LHS >::type const ) { return false; } -template +template bool greater_than_impl( typename std::enable_if< - (lhs <= std::numeric_limits::max() - && lhs >= std::numeric_limits::min()), - RHS - >::type const rhs + (rhs <= std::numeric_limits::max() + && rhs >= std::numeric_limits::min()), + LHS + >::type const lhs ) { - return lhs < rhs; + return lhs > rhs; } -template +template bool greater_than_impl( typename std::enable_if< - (lhs > std::numeric_limits::max()), - RHS + (rhs > std::numeric_limits::max()), + LHS >::type const ) { return false; } -template +template bool greater_than_impl( typename std::enable_if< - (lhs < std::numeric_limits::min()), - RHS + (rhs < std::numeric_limits::min()), + LHS >::type const ) { return true; @@ -402,6 +414,16 @@ constexpr bool is_negative(T x) { template constexpr bool is_non_positive(T x) { return !x || folly::is_negative(x); } +// same as `x > 0` +template +constexpr bool is_positive(T x) { return !is_non_positive(x); } + +// same as `x >= 0` +template +constexpr bool is_non_negative(T x) { + return !x || is_positive(x); +} + template bool less_than(LHS const lhs) { return detail::less_than_impl< @@ -409,11 +431,11 @@ bool less_than(LHS const lhs) { >(lhs); } -template -bool greater_than(RHS const rhs) { +template +bool greater_than(LHS const lhs) { return detail::greater_than_impl< - LHS, lhs, typename std::remove_reference::type - >(rhs); + RHS, rhs, typename std::remove_reference::type + >(lhs); } } // namespace folly @@ -422,8 +444,6 @@ FOLLY_ASSUME_FBVECTOR_COMPATIBLE_3(std::basic_string); FOLLY_ASSUME_FBVECTOR_COMPATIBLE_2(std::vector); FOLLY_ASSUME_FBVECTOR_COMPATIBLE_2(std::list); FOLLY_ASSUME_FBVECTOR_COMPATIBLE_2(std::deque); -FOLLY_ASSUME_FBVECTOR_COMPATIBLE_4(std::map); -FOLLY_ASSUME_FBVECTOR_COMPATIBLE_3(std::set); FOLLY_ASSUME_FBVECTOR_COMPATIBLE_2(std::unique_ptr); FOLLY_ASSUME_FBVECTOR_COMPATIBLE_1(std::shared_ptr); FOLLY_ASSUME_FBVECTOR_COMPATIBLE_1(std::function);