proxygen
TraitsTest.cpp File Reference
#include <folly/Traits.h>
#include <cstring>
#include <string>
#include <type_traits>
#include <utility>
#include <folly/ScopeGuard.h>
#include <folly/portability/GTest.h>

Go to the source code of this file.

Classes

struct  T1
 
struct  T2
 
struct  T3
 
struct  T5
 
struct  F1
 
struct  F2
 
struct  F3
 
struct  F4
 
struct  folly::IsRelocatable< T1 >
 

Namespaces

 folly
 —— Concurrent Priority Queue Implementation ——
 

Functions

 TEST (Traits, has_member_type)
 
template<>
 folly::FOLLY_ASSUME_RELOCATABLE (T2)
 
 TEST (Traits, scalars)
 
 TEST (Traits, containers)
 
 TEST (Traits, original)
 
 TEST (Traits, typedefd)
 
 TEST (Traits, unset)
 
 TEST (Traits, bitAndInit)
 
 TEST (Trait, logicOperators)
 
 TEST (Traits, is_negative)
 
 TEST (Traits, relational)
 
template<typename T , typename... Args>
void testIsRelocatable (Args &&...args)
 
 TEST (Traits, actuallyRelocatable)
 
 TEST (Traits, void_t)
 
 TEST (Traits, type_t)
 
 TEST (Traits, remove_cvref)
 
 TEST (Traits, like)
 

Function Documentation

TEST ( Traits  ,
has_member_type   
)

Definition at line 35 of file TraitsTest.cpp.

References EXPECT_TRUE, and folly::value().

35  {
36  struct membership_no {};
37  struct membership_yes {
38  using x = void;
39  };
40 
41  EXPECT_TRUE((is_same<false_type, has_member_type_x<membership_no>>::value));
42  EXPECT_TRUE((is_same<true_type, has_member_type_x<membership_yes>>::value));
43 }
Definition: InvokeTest.cpp:58
bool_constant< true > true_type
Definition: gtest-port.h:2210
static const char *const value
Definition: Conv.cpp:50
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
bool_constant< false > false_type
Definition: gtest-port.h:2209
TEST ( Traits  ,
scalars   
)
TEST ( Traits  ,
containers   
)

Definition at line 78 of file TraitsTest.cpp.

References EXPECT_TRUE, and folly::value().

78  {
79  EXPECT_TRUE(IsRelocatable<vector<F1>>::value);
80  EXPECT_TRUE((IsRelocatable<pair<F1, F1>>::value));
81  EXPECT_TRUE((IsRelocatable<pair<T1, T2>>::value));
82 }
static const char *const value
Definition: Conv.cpp:50
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
TEST ( Traits  ,
original   
)

Definition at line 84 of file TraitsTest.cpp.

References EXPECT_TRUE.

84  {
87 }
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
TEST ( Traits  ,
typedefd   
)

Definition at line 89 of file TraitsTest.cpp.

References EXPECT_FALSE, and EXPECT_TRUE.

89  {
94 }
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
#define EXPECT_FALSE(condition)
Definition: gtest.h:1862
TEST ( Traits  ,
unset   
)

Definition at line 96 of file TraitsTest.cpp.

References EXPECT_TRUE.

96  {
99 }
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
TEST ( Traits  ,
bitAndInit   
)

Definition at line 101 of file TraitsTest.cpp.

References EXPECT_FALSE, EXPECT_TRUE, and folly::value().

101  {
103  EXPECT_FALSE(IsZeroInitializable<vector<int>>::value);
104 }
static const char *const value
Definition: Conv.cpp:50
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
#define EXPECT_FALSE(condition)
Definition: gtest.h:1862
TEST ( Trait  ,
logicOperators   
)

Definition at line 106 of file TraitsTest.cpp.

References folly::value().

106  {
107  static_assert(Conjunction<true_type>::value, "");
108  static_assert(!Conjunction<false_type>::value, "");
109  static_assert(is_same<Conjunction<true_type>::type, true_type>::value, "");
110  static_assert(is_same<Conjunction<false_type>::type, false_type>::value, "");
111  static_assert(Conjunction<true_type, true_type>::value, "");
112  static_assert(!Conjunction<true_type, false_type>::value, "");
113 
114  static_assert(Disjunction<true_type>::value, "");
115  static_assert(!Disjunction<false_type>::value, "");
116  static_assert(is_same<Disjunction<true_type>::type, true_type>::value, "");
117  static_assert(is_same<Disjunction<false_type>::type, false_type>::value, "");
118  static_assert(Disjunction<true_type, true_type>::value, "");
120 
121  static_assert(!Negation<true_type>::value, "");
122  static_assert(Negation<false_type>::value, "");
123 }
bool_constant< true > true_type
Definition: gtest-port.h:2210
static const char *const value
Definition: Conv.cpp:50
bool_constant< false > false_type
Definition: gtest-port.h:2209
TEST ( Traits  ,
is_negative   
)

Definition at line 125 of file TraitsTest.cpp.

References EXPECT_FALSE, EXPECT_TRUE, folly::is_negative(), and folly::is_non_positive().

125  {
131 
137 }
constexpr bool is_non_positive(T x)
Definition: Traits.h:681
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
constexpr bool is_negative(T x)
Definition: Traits.h:675
#define EXPECT_FALSE(condition)
Definition: gtest.h:1862
TEST ( Traits  ,
relational   
)

Definition at line 139 of file TraitsTest.cpp.

References testing::Args(), EXPECT_FALSE, EXPECT_TRUE, folly::T, folly::TEST(), type, value, and folly::value().

139  {
140  // We test, especially, the edge cases to make sure we don't
141  // trip -Wtautological-comparisons
142 
143  EXPECT_FALSE((folly::less_than<uint8_t, 0u, uint8_t>(0u)));
144  EXPECT_FALSE((folly::less_than<uint8_t, 0u, uint8_t>(254u)));
145  EXPECT_FALSE((folly::less_than<uint8_t, 255u, uint8_t>(255u)));
146  EXPECT_TRUE((folly::less_than<uint8_t, 255u, uint8_t>(254u)));
147 
148  EXPECT_FALSE((folly::greater_than<uint8_t, 0u, uint8_t>(0u)));
149  EXPECT_TRUE((folly::greater_than<uint8_t, 0u, uint8_t>(254u)));
150  EXPECT_FALSE((folly::greater_than<uint8_t, 255u, uint8_t>(255u)));
151  EXPECT_FALSE((folly::greater_than<uint8_t, 255u, uint8_t>(254u)));
152 }
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
#define EXPECT_FALSE(condition)
Definition: gtest.h:1862
TEST ( Traits  ,
actuallyRelocatable   
)

Definition at line 217 of file TraitsTest.cpp.

References testing::Args(), string, and folly::T.

217  {
218  // Ensure that we test stack and heap allocation for strings with in-situ
219  // capacity
220  testIsRelocatable<std::string>("1");
221  testIsRelocatable<std::string>(sizeof(std::string) + 1, 'x');
222 
223  testIsRelocatable<std::vector<char>>(5, 'g');
224 }
const char * string
Definition: Conv.cpp:212
TEST ( Traits  ,
void_t   
)

Definition at line 246 of file TraitsTest.cpp.

References EXPECT_FALSE, EXPECT_TRUE, value, and folly::value().

246  {
247  EXPECT_TRUE((::std::is_same<folly::void_t<>, void>::value));
248  EXPECT_TRUE((::std::is_same<folly::void_t<int>, void>::value));
249  EXPECT_TRUE((::std::is_same<folly::void_t<int, short>, void>::value));
250  EXPECT_TRUE(
251  (::std::is_same<folly::void_t<int, short, std::string>, void>::value));
254 }
type_t< void, Ts... > void_t
Definition: Traits.h:302
static const char *const value
Definition: Conv.cpp:50
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
#define EXPECT_FALSE(condition)
Definition: gtest.h:1862
TEST ( Traits  ,
type_t   
)

Definition at line 256 of file TraitsTest.cpp.

References EXPECT_FALSE, EXPECT_TRUE, string, and folly::value().

256  {
257  EXPECT_TRUE((::std::is_same<folly::type_t<float>, float>::value));
258  EXPECT_TRUE((::std::is_same<folly::type_t<float, int>, float>::value));
259  EXPECT_TRUE((::std::is_same<folly::type_t<float, int, short>, float>::value));
260  EXPECT_TRUE(
261  (::std::is_same<folly::type_t<float, int, short, std::string>, float>::
262  value));
263  EXPECT_TRUE((
264  ::std::is_constructible<::container<std::string>, some_tag, std::string>::
265  value));
266  EXPECT_FALSE(
267  (::std::is_constructible<::container<std::string>, some_tag, float>::
268  value));
269 }
typename traits_detail::type_t_< T, Ts... >::type type_t
Definition: Traits.h:300
static const char *const value
Definition: Conv.cpp:50
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
const char * string
Definition: Conv.cpp:212
#define EXPECT_FALSE(condition)
Definition: gtest.h:1862
TEST ( Traits  ,
remove_cvref   
)

Definition at line 271 of file TraitsTest.cpp.

References EXPECT_TRUE, and folly::value().

271  {
272  using folly::remove_cvref;
273  using folly::remove_cvref_t;
274 
275  // test all possible c-ref qualifiers without volatile
276  EXPECT_TRUE((std::is_same<remove_cvref_t<int>, int>::value));
277  EXPECT_TRUE((std::is_same<remove_cvref<int>::type, int>::value));
278 
279  EXPECT_TRUE((std::is_same<remove_cvref_t<int&&>, int>::value));
280  EXPECT_TRUE((std::is_same<remove_cvref<int&&>::type, int>::value));
281 
282  EXPECT_TRUE((std::is_same<remove_cvref_t<int&>, int>::value));
283  EXPECT_TRUE((std::is_same<remove_cvref<int&>::type, int>::value));
284 
285  EXPECT_TRUE((std::is_same<remove_cvref_t<int const>, int>::value));
286  EXPECT_TRUE((std::is_same<remove_cvref<int const>::type, int>::value));
287 
288  EXPECT_TRUE((std::is_same<remove_cvref_t<int const&>, int>::value));
289  EXPECT_TRUE((std::is_same<remove_cvref<int const&>::type, int>::value));
290 
291  EXPECT_TRUE((std::is_same<remove_cvref_t<int const&&>, int>::value));
292  EXPECT_TRUE((std::is_same<remove_cvref<int const&&>::type, int>::value));
293 
294  // test all possible c-ref qualifiers with volatile
295  EXPECT_TRUE((std::is_same<remove_cvref_t<int volatile>, int>::value));
296  EXPECT_TRUE((std::is_same<remove_cvref<int volatile>::type, int>::value));
297 
298  EXPECT_TRUE((std::is_same<remove_cvref_t<int volatile&&>, int>::value));
300 
301  EXPECT_TRUE((std::is_same<remove_cvref_t<int volatile&>, int>::value));
302  EXPECT_TRUE((std::is_same<remove_cvref<int volatile&>::type, int>::value));
303 
305  EXPECT_TRUE(
306  (std::is_same<remove_cvref<int volatile const>::type, int>::value));
307 
309  EXPECT_TRUE(
310  (std::is_same<remove_cvref<int volatile const&>::type, int>::value));
311 
313  EXPECT_TRUE(
314  (std::is_same<remove_cvref<int volatile const&&>::type, int>::value));
315 }
typename remove_cvref< T >::type remove_cvref_t
Definition: Traits.h:183
static const char *const value
Definition: Conv.cpp:50
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
typename std::remove_cv< typename std::remove_reference< T >::type >::type type
Definition: Traits.h:180
TEST ( Traits  ,
like   
)

Definition at line 317 of file TraitsTest.cpp.

References EXPECT_TRUE, and folly::value().

317  {
318  EXPECT_TRUE((std::is_same<like_t<int, char>, char>::value));
319  EXPECT_TRUE((std::is_same<like_t<int const, char>, char const>::value));
320  EXPECT_TRUE((std::is_same<like_t<int volatile, char>, char volatile>::value));
321  EXPECT_TRUE(
322  (std::is_same<like_t<int const volatile, char>, char const volatile>::
323  value));
324  EXPECT_TRUE((std::is_same<like_t<int&, char>, char&>::value));
325  EXPECT_TRUE((std::is_same<like_t<int const&, char>, char const&>::value));
326  EXPECT_TRUE(
327  (std::is_same<like_t<int volatile&, char>, char volatile&>::value));
328  EXPECT_TRUE(
329  (std::is_same<like_t<int const volatile&, char>, char const volatile&>::
330  value));
331  EXPECT_TRUE((std::is_same<like_t<int&&, char>, char&&>::value));
332  EXPECT_TRUE((std::is_same<like_t<int const&&, char>, char const&&>::value));
333  EXPECT_TRUE(
334  (std::is_same<like_t<int volatile&&, char>, char volatile&&>::value));
335  EXPECT_TRUE(
336  (std::is_same<like_t<int const volatile&&, char>, char const volatile&&>::
337  value));
338 }
typename detail::like_< Src >::template apply< remove_cvref_t< Dst >> like_t
Definition: Traits.h:220
static const char *const value
Definition: Conv.cpp:50
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
template<typename T , typename... Args>
void testIsRelocatable ( Args &&...  args)

Definition at line 185 of file TraitsTest.cpp.

References EXPECT_EQ, folly::gen::move, SCOPE_EXIT, and folly::T.

185  {
187  return;
188  }
189 
190  // We use placement new on zeroed memory to avoid garbage subsections
191  char vsrc[sizeof(T)] = {0};
192  char vdst[sizeof(T)] = {0};
193  char vcpy[sizeof(T)];
194 
195  T* src = new (vsrc) T(std::forward<Args>(args)...);
196  SCOPE_EXIT {
197  src->~T();
198  };
199  std::memcpy(vcpy, vsrc, sizeof(T));
200  T deep(*src);
201  T* dst = new (vdst) T(std::move(*src));
202  SCOPE_EXIT {
203  dst->~T();
204  };
205 
206  EXPECT_EQ(deep, *dst);
207 #pragma GCC diagnostic push
208 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
209  EXPECT_EQ(deep, *reinterpret_cast<T*>(vcpy));
210 #pragma GCC diagnostic pop
211 
212  // This test could technically fail; however, this is what relocation
213  // almost always means, so it's a good test to have
214  EXPECT_EQ(std::memcmp(vcpy, vdst, sizeof(T)), 0);
215 }
#define T(v)
Definition: http_parser.c:233
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
#define SCOPE_EXIT
Definition: ScopeGuard.h:274