Karl Wiberg | c3af97d | 2018-08-27 02:26:18 | [diff] [blame] | 1 | # Using Abseil in WebRTC |
| 2 | |
| 3 | You may use a subset of the utilities provided by the [Abseil][abseil] |
| 4 | library when writing WebRTC C++ code. Below, we list the explicitly |
| 5 | *allowed* and the explicitly *disallowed* subsets of Abseil; if you |
| 6 | find yourself in need of something that isn’t in either subset, |
| 7 | please add it to the *allowed* subset in this doc in the same CL that |
| 8 | adds 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 | |
| 26 | Chromium has a ban on new static initializers, and `absl::Mutex` uses |
| 27 | one. To make `absl::Mutex` available, we would need to nicely ask the |
| 28 | Abseil team to remove that initializer (like they already did for a |
| 29 | spinlock initializer). Additionally, `absl::Mutex` handles time in a |
| 30 | way 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 |
| 37 | of them differ from the `std::span` that was voted into |
| 38 | C++20—and `std::span` is likely to undergo further changes |
| 39 | before C++20 is finalized. We should just keep using `rtc::ArrayView` |
| 40 | and avoid `absl::Span` until C++20 is finalized and the Abseil team |
| 41 | has 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 | |
| 48 | These are optimized for speed, not binary size. Even `StrCat` calls |
| 49 | with a modest number of arguments can easily add several hundred bytes |
| 50 | to the binary. |