blob: 04ae8d28de12b74ccba5cd51a6e521f384329d47 [file] [log] [blame] [view]
Karl Wibergc3af97d2018-08-27 02:26:181# Using Abseil in WebRTC
2
3You may use a subset of the utilities provided by the [Abseil][abseil]
4library when writing WebRTC C++ code. Below, we list the explicitly
5*allowed* and the explicitly *disallowed* subsets of Abseil; if you
6find yourself in need of something that isn’t in either subset,
7please add it to the *allowed* subset in this doc in the same CL that
8adds the first use.
9
10[abseil]: https://abseil.io/about/
11
12## **Allowed**
13
14* `absl::InlinedVector`
15* `absl::make_unique` and `absl::WrapUnique`
16* `absl::optional` and related stuff from `absl/types/optional.h`.
17* `absl::string_view`
18* `absl::variant` and related stuff from `absl/types/variant.h`.
19
20## **Disallowed**
21
22### `absl::Mutex`
23
24*Use `rtc::CriticalSection` instead.*
25
26Chromium has a ban on new static initializers, and `absl::Mutex` uses
27one. To make `absl::Mutex` available, we would need to nicely ask the
28Abseil team to remove that initializer (like they already did for a
29spinlock initializer). Additionally, `absl::Mutex` handles time in a
30way that may not be compaible with the rest of WebRTC.
31
32### `absl::Span`
33
34*Use `rtc::ArrayView` instead.*
35
36`absl::Span` differs from `rtc::ArrayView` on several points, and both
37of them differ from the `std::span` that was voted into
38C++20—and `std::span` is likely to undergo further changes
39before C++20 is finalized. We should just keep using `rtc::ArrayView`
40and avoid `absl::Span` until C++20 is finalized and the Abseil team
41has decided if they will change `absl::Span` to match.
42[Bug](https://bugs.webrtc.org/9214).
43
44### `absl::StrCat` and `absl::StrAppend`
45
46*Use `rtc::SimpleStringBuilder` instead.*
47
48These are optimized for speed, not binary size. Even `StrCat` calls
49with a modest number of arguments can easily add several hundred bytes
50to the binary.