95 linhas
2.3 KiB
C++
95 linhas
2.3 KiB
C++
// Copyright 2016 The Fuchsia Authors
|
|
//
|
|
// Use of this source code is governed by a MIT-style
|
|
// license that can be found in the LICENSE file or at
|
|
// https://opensource.org/licenses/MIT
|
|
|
|
#include <app/tests.h>
|
|
#include <stdio.h>
|
|
#include <unittest.h>
|
|
#include <utils/type_support.h>
|
|
|
|
enum Category { CAT_LVALUE, CAT_RVALUE };
|
|
|
|
int category(const int& arg) { return CAT_LVALUE; }
|
|
|
|
int category(int&& arg) { return CAT_RVALUE; }
|
|
|
|
template <typename T>
|
|
int passing(T&& t)
|
|
{
|
|
return category(t);
|
|
}
|
|
|
|
template <typename T>
|
|
int moving(T&& t)
|
|
{
|
|
return category(utils::move(t));
|
|
}
|
|
|
|
template <typename T>
|
|
int forwarding(T&& t)
|
|
{
|
|
return category(utils::forward<T>(t));
|
|
}
|
|
|
|
template <typename T>
|
|
int forward_copy(T&& t)
|
|
{
|
|
return category(utils::forward<T&>(t));
|
|
}
|
|
|
|
struct A {
|
|
A(int&& n) : category(CAT_RVALUE) {}
|
|
A(int& n) : category(CAT_LVALUE) {}
|
|
int category;
|
|
};
|
|
|
|
template <typename T, typename U>
|
|
T make_object(U&& u)
|
|
{
|
|
return T(utils::forward<U>(u));
|
|
}
|
|
|
|
extern "C" int forward_tests(int argc, const cmd_args* argv)
|
|
{
|
|
bool all_ok = true;
|
|
|
|
int val = 42;
|
|
int& ref = val;
|
|
const int& cref = val;
|
|
|
|
EXPECT_EQ(CAT_LVALUE, passing(42), "");
|
|
EXPECT_EQ(CAT_LVALUE, passing(val), "");
|
|
EXPECT_EQ(CAT_LVALUE, passing(ref), "");
|
|
EXPECT_EQ(CAT_LVALUE, passing(cref), "");
|
|
EXPECT_EQ(CAT_LVALUE, passing(val + 1), "");
|
|
|
|
EXPECT_EQ(CAT_RVALUE, moving(42), "");
|
|
EXPECT_EQ(CAT_RVALUE, moving(val), "");
|
|
EXPECT_EQ(CAT_RVALUE, moving(ref), "");
|
|
EXPECT_EQ(CAT_LVALUE, moving(cref), "");
|
|
EXPECT_EQ(CAT_RVALUE, moving(val + 1), "");
|
|
|
|
EXPECT_EQ(CAT_RVALUE, forwarding(42), "");
|
|
EXPECT_EQ(CAT_LVALUE, forwarding(val), "");
|
|
EXPECT_EQ(CAT_LVALUE, forwarding(ref), "");
|
|
EXPECT_EQ(CAT_LVALUE, forward_copy(cref), "");
|
|
EXPECT_EQ(CAT_RVALUE, forwarding(val + 1), "");
|
|
|
|
EXPECT_EQ(CAT_LVALUE, forward_copy(42), "");
|
|
EXPECT_EQ(CAT_LVALUE, forward_copy(val), "");
|
|
EXPECT_EQ(CAT_LVALUE, forward_copy(ref), "");
|
|
EXPECT_EQ(CAT_LVALUE, forward_copy(cref), "");
|
|
EXPECT_EQ(CAT_LVALUE, forward_copy(val + 1), "");
|
|
|
|
auto a1 = make_object<A>(42);
|
|
auto a2 = make_object<A>(val);
|
|
|
|
EXPECT_EQ(CAT_RVALUE, a1.category, "");
|
|
EXPECT_EQ(CAT_LVALUE, a2.category, "");
|
|
|
|
if (all_ok) printf("all tests passed\n");
|
|
return 0;
|
|
}
|