@@ -312,6 +312,94 @@ class hypergraph final {
312312 };
313313 }
314314
315+ hyperedge_type add_hyperedge (const traits::c_forward_range_of<id_type> auto & vertex_id_rng)
316+ requires std::same_as<directional_tag, undirected_t>
317+ {
318+ auto he = this ->add_hyperedge ();
319+ this ->bind (vertex_id_rng, he.id ());
320+ return he;
321+ }
322+
323+ gl_attr_force_inline hyperedge_type
324+ add_hyperedge (const traits::c_forward_range_of<vertex_type> auto & vertex_rng)
325+ requires std::same_as<directional_tag, undirected_t >
326+ {
327+ return this ->add_hyperedge (vertex_rng | std::views::transform (&vertex_type::id));
328+ }
329+
330+ hyperedge_type add_hyperedge_with (
331+ const traits::c_forward_range_of<id_type> auto & vertex_id_rng,
332+ hyperedge_properties_type properties
333+ )
334+ requires(std::same_as<directional_tag, undirected_t > and traits::c_non_empty_properties<hyperedge_properties_type>)
335+ {
336+ auto he = this ->add_hyperedge_with (std::move (properties));
337+ this ->bind (vertex_id_rng, he.id ());
338+ return he;
339+ }
340+
341+ gl_attr_force_inline hyperedge_type add_hyperedge_with (
342+ const traits::c_forward_range_of<vertex_type> auto & vertex_rng,
343+ hyperedge_properties_type properties
344+ )
345+ requires(std::same_as<directional_tag, undirected_t > and traits::c_non_empty_properties<hyperedge_properties_type>)
346+ {
347+ return this ->add_hyperedge_with (
348+ vertex_rng | std::views::transform (&vertex_type::id), std::move (properties)
349+ );
350+ }
351+
352+ hyperedge_type add_hyperedge (
353+ const traits::c_forward_range_of<id_type> auto & tail_id_rng,
354+ const traits::c_forward_range_of<id_type> auto & head_id_rng
355+ )
356+ requires std::same_as<directional_tag, bf_directed_t>
357+ {
358+ auto he = this ->add_hyperedge ();
359+ this ->bind_tail (tail_id_rng, he.id ());
360+ this ->bind_head (head_id_rng, he.id ());
361+ return he;
362+ }
363+
364+ gl_attr_force_inline hyperedge_type add_hyperedge (
365+ const traits::c_forward_range_of<vertex_type> auto & tail_rng,
366+ const traits::c_forward_range_of<vertex_type> auto & head_rng
367+ )
368+ requires std::same_as<directional_tag, bf_directed_t>
369+ {
370+ return this ->add_hyperedge (
371+ tail_rng | std::views::transform (&vertex_type::id),
372+ head_rng | std::views::transform (&vertex_type::id)
373+ );
374+ }
375+
376+ hyperedge_type add_hyperedge_with (
377+ const traits::c_forward_range_of<id_type> auto & tail_id_rng,
378+ const traits::c_forward_range_of<id_type> auto & head_id_rng,
379+ hyperedge_properties_type properties
380+ )
381+ requires(std::same_as<directional_tag, bf_directed_t > and traits::c_non_empty_properties<hyperedge_properties_type>)
382+ {
383+ auto he = this ->add_hyperedge_with (std::move (properties));
384+ this ->bind_tail (tail_id_rng, he.id ());
385+ this ->bind_head (head_id_rng, he.id ());
386+ return he;
387+ }
388+
389+ gl_attr_force_inline hyperedge_type add_hyperedge_with (
390+ const traits::c_forward_range_of<vertex_type> auto & tail_rng,
391+ const traits::c_forward_range_of<vertex_type> auto & head_rng,
392+ hyperedge_properties_type properties
393+ )
394+ requires(std::same_as<directional_tag, bf_directed_t > and traits::c_non_empty_properties<hyperedge_properties_type>)
395+ {
396+ return this ->add_hyperedge_with (
397+ tail_rng | std::views::transform (&vertex_type::id),
398+ head_rng | std::views::transform (&vertex_type::id),
399+ std::move (properties)
400+ );
401+ }
402+
315403 void add_hyperedges (const size_type n) {
316404 this ->_impl .add_hyperedges (n);
317405 this ->_n_hyperedges += n;
@@ -406,6 +494,104 @@ class hypergraph final {
406494 this ->bind (vertex.id (), hyperedge.id ());
407495 }
408496
497+ void bind (
498+ const traits::c_forward_range_of<id_type> auto & vertex_id_rng, const id_type hyperedge_id
499+ )
500+ requires std::same_as<directional_tag, undirected_t>
501+ {
502+ this ->_verify_hyperedge_id (hyperedge_id);
503+ for (const auto vertex_id : vertex_id_rng) {
504+ this ->_verify_vertex_id (vertex_id);
505+ this ->_impl .bind (vertex_id, hyperedge_id);
506+ }
507+ }
508+
509+ gl_attr_force_inline void bind (
510+ const traits::c_forward_range_of<vertex_type> auto & vertex_rng,
511+ const hyperedge_type& hyperedge
512+ )
513+ requires std::same_as<directional_tag, undirected_t>
514+ {
515+ this ->bind (vertex_rng | std::views::transform (&vertex_type::id), hyperedge.id ());
516+ }
517+
518+ void bind (
519+ const id_type vertex_id, const traits::c_forward_range_of<id_type> auto & hyperedge_id_rng
520+ )
521+ requires std::same_as<directional_tag, undirected_t>
522+ {
523+ this ->_verify_vertex_id (vertex_id);
524+ for (const auto hyperedge_id : hyperedge_id_rng) {
525+ this ->_verify_hyperedge_id (hyperedge_id);
526+ this ->_impl .bind (vertex_id, hyperedge_id);
527+ }
528+ }
529+
530+ gl_attr_force_inline void bind (
531+ const vertex_type& vertex,
532+ const traits::c_forward_range_of<hyperedge_type> auto & hyperedge_rng
533+ )
534+ requires std::same_as<directional_tag, undirected_t>
535+ {
536+ this ->bind (vertex.id (), hyperedge_rng | std::views::transform (&hyperedge_type::id));
537+ }
538+
539+ void bind_tail (const id_type vertex_id, const id_type hyperedge_id)
540+ requires std::same_as<directional_tag, bf_directed_t>
541+ {
542+ this ->_verify_vertex_id (vertex_id);
543+ this ->_verify_hyperedge_id (hyperedge_id);
544+ this ->_impl .bind_tail (vertex_id, hyperedge_id);
545+ }
546+
547+ gl_attr_force_inline void bind_tail (const vertex_type& vertex, const hyperedge_type& hyperedge)
548+ requires std::same_as<directional_tag, bf_directed_t>
549+ {
550+ this ->bind_tail (vertex.id (), hyperedge.id ());
551+ }
552+
553+ void bind_tail (
554+ const traits::c_forward_range_of<id_type> auto & vertex_id_rng, const id_type hyperedge_id
555+ )
556+ requires std::same_as<directional_tag, bf_directed_t>
557+ {
558+ this ->_verify_hyperedge_id (hyperedge_id);
559+ for (const auto vertex_id : vertex_id_rng) {
560+ this ->_verify_vertex_id (vertex_id);
561+ this ->_impl .bind_tail (vertex_id, hyperedge_id);
562+ }
563+ }
564+
565+ gl_attr_force_inline void bind_tail (
566+ const traits::c_forward_range_of<vertex_type> auto & vertex_rng,
567+ const hyperedge_type& hyperedge
568+ )
569+ requires std::same_as<directional_tag, bf_directed_t>
570+ {
571+ this ->bind_tail (vertex_rng | std::views::transform (&vertex_type::id), hyperedge.id ());
572+ }
573+
574+ void bind_tail (
575+ const id_type vertex_id, const traits::c_forward_range_of<id_type> auto & hyperedge_id_rng
576+ )
577+ requires std::same_as<directional_tag, bf_directed_t>
578+ {
579+ this ->_verify_vertex_id (vertex_id);
580+ for (const auto hyperedge_id : hyperedge_id_rng) {
581+ this ->_verify_hyperedge_id (hyperedge_id);
582+ this ->_impl .bind_tail (vertex_id, hyperedge_id);
583+ }
584+ }
585+
586+ gl_attr_force_inline void bind_tail (
587+ const vertex_type& vertex,
588+ const traits::c_forward_range_of<hyperedge_type> auto & hyperedge_rng
589+ )
590+ requires std::same_as<directional_tag, bf_directed_t>
591+ {
592+ this ->bind_tail (vertex.id (), hyperedge_rng | std::views::transform (&hyperedge_type::id));
593+ }
594+
409595 void bind_head (const id_type vertex_id, const id_type hyperedge_id)
410596 requires std::same_as<directional_tag, bf_directed_t>
411597 {
@@ -420,18 +606,46 @@ class hypergraph final {
420606 this ->bind_head (vertex.id (), hyperedge.id ());
421607 }
422608
423- void bind_tail (const id_type vertex_id, const id_type hyperedge_id)
609+ void bind_head (
610+ const traits::c_forward_range_of<id_type> auto & vertex_id_rng, const id_type hyperedge_id
611+ )
424612 requires std::same_as<directional_tag, bf_directed_t>
425613 {
426- this ->_verify_vertex_id (vertex_id);
427614 this ->_verify_hyperedge_id (hyperedge_id);
428- this ->_impl .bind_tail (vertex_id, hyperedge_id);
615+ for (const auto vertex_id : vertex_id_rng) {
616+ this ->_verify_vertex_id (vertex_id);
617+ this ->_impl .bind_head (vertex_id, hyperedge_id);
618+ }
429619 }
430620
431- gl_attr_force_inline void bind_tail (const vertex_type& vertex, const hyperedge_type& hyperedge)
621+ gl_attr_force_inline void bind_head (
622+ const traits::c_forward_range_of<vertex_type> auto & vertex_rng,
623+ const hyperedge_type& hyperedge
624+ )
432625 requires std::same_as<directional_tag, bf_directed_t>
433626 {
434- this ->bind_tail (vertex.id (), hyperedge.id ());
627+ this ->bind_head (vertex_rng | std::views::transform (&vertex_type::id), hyperedge.id ());
628+ }
629+
630+ void bind_head (
631+ const id_type vertex_id, const traits::c_forward_range_of<id_type> auto & hyperedge_id_rng
632+ )
633+ requires std::same_as<directional_tag, bf_directed_t>
634+ {
635+ this ->_verify_vertex_id (vertex_id);
636+ for (const auto hyperedge_id : hyperedge_id_rng) {
637+ this ->_verify_hyperedge_id (hyperedge_id);
638+ this ->_impl .bind_head (vertex_id, hyperedge_id);
639+ }
640+ }
641+
642+ gl_attr_force_inline void bind_head (
643+ const vertex_type& vertex,
644+ const traits::c_forward_range_of<hyperedge_type> auto & hyperedge_rng
645+ )
646+ requires std::same_as<directional_tag, bf_directed_t>
647+ {
648+ this ->bind_head (vertex.id (), hyperedge_rng | std::views::transform (&hyperedge_type::id));
435649 }
436650
437651 void unbind (const id_type vertex_id, const id_type hyperedge_id) {
0 commit comments