Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Firefox/security/sandbox/chromium/base/containers/   (Firefox Browser Version 153.0.1©)  Datei vom 27.6.2026 mit Größe 3 kB image not shown  

Quelle  contains.h

  Sprache: C
 

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BASE_CONTAINERS_CONTAINS_H_
#define BASE_CONTAINERS_CONTAINS_H_

#include <type_traits>
#include <utility>

#include "base/ranges/algorithm.h"
#include "base/ranges/ranges.h"

namespace base {

namespace internal {

// Small helper to detect whether a given type has a nested `key_type` typedef.
// Used below to catch misuses of the API for associative containers.
template <typename T, typename SFINAE = void>
struct HasKeyType : std::false_type {};

template <typename T>
struct HasKeyType<T, std::void_t<typename T::key_type>> : std::true_type {};

// Probe whether a `contains` member function exists and return the result of
// `container.contains(value)` if this is a valid expression. This is the
// highest priority option.
template <typename Container, typename Value>
constexpr auto ContainsImpl(const Container& container,
                            const Value& value,
                            priority_tag<2>)
    -> decltype(container.contains(value)) {
  return container.contains(value);
}

// Probe whether a `find` member function exists and whether its return value
// can be compared with `container.end()`. Intended for STL style maps and sets
// that lack a `contains` member function.
template <typename Container, typename Value>
constexpr auto ContainsImpl(const Container& container,
                            const Value& value,
                            priority_tag<1>)
    -> decltype(container.find(value) != container.end()) {
  return container.find(value) != container.end();
}

// Probe whether a `find` member function exists and whether its return value
// can be compared with `Container::npos`. Intended for STL style strings that
// lack a `contains` member function.
template <typename Container, typename Value>
constexpr auto ContainsImpl(const Container& container,
                            const Value& value,
                            priority_tag<1>)
    -> decltype(container.find(value) != Container::npos) {
  return container.find(value) != Container::npos;
}

// Generic fallback option, using a linear search over `container` to find
// `value`. Has the lowest priority. This will not compile for associative
// containers, as this likely is a performance bug.
template <typename Container, typename Value>
constexpr bool ContainsImpl(const Container& container,
                            const Value& value,
                            priority_tag<0>) {
  static_assert(
      !HasKeyType<Container>::value,
      "Error: About to perform linear search on an associative container. "
      "Either use a more generic comparator (e.g. std::less<>) or, if a linear "
      "search is desired, provide an explicit projection parameter.");
  return ranges::find(container, value) != ranges::end(container);
}

}  // namespace internal

// A general purpose utility to check whether `container` contains `value`. This
// will probe whether a `contains` or `find` member function on `container`
// exists, and fall back to a generic linear search over `container`.
template <typename Container, typename Value>
constexpr bool Contains(const Container& container, const Value& value) {
  return internal::ContainsImpl(container, value, internal::priority_tag<2>());
}

// Overload that allows to provide an additional projection invocable. This
// projection will be applied to every element in `container` before comparing
// it with `value`. This will always perform a linear search.
template <typename Container, typename Value, typename Proj>
constexpr bool Contains(const Container& container,
                        const Value& value,
                        Proj proj) {
  return ranges::find(container, value, std::move(proj)) !=
         ranges::end(container);
}

}  // namespace base

#endif  // BASE_CONTAINERS_CONTAINS_H_

Messung V0.5 in Prozent
C=93 H=100 G=96

¤ Dauer der Verarbeitung: 0.22 Sekunden  (vorverarbeitet am  2026-08-26) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.