binding.hpp array type_traits serif/utils/misc/traits/type_uniqueness.hpp src/compile_time_checks/serif/utils/dependencies/binding.cpp src/include/serif/model/detail/specification_endpoints.hpp src/include/serif/solver/normalization/plan.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::BindingLookup< Bindings< BindingTs... > > serif::utils::dependencies::detail::BoundType serif::utils::dependencies::HasBinding serif::utils::dependencies::BoundType serif serif::utils serif::utils::dependencies serif::utils::dependencies::detail #pragmaonce #include<array> #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>>; namespacedetail{ template<typename...Types> inlineconstexprboolvalid_binding_types_v=[]{ constexprstd::array<bool,sizeof...(Types)>valid{IsBinding<Types>...}; for(constboolbinding:valid){ if(!binding){returnfalse;} } returntrue; }(); } template<typename...BindingTs>requiresdetail::valid_binding_types_v<BindingTs...> structBindings{}; template<typenameT> inlineconstexprboolis_bindings_v=false; template<typename...BindingTs>requiresdetail::valid_binding_types_v<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,typename...BindingTs>requiresvalid_binding_types_v<BindingTs...> structHasBinding<Bindings<BindingTs...>,KeyT>{ constexprstaticboolvalue=[]{ constexprstd::array<bool,sizeof...(BindingTs)>matches{std::is_same_v<KeyT,typenameBindingTs::Key>...}; for(constboolmatch:matches){ if(match){returntrue;} } returnfalse; }(); }; template<typenameBindingsT> structBindingLookup; template<typename...BindingTs>requiresvalid_binding_types_v<BindingTs...> structBindingLookup<Bindings<BindingTs...>>:BindingTs...{ template<typenameKeyT,typenameTargetT> staticBinding<KeyT, TargetT>select(Binding<KeyT, TargetT>); }; template<typenameBindingsT,typenameKeyT> structBoundType{ usingLookup=BindingLookup<BindingsT>; usingtarget_type=decltype(Lookup::templateselect<KeyT>(Lookup{}))::Target; }; } 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; }