interest+data: add string_view overloads for convenience

Also, explicitly declare the nullptr_t overloads as deleted, so that
users get a clear compilation error instead of a potentially confusing
"ambiguous overload" if they try to pass nullptr to these functions.

Change-Id: I399efcbd698a0d3f7e29219d21eb1a53a1d71070
diff --git a/tests/unit/data.t.cpp b/tests/unit/data.t.cpp
index 4672a83..cb7de5b 100644
--- a/tests/unit/data.t.cpp
+++ b/tests/unit/data.t.cpp
@@ -168,7 +168,7 @@
 {
   Data d;
   BOOST_CHECK_EXCEPTION(d.wireEncode(), tlv::Error, [] (const auto& e) {
-    return e.what() == "Requested wire format, but Data has not been signed"s;
+    return e.what() == "Requested wire format, but Data has not been signed"sv;
   });
 }
 
@@ -239,7 +239,7 @@
 BOOST_AUTO_TEST_CASE(NotData)
 {
   BOOST_CHECK_EXCEPTION(d.wireDecode("4202CAFE"_block), tlv::Error, [] (const auto& e) {
-    return e.what() == "Expecting Data element, but TLV has type 66"s;
+    return e.what() == "Expecting Data element, but TLV has type 66"sv;
   });
 }
 
@@ -330,46 +330,46 @@
     "0630 1400 0703080145 1500 16031B0100 "
     "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
     tlv::Error,
-    [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
+    [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
   BOOST_CHECK_EXCEPTION(d.wireDecode(
     "0630 0703080145 1500 1400 16031B0100 "
     "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
     tlv::Error,
-    [] (const auto& e) { return e.what() == "MetaInfo element is out of order"s; });
+    [] (const auto& e) { return e.what() == "MetaInfo element is out of order"sv; });
   BOOST_CHECK_EXCEPTION(d.wireDecode(
     "0630 0703080145 1400 16031B0100 1500 "
     "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
     tlv::Error,
-    [] (const auto& e) { return e.what() == "Content element is out of order"s; });
+    [] (const auto& e) { return e.what() == "Content element is out of order"sv; });
   BOOST_CHECK_EXCEPTION(d.wireDecode(
     "0630 0703080145 1400 1500 "
     "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76 16031B0100"_block),
     tlv::Error,
-    [] (const auto& e) { return e.what() == "SignatureInfo element is out of order"s; });
+    [] (const auto& e) { return e.what() == "SignatureInfo element is out of order"sv; });
   BOOST_CHECK_EXCEPTION(d.wireDecode(
     "0652 0703080145 1400 1500 16031B0100 "
     "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"
     "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
     tlv::Error,
-    [] (const auto& e) { return e.what() == "SignatureValue element is out of order"s; });
+    [] (const auto& e) { return e.what() == "SignatureValue element is out of order"sv; });
 }
 
 BOOST_AUTO_TEST_CASE(MissingName)
 {
   BOOST_CHECK_EXCEPTION(d.wireDecode("0607 16031B0100 1700"_block), tlv::Error,
-                        [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
+                        [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
 }
 
 BOOST_AUTO_TEST_CASE(MissingSignatureInfo)
 {
   BOOST_CHECK_EXCEPTION(d.wireDecode("0607 0703080144 1700"_block), tlv::Error,
-                        [] (const auto& e) { return e.what() == "SignatureInfo element is missing"s; });
+                        [] (const auto& e) { return e.what() == "SignatureInfo element is missing"sv; });
 }
 
 BOOST_AUTO_TEST_CASE(MissingSignatureValue)
 {
   BOOST_CHECK_EXCEPTION(d.wireDecode("0607 0700 16031B0100"_block), tlv::Error,
-                        [] (const auto& e) { return e.what() == "SignatureValue element is missing"s; });
+                        [] (const auto& e) { return e.what() == "SignatureValue element is missing"sv; });
 }
 
 BOOST_AUTO_TEST_CASE(UnrecognizedNonCriticalElementBeforeName)
@@ -378,7 +378,7 @@
                           "062E FC00 0703080144 16031B0100 "
                           "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
                         tlv::Error,
-                        [] (const auto& e) { return e.what() == "Name element is missing or out of order"s; });
+                        [] (const auto& e) { return e.what() == "Name element is missing or out of order"sv; });
 }
 
 BOOST_AUTO_TEST_CASE(UnrecognizedCriticalElement)
@@ -387,7 +387,7 @@
                           "0632 0703080145 FB00 1400 1500 16031B0100 "
                           "1720612A79399E60304A9F701C1ECAC7956BF2F1B046E6C6F0D6C29B3FE3A29BAD76"_block),
                         tlv::Error,
-                        [] (const auto& e) { return e.what() == "Unrecognized element of critical type 251"s; });
+                        [] (const auto& e) { return e.what() == "Unrecognized element of critical type 251"sv; });
 }
 
 BOOST_AUTO_TEST_SUITE_END() // Decode
@@ -523,7 +523,9 @@
   BOOST_TEST(d.getContent().value_bytes() == nested, boost::test_tools::per_element());
 
   // Block overload, default constructed (invalid)
-  BOOST_CHECK_THROW(d.setContent(Block{}), std::invalid_argument);
+  BOOST_CHECK_EXCEPTION(d.setContent(Block{}), std::invalid_argument, [] (const auto& e) {
+    return e.what() == "Content block must be valid"sv;
+  });
 
   // span overload
   d.setContent(nested);
@@ -532,8 +534,15 @@
   BOOST_TEST(d.getContent().value_bytes() == nested, boost::test_tools::per_element());
   d.setContent(span<uint8_t>{});
   BOOST_CHECK_EQUAL(d.hasContent(), true);
-  BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
-  BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
+  BOOST_CHECK_EQUAL(d.getContent(), "1500"_block);
+
+  // string_view overload
+  d.setContent("hi"sv);
+  BOOST_CHECK_EQUAL(d.hasContent(), true);
+  BOOST_CHECK_EQUAL(d.getContent(), "15026869"_block);
+  d.setContent("");
+  BOOST_CHECK_EQUAL(d.hasContent(), true);
+  BOOST_CHECK_EQUAL(d.getContent(), "1500"_block);
 
   // ConstBufferPtr overload
   d.setContent(std::make_shared<Buffer>(direct, sizeof(direct)));
@@ -542,9 +551,12 @@
   BOOST_TEST(d.getContent().value_bytes() == direct, boost::test_tools::per_element());
   d.setContent(std::make_shared<Buffer>());
   BOOST_CHECK_EQUAL(d.hasContent(), true);
-  BOOST_CHECK_EQUAL(d.getContent().type(), tlv::Content);
-  BOOST_CHECK_EQUAL(d.getContent().value_size(), 0);
-  BOOST_CHECK_THROW(d.setContent(nullptr), std::invalid_argument);
+  BOOST_CHECK_EQUAL(d.getContent(), "1500"_block);
+
+  // ConstBufferPtr overload, null/empty pointer (invalid)
+  BOOST_CHECK_EXCEPTION(d.setContent(ConstBufferPtr{}), std::invalid_argument, [] (const auto& e) {
+    return e.what() == "Content buffer cannot be null"sv;
+  });
 
   // unset
   d.unsetContent();
@@ -573,7 +585,10 @@
   BOOST_CHECK_EQUAL(d.getSignatureValue().type(), tlv::SignatureValue);
   BOOST_CHECK_EQUAL(d.getSignatureValue().value_size(), 0);
 
-  BOOST_CHECK_THROW(d.setSignatureValue(nullptr), std::invalid_argument);
+  // ConstBufferPtr overload, null/empty pointer (invalid)
+  BOOST_CHECK_EXCEPTION(d.setSignatureValue(ConstBufferPtr{}), std::invalid_argument, [] (const auto& e) {
+    return e.what() == "SignatureValue buffer cannot be null"sv;
+  });
 }
 
 BOOST_FIXTURE_TEST_CASE(ExtractSignedRanges, KeyChainFixture)