X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FTraits.h;h=2b94df1360effe21828adedb51b864e7d2282116;hb=fd915b73606e09a5f46a1bca0a5d3643a1567014;hp=f09a9136cab7a2a82f1bb59d1c8bb5703cb9c75b;hpb=cdf9c435489fa6ffa85685c8316a5dd6d8c34db0;p=folly.git diff --git a/folly/Traits.h b/folly/Traits.h index f09a9136..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,7 +364,7 @@ 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 ) { @@ -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< @@ -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);