mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-19 08:37:54 +01:00
Adopt absl::string_view in rtc_base/log_sinks
This is part of a large scale effort to increase adoption of absl::string_view across the WebRTC code base. This CL adds absl::string_view versions of the OnLogMessage functions in rtc::LogSink. The const std::string& versions are kept for now since downstream clients use subclasses of LogSink and need to be migrated before these are removed. Bug: webrtc:13579 Change-Id: I57bb72ad503805ff0ca16f1d7aece2d44c65cb73 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/253980 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Xavier Lepaul <xalep@webrtc.org> Owners-Override: Xavier Lepaul <xalep@webrtc.org> Commit-Queue: Ali Tofigh <alito@webrtc.org> Cr-Commit-Position: refs/heads/main@{#36189}
This commit is contained in:
parent
9848890590
commit
6364d0899e
16 changed files with 118 additions and 24 deletions
|
@ -506,6 +506,7 @@ if (rtc_include_tests) {
|
||||||
absl_deps = [
|
absl_deps = [
|
||||||
"//third_party/abseil-cpp/absl/container:inlined_vector",
|
"//third_party/abseil-cpp/absl/container:inlined_vector",
|
||||||
"//third_party/abseil-cpp/absl/memory",
|
"//third_party/abseil-cpp/absl/memory",
|
||||||
|
"//third_party/abseil-cpp/absl/strings",
|
||||||
"//third_party/abseil-cpp/absl/types:optional",
|
"//third_party/abseil-cpp/absl/types:optional",
|
||||||
"//third_party/abseil-cpp/absl/types:variant",
|
"//third_party/abseil-cpp/absl/types:variant",
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "absl/strings/string_view.h"
|
||||||
#include "api/test/create_frame_generator.h"
|
#include "api/test/create_frame_generator.h"
|
||||||
#include "call/call.h"
|
#include "call/call.h"
|
||||||
#include "call/fake_network_pipe.h"
|
#include "call/fake_network_pipe.h"
|
||||||
|
@ -50,13 +51,17 @@ class LogObserver {
|
||||||
class Callback : public rtc::LogSink {
|
class Callback : public rtc::LogSink {
|
||||||
public:
|
public:
|
||||||
void OnLogMessage(const std::string& message) override {
|
void OnLogMessage(const std::string& message) override {
|
||||||
|
OnLogMessage(absl::string_view(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnLogMessage(absl::string_view message) override {
|
||||||
MutexLock lock(&mutex_);
|
MutexLock lock(&mutex_);
|
||||||
// Ignore log lines that are due to missing AST extensions, these are
|
// Ignore log lines that are due to missing AST extensions, these are
|
||||||
// logged when we switch back from AST to TOF until the wrapping bitrate
|
// logged when we switch back from AST to TOF until the wrapping bitrate
|
||||||
// estimator gives up on using AST.
|
// estimator gives up on using AST.
|
||||||
if (message.find("BitrateEstimator") != std::string::npos &&
|
if (message.find("BitrateEstimator") != absl::string_view::npos &&
|
||||||
message.find("packet is missing") == std::string::npos) {
|
message.find("packet is missing") == absl::string_view::npos) {
|
||||||
received_log_lines_.push_back(message);
|
received_log_lines_.push_back(std::string(message));
|
||||||
}
|
}
|
||||||
|
|
||||||
int num_popped = 0;
|
int num_popped = 0;
|
||||||
|
@ -66,7 +71,7 @@ class LogObserver {
|
||||||
received_log_lines_.pop_front();
|
received_log_lines_.pop_front();
|
||||||
expected_log_lines_.pop_front();
|
expected_log_lines_.pop_front();
|
||||||
num_popped++;
|
num_popped++;
|
||||||
EXPECT_TRUE(a.find(b) != std::string::npos) << a << " != " << b;
|
EXPECT_TRUE(a.find(b) != absl::string_view::npos) << a << " != " << b;
|
||||||
}
|
}
|
||||||
if (expected_log_lines_.empty()) {
|
if (expected_log_lines_.empty()) {
|
||||||
if (num_popped > 0) {
|
if (num_popped > 0) {
|
||||||
|
|
|
@ -1422,6 +1422,7 @@ if (rtc_include_tests) {
|
||||||
"//third_party/abseil-cpp/absl/base:core_headers",
|
"//third_party/abseil-cpp/absl/base:core_headers",
|
||||||
"//third_party/abseil-cpp/absl/memory",
|
"//third_party/abseil-cpp/absl/memory",
|
||||||
"//third_party/abseil-cpp/absl/numeric:bits",
|
"//third_party/abseil-cpp/absl/numeric:bits",
|
||||||
|
"//third_party/abseil-cpp/absl/strings",
|
||||||
"//third_party/abseil-cpp/absl/types:optional",
|
"//third_party/abseil-cpp/absl/types:optional",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "absl/strings/string_view.h"
|
||||||
#include "rtc_base/checks.h"
|
#include "rtc_base/checks.h"
|
||||||
|
|
||||||
namespace rtc {
|
namespace rtc {
|
||||||
|
@ -36,14 +37,18 @@ FileRotatingLogSink::FileRotatingLogSink(FileRotatingStream* stream)
|
||||||
FileRotatingLogSink::~FileRotatingLogSink() {}
|
FileRotatingLogSink::~FileRotatingLogSink() {}
|
||||||
|
|
||||||
void FileRotatingLogSink::OnLogMessage(const std::string& message) {
|
void FileRotatingLogSink::OnLogMessage(const std::string& message) {
|
||||||
|
OnLogMessage(absl::string_view(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileRotatingLogSink::OnLogMessage(absl::string_view message) {
|
||||||
if (!stream_->IsOpen()) {
|
if (!stream_->IsOpen()) {
|
||||||
std::fprintf(stderr, "Init() must be called before adding this sink.\n");
|
std::fprintf(stderr, "Init() must be called before adding this sink.\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
stream_->Write(message.c_str(), message.size());
|
stream_->Write(message.data(), message.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileRotatingLogSink::OnLogMessage(const std::string& message,
|
void FileRotatingLogSink::OnLogMessage(absl::string_view message,
|
||||||
LoggingSeverity sev,
|
LoggingSeverity sev,
|
||||||
const char* tag) {
|
const char* tag) {
|
||||||
if (!stream_->IsOpen()) {
|
if (!stream_->IsOpen()) {
|
||||||
|
@ -52,7 +57,7 @@ void FileRotatingLogSink::OnLogMessage(const std::string& message,
|
||||||
}
|
}
|
||||||
stream_->Write(tag, strlen(tag));
|
stream_->Write(tag, strlen(tag));
|
||||||
stream_->Write(": ", 2);
|
stream_->Write(": ", 2);
|
||||||
stream_->Write(message.c_str(), message.size());
|
stream_->Write(message.data(), message.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FileRotatingLogSink::Init() {
|
bool FileRotatingLogSink::Init() {
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "absl/strings/string_view.h"
|
||||||
#include "rtc_base/file_rotating_stream.h"
|
#include "rtc_base/file_rotating_stream.h"
|
||||||
#include "rtc_base/logging.h"
|
#include "rtc_base/logging.h"
|
||||||
|
|
||||||
|
@ -39,7 +40,8 @@ class FileRotatingLogSink : public LogSink {
|
||||||
// Writes the message to the current file. It will spill over to the next
|
// Writes the message to the current file. It will spill over to the next
|
||||||
// file if needed.
|
// file if needed.
|
||||||
void OnLogMessage(const std::string& message) override;
|
void OnLogMessage(const std::string& message) override;
|
||||||
void OnLogMessage(const std::string& message,
|
void OnLogMessage(absl::string_view message) override;
|
||||||
|
void OnLogMessage(absl::string_view message,
|
||||||
LoggingSeverity sev,
|
LoggingSeverity sev,
|
||||||
const char* tag) override;
|
const char* tag) override;
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@ static const int kMaxLogLineSize = 1024 - 60;
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "absl/base/attributes.h"
|
#include "absl/base/attributes.h"
|
||||||
|
#include "absl/strings/string_view.h"
|
||||||
#include "rtc_base/checks.h"
|
#include "rtc_base/checks.h"
|
||||||
#include "rtc_base/platform_thread_types.h"
|
#include "rtc_base/platform_thread_types.h"
|
||||||
#include "rtc_base/string_encode.h"
|
#include "rtc_base/string_encode.h"
|
||||||
|
@ -563,4 +564,20 @@ void LogSink::OnLogMessage(const std::string& msg,
|
||||||
LoggingSeverity /* severity */) {
|
LoggingSeverity /* severity */) {
|
||||||
OnLogMessage(msg);
|
OnLogMessage(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inefficient default implementation, override is recommended.
|
||||||
|
void LogSink::OnLogMessage(absl::string_view msg,
|
||||||
|
LoggingSeverity severity,
|
||||||
|
const char* tag) {
|
||||||
|
OnLogMessage(tag + (": " + std::string(msg)), severity);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogSink::OnLogMessage(absl::string_view msg,
|
||||||
|
LoggingSeverity /* severity */) {
|
||||||
|
OnLogMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LogSink::OnLogMessage(absl::string_view msg) {
|
||||||
|
OnLogMessage(std::string(msg));
|
||||||
|
}
|
||||||
} // namespace rtc
|
} // namespace rtc
|
||||||
|
|
|
@ -112,6 +112,13 @@ class LogSink {
|
||||||
LoggingSeverity severity);
|
LoggingSeverity severity);
|
||||||
virtual void OnLogMessage(const std::string& message) = 0;
|
virtual void OnLogMessage(const std::string& message) = 0;
|
||||||
|
|
||||||
|
virtual void OnLogMessage(absl::string_view msg,
|
||||||
|
LoggingSeverity severity,
|
||||||
|
const char* tag);
|
||||||
|
virtual void OnLogMessage(absl::string_view message,
|
||||||
|
LoggingSeverity severity);
|
||||||
|
virtual void OnLogMessage(absl::string_view message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class ::rtc::LogMessage;
|
friend class ::rtc::LogMessage;
|
||||||
#if RTC_LOG_ENABLED()
|
#if RTC_LOG_ENABLED()
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
#include "absl/strings/string_view.h"
|
||||||
#include "rtc_base/arraysize.h"
|
#include "rtc_base/arraysize.h"
|
||||||
#include "rtc_base/checks.h"
|
#include "rtc_base/checks.h"
|
||||||
#include "rtc_base/event.h"
|
#include "rtc_base/event.h"
|
||||||
|
@ -34,7 +35,10 @@ class LogSinkImpl : public LogSink {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void OnLogMessage(const std::string& message) override {
|
void OnLogMessage(const std::string& message) override {
|
||||||
log_data_->append(message);
|
OnLogMessage(absl::string_view(message));
|
||||||
|
}
|
||||||
|
void OnLogMessage(absl::string_view message) override {
|
||||||
|
log_data_->append(message.begin(), message.end());
|
||||||
}
|
}
|
||||||
std::string* const log_data_;
|
std::string* const log_data_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -149,6 +149,8 @@ if (is_ios || is_mac) {
|
||||||
"../rtc_base:checks",
|
"../rtc_base:checks",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
|
||||||
|
|
||||||
frameworks = [
|
frameworks = [
|
||||||
"AVFoundation.framework",
|
"AVFoundation.framework",
|
||||||
"CoreMedia.framework",
|
"CoreMedia.framework",
|
||||||
|
@ -180,6 +182,7 @@ if (is_ios || is_mac) {
|
||||||
|
|
||||||
deps = [
|
deps = [
|
||||||
":base_objc",
|
":base_objc",
|
||||||
|
":helpers_objc",
|
||||||
"../rtc_base",
|
"../rtc_base",
|
||||||
"../rtc_base:checks",
|
"../rtc_base:checks",
|
||||||
"../rtc_base:logging",
|
"../rtc_base:logging",
|
||||||
|
@ -189,6 +192,8 @@ if (is_ios || is_mac) {
|
||||||
"..:common_objc",
|
"..:common_objc",
|
||||||
":used_from_extension",
|
":used_from_extension",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc_library("file_logger_objc") {
|
rtc_library("file_logger_objc") {
|
||||||
|
|
|
@ -1137,6 +1137,8 @@ if (current_os == "linux" || is_android) {
|
||||||
":native_api_jni",
|
":native_api_jni",
|
||||||
"../../rtc_base",
|
"../../rtc_base",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc_library("audio_device_module_base") {
|
rtc_library("audio_device_module_base") {
|
||||||
|
@ -1620,7 +1622,10 @@ if (is_android) {
|
||||||
"../../test:test_support",
|
"../../test:test_support",
|
||||||
"../../testing/gtest",
|
"../../testing/gtest",
|
||||||
]
|
]
|
||||||
absl_deps = [ "//third_party/abseil-cpp/absl/memory" ]
|
absl_deps = [
|
||||||
|
"//third_party/abseil-cpp/absl/memory",
|
||||||
|
"//third_party/abseil-cpp/absl/strings",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
rtc_android_library("native_unittests_java") {
|
rtc_android_library("native_unittests_java") {
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "absl/strings/string_view.h"
|
||||||
#include "rtc_base/event.h"
|
#include "rtc_base/event.h"
|
||||||
#include "rtc_base/logging.h"
|
#include "rtc_base/logging.h"
|
||||||
#include "rtc_base/platform_thread.h"
|
#include "rtc_base/platform_thread.h"
|
||||||
|
@ -201,6 +202,9 @@ class LookoutLogSink final : public rtc::LogSink {
|
||||||
explicit LookoutLogSink(std::string look_for)
|
explicit LookoutLogSink(std::string look_for)
|
||||||
: look_for_(std::move(look_for)) {}
|
: look_for_(std::move(look_for)) {}
|
||||||
void OnLogMessage(const std::string& message) override {
|
void OnLogMessage(const std::string& message) override {
|
||||||
|
OnLogMessage(absl::string_view(message));
|
||||||
|
}
|
||||||
|
void OnLogMessage(absl::string_view message) override {
|
||||||
if (message.find(look_for_) != std::string::npos) {
|
if (message.find(look_for_) != std::string::npos) {
|
||||||
when_found_.Set();
|
when_found_.Set();
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
*/
|
*/
|
||||||
#include "sdk/android/src/jni/logging/log_sink.h"
|
#include "sdk/android/src/jni/logging/log_sink.h"
|
||||||
|
|
||||||
|
#include "absl/strings/string_view.h"
|
||||||
#include "sdk/android/generated_logging_jni/JNILogging_jni.h"
|
#include "sdk/android/generated_logging_jni/JNILogging_jni.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
@ -18,18 +19,24 @@ JNILogSink::JNILogSink(JNIEnv* env, const JavaRef<jobject>& j_logging)
|
||||||
: j_logging_(env, j_logging) {}
|
: j_logging_(env, j_logging) {}
|
||||||
JNILogSink::~JNILogSink() = default;
|
JNILogSink::~JNILogSink() = default;
|
||||||
|
|
||||||
void JNILogSink::OnLogMessage(const std::string& msg,
|
|
||||||
rtc::LoggingSeverity severity,
|
|
||||||
const char* tag) {
|
|
||||||
JNIEnv* env = AttachCurrentThreadIfNeeded();
|
|
||||||
Java_JNILogging_logToInjectable(env, j_logging_, NativeToJavaString(env, msg),
|
|
||||||
NativeToJavaInteger(env, severity),
|
|
||||||
NativeToJavaString(env, tag));
|
|
||||||
}
|
|
||||||
|
|
||||||
void JNILogSink::OnLogMessage(const std::string& msg) {
|
void JNILogSink::OnLogMessage(const std::string& msg) {
|
||||||
RTC_DCHECK_NOTREACHED();
|
RTC_DCHECK_NOTREACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JNILogSink::OnLogMessage(const std::string& msg,
|
||||||
|
rtc::LoggingSeverity severity,
|
||||||
|
const char* tag) {
|
||||||
|
OnLogMessage(absl::string_view{msg}, severity, tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JNILogSink::OnLogMessage(absl::string_view msg,
|
||||||
|
rtc::LoggingSeverity severity,
|
||||||
|
const char* tag) {
|
||||||
|
JNIEnv* env = AttachCurrentThreadIfNeeded();
|
||||||
|
Java_JNILogging_logToInjectable(
|
||||||
|
env, j_logging_, NativeToJavaString(env, std::string(msg)),
|
||||||
|
NativeToJavaInteger(env, severity), NativeToJavaString(env, tag));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace jni
|
} // namespace jni
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "absl/strings/string_view.h"
|
||||||
#include "rtc_base/logging.h"
|
#include "rtc_base/logging.h"
|
||||||
#include "sdk/android/native_api/jni/java_types.h"
|
#include "sdk/android/native_api/jni/java_types.h"
|
||||||
#include "sdk/android/src/jni/jni_helpers.h"
|
#include "sdk/android/src/jni/jni_helpers.h"
|
||||||
|
@ -24,10 +25,13 @@ class JNILogSink : public rtc::LogSink {
|
||||||
JNILogSink(JNIEnv* env, const JavaRef<jobject>& j_logging);
|
JNILogSink(JNIEnv* env, const JavaRef<jobject>& j_logging);
|
||||||
~JNILogSink() override;
|
~JNILogSink() override;
|
||||||
|
|
||||||
|
void OnLogMessage(const std::string& msg) override;
|
||||||
void OnLogMessage(const std::string& msg,
|
void OnLogMessage(const std::string& msg,
|
||||||
rtc::LoggingSeverity severity,
|
rtc::LoggingSeverity severity,
|
||||||
const char* tag) override;
|
const char* tag) override;
|
||||||
void OnLogMessage(const std::string& msg) override;
|
void OnLogMessage(absl::string_view msg,
|
||||||
|
rtc::LoggingSeverity severity,
|
||||||
|
const char* tag) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const ScopedJavaGlobalRef<jobject> j_logging_;
|
const ScopedJavaGlobalRef<jobject> j_logging_;
|
||||||
|
|
|
@ -10,8 +10,11 @@
|
||||||
|
|
||||||
#import "RTCCallbackLogger.h"
|
#import "RTCCallbackLogger.h"
|
||||||
|
|
||||||
|
#import "helpers/NSString+StdString.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#include "absl/strings/string_view.h"
|
||||||
#include "rtc_base/checks.h"
|
#include "rtc_base/checks.h"
|
||||||
#include "rtc_base/log_sinks.h"
|
#include "rtc_base/log_sinks.h"
|
||||||
#include "rtc_base/logging.h"
|
#include "rtc_base/logging.h"
|
||||||
|
@ -22,8 +25,12 @@ class CallbackLogSink : public rtc::LogSink {
|
||||||
: callback_handler_(callbackHandler) {}
|
: callback_handler_(callbackHandler) {}
|
||||||
|
|
||||||
void OnLogMessage(const std::string& message) override {
|
void OnLogMessage(const std::string& message) override {
|
||||||
|
OnLogMessage(absl::string_view(message));
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnLogMessage(absl::string_view message) override {
|
||||||
if (callback_handler_) {
|
if (callback_handler_) {
|
||||||
callback_handler_([NSString stringWithUTF8String:message.c_str()]);
|
callback_handler_([NSString stringForAbslStringView:message]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,10 +45,10 @@ class CallbackWithSeverityLogSink : public rtc::LogSink {
|
||||||
|
|
||||||
void OnLogMessage(const std::string& message) override { RTC_DCHECK_NOTREACHED(); }
|
void OnLogMessage(const std::string& message) override { RTC_DCHECK_NOTREACHED(); }
|
||||||
|
|
||||||
void OnLogMessage(const std::string& message, rtc::LoggingSeverity severity) override {
|
void OnLogMessage(absl::string_view message, rtc::LoggingSeverity severity) override {
|
||||||
if (callback_handler_) {
|
if (callback_handler_) {
|
||||||
RTCLoggingSeverity loggingSeverity = NativeSeverityToObjcSeverity(severity);
|
RTCLoggingSeverity loggingSeverity = NativeSeverityToObjcSeverity(severity);
|
||||||
callback_handler_([NSString stringWithUTF8String:message.c_str()], loggingSeverity);
|
callback_handler_([NSString stringForAbslStringView:message], loggingSeverity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include "absl/strings/string_view.h"
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_BEGIN
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
@interface NSString (StdString)
|
@interface NSString (StdString)
|
||||||
|
@ -23,4 +25,10 @@ NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface NSString (AbslStringView)
|
||||||
|
|
||||||
|
+ (NSString *)stringForAbslStringView:(const absl::string_view)abslStringView;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
NS_ASSUME_NONNULL_END
|
NS_ASSUME_NONNULL_END
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
|
|
||||||
#import "NSString+StdString.h"
|
#import "NSString+StdString.h"
|
||||||
|
|
||||||
|
#include "absl/strings/string_view.h"
|
||||||
|
|
||||||
@implementation NSString (StdString)
|
@implementation NSString (StdString)
|
||||||
|
|
||||||
- (std::string)stdString {
|
- (std::string)stdString {
|
||||||
|
@ -31,3 +33,13 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@implementation NSString (AbslStringView)
|
||||||
|
|
||||||
|
+ (NSString *)stringForAbslStringView:(const absl::string_view)abslStringView {
|
||||||
|
return [[NSString alloc] initWithBytes:abslStringView.data()
|
||||||
|
length:abslStringView.length()
|
||||||
|
encoding:NSUTF8StringEncoding];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
Loading…
Reference in a new issue