File: abseil-in-webrtc.md

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (82 lines) | stat: -rw-r--r-- 2,709 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<!-- go/cmark -->
<!--* freshness: {owner: 'danilchap' reviewed: '2025-03-13'} *-->

# Using Abseil in WebRTC

You may use a subset of the utilities provided by the [Abseil][abseil]
library when writing WebRTC C++ code. Below, we list the explicitly
*allowed* and the explicitly *disallowed* subsets of Abseil; if you
find yourself in need of something that isn&rsquo;t in either subset,
please add it to the *allowed* subset in this doc in the same CL that
adds the first use.

[abseil]: https://abseil.io/about/


## How to depend on Abseil

For build targets of type `rtc_library`, `rtc_source_set` and
`rtc_static_library`, dependencies on Abseil need to be listed in `deps`.

The GN templates will take care of generating the proper dependency when
used within Chromium or standalone. In that build mode, WebRTC will depend
on a monolithic Abseil build target that will generate a shared library.

## **Allowed**

* `absl::AnyInvocable`
* `absl::bind_front`
* `absl::Cleanup`
* [Hash tables, and B-tree ordered][abseil-containers] containers
* `absl::InlinedVector`
* `absl_nonnull` and `absl_nullable`
* `absl::WrapUnique`
* `absl::string_view`
* The functions in `absl/strings/ascii.h`, `absl/strings/match.h`,
  and `absl/strings/str_replace.h`.
* The functions in `absl/strings/escaping.h`.
* The functions in `absl/algorithm/algorithm.h` and
  `absl/algorithm/container.h`.
* The macros in `absl/base/attributes.h`, `absl/base/config.h` and
  `absl/base/macros.h`.
* `absl/numeric/bits.h`
* Single argument absl::StrCat

* ABSL_FLAG is allowed in tests and tools, but disallowed in in non-test code.

[abseil-containers]: https://abseil.io/docs/cpp/guides/container

## **Disallowed**

### `absl::make_unique`

*Use `std::make_unique` instead.*

### `absl::Mutex`

*Use `webrtc::Mutex` instead.*

### `absl::optional` and `absl::variant`

*Use `std::optional` and `std::variant` directly.*

### `absl::Span`

*Use `webrtc::ArrayView` instead.*

`absl::Span` differs from `webrtc::ArrayView` on several points, and both
of them differ from the `std::span` introduced in C++20. We should just keep
using `webrtc::ArrayView` and avoid `absl::Span`. When WebRTC switches to C++20,
we will consider replacing `webrtc::ArrayView` with `std::span`.

### `absl::StrCat`, `absl::StrAppend`, `absl::StrJoin`, `absl::StrSplit`

*Use `webrtc::SimpleStringBuilder` to build strings.*

These are optimized for speed, not binary size. Even `StrCat` calls
with a modest number of arguments can easily add several hundred bytes
to the binary.

Exception: Single-argument absl::StrCat is allowed in order to make it
easy to use AbslStringify. See [TOTW #215](https://abseil.io/tips/215) for
details on AbslStringify.