Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: base/bind_unittest.cc

Issue 1709483002: Support move-only type on base::Callback::Run (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: +comment Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after
921 921
922 copies = 0; 922 copies = 0;
923 assigns = 0; 923 assigns = 0;
924 Bind(&VoidPolymorphic<CopyCounter>::Run, CopyCounter(&copies, &assigns)); 924 Bind(&VoidPolymorphic<CopyCounter>::Run, CopyCounter(&copies, &assigns));
925 EXPECT_EQ(1, copies); 925 EXPECT_EQ(1, copies);
926 EXPECT_EQ(0, assigns); 926 EXPECT_EQ(0, assigns);
927 927
928 copies = 0; 928 copies = 0;
929 assigns = 0; 929 assigns = 0;
930 Bind(&VoidPolymorphic<CopyCounter>::Run).Run(counter); 930 Bind(&VoidPolymorphic<CopyCounter>::Run).Run(counter);
931 EXPECT_EQ(1, copies); 931 EXPECT_EQ(2, copies);
932 EXPECT_EQ(0, assigns); 932 EXPECT_EQ(0, assigns);
933 933
934 copies = 0; 934 copies = 0;
935 assigns = 0; 935 assigns = 0;
936 Bind(&VoidPolymorphic<CopyCounter>::Run).Run(CopyCounter(&copies, &assigns)); 936 Bind(&VoidPolymorphic<CopyCounter>::Run).Run(CopyCounter(&copies, &assigns));
937 EXPECT_EQ(1, copies); 937 EXPECT_EQ(1, copies);
938 EXPECT_EQ(0, assigns); 938 EXPECT_EQ(0, assigns);
939 939
940 copies = 0; 940 copies = 0;
941 assigns = 0; 941 assigns = 0;
(...skipping 18 matching lines...) Expand all
960 int move_assigns = 0; 960 int move_assigns = 0;
961 961
962 Bind(&VoidPolymorphic<const MoveCounter&>::Run, 962 Bind(&VoidPolymorphic<const MoveCounter&>::Run,
963 MoveCounter(&move_constructs, &move_assigns)); 963 MoveCounter(&move_constructs, &move_assigns));
964 EXPECT_EQ(1, move_constructs); 964 EXPECT_EQ(1, move_constructs);
965 EXPECT_EQ(0, move_assigns); 965 EXPECT_EQ(0, move_assigns);
966 966
967 // TODO(tzik): Support binding move-only type into a non-reference parameter 967 // TODO(tzik): Support binding move-only type into a non-reference parameter
968 // of a variant of Callback. 968 // of a variant of Callback.
969 969
970 // TODO(tzik): Support move-only type forwarding on Callback::Run. 970 move_constructs = 0;
971 move_assigns = 0;
972 Bind(&VoidPolymorphic<MoveCounter>::Run)
973 .Run(MoveCounter(&move_constructs, &move_assigns));
974 EXPECT_EQ(1, move_constructs);
975 EXPECT_EQ(0, move_assigns);
976
977 move_constructs = 0;
978 move_assigns = 0;
979 Bind(&VoidPolymorphic<MoveCounter>::Run)
980 .Run(MoveCounter(DerivedCopyMoveCounter(
981 nullptr, nullptr, &move_constructs, &move_assigns)));
982 EXPECT_EQ(2, move_constructs);
983 EXPECT_EQ(0, move_assigns);
971 } 984 }
972 985
973 // Argument constructor usage for non-reference movable-copyable 986 // Argument constructor usage for non-reference movable-copyable
974 // parameters. 987 // parameters.
975 // - Bound arguments passed by move are not copied. 988 // - Bound arguments passed by move are not copied.
976 // - Forwarded arguments are only copied once. 989 // - Forwarded arguments are only copied once.
977 // - Forwarded arguments with coercions are only copied once and moved once. 990 // - Forwarded arguments with coercions are only copied once and moved once.
978 TEST_F(BindTest, ArgumentCopiesAndMoves) { 991 TEST_F(BindTest, ArgumentCopiesAndMoves) {
979 int copies = 0; 992 int copies = 0;
980 int assigns = 0; 993 int assigns = 0;
(...skipping 18 matching lines...) Expand all
999 EXPECT_EQ(1, move_constructs); 1012 EXPECT_EQ(1, move_constructs);
1000 EXPECT_EQ(0, move_assigns); 1013 EXPECT_EQ(0, move_assigns);
1001 1014
1002 copies = 0; 1015 copies = 0;
1003 assigns = 0; 1016 assigns = 0;
1004 move_constructs = 0; 1017 move_constructs = 0;
1005 move_assigns = 0; 1018 move_assigns = 0;
1006 Bind(&VoidPolymorphic<CopyMoveCounter>::Run).Run(counter); 1019 Bind(&VoidPolymorphic<CopyMoveCounter>::Run).Run(counter);
1007 EXPECT_EQ(1, copies); 1020 EXPECT_EQ(1, copies);
1008 EXPECT_EQ(0, assigns); 1021 EXPECT_EQ(0, assigns);
1009 EXPECT_EQ(0, move_constructs); 1022 EXPECT_EQ(1, move_constructs);
1010 EXPECT_EQ(0, move_assigns); 1023 EXPECT_EQ(0, move_assigns);
1011 1024
1012 // TODO(tzik): This case should be done in no copy and one move.
1013 copies = 0; 1025 copies = 0;
1014 assigns = 0; 1026 assigns = 0;
1015 move_constructs = 0; 1027 move_constructs = 0;
1016 move_assigns = 0; 1028 move_assigns = 0;
1017 Bind(&VoidPolymorphic<CopyMoveCounter>::Run) 1029 Bind(&VoidPolymorphic<CopyMoveCounter>::Run)
1018 .Run(CopyMoveCounter(&copies, &assigns, &move_constructs, &move_assigns)); 1030 .Run(CopyMoveCounter(&copies, &assigns, &move_constructs, &move_assigns));
1019 EXPECT_EQ(1, copies); 1031 EXPECT_EQ(0, copies);
1020 EXPECT_EQ(0, assigns); 1032 EXPECT_EQ(0, assigns);
1021 EXPECT_EQ(0, move_constructs); 1033 EXPECT_EQ(1, move_constructs);
1022 EXPECT_EQ(0, move_assigns); 1034 EXPECT_EQ(0, move_assigns);
1023 1035
1024 // TODO(tzik): This case should be done in one copy and one move.
1025 DerivedCopyMoveCounter derived_counter(&copies, &assigns, &move_constructs, 1036 DerivedCopyMoveCounter derived_counter(&copies, &assigns, &move_constructs,
1026 &move_assigns); 1037 &move_assigns);
1027 copies = 0; 1038 copies = 0;
1028 assigns = 0; 1039 assigns = 0;
1029 move_constructs = 0; 1040 move_constructs = 0;
1030 move_assigns = 0; 1041 move_assigns = 0;
1031 Bind(&VoidPolymorphic<CopyMoveCounter>::Run) 1042 Bind(&VoidPolymorphic<CopyMoveCounter>::Run)
1032 .Run(CopyMoveCounter(derived_counter)); 1043 .Run(CopyMoveCounter(derived_counter));
1033 EXPECT_EQ(2, copies); 1044 EXPECT_EQ(1, copies);
1034 EXPECT_EQ(0, assigns); 1045 EXPECT_EQ(0, assigns);
1035 EXPECT_EQ(0, move_constructs); 1046 EXPECT_EQ(1, move_constructs);
1036 EXPECT_EQ(0, move_assigns); 1047 EXPECT_EQ(0, move_assigns);
1037 1048
1038 // TODO(tzik): This case should be done in no copy and two move.
1039 copies = 0; 1049 copies = 0;
1040 assigns = 0; 1050 assigns = 0;
1041 move_constructs = 0; 1051 move_constructs = 0;
1042 move_assigns = 0; 1052 move_assigns = 0;
1043 Bind(&VoidPolymorphic<CopyMoveCounter>::Run) 1053 Bind(&VoidPolymorphic<CopyMoveCounter>::Run)
1044 .Run(CopyMoveCounter(DerivedCopyMoveCounter( 1054 .Run(CopyMoveCounter(DerivedCopyMoveCounter(
1045 &copies, &assigns, &move_constructs, &move_assigns))); 1055 &copies, &assigns, &move_constructs, &move_assigns)));
1046 EXPECT_EQ(1, copies); 1056 EXPECT_EQ(0, copies);
1047 EXPECT_EQ(0, assigns); 1057 EXPECT_EQ(0, assigns);
1048 EXPECT_EQ(1, move_constructs); 1058 EXPECT_EQ(2, move_constructs);
1049 EXPECT_EQ(0, move_assigns); 1059 EXPECT_EQ(0, move_assigns);
1050 } 1060 }
1051 1061
1052 // Callback construction and assignment tests. 1062 // Callback construction and assignment tests.
1053 // - Construction from an InvokerStorageHolder should not cause ref/deref. 1063 // - Construction from an InvokerStorageHolder should not cause ref/deref.
1054 // - Assignment from other callback should only cause one ref 1064 // - Assignment from other callback should only cause one ref
1055 // 1065 //
1056 // TODO(ajwong): Is there actually a way to test this? 1066 // TODO(ajwong): Is there actually a way to test this?
1057 1067
1058 #if defined(OS_WIN) 1068 #if defined(OS_WIN)
(...skipping 24 matching lines...) Expand all
1083 base::Callback<void(int)> null_cb; 1093 base::Callback<void(int)> null_cb;
1084 ASSERT_TRUE(null_cb.is_null()); 1094 ASSERT_TRUE(null_cb.is_null());
1085 EXPECT_DEATH(base::Bind(null_cb, 42), ""); 1095 EXPECT_DEATH(base::Bind(null_cb, 42), "");
1086 } 1096 }
1087 1097
1088 #endif // (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) && 1098 #endif // (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) &&
1089 // GTEST_HAS_DEATH_TEST 1099 // GTEST_HAS_DEATH_TEST
1090 1100
1091 } // namespace 1101 } // namespace
1092 } // namespace base 1102 } // namespace base
OLDNEW
« no previous file with comments | « base/bind_internal.h ('k') | base/callback.h » ('j') | base/callback.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698