ftl: contains

ftl::contains(container, value) returns true if the container contains
the value. It's implemented in terms of std::find(), so has the same
runtime complexity.

It is otherwise a simplified version of the C++23 std::ranges::contains,
which has some additional options, and can be deprecated once C++23 is
the minimal supported version.

Test: atest ftl_test
Bug: 185536303
Change-Id: I98aefe7cf6645ac3a20fddfe0657fa6822d669de
diff --git a/include/ftl/algorithm.h b/include/ftl/algorithm.h
index c0f6768..68826bb 100644
--- a/include/ftl/algorithm.h
+++ b/include/ftl/algorithm.h
@@ -24,6 +24,18 @@
 
 namespace android::ftl {
 
+// Determines if a container contains a value. This is a simplified version of the C++23
+// std::ranges::contains function.
+//
+//   const ftl::StaticVector vector = {1, 2, 3};
+//   assert(ftl::contains(vector, 1));
+//
+// TODO: Remove in C++23.
+template <typename Container, typename Value>
+auto contains(const Container& container, const Value& value) -> bool {
+  return std::find(container.begin(), container.end(), value) != container.end();
+}
+
 // Adapter for std::find_if that converts the return value from iterator to optional.
 //
 //   const ftl::StaticVector vector = {"upside"sv, "down"sv, "cake"sv};