#pragma once #include #include namespace NYT { //////////////////////////////////////////////////////////////////////////////// namespace NDetail { template struct TIsInvocable; template struct TIsInvocable { private: static constexpr bool IsInvocable_ = requires (T&& t, TArgs&&... args) { { std::forward(t)(std::forward(args)...) } -> std::same_as; }; static constexpr bool IsNoThrowInvocable_ = requires (T&& t, TArgs&&... args) { { std::forward(t)(std::forward(args)...) } noexcept -> std::same_as; }; public: static constexpr bool Value = IsInvocable_ && (!NoExcept || IsNoThrowInvocable_); }; } // namespace NDetail //////////////////////////////////////////////////////////////////////////////// template concept CScalable = requires (TObject object, TScalar scalar) { { object * scalar } -> std::same_as; }; //////////////////////////////////////////////////////////////////////////////// template concept CInvocable = NDetail::TIsInvocable::Value; //////////////////////////////////////////////////////////////////////////////// template concept CStdVector = requires (V& vec) { [] (std::vector&) { } (vec); }; //////////////////////////////////////////////////////////////////////////////// template concept CAnyMap = requires { typename M::mapped_type; typename M::key_type; }; //////////////////////////////////////////////////////////////////////////////// } // namespace NYT