binding.hpp type_traits serif/utils/misc/traits/type_uniqueness.hpp src/compile_time_checks/serif/utils/dependencies/binding.cpp src/include/serif/solver/normalization/plan.hpp src/include/serif/utils/dependencies/computation_store.hpp src/include/serif/utils/dependencies/dependencies.hpp src/include/serif/utils/dependencies/key_list.hpp serif::utils::dependencies::Binding serif::utils::dependencies::Bindings serif::utils::dependencies::detail::HasBinding< Bindings< BindingTs... >, KeyT > serif::utils::dependencies::detail::BoundType< Bindings< BindingTs... >, KeyT > serif::utils::dependencies::detail::BoundType< Bindings< BindingTs... >, KeyT >::binding_tag serif::utils::dependencies::detail::BoundType< Bindings< BindingTs... >, KeyT >::collector serif::utils::dependencies::HasBinding serif::utils::dependencies::BoundType serif serif::utils serif::utils::dependencies serif::utils::dependencies::detail #pragmaonce #include<type_traits> #include"serif/utils/misc/traits/type_uniqueness.hpp" namespaceserif::utils::dependencies{ template<typenameKeyT,typenameTargetT> structBinding{ usingKey=KeyT; usingTarget=TargetT; }; template<typenameT> conceptIsBinding=requires{ typenameT::Key; typenameT::Target; }&&std::is_same_v<T,Binding<typenameT::Key,typenameT::Target>>; template<IsBinding...BindingTs> structBindings{}; template<typenameT> inlineconstexprboolis_bindings_v=false; template<IsBinding...BindingTs> inlineconstexprboolis_bindings_v<Bindings<BindingTs...>>=misc::traits::all_unique_types_v<typenameBindingTs::Key...>; template<typenameT> conceptIsBindings=is_bindings_v<std::remove_cvref_t<T>>; namespacedetail{ template<typenameBindingsT,typenameKeyT> structHasBinding; template<typenameKeyT,IsBinding...BindingTs> structHasBinding<Bindings<BindingTs...>,KeyT>{ constexprstaticboolvalue=(std::is_same_v<KeyT,typenameBindingTs::Key>||...); }; template<typenameBindingsT,typenameKeyT> structBoundType; template<typenameKeyT,IsBinding...BindingTs> structBoundType<Bindings<BindingTs...>,KeyT>{ private: template<typenameK,typenameT> structbinding_tag{ usingtype=T; }; structcollector:binding_tag<typenameBindingTs::Key,typenameBindingTs::Target>...{}; template<typenameK,typenameT> staticbinding_tag<K, T>select(binding_tag<K, T>); public: usingtarget_type=decltype(select<KeyT>(collector{}))::type; }; } template<IsBindingsBindingsT,typenameKeyT> structHasBinding:detail::HasBinding<std::remove_cvref_t<BindingsT>,KeyT>{}; template<IsBindingsBindingsT,typenameKeyT> inlineconstexprboolhas_binding_v=HasBinding<BindingsT, KeyT>::value; template<typenameBindingsT,typenameKeyT> conceptBindingsWithBinding=IsBindings<BindingsT>&&has_binding_v<BindingsT, KeyT>; template<typenameBindingsT,typenameKeyT> requiresBindingsWithBinding<BindingsT, KeyT> structBoundType:detail::BoundType<std::remove_cvref_t<BindingsT>,KeyT>{}; template<typenameBindingsT,typenameKeyT> usingbound_type_t=BoundType<BindingsT, KeyT>::target_type; }