@@ -562,15 +562,23 @@ shrink_to_fit() noexcept
562562//
563563// ------------------------------------------------
564564
565+ auto
566+ fields_base::
567+ erase (
568+ iterator it) noexcept -> iterator
569+ {
570+ auto const id = it->id .value_or (
571+ detail::header::unknown_field);
572+ raw_erase (it.i_ );
573+ h_.on_erase (id);
574+ return it;
575+ }
576+
565577std::size_t
566578fields_base::
567579erase (
568580 field id)
569581{
570- // Precondition violation
571- if (id == field::unknown)
572- detail::throw_logic_error ();
573-
574582 auto const i0 = h_.find (id);
575583 if (i0 == h_.count )
576584 return 0 ;
@@ -587,7 +595,7 @@ erase(
587595 return 0 ;
588596 auto const ft = h_.tab ();
589597 auto const id = ft[i0].id ;
590- if (id == field::unknown )
598+ if (id == detail::header::unknown_field )
591599 return erase_all_impl (i0, name);
592600 return erase_all_impl (i0, id);
593601}
@@ -701,14 +709,15 @@ set(
701709 h_.size = static_cast <
702710 offset_type>(h_.size + dn);
703711 }
704- auto const id = it->id ;
712+ auto const id = it->id .value_or (
713+ detail::header::unknown_field);
705714 if (h_.is_special (id))
706715 {
707716 // replace first char of name
708717 // with null to hide metadata
709718 char saved = h_.buf [pos0];
710719 auto & e = h_.tab ()[i];
711- e.id = field::unknown ;
720+ e.id = detail::header::unknown_field ;
712721 h_.buf [pos0] = ' \0 ' ;
713722 h_.on_erase (id);
714723 h_.buf [pos0] = saved; // restore
@@ -726,10 +735,6 @@ set(
726735 core::string_view value,
727736 system::error_code& ec)
728737{
729- // Precondition violation
730- if (id == field::unknown)
731- detail::throw_logic_error ();
732-
733738 auto rv = verify_field_value (value);
734739 if (rv.has_error ())
735740 {
801806 }
802807 // VFALCO simple algorithm but
803808 // costs one extra memmove
804- if (id != field::unknown )
809+ if (id != detail::header::unknown_field )
805810 erase_all_impl (i0, id);
806811 else
807812 erase_all_impl (i0, name);
@@ -865,7 +870,7 @@ copy_impl(
865870void
866871fields_base::
867872insert_unchecked_impl (
868- field id,
873+ optional< field> id,
869874 core::string_view name,
870875 core::string_view value,
871876 std::size_t before,
@@ -954,20 +959,20 @@ insert_unchecked_impl(
954959 ! value.empty ());
955960 e.vn = static_cast <
956961 offset_type>(value.size ());
957- e.id = id;
962+ e.id = id.value_or (
963+ detail::header::unknown_field);
958964
959965 // update container
960966 h_.count ++;
961967 h_.size = static_cast <
962968 offset_type>(h_.size + n);
963- if ( id != field::unknown)
964- h_.on_insert (id, value);
969+ h_.on_insert (e.id , value);
965970}
966971
967972void
968973fields_base::
969974insert_impl (
970- field id,
975+ optional< field> id,
971976 core::string_view name,
972977 core::string_view value,
973978 std::size_t before,
@@ -992,17 +997,6 @@ insert_impl(
992997 rv->has_obs_fold );
993998}
994999
995- // erase i and update metadata
996- void
997- fields_base::
998- erase_impl (
999- std::size_t i,
1000- field id) noexcept
1001- {
1002- raw_erase (i);
1003- h_.on_erase (id);
1004- }
1005-
10061000// ------------------------------------------------
10071001
10081002void
@@ -1038,7 +1032,7 @@ erase_all_impl(
10381032 field id) noexcept
10391033{
10401034 BOOST_ASSERT (
1041- id != field::unknown );
1035+ id != detail::header::unknown_field );
10421036 std::size_t n = 1 ;
10431037 std::size_t i = h_.count - 1 ;
10441038 auto const ft = h_.tab ();
@@ -1059,7 +1053,7 @@ erase_all_impl(
10591053}
10601054
10611055// erase all fields with name
1062- // when id == field::unknown
1056+ // when id == detail::header::unknown_field
10631057std::size_t
10641058fields_base::
10651059erase_all_impl (
0 commit comments