xref: /aosp_15_r20/external/pytorch/test/cpp/api/memory.cpp (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1 #include <gtest/gtest.h>
2 
3 #include <c10/util/Optional.h>
4 
5 struct TestValue {
TestValueTestValue6   explicit TestValue(const int& x) : lvalue_(x) {}
TestValueTestValue7   explicit TestValue(int&& x) : rvalue_(x) {}
8 
9   std::optional<int> lvalue_;
10   std::optional<int> rvalue_;
11 };
12 
TEST(MakeUniqueTest,ForwardRvaluesCorrectly)13 TEST(MakeUniqueTest, ForwardRvaluesCorrectly) {
14   auto ptr = std::make_unique<TestValue>(123);
15   ASSERT_FALSE(ptr->lvalue_.has_value());
16   ASSERT_TRUE(ptr->rvalue_.has_value());
17   ASSERT_EQ(*ptr->rvalue_, 123);
18 }
19 
TEST(MakeUniqueTest,ForwardLvaluesCorrectly)20 TEST(MakeUniqueTest, ForwardLvaluesCorrectly) {
21   int x = 5;
22   auto ptr = std::make_unique<TestValue>(x);
23   ASSERT_TRUE(ptr->lvalue_.has_value());
24   ASSERT_EQ(*ptr->lvalue_, 5);
25   ASSERT_FALSE(ptr->rvalue_.has_value());
26 }
27 
TEST(MakeUniqueTest,CanConstructUniquePtrOfArray)28 TEST(MakeUniqueTest, CanConstructUniquePtrOfArray) {
29   // NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
30   auto ptr = std::make_unique<int[]>(3);
31   // Value initialization is required by the standard.
32   ASSERT_EQ(ptr[0], 0);
33   ASSERT_EQ(ptr[1], 0);
34   ASSERT_EQ(ptr[2], 0);
35 }
36