Skip to content

Commit b646b82

Browse files
committed
Introduce ftl::ignore
`ftl::ignore` works like `std::ignore`, but one can also ignore multiple values using `operator()`. `ftl::ignore(a, b);` is more compact than `std::ignore = a; std::ignore = b;`, and conveys the same idea. Bug: 185536303 Flag: EXEMPT New library code Test: atest ftl_test Change-Id: Ice549328eeffb90f59f7b902809def48f583d157
1 parent ee44971 commit b646b82

3 files changed

Lines changed: 90 additions & 0 deletions

File tree

include/ftl/ignore.h

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright 2025 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#pragma once
18+
19+
namespace android::ftl {
20+
21+
// An alternative to `std::ignore` that makes it easy to ignore multiple values.
22+
//
23+
// Examples:
24+
//
25+
// void ftl_ignore_multiple(int arg1, const char* arg2, std::string arg3) {
26+
// // When invoked, all the arguments are ignored.
27+
// ftl::ignore(arg1, arg2, arg3);
28+
// }
29+
//
30+
// void ftl_ignore_single(int arg) {
31+
// // It can be used like std::ignore to ignore a single value
32+
// ftl::ignore = arg;
33+
// }
34+
//
35+
inline constexpr struct {
36+
// NOLINTNEXTLINE(misc-unconventional-assign-operator, readability-named-parameter)
37+
constexpr auto operator=(auto&&) const -> decltype(*this) { return *this; }
38+
// NOLINTNEXTLINE(readability-named-parameter)
39+
constexpr void operator()(auto&&...) const {}
40+
} ignore;
41+
42+
} // namespace android::ftl

libs/ftl/Android.bp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ cc_test {
2626
"function_test.cpp",
2727
"future_test.cpp",
2828
"hash_test.cpp",
29+
"ignore_test.cpp",
2930
"match_test.cpp",
3031
"mixins_test.cpp",
3132
"non_null_test.cpp",

libs/ftl/ignore_test.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright 2025 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#include <string>
18+
19+
#include <ftl/ignore.h>
20+
#include <gtest/gtest.h>
21+
22+
namespace android::test {
23+
namespace {
24+
25+
// Keep in sync with the example usage in the header file.
26+
27+
void ftl_ignore_multiple(int arg1, const char* arg2, std::string arg3) {
28+
// When invoked, all the arguments are ignored.
29+
ftl::ignore(arg1, arg2, arg3);
30+
}
31+
32+
void ftl_ignore_single(int arg) {
33+
// It can be used like std::ignore to ignore a single value
34+
ftl::ignore = arg;
35+
}
36+
37+
} // namespace
38+
39+
TEST(Ignore, Example) {
40+
// The real example test is that there are no compiler warnings for unused arguments above.
41+
42+
// Use the example functions to avoid a compiler warning about unused functions.
43+
ftl_ignore_multiple(0, "a", "b");
44+
ftl_ignore_single(0);
45+
}
46+
47+
} // namespace android::test

0 commit comments

Comments
 (0)