cpp-common/bt2c: change some `static inline` functions to just `inline`
[babeltrace.git] / src / cpp-common / bt2c / c-string-view.hpp
index fb1b3a658aeb87fab893da56d52c380780f7d25f..b1a7b6e76d4037fb2976f1248a1a26d4278d822c 100644 (file)
@@ -13,7 +13,9 @@
 
 #include "common/assert.h"
 #include "cpp-common/bt2s/string-view.hpp"
-#include "cpp-common/vendor/fmt/format.h"
+#include "cpp-common/vendor/fmt/format.h" /* IWYU pragma: keep */
+
+#include "type-traits.hpp"
 
 namespace bt2c {
 
@@ -31,14 +33,14 @@ public:
      *
      * Intentionally not explicit.
      */
-    CStringView() noexcept = default;
+    constexpr CStringView() noexcept = default;
 
     /*
      * Builds a view of the C string `str` (may be `nullptr`).
      *
      * Intentionally not explicit.
      */
-    CStringView(const char * const str) noexcept : _mStr {str}
+    constexpr CStringView(const char * const str) noexcept : _mStr {str}
     {
     }
 
@@ -178,11 +180,72 @@ private:
     const char *_mStr = nullptr;
 };
 
-static inline const char *format_as(const CStringView& str)
+inline const char *format_as(const CStringView& str)
 {
     return str ? *str : "(null)";
 }
 
+namespace internal {
+
+template <typename StrT>
+const char *asConstCharPtr(StrT&& val) noexcept
+{
+    return val.data();
+}
+
+inline const char *asConstCharPtr(const char * const val) noexcept
+{
+    return val;
+}
+
+template <typename StrT>
+using ComparableWithCStringView =
+    IsOneOf<typename std::decay<StrT>::type, CStringView, std::string, const char *>;
+
+} /* namespace internal */
+
+/*
+ * Returns true if `lhs` is equal to `rhs`.
+ *
+ * `LhsT` and `RhsT` may be any of:
+ *
+ * • `const char *`
+ * • `std::string`
+ * • `CStringView`
+ *
+ * Both `lhs` and `rhs` must not have an underlying `nullptr` raw data.
+ */
+template <
+    typename LhsT, typename RhsT,
+    typename = typename std::enable_if<internal::ComparableWithCStringView<LhsT>::value>::type,
+    typename = typename std::enable_if<internal::ComparableWithCStringView<RhsT>::value>::type>
+bool operator==(LhsT&& lhs, RhsT&& rhs) noexcept
+{
+    const auto rawLhs = internal::asConstCharPtr(lhs);
+    const auto rawRhs = internal::asConstCharPtr(rhs);
+
+    BT_ASSERT_DBG(rawLhs);
+    BT_ASSERT_DBG(rawRhs);
+    return std::strcmp(rawLhs, rawRhs) == 0;
+}
+
+/*
+ * Returns true if `lhs` is not equal to `rhs`.
+ *
+ * `LhsT` and `RhsT` may be any of:
+ *
+ * • `const char *`
+ * • `std::string`
+ * • `CStringView`
+ *
+ * Both `lhs` and `rhs` must not have an underlying `nullptr` raw data.
+ */
+template <typename LhsT, typename RhsT>
+bool operator!=(LhsT&& lhs, RhsT&& rhs) noexcept
+{
+    return !(std::forward<LhsT>(lhs) == std::forward<RhsT>(rhs));
+}
+
 } /* namespace bt2c */
 
 #endif /* BABELTRACE_CPP_COMMON_BT2C_C_STRING_VIEW_HPP */
This page took 0.025425 seconds and 4 git commands to generate.