Commit 75c5b521 authored by Jan Wilken Dörrie's avatar Jan Wilken Dörrie Committed by Commit Bot

[base] Add conversion functions for absl::string_view

This change adds conversion functions between base::StringPiece and
absl::string_view. This is to aid the adoption of other Abseil features,
that make use of the otherwise banned absl::string_view in their public
API.

Fixed: 1113880
Change-Id: Ib038a4e71fb0ce6470304e4151474a5d92809d22
Bug: 1113880
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2345306
Commit-Queue: Jan Wilken Dörrie <jdoerrie@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarMirko Bonadei <mbonadei@chromium.org>
Reviewed-by: default avatarPeter Kasting <pkasting@chromium.org>
Cr-Commit-Position: refs/heads/master@{#796501}
parent 61eeb03d
...@@ -523,6 +523,8 @@ component("base") { ...@@ -523,6 +523,8 @@ component("base") {
"sequenced_task_runner_helpers.h", "sequenced_task_runner_helpers.h",
"single_thread_task_runner.h", "single_thread_task_runner.h",
"stl_util.h", "stl_util.h",
"strings/abseil_string_conversions.cc",
"strings/abseil_string_conversions.h",
"strings/char_traits.h", "strings/char_traits.h",
"strings/escape.cc", "strings/escape.cc",
"strings/escape.h", "strings/escape.h",
...@@ -1279,6 +1281,7 @@ component("base") { ...@@ -1279,6 +1281,7 @@ component("base") {
":synchronization_buildflags", ":synchronization_buildflags",
":tracing_buildflags", ":tracing_buildflags",
"//base/numerics:base_numerics", "//base/numerics:base_numerics",
"//third_party/abseil-cpp:absl",
] ]
# Needed for <atomic> if using newer C++ library than sysroot, except if # Needed for <atomic> if using newer C++ library than sysroot, except if
...@@ -2785,6 +2788,7 @@ test("base_unittests") { ...@@ -2785,6 +2788,7 @@ test("base_unittests") {
"sequence_token_unittest.cc", "sequence_token_unittest.cc",
"sequenced_task_runner_unittest.cc", "sequenced_task_runner_unittest.cc",
"stl_util_unittest.cc", "stl_util_unittest.cc",
"strings/abseil_string_conversions_unittest.cc",
"strings/char_traits_unittest.cc", "strings/char_traits_unittest.cc",
"strings/escape_unittest.cc", "strings/escape_unittest.cc",
"strings/no_trigraphs_unittest.cc", "strings/no_trigraphs_unittest.cc",
......
specific_include_rules = {
# absl::string_view is generally banned in Chromium. Including it is only
# allowed from abseil_string_conversions* to provide appropriate conversion
# functions from and to StringPiece at third party API boundaries.
"abseil_string_conversions(\.h|\.cc|_unittest.cc)": [
"+third_party/abseil-cpp/absl/strings/string_view.h",
],
}
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/strings/abseil_string_conversions.h"
#include <algorithm>
#include <vector>
#include "base/containers/span.h"
#include "base/strings/string_piece.h"
#include "third_party/abseil-cpp/absl/strings/string_view.h"
namespace base {
std::vector<absl::string_view> StringPiecesToStringViews(
span<const StringPiece> pieces) {
std::vector<absl::string_view> views(pieces.size());
std::transform(pieces.begin(), pieces.end(), views.begin(),
&StringPieceToStringView);
return views;
}
std::vector<StringPiece> StringViewsToStringPieces(
span<const absl::string_view> views) {
std::vector<StringPiece> pieces(views.size());
std::transform(views.begin(), views.end(), pieces.begin(),
&StringViewToStringPiece);
return pieces;
}
} // namespace base
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_STRINGS_ABSEIL_STRING_CONVERSIONS_H_
#define BASE_STRINGS_ABSEIL_STRING_CONVERSIONS_H_
#include <vector>
#include "base/base_export.h"
#include "base/containers/span.h"
#include "base/strings/string_piece.h"
#include "third_party/abseil-cpp/absl/strings/string_view.h"
namespace base {
// Converts `piece` to a string view, pointing to the same piece of memory.
constexpr absl::string_view StringPieceToStringView(StringPiece piece) {
return {piece.data(), piece.size()};
}
// Converts `view` to a string piece, pointing to the same piece of memory.
constexpr StringPiece StringViewToStringPiece(absl::string_view view) {
return {view.data(), view.size()};
}
// Converts `pieces` to string views, pointing to the same piece of memory.
BASE_EXPORT std::vector<absl::string_view> StringPiecesToStringViews(
span<const StringPiece> pieces);
// Converts `views` to string pieces, pointing to the same piece of memory.
BASE_EXPORT std::vector<StringPiece> StringViewsToStringPieces(
span<const absl::string_view> views);
} // namespace base
#endif // BASE_STRINGS_ABSEIL_STRING_CONVERSIONS_H_
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/strings/abseil_string_conversions.h"
#include <vector>
#include "base/containers/span.h"
#include "base/strings/string_piece.h"
#include "base/strings/string_piece_forward.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/abseil-cpp/absl/strings/string_view.h"
namespace base {
namespace {
using string_view = absl::string_view;
} // namespace
TEST(AbseilStringConversionsTest, StringPieceToStringView) {
static constexpr StringPiece kPiece = "foo";
static constexpr string_view kView = StringPieceToStringView(kPiece);
static_assert(kPiece.data() == kView.data(), "");
static_assert(kPiece.size() == kView.size(), "");
}
TEST(AbseilStringConversionsTest, StringViewToStringPiece) {
static constexpr string_view kView = "bar";
static constexpr StringPiece kPiece = StringViewToStringPiece(kView);
static_assert(kView.data() == kPiece.data(), "");
static_assert(kView.size() == kPiece.size(), "");
}
TEST(AbseilStringConversionsTest, StringPiecesToStringViews) {
static constexpr StringPiece kFoo = "foo";
static constexpr StringPiece kBar = "bar";
static constexpr StringPiece kBaz = "baz";
const std::vector<StringPiece> kPieces = {kFoo, kBar, kBaz};
const std::vector<string_view> kViews = StringPiecesToStringViews(kPieces);
ASSERT_EQ(kViews.size(), 3u);
EXPECT_EQ(kViews[0].data(), kFoo);
EXPECT_EQ(kViews[0].size(), 3u);
EXPECT_EQ(kViews[1].data(), kBar);
EXPECT_EQ(kViews[1].size(), 3u);
EXPECT_EQ(kViews[2].data(), kBaz);
EXPECT_EQ(kViews[2].size(), 3u);
}
TEST(AbseilStringConversionsTest, StringViewsToStringPieces) {
static constexpr string_view kFoo = "foo";
static constexpr string_view kBar = "bar";
static constexpr string_view kBaz = "baz";
const std::vector<string_view> kViews = {kFoo, kBar, kBaz};
const std::vector<StringPiece> kPieces = StringViewsToStringPieces(kViews);
ASSERT_EQ(kPieces.size(), 3u);
EXPECT_EQ(kPieces[0].data(), kFoo);
EXPECT_EQ(kPieces[0].size(), 3u);
EXPECT_EQ(kPieces[1].data(), kBar);
EXPECT_EQ(kPieces[1].size(), 3u);
EXPECT_EQ(kPieces[2].data(), kBaz);
EXPECT_EQ(kPieces[2].size(), 3u);
}
} // namespace base
...@@ -80,6 +80,17 @@ group("absl_component_deps") { ...@@ -80,6 +80,17 @@ group("absl_component_deps") {
"//third_party/abseil-cpp/absl/types:span", "//third_party/abseil-cpp/absl/types:span",
"//third_party/abseil-cpp/absl/types:variant", "//third_party/abseil-cpp/absl/types:variant",
] ]
# The following dependencies currently don't build with NaCl.
# TODO(https://crbug.com/1114625): Fix build errors and remove this section.
if (is_nacl) {
public_deps -= [
"//third_party/abseil-cpp/absl/container:flat_hash_map",
"//third_party/abseil-cpp/absl/container:flat_hash_set",
"//third_party/abseil-cpp/absl/debugging:failure_signal_handler",
]
}
visibility = [ ":absl" ] visibility = [ ":absl" ]
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment