git: eddc2f815b3f - main - net/kea: fix build with libc++ 19

From: Dimitry Andric <dim_at_FreeBSD.org>
Date: Fri, 09 Aug 2024 17:35:56 UTC
The branch main has been updated by dim:

URL: https://cgit.FreeBSD.org/ports/commit/?id=eddc2f815b3fac6d363e93e7f9ec4dabc816b0c9

commit eddc2f815b3fac6d363e93e7f9ec4dabc816b0c9
Author:     Dimitry Andric <dim@FreeBSD.org>
AuthorDate: 2024-08-08 18:34:30 +0000
Commit:     Dimitry Andric <dim@FreeBSD.org>
CommitDate: 2024-08-09 17:34:46 +0000

    net/kea: fix build with libc++ 19
    
    As noted in the libc++ 19 release notes [1], std::char_traits<> is now
    only provided for char, char8_t, char16_t, char32_t and wchar_t, and any
    instantiation for other types will fail.
    
    This causes net/kea to fail to compile with clang 19 and libc++ 19,
    resulting in errors similar to:
    
        In file included from edns.cc:9:
        In file included from ../../../src/lib/exceptions/exceptions.h:11:
        /usr/include/c++/v1/string:820:42: error: implicit instantiation of undefined template 'std::char_traits<unsigned char>'
          820 |   static_assert(is_same<_CharT, typename traits_type::char_type>::value,
              |                                          ^
        ../../../src/lib/dns/name.h:727:16: note: in instantiation of template class 'std::basic_string<unsigned char>' requested here
          727 |     NameString ndata_;
              |                ^
        /usr/include/c++/v1/__fwd/string.h:23:29: note: template is declared here
           23 | struct _LIBCPP_TEMPLATE_VIS char_traits;
              |                             ^
    
    `NameString` is defined as `std::basic_string<unsigned char>`, which is
    no longer possible. So redefine it as a `std::vector<unsigned char>`
    instead.
    
    This requires a few adjustments in other places: adjusting the arguments
    for the `assign()` method, which for `std::vector` takes a begin and end
    iterator, instead of a begin iterator and a size, and replacing the
    `append()` method with an equivalent `insert()`.
    
    These changes have also been sent upstream [2].
    
    [1] https://libcxx.llvm.org/ReleaseNotes/19.html#deprecations-and-removals
    [2] https://gitlab.isc.org/isc-projects/kea/-/merge_requests/2410
    
    PR:             280696
    Approved by:    apevnev@me.com (maintainer)
    MFH:            2024Q3
---
 net/kea/files/patch-src_lib_dns_name.cc | 56 +++++++++++++++++++++++++++++++++
 net/kea/files/patch-src_lib_dns_name.h  | 11 +++++++
 2 files changed, 67 insertions(+)

diff --git a/net/kea/files/patch-src_lib_dns_name.cc b/net/kea/files/patch-src_lib_dns_name.cc
new file mode 100644
index 000000000000..745b4f6f66ca
--- /dev/null
+++ b/net/kea/files/patch-src_lib_dns_name.cc
@@ -0,0 +1,56 @@
+--- src/lib/dns/name.cc.orig	2024-07-25 08:50:58 UTC
++++ src/lib/dns/name.cc
+@@ -303,7 +303,7 @@ Name::Name(const std::string &namestring, bool downcas
+     // And get the output
+     labelcount_ = offsets.size();
+     isc_throw_assert(labelcount_ > 0 && labelcount_ <= Name::MAX_LABELS);
+-    ndata_.assign(ndata.data(), ndata.size());
++    ndata_.assign(ndata.data(), ndata.data() + ndata.size());
+     length_ = ndata_.size();
+     offsets_.assign(offsets.begin(), offsets.end());
+ }
+@@ -336,7 +336,7 @@ Name::Name(const char* namedata, size_t data_len, cons
+     // Get the output
+     labelcount_ = offsets.size();
+     isc_throw_assert(labelcount_ > 0 && labelcount_ <= Name::MAX_LABELS);
+-    ndata_.assign(ndata.data(), ndata.size());
++    ndata_.assign(ndata.data(), ndata.data() + ndata.size());
+     length_ = ndata_.size();
+     offsets_.assign(offsets.begin(), offsets.end());
+ 
+@@ -347,7 +347,7 @@ Name::Name(const char* namedata, size_t data_len, cons
+         // Drop the last character of the data (the \0) and append a copy of
+         // the origin's data
+         ndata_.erase(ndata_.end() - 1);
+-        ndata_.append(origin->ndata_);
++        ndata_.insert(ndata.end(), origin->ndata_.begin(), origin->ndata_.end());
+ 
+         // Do a similar thing with offsets. However, we need to move them
+         // so they point after the prefix we parsed before.
+@@ -582,7 +582,7 @@ Name::concatenate(const Name& suffix) const {
+ 
+     Name retname;
+     retname.ndata_.reserve(length);
+-    retname.ndata_.assign(ndata_, 0, length_ - 1);
++    retname.ndata_.assign(ndata_.data(), ndata_.data() + length_ - 1);
+     retname.ndata_.insert(retname.ndata_.end(),
+                           suffix.ndata_.begin(), suffix.ndata_.end());
+     isc_throw_assert(retname.ndata_.size() == length);
+@@ -622,7 +622,7 @@ Name::reverse() const {
+     NameString::const_iterator n0 = ndata_.begin();
+     retname.offsets_.push_back(0);
+     while (rit1 != offsets_.rend()) {
+-        retname.ndata_.append(n0 + *rit1, n0 + *rit0);
++        retname.ndata_.insert(retname.ndata_.end(), n0 + *rit1, n0 + *rit0);
+         retname.offsets_.push_back(retname.ndata_.size());
+         ++rit0;
+         ++rit1;
+@@ -662,7 +662,7 @@ Name::split(const unsigned int first, const unsigned i
+     // original name, and append the trailing dot explicitly.
+     //
+     retname.ndata_.reserve(retname.offsets_.back() + 1);
+-    retname.ndata_.assign(ndata_, offsets_[first], retname.offsets_.back());
++    retname.ndata_.assign(ndata_.data() + offsets_[first], ndata_.data() + retname.offsets_.back());
+     retname.ndata_.push_back(0);
+ 
+     retname.length_ = retname.ndata_.size();
diff --git a/net/kea/files/patch-src_lib_dns_name.h b/net/kea/files/patch-src_lib_dns_name.h
new file mode 100644
index 000000000000..e83fde6a960d
--- /dev/null
+++ b/net/kea/files/patch-src_lib_dns_name.h
@@ -0,0 +1,11 @@
+--- src/lib/dns/name.h.orig	2024-07-25 08:50:58 UTC
++++ src/lib/dns/name.h
+@@ -228,7 +228,7 @@ class Name { (private)
+     //@{
+ private:
+     /// \brief Name data string
+-    typedef std::basic_string<uint8_t> NameString;
++    typedef std::vector<uint8_t> NameString;
+     /// \brief Name offsets type
+     typedef std::vector<uint8_t> NameOffsets;
+