concepts.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. template <class T>
  47. concept CConst = std::is_const_v<T>;
  48. template <class T>
  49. concept CNonConst = !CConst<T>;
  50. ////////////////////////////////////////////////////////////////////////////////
  51. template <class T>
  52. concept CRawPtr = std::is_pointer_v<T>;
  53. template <class T>
  54. concept CConstRawPtr = CRawPtr<T> && CConst<decltype(*std::declval<T>())>;
  55. template <class T>
  56. concept CMutRawPtr = CRawPtr<T> && !CConstRawPtr<T>;
  57. ////////////////////////////////////////////////////////////////////////////////
  58. } // namespace NYT