is_in.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #pragma once
  2. #include "typetraits.h"
  3. #include <algorithm>
  4. #include <initializer_list>
  5. template <class I, class T>
  6. constexpr bool IsIn(I f, I l, const T& v);
  7. template <class C, class T>
  8. constexpr bool IsIn(const C& c, const T& e);
  9. namespace NIsInHelper {
  10. Y_HAS_MEMBER(find, FindMethod);
  11. Y_HAS_SUBTYPE(const_iterator, ConstIterator);
  12. Y_HAS_SUBTYPE(key_type, KeyType);
  13. template <class T>
  14. using TIsAssocCont = TConjunction<THasFindMethod<T>, THasConstIterator<T>, THasKeyType<T>>;
  15. template <class C, class T, bool isAssoc>
  16. struct TIsInTraits {
  17. static constexpr bool IsIn(const C& c, const T& e) {
  18. using std::begin;
  19. using std::end;
  20. return ::IsIn(begin(c), end(c), e);
  21. }
  22. };
  23. template <class C, class T>
  24. struct TIsInTraits<C, T, true> {
  25. static constexpr bool IsIn(const C& c, const T& e) {
  26. return c.find(e) != c.end();
  27. }
  28. };
  29. } // namespace NIsInHelper
  30. template <class I, class T>
  31. constexpr bool IsIn(I f, I l, const T& v) {
  32. return std::find(f, l, v) != l;
  33. }
  34. template <class C, class T>
  35. constexpr bool IsIn(const C& c, const T& e) {
  36. using namespace NIsInHelper;
  37. return TIsInTraits<C, T, TIsAssocCont<C>::value>::IsIn(c, e);
  38. }
  39. template <class T, class U>
  40. constexpr bool IsIn(std::initializer_list<T> l, const U& e) {
  41. return ::IsIn(l.begin(), l.end(), e);
  42. }