concepts.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #pragma once
  2. #include <concepts>
  3. #include <vector>
  4. namespace NYT {
  5. ////////////////////////////////////////////////////////////////////////////////
  6. namespace NDetail {
  7. template <class T, class TSignature>
  8. struct TIsInvocable;
  9. template <class T, class TResult, bool NoExcept, class... TArgs>
  10. struct TIsInvocable<T, TResult(TArgs...) noexcept(NoExcept)>
  11. {
  12. private:
  13. static constexpr bool IsInvocable_ = requires (T&& t, TArgs&&... args) {
  14. { std::forward<T>(t)(std::forward<TArgs>(args)...) } -> std::same_as<TResult>;
  15. };
  16. static constexpr bool IsNoThrowInvocable_ = requires (T&& t, TArgs&&... args) {
  17. { std::forward<T>(t)(std::forward<TArgs>(args)...) } noexcept -> std::same_as<TResult>;
  18. };
  19. public:
  20. static constexpr bool Value =
  21. IsInvocable_ &&
  22. (!NoExcept || IsNoThrowInvocable_);
  23. };
  24. } // namespace NDetail
  25. ////////////////////////////////////////////////////////////////////////////////
  26. template <class TObject, class TScalar>
  27. concept CScalable = requires (TObject object, TScalar scalar)
  28. {
  29. { object * scalar } -> std::same_as<TObject>;
  30. };
  31. ////////////////////////////////////////////////////////////////////////////////
  32. template <class T, class TSignature>
  33. concept CInvocable = NDetail::TIsInvocable<T, TSignature>::Value;
  34. ////////////////////////////////////////////////////////////////////////////////
  35. template <class V>
  36. concept CStdVector = requires (V& vec) {
  37. [] <class... T> (std::vector<T...>&) { } (vec);
  38. };
  39. ////////////////////////////////////////////////////////////////////////////////
  40. template <class M>
  41. concept CAnyMap = requires {
  42. typename M::mapped_type;
  43. typename M::key_type;
  44. };
  45. ////////////////////////////////////////////////////////////////////////////////
  46. } // namespace NYT