xref: /aosp_15_r20/external/webrtc/g3doc/abseil-in-webrtc.md (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker# Using Abseil in WebRTC
2*d9f75844SAndroid Build Coastguard Worker
3*d9f75844SAndroid Build Coastguard Worker<?% config.freshness.owner = 'danilchap' %?>
4*d9f75844SAndroid Build Coastguard Worker<?% config.freshness.reviewed = '2021-05-12' %?>
5*d9f75844SAndroid Build Coastguard Worker
6*d9f75844SAndroid Build Coastguard WorkerYou may use a subset of the utilities provided by the [Abseil][abseil]
7*d9f75844SAndroid Build Coastguard Workerlibrary when writing WebRTC C++ code. Below, we list the explicitly
8*d9f75844SAndroid Build Coastguard Worker*allowed* and the explicitly *disallowed* subsets of Abseil; if you
9*d9f75844SAndroid Build Coastguard Workerfind yourself in need of something that isn&rsquo;t in either subset,
10*d9f75844SAndroid Build Coastguard Workerplease add it to the *allowed* subset in this doc in the same CL that
11*d9f75844SAndroid Build Coastguard Workeradds the first use.
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker[abseil]: https://abseil.io/about/
14*d9f75844SAndroid Build Coastguard Worker
15*d9f75844SAndroid Build Coastguard Worker
16*d9f75844SAndroid Build Coastguard Worker## How to depend on Abseil
17*d9f75844SAndroid Build Coastguard Worker
18*d9f75844SAndroid Build Coastguard WorkerFor build targets of type `rtc_library`, `rtc_source_set` and
19*d9f75844SAndroid Build Coastguard Worker`rtc_static_library`, dependencies on Abseil need to be listed in `absl_deps`
20*d9f75844SAndroid Build Coastguard Workerinstead of `deps`.
21*d9f75844SAndroid Build Coastguard Worker
22*d9f75844SAndroid Build Coastguard WorkerThis is needed in order to support the Abseil component build in Chromium. In
23*d9f75844SAndroid Build Coastguard Workerthat build mode, WebRTC will depend on a monolithic Abseil build target that
24*d9f75844SAndroid Build Coastguard Workerwill generate a shared library.
25*d9f75844SAndroid Build Coastguard Worker
26*d9f75844SAndroid Build Coastguard Worker## **Allowed**
27*d9f75844SAndroid Build Coastguard Worker
28*d9f75844SAndroid Build Coastguard Worker* `absl::AnyInvocable`
29*d9f75844SAndroid Build Coastguard Worker* `absl::bind_front`
30*d9f75844SAndroid Build Coastguard Worker* `absl::Cleanup`
31*d9f75844SAndroid Build Coastguard Worker* `absl::InlinedVector`
32*d9f75844SAndroid Build Coastguard Worker* `absl::WrapUnique`
33*d9f75844SAndroid Build Coastguard Worker* `absl::optional` and related stuff from `absl/types/optional.h`.
34*d9f75844SAndroid Build Coastguard Worker* `absl::string_view`
35*d9f75844SAndroid Build Coastguard Worker* The functions in `absl/strings/ascii.h`, `absl/strings/match.h`,
36*d9f75844SAndroid Build Coastguard Worker  and `absl/strings/str_replace.h`.
37*d9f75844SAndroid Build Coastguard Worker* The functions in `absl/strings/escaping.h`.
38*d9f75844SAndroid Build Coastguard Worker* `absl::is_trivially_copy_constructible`,
39*d9f75844SAndroid Build Coastguard Worker  `absl::is_trivially_copy_assignable`, and
40*d9f75844SAndroid Build Coastguard Worker  `absl::is_trivially_destructible` from `absl/meta/type_traits.h`.
41*d9f75844SAndroid Build Coastguard Worker* `absl::variant` and related stuff from `absl/types/variant.h`.
42*d9f75844SAndroid Build Coastguard Worker* The functions in `absl/algorithm/algorithm.h` and
43*d9f75844SAndroid Build Coastguard Worker  `absl/algorithm/container.h`.
44*d9f75844SAndroid Build Coastguard Worker* `absl/base/const_init.h` for mutex initialization.
45*d9f75844SAndroid Build Coastguard Worker* The macros in `absl/base/attributes.h`, `absl/base/config.h` and
46*d9f75844SAndroid Build Coastguard Worker  `absl/base/macros.h`.
47*d9f75844SAndroid Build Coastguard Worker* `absl/numeric/bits.h`
48*d9f75844SAndroid Build Coastguard Worker
49*d9f75844SAndroid Build Coastguard Worker
50*d9f75844SAndroid Build Coastguard Worker## **Disallowed**
51*d9f75844SAndroid Build Coastguard Worker
52*d9f75844SAndroid Build Coastguard Worker### `absl::make_unique`
53*d9f75844SAndroid Build Coastguard Worker
54*d9f75844SAndroid Build Coastguard Worker*Use `std::make_unique` instead.*
55*d9f75844SAndroid Build Coastguard Worker
56*d9f75844SAndroid Build Coastguard Worker### `absl::Mutex`
57*d9f75844SAndroid Build Coastguard Worker
58*d9f75844SAndroid Build Coastguard Worker*Use `webrtc::Mutex` instead.*
59*d9f75844SAndroid Build Coastguard Worker
60*d9f75844SAndroid Build Coastguard WorkerChromium has a ban on new static initializers, and `absl::Mutex` uses
61*d9f75844SAndroid Build Coastguard Workerone. To make `absl::Mutex` available, we would need to nicely ask the
62*d9f75844SAndroid Build Coastguard WorkerAbseil team to remove that initializer (like they already did for a
63*d9f75844SAndroid Build Coastguard Workerspinlock initializer). Additionally, `absl::Mutex` handles time in a
64*d9f75844SAndroid Build Coastguard Workerway that may not be compatible with the rest of WebRTC.
65*d9f75844SAndroid Build Coastguard Worker
66*d9f75844SAndroid Build Coastguard Worker### `absl::Span`
67*d9f75844SAndroid Build Coastguard Worker
68*d9f75844SAndroid Build Coastguard Worker*Use `rtc::ArrayView` instead.*
69*d9f75844SAndroid Build Coastguard Worker
70*d9f75844SAndroid Build Coastguard Worker`absl::Span` differs from `rtc::ArrayView` on several points, and both
71*d9f75844SAndroid Build Coastguard Workerof them differ from the `std::span` that was voted into
72*d9f75844SAndroid Build Coastguard WorkerC++20&mdash;and `std::span` is likely to undergo further changes
73*d9f75844SAndroid Build Coastguard Workerbefore C++20 is finalized. We should just keep using `rtc::ArrayView`
74*d9f75844SAndroid Build Coastguard Workerand avoid `absl::Span` until C++20 is finalized and the Abseil team
75*d9f75844SAndroid Build Coastguard Workerhas decided if they will change `absl::Span` to match.
76*d9f75844SAndroid Build Coastguard Worker[Bug](https://bugs.webrtc.org/9214).
77*d9f75844SAndroid Build Coastguard Worker
78*d9f75844SAndroid Build Coastguard Worker### `absl::StrCat`, `absl::StrAppend`, `absl::StrJoin`, `absl::StrSplit`
79*d9f75844SAndroid Build Coastguard Worker
80*d9f75844SAndroid Build Coastguard Worker*Use `rtc::SimpleStringBuilder` to build strings.*
81*d9f75844SAndroid Build Coastguard Worker
82*d9f75844SAndroid Build Coastguard WorkerThese are optimized for speed, not binary size. Even `StrCat` calls
83*d9f75844SAndroid Build Coastguard Workerwith a modest number of arguments can easily add several hundred bytes
84*d9f75844SAndroid Build Coastguard Workerto the binary.
85